@fleetbase/fleetops-engine 0.0.4 → 0.0.6

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.
Files changed (52) hide show
  1. package/addon/components/cell/driver-name.js +1 -1
  2. package/addon/components/custom-field.hbs +1 -1
  3. package/addon/components/fleet-driver-listing.hbs +1 -1
  4. package/addon/components/fleet-driver-listing.js +15 -15
  5. package/addon/components/global-search.hbs +1 -1
  6. package/addon/components/integrated-order-details.js +1 -1
  7. package/addon/components/leaflet-draw-control.js +3 -4
  8. package/addon/components/live-map.js +0 -2
  9. package/addon/components/modals/contact-form.hbs +5 -5
  10. package/addon/components/modals/driver-form.hbs +6 -6
  11. package/addon/components/modals/entity-form.hbs +1 -1
  12. package/addon/components/modals/group-form.hbs +1 -1
  13. package/addon/components/modals/order-form.hbs +1 -1
  14. package/addon/components/modals/order-import.hbs +1 -1
  15. package/addon/components/modals/policy-form.hbs +2 -2
  16. package/addon/components/modals/role-form.hbs +1 -1
  17. package/addon/components/modals/user-form.hbs +3 -3
  18. package/addon/components/modals/vehicle-form.hbs +34 -34
  19. package/addon/components/modals/vendor-form.hbs +8 -8
  20. package/addon/components/modals/zone-form.hbs +1 -1
  21. package/addon/components/order-config/activity-flow-editor.hbs +1 -1
  22. package/addon/components/order-config/fields-editor.js +2 -7
  23. package/addon/components/order-list-overlay/order.hbs +0 -1
  24. package/addon/components/order-list-overlay.hbs +2 -2
  25. package/addon/controllers/management/contacts/index.js +4 -4
  26. package/addon/controllers/management/fleets/index.js +3 -4
  27. package/addon/controllers/management/fuel-reports/index.js +3 -2
  28. package/addon/controllers/management/issues/index.js +2 -1
  29. package/addon/controllers/management/places/index.js +4 -5
  30. package/addon/controllers/management/vehicles/index.js +2 -2
  31. package/addon/controllers/management/vendors/index.js +4 -3
  32. package/addon/controllers/management.js +0 -2
  33. package/addon/controllers/operations/orders/index/view.js +0 -1
  34. package/addon/controllers/operations/orders/index.js +1 -0
  35. package/addon/controllers/operations/service-rates/index.js +2 -2
  36. package/addon/controllers/operations/zones/index.js +8 -3
  37. package/addon/helpers/feature-group.js +0 -1
  38. package/addon/routes/comms/chat.js +1 -1
  39. package/addon/routes/comms/intercom.js +1 -1
  40. package/addon/routes/management/contacts/index.js +0 -1
  41. package/addon/routes/operations/dispatch.js +1 -1
  42. package/addon/services/service-areas.js +0 -1
  43. package/addon/templates/management/index.hbs +8 -8
  44. package/addon/templates/operations/orders/index/new.hbs +4 -4
  45. package/addon/templates/operations/service-rates/index/new.hbs +1 -1
  46. package/addon/templates/operations/zones/index.hbs +6 -6
  47. package/config/environment.js +1 -2
  48. package/index.js +4 -4
  49. package/package.json +8 -6
  50. package/addon/components/event-timeline.hbs +0 -7
  51. package/addon/components/event-timeline.js +0 -423
  52. package/app/components/event-timeline.js +0 -1
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@fleetbase/fleetops-engine",
3
3
  "extension": "Fleet Ops",
4
4
  "icon": "route",
5
- "version": "0.0.4",
5
+ "version": "0.0.6",
6
6
  "priority": 0,
7
7
  "description": "Fleetbase Fleet-Ops extension provides a fleet management and last mile delivery operations system module.",
8
8
  "keywords": [
@@ -36,12 +36,13 @@
36
36
  "test:ember-compatibility": "ember try:each"
37
37
  },
38
38
  "dependencies": {
39
- "@fleetbase/ember-core": "^0.0.1",
40
- "@fleetbase/ember-ui": "^0.0.3",
41
- "@fleetbase/fleetops-data": "^0.0.1",
39
+ "@fleetbase/ember-core": "^0.0.2",
40
+ "@fleetbase/ember-ui": "^0.0.4",
41
+ "@fleetbase/fleetops-data": "^0.0.2",
42
42
  "@fleetbase/leaflet-routing-machine": "^3.2.15",
43
43
  "@fortawesome/ember-fontawesome": "^0.4.1",
44
- "@fortawesome/free-solid-svg-icons": "^6.2.0",
44
+ "@fortawesome/fontawesome-svg-core": "^6.4.0",
45
+ "@fortawesome/free-solid-svg-icons": "^6.4.0",
45
46
  "@terraformer/spatial": "^2.1.2",
46
47
  "@zestia/ember-dragula": "^12.0.0",
47
48
  "broccoli-funnel": "^3.0.8",
@@ -55,7 +56,8 @@
55
56
  "leaflet": "^1.8.0",
56
57
  "leaflet-contextmenu": "^1.4.0",
57
58
  "leaflet-draw": "^1.0.4",
58
- "leaflet-rotatedmarker": "^0.2.0"
59
+ "leaflet-rotatedmarker": "^0.2.0",
60
+ "socketcluster-client": "^17.1.1"
59
61
  },
60
62
  "devDependencies": {
61
63
  "@ember/optional-features": "^2.0.0",
@@ -1,7 +0,0 @@
1
- <div class="timeline" {{did-insert (fn this.createTimeline this.defaultSettings)}}>
2
- <div class="timeline__wrap">
3
- <div class="timeline__items">
4
- {{yield}}
5
- </div>
6
- </div>
7
- </div>
@@ -1,423 +0,0 @@
1
- /* eslint-disable no-undef */
2
- import Component from '@glimmer/component';
3
-
4
- export default class EventTimelineComponent extends Component {
5
- /**
6
- * Default event timeline settings
7
- *
8
- * @var {Object}
9
- */
10
- defaultSettings = {
11
- forceVerticalMode: {
12
- type: 'integer',
13
- defaultValue: 600,
14
- },
15
- horizontalStartPosition: {
16
- type: 'string',
17
- acceptedValues: ['bottom', 'top'],
18
- defaultValue: 'top',
19
- },
20
- mode: {
21
- type: 'string',
22
- acceptedValues: ['horizontal', 'vertical'],
23
- defaultValue: 'vertical',
24
- },
25
- moveItems: {
26
- type: 'integer',
27
- defaultValue: 1,
28
- },
29
- startIndex: {
30
- type: 'integer',
31
- defaultValue: 0,
32
- },
33
- verticalStartPosition: {
34
- type: 'string',
35
- acceptedValues: ['left', 'right'],
36
- defaultValue: 'left',
37
- },
38
- verticalTrigger: {
39
- type: 'string',
40
- defaultValue: '15%',
41
- },
42
- visibleItems: {
43
- type: 'integer',
44
- defaultValue: 3,
45
- },
46
- };
47
-
48
- /**
49
- * Creates a timeline object from the component root element
50
- *
51
- * @param {HTMLElement} element
52
- * @return
53
- */
54
- createTimeline(element, defaultSettings = {}) {
55
- const timelineName = element.id ? `#${element.id}` : `.${element.className}`;
56
- const errorPart = 'could not be found as a direct descendant of';
57
- const data = element.dataset;
58
- let wrap;
59
- let scroller;
60
- let items;
61
- const settings = {};
62
-
63
- // Test for correct HTML structure
64
- try {
65
- wrap = element.querySelector('.timeline__wrap');
66
- if (!wrap) {
67
- throw new Error(`${warningLabel} .timeline__wrap ${errorPart} ${timelineName}`);
68
- } else {
69
- scroller = wrap.querySelector('.timeline__items');
70
- if (!scroller) {
71
- throw new Error(`${warningLabel} .timeline__items ${errorPart} .timeline__wrap`);
72
- } else {
73
- items = [].slice.call(scroller.children, 0);
74
- }
75
- }
76
- } catch (e) {
77
- console.warn(e.message);
78
- return false;
79
- }
80
-
81
- // Test setting input values
82
- Object.keys(this.defaultSettings).forEach((key) => {
83
- settings[key] = defaultSettings[key].defaultValue;
84
-
85
- if (data[key]) {
86
- settings[key] = data[key];
87
- } else if (options && options[key]) {
88
- settings[key] = options[key];
89
- }
90
-
91
- if (defaultSettings[key].type === 'integer') {
92
- if (!settings[key] || !testValues(settings[key], key)) {
93
- settings[key] = defaultSettings[key].defaultValue;
94
- }
95
- } else if (defaultSettings[key].type === 'string') {
96
- if (defaultSettings[key].acceptedValues && defaultSettings[key].acceptedValues.indexOf(settings[key]) === -1) {
97
- console.warn(`${warningLabel} The value "${settings[key]}" entered for the setting "${key}" was not recognised.`);
98
- settings[key] = defaultSettings[key].defaultValue;
99
- }
100
- }
101
- });
102
-
103
- // Further specific testing of input values
104
- const defaultTrigger = defaultSettings.verticalTrigger.defaultValue.match(/(\d*\.?\d*)(.*)/);
105
- const triggerArray = settings.verticalTrigger.match(/(\d*\.?\d*)(.*)/);
106
- let [, triggerValue, triggerUnit] = triggerArray;
107
- let triggerValid = true;
108
- if (!triggerValue) {
109
- console.warn(`${warningLabel} No numercial value entered for the 'verticalTrigger' setting.`);
110
- triggerValid = false;
111
- }
112
- if (triggerUnit !== 'px' && triggerUnit !== '%') {
113
- console.warn(`${warningLabel} The setting 'verticalTrigger' must be a percentage or pixel value.`);
114
- triggerValid = false;
115
- }
116
- if (triggerUnit === '%' && (triggerValue > 100 || triggerValue < 0)) {
117
- console.warn(`${warningLabel} The 'verticalTrigger' setting value must be between 0 and 100 if using a percentage value.`);
118
- triggerValid = false;
119
- } else if (triggerUnit === 'px' && triggerValue < 0) {
120
- console.warn(`${warningLabel} The 'verticalTrigger' setting value must be above 0 if using a pixel value.`);
121
- triggerValid = false;
122
- }
123
-
124
- if (triggerValid === false) {
125
- [, triggerValue, triggerUnit] = defaultTrigger;
126
- }
127
-
128
- settings.verticalTrigger = {
129
- unit: triggerUnit,
130
- value: triggerValue,
131
- };
132
-
133
- if (settings.moveItems > settings.visibleItems) {
134
- console.warn(
135
- `${warningLabel} The value of "moveItems" (${settings.moveItems}) is larger than the number of "visibleItems" (${settings.visibleItems}). The value of "visibleItems" has been used instead.`
136
- );
137
- settings.moveItems = settings.visibleItems;
138
- }
139
-
140
- if (settings.startIndex >= items.length - settings.visibleItems) {
141
- console.warn(
142
- `${warningLabel} The 'startIndex' setting must be between 0 and ${items.length - settings.visibleItems} for this timeline. The value of ${
143
- items.length - settings.visibleItems
144
- } has been used instead.`
145
- );
146
- settings.startIndex = items.length - settings.visibleItems;
147
- } else if (settings.startIndex < 0) {
148
- console.warn(`${warningLabel} The 'startIndex' setting must be between 0 and ${items.length - settings.visibleItems} for this timeline. The value of 0 has been used instead.`);
149
- settings.startIndex = 0;
150
- }
151
-
152
- return this.initialize({
153
- element,
154
- wrap,
155
- scroller,
156
- items,
157
- settings,
158
- });
159
- }
160
-
161
- itemWrap(el, wrapper, classes = []) {
162
- wrapper.classList.add(...classes);
163
- el.parentNode.insertBefore(wrapper, el);
164
- wrapper.appendChild(el);
165
- }
166
-
167
- // Helper function to wrap each element in a group with other HTML elements
168
- wrapElements(items) {
169
- items.forEach((item) => {
170
- this.itemWrap(item.querySelector('.timeline__content'), document.createElement('div'), 'timeline__content__wrap');
171
- this.itemWrap(item.querySelector('.timeline__content__wrap'), document.createElement('div'), 'timeline__item__inner');
172
- });
173
- }
174
-
175
- // Helper function to check if an element is partially in the viewport
176
- isElementInViewport(el, triggerPosition) {
177
- const rect = el.getBoundingClientRect();
178
- const windowHeight = window.innerHeight || document.documentElement.clientHeight;
179
- const defaultTrigger = defaultSettings.verticalTrigger.defaultValue.match(/(\d*\.?\d*)(.*)/);
180
- let triggerUnit = triggerPosition.unit;
181
- let triggerValue = triggerPosition.value;
182
- let trigger = windowHeight;
183
- if (triggerUnit === 'px' && triggerValue >= windowHeight) {
184
- console.warn('The value entered for the setting "verticalTrigger" is larger than the window height. The default value will be used instead.');
185
- [, triggerValue, triggerUnit] = defaultTrigger;
186
- }
187
- if (triggerUnit === 'px') {
188
- trigger = parseInt(trigger - triggerValue, 10);
189
- } else if (triggerUnit === '%') {
190
- trigger = parseInt(trigger * ((100 - triggerValue) / 100), 10);
191
- }
192
- return rect.top <= trigger && rect.left <= (window.innerWidth || document.documentElement.clientWidth) && rect.top + rect.height >= 0 && rect.left + rect.width >= 0;
193
- }
194
-
195
- // Helper function to add transform styles
196
- addTransforms(el, transform) {
197
- el.style.webkitTransform = transform;
198
- el.style.msTransform = transform;
199
- el.style.transform = transform;
200
- }
201
-
202
- // Set height and widths of timeline elements and viewport
203
- setHeightandWidths(tl) {
204
- // Set widths of items and viewport
205
- function setWidths() {
206
- tl.itemWidth = tl.wrap.offsetWidth / tl.settings.visibleItems;
207
- tl.items.forEach((item) => {
208
- item.style.width = `${tl.itemWidth}px`;
209
- });
210
- tl.scrollerWidth = tl.itemWidth * tl.items.length;
211
- tl.scroller.style.width = `${tl.scrollerWidth}px`;
212
- }
213
-
214
- // Set height of items and viewport
215
- function setHeights() {
216
- let oddIndexTallest = 0;
217
- let evenIndexTallest = 0;
218
- tl.items.forEach((item, i) => {
219
- item.style.height = 'auto';
220
- const height = item.offsetHeight;
221
- if (i % 2 === 0) {
222
- evenIndexTallest = height > evenIndexTallest ? height : evenIndexTallest;
223
- } else {
224
- oddIndexTallest = height > oddIndexTallest ? height : oddIndexTallest;
225
- }
226
- });
227
-
228
- const transformString = `translateY(${evenIndexTallest}px)`;
229
- tl.items.forEach((item, i) => {
230
- if (i % 2 === 0) {
231
- item.style.height = `${evenIndexTallest}px`;
232
- if (tl.settings.horizontalStartPosition === 'bottom') {
233
- item.classList.add('timeline__item--bottom');
234
- addTransforms(item, transformString);
235
- } else {
236
- item.classList.add('timeline__item--top');
237
- }
238
- } else {
239
- item.style.height = `${oddIndexTallest}px`;
240
- if (tl.settings.horizontalStartPosition !== 'bottom') {
241
- item.classList.add('timeline__item--bottom');
242
- addTransforms(item, transformString);
243
- } else {
244
- item.classList.add('timeline__item--top');
245
- }
246
- }
247
- });
248
- tl.scroller.style.height = `${evenIndexTallest + oddIndexTallest}px`;
249
- }
250
-
251
- if (window.innerWidth > tl.settings.forceVerticalMode) {
252
- setWidths();
253
- setHeights();
254
- }
255
- }
256
-
257
- // Create and add arrow controls to horizontal timeline
258
- addNavigation(tl) {
259
- if (tl.items.length > tl.settings.visibleItems) {
260
- const prevArrow = document.createElement('button');
261
- const nextArrow = document.createElement('button');
262
- const topPosition = tl.items[0].offsetHeight;
263
- prevArrow.className = 'timeline-nav-button timeline-nav-button--prev';
264
- nextArrow.className = 'timeline-nav-button timeline-nav-button--next';
265
- prevArrow.textContent = 'Previous';
266
- nextArrow.textContent = 'Next';
267
- prevArrow.style.top = `${topPosition}px`;
268
- nextArrow.style.top = `${topPosition}px`;
269
- if (currentIndex === 0) {
270
- prevArrow.disabled = true;
271
- } else if (currentIndex + 1 === tl.items.length) {
272
- nextArrow.disabled = true;
273
- }
274
- tl.timelineEl.appendChild(prevArrow);
275
- tl.timelineEl.appendChild(nextArrow);
276
- }
277
- }
278
-
279
- // Add the centre line to the horizontal timeline
280
- addHorizontalDivider(tl) {
281
- const divider = tl.timelineEl.querySelector('.timeline-divider');
282
- if (divider) {
283
- tl.timelineEl.removeChild(divider);
284
- }
285
- const topPosition = tl.items[0].offsetHeight;
286
- const horizontalDivider = document.createElement('span');
287
- horizontalDivider.className = 'timeline-divider';
288
- horizontalDivider.style.top = `${topPosition}px`;
289
- tl.timelineEl.appendChild(horizontalDivider);
290
- }
291
-
292
- // Calculate the new position of the horizontal timeline
293
- timelinePosition(tl) {
294
- const position = tl.items.length > 2 ? tl.items[currentIndex].offsetLeft : 0;
295
- const str = `translate3d(-${position}px, 0, 0)`;
296
- addTransforms(tl.scroller, str);
297
- }
298
-
299
- // Make the horizontal timeline slide
300
- slideTimeline(tl) {
301
- const navArrows = tl.timelineEl.querySelectorAll('.timeline-nav-button');
302
- const arrowPrev = tl.timelineEl.querySelector('.timeline-nav-button--prev');
303
- const arrowNext = tl.timelineEl.querySelector('.timeline-nav-button--next');
304
- const maxIndex = tl.items.length - tl.settings.visibleItems;
305
- const moveItems = parseInt(tl.settings.moveItems, 10);
306
- [].forEach.call(navArrows, (arrow) => {
307
- arrow.addEventListener('click', function (e) {
308
- e.preventDefault();
309
- currentIndex = this.classList.contains('timeline-nav-button--next') ? (currentIndex += moveItems) : (currentIndex -= moveItems);
310
- if (currentIndex === 0 || currentIndex < 0) {
311
- currentIndex = 0;
312
- arrowPrev.disabled = true;
313
- arrowNext.disabled = false;
314
- } else if (currentIndex === maxIndex || currentIndex > maxIndex) {
315
- currentIndex = maxIndex;
316
- arrowPrev.disabled = false;
317
- arrowNext.disabled = true;
318
- } else {
319
- arrowPrev.disabled = false;
320
- arrowNext.disabled = false;
321
- }
322
- timelinePosition(tl);
323
- });
324
- });
325
- }
326
-
327
- // Set up horizontal timeline
328
- setUpHorinzontalTimeline(tl) {
329
- tl.timelineEl.classList.add('timeline--horizontal');
330
- this.setHeightandWidths(tl);
331
- this.timelinePosition(tl);
332
- this.addNavigation(tl);
333
- this.addHorizontalDivider(tl);
334
- this.slideTimeline(tl);
335
- }
336
-
337
- // Set up vertical timeline
338
- setUpVerticalTimeline(tl) {
339
- let lastVisibleIndex = 0;
340
- tl.items.forEach((item, i) => {
341
- item.classList.remove('animated', 'fadeIn');
342
- if (!this.isElementInViewport(item, tl.settings.verticalTrigger) && i > 0) {
343
- item.classList.add('animated');
344
- } else {
345
- lastVisibleIndex = i;
346
- }
347
- const divider = tl.settings.verticalStartPosition === 'left' ? 1 : 0;
348
- if (i % 2 === divider && window.innerWidth > tl.settings.forceVerticalMode) {
349
- item.classList.add('timeline__item--right');
350
- } else {
351
- item.classList.add('timeline__item--left');
352
- }
353
- });
354
- for (let i = 0; i < lastVisibleIndex; i += 1) {
355
- tl.items[i].classList.remove('animated', 'fadeIn');
356
- }
357
- // Bring elements into view as the page is scrolled
358
- window.addEventListener('scroll', () => {
359
- tl.items.forEach((item) => {
360
- if (this.isElementInViewport(item, tl.settings.verticalTrigger)) {
361
- item.classList.add('fadeIn');
362
- }
363
- });
364
- });
365
- // also bring element into view it the container element is scrollable
366
- const tlContainer = window.$(tl.timelineEl).parent();
367
- if ((tlContainer.length && tlContainer.css('overflow-y') == 'scroll') || tlContainer.css('overflow-y') == 'auto') {
368
- const tlContainerDOM = tlContainer.get(0);
369
- // console.log(tlContainerDOM);
370
- tlContainerDOM.addEventListener('scroll', () => {
371
- tl.items.forEach((item) => {
372
- if (this.isElementInViewport(item, tl.settings.verticalTrigger)) {
373
- item.classList.add('fadeIn');
374
- }
375
- });
376
- });
377
- }
378
- }
379
-
380
- /**
381
- * Reset the timeline
382
- *
383
- * @param tl timeline
384
- * @void
385
- */
386
- reset(tl) {
387
- tl.timelineEl.classList.remove('timeline--horizontal', 'timeline--mobile');
388
- tl.scroller.removeAttribute('style');
389
- tl.items.forEach((item) => {
390
- item.removeAttribute('style');
391
- item.classList.remove('animated', 'fadeIn', 'timeline__item--left', 'timeline__item--right');
392
- });
393
- const navArrows = tl.timelineEl.querySelectorAll('.timeline-nav-button');
394
- [].forEach.call(navArrows, (arrow) => {
395
- arrow.parentNode.removeChild(arrow);
396
- });
397
- }
398
-
399
- /**
400
- * Initialize timeline
401
- *
402
- * @void
403
- */
404
- initialize(tl) {
405
- tl.timelineEl.style.opacity = 0;
406
- if (!tl.timelineEl.classList.contains('timeline--loaded')) {
407
- this.wrapElements(tl.items);
408
- }
409
- this.reset(tl);
410
- if (window.innerWidth <= tl.settings.forceVerticalMode) {
411
- tl.timelineEl.classList.add('timeline--mobile');
412
- }
413
- if (tl.settings.mode === 'horizontal' && window.innerWidth > tl.settings.forceVerticalMode) {
414
- this.setUpHorinzontalTimeline(tl);
415
- } else {
416
- this.setUpVerticalTimeline(tl);
417
- }
418
- tl.timelineEl.classList.add('timeline--loaded');
419
- setTimeout(() => {
420
- tl.timelineEl.style.opacity = 1;
421
- }, 500);
422
- }
423
- }
@@ -1 +0,0 @@
1
- export { default } from '@fleetbase/fleetops-engine/components/event-timeline';