Skip to content

Commit 09860cb

Browse files
Merge branch 'dev-3655-framework-multiselect' of https://bitbucket.org/letscomunicadev/angular-framework-core into dev-arbo
2 parents f6fc7dd + 4f56faf commit 09860cb

File tree

6 files changed

+240
-8
lines changed

6 files changed

+240
-8
lines changed

bower.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@
5151
"moment-duration-format": "^2.2.1",
5252
"angular-bootstrap-toggle": "^0.1.3",
5353
"ng-dropzone": "https://github.com/thatisuday/ng-dropzone.git#v2.0.2",
54-
"swangular": "^1.4.3"
54+
"swangular": "^1.4.3",
55+
"angularjs-dropdown-multiselect": "^1.11.8"
5556
},
5657
"devDependencies": {},
5758
"main": [

src/directives/crud/lets-crud-filter.directive.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@
4242
if (field.customOptions.file){
4343
delete field.customOptions.file;
4444
}
45-
45+
if(field.customOptions.multiselect){
46+
field.type = "multiselect"
47+
}
4648
if (field.type=="text"){
4749
field.type = "string";
4850
}
@@ -107,7 +109,8 @@
107109

108110

109111
setTimeout(function(){
110-
scope.$emit('filter-init', scope);
112+
scope.$emit('filter-init', scope);
113+
scope.$broadcast('filter-init', scope);
111114
}, 500);
112115
}
113116

@@ -269,10 +272,13 @@
269272
filterData[field.name] = scope.getDateFormated(filterData[field.name])
270273
}
271274

272-
if(field.autocomplete){
275+
if(field.autocomplete && !field.customOptions.multiselect){
273276
filterData[field.name+"_label"] = scope.data[field.name+".label"].label;
274277
}
275278

279+
if (field.autocomplete && field.customOptions.multiselect){
280+
filterData[field.name] = scope.data[field.name];
281+
}
276282
}
277283
});
278284
scope.data.q = null;

src/directives/crud/lets-crud-list.directive.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,11 @@
550550
for (var key in params[par]) {
551551
if(key == "ini" || key == "fim"){
552552
$scopeFilter.data[par+"_"+key] = moment(params[par][key], 'DD/MM/YYYY').toDate();
553-
}else{
553+
}
554+
else if (params[par][key].id && params[par][key].label) {
555+
$scopeFilter.data[par] = params[par]
556+
}
557+
else {
554558
$scopeFilter.data[par] = $scopeFilter.data[par] || {};
555559
$scopeFilter.data[par][key] = params[par][key] ;
556560
}
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
(function () {
2+
'use strict';
3+
4+
angular.module('letsAngular')
5+
.directive('fwMultiSelect', fwMultiSelect);
6+
7+
fwMultiSelect.$inject = ['$compile', '$timeout', 'Restangular', '$state'];
8+
9+
function fwMultiSelect($compile, $timeout, Restangular) {
10+
return {
11+
restrict: 'A',
12+
priority: 1,
13+
link: function (scope, element) {
14+
15+
scope.dataReference = $(element)
16+
17+
// var _input = element.find('input');
18+
19+
// var clickHandler = function () {
20+
// var _oldVal = _input.val();
21+
// var _val = _oldVal + ' ';
22+
// _input.controller('ngModel').$setViewValue(_val);
23+
// // scope.$digest;
24+
// $timeout(function(){
25+
// _input.controller('ngModel').$setViewValue(_oldVal);
26+
// });
27+
// };
28+
29+
// element.find('button').click(clickHandler);
30+
// _input.click(clickHandler);
31+
32+
// _input.keyup(function(){
33+
// if (this.value.trim()==""){
34+
// _input.scope().data[_input.attr('name')] = null;
35+
// }
36+
// })
37+
38+
39+
40+
},
41+
controller: function ($scope, $state) {
42+
/*Multiselect*/
43+
$scope.initMultiSelect = false;
44+
$scope.msmodel = [];
45+
$scope.filter = {};
46+
$scope.msdata = [];
47+
$scope.setting = {}
48+
var field = ''
49+
50+
$scope.$on('filter-init', function(scope){
51+
var data = scope.targetScope.data || undefined
52+
var filter = $($scope.dataReference).attr('data-reference') || undefined
53+
field = filter
54+
55+
if(filter && data){
56+
$scope.msmodel = angular.copy(data[filter]) || []
57+
}
58+
})
59+
60+
// Eventos da biblioteca 'angularjs-dropdown-multiselect'
61+
62+
$scope.changedMultiSelect = function (a) {
63+
if ($scope.msmodel.length) {
64+
angular.element('.fw-multiselect-button').css('color', '#555555')
65+
} else {
66+
angular.element('.fw-multiselect-button').css('color', '#CCC')
67+
}
68+
}
69+
70+
$scope.onItemSelect = function (item, $event) {
71+
72+
$scope.data[field] = $scope.msmodel
73+
var _label = $scope.msdata.find(function (_item) {
74+
return _item.id == item.id
75+
})
76+
item.label = _label.label
77+
}
78+
79+
$scope.onItemDeselect = function (item) {
80+
81+
}
82+
83+
// Fim dos eventos
84+
85+
$scope.removeDuplicates= function (a, param){
86+
return a.filter(function(item, pos, array){
87+
return array.map(function(mapItem){ return mapItem[param]; }).indexOf(item[param]) === pos;
88+
})
89+
}
90+
91+
$scope.makeRequestAutocomplete = function (scope, value, route) {
92+
$timeout(function() {
93+
if(!value) value = '[blank]'
94+
$scope.resource = Restangular.all($scope.route());
95+
$scope.resource.customGET('autocomplete/'+route+'/'+value+'?limit=10').then(function (data) {
96+
scope.options = $scope.removeDuplicates(data.concat(scope.selectedModel),'id');
97+
98+
$timeout(function() {},0)
99+
}, function errorCallback() {
100+
});
101+
})
102+
}
103+
104+
$scope._debounce = function(cb) {
105+
var timeout = null;
106+
return function(data) {
107+
if (timeout) {
108+
clearTimeout(timeout);
109+
}
110+
timeout = setTimeout(function() {
111+
cb(data);
112+
}, 200);
113+
};
114+
};
115+
116+
$scope.openDropdownByButton = function(name){
117+
$timeout(function() {
118+
$('[data-reference="'+name+'"] button').click()
119+
})
120+
}
121+
122+
// Inicialização e set e eventos
123+
$scope.onInitMulti = function (event, field) {
124+
var dropdown = $(event.target)
125+
dropdown.scope().input.searchFilter = "";
126+
127+
if (!dropdown.initMultiSelect) {
128+
var _scope = dropdown.scope()
129+
dropdown.initMultiSelect = true
130+
// Popular o msdata pela depois de iniciado
131+
$scope.makeRequestAutocomplete(_scope,'[blank]', field.name)
132+
dropdown.parent().find(".dropdown-header").append('<i class="glyphicon glyphicon-search" style=" position: absolute; top: 20px; right: 35px; "></i>')
133+
134+
// Chamar autocomplete toda vez que alguma coisa é digitada no search-filter
135+
_scope.$watch('input.searchFilter', $scope._debounce(function(data) {
136+
$scope.makeRequestAutocomplete(_scope,data,field.name)
137+
}))
138+
139+
// sim, precisa dessa gambiarra pra chumbar os evento e os textos
140+
141+
//set texts
142+
_scope.texts.buttonDefaultText = "Selecione " + field.label
143+
_scope.texts.searchPlaceholder = "Buscar " + field.label
144+
_scope.texts.dynamicButtonTextSuffix = "selecionado(s)"
145+
146+
_scope.externalEvents.onItemSelect = $scope.onItemSelect
147+
_scope.externalEvents.onSelectionChanged = $scope.changedMultiSelect
148+
_scope.externalEvents.onItemDeselect = $scope.onItemDeselect
149+
}
150+
}
151+
152+
// settings que foram chumbadas no html
153+
// TODO: fix this ... someday ...
154+
$scope.mssettings = {
155+
scrollableHeight: '200px',
156+
scrollable: true,
157+
buttonDefaultText: 'Tipos de imóveis',
158+
enableSearch: true,
159+
styleActive: true,
160+
showCheckAll: false,
161+
showUncheckAll: false,
162+
selectedToTop: true,
163+
buttonClasses: 'btn btn-default fw-multiselect-button',
164+
// smartButtonTextConverter: function (itemText, originalItem) {
165+
// // if (itemText === 'Jhon') {
166+
// // return 'Jhonny!';
167+
// // }
168+
// return itemText;
169+
// }
170+
};
171+
172+
/*Multiselect End*/
173+
},
174+
};
175+
}
176+
})();

src/lets.module.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
'colorpicker-dr',
1919
'ckeditor',
2020
'thatisuday.dropzone',
21-
'swangular'
21+
'swangular',
22+
'angularjs-dropdown-multiselect'
2223
]);
2324

2425
// ----------------------------

src/views/framework/input.html

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,11 +176,55 @@
176176
</div>
177177
</div>
178178

179+
<!-- Multiselect -->
180+
<div ng-if="field.type == 'multiselect'">
181+
<!-- <label for="corretor">{{field.label}}</label> -->
182+
<div class="fw-multiselect-content">
183+
<!-- -->
184+
<div
185+
data-element=""
186+
id="{{field.name}}"
187+
name="{{field.name}}"
188+
ng-dropdown-multiselect=""
189+
fw-multi-select
190+
data-reference="{{field.name}}"
191+
class="ng-dropdown-multiselect"
192+
ng-click="onInitMulti($event, field)"
193+
events="{'onSelectionChanged':changedMultiSelect,'onItemSelect':onItemSelect,'onItemDeselect':onItemDeselect}"
194+
translation-texts="{'buttonDefaultText': 'Selecione ...',
195+
'dynamicButtonTextSuffix':'selecionado(s)'}"
196+
options="msdata"
197+
extra-settings="{scrollableHeight: '200px',
198+
scrollable: true,
199+
buttonDefaultText: 'Tipos de {field.label}',
200+
enableSearch: true,
201+
styleActive: true,
202+
showCheckAll: false,
203+
showUncheckAll: true,
204+
selectedToTop: true,
205+
buttonClasses: 'btn btn-default fw-multiselect-button'}"
206+
selected-model="msmodel"
207+
ng-model="data[msmodel]"></div>
208+
<span class="input-group-btn" ng-click="openDropdownByButton(field.name)">
209+
<button type="button" class="btn btn-default">
210+
<i class="glyphicon glyphicon-menu-down"></i>
211+
</button>
212+
</span>
213+
</div>
214+
</div>
215+
216+
179217
<!--Autocomplete-->
180218
<div ng-if="field.autocomplete && !field.customOptions.autocomplete_table">
181219
<div fw-auto-complete="" class="fw-input-group fw-auto-complete input-group">
182-
<input id="{{field.name}}" ng-model-options="{fieldInfo: field}" fw-auto-complete typeahead-on-select="autocompleteSelect($item, $model, $label)"
183-
aria-autocomplete="none" autocomplete="off" typeahead-min-length="0" typeahead="row as row.label for row in autocomplete(field, $viewValue)"
220+
<input
221+
id="{{field.name}}"
222+
ng-model-options="{fieldInfo: field}"
223+
fw-auto-complete
224+
typeahead-on-select="autocompleteSelect($item, $model, $label)"
225+
aria-autocomplete="none"
226+
autocomplete="off"
227+
typeahead-min-length="0" typeahead="row as row.label for row in autocomplete(field, $viewValue)"
184228
type="text" class="form-control" name="{{field.name}}" ng-required="field.notnull" ng-model="$parent.data[field.name + '.label']"
185229
size="{{field.length}}" placeholder="{{field.label}}" ng-disabled="field.disabled" ng-readonly="field.customOptions.select == true"
186230
ng-class="{'fieldSelect': field.customOptions.select == true}" />

0 commit comments

Comments
 (0)