vhx-quartz 0.9.6 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 {