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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 763affc4990c71546668701bc6dc65db06923d8d
4
- data.tar.gz: 81c27da88cf35c55410011e9cd30a20d9519821d
3
+ metadata.gz: b8861250eb0a0b6d96fabe1bfbbe36a4d87a09ff
4
+ data.tar.gz: f758fdd80b28c46fa9094910c1be47f02b69db1e
5
5
  SHA512:
6
- metadata.gz: 1e196e1ac526ab34f955ec7409809bfe5aac4a107e30940c29ec33155f42e90e87e54f4db9fcc8731d1a34c91ffd93305c63fa3ff04f463d683c9399de57d319
7
- data.tar.gz: ebd4982993c665f98ed207df3c1d2618427fa22bf72a46034c4632b3a840aff6ac553543d93dba53b7de5fa4e565b539bd5bc06cf9067bafcdd9314957016b95
6
+ metadata.gz: 54257d767f4062cc2b40209b955abf579df6efa16181510afff2bec3fd8edff25dcb8820c5980316e9ad8744338ad96c1d03999f93d70b20ce87ea2964a67edf
7
+ data.tar.gz: 2d91ca71f010dd0b4a267cb9cf9747f061484808bef91927e29099d2b11b65353d2bc2ad2b7d6f5c03697ce8fbb2aa30ce6ebd1c62a0b0c0bc3a03c97a21367c
@@ -1,5 +1,5 @@
1
1
  module Vhx
2
2
  module Quartz
3
- VERSION = "0.9.6"
3
+ VERSION = "0.10.0"
4
4
  end
5
5
  end
@@ -18,7 +18,8 @@ if (typeof vhxm !== 'undefined') {
18
18
  },
19
19
  select: {
20
20
  ui: {
21
- list: {}
21
+ list: {},
22
+ media_item: {}
22
23
  }
23
24
  },
24
25
  autosuggest: {
@@ -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
- self.state.selected(opts.selected);
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 is_default = true;
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 (is_default) {
38
- self.state.selected(opts.selected);
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 self.state.selected().label;
54
+ return selected;
42
55
  };
43
56
 
44
- self.handleKeydown = function (e) {
45
- var container = $(e.target).closest('.c-select--container').find('.c-select--options');
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 (e.keyCode === 40) {
49
- self.setHighlightedState('down', container);
50
- e.preventDefault();
63
+ if (event.keyCode === 40) {
64
+ event.preventDefault();
65
+ self.setHighlightedState('down', options);
51
66
  }
52
67
  // Up Arrow
53
- else if (e.keyCode === 38) {
54
- self.setHighlightedState('up', container);
55
- e.preventDefault();
68
+ else if (event.keyCode === 38) {
69
+ event.preventDefault();
70
+ self.setHighlightedState('up', options, input);
56
71
  }
57
72
  // Enter/Return
58
- else if (e.keyCode === 13 && self.state.isDropdownOpen()) {
59
- self.state.selected({
60
- value: self.model.items()[self.state.highlightIndex()][opts.value_prop],
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.isLoadingResults(true);
81
- self.state.highlightIndex(0);
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.isLoadingResults(false);
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.isLoadingResults = m.prop(false);
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
- opts.custom_trigger ? opts.custom_trigger.attrs.onclick = ctrl.handleClick : '';
141
- opts.custom_trigger ? opts.custom_trigger.attrs.className += ' c-select--trigger' : '';
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' + (opts.search ? '.has-search' : '') + (opts.inline ? '.inline' : ''), {
217
+ return m('.c-select--container.relative.form' + options, {
144
218
  config: function config(el, isInitialized) {
145
- if (opts.custom_trigger && isInitialized) {
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.custom_trigger ? opts.custom_trigger : m('a.c-select--trigger.btn-dropdown-' + (opts.color ? opts.color : 'gray') + '.btn--fill' + (ctrl.state.isDropdownOpen() ? '.is-active' : ''), {
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
- if (ctrl.state.isDropdownOpen()) {
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: opts.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), m('input', {
169
- type: 'hidden',
170
- name: opts.name,
171
- value: ctrl.state.selected().value
172
- }), m('span.c-select--caret')])]);
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 = new vhxm.components.shared.select.controller(opts);
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 > 1;
317
+ return self.model.items() && self.model.items().length > 0;
185
318
  };
186
319
 
187
320
  self.handleItemClick = function (event, item) {
188
- self.state.selected({
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.isLoadingResults() ? '.is-loading.padding-bottom-medium' : ''), {
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('li.c-select--option.padding-horizontal-large.padding-vertical-small' + (index === ctrl.state.highlightIndex() ? '.is-selected' : ''), {
215
- config: function config(el) {
216
- ctrl.state.optionHeight($(el).outerHeight());
217
- },
218
- onmouseover: function onmouseover() {
219
- ctrl.state.highlightIndex(index);
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-horizontal-large.padding-top-small.padding-bottom-medium.text.primary', 'No results');
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 {