|
|
|
|
|
//bootstrap-select: http://silviomoreto.github.io/bootstrap-select/
|
|
|
|
|
|
evoapp.directive('customCombo', function($timeout) {
|
|
|
|
|
|
//http://www.befundoo.com/university/tutorials/angularjs-directives-tutorial/
|
|
|
|
|
|
//pass specified values to specified function arguments
|
|
|
function callback(fn, args) {
|
|
|
var fnArgs = [].concat(args);
|
|
|
fnArgs.push.apply(fnArgs, arguments);
|
|
|
return fn.apply(this, fnArgs);
|
|
|
};
|
|
|
|
|
|
return {
|
|
|
require:'ngModel',
|
|
|
require: '^ngController',
|
|
|
restrict: 'AE',
|
|
|
template:
|
|
|
'<select data-style="{{cssClass}}" title="Seleccione uma opção..." class="selectpicker show-tick form-control" data-live-search="true" data-required="true">' +
|
|
|
'<option value="" ng-if="addEmptyOption === \'true\' && options.length > 0">Seleccione uma opção...</option>' +
|
|
|
'<option ng-repeat="item in options" value="{{item[valueField]}}" ng-selected="getSelected(item[valueField])">{{item[displayField]}}</option>' +
|
|
|
'</select>',
|
|
|
scope: {
|
|
|
|
|
|
selectedValue: '=', // =’ to accept a Object
|
|
|
|
|
|
storeModel: '@', // @’ to accept a string value
|
|
|
storeActionsGet: '@',
|
|
|
valueField: '@',
|
|
|
displayField: '@',
|
|
|
|
|
|
addEmptyOption: '@',
|
|
|
bindToModel: '@',
|
|
|
|
|
|
itemId: '@',
|
|
|
|
|
|
name: '@',
|
|
|
|
|
|
//TODO: !!!
|
|
|
optionsTemplate: '@',
|
|
|
|
|
|
onChange: '&'
|
|
|
},
|
|
|
controller: function($rootScope, $scope, $filter, globals, $timeout) {
|
|
|
|
|
|
$scope.elem = null;
|
|
|
|
|
|
//add reference to this combo, in parent controller
|
|
|
if($scope.$parent[$scope.itemId] == undefined)
|
|
|
{
|
|
|
$scope.$parent[$scope.itemId] = $scope;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
throw Error('Combo ' + $scope.itemId + ' already exists!');
|
|
|
}
|
|
|
|
|
|
$scope.store = new globals.dataService.store({
|
|
|
//model: $scope.storeModel,
|
|
|
actions: {
|
|
|
get: $scope.storeActionsGet
|
|
|
},
|
|
|
sort: $scope.displayField
|
|
|
});
|
|
|
|
|
|
$scope.$watch('store.items', function() {
|
|
|
|
|
|
$timeout(function () {
|
|
|
|
|
|
$scope.domEl.selectpicker('deselectAll');
|
|
|
|
|
|
$scope.domEl.selectpicker('refresh');
|
|
|
});
|
|
|
});
|
|
|
|
|
|
$scope.options = [];
|
|
|
|
|
|
$scope.getSelected = function(record){
|
|
|
|
|
|
return record == $scope.selectedValue ? 'selected' : '';
|
|
|
};
|
|
|
|
|
|
$scope.$watch('selectedValue', function(newValue, oldValue){
|
|
|
|
|
|
$scope.selectedValue = newValue;
|
|
|
});
|
|
|
|
|
|
$scope.loadStore = function(){
|
|
|
|
|
|
var callBackFn = arguments.length == 1 ? arguments[0] : null;
|
|
|
callBackFn = angular.isFunction(callBackFn) ? callBackFn : null;
|
|
|
|
|
|
$scope.store.get(function(response, status, headers, config, items){
|
|
|
|
|
|
$scope.options = $scope.store.items;
|
|
|
|
|
|
if(callBackFn != null)
|
|
|
{
|
|
|
callback(callBackFn, [response, status, headers, config, items]);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
|
|
|
$scope.setValue = function(newValue){
|
|
|
|
|
|
$scope.domEl.selectpicker('deselectAll');
|
|
|
|
|
|
var option = $scope.domEl.find('option[value=' + newValue + ']');
|
|
|
|
|
|
if(option.length > 0)
|
|
|
{
|
|
|
var record = angular.element(option[0]).scope();
|
|
|
|
|
|
if(record.item)
|
|
|
{
|
|
|
//TODO: this might throw an exception - recheck it please
|
|
|
if($scope.bindToModel === 'true')
|
|
|
{
|
|
|
$scope.selectedValue = newValue;
|
|
|
$scope.selectedRecord = record.item;
|
|
|
}
|
|
|
|
|
|
$scope.onChange({
|
|
|
selectedValue: newValue,
|
|
|
selectedRecord: record.item
|
|
|
});
|
|
|
|
|
|
$scope.domEl.selectpicker('val', newValue);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
$scope.domEl.selectpicker('refresh');
|
|
|
};
|
|
|
|
|
|
$scope.loadData = function(data){
|
|
|
|
|
|
$scope.store.items = [];
|
|
|
$scope.options = [];
|
|
|
|
|
|
$scope.store.loadData(data);
|
|
|
|
|
|
$scope.options = $scope.store.items;
|
|
|
};
|
|
|
|
|
|
$scope.clear = function(){
|
|
|
|
|
|
$scope.store.items = [];
|
|
|
$scope.options = [];
|
|
|
|
|
|
$scope.domEl.selectpicker('deselectAll');
|
|
|
|
|
|
$scope.domEl.selectpicker('refresh');
|
|
|
};
|
|
|
},
|
|
|
link: function (scope, elem, attrs, controller) {
|
|
|
|
|
|
scope.cssClass = attrs.cssClass == undefined ? 'btn-default' : attrs.cssClass;
|
|
|
scope.name = attrs.name == undefined ? scope.valueField : attrs.name;
|
|
|
scope.elem = elem;
|
|
|
scope.domEl = $(elem.find('select')[0]);
|
|
|
scope.domEl.attr('name', scope.name);
|
|
|
|
|
|
$timeout(function () {
|
|
|
|
|
|
scope.domEl.selectpicker({
|
|
|
|
|
|
}).on('change', function(e) {
|
|
|
|
|
|
var record = angular.element($(this).find("option:selected")).scope();
|
|
|
|
|
|
var value = $(this).find("option:selected").val();
|
|
|
|
|
|
if(scope.bindToModel === 'true')
|
|
|
{
|
|
|
scope.selectedValue = value;
|
|
|
scope.selectedRecord = record.item;
|
|
|
}
|
|
|
|
|
|
scope.onChange({
|
|
|
selectedValue: value,
|
|
|
selectedRecord: record.item
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
|