cynx-lib 1.3.83 → 1.3.85
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/gen.js +77 -77
- package/package.json +5 -1
- package/ui/components/Drawer.jsx +208 -208
- package/ui/components/Layout.jsx +37 -0
- package/ui/components/Pagination.jsx +145 -145
- package/ui/components/PrivacyBlur.jsx +603 -603
- package/ui/components/Sidebar.jsx +300 -134
- package/utils/index.cjs +5 -0
- package/utils/index.js +22 -20
- package/utils/utils/duration.js +139 -139
- package/utils/utils/oidc.js +214 -214
- package/utils/utils/realtime.js +1634 -1634
- package/utils/utils/session.cjs +15 -2
- package/utils/utils/session.js +67 -58
- package/utils/utils/session_manager.cjs +490 -0
- package/utils/utils/session_manager.js +549 -0
- package/utils/utils/storage.js +393 -393
- package/utils/utils/ui.js +111 -111
- package/vue/components/Badge.vue +79 -79
- package/vue/components/Button.vue +209 -209
- package/vue/components/Checkbox.vue +103 -103
- package/vue/components/CircularProgress.vue +383 -383
- package/vue/components/Divider.vue +94 -94
- package/vue/components/Drawer.vue +243 -243
- package/vue/components/InfoBadge.vue +223 -223
- package/vue/components/Input.vue +341 -341
- package/vue/components/LinearProgress.vue +268 -268
- package/vue/components/Modal.vue +226 -226
- package/vue/components/Pagination.vue +199 -199
- package/vue/components/Select.vue +713 -713
- package/vue/components/Sidebar.vue +955 -955
- package/vue/components/Skeleton.vue +91 -91
- package/vue/components/Spinner.vue +263 -263
- package/vue/components/StatusTag.vue +89 -89
- package/vue/components/TabBar.vue +176 -176
- package/vue/components/Table.vue +388 -388
- package/vue/components/TimePicker.vue +399 -399
- package/vue/components/Toggle.vue +115 -115
- package/vue/components/XTable.vue +119 -119
- package/vue/composables/useAutoSkeletonRows.ts +71 -71
- package/vue/index.d.ts +67 -67
- package/vue/index.js +86 -86
package/utils/utils/duration.js
CHANGED
|
@@ -1,139 +1,139 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* cynx/utils — Duration Parser and Formatter (duration.js)
|
|
3
|
-
*
|
|
4
|
-
* Universal utility for parsing human-readable duration strings (e.g. '15m', '2h', '3d', '1w', '1mo')
|
|
5
|
-
* into seconds or milliseconds, and formatting durations into short tags or localized labels.
|
|
6
|
-
*
|
|
7
|
-
* Works across Browser and Node.js environments.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Parse a human-readable duration string or number into seconds.
|
|
12
|
-
* Supported units:
|
|
13
|
-
* - s : seconds (e.g. '30s', '45s')
|
|
14
|
-
* - m : minutes (e.g. '1m', '5m', '15m', '30m')
|
|
15
|
-
* - h : hours (e.g. '1h', '5h', '12h', '24h')
|
|
16
|
-
* - d : days (e.g. '1d', '3d', '7d')
|
|
17
|
-
* - w : weeks (e.g. '1w', '2w')
|
|
18
|
-
* - mo : months (e.g. '1mo', '3mo', treated as 30 days)
|
|
19
|
-
*
|
|
20
|
-
* @param {string|number} input
|
|
21
|
-
* @param {number} [minSeconds=60] Minimum allowed seconds
|
|
22
|
-
* @returns {number} Seconds
|
|
23
|
-
*/
|
|
24
|
-
export function parseDurationToSeconds(input, minSeconds = 60) {
|
|
25
|
-
if (input === null || input === undefined || input === '') {
|
|
26
|
-
return minSeconds;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if (typeof input === 'number') {
|
|
30
|
-
if (isNaN(input) || input <= 0) return minSeconds;
|
|
31
|
-
return Math.max(minSeconds, Math.round(input));
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const str = String(input).trim().toLowerCase();
|
|
35
|
-
|
|
36
|
-
// If plain digits string: '300'
|
|
37
|
-
if (/^\d+$/.test(str)) {
|
|
38
|
-
const num = parseInt(str, 10);
|
|
39
|
-
return Math.max(minSeconds, num);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// Match number + unit: '15m', '2h', '1mo', '3d', '1w', '45s'
|
|
43
|
-
const match = str.match(/^(\d+(?:\.\d+)?)\s*(mo|w|d|h|m|s)?$/);
|
|
44
|
-
if (!match) {
|
|
45
|
-
return minSeconds;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const val = parseFloat(match[1]);
|
|
49
|
-
const unit = match[2] || 's';
|
|
50
|
-
|
|
51
|
-
let totalSec = 0;
|
|
52
|
-
switch (unit) {
|
|
53
|
-
case 'mo':
|
|
54
|
-
totalSec = val * 30 * 86400; // 30 days
|
|
55
|
-
break;
|
|
56
|
-
case 'w':
|
|
57
|
-
totalSec = val * 7 * 86400; // 7 days
|
|
58
|
-
break;
|
|
59
|
-
case 'd':
|
|
60
|
-
totalSec = val * 86400;
|
|
61
|
-
break;
|
|
62
|
-
case 'h':
|
|
63
|
-
totalSec = val * 3600;
|
|
64
|
-
break;
|
|
65
|
-
case 'm':
|
|
66
|
-
totalSec = val * 60;
|
|
67
|
-
break;
|
|
68
|
-
case 's':
|
|
69
|
-
default:
|
|
70
|
-
totalSec = val;
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const rounded = Math.round(totalSec);
|
|
75
|
-
return Math.max(minSeconds, rounded);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Parse a human-readable duration string into milliseconds.
|
|
80
|
-
*
|
|
81
|
-
* @param {string|number} val
|
|
82
|
-
* @param {number} [defaultMs=2592000000] Default ms (30 days)
|
|
83
|
-
* @returns {number} Milliseconds
|
|
84
|
-
*/
|
|
85
|
-
export function parseDurationMs(val, defaultMs = 30 * 24 * 60 * 60 * 1000) {
|
|
86
|
-
if (!val || val === 'off' || val === '0' || val === 0) return 0;
|
|
87
|
-
if (typeof val === 'number') return val > 0 ? val : defaultMs;
|
|
88
|
-
const str = String(val).trim().toLowerCase();
|
|
89
|
-
const match = str.match(/^(\d+(?:\.\d+)?)\s*([a-z]+)?$/);
|
|
90
|
-
if (!match) return defaultMs;
|
|
91
|
-
const num = parseFloat(match[1]);
|
|
92
|
-
const unit = match[2] || 'd';
|
|
93
|
-
if (unit.startsWith('s')) return Math.round(num * 1000);
|
|
94
|
-
if (unit.startsWith('m')) return Math.round(num * 60 * 1000);
|
|
95
|
-
if (unit.startsWith('h')) return Math.round(num * 60 * 60 * 1000);
|
|
96
|
-
if (unit.startsWith('d')) return Math.round(num * 24 * 60 * 60 * 1000);
|
|
97
|
-
if (unit.startsWith('w')) return Math.round(num * 7 * 24 * 60 * 60 * 1000);
|
|
98
|
-
return defaultMs;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Format seconds into a short clean tag (e.g. '1m', '5m', '1h', '24h', '1w', '1mo').
|
|
103
|
-
* @param {number} seconds
|
|
104
|
-
* @returns {string} Short duration string
|
|
105
|
-
*/
|
|
106
|
-
export function formatDurationTag(seconds) {
|
|
107
|
-
const s = Number(seconds) || 60;
|
|
108
|
-
if (s >= 2592000 && s % 2592000 === 0) return `${s / 2592000}mo`;
|
|
109
|
-
if (s >= 604800 && s % 604800 === 0) return `${s / 604800}w`;
|
|
110
|
-
if (s >= 86400 && s % 86400 === 0) return `${s / 86400}d`;
|
|
111
|
-
if (s >= 3600 && s % 3600 === 0) return `${s / 3600}h`;
|
|
112
|
-
if (s >= 60 && s % 60 === 0) return `${s / 60}m`;
|
|
113
|
-
return `${s}s`;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Format seconds into human readable label.
|
|
118
|
-
* @param {number} seconds
|
|
119
|
-
* @returns {string} Human readable label
|
|
120
|
-
*/
|
|
121
|
-
export function formatDurationLabel(seconds) {
|
|
122
|
-
const s = Number(seconds) || 60;
|
|
123
|
-
if (s === 60) return '1 мин';
|
|
124
|
-
if (s === 300) return '5 мин';
|
|
125
|
-
if (s === 600) return '10 мин';
|
|
126
|
-
if (s === 1800) return '30 мин';
|
|
127
|
-
if (s === 3600) return '1 час';
|
|
128
|
-
if (s === 18000) return '5 часов';
|
|
129
|
-
if (s === 43200) return '12 часов';
|
|
130
|
-
if (s === 86400) return '24 часа';
|
|
131
|
-
return formatDurationTag(s);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
export default {
|
|
135
|
-
parseDurationToSeconds,
|
|
136
|
-
parseDurationMs,
|
|
137
|
-
formatDurationTag,
|
|
138
|
-
formatDurationLabel,
|
|
139
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* cynx/utils — Duration Parser and Formatter (duration.js)
|
|
3
|
+
*
|
|
4
|
+
* Universal utility for parsing human-readable duration strings (e.g. '15m', '2h', '3d', '1w', '1mo')
|
|
5
|
+
* into seconds or milliseconds, and formatting durations into short tags or localized labels.
|
|
6
|
+
*
|
|
7
|
+
* Works across Browser and Node.js environments.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Parse a human-readable duration string or number into seconds.
|
|
12
|
+
* Supported units:
|
|
13
|
+
* - s : seconds (e.g. '30s', '45s')
|
|
14
|
+
* - m : minutes (e.g. '1m', '5m', '15m', '30m')
|
|
15
|
+
* - h : hours (e.g. '1h', '5h', '12h', '24h')
|
|
16
|
+
* - d : days (e.g. '1d', '3d', '7d')
|
|
17
|
+
* - w : weeks (e.g. '1w', '2w')
|
|
18
|
+
* - mo : months (e.g. '1mo', '3mo', treated as 30 days)
|
|
19
|
+
*
|
|
20
|
+
* @param {string|number} input
|
|
21
|
+
* @param {number} [minSeconds=60] Minimum allowed seconds
|
|
22
|
+
* @returns {number} Seconds
|
|
23
|
+
*/
|
|
24
|
+
export function parseDurationToSeconds(input, minSeconds = 60) {
|
|
25
|
+
if (input === null || input === undefined || input === '') {
|
|
26
|
+
return minSeconds;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (typeof input === 'number') {
|
|
30
|
+
if (isNaN(input) || input <= 0) return minSeconds;
|
|
31
|
+
return Math.max(minSeconds, Math.round(input));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const str = String(input).trim().toLowerCase();
|
|
35
|
+
|
|
36
|
+
// If plain digits string: '300'
|
|
37
|
+
if (/^\d+$/.test(str)) {
|
|
38
|
+
const num = parseInt(str, 10);
|
|
39
|
+
return Math.max(minSeconds, num);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Match number + unit: '15m', '2h', '1mo', '3d', '1w', '45s'
|
|
43
|
+
const match = str.match(/^(\d+(?:\.\d+)?)\s*(mo|w|d|h|m|s)?$/);
|
|
44
|
+
if (!match) {
|
|
45
|
+
return minSeconds;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const val = parseFloat(match[1]);
|
|
49
|
+
const unit = match[2] || 's';
|
|
50
|
+
|
|
51
|
+
let totalSec = 0;
|
|
52
|
+
switch (unit) {
|
|
53
|
+
case 'mo':
|
|
54
|
+
totalSec = val * 30 * 86400; // 30 days
|
|
55
|
+
break;
|
|
56
|
+
case 'w':
|
|
57
|
+
totalSec = val * 7 * 86400; // 7 days
|
|
58
|
+
break;
|
|
59
|
+
case 'd':
|
|
60
|
+
totalSec = val * 86400;
|
|
61
|
+
break;
|
|
62
|
+
case 'h':
|
|
63
|
+
totalSec = val * 3600;
|
|
64
|
+
break;
|
|
65
|
+
case 'm':
|
|
66
|
+
totalSec = val * 60;
|
|
67
|
+
break;
|
|
68
|
+
case 's':
|
|
69
|
+
default:
|
|
70
|
+
totalSec = val;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const rounded = Math.round(totalSec);
|
|
75
|
+
return Math.max(minSeconds, rounded);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Parse a human-readable duration string into milliseconds.
|
|
80
|
+
*
|
|
81
|
+
* @param {string|number} val
|
|
82
|
+
* @param {number} [defaultMs=2592000000] Default ms (30 days)
|
|
83
|
+
* @returns {number} Milliseconds
|
|
84
|
+
*/
|
|
85
|
+
export function parseDurationMs(val, defaultMs = 30 * 24 * 60 * 60 * 1000) {
|
|
86
|
+
if (!val || val === 'off' || val === '0' || val === 0) return 0;
|
|
87
|
+
if (typeof val === 'number') return val > 0 ? val : defaultMs;
|
|
88
|
+
const str = String(val).trim().toLowerCase();
|
|
89
|
+
const match = str.match(/^(\d+(?:\.\d+)?)\s*([a-z]+)?$/);
|
|
90
|
+
if (!match) return defaultMs;
|
|
91
|
+
const num = parseFloat(match[1]);
|
|
92
|
+
const unit = match[2] || 'd';
|
|
93
|
+
if (unit.startsWith('s')) return Math.round(num * 1000);
|
|
94
|
+
if (unit.startsWith('m')) return Math.round(num * 60 * 1000);
|
|
95
|
+
if (unit.startsWith('h')) return Math.round(num * 60 * 60 * 1000);
|
|
96
|
+
if (unit.startsWith('d')) return Math.round(num * 24 * 60 * 60 * 1000);
|
|
97
|
+
if (unit.startsWith('w')) return Math.round(num * 7 * 24 * 60 * 60 * 1000);
|
|
98
|
+
return defaultMs;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Format seconds into a short clean tag (e.g. '1m', '5m', '1h', '24h', '1w', '1mo').
|
|
103
|
+
* @param {number} seconds
|
|
104
|
+
* @returns {string} Short duration string
|
|
105
|
+
*/
|
|
106
|
+
export function formatDurationTag(seconds) {
|
|
107
|
+
const s = Number(seconds) || 60;
|
|
108
|
+
if (s >= 2592000 && s % 2592000 === 0) return `${s / 2592000}mo`;
|
|
109
|
+
if (s >= 604800 && s % 604800 === 0) return `${s / 604800}w`;
|
|
110
|
+
if (s >= 86400 && s % 86400 === 0) return `${s / 86400}d`;
|
|
111
|
+
if (s >= 3600 && s % 3600 === 0) return `${s / 3600}h`;
|
|
112
|
+
if (s >= 60 && s % 60 === 0) return `${s / 60}m`;
|
|
113
|
+
return `${s}s`;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Format seconds into human readable label.
|
|
118
|
+
* @param {number} seconds
|
|
119
|
+
* @returns {string} Human readable label
|
|
120
|
+
*/
|
|
121
|
+
export function formatDurationLabel(seconds) {
|
|
122
|
+
const s = Number(seconds) || 60;
|
|
123
|
+
if (s === 60) return '1 мин';
|
|
124
|
+
if (s === 300) return '5 мин';
|
|
125
|
+
if (s === 600) return '10 мин';
|
|
126
|
+
if (s === 1800) return '30 мин';
|
|
127
|
+
if (s === 3600) return '1 час';
|
|
128
|
+
if (s === 18000) return '5 часов';
|
|
129
|
+
if (s === 43200) return '12 часов';
|
|
130
|
+
if (s === 86400) return '24 часа';
|
|
131
|
+
return formatDurationTag(s);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export default {
|
|
135
|
+
parseDurationToSeconds,
|
|
136
|
+
parseDurationMs,
|
|
137
|
+
formatDurationTag,
|
|
138
|
+
formatDurationLabel,
|
|
139
|
+
};
|