--- /dev/null
+define(['common/general/common.navigation.module'], function(common) {
+
+ /*
+ * Helper to set CSS class to active via ng-class using $location.path()
+ * or $state.includes()
+ */
+ common.directive('isActive', function($compile) {
+ return {
+ restrict: 'A',
+ replace: false,
+ scope: {
+ state: '@',
+ stateParams: '=',
+ stateActive: '@',
+ url: '@'
+ },
+
+ controller: ['$scope', '$location', '$state', function ($scope, $location, $state) {
+ $scope.$state = $state;
+ $scope.$location = $location;
+ }],
+ compile: function() {
+ return function (scope, iElement, iAttrs, controller) {
+ var active;
+ if (scope.state) {
+ var state = scope.stateActive || scope.$state.current.name.split('.')[0];
+ active = 'active: $state.includes(\'' + scope.state + '\')';
+ } else if (scope.url) {
+ active = 'active: url === $location.path()';
+ } else {
+ active = "false";
+ }
+ iElement.attr('ng-class', '{ ' + active + ' }'); // Adding the ngClass
+ iElement.removeAttr('is-active'); // Avoid infinite loop
+ $compile(iElement)(scope);
+ };
+ }
+ };
+ });
+
+
+ common.directive('brdAnchor', function ($compile, $rootScope) {
+ return {
+ restrict: 'E',
+ replace: true,
+ scope: {
+ label: '@',
+ state: '@',
+ stateParams: '=',
+ url: '@'
+ },
+
+ /* The idea is to support both state and url, to be able to set {active} either
+ if stateActive matches via $state.includes() or if the url matches
+ Change this into a actual href later on ? - see https://github.com/angular-ui/ui-router/issues/395
+ */
+ template: '<a href="" ng-click="doClick()">{{label}}</a>',
+ controller: ['$scope', '$rootScope', '$location', '$state', function ($scope, $rootScope, $location, $state) {
+ $scope.$location = $location;
+ $scope.$state = $state;
+
+ $scope.doClick = function () {
+ var args = {
+ label: $scope.label,
+ state: $scope.state,
+ stateParams: $scope.stateParams,
+ url: $scope.url
+ };
+
+ $rootScope.$broadcast('event:navigation', args);
+
+ if (!$scope.url && $scope.state) {
+ var params = $scope.stateParams || {};
+ $state.transitionTo($scope.state, params, { location: true, inherit: true, relative: $state.$current, notify: true });
+ } else if ($scope.url) {
+ $location.path($scope.url);
+ }
+ };
+ }]
+ };
+ });
+
+
+ common.directive('buttonCancel', function() {
+ // Runs during compile
+ return {
+ restrict: 'E',
+ replace: true,
+ scope: {
+ 'btnLabel': '@label',
+ 'btnSize': '@size',
+ 'btnGlyph': '@glyph',
+ 'cancelFunc': '=function',
+ 'state': '@',
+ 'stateParams': '=',
+ },
+ template: '<button class="btn btn-{{size}} btn-danger" ng-click="doCancel()"><i class="icon-remove-sign"></i> {{label}}</button>',
+ controller: ['$scope', '$state', function ($scope, $state) {
+ $scope.label = $scope.btnLabel || 'Cancel';
+ $scope.size = $scope.btnSize || 'md';
+ $scope.glyph = $scope.btnGlyph || 'remove-circle';
+
+ $scope.doCancel = function () {
+ if (angular.isFunction($scope.cancelFunc)) {
+ $scope.cancelFunc();
+ return;
+ }
+
+ var params = $scope.stateParams || {};
+ $state.transitionTo($scope.state, params, { location: true, inherit: true, relative: $state.$current, notify: true });
+
+ };
+ }]
+ };
+ });
+
+ common.directive('buttonSubmit', function(){
+ // Runs during compile
+ return {
+ restrict: 'E',
+ replace: true,
+ scope: {
+ 'btnLabel': '@label',
+ 'btnSize': '@size',
+ 'btnGlyph': '@glyph',
+ 'submitFunc': '=function',
+ 'form': '=form',
+ 'validator': '='
+ },
+ template: '<button class="btn btn-{{size}} btn-orange" ng-click="doSubmit()" ng-disabled="submitDisabled"><i class="icon-ok-sign"></i> {{label}}</button>',
+ controller: ['$scope', function ($scope) {
+ $scope.label = $scope.btnLabel || 'Submit';
+ $scope.size = $scope.btnSize || 'md';
+ $scope.glyph = $scope.btnGlyph || 'ok-circle';
+
+ $scope.submitDisabled = true;
+
+ $scope.doSubmit = function () {
+ if ($scope.submitFunc) {
+ $scope.submitFunc();
+ }
+ };
+
+ $scope.toggle = function (newVal) {
+ $scope.submitDisabled = newVal ? false : true;
+ };
+
+
+ // Setup a watch for form.$valid if it's passed
+ if (!$scope.validator && $scope.form) {
+ $scope.$watch('form.$valid', function (newVal, oldVal) {
+ $scope.toggle(newVal);
+ });
+ }
+
+ // This overrules the form watch if set - use with cauthion!
+ if ($scope.validator && angular.isFunction($scope.validator)) {
+ $scope.$watch(
+ function() {
+ return $scope.validator();
+ },
+ function(newVal, oldVal) {
+ $scope.toggle(newVal);
+ }
+ );
+ }
+
+ // Lastly if none of the above goes we'll just enable ourselves
+ if (!$scope.form && !$scope.validator) {
+ $scope.submitDisabled = false;
+ }
+ }]
+ };
+ });
+
+
+ common.directive('showSelected', function() {
+ // Runs during compile
+ return {
+ restrict: 'E',
+ replace: true,
+ scope: {
+ 'data': '='
+ },
+ template: '<span>Selected: {{data.length}}</span>'
+ };
+ });
+
+ common.directive('ctrlReload', function() {
+ // Runs during compile
+ return {
+ replace: true,
+ restrict: 'E',
+ scope: {
+ svc: '=service'
+ },
+ template: '<button class="btn btn-primary btn-xs" ng-click="svc.getAll()"><i class="icon-refresh"></i></button>',
+ link: function ($scope, iElm, iAttrs, controller) {
+ $scope.$on('evt:refresh', function() {
+ $scope.svc.getAll();
+ });
+ }
+ };
+ });
+
+ common.directive('ctrlDelete', function($rootScope) {
+ // Runs during compile
+ return {
+ replace: true,
+ restrict: 'E',
+ template: '<button class="btn btn-danger btn-xs" ng-click="deleteSelected()" ng-disabled="gridOptions.selectedItems.length == 0"><i class="icon-remove"></i></button>',
+ link: function($scope, iElm, iAttrs, controller) {
+ var i = 0;
+ var selected = $scope.gridOptions.selectedItems;
+
+ // Fire up a evt:refresh event once done.
+ $scope.deleteSelected = function () {
+ angular.forEach(selected, function(value, key) {
+ $scope.svc.delete(value).then(
+ function () {
+ i++;
+ if (i == selected.length) {
+ $rootScope.$broadcast('evt:refresh');
+ }
+ }
+ );
+ });
+ };
+ }
+ };
+ });
+});