vhx-quartz 0.9.6 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/vhx/quartz/version.rb +1 -1
- data/vendor/assets/javascripts/vhx-quartz.scope.js +2 -1
- data/vendor/assets/javascripts/vhx-quartz.select.js +198 -79
- data/vendor/assets/stylesheets/vhx-quartz.css +1 -1
- data/vendor/assets/stylesheets/vhx-quartz.min.css +1 -1
- data/vendor/assets/stylesheets/vhx-quartz.select.css +40 -30
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b8861250eb0a0b6d96fabe1bfbbe36a4d87a09ff
|
4
|
+
data.tar.gz: f758fdd80b28c46fa9094910c1be47f02b69db1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54257d767f4062cc2b40209b955abf579df6efa16181510afff2bec3fd8edff25dcb8820c5980316e9ad8744338ad96c1d03999f93d70b20ce87ea2964a67edf
|
7
|
+
data.tar.gz: 2d91ca71f010dd0b4a267cb9cf9747f061484808bef91927e29099d2b11b65353d2bc2ad2b7d6f5c03697ce8fbb2aa30ce6ebd1c62a0b0c0bc3a03c97a21367c
|
data/lib/vhx/quartz/version.rb
CHANGED
@@ -2,13 +2,27 @@
|
|
2
2
|
|
3
3
|
vhxm.components.shared.select.controller = function (opts) {
|
4
4
|
var self = this;
|
5
|
+
var api = opts.api ? opts.api : m.prop(null);
|
5
6
|
|
6
7
|
self.init = function () {
|
7
8
|
self.state = new vhxm.components.shared.select.state();
|
8
9
|
self.model = new vhxm.components.shared.select.model();
|
9
10
|
|
11
|
+
self.type = opts.type || 'standard';
|
12
|
+
self.multiselect = opts.multiselect || false;
|
10
13
|
self.model.items = opts.items;
|
11
|
-
|
14
|
+
|
15
|
+
if (opts.selected) {
|
16
|
+
self.state.selected(opts.selected);
|
17
|
+
}
|
18
|
+
|
19
|
+
if (opts.onSelect) {
|
20
|
+
self.state.onSelect = opts.onSelect;
|
21
|
+
}
|
22
|
+
|
23
|
+
if (opts.onAction) {
|
24
|
+
self.state.onAction = opts.onAction;
|
25
|
+
}
|
12
26
|
|
13
27
|
$(document).on('click', function (event) {
|
14
28
|
var is_dropdown = $(event.target).closest('.c-select--container').length;
|
@@ -19,50 +33,46 @@ vhxm.components.shared.select.controller = function (opts) {
|
|
19
33
|
m.endComputation();
|
20
34
|
}
|
21
35
|
});
|
36
|
+
|
37
|
+
api(self);
|
22
38
|
};
|
23
39
|
|
24
40
|
self.selectedLabel = function () {
|
25
|
-
var
|
26
|
-
|
27
|
-
self.model.items().map(function (item) {
|
28
|
-
if (self.state.selected().value === item[opts.value_prop]) {
|
29
|
-
self.state.selected({
|
30
|
-
value: item[opts.value_prop],
|
31
|
-
label: item[opts.label_prop]
|
32
|
-
});
|
33
|
-
is_default = false;
|
34
|
-
}
|
35
|
-
});
|
41
|
+
var selected = opts.placeholder ? opts.placeholder : 'Select...';
|
36
42
|
|
37
|
-
if (
|
38
|
-
self.
|
43
|
+
if (self.state.selected()) {
|
44
|
+
self.model.items().map(function (item) {
|
45
|
+
if (self.state.selected()[item[opts.prop_map.key]]) {
|
46
|
+
selected = self.state.selected()[item[opts.prop_map.key]].label;
|
47
|
+
}
|
48
|
+
});
|
49
|
+
if (Object.keys(self.state.selected()).length > 1) {
|
50
|
+
selected = 'Multiple items selected';
|
51
|
+
}
|
39
52
|
}
|
40
53
|
|
41
|
-
return
|
54
|
+
return selected;
|
42
55
|
};
|
43
56
|
|
44
|
-
self.handleKeydown = function (
|
45
|
-
var container = $(
|
57
|
+
self.handleKeydown = function (event) {
|
58
|
+
var container = $(event.target).closest('.c-select--container');
|
59
|
+
var options = container.find('.c-select--options');
|
60
|
+
var input = container.find('.c-select--input-container input');
|
46
61
|
|
47
62
|
// Down Arrow
|
48
|
-
if (
|
49
|
-
|
50
|
-
|
63
|
+
if (event.keyCode === 40) {
|
64
|
+
event.preventDefault();
|
65
|
+
self.setHighlightedState('down', options);
|
51
66
|
}
|
52
67
|
// Up Arrow
|
53
|
-
else if (
|
54
|
-
|
55
|
-
|
68
|
+
else if (event.keyCode === 38) {
|
69
|
+
event.preventDefault();
|
70
|
+
self.setHighlightedState('up', options, input);
|
56
71
|
}
|
57
72
|
// Enter/Return
|
58
|
-
else if (
|
59
|
-
|
60
|
-
|
61
|
-
label: self.model.items()[self.state.highlightIndex()][opts.label_prop]
|
62
|
-
});
|
63
|
-
|
64
|
-
self.state.isDropdownOpen(false);
|
65
|
-
e.preventDefault();
|
73
|
+
else if (event.keyCode === 13 && self.state.isDropdownOpen()) {
|
74
|
+
event.preventDefault();
|
75
|
+
self.selectItem(self.model.items()[self.state.highlightIndex()]);
|
66
76
|
}
|
67
77
|
};
|
68
78
|
|
@@ -70,23 +80,71 @@ vhxm.components.shared.select.controller = function (opts) {
|
|
70
80
|
event.preventDefault();
|
71
81
|
var container = $(event.target).closest('.c-select--container').find('.c-select--options');
|
72
82
|
|
83
|
+
if (!self.state.isDropdownOpen()) {
|
84
|
+
self.state.focusInput(true);
|
85
|
+
}
|
86
|
+
|
73
87
|
self.state.isDropdownOpen(!self.state.isDropdownOpen());
|
88
|
+
|
74
89
|
self.state.highlightIndex(-1);
|
75
90
|
|
76
91
|
self.scrollOptionsList(container);
|
77
92
|
};
|
78
93
|
|
79
|
-
self.handleInput = function () {
|
80
|
-
self.state.
|
81
|
-
self.state.
|
94
|
+
self.handleInput = function (event) {
|
95
|
+
self.state.highlightIndex(-1);
|
96
|
+
self.state.searchInputValue(event.target.value);
|
97
|
+
self.state.isLoading(true);
|
98
|
+
};
|
99
|
+
|
100
|
+
self.selectItem = function (item) {
|
101
|
+
var selected = void 0;
|
102
|
+
if (!self.multiselect) {
|
103
|
+
self.state.selected({});
|
104
|
+
}
|
105
|
+
|
106
|
+
selected = self.state.selected() || self.state.selected({});
|
107
|
+
|
108
|
+
if (selected[item[opts.prop_map.key]]) {
|
109
|
+
delete selected[item[opts.prop_map.key]];
|
110
|
+
} else {
|
111
|
+
selected[item[opts.prop_map.key]] = {
|
112
|
+
value: item[opts.prop_map.value],
|
113
|
+
label: item[opts.prop_map.label]
|
114
|
+
};
|
115
|
+
}
|
116
|
+
|
117
|
+
self.state.selected(selected);
|
118
|
+
self.state.isDropdownOpen(self.multiselect ? true : false);
|
119
|
+
self.state.onSelect(self.state.selected());
|
120
|
+
if (!self.multiselect) {
|
121
|
+
self.state.highlightIndex(-1);
|
122
|
+
self.scrollOptionsList(0);
|
123
|
+
}
|
124
|
+
};
|
125
|
+
|
126
|
+
self.handleAction = function (event) {
|
127
|
+
event.preventDefault();
|
128
|
+
m.startComputation();
|
129
|
+
self.state.footerLoading(true);
|
130
|
+
m.endComputation();
|
131
|
+
|
132
|
+
self.state.onAction(function () {
|
133
|
+
m.startComputation();
|
134
|
+
self.state.searchInputValue('');
|
135
|
+
self.state.footerLoading(false);
|
136
|
+
m.endComputation();
|
137
|
+
});
|
82
138
|
};
|
83
139
|
|
84
140
|
self.searchCallback = function (data) {
|
141
|
+
m.startComputation();
|
85
142
|
self.model.items(data);
|
86
|
-
self.state.
|
143
|
+
self.state.isLoading(false);
|
144
|
+
m.endComputation();
|
87
145
|
};
|
88
146
|
|
89
|
-
self.setHighlightedState = function (direction, container) {
|
147
|
+
self.setHighlightedState = function (direction, container, input) {
|
90
148
|
if (direction === 'down') {
|
91
149
|
self.state.highlightIndex(self.state.highlightIndex() + 1);
|
92
150
|
if (self.state.highlightIndex() < self.model.items().length) {
|
@@ -98,6 +156,9 @@ vhxm.components.shared.select.controller = function (opts) {
|
|
98
156
|
self.state.highlightIndex(self.state.highlightIndex() - 1);
|
99
157
|
if (self.state.highlightIndex() > 0) {
|
100
158
|
self.state.scrollIndex(self.state.scrollIndex() - 1);
|
159
|
+
} else if (self.state.highlightIndex() < 0) {
|
160
|
+
self.state.highlightIndex(-1);
|
161
|
+
input.focus();
|
101
162
|
} else {
|
102
163
|
self.state.highlightIndex(0);
|
103
164
|
}
|
@@ -121,14 +182,21 @@ vhxm.components.shared.select.model = function () {
|
|
121
182
|
};
|
122
183
|
|
123
184
|
vhxm.components.shared.select.state = function () {
|
124
|
-
this.selected = m.prop(
|
185
|
+
this.selected = m.prop(null);
|
125
186
|
this.highlighted = m.prop({});
|
126
187
|
this.isDropdownOpen = m.prop(false);
|
127
188
|
this.highlightIndex = m.prop(null);
|
128
189
|
this.scrollIndex = m.prop(0);
|
129
190
|
this.optionHeight = m.prop(0);
|
130
191
|
this.optionsHeight = m.prop(0);
|
131
|
-
this.
|
192
|
+
this.isLoading = m.prop(false);
|
193
|
+
this.searchInputValue = m.prop('');
|
194
|
+
this.footerLoading = m.prop(false);
|
195
|
+
this.focusInput = m.prop(true);
|
196
|
+
this.onSelect = function () {};
|
197
|
+
this.onAction = function (done) {
|
198
|
+
done();
|
199
|
+
};
|
132
200
|
};
|
133
201
|
|
134
202
|
vhxm.components.shared.select.ui.container = {
|
@@ -137,64 +205,120 @@ vhxm.components.shared.select.ui.container = {
|
|
137
205
|
return new vhxm.components.shared.select.controller(opts);
|
138
206
|
},
|
139
207
|
view: function view(ctrl, opts) {
|
140
|
-
|
141
|
-
|
208
|
+
var options = opts.search ? '.has-search' : '';
|
209
|
+
options += opts.trigger ? '.has-trigger' : '';
|
210
|
+
options += opts.inline ? '.inline' : '';
|
211
|
+
|
212
|
+
if (opts.trigger) {
|
213
|
+
opts.trigger.attrs.onclick = ctrl.handleClick;
|
214
|
+
opts.trigger.attrs.className += ' c-select--trigger';
|
215
|
+
}
|
142
216
|
|
143
|
-
return m('.c-select--container.form' +
|
217
|
+
return m('.c-select--container.relative.form' + options, {
|
144
218
|
config: function config(el, isInitialized) {
|
145
|
-
if (opts.
|
146
|
-
var left_pos = el.querySelector('.c-select--trigger').offsetWidth * .25;
|
219
|
+
if (opts.trigger && isInitialized) {
|
220
|
+
var left_pos = el.querySelector('.c-select--trigger').offsetWidth * 0.25;
|
147
221
|
el.querySelector('.c-select--caret').style.left = left_pos + 'px';
|
148
222
|
}
|
149
223
|
},
|
224
|
+
onmouseleave: function onmouseleave() {
|
225
|
+
ctrl.state.highlightIndex(-1);
|
226
|
+
},
|
150
227
|
onkeydown: ctrl.handleKeydown
|
151
|
-
}, [opts.
|
228
|
+
}, [opts.trigger ? opts.trigger : m('a.c-select--trigger.btn-dropdown-' + (opts.color ? opts.color : 'gray') + '.btn--fill' + (ctrl.state.isDropdownOpen() ? '.is-active' : ''), {
|
152
229
|
href: '#',
|
153
230
|
onclick: ctrl.handleClick
|
154
|
-
}, ctrl.selectedLabel()), m('.c-select--dropdown' + (ctrl.state.isDropdownOpen() ? '.is-open' : ''), [opts.search ?
|
231
|
+
}, ctrl.selectedLabel()), m('.c-select--dropdown.bg-white.border.radius.fill-width' + (ctrl.state.isDropdownOpen() ? '.is-open' : ''), [opts.search ?
|
155
232
|
// if search is enabled
|
156
|
-
m('.c-select--input-container.padding-medium', [m.component(vhxm.components.shared.search_input.ui.container, {
|
157
|
-
config: function config(el) {
|
158
|
-
|
233
|
+
m('.c-select--input-container.padding-medium.absolute.bg-white.fill-width.radius', [m.component(vhxm.components.shared.search_input.ui.container, {
|
234
|
+
config: function config(el, init) {
|
235
|
+
el.value = ctrl.state.searchInputValue();
|
236
|
+
if (ctrl.state.focusInput()) {
|
159
237
|
setTimeout(function () {
|
160
238
|
el.focus();
|
239
|
+
ctrl.state.focusInput(false);
|
161
240
|
}, 10);
|
162
241
|
}
|
163
242
|
},
|
164
243
|
callback: ctrl.searchCallback,
|
165
|
-
search:
|
244
|
+
search: function search(query, callback) {
|
245
|
+
if (ctrl.state.highlightIndex() === -1) {
|
246
|
+
opts.search(query, callback);
|
247
|
+
}
|
248
|
+
},
|
166
249
|
placeholder: 'Search',
|
167
250
|
oninput: ctrl.handleInput
|
168
|
-
})]) : '', m.component(vhxm.components.shared.select.ui.list.container, opts, ctrl),
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
251
|
+
})]) : '', m.component(vhxm.components.shared.select.ui.list.container, opts, ctrl), opts.action && ctrl.state.searchInputValue().length ?
|
252
|
+
// show Create New Category dropdown footer action
|
253
|
+
m('.c-select--footer.border-top', [m('a.btn-teal.btn--fill' + (ctrl.state.footerLoading() ? '.is-loading' : ''), {
|
254
|
+
onclick: ctrl.handleAction,
|
255
|
+
href: '#'
|
256
|
+
}, opts.action + (ctrl.state.searchInputValue().length ? ' \'' + ctrl.state.searchInputValue() + '\'' : ''))]) : '', m('span.c-select--caret')])]);
|
257
|
+
}
|
258
|
+
};
|
259
|
+
|
260
|
+
/* ................................................
|
261
|
+
Media Item Component
|
262
|
+
.................................................*/
|
263
|
+
vhxm.components.shared.select.ui.item_media = {
|
264
|
+
view: function view(c, params) {
|
265
|
+
var item = params.item;
|
266
|
+
var index = params.index;
|
267
|
+
var ctrl = params.ctrl;
|
268
|
+
var opts = params.opts;
|
269
|
+
|
270
|
+
return m('.c-media-item--container.padding-horz-medium.padding-vert-small.clearfix' + (index === ctrl.state.highlightIndex() ? '.is-selected' : ''), {
|
271
|
+
onmouseover: function onmouseover() {
|
272
|
+
ctrl.state.highlightIndex(index);
|
273
|
+
},
|
274
|
+
onclick: function onclick(event) {
|
275
|
+
ctrl.handleItemClick(event, item);
|
276
|
+
}
|
277
|
+
}, [m('.c-media-item--image-container.left', [m('img.c-media-item--image.radius.margin-right-medium', {
|
278
|
+
src: item[opts.prop_map.img],
|
279
|
+
width: 70,
|
280
|
+
height: 40
|
281
|
+
})]), m('.c-media-item--content.clearfix.left', [m('p.text--navy', item[opts.prop_map.label]), m('p.text--gray', item[opts.prop_map.descriptor])]), m('.c-media-item--action.clearfix.right', [m('.c-item-toggle.icon--xsmall.icon-check-navy.border' + (ctrl.state.selected() && ctrl.state.selected()[item[opts.prop_map.key]] ? '.is-selected.icon-check-navy' : '.icon-plus-thin-white'))])]);
|
282
|
+
}
|
283
|
+
};
|
284
|
+
|
285
|
+
/* ................................................
|
286
|
+
Standard Item Component
|
287
|
+
.................................................*/
|
288
|
+
vhxm.components.shared.select.ui.item_standard = {
|
289
|
+
view: function view(c, params) {
|
290
|
+
var item = params.item;
|
291
|
+
var index = params.index;
|
292
|
+
var ctrl = params.ctrl;
|
293
|
+
var opts = params.opts;
|
294
|
+
|
295
|
+
return m('li.c-select--option.padding-horz-medium.padding-vert-xsmall' + (index === ctrl.state.highlightIndex() ? '.is-selected' : ''), {
|
296
|
+
config: function config(el) {
|
297
|
+
ctrl.state.optionHeight($(el).outerHeight());
|
298
|
+
},
|
299
|
+
onmouseover: function onmouseover() {
|
300
|
+
ctrl.state.highlightIndex(index);
|
301
|
+
},
|
302
|
+
onclick: function onclick(event) {
|
303
|
+
ctrl.handleItemClick(event, item);
|
304
|
+
}
|
305
|
+
}, [m('span.c-select--item-label.text--navy', item[opts.prop_map.label]), item[opts.prop_map.descriptor] ? m('span.right.text--gray', item[opts.prop_map.descriptor]) : '']);
|
173
306
|
}
|
174
307
|
};
|
175
308
|
|
176
309
|
vhxm.components.shared.select.ui.list.controller = function (opts, parent) {
|
177
310
|
var self = this;
|
178
311
|
|
179
|
-
self.parent =
|
312
|
+
self.parent = parent;
|
180
313
|
self.state = parent.state;
|
181
314
|
self.model = parent.model;
|
182
315
|
|
183
316
|
self.hasItems = function () {
|
184
|
-
return self.model.items() && self.model.items().length >
|
317
|
+
return self.model.items() && self.model.items().length > 0;
|
185
318
|
};
|
186
319
|
|
187
320
|
self.handleItemClick = function (event, item) {
|
188
|
-
self.
|
189
|
-
value: item[opts.value_prop],
|
190
|
-
label: item[opts.label_prop]
|
191
|
-
});
|
192
|
-
self.state.isDropdownOpen(false);
|
193
|
-
self.state.highlightIndex(-1);
|
194
|
-
if (opts.callback) {
|
195
|
-
opts.callback(self.state.selected());
|
196
|
-
}
|
197
|
-
self.parent.scrollOptionsList(0);
|
321
|
+
self.parent.selectItem(item);
|
198
322
|
};
|
199
323
|
};
|
200
324
|
|
@@ -206,22 +330,17 @@ vhxm.components.shared.select.ui.list.container = {
|
|
206
330
|
return new vhxm.components.shared.select.ui.list.controller(opts, parent);
|
207
331
|
},
|
208
332
|
view: function view(ctrl, opts) {
|
209
|
-
return m('ul.c-select--options.margin-left-reset' + (ctrl.state.
|
333
|
+
return m('ul.c-select--options.margin-left-reset.loader-slate.loader--transparent' + (ctrl.state.isLoading() ? '.is-loading' : ''), {
|
210
334
|
config: function config(el) {
|
211
335
|
ctrl.state.optionsHeight($(el).outerHeight());
|
212
336
|
}
|
213
337
|
}, [ctrl.hasItems() ? ctrl.model.items().map(function (item, index) {
|
214
|
-
return m(
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
},
|
221
|
-
onclick: function onclick(event) {
|
222
|
-
ctrl.handleItemClick(event, item);
|
223
|
-
}
|
224
|
-
}, [m('span.c-select--item-label', item[opts.label_prop]), item[opts.descriptor_prop] ? m('span.right.text.primary', item[opts.descriptor_prop]) : '']);
|
338
|
+
return m.component(vhxm.components.shared.select.ui['item_' + ctrl.parent.type], {
|
339
|
+
item: item,
|
340
|
+
index: index,
|
341
|
+
ctrl: ctrl,
|
342
|
+
opts: opts
|
343
|
+
});
|
225
344
|
}) : m.component(vhxm.components.shared.select.ui.list.empty, opts)]);
|
226
345
|
}
|
227
346
|
};
|
@@ -230,6 +349,6 @@ vhxm.components.shared.select.ui.list.container = {
|
|
230
349
|
.................................................*/
|
231
350
|
vhxm.components.shared.select.ui.list.empty = {
|
232
351
|
view: function view() {
|
233
|
-
return m('li.c-select--option.padding-
|
352
|
+
return m('li.c-select--option.padding-horz-large.padding-top-small.padding-bottom-medium.text.primary', 'No results');
|
234
353
|
}
|
235
354
|
};
|
@@ -6361,7 +6361,7 @@ a.head--white:hover, a.head--white:active {
|
|
6361
6361
|
.loader--transparent.is-processing:after, .loader--transparent.is-loading:after {
|
6362
6362
|
display: block;
|
6363
6363
|
content: ' ' !important; }
|
6364
|
-
.loader--transparent.is-processing *, .loader--transparent.is-loading * {
|
6364
|
+
.loader--transparent.is-processing > *, .loader--transparent.is-loading > * {
|
6365
6365
|
opacity: .2; }
|
6366
6366
|
|
6367
6367
|
.loader--hide {
|