@ngneers/controls 0.0.1-pre1 → 0.0.1-pre3
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/LICENSE +21 -0
- package/fesm2022/ngneers-controls-accordion.mjs +194 -0
- package/fesm2022/ngneers-controls-accordion.mjs.map +1 -0
- package/fesm2022/ngneers-controls-api-ng.mjs +668 -0
- package/fesm2022/ngneers-controls-api-ng.mjs.map +1 -0
- package/fesm2022/ngneers-controls-api.mjs +256 -227
- package/fesm2022/ngneers-controls-api.mjs.map +1 -1
- package/fesm2022/ngneers-controls-avatar.mjs +70 -0
- package/fesm2022/ngneers-controls-avatar.mjs.map +1 -0
- package/fesm2022/ngneers-controls-base.mjs +397 -0
- package/fesm2022/ngneers-controls-base.mjs.map +1 -0
- package/fesm2022/ngneers-controls-breadcrumb.mjs +74 -0
- package/fesm2022/ngneers-controls-breadcrumb.mjs.map +1 -0
- package/fesm2022/ngneers-controls-button-group.mjs +51 -0
- package/fesm2022/ngneers-controls-button-group.mjs.map +1 -0
- package/fesm2022/ngneers-controls-button.mjs +62 -0
- package/fesm2022/ngneers-controls-button.mjs.map +1 -0
- package/fesm2022/ngneers-controls-calendar-time-C7UnIFzU.mjs +63 -0
- package/fesm2022/ngneers-controls-calendar-time-C7UnIFzU.mjs.map +1 -0
- package/fesm2022/ngneers-controls-calendar.mjs +468 -0
- package/fesm2022/ngneers-controls-calendar.mjs.map +1 -0
- package/fesm2022/ngneers-controls-checkbox.mjs +58 -0
- package/fesm2022/ngneers-controls-checkbox.mjs.map +1 -0
- package/fesm2022/ngneers-controls-chip.mjs +52 -0
- package/fesm2022/ngneers-controls-chip.mjs.map +1 -0
- package/fesm2022/ngneers-controls-defer.mjs +43 -0
- package/fesm2022/ngneers-controls-defer.mjs.map +1 -0
- package/fesm2022/ngneers-controls-dialog.mjs +329 -33
- package/fesm2022/ngneers-controls-dialog.mjs.map +1 -1
- package/fesm2022/ngneers-controls-directives.mjs +443 -0
- package/fesm2022/ngneers-controls-directives.mjs.map +1 -0
- package/fesm2022/ngneers-controls-drawer.mjs +232 -0
- package/fesm2022/ngneers-controls-drawer.mjs.map +1 -0
- package/fesm2022/ngneers-controls-edit-inplace.mjs +120 -0
- package/fesm2022/ngneers-controls-edit-inplace.mjs.map +1 -0
- package/fesm2022/ngneers-controls-filter.mjs +516 -0
- package/fesm2022/ngneers-controls-filter.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs +87 -0
- package/fesm2022/ngneers-controls-i18n-de-CdTPeBiR.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs +87 -0
- package/fesm2022/ngneers-controls-i18n-en-Cfp2pOLY.mjs.map +1 -0
- package/fesm2022/ngneers-controls-i18n.mjs +57 -0
- package/fesm2022/ngneers-controls-i18n.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-calendar-z5xA9wTT.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-check-DdAQ9k-T.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-chevron_down-HO-z-xOr.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-chevron_left-CC5psi16.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-chevron_right-BRxlzx4G.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-chevron_up-cqhPO7g2.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-ellipsis-DXIGA1sk.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-filter-oU7E6Xgr.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-filter_solid-CqIKuR4N.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-magnifying_glass-T4Hzbkig.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-minus-oGDEFO4E.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-sort-CRD4tafz.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-sort_down-DiFB1P6R.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-sort_up-Bq_q3hIi.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs +4 -0
- package/fesm2022/ngneers-controls-icon-xmark-BZKZORiu.mjs.map +1 -0
- package/fesm2022/ngneers-controls-icon.mjs +60 -18
- package/fesm2022/ngneers-controls-icon.mjs.map +1 -1
- package/fesm2022/ngneers-controls-inplace.mjs +107 -0
- package/fesm2022/ngneers-controls-inplace.mjs.map +1 -0
- package/fesm2022/ngneers-controls-input-field.mjs +141 -0
- package/fesm2022/ngneers-controls-input-field.mjs.map +1 -0
- package/fesm2022/ngneers-controls-input-mask.mjs +282 -0
- package/fesm2022/ngneers-controls-input-mask.mjs.map +1 -0
- package/fesm2022/ngneers-controls-input.mjs +69 -0
- package/fesm2022/ngneers-controls-input.mjs.map +1 -0
- package/fesm2022/ngneers-controls-item-view.mjs +441 -0
- package/fesm2022/ngneers-controls-item-view.mjs.map +1 -0
- package/fesm2022/ngneers-controls-list-box.mjs +157 -53
- package/fesm2022/ngneers-controls-list-box.mjs.map +1 -1
- package/fesm2022/ngneers-controls-menu.mjs +332 -0
- package/fesm2022/ngneers-controls-menu.mjs.map +1 -0
- package/fesm2022/ngneers-controls-message.mjs +29 -0
- package/fesm2022/ngneers-controls-message.mjs.map +1 -0
- package/fesm2022/ngneers-controls-paginator.mjs +111 -0
- package/fesm2022/ngneers-controls-paginator.mjs.map +1 -0
- package/fesm2022/ngneers-controls-popover.mjs +129 -40
- package/fesm2022/ngneers-controls-popover.mjs.map +1 -1
- package/fesm2022/ngneers-controls-progress.mjs +82 -0
- package/fesm2022/ngneers-controls-progress.mjs.map +1 -0
- package/fesm2022/ngneers-controls-scroller.mjs +162 -78
- package/fesm2022/ngneers-controls-scroller.mjs.map +1 -1
- package/fesm2022/ngneers-controls-select-button.mjs +55 -0
- package/fesm2022/ngneers-controls-select-button.mjs.map +1 -0
- package/fesm2022/ngneers-controls-select.mjs +313 -103
- package/fesm2022/ngneers-controls-select.mjs.map +1 -1
- package/fesm2022/ngneers-controls-slider.mjs +155 -0
- package/fesm2022/ngneers-controls-slider.mjs.map +1 -0
- package/fesm2022/ngneers-controls-spinner.mjs +169 -0
- package/fesm2022/ngneers-controls-spinner.mjs.map +1 -0
- package/fesm2022/ngneers-controls-splitter.mjs +717 -0
- package/fesm2022/ngneers-controls-splitter.mjs.map +1 -0
- package/fesm2022/ngneers-controls-switch.mjs +39 -0
- package/fesm2022/ngneers-controls-switch.mjs.map +1 -0
- package/fesm2022/ngneers-controls-table.mjs +379 -0
- package/fesm2022/ngneers-controls-table.mjs.map +1 -0
- package/fesm2022/ngneers-controls-tabs.mjs +287 -0
- package/fesm2022/ngneers-controls-tabs.mjs.map +1 -0
- package/fesm2022/ngneers-controls-tag.mjs +29 -0
- package/fesm2022/ngneers-controls-tag.mjs.map +1 -0
- package/fesm2022/ngneers-controls-toast.mjs +184 -0
- package/fesm2022/ngneers-controls-toast.mjs.map +1 -0
- package/fesm2022/ngneers-controls-toggle-button.mjs +65 -0
- package/fesm2022/ngneers-controls-toggle-button.mjs.map +1 -0
- package/fesm2022/ngneers-controls-tooltip.mjs +454 -0
- package/fesm2022/ngneers-controls-tooltip.mjs.map +1 -0
- package/fesm2022/ngneers-controls-utils-ng.mjs +227 -0
- package/fesm2022/ngneers-controls-utils-ng.mjs.map +1 -0
- package/fesm2022/ngneers-controls-utils.mjs +217 -60
- package/fesm2022/ngneers-controls-utils.mjs.map +1 -1
- package/fesm2022/ngneers-controls.mjs.map +1 -1
- package/package.json +167 -32
- package/types/ngneers-controls-accordion.d.ts +114 -0
- package/types/ngneers-controls-api-ng.d.ts +291 -0
- package/types/ngneers-controls-api.d.ts +99 -0
- package/types/ngneers-controls-avatar.d.ts +50 -0
- package/types/ngneers-controls-base.d.ts +166 -0
- package/types/ngneers-controls-breadcrumb.d.ts +86 -0
- package/types/ngneers-controls-button-group.d.ts +30 -0
- package/types/ngneers-controls-button.d.ts +34 -0
- package/types/ngneers-controls-calendar.d.ts +275 -0
- package/types/ngneers-controls-checkbox.d.ts +38 -0
- package/types/ngneers-controls-chip.d.ts +37 -0
- package/types/ngneers-controls-defer.d.ts +22 -0
- package/types/ngneers-controls-dialog.d.ts +218 -0
- package/types/ngneers-controls-directives.d.ts +146 -0
- package/types/ngneers-controls-drawer.d.ts +220 -0
- package/types/ngneers-controls-edit-inplace.d.ts +182 -0
- package/types/ngneers-controls-filter.d.ts +304 -0
- package/types/ngneers-controls-i18n.d.ts +108 -0
- package/types/ngneers-controls-icon.d.ts +74 -0
- package/types/ngneers-controls-inplace.d.ts +95 -0
- package/types/ngneers-controls-input-field.d.ts +159 -0
- package/types/ngneers-controls-input-mask.d.ts +83 -0
- package/types/ngneers-controls-input.d.ts +27 -0
- package/types/ngneers-controls-item-view.d.ts +211 -0
- package/types/ngneers-controls-list-box.d.ts +216 -0
- package/types/ngneers-controls-menu.d.ts +178 -0
- package/types/ngneers-controls-message.d.ts +19 -0
- package/types/ngneers-controls-paginator.d.ts +162 -0
- package/types/ngneers-controls-popover.d.ts +101 -0
- package/types/ngneers-controls-progress.d.ts +44 -0
- package/types/ngneers-controls-scroller.d.ts +137 -0
- package/types/ngneers-controls-select-button.d.ts +37 -0
- package/types/ngneers-controls-select.d.ts +314 -0
- package/types/ngneers-controls-slider.d.ts +53 -0
- package/types/ngneers-controls-spinner.d.ts +105 -0
- package/types/ngneers-controls-splitter.d.ts +391 -0
- package/types/ngneers-controls-switch.d.ts +18 -0
- package/types/ngneers-controls-table.d.ts +157 -0
- package/types/ngneers-controls-tabs.d.ts +106 -0
- package/types/ngneers-controls-tag.d.ts +19 -0
- package/types/ngneers-controls-toast.d.ts +70 -0
- package/types/ngneers-controls-toggle-button.d.ts +46 -0
- package/types/ngneers-controls-tooltip.d.ts +188 -0
- package/types/ngneers-controls-utils-ng.d.ts +57 -0
- package/types/ngneers-controls-utils.d.ts +130 -0
- package/api/index.d.ts +0 -134
- package/custom-types/index.d.ts +0 -7
- package/dialog/index.d.ts +0 -43
- package/fesm2022/ngneers-controls-custom-types.mjs +0 -4
- package/fesm2022/ngneers-controls-custom-types.mjs.map +0 -1
- package/fesm2022/ngneers-controls-form-field.mjs +0 -33
- package/fesm2022/ngneers-controls-form-field.mjs.map +0 -1
- package/fesm2022/ngneers-controls-lazy-cacher.mjs +0 -30
- package/fesm2022/ngneers-controls-lazy-cacher.mjs.map +0 -1
- package/fesm2022/ngneers-controls-text-field.mjs +0 -23
- package/fesm2022/ngneers-controls-text-field.mjs.map +0 -1
- package/form-field/index.d.ts +0 -19
- package/icon/index.d.ts +0 -30
- package/lazy-cacher/index.d.ts +0 -14
- package/list-box/index.d.ts +0 -58
- package/popover/index.d.ts +0 -41
- package/scroller/index.d.ts +0 -95
- package/select/index.d.ts +0 -86
- package/text-field/index.d.ts +0 -10
- package/utils/index.d.ts +0 -36
- /package/{index.d.ts → types/ngneers-controls.d.ts} +0 -0
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { toggleClass, globalPropertyName, throwExp } from '@ngneers/controls/utils';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { computed, effect, untracked, afterRenderEffect, signal, inject, DOCUMENT, Injectable, DestroyRef } from '@angular/core';
|
|
4
|
+
import { SIGNAL } from '@angular/core/primitives/signals';
|
|
5
|
+
|
|
6
|
+
function signalWithPrevious(signal, previous) {
|
|
7
|
+
let current = previous;
|
|
8
|
+
return computed(() => {
|
|
9
|
+
const prev = current;
|
|
10
|
+
current = signal();
|
|
11
|
+
return { current, previous: prev };
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function computedWithPrevious(computeFn, previous) {
|
|
15
|
+
let current = previous;
|
|
16
|
+
return computed(() => {
|
|
17
|
+
const prev = current;
|
|
18
|
+
current = computeFn(prev);
|
|
19
|
+
return current;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
function effectWithPrevious(signal, effectFn) {
|
|
23
|
+
const sig = signalWithPrevious(signal);
|
|
24
|
+
return effect(() => {
|
|
25
|
+
const { current, previous } = sig();
|
|
26
|
+
effectFn(current, previous);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function explicitEffectBase(usedEffectFn, signals, effectFn) {
|
|
30
|
+
return usedEffectFn(() => {
|
|
31
|
+
const values = signals.map(sig => sig());
|
|
32
|
+
untracked(() => {
|
|
33
|
+
effectFn(values);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function explicitEffect(signals, effectFn) {
|
|
38
|
+
return explicitEffectBase(effect, signals, effectFn);
|
|
39
|
+
}
|
|
40
|
+
function explicitAfterRenderEffect(signals, effectFn) {
|
|
41
|
+
return explicitEffectBase(afterRenderEffect, signals, effectFn);
|
|
42
|
+
}
|
|
43
|
+
function asyncComputed(computeFn, initial) {
|
|
44
|
+
let latestId = 0;
|
|
45
|
+
let latestCompletedId = 0;
|
|
46
|
+
const isRunningSignal = signal(false, ...(ngDevMode ? [{ debugName: "isRunningSignal" }] : []));
|
|
47
|
+
const firstRunCompleted = signal(false, ...(ngDevMode ? [{ debugName: "firstRunCompleted" }] : []));
|
|
48
|
+
const returnSignal = signal(initial, ...(ngDevMode ? [{ debugName: "returnSignal" }] : []));
|
|
49
|
+
effect(() => {
|
|
50
|
+
const currentId = ++latestId;
|
|
51
|
+
isRunningSignal.set(true);
|
|
52
|
+
computeFn()
|
|
53
|
+
.then(value => {
|
|
54
|
+
// Only update the signal if this is the latest call
|
|
55
|
+
if (currentId <= latestCompletedId) {
|
|
56
|
+
console.debug('asyncComputed: ignoring stale value update');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
latestCompletedId = currentId;
|
|
60
|
+
returnSignal.set(value);
|
|
61
|
+
firstRunCompleted.set(true);
|
|
62
|
+
// Set isRunning to false if this is the latest operation
|
|
63
|
+
if (currentId === latestId) {
|
|
64
|
+
isRunningSignal.set(false);
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
.catch(error => {
|
|
68
|
+
// Also check if this is the latest operation on error
|
|
69
|
+
if (currentId === latestId) {
|
|
70
|
+
isRunningSignal.set(false);
|
|
71
|
+
}
|
|
72
|
+
console.error('Error in asyncComputed:', error);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
const returnFn = returnSignal;
|
|
76
|
+
returnFn.isRunning = isRunningSignal.asReadonly();
|
|
77
|
+
returnFn.firstRunCompleted = firstRunCompleted;
|
|
78
|
+
return returnFn;
|
|
79
|
+
}
|
|
80
|
+
function setInputSignalValue(input, value) {
|
|
81
|
+
input[SIGNAL].applyValueToInputSignal(input[SIGNAL], value);
|
|
82
|
+
}
|
|
83
|
+
function afterRenderComputed(computeFn, defaultValue) {
|
|
84
|
+
const value = signal(defaultValue, ...(ngDevMode ? [{ debugName: "value" }] : []));
|
|
85
|
+
afterRenderEffect(() => {
|
|
86
|
+
value.set(computeFn());
|
|
87
|
+
});
|
|
88
|
+
return value.asReadonly();
|
|
89
|
+
}
|
|
90
|
+
function debounceSignal(input, delayMs) {
|
|
91
|
+
const delayFn = typeof delayMs === 'function' ? delayMs : () => delayMs;
|
|
92
|
+
const debounced = signal(input(), ...(ngDevMode ? [{ debugName: "debounced" }] : []));
|
|
93
|
+
let timeoutId;
|
|
94
|
+
effect(onCleanup => {
|
|
95
|
+
const value = input();
|
|
96
|
+
const delay = delayFn();
|
|
97
|
+
// Clear any pending timeout
|
|
98
|
+
if (timeoutId !== undefined) {
|
|
99
|
+
clearTimeout(timeoutId);
|
|
100
|
+
}
|
|
101
|
+
// Set new timeout
|
|
102
|
+
timeoutId = setTimeout(() => {
|
|
103
|
+
debounced.set(value);
|
|
104
|
+
timeoutId = undefined;
|
|
105
|
+
}, delay);
|
|
106
|
+
// Cleanup function to clear timeout when effect is destroyed or re-run
|
|
107
|
+
onCleanup(() => {
|
|
108
|
+
if (timeoutId !== undefined) {
|
|
109
|
+
clearTimeout(timeoutId);
|
|
110
|
+
timeoutId = undefined;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
return debounced.asReadonly();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function classSignal(element, klass) {
|
|
118
|
+
effectWithPrevious(klass, (current, previous) => {
|
|
119
|
+
if (previous) {
|
|
120
|
+
toggleClass(element, previous, false);
|
|
121
|
+
}
|
|
122
|
+
if (current) {
|
|
123
|
+
toggleClass(element, current, true);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
class NgnGlobal {
|
|
129
|
+
_window = inject(DOCUMENT).defaultView || window;
|
|
130
|
+
constructor() {
|
|
131
|
+
this._window[globalPropertyName] ??= {
|
|
132
|
+
nextElementId: 1,
|
|
133
|
+
fancyLogging: true,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
get nextElementId() {
|
|
137
|
+
return this._window[globalPropertyName].nextElementId;
|
|
138
|
+
}
|
|
139
|
+
set nextElementId(value) {
|
|
140
|
+
this._window[globalPropertyName].nextElementId = value;
|
|
141
|
+
}
|
|
142
|
+
get fancyLogging() {
|
|
143
|
+
return this._window[globalPropertyName].fancyLogging;
|
|
144
|
+
}
|
|
145
|
+
set fancyLogging(value) {
|
|
146
|
+
this._window[globalPropertyName].fancyLogging = value;
|
|
147
|
+
}
|
|
148
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnGlobal, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
149
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnGlobal });
|
|
150
|
+
}
|
|
151
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImport: i0, type: NgnGlobal, decorators: [{
|
|
152
|
+
type: Injectable
|
|
153
|
+
}], ctorParameters: () => [] });
|
|
154
|
+
|
|
155
|
+
const idPrefix = 'ngn-id-';
|
|
156
|
+
function generateElementId() {
|
|
157
|
+
return idPrefix + inject(NgnGlobal).nextElementId++;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function injectOrThrow(token, moduleName, errorMsg) {
|
|
161
|
+
return inject(token, { optional: true }) ?? throwExp(moduleName, errorMsg);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function loadState(storage, key) {
|
|
165
|
+
const storageType = storage === 'local' ? localStorage : sessionStorage;
|
|
166
|
+
const state = storageType.getItem(key);
|
|
167
|
+
return state ? JSON.parse(state) : null;
|
|
168
|
+
}
|
|
169
|
+
function saveState(storage, key, state) {
|
|
170
|
+
const storageType = storage === 'local' ? localStorage : sessionStorage;
|
|
171
|
+
if (state === null) {
|
|
172
|
+
storageType.removeItem(key);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
storageType.setItem(key, JSON.stringify(state));
|
|
176
|
+
}
|
|
177
|
+
function registerState(options) {
|
|
178
|
+
const { storage, key, valueFn, onLoad, debounce } = options;
|
|
179
|
+
const destroyRef = options?.injector?.get(DestroyRef) ?? inject(DestroyRef);
|
|
180
|
+
const document = options?.injector?.get(DOCUMENT) ?? inject(DOCUMENT);
|
|
181
|
+
const load = () => {
|
|
182
|
+
const k = key();
|
|
183
|
+
return k ? loadState(storage(), k) : null;
|
|
184
|
+
};
|
|
185
|
+
const stateSignal = signal(undefined, ...(ngDevMode ? [{ debugName: "stateSignal" }] : []));
|
|
186
|
+
let timer = undefined;
|
|
187
|
+
const save = () => {
|
|
188
|
+
const k = key();
|
|
189
|
+
const s = stateSignal();
|
|
190
|
+
if (k && s !== undefined)
|
|
191
|
+
saveState(storage(), k, s);
|
|
192
|
+
};
|
|
193
|
+
afterRenderEffect(() => {
|
|
194
|
+
let state = load();
|
|
195
|
+
if (onLoad) {
|
|
196
|
+
state = untracked(() => onLoad(state));
|
|
197
|
+
}
|
|
198
|
+
stateSignal.set(state);
|
|
199
|
+
}, options);
|
|
200
|
+
afterRenderEffect(() => {
|
|
201
|
+
stateSignal.set(valueFn(untracked(() => stateSignal() ?? null)));
|
|
202
|
+
}, options);
|
|
203
|
+
effect(() => {
|
|
204
|
+
stateSignal();
|
|
205
|
+
if (debounce === 0) {
|
|
206
|
+
save();
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
clearTimeout(timer);
|
|
210
|
+
timer = setTimeout(save, debounce);
|
|
211
|
+
}
|
|
212
|
+
}, options);
|
|
213
|
+
// Ensure saving happens on destroy and unload
|
|
214
|
+
document.defaultView?.addEventListener('beforeunload', save);
|
|
215
|
+
destroyRef.onDestroy(() => {
|
|
216
|
+
clearTimeout(timer);
|
|
217
|
+
document.defaultView?.removeEventListener('beforeunload', save);
|
|
218
|
+
save();
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Generated bundle index. Do not edit.
|
|
224
|
+
*/
|
|
225
|
+
|
|
226
|
+
export { NgnGlobal, afterRenderComputed, asyncComputed, classSignal, computedWithPrevious, debounceSignal, effectWithPrevious, explicitAfterRenderEffect, explicitEffect, generateElementId, injectOrThrow, loadState, registerState, saveState, setInputSignalValue, signalWithPrevious };
|
|
227
|
+
//# sourceMappingURL=ngneers-controls-utils-ng.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ngneers-controls-utils-ng.mjs","sources":["../../src/utils-ng/signals.ts","../../src/utils-ng/dom.ts","../../src/utils-ng/globals.ts","../../src/utils-ng/generate-id.ts","../../src/utils-ng/inject.ts","../../src/utils-ng/state.ts","../../src/utils-ng/ngneers-controls-utils-ng.ts"],"sourcesContent":["import {\r\n afterRenderEffect,\r\n computed,\r\n effect,\r\n type EffectRef,\r\n type InputSignal,\r\n type InputSignalWithTransform,\r\n signal,\r\n type Signal,\r\n untracked,\r\n} from '@angular/core';\r\nimport { SIGNAL } from '@angular/core/primitives/signals';\r\n\r\nexport function signalWithPrevious<T>(\r\n signal: Signal<T>,\r\n previous?: T\r\n): Signal<{ current: T; previous: T | undefined }> {\r\n let current = previous;\r\n\r\n return computed(() => {\r\n const prev = current;\r\n current = signal();\r\n return { current, previous: prev };\r\n });\r\n}\r\n\r\nexport function computedWithPrevious<T>(computeFn: (prev?: T) => T, previous?: T): Signal<T> {\r\n let current = previous;\r\n\r\n return computed<T>(() => {\r\n const prev = current;\r\n current = computeFn(prev);\r\n return current;\r\n });\r\n}\r\n\r\nexport function effectWithPrevious<T>(\r\n signal: Signal<T>,\r\n effectFn: (current: T, previous: T | undefined) => void\r\n): EffectRef {\r\n const sig = signalWithPrevious(signal);\r\n return effect(() => {\r\n const { current, previous } = sig();\r\n effectFn(current, previous);\r\n });\r\n}\r\nfunction explicitEffectBase<T extends readonly Signal<any>[]>(\r\n usedEffectFn: (fn: () => void) => EffectRef,\r\n signals: [...T],\r\n effectFn: (values: { [K in keyof T]: T[K] extends Signal<infer U> ? U : never }) => void\r\n): EffectRef {\r\n return usedEffectFn(() => {\r\n const values = signals.map(sig => sig()) as {\r\n [K in keyof T]: T[K] extends Signal<infer U> ? U : never;\r\n };\r\n untracked(() => {\r\n effectFn(values);\r\n });\r\n });\r\n}\r\n\r\nexport function explicitEffect<T extends readonly Signal<any>[]>(\r\n signals: [...T],\r\n effectFn: (values: { [K in keyof T]: T[K] extends Signal<infer U> ? U : never }) => void\r\n): EffectRef {\r\n return explicitEffectBase(effect, signals, effectFn);\r\n}\r\n\r\nexport function explicitAfterRenderEffect<T extends readonly Signal<any>[]>(\r\n signals: [...T],\r\n effectFn: (values: { [K in keyof T]: T[K] extends Signal<infer U> ? U : never }) => void\r\n): EffectRef {\r\n return explicitEffectBase(afterRenderEffect, signals, effectFn);\r\n}\r\n\r\nexport function asyncComputed<T>(\r\n computeFn: () => Promise<T>,\r\n initial: T\r\n): { (): T; isRunning: Signal<boolean>; firstRunCompleted: Signal<boolean> } {\r\n let latestId = 0;\r\n let latestCompletedId = 0;\r\n const isRunningSignal = signal(false);\r\n const firstRunCompleted = signal(false);\r\n const returnSignal = signal<T>(initial);\r\n\r\n effect(() => {\r\n const currentId = ++latestId;\r\n isRunningSignal.set(true);\r\n\r\n computeFn()\r\n .then(value => {\r\n // Only update the signal if this is the latest call\r\n if (currentId <= latestCompletedId) {\r\n console.debug('asyncComputed: ignoring stale value update');\r\n return;\r\n }\r\n latestCompletedId = currentId;\r\n returnSignal.set(value);\r\n firstRunCompleted.set(true);\r\n\r\n // Set isRunning to false if this is the latest operation\r\n if (currentId === latestId) {\r\n isRunningSignal.set(false);\r\n }\r\n })\r\n .catch(error => {\r\n // Also check if this is the latest operation on error\r\n if (currentId === latestId) {\r\n isRunningSignal.set(false);\r\n }\r\n console.error('Error in asyncComputed:', error);\r\n });\r\n });\r\n\r\n const returnFn = returnSignal as unknown as {\r\n (): T;\r\n isRunning: Signal<boolean>;\r\n firstRunCompleted: Signal<boolean>;\r\n };\r\n returnFn.isRunning = isRunningSignal.asReadonly();\r\n returnFn.firstRunCompleted = firstRunCompleted;\r\n return returnFn;\r\n}\r\n\r\nexport function setInputSignalValue<T>(\r\n input: InputSignal<T> | InputSignalWithTransform<T, unknown>,\r\n value: T\r\n): void {\r\n input[SIGNAL].applyValueToInputSignal(input[SIGNAL], value);\r\n}\r\n\r\nexport function afterRenderComputed<T>(computeFn: () => T, defaultValue: T): () => T {\r\n const value = signal(defaultValue);\r\n afterRenderEffect(() => {\r\n value.set(computeFn());\r\n });\r\n return value.asReadonly();\r\n}\r\n\r\nexport function debounceSignal<T>(input: Signal<T>, delayMs: (() => number) | number): Signal<T> {\r\n const delayFn = typeof delayMs === 'function' ? delayMs : () => delayMs;\r\n const debounced = signal(input());\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n effect(onCleanup => {\r\n const value = input();\r\n const delay = delayFn();\r\n\r\n // Clear any pending timeout\r\n if (timeoutId !== undefined) {\r\n clearTimeout(timeoutId);\r\n }\r\n\r\n // Set new timeout\r\n timeoutId = setTimeout(() => {\r\n debounced.set(value);\r\n timeoutId = undefined;\r\n }, delay);\r\n\r\n // Cleanup function to clear timeout when effect is destroyed or re-run\r\n onCleanup(() => {\r\n if (timeoutId !== undefined) {\r\n clearTimeout(timeoutId);\r\n timeoutId = undefined;\r\n }\r\n });\r\n });\r\n\r\n return debounced.asReadonly();\r\n}\r\n","import { toggleClass } from '@ngneers/controls/utils';\r\n\r\nimport { effectWithPrevious } from './signals';\r\n\r\nimport type { Signal } from '@angular/core';\r\n\r\nexport function classSignal(element: HTMLElement, klass: Signal<string | string[]>) {\r\n effectWithPrevious(klass, (current, previous) => {\r\n if (previous) {\r\n toggleClass(element, previous, false);\r\n }\r\n if (current) {\r\n toggleClass(element, current, true);\r\n }\r\n });\r\n}\r\n","import { DOCUMENT, inject, Injectable } from '@angular/core';\nimport { globalPropertyName, type NgnGlobalType } from '@ngneers/controls/utils';\n\n@Injectable()\nexport class NgnGlobal implements NgnGlobalType {\n private readonly _window = inject(DOCUMENT).defaultView || window;\n constructor() {\n this._window[globalPropertyName] ??= {\n nextElementId: 1,\n fancyLogging: true,\n };\n }\n\n public get nextElementId(): number {\n return this._window[globalPropertyName].nextElementId;\n }\n public set nextElementId(value: number) {\n this._window[globalPropertyName].nextElementId = value;\n }\n\n public get fancyLogging(): boolean {\n return this._window[globalPropertyName].fancyLogging;\n }\n public set fancyLogging(value: boolean) {\n this._window[globalPropertyName].fancyLogging = value;\n }\n}\n","import { inject } from '@angular/core';\n\nimport { NgnGlobal } from './globals';\n\nconst idPrefix = 'ngn-id-';\n\nexport function generateElementId() {\n return idPrefix + inject(NgnGlobal).nextElementId++;\n}\n","import { inject, type ProviderToken } from '@angular/core';\r\nimport { throwExp } from '@ngneers/controls/utils';\r\n\r\nexport function injectOrThrow<T>(token: ProviderToken<T>, moduleName: string, errorMsg: string): T {\r\n return inject(token, { optional: true }) ?? throwExp(moduleName, errorMsg);\r\n}\r\n","import {\r\n Injector,\r\n DestroyRef,\r\n inject,\r\n DOCUMENT,\r\n signal,\r\n afterRenderEffect,\r\n untracked,\r\n effect,\r\n} from '@angular/core';\r\n\r\nexport type NgnStateStorage = 'local' | 'session';\r\n\r\nexport function loadState<T>(storage: NgnStateStorage, key: string) {\r\n const storageType = storage === 'local' ? localStorage : sessionStorage;\r\n const state = storageType.getItem(key);\r\n return state ? (JSON.parse(state) as T) : null;\r\n}\r\n\r\nexport function saveState<T>(storage: NgnStateStorage, key: string, state: T | null) {\r\n const storageType = storage === 'local' ? localStorage : sessionStorage;\r\n if (state === null) {\r\n storageType.removeItem(key);\r\n return;\r\n }\r\n storageType.setItem(key, JSON.stringify(state));\r\n}\r\n\r\nexport type RegisterStateOptions<T> = {\r\n storage: () => NgnStateStorage;\r\n key: () => string | null | undefined;\r\n valueFn: (previousState: T | null) => T | null;\r\n onLoad: (state: T | null) => T | null;\r\n debounce?: number;\r\n injector?: Injector;\r\n};\r\nexport function registerState<T>(options: RegisterStateOptions<T>) {\r\n const { storage, key, valueFn, onLoad, debounce } = options;\r\n const destroyRef = options?.injector?.get(DestroyRef) ?? inject(DestroyRef);\r\n const document = options?.injector?.get<Document>(DOCUMENT) ?? inject(DOCUMENT);\r\n\r\n const load = () => {\r\n const k = key();\r\n return k ? loadState<T>(storage(), k) : null;\r\n };\r\n\r\n const stateSignal = signal<T | null | undefined>(undefined);\r\n\r\n let timer: ReturnType<typeof setTimeout> | undefined = undefined;\r\n const save = () => {\r\n const k = key();\r\n const s = stateSignal();\r\n if (k && s !== undefined) saveState(storage(), k, s);\r\n };\r\n\r\n afterRenderEffect(() => {\r\n let state = load();\r\n if (onLoad) {\r\n state = untracked(() => onLoad(state));\r\n }\r\n stateSignal.set(state);\r\n }, options);\r\n afterRenderEffect(() => {\r\n stateSignal.set(valueFn(untracked(() => stateSignal() ?? null)));\r\n }, options);\r\n effect(() => {\r\n stateSignal();\r\n if (debounce === 0) {\r\n save();\r\n } else {\r\n clearTimeout(timer);\r\n timer = setTimeout(save, debounce);\r\n }\r\n }, options);\r\n\r\n // Ensure saving happens on destroy and unload\r\n document.defaultView?.addEventListener('beforeunload', save);\r\n destroyRef.onDestroy(() => {\r\n clearTimeout(timer);\r\n document.defaultView?.removeEventListener('beforeunload', save);\r\n save();\r\n });\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,94 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
function toggleClass(element, className, state) {
|
|
2
|
+
const classes = Array.isArray(className)
|
|
3
|
+
? className.flatMap(x => x.split(' '))
|
|
4
|
+
: className.split(' ');
|
|
5
|
+
classes.forEach(cls => element.classList.toggle(cls, state));
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
function deepCopy(obj) {
|
|
9
|
+
return JSON.parse(JSON.stringify(obj));
|
|
10
|
+
}
|
|
11
|
+
function objectKeys(obj) {
|
|
12
|
+
return Object.keys(obj);
|
|
13
|
+
}
|
|
14
|
+
function objectEntries(obj) {
|
|
15
|
+
return Object.entries(obj);
|
|
16
|
+
}
|
|
17
|
+
function isObject(item) {
|
|
18
|
+
return item !== null && typeof item === 'object' && !Array.isArray(item);
|
|
19
|
+
}
|
|
20
|
+
function deepMerge(target, source) {
|
|
21
|
+
const output = { ...target };
|
|
22
|
+
for (const key of objectKeys(source)) {
|
|
23
|
+
const value = source[key];
|
|
24
|
+
if (isObject(value) && isObject(output[key])) {
|
|
25
|
+
output[key] = deepMerge(output[key], value);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
output[key] = value;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return output;
|
|
32
|
+
}
|
|
33
|
+
function getPropertyIfExists(obj, key) {
|
|
34
|
+
if (key in obj) {
|
|
35
|
+
return obj[key];
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function areObjectsDeepEqual(a, b) {
|
|
41
|
+
if (Object.keys(a).length !== Object.keys(b).length) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return objectKeys(a).every(key => {
|
|
45
|
+
if (typeof a[key] !== typeof b[key]) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
if (typeof a[key] === 'object') {
|
|
49
|
+
return areObjectsDeepEqual(a[key], b[key]);
|
|
50
|
+
}
|
|
51
|
+
return a[key] === b[key];
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function areArraysDeepEqual(a, b) {
|
|
55
|
+
if (a.length !== b.length) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
for (let i = 0; i < a.length; i++) {
|
|
59
|
+
if (typeof a[i] === 'object' && typeof b[i] === 'object') {
|
|
60
|
+
const res = areObjectsDeepEqual(a[i], b[i]);
|
|
61
|
+
if (!res) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
const res = a[i] === b[i];
|
|
67
|
+
if (!res) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function throwExp(moduleName, errorMsg, ...additionalContext) {
|
|
76
|
+
throw new NgnError(moduleName, errorMsg, ...additionalContext);
|
|
77
|
+
}
|
|
78
|
+
class NgnError extends Error {
|
|
79
|
+
additionalContext;
|
|
80
|
+
constructor(area, errorMsg, ...additionalContext) {
|
|
81
|
+
if (typeof window !== 'undefined' && window['__ngn-controls-global__'].fancyLogging) {
|
|
82
|
+
console.log(`%c💥%c[${area}]`, 'font-size: 24px;', 'color: #ff0042; font-size: 20px; background-color: #000000;', ...additionalContext);
|
|
83
|
+
}
|
|
84
|
+
super(`[${area}] ${errorMsg}`);
|
|
85
|
+
this.name = 'NgnError';
|
|
86
|
+
this.additionalContext = additionalContext;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
3
89
|
|
|
4
|
-
function
|
|
5
|
-
|
|
90
|
+
function maybeCallback(value) {
|
|
91
|
+
return typeof value === 'function' ? value() : value;
|
|
6
92
|
}
|
|
7
93
|
|
|
8
94
|
function fuzzyMatch(input, search) {
|
|
@@ -30,75 +116,146 @@ function fuzzyMatch(input, search) {
|
|
|
30
116
|
}
|
|
31
117
|
|
|
32
118
|
const globalPropertyName = '__ngn-controls-global__';
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
119
|
+
|
|
120
|
+
const Logger = new (class {
|
|
121
|
+
logLevel = 'info';
|
|
122
|
+
debug(...args) {
|
|
123
|
+
if (this.logLevel === 'debug') {
|
|
124
|
+
console.debug(...args);
|
|
125
|
+
}
|
|
39
126
|
}
|
|
40
|
-
|
|
41
|
-
|
|
127
|
+
info(...args) {
|
|
128
|
+
if (this.logLevel === 'debug' || this.logLevel === 'info') {
|
|
129
|
+
console.info(...args);
|
|
130
|
+
}
|
|
42
131
|
}
|
|
43
|
-
|
|
44
|
-
this.
|
|
132
|
+
warn(...args) {
|
|
133
|
+
if (this.logLevel === 'debug' || this.logLevel === 'info' || this.logLevel === 'warn') {
|
|
134
|
+
console.warn(...args);
|
|
135
|
+
}
|
|
45
136
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
137
|
+
error(...args) {
|
|
138
|
+
if (this.logLevel === 'debug' ||
|
|
139
|
+
this.logLevel === 'info' ||
|
|
140
|
+
this.logLevel === 'warn' ||
|
|
141
|
+
this.logLevel === 'error') {
|
|
142
|
+
console.error(...args);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
})();
|
|
52
146
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return idPrefix + inject(NgnGlobal).nextElementId++;
|
|
147
|
+
function notNullish(value) {
|
|
148
|
+
return value !== null && value !== undefined;
|
|
56
149
|
}
|
|
57
150
|
|
|
58
|
-
function
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const current = Date.now();
|
|
72
|
-
runningCounter.update(value => value + 1);
|
|
73
|
-
computeFn()
|
|
74
|
-
.then(value => {
|
|
75
|
-
runningCounter.update(value => value - 1);
|
|
76
|
-
// Only update the signal if this is the latest call
|
|
77
|
-
if (current < latestUpdated) {
|
|
78
|
-
console.debug('asyncComputed: ignoring stale value update');
|
|
79
|
-
return;
|
|
151
|
+
function getScrollTop(elementOffsetTop, elementHeight, containerHeight, currentScrollTop, behavior) {
|
|
152
|
+
switch (behavior) {
|
|
153
|
+
case 'start':
|
|
154
|
+
return elementOffsetTop;
|
|
155
|
+
case 'end':
|
|
156
|
+
return elementOffsetTop - containerHeight + elementHeight;
|
|
157
|
+
case 'center':
|
|
158
|
+
return elementOffsetTop - (containerHeight - elementHeight) / 2;
|
|
159
|
+
case 'nearest': {
|
|
160
|
+
const start = elementOffsetTop;
|
|
161
|
+
const end = elementOffsetTop - containerHeight + elementHeight;
|
|
162
|
+
if (currentScrollTop > end && currentScrollTop < start) {
|
|
163
|
+
return currentScrollTop;
|
|
80
164
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
.catch(error => {
|
|
85
|
-
runningCounter.update(value => value - 1);
|
|
86
|
-
console.error('Error in asyncComputed:', error);
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
const isRunning = computed(() => runningCounter() > 0);
|
|
90
|
-
const returnFn = returnSignal;
|
|
91
|
-
returnFn.isRunning = isRunning;
|
|
92
|
-
return returnFn;
|
|
165
|
+
return Math.abs(start - currentScrollTop) < Math.abs(end - currentScrollTop) ? start : end;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
93
168
|
}
|
|
94
169
|
|
|
95
|
-
|
|
96
|
-
|
|
170
|
+
const timeSpanRegex = /^(?:(.+)d)?(?:(.+)h)?(?:(.+)m)?(?:([^m]+)s)?(?:(.+)ms)?$/;
|
|
171
|
+
/**
|
|
172
|
+
* Checks if the provided value is a valid TimeSpan.
|
|
173
|
+
* @param value The value to check.
|
|
174
|
+
* @returns `true` if the value is a valid TimeSpan, otherwise `false`.
|
|
175
|
+
*/
|
|
176
|
+
function isTimeSpan(value) {
|
|
177
|
+
if (typeof value === 'number')
|
|
178
|
+
return true;
|
|
179
|
+
if (typeof value === 'string') {
|
|
180
|
+
const match = value.match(timeSpanRegex);
|
|
181
|
+
return !!match && !match.slice(1).some(part => part !== undefined && isNaN(Number(part)));
|
|
182
|
+
}
|
|
183
|
+
if (typeof value === 'object' && value !== null) {
|
|
184
|
+
return ('days' in value ||
|
|
185
|
+
'hours' in value ||
|
|
186
|
+
'minutes' in value ||
|
|
187
|
+
'seconds' in value ||
|
|
188
|
+
'milliseconds' in value);
|
|
189
|
+
}
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Converts a TimeSpan to milliseconds.
|
|
194
|
+
* @param timeSpan The TimeSpan to convert.
|
|
195
|
+
* @returns The equivalent time span in milliseconds.
|
|
196
|
+
*/
|
|
197
|
+
function getTimeSpanMilliseconds(timeSpan) {
|
|
198
|
+
if (typeof timeSpan === 'number')
|
|
199
|
+
return timeSpan;
|
|
200
|
+
if (typeof timeSpan === 'string') {
|
|
201
|
+
const parts = parseTimeSpanString(timeSpan);
|
|
202
|
+
return parts ? toMilliseconds(...parts) : 0;
|
|
203
|
+
}
|
|
204
|
+
const { days, hours, minutes, seconds, milliseconds } = timeSpan;
|
|
205
|
+
return toMilliseconds(days, hours, minutes, seconds, milliseconds);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Converts a TimeSpan to a string representation.
|
|
209
|
+
* @param timeSpan The TimeSpan to convert.
|
|
210
|
+
* @returns A string representation of the time span.
|
|
211
|
+
*/
|
|
212
|
+
function getTimeSpanString(timeSpan) {
|
|
213
|
+
if (typeof timeSpan === 'number')
|
|
214
|
+
return `${timeSpan}ms`;
|
|
215
|
+
if (typeof timeSpan === 'string')
|
|
216
|
+
return timeSpan;
|
|
217
|
+
const { days, hours, minutes, seconds, milliseconds } = timeSpan;
|
|
218
|
+
return ((days ? `${days}d` : '') +
|
|
219
|
+
(hours ? `${hours}h` : '') +
|
|
220
|
+
(minutes ? `${minutes}m` : '') +
|
|
221
|
+
(seconds ? `${seconds}s` : '') +
|
|
222
|
+
(milliseconds ? `${milliseconds}ms` : ''));
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Converts a TimeSpan to an object representation.
|
|
226
|
+
* @param timeSpan The TimeSpan to convert.
|
|
227
|
+
* @returns An object representation of the time span with properties for days, hours, minutes, seconds, and milliseconds.
|
|
228
|
+
*/
|
|
229
|
+
function getTimeSpan(timeSpan) {
|
|
230
|
+
if (typeof timeSpan === 'number') {
|
|
231
|
+
return { milliseconds: timeSpan };
|
|
232
|
+
}
|
|
233
|
+
if (typeof timeSpan === 'string') {
|
|
234
|
+
const parts = parseTimeSpanString(timeSpan);
|
|
235
|
+
if (!parts)
|
|
236
|
+
return {};
|
|
237
|
+
const [days, hours, minutes, seconds, milliseconds] = parts;
|
|
238
|
+
return { days, hours, minutes, seconds, milliseconds };
|
|
239
|
+
}
|
|
240
|
+
return timeSpan;
|
|
241
|
+
}
|
|
242
|
+
function parseTimeSpanString(timeSpan) {
|
|
243
|
+
const match = timeSpan.match(timeSpanRegex);
|
|
244
|
+
if (!match)
|
|
245
|
+
return undefined;
|
|
246
|
+
return match.slice(1).map(part => Number(part) || 0);
|
|
247
|
+
}
|
|
248
|
+
function toMilliseconds(days, hours, minutes, seconds, milliseconds) {
|
|
249
|
+
return ((days || 0) * 86400000 + // 24 * 60 * 60 * 1000
|
|
250
|
+
(hours || 0) * 3600000 + // 60 * 60 * 1000
|
|
251
|
+
(minutes || 0) * 60000 + // 60 * 1000
|
|
252
|
+
(seconds || 0) * 1000 +
|
|
253
|
+
(milliseconds || 0));
|
|
97
254
|
}
|
|
98
255
|
|
|
99
256
|
/**
|
|
100
257
|
* Generated bundle index. Do not edit.
|
|
101
258
|
*/
|
|
102
259
|
|
|
103
|
-
export {
|
|
260
|
+
export { Logger, NgnError, areArraysDeepEqual, areObjectsDeepEqual, deepCopy, deepMerge, fuzzyMatch, getPropertyIfExists, getScrollTop, getTimeSpan, getTimeSpanMilliseconds, getTimeSpanString, globalPropertyName, isObject, isTimeSpan, maybeCallback, notNullish, objectEntries, objectKeys, throwExp, toggleClass };
|
|
104
261
|
//# sourceMappingURL=ngneers-controls-utils.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls-utils.mjs","sources":["../../../packages/controls/src/utils/error.ts","../../../packages/controls/src/utils/fuzzy-match.ts","../../../packages/controls/src/utils/globals.ts","../../../packages/controls/src/utils/generate-id.ts","../../../packages/controls/src/utils/signals.ts","../../../packages/controls/src/utils/not-nullish.ts","../../../packages/controls/src/utils/ngneers-controls-utils.ts"],"sourcesContent":["export function throwExp(message: string): never {\r\n throw new Error(message);\r\n}\r\n","export function fuzzyMatch(input: string, search: string) {\r\n // Edge cases\r\n const searchLen = search.length;\r\n if (searchLen === 0) return true;\r\n const inputLen = input.length;\r\n if (searchLen > inputLen) return false;\r\n\r\n // Micro-optimized main loop\r\n let searchPos = 0;\r\n\r\n for (let i = 0; i < inputLen && searchPos < searchLen; i++) {\r\n if (input.charCodeAt(i) === search.charCodeAt(searchPos)) {\r\n searchPos++;\r\n // Early exit when remaining input can't contain remaining search\r\n if (searchLen - searchPos > inputLen - i - 1) return false;\r\n }\r\n // Early exit when remaining lengths match but current chars don't\r\n else if (searchLen - searchPos === inputLen - i) return false;\r\n }\r\n\r\n return searchPos === searchLen;\r\n}\r\n","import { DOCUMENT, inject, Injectable } from '@angular/core';\n\nconst globalPropertyName = '__ngn-controls-global__';\n\ninterface NgnGlobalType {\n nextElementId: number;\n}\n\ndeclare global {\n interface Window {\n [globalPropertyName]: NgnGlobalType;\n }\n}\n\n@Injectable()\nexport class NgnGlobal implements NgnGlobalType {\n private readonly _window = inject(DOCUMENT).defaultView || window;\n constructor() {\n this._window[globalPropertyName] ??= {\n nextElementId: 1,\n };\n }\n\n public get nextElementId(): number {\n return this._window[globalPropertyName].nextElementId;\n }\n public set nextElementId(value: number) {\n this._window[globalPropertyName].nextElementId = value;\n }\n}\n","import { inject } from '@angular/core';\n\nimport { NgnGlobal } from './globals';\n\nconst idPrefix = 'ngn-element-id-';\n\nexport function generateElementId() {\n return idPrefix + inject(NgnGlobal).nextElementId++;\n}\n","import { computed, effect, Signal, signal } from '@angular/core';\r\n\r\nexport function computedWithPrevious<T>(computeFn: (prev?: T) => T, previous?: T): () => T {\r\n let current = previous;\r\n\r\n return computed<T>(() => {\r\n const prev = current;\r\n current = computeFn(prev);\r\n return current;\r\n });\r\n}\r\n\r\nexport function asyncComputed<T>(\r\n computeFn: () => Promise<T>,\r\n initial: T\r\n): { (): T; isRunning: Signal<boolean> } {\r\n let latestUpdated = 0;\r\n let runningCounter = signal(0);\r\n const returnSignal = signal<T>(initial);\r\n effect(() => {\r\n const current = Date.now();\r\n runningCounter.update(value => value + 1);\r\n computeFn()\r\n .then(value => {\r\n runningCounter.update(value => value - 1);\r\n // Only update the signal if this is the latest call\r\n if (current < latestUpdated) {\r\n console.debug('asyncComputed: ignoring stale value update');\r\n return;\r\n }\r\n latestUpdated = current;\r\n returnSignal.set(value);\r\n })\r\n .catch(error => {\r\n runningCounter.update(value => value - 1);\r\n console.error('Error in asyncComputed:', error);\r\n });\r\n });\r\n const isRunning = computed(() => runningCounter() > 0);\r\n const returnFn = returnSignal as unknown as { (): T; isRunning: Signal<boolean> };\r\n returnFn.isRunning = isRunning;\r\n return returnFn;\r\n}\r\n","export function notNullish<T>(value: T | null | undefined): value is T {\r\n return value !== null && value !== undefined;\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ngneers-controls-utils.mjs","sources":["../../src/utils/dom.ts","../../src/utils/object.ts","../../src/utils/equality.ts","../../src/utils/error.ts","../../src/utils/functions.ts","../../src/utils/fuzzy-match.ts","../../src/utils/globals.ts","../../src/utils/logger.ts","../../src/utils/not-nullish.ts","../../src/utils/positioning.ts","../../src/utils/time-span.ts","../../src/utils/ngneers-controls-utils.ts"],"sourcesContent":["export function toggleClass(element: HTMLElement, className: string | string[], state: boolean) {\r\n const classes = Array.isArray(className)\r\n ? className.flatMap(x => x.split(' '))\r\n : className.split(' ');\r\n classes.forEach(cls => element.classList.toggle(cls, state));\r\n}\r\n","import type { AllKeysOfUnion } from './types';\r\n\r\nexport function deepCopy<T>(obj: T): T extends ReadonlyArray<infer U> ? Array<U> : T {\r\n return JSON.parse(JSON.stringify(obj));\r\n}\r\n\r\nexport function objectKeys<T extends object>(obj: T): (keyof T)[] {\r\n return Object.keys(obj) as (keyof T)[];\r\n}\r\n\r\nexport function objectEntries<T extends object>(obj: T): [keyof T, T[keyof T]][] {\r\n return Object.entries(obj) as [keyof T, T[keyof T]][];\r\n}\r\n\r\nexport function isObject(item: unknown): item is Record<string, unknown> {\r\n return item !== null && typeof item === 'object' && !Array.isArray(item);\r\n}\r\n\r\nexport function deepMerge<T extends Record<string, unknown>, U extends Record<string, unknown>>(\r\n target: T,\r\n source: U\r\n): T & U {\r\n const output = { ...target } as T & U;\r\n for (const key of objectKeys(source)) {\r\n const value = source[key];\r\n if (isObject(value) && isObject(output[key])) {\r\n (output[key] as Record<string, unknown>) = deepMerge(\r\n output[key] as Record<string, unknown>,\r\n value\r\n );\r\n } else {\r\n (output[key] as U[keyof U]) = value;\r\n }\r\n }\r\n return output;\r\n}\r\n\r\nexport function getPropertyIfExists<T extends object, K extends AllKeysOfUnion<T>>(\r\n obj: T,\r\n key: K\r\n): T[K] | undefined {\r\n if (key in obj) {\r\n return obj[key];\r\n }\r\n return undefined;\r\n}\r\n","import { objectKeys } from './object';\r\n\r\nexport function areObjectsDeepEqual<T extends object>(a: T, b: T): boolean {\r\n if (Object.keys(a).length !== Object.keys(b).length) {\r\n return false;\r\n }\r\n return objectKeys(a).every(key => {\r\n if (typeof a[key] !== typeof b[key]) {\r\n return false;\r\n }\r\n if (typeof a[key] === 'object') {\r\n return areObjectsDeepEqual(a[key] as object, b[key] as object);\r\n }\r\n return a[key] === b[key];\r\n });\r\n}\r\n\r\nexport function areArraysDeepEqual<T>(a: readonly T[], b: readonly T[]): boolean {\r\n if (a.length !== b.length) {\r\n return false;\r\n }\r\n for (let i = 0; i < a.length; i++) {\r\n if (typeof a[i] === 'object' && typeof b[i] === 'object') {\r\n const res = areObjectsDeepEqual(a[i] as object, b[i] as object);\r\n if (!res) {\r\n return false;\r\n }\r\n } else {\r\n const res = a[i] === b[i];\r\n if (!res) {\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n","export function throwExp(\r\n moduleName: string,\r\n errorMsg: string,\r\n ...additionalContext: unknown[]\r\n): never {\r\n throw new NgnError(moduleName, errorMsg, ...additionalContext);\r\n}\r\n\r\nexport class NgnError extends Error {\r\n public readonly additionalContext?: unknown[];\r\n constructor(area: string, errorMsg: string, ...additionalContext: unknown[]) {\r\n if (typeof window !== 'undefined' && window['__ngn-controls-global__'].fancyLogging) {\r\n console.log(\r\n `%c💥%c[${area}]`,\r\n 'font-size: 24px;',\r\n 'color: #ff0042; font-size: 20px; background-color: #000000;',\r\n ...additionalContext\r\n );\r\n }\r\n\r\n super(`[${area}] ${errorMsg}`);\r\n this.name = 'NgnError';\r\n this.additionalContext = additionalContext;\r\n }\r\n}\r\n","export function maybeCallback<T>(value: T | (() => T)): T {\r\n return typeof value === 'function' ? (value as () => T)() : value;\r\n}\r\n","export function fuzzyMatch(input: string, search: string) {\r\n // Edge cases\r\n const searchLen = search.length;\r\n if (searchLen === 0) return true;\r\n const inputLen = input.length;\r\n if (searchLen > inputLen) return false;\r\n\r\n // Micro-optimized main loop\r\n let searchPos = 0;\r\n\r\n for (let i = 0; i < inputLen && searchPos < searchLen; i++) {\r\n if (input.charCodeAt(i) === search.charCodeAt(searchPos)) {\r\n searchPos++;\r\n // Early exit when remaining input can't contain remaining search\r\n if (searchLen - searchPos > inputLen - i - 1) return false;\r\n }\r\n // Early exit when remaining lengths match but current chars don't\r\n else if (searchLen - searchPos === inputLen - i) return false;\r\n }\r\n\r\n return searchPos === searchLen;\r\n}\r\n","export const globalPropertyName = '__ngn-controls-global__';\r\n\r\nexport interface NgnGlobalType {\r\n nextElementId: number;\r\n fancyLogging: boolean;\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n [globalPropertyName]: NgnGlobalType;\r\n }\r\n}\r\n","export type LogLevel = 'debug' | 'info' | 'warn' | 'error';\r\n\r\nexport const Logger = new (class {\r\n public logLevel: LogLevel = 'info';\r\n\r\n public debug(...args: unknown[]) {\r\n if (this.logLevel === 'debug') {\r\n console.debug(...args);\r\n }\r\n }\r\n\r\n public info(...args: unknown[]) {\r\n if (this.logLevel === 'debug' || this.logLevel === 'info') {\r\n console.info(...args);\r\n }\r\n }\r\n\r\n public warn(...args: unknown[]) {\r\n if (this.logLevel === 'debug' || this.logLevel === 'info' || this.logLevel === 'warn') {\r\n console.warn(...args);\r\n }\r\n }\r\n\r\n public error(...args: unknown[]) {\r\n if (\r\n this.logLevel === 'debug' ||\r\n this.logLevel === 'info' ||\r\n this.logLevel === 'warn' ||\r\n this.logLevel === 'error'\r\n ) {\r\n console.error(...args);\r\n }\r\n }\r\n})();\r\n","export function notNullish<T>(value: T | null | undefined): value is T {\r\n return value !== null && value !== undefined;\r\n}\r\n","export function getScrollTop(\r\n elementOffsetTop: number,\r\n elementHeight: number,\r\n containerHeight: number,\r\n currentScrollTop: number,\r\n behavior: ScrollLogicalPosition\r\n): number {\r\n switch (behavior) {\r\n case 'start':\r\n return elementOffsetTop;\r\n case 'end':\r\n return elementOffsetTop - containerHeight + elementHeight;\r\n case 'center':\r\n return elementOffsetTop - (containerHeight - elementHeight) / 2;\r\n case 'nearest': {\r\n const start = elementOffsetTop;\r\n const end = elementOffsetTop - containerHeight + elementHeight;\r\n if (currentScrollTop > end && currentScrollTop < start) {\r\n return currentScrollTop;\r\n }\r\n return Math.abs(start - currentScrollTop) < Math.abs(end - currentScrollTop) ? start : end;\r\n }\r\n }\r\n}\r\n","const timeSpanRegex = /^(?:(.+)d)?(?:(.+)h)?(?:(.+)m)?(?:([^m]+)s)?(?:(.+)ms)?$/;\r\n\r\n/**\r\n * Represents a time span that can be expressed in various formats:\r\n * - As a number (milliseconds)\r\n * - As a string in the format \"XdXhXmXsXms\" where each part is optional (e.g., \"1d2h30m45s500ms\" or \"2h15m\")\r\n * - As an object with properties for days, hours, minutes, seconds, and milliseconds\r\n * @example\r\n * ```typescript\r\n * // As a number\r\n * const duration1: TimeSpan = 5000;\r\n * // As a string\r\n * const duration2: TimeSpan = \"1d2h30m45s500ms\";\r\n * // As an object\r\n * const duration3: TimeSpan = { days: 1, hours: 2, minutes: 30, seconds: 45, milliseconds: 500 };\r\n * ```\r\n */\r\nexport type TimeSpan =\r\n | number\r\n | `${`${number}d` | ''}${`${number}h` | ''}${`${number}m` | ''}${`${number}s` | ''}${`${number}ms` | ''}`\r\n | {\r\n /**\r\n * Number of days in the time span.\r\n */\r\n days?: number;\r\n /**\r\n * Number of hours in the time span.\r\n */\r\n hours?: number;\r\n /**\r\n * Number of minutes in the time span.\r\n */\r\n minutes?: number;\r\n /**\r\n * Number of seconds in the time span.\r\n */\r\n seconds?: number;\r\n /**\r\n * Number of milliseconds in the time span.\r\n */\r\n milliseconds?: number;\r\n };\r\n\r\n/**\r\n * Checks if the provided value is a valid TimeSpan.\r\n * @param value The value to check.\r\n * @returns `true` if the value is a valid TimeSpan, otherwise `false`.\r\n */\r\nexport function isTimeSpan(value: unknown): value is TimeSpan {\r\n if (typeof value === 'number') return true;\r\n if (typeof value === 'string') {\r\n const match = value.match(timeSpanRegex);\r\n return !!match && !match.slice(1).some(part => part !== undefined && isNaN(Number(part)));\r\n }\r\n if (typeof value === 'object' && value !== null) {\r\n return (\r\n 'days' in value ||\r\n 'hours' in value ||\r\n 'minutes' in value ||\r\n 'seconds' in value ||\r\n 'milliseconds' in value\r\n );\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Converts a TimeSpan to milliseconds.\r\n * @param timeSpan The TimeSpan to convert.\r\n * @returns The equivalent time span in milliseconds.\r\n */\r\nexport function getTimeSpanMilliseconds(timeSpan: TimeSpan): number {\r\n if (typeof timeSpan === 'number') return timeSpan;\r\n\r\n if (typeof timeSpan === 'string') {\r\n const parts = parseTimeSpanString(timeSpan);\r\n return parts ? toMilliseconds(...parts) : 0;\r\n }\r\n\r\n const { days, hours, minutes, seconds, milliseconds } = timeSpan;\r\n return toMilliseconds(days, hours, minutes, seconds, milliseconds);\r\n}\r\n\r\n/**\r\n * Converts a TimeSpan to a string representation.\r\n * @param timeSpan The TimeSpan to convert.\r\n * @returns A string representation of the time span.\r\n */\r\nexport function getTimeSpanString(timeSpan: TimeSpan): string {\r\n if (typeof timeSpan === 'number') return `${timeSpan}ms`;\r\n if (typeof timeSpan === 'string') return timeSpan;\r\n\r\n const { days, hours, minutes, seconds, milliseconds } = timeSpan;\r\n return (\r\n (days ? `${days}d` : '') +\r\n (hours ? `${hours}h` : '') +\r\n (minutes ? `${minutes}m` : '') +\r\n (seconds ? `${seconds}s` : '') +\r\n (milliseconds ? `${milliseconds}ms` : '')\r\n );\r\n}\r\n\r\n/**\r\n * Converts a TimeSpan to an object representation.\r\n * @param timeSpan The TimeSpan to convert.\r\n * @returns An object representation of the time span with properties for days, hours, minutes, seconds, and milliseconds.\r\n */\r\nexport function getTimeSpan(timeSpan: TimeSpan): TimeSpan & object {\r\n if (typeof timeSpan === 'number') {\r\n return { milliseconds: timeSpan };\r\n }\r\n\r\n if (typeof timeSpan === 'string') {\r\n const parts = parseTimeSpanString(timeSpan);\r\n if (!parts) return {};\r\n const [days, hours, minutes, seconds, milliseconds] = parts;\r\n return { days, hours, minutes, seconds, milliseconds };\r\n }\r\n\r\n return timeSpan;\r\n}\r\n\r\nfunction parseTimeSpanString(timeSpan: string): number[] | undefined {\r\n const match = timeSpan.match(timeSpanRegex);\r\n if (!match) return undefined;\r\n return match.slice(1).map(part => Number(part) || 0);\r\n}\r\n\r\nfunction toMilliseconds(\r\n days?: number,\r\n hours?: number,\r\n minutes?: number,\r\n seconds?: number,\r\n milliseconds?: number\r\n): number {\r\n return (\r\n (days || 0) * 86400000 + // 24 * 60 * 60 * 1000\r\n (hours || 0) * 3600000 + // 60 * 60 * 1000\r\n (minutes || 0) * 60000 + // 60 * 1000\r\n (seconds || 0) * 1000 +\r\n (milliseconds || 0)\r\n );\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ngneers-controls.mjs","sources":["
|
|
1
|
+
{"version":3,"file":"ngneers-controls.mjs","sources":["../../src/index.ts","../../src/ngneers-controls.ts"],"sourcesContent":["export default {};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"AAAA,YAAe,EAAE;;ACAjB;;AAEG"}
|