@ekzo-dev/bootstrap-addons 5.2.29 → 5.3.0
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/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ekzo-dev/bootstrap-addons",
|
|
3
3
|
"description": "Aurelia Bootstrap additional component",
|
|
4
|
-
"version": "5.
|
|
4
|
+
"version": "5.3.0",
|
|
5
5
|
"homepage": "https://github.com/ekzo-dev/aurelia-components/tree/main/packages/bootstrap-addons",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -9,20 +9,20 @@
|
|
|
9
9
|
},
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@ekzo-dev/bootstrap": "^5.
|
|
12
|
+
"@ekzo-dev/bootstrap": "^5.3.0",
|
|
13
13
|
"@ekzo-dev/vanilla-jsoneditor": "^0.23.7",
|
|
14
14
|
"@ekzo-dev/toolkit": "^1.2.4",
|
|
15
15
|
"@fortawesome/free-solid-svg-icons": "^6.5.2",
|
|
16
16
|
"@types/json-schema": "^7.0.14",
|
|
17
|
-
"@
|
|
17
|
+
"@js-temporal/polyfill": "^0.5.1",
|
|
18
18
|
"ajv": "^8.17.1",
|
|
19
19
|
"ajv-formats": "^3.0.1",
|
|
20
20
|
"vanilla-jsoneditor": "~0.23.0",
|
|
21
21
|
"immutable-json-patch": "^5.1.3"
|
|
22
22
|
},
|
|
23
23
|
"peerDependencies": {
|
|
24
|
-
"aurelia": "^2.0.0-beta.
|
|
25
|
-
"bootstrap": "
|
|
24
|
+
"aurelia": "^2.0.0-beta.25",
|
|
25
|
+
"bootstrap": "~5.3.7",
|
|
26
26
|
"@popperjs/core": "^2.11.8"
|
|
27
27
|
},
|
|
28
28
|
"main": "src/index.ts",
|
|
@@ -9,7 +9,7 @@ const meta: Meta = {
|
|
|
9
9
|
title: 'Ekzo / Bootstrap Addons / Forms / Duration input',
|
|
10
10
|
component: BsDurationInput,
|
|
11
11
|
args: {
|
|
12
|
-
value: '
|
|
12
|
+
value: 'P5DT1Hasds',
|
|
13
13
|
label: 'Duration',
|
|
14
14
|
},
|
|
15
15
|
argTypes: {
|
|
@@ -27,7 +27,7 @@ const Validation: Story = (args): StoryFnAureliaReturnType => ({
|
|
|
27
27
|
props: args,
|
|
28
28
|
template: `<form class='was-validated'>${createComponentTemplate(
|
|
29
29
|
BsDurationInput
|
|
30
|
-
)}<br
|
|
30
|
+
)}<br>\${value} <button bs-button>Validate</button></form>`,
|
|
31
31
|
components: [BsButton],
|
|
32
32
|
});
|
|
33
33
|
|
|
@@ -2,20 +2,15 @@ import template from './duration-input.html';
|
|
|
2
2
|
|
|
3
3
|
import './duration-input.scss';
|
|
4
4
|
|
|
5
|
-
import '@formatjs/intl-durationformat/polyfill';
|
|
6
|
-
|
|
7
5
|
import { BaseField, Size } from '@ekzo-dev/bootstrap';
|
|
8
6
|
import { coerceBoolean } from '@ekzo-dev/toolkit';
|
|
7
|
+
import { Temporal } from '@js-temporal/polyfill';
|
|
9
8
|
import { bindable, BindingMode, customElement, resolve } from 'aurelia';
|
|
10
9
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
hours?: string;
|
|
16
|
-
minutes?: string;
|
|
17
|
-
seconds?: string;
|
|
18
|
-
}
|
|
10
|
+
type Duration = Partial<Pick<Temporal.Duration, 'years' | 'months' | 'days' | 'hours' | 'minutes' | 'seconds'>>;
|
|
11
|
+
type DurationLabels = {
|
|
12
|
+
[K in keyof Duration]: string;
|
|
13
|
+
};
|
|
19
14
|
|
|
20
15
|
/**
|
|
21
16
|
* https://github.com/whatwg/html/issues/5488
|
|
@@ -30,13 +25,18 @@ export class BsDurationInput extends BaseField implements EventListenerObject {
|
|
|
30
25
|
get value(): string {
|
|
31
26
|
const { years, months, days, hours, minutes, seconds } = this.duration;
|
|
32
27
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
28
|
+
return Temporal.Duration.from({
|
|
29
|
+
// at least one field must be present for correct formatting
|
|
30
|
+
years: years ?? 0,
|
|
31
|
+
months,
|
|
32
|
+
days,
|
|
33
|
+
hours,
|
|
34
|
+
minutes,
|
|
35
|
+
seconds,
|
|
36
|
+
}).toString();
|
|
37
37
|
}
|
|
38
38
|
set value(value: string | null | undefined) {
|
|
39
|
-
this.
|
|
39
|
+
this._parseDuration(value);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
@bindable()
|
|
@@ -47,9 +47,9 @@ export class BsDurationInput extends BaseField implements EventListenerObject {
|
|
|
47
47
|
|
|
48
48
|
readonly host = resolve(HTMLElement);
|
|
49
49
|
|
|
50
|
-
duration
|
|
50
|
+
duration!: Duration;
|
|
51
51
|
|
|
52
|
-
labels:
|
|
52
|
+
labels: DurationLabels = this.#getLabels();
|
|
53
53
|
|
|
54
54
|
controls!: NodeListOf<HTMLInputElement>;
|
|
55
55
|
|
|
@@ -89,7 +89,7 @@ export class BsDurationInput extends BaseField implements EventListenerObject {
|
|
|
89
89
|
|
|
90
90
|
// allow pasting full duration value, e.g. P2YT2H
|
|
91
91
|
if (event instanceof ClipboardEvent && data.startsWith('P')) {
|
|
92
|
-
this.
|
|
92
|
+
this._parseDuration(data);
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
95
|
|
|
@@ -97,24 +97,29 @@ export class BsDurationInput extends BaseField implements EventListenerObject {
|
|
|
97
97
|
this.controls.item(0).focus();
|
|
98
98
|
}
|
|
99
99
|
|
|
100
|
-
private
|
|
101
|
-
|
|
100
|
+
private _parseDuration(value: string) {
|
|
101
|
+
try {
|
|
102
|
+
const duration = Temporal.Duration.from(value);
|
|
102
103
|
|
|
103
|
-
if (match) {
|
|
104
104
|
this.duration = {
|
|
105
|
-
years:
|
|
106
|
-
months:
|
|
107
|
-
days:
|
|
108
|
-
hours:
|
|
109
|
-
minutes:
|
|
110
|
-
seconds:
|
|
105
|
+
years: duration.years,
|
|
106
|
+
months: duration.months,
|
|
107
|
+
days: duration.days,
|
|
108
|
+
hours: duration.hours,
|
|
109
|
+
minutes: duration.minutes,
|
|
110
|
+
seconds: duration.seconds,
|
|
111
111
|
};
|
|
112
|
-
}
|
|
113
|
-
|
|
112
|
+
} catch (error) {
|
|
113
|
+
if (error instanceof RangeError) {
|
|
114
|
+
console.warn(`[bs-duration-input] ${error.message}`);
|
|
115
|
+
this.duration = {};
|
|
116
|
+
} else {
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
114
119
|
}
|
|
115
120
|
}
|
|
116
121
|
|
|
117
|
-
#getLabels():
|
|
122
|
+
#getLabels(): DurationLabels {
|
|
118
123
|
const str: string = new Intl['DurationFormat'](navigator.language, { style: 'narrow' }).format({
|
|
119
124
|
years: 1,
|
|
120
125
|
months: 1,
|