@fleetbase/ember-core 0.1.4 → 0.1.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/services/loader.js
CHANGED
|
@@ -2,31 +2,55 @@ import Service from '@ember/service';
|
|
|
2
2
|
import { tracked } from '@glimmer/tracking';
|
|
3
3
|
import { later } from '@ember/runloop';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* Service for managing loading overlays.
|
|
7
|
+
*
|
|
8
|
+
* @class LoaderService
|
|
9
|
+
* @extends Service
|
|
10
|
+
*/
|
|
5
11
|
export default class LoaderService extends Service {
|
|
12
|
+
/**
|
|
13
|
+
* Tracks the routes that have been loaded.
|
|
14
|
+
*
|
|
15
|
+
* @type {Array}
|
|
16
|
+
* @tracked
|
|
17
|
+
*/
|
|
6
18
|
@tracked routesLoaded = [];
|
|
7
19
|
|
|
20
|
+
/**
|
|
21
|
+
* Shows the loader based on a condition.
|
|
22
|
+
*
|
|
23
|
+
* @param {String|HTMLElement} target - The loader target.
|
|
24
|
+
* @param {Object} options - Options for controlling the loader.
|
|
25
|
+
* @param {Function|null} condition - The condition to evaluate.
|
|
26
|
+
*/
|
|
8
27
|
showOnCondition(target, options = {}, condition = null) {
|
|
9
|
-
const { loadingMessage, opacity } = options;
|
|
10
|
-
|
|
11
28
|
if (typeof condition === 'function') {
|
|
12
29
|
condition = condition();
|
|
13
30
|
}
|
|
14
31
|
|
|
15
32
|
if (condition) {
|
|
16
|
-
this.showLoader(target,
|
|
33
|
+
this.showLoader(target, options);
|
|
17
34
|
}
|
|
18
35
|
}
|
|
19
36
|
|
|
20
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Shows loader during the initial route transition.
|
|
39
|
+
*
|
|
40
|
+
* @param {Object} transition - The Ember.js transition object.
|
|
41
|
+
* @param {String|HTMLElement} target - The loader target.
|
|
42
|
+
* @param {Object} options - Options for controlling the loader.
|
|
43
|
+
*/
|
|
44
|
+
showOnInitialTransition(transition, target, options = { loadingMessage: 'Loading...', opacity: 0.1 }) {
|
|
21
45
|
const route = transition.to.name;
|
|
22
46
|
const isSameRoute = transition.from ? transition.to.name === transition.from.name : false;
|
|
23
47
|
|
|
24
48
|
if (!this.routesLoaded.includes(route) || !isSameRoute) {
|
|
25
|
-
if (document.querySelectorAll(
|
|
49
|
+
if (document.querySelectorAll('.overloader').length > 0) {
|
|
26
50
|
return;
|
|
27
51
|
}
|
|
28
52
|
|
|
29
|
-
this.showLoader(target,
|
|
53
|
+
this.showLoader(target, options);
|
|
30
54
|
|
|
31
55
|
transition.finally(() => {
|
|
32
56
|
this.removeLoader(target);
|
|
@@ -39,20 +63,25 @@ export default class LoaderService extends Service {
|
|
|
39
63
|
/**
|
|
40
64
|
* Creates an HTML element node for a loading overlay with a message.
|
|
41
65
|
*
|
|
42
|
-
* @param {String|HTMLElement} targetSelector
|
|
43
|
-
* @param {
|
|
44
|
-
* @
|
|
66
|
+
* @param {String|HTMLElement} targetSelector - The loader target.
|
|
67
|
+
* @param {Object} options - Options for controlling the loader.
|
|
68
|
+
* @returns {HTMLElement} - The loader element.
|
|
45
69
|
*/
|
|
46
|
-
showLoader(targetSelector,
|
|
70
|
+
showLoader(targetSelector, options = {}) {
|
|
47
71
|
let target = typeof targetSelector === 'string' ? document.querySelector(targetSelector) : targetSelector;
|
|
48
72
|
|
|
49
73
|
if (!target) {
|
|
50
74
|
target = document.body;
|
|
51
75
|
}
|
|
52
76
|
|
|
77
|
+
const loadingMessage = typeof options.loadingMessage === 'string' ? options.loadingMessage : 'Loading...';
|
|
78
|
+
const opacity = typeof options.opacity === 'number' ? options.opacity : 0.1;
|
|
53
79
|
const isDarkMode = document.body.dataset.theme ? document.body.dataset.theme === 'dark' : true;
|
|
80
|
+
const preserveTargetPosition = options.preserveTargetPosition === true;
|
|
54
81
|
|
|
55
|
-
|
|
82
|
+
if (!preserveTargetPosition) {
|
|
83
|
+
target.style.position = 'relative';
|
|
84
|
+
}
|
|
56
85
|
|
|
57
86
|
let loader = document.createElement('div');
|
|
58
87
|
loader.classList.add('overloader');
|
|
@@ -71,15 +100,21 @@ export default class LoaderService extends Service {
|
|
|
71
100
|
return loader;
|
|
72
101
|
}
|
|
73
102
|
|
|
74
|
-
|
|
75
|
-
|
|
103
|
+
/**
|
|
104
|
+
* Shows a loader on the document body.
|
|
105
|
+
*
|
|
106
|
+
* @param {Object} options - Options for controlling the loader.
|
|
107
|
+
* @returns {HTMLElement} - The loader element.
|
|
108
|
+
*/
|
|
109
|
+
show(options = { loadingMessage: 'Loading...', opacity: 0.1 }) {
|
|
110
|
+
return this.showLoader(document.body, options);
|
|
76
111
|
}
|
|
77
112
|
|
|
78
113
|
/**
|
|
79
|
-
*
|
|
114
|
+
* Removes a loader from a target.
|
|
80
115
|
*
|
|
81
|
-
* @param {String|HTMLElement} targetSelector
|
|
82
|
-
* @
|
|
116
|
+
* @param {String|HTMLElement} targetSelector - The loader target.
|
|
117
|
+
* @returns {Service} - The current service instance.
|
|
83
118
|
*/
|
|
84
119
|
removeLoader(targetSelector) {
|
|
85
120
|
let target = typeof targetSelector === 'string' ? document.querySelector(targetSelector) : targetSelector;
|
|
@@ -114,9 +149,10 @@ export default class LoaderService extends Service {
|
|
|
114
149
|
}
|
|
115
150
|
|
|
116
151
|
/**
|
|
117
|
-
* Removes
|
|
152
|
+
* Removes all loader instances after a delay.
|
|
118
153
|
*
|
|
119
|
-
* @
|
|
154
|
+
* @param {Number} delay - The delay in milliseconds.
|
|
155
|
+
* @returns {Service} - The current service instance.
|
|
120
156
|
*/
|
|
121
157
|
remove(delay = 0) {
|
|
122
158
|
const loaders = document.querySelectorAll(`.overloader`);
|
|
@@ -140,6 +140,19 @@ export default class UniverseService extends Service.extend(Evented) {
|
|
|
140
140
|
return this;
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
+
/**
|
|
144
|
+
* Triggers an event on for a universe registry.
|
|
145
|
+
*
|
|
146
|
+
* @memberof UniverseService
|
|
147
|
+
* @method createRegistryEvent
|
|
148
|
+
* @param {string} registryName - The name of the registry to trigger the event on.
|
|
149
|
+
* @param {string} event - The name of the event to trigger.
|
|
150
|
+
* @param {...*} params - Additional parameters to pass to the event handler.
|
|
151
|
+
*/
|
|
152
|
+
@action createRegistryEvent(registryName, event, ...params) {
|
|
153
|
+
this.trigger(`${registryName}.${event}`, ...params);
|
|
154
|
+
}
|
|
155
|
+
|
|
143
156
|
/**
|
|
144
157
|
* @action
|
|
145
158
|
* Retrieves the entire registry with the given name.
|
|
@@ -434,6 +447,14 @@ export default class UniverseService extends Service.extend(Evented) {
|
|
|
434
447
|
// create menu item
|
|
435
448
|
const menuItem = this._createMenuItem(title, route, options);
|
|
436
449
|
|
|
450
|
+
// register menu item
|
|
451
|
+
if (!this[internalRegistryName]) {
|
|
452
|
+
this[internalRegistryName] = {
|
|
453
|
+
menuItems: [],
|
|
454
|
+
menuPanels: [],
|
|
455
|
+
};
|
|
456
|
+
}
|
|
457
|
+
|
|
437
458
|
// register menu item
|
|
438
459
|
this[internalRegistryName].menuItems.pushObject(menuItem);
|
|
439
460
|
|
|
@@ -638,15 +659,9 @@ export default class UniverseService extends Service.extend(Evented) {
|
|
|
638
659
|
view,
|
|
639
660
|
index,
|
|
640
661
|
section,
|
|
662
|
+
onClick,
|
|
641
663
|
};
|
|
642
664
|
|
|
643
|
-
// send default params into onClick
|
|
644
|
-
if (typeof onClick === 'function') {
|
|
645
|
-
menuItem.onClick = () => {
|
|
646
|
-
return onClick(menuItem);
|
|
647
|
-
};
|
|
648
|
-
}
|
|
649
|
-
|
|
650
665
|
return menuItem;
|
|
651
666
|
}
|
|
652
667
|
|
|
@@ -679,6 +694,55 @@ export default class UniverseService extends Service.extend(Evented) {
|
|
|
679
694
|
}
|
|
680
695
|
}
|
|
681
696
|
|
|
697
|
+
/**
|
|
698
|
+
* Manually registers a service in a specified engine.
|
|
699
|
+
*
|
|
700
|
+
* @method registerComponentInEngine
|
|
701
|
+
* @public
|
|
702
|
+
* @memberof UniverseService
|
|
703
|
+
* @param {String} engineName - The name of the engine where the component should be registered.
|
|
704
|
+
* @param {Object} serviceClass - The service class to register, which should have a 'name' property.
|
|
705
|
+
*/
|
|
706
|
+
registerServiceInEngine(targetEngineName, serviceName, currentEngineInstance) {
|
|
707
|
+
// Get the target engine instance
|
|
708
|
+
const targetEngineInstance = this.getEngineInstance(targetEngineName);
|
|
709
|
+
|
|
710
|
+
// Validate inputs
|
|
711
|
+
if (targetEngineInstance && currentEngineInstance && typeof serviceName === 'string') {
|
|
712
|
+
// Lookup the service instance from the current engine
|
|
713
|
+
const sharedService = currentEngineInstance.lookup(`service:${serviceName}`);
|
|
714
|
+
|
|
715
|
+
if (sharedService) {
|
|
716
|
+
// Register the service in the target engine
|
|
717
|
+
targetEngineInstance.register(`service:${serviceName}`, sharedService, { instantiate: false });
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
/**
|
|
723
|
+
* Retrieves a service instance from a specified Ember engine.
|
|
724
|
+
*
|
|
725
|
+
* @param {string} engineName - The name of the engine from which to retrieve the service.
|
|
726
|
+
* @param {string} serviceName - The name of the service to retrieve.
|
|
727
|
+
* @returns {Object|null} The service instance if found, otherwise null.
|
|
728
|
+
*
|
|
729
|
+
* @example
|
|
730
|
+
* const userService = universe.getServiceFromEngine('user-engine', 'user');
|
|
731
|
+
* if (userService) {
|
|
732
|
+
* userService.doSomething();
|
|
733
|
+
* }
|
|
734
|
+
*/
|
|
735
|
+
getServiceFromEngine(engineName, serviceName) {
|
|
736
|
+
const engineInstance = this.getEngineInstance(engineName);
|
|
737
|
+
|
|
738
|
+
if (engineInstance && typeof serviceName === 'string') {
|
|
739
|
+
const serviceInstance = engineInstance.lookup(`service:${serviceName}`);
|
|
740
|
+
return serviceInstance;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
return null;
|
|
744
|
+
}
|
|
745
|
+
|
|
682
746
|
/**
|
|
683
747
|
* Load the specified engine. If it is not loaded yet, it will use assetLoader
|
|
684
748
|
* to load it and then register it to the router.
|
|
@@ -90,7 +90,7 @@ export default function autoSerialize(model, except = []) {
|
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
if (kind === 'hasMany') {
|
|
93
|
-
serialized[attr] =
|
|
93
|
+
serialized[attr] = [];
|
|
94
94
|
} else {
|
|
95
95
|
serialized[attr] = serialize(model[attr]);
|
|
96
96
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { getOwner } from '@ember/application';
|
|
2
|
+
|
|
3
|
+
export default function injectEngineService(target, engineName, serviceName, key = null) {
|
|
4
|
+
const owner = getOwner(target);
|
|
5
|
+
const universe = owner.lookup('service:universe');
|
|
6
|
+
const service = universe.getServiceFromEngine(engineName, serviceName);
|
|
7
|
+
const effectiveServiceName = key || serviceName;
|
|
8
|
+
|
|
9
|
+
Object.defineProperty(target, effectiveServiceName, {
|
|
10
|
+
value: service,
|
|
11
|
+
writable: false,
|
|
12
|
+
configurable: true,
|
|
13
|
+
enumerable: true,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from '@fleetbase/ember-core/utils/inject-engine-service';
|
package/package.json
CHANGED