@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.
- package/addon/components/cell/driver-name.js +1 -1
- package/addon/components/custom-field.hbs +1 -1
- package/addon/components/fleet-driver-listing.hbs +1 -1
- package/addon/components/fleet-driver-listing.js +15 -15
- package/addon/components/global-search.hbs +1 -1
- package/addon/components/integrated-order-details.js +1 -1
- package/addon/components/leaflet-draw-control.js +3 -4
- package/addon/components/live-map.js +0 -2
- package/addon/components/modals/contact-form.hbs +5 -5
- package/addon/components/modals/driver-form.hbs +6 -6
- package/addon/components/modals/entity-form.hbs +1 -1
- package/addon/components/modals/group-form.hbs +1 -1
- package/addon/components/modals/order-form.hbs +1 -1
- package/addon/components/modals/order-import.hbs +1 -1
- package/addon/components/modals/policy-form.hbs +2 -2
- package/addon/components/modals/role-form.hbs +1 -1
- package/addon/components/modals/user-form.hbs +3 -3
- package/addon/components/modals/vehicle-form.hbs +34 -34
- package/addon/components/modals/vendor-form.hbs +8 -8
- package/addon/components/modals/zone-form.hbs +1 -1
- package/addon/components/order-config/activity-flow-editor.hbs +1 -1
- package/addon/components/order-config/fields-editor.js +2 -7
- package/addon/components/order-list-overlay/order.hbs +0 -1
- package/addon/components/order-list-overlay.hbs +2 -2
- package/addon/controllers/management/contacts/index.js +4 -4
- package/addon/controllers/management/fleets/index.js +3 -4
- package/addon/controllers/management/fuel-reports/index.js +3 -2
- package/addon/controllers/management/issues/index.js +2 -1
- package/addon/controllers/management/places/index.js +4 -5
- package/addon/controllers/management/vehicles/index.js +2 -2
- package/addon/controllers/management/vendors/index.js +4 -3
- package/addon/controllers/management.js +0 -2
- package/addon/controllers/operations/orders/index/view.js +0 -1
- package/addon/controllers/operations/orders/index.js +1 -0
- package/addon/controllers/operations/service-rates/index.js +2 -2
- package/addon/controllers/operations/zones/index.js +8 -3
- package/addon/helpers/feature-group.js +0 -1
- package/addon/routes/comms/chat.js +1 -1
- package/addon/routes/comms/intercom.js +1 -1
- package/addon/routes/management/contacts/index.js +0 -1
- package/addon/routes/operations/dispatch.js +1 -1
- package/addon/services/service-areas.js +0 -1
- package/addon/templates/management/index.hbs +8 -8
- package/addon/templates/operations/orders/index/new.hbs +4 -4
- package/addon/templates/operations/service-rates/index/new.hbs +1 -1
- package/addon/templates/operations/zones/index.hbs +6 -6
- package/config/environment.js +1 -2
- package/index.js +4 -4
- package/package.json +8 -6
- package/addon/components/event-timeline.hbs +0 -7
- package/addon/components/event-timeline.js +0 -423
- 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.
|
|
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.
|
|
40
|
-
"@fleetbase/ember-ui": "^0.0.
|
|
41
|
-
"@fleetbase/fleetops-data": "^0.0.
|
|
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/
|
|
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,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';
|