acha-framework
Version:
is a modular framework on both client (angular.js) and server (node.js) side, it provides security, orm, ioc, obfuscation and ...
118 lines • 3.82 kB
JavaScript
(function ($, angular, underscore, window, document, undefined) {
'use strict';
angular.module('frontend.directives').factory('dropdownService', [
'apiService',
function (apiService) {
return {
get: function (backend, data) {
return apiService(backend, data);
}
};
}
]).directive('dropdown', [
'$document',
'$filter',
'dropdownService',
function ($document, $filter, dropdownService) {
return {
restrict: 'E',
replace: true,
scope: {
tag: '<?',
disabled: '=?',
visible: '=?',
cssClass: '=?',
model: '=?',
textField: '=?',
valueField: '=?',
items: '=?',
backend: '=?',
onChange: '=?',
placeHolder: '=?',
placeHolderTranslate: '=?',
backendData: '=?'
},
templateUrl: '/templates/framework/directives/dropdown/template.html',
link: function (scope, element, attr) {
scope.vm = {
plate: false,
waiting: false,
selectedItemText: ''
};
scope.vm.init = function () {
if (angular.isUndefined(scope.disabled)) {
scope.disabled = false;
}
if (angular.isUndefined(scope.visible)) {
scope.visible = true;
}
if (angular.isUndefined(scope.items)) {
scope.items = [];
}
if (angular.isUndefined(scope.cssClass)) {
scope.cssClass = '';
}
if (angular.isUndefined(scope.textField)) {
scope.textField = 'text';
}
if (angular.isUndefined(scope.valueField)) {
scope.valueField = 'value';
}
scope.vm.bind();
};
scope.vm.closeElseWhere = function (e) {
scope.$apply(function () {
scope.vm.plate = false;
});
};
scope.vm.prevent = function ($event) {
$event.stopPropagation();
$event.preventDefault();
};
scope.vm.getText = function () {
if (scope.model === undefined || scope.model === null) {
return $filter('textOrTranslate')(scope.placeHolder, scope.placeHolderTranslate);
}
return scope.vm.selectedItemText;
};
scope.vm.toggle = function () {
if (scope.disabled)
return;
scope.vm.plate = !scope.vm.plate;
};
scope.vm.bind = function () {
scope.$on('$destroy', function () {
$document.off('click', scope.vm.closeElseWhere);
});
$document.on('click', scope.vm.closeElseWhere);
scope.$watch('model', function (val, old) {
if (angular.isFunction(scope.onChange)) {
scope.onChange(val, scope.tag);
}
});
scope.$watch('backend', scope.vm.transport);
};
scope.vm.transport = function (backend) {
if (!backend)
return;
scope.vm.waiting = true;
dropdownService.get(backend, scope.backendData).then(function (res) {
scope.vm.waiting = false;
if (res.status) {
scope.items = res.data || [];
}
});
};
scope.vm.onPick = function (item) {
if (scope.disabled)
return;
scope.model = item[scope.valueField];
scope.vm.selectedItemText = item[scope.textField];
scope.vm.plate = false;
};
scope.vm.init();
}
};
}
]);
}(jQuery, angular, _, window, document));