@nuralyui/timepicker 0.1.1
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/controllers/formatting.controller.d.ts +93 -0
- package/controllers/formatting.controller.d.ts.map +1 -0
- package/controllers/formatting.controller.js +195 -0
- package/controllers/formatting.controller.js.map +1 -0
- package/controllers/index.d.ts +9 -0
- package/controllers/index.d.ts.map +1 -0
- package/controllers/index.js +9 -0
- package/controllers/index.js.map +1 -0
- package/controllers/selection.controller.d.ts +72 -0
- package/controllers/selection.controller.d.ts.map +1 -0
- package/controllers/selection.controller.js +175 -0
- package/controllers/selection.controller.js.map +1 -0
- package/controllers/validation.controller.d.ts +88 -0
- package/controllers/validation.controller.d.ts.map +1 -0
- package/controllers/validation.controller.js +200 -0
- package/controllers/validation.controller.js.map +1 -0
- package/index.d.ts +12 -0
- package/index.js +12 -0
- package/interfaces/timepicker.interface.d.ts +103 -0
- package/interfaces/timepicker.interface.d.ts.map +1 -0
- package/interfaces/timepicker.interface.js +7 -0
- package/interfaces/timepicker.interface.js.map +1 -0
- package/package.json +63 -0
- package/test/timepicker.test.d.ts +7 -0
- package/test/timepicker.test.d.ts.map +1 -0
- package/test/timepicker.test.js +218 -0
- package/test/timepicker.test.js.map +1 -0
- package/timepicker.component.backup.d.ts +165 -0
- package/timepicker.component.backup.js +890 -0
- package/timepicker.component.clean.d.ts +95 -0
- package/timepicker.component.clean.js +471 -0
- package/timepicker.component.d.ts +117 -0
- package/timepicker.component.js +747 -0
- package/timepicker.constants.d.ts +85 -0
- package/timepicker.constants.js +85 -0
- package/timepicker.style.d.ts +7 -0
- package/timepicker.style.js +646 -0
- package/timepicker.types.d.ts +161 -0
- package/timepicker.types.js +125 -0
- package/utils/time.utils.d.ts +87 -0
- package/utils/time.utils.d.ts.map +1 -0
- package/utils/time.utils.js +235 -0
- package/utils/time.utils.js.map +1 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2023 Nuraly, Laabidi Aymen
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { TimeValue, TimeFormat, TimePeriod } from '../timepicker.types.js';
|
|
7
|
+
import { TimePickerHost, TimeFormattingController } from '../interfaces/timepicker.interface.js';
|
|
8
|
+
/**
|
|
9
|
+
* Controller for handling time formatting logic
|
|
10
|
+
*/
|
|
11
|
+
export declare class TimePickerFormattingController implements TimeFormattingController {
|
|
12
|
+
private host;
|
|
13
|
+
constructor(host: TimePickerHost);
|
|
14
|
+
/**
|
|
15
|
+
* Format time for display (user-facing format)
|
|
16
|
+
*/
|
|
17
|
+
formatForDisplay(time: TimeValue): string;
|
|
18
|
+
/**
|
|
19
|
+
* Format time for input field value
|
|
20
|
+
*/
|
|
21
|
+
formatForInput(time: TimeValue): string;
|
|
22
|
+
/**
|
|
23
|
+
* Parse input value to TimeValue
|
|
24
|
+
*/
|
|
25
|
+
parseInputValue(value: string): TimeValue | null;
|
|
26
|
+
/**
|
|
27
|
+
* Get time format pattern for the current configuration
|
|
28
|
+
*/
|
|
29
|
+
getFormatPattern(): string;
|
|
30
|
+
/**
|
|
31
|
+
* Get placeholder text for input field
|
|
32
|
+
*/
|
|
33
|
+
getPlaceholder(): string;
|
|
34
|
+
/**
|
|
35
|
+
* Format time component with leading zeros
|
|
36
|
+
*/
|
|
37
|
+
formatTimeComponent(value: number, length?: number): string;
|
|
38
|
+
/**
|
|
39
|
+
* Format hours based on current format
|
|
40
|
+
*/
|
|
41
|
+
formatHours(hours: number): string;
|
|
42
|
+
/**
|
|
43
|
+
* Format minutes with leading zero
|
|
44
|
+
*/
|
|
45
|
+
formatMinutes(minutes: number): string;
|
|
46
|
+
/**
|
|
47
|
+
* Format seconds with leading zero
|
|
48
|
+
*/
|
|
49
|
+
formatSeconds(seconds: number): string;
|
|
50
|
+
/**
|
|
51
|
+
* Get period (AM/PM) for 12-hour format
|
|
52
|
+
*/
|
|
53
|
+
getPeriod(hours: number): TimePeriod;
|
|
54
|
+
/**
|
|
55
|
+
* Format time parts separately
|
|
56
|
+
*/
|
|
57
|
+
formatTimeParts(time: TimeValue): {
|
|
58
|
+
hours: string;
|
|
59
|
+
minutes: string;
|
|
60
|
+
seconds: string;
|
|
61
|
+
period?: TimePeriod;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Parse time parts from string
|
|
65
|
+
*/
|
|
66
|
+
parseTimeParts(timeString: string): {
|
|
67
|
+
hours?: number;
|
|
68
|
+
minutes?: number;
|
|
69
|
+
seconds?: number;
|
|
70
|
+
period?: TimePeriod;
|
|
71
|
+
} | null;
|
|
72
|
+
/**
|
|
73
|
+
* Get time separator character
|
|
74
|
+
*/
|
|
75
|
+
getTimeSeparator(): string;
|
|
76
|
+
/**
|
|
77
|
+
* Check if format is valid
|
|
78
|
+
*/
|
|
79
|
+
isValidFormat(_format: string): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Get format examples
|
|
82
|
+
*/
|
|
83
|
+
getFormatExamples(): string[];
|
|
84
|
+
/**
|
|
85
|
+
* Convert between formats
|
|
86
|
+
*/
|
|
87
|
+
convertFormat(timeString: string, fromFormat: TimeFormat, toFormat: TimeFormat): string | null;
|
|
88
|
+
/**
|
|
89
|
+
* Get human-readable time description
|
|
90
|
+
*/
|
|
91
|
+
getTimeDescription(time: TimeValue): string;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=formatting.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.controller.d.ts","sourceRoot":"","sources":["../../../../src/components/timepicker/controllers/formatting.controller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AASjG;;GAEG;AACH,qBAAa,8BAA+B,YAAW,wBAAwB;IACjE,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,cAAc;IAExC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAKzC;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;IAKvC;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAKhD;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAU1B;;OAEG;IACH,cAAc,IAAI,MAAM;IAUxB;;OAEG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM;IAI9D;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAgBlC;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAItC;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAItC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU;IAIpC;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG;QAChC,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,UAAU,CAAC;KACrB;IAWD;;OAEG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG;QAClC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,UAAU,CAAC;KACrB,GAAG,IAAI;IAgBR;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAWvC;;OAEG;IACH,iBAAiB,IAAI,MAAM,EAAE;IAW7B;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAU9F;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM;CAgB5C"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2023 Nuraly, Laabidi Aymen
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { TimeFormat, TimePeriod } from '../timepicker.types.js';
|
|
7
|
+
import { TimeUtils } from '../utils/time.utils.js';
|
|
8
|
+
import { DEFAULT_TIME_FORMAT, DEFAULT_TIME_FORMAT_WITH_SECONDS, DEFAULT_12H_TIME_FORMAT, DEFAULT_12H_TIME_FORMAT_WITH_SECONDS } from '../timepicker.constants.js';
|
|
9
|
+
/**
|
|
10
|
+
* Controller for handling time formatting logic
|
|
11
|
+
*/
|
|
12
|
+
export class TimePickerFormattingController {
|
|
13
|
+
constructor(host) {
|
|
14
|
+
this.host = host;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Format time for display (user-facing format)
|
|
18
|
+
*/
|
|
19
|
+
formatForDisplay(time) {
|
|
20
|
+
const config = this.host.getConfig();
|
|
21
|
+
return TimeUtils.formatTimeValue(time, config.format, config.showSeconds);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Format time for input field value
|
|
25
|
+
*/
|
|
26
|
+
formatForInput(time) {
|
|
27
|
+
// Input format is typically the same as display format
|
|
28
|
+
return this.formatForDisplay(time);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Parse input value to TimeValue
|
|
32
|
+
*/
|
|
33
|
+
parseInputValue(value) {
|
|
34
|
+
const config = this.host.getConfig();
|
|
35
|
+
return TimeUtils.parseTimeString(value, config.format);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get time format pattern for the current configuration
|
|
39
|
+
*/
|
|
40
|
+
getFormatPattern() {
|
|
41
|
+
const config = this.host.getConfig();
|
|
42
|
+
if (config.format === TimeFormat.TwelveHour) {
|
|
43
|
+
return config.showSeconds ? DEFAULT_12H_TIME_FORMAT_WITH_SECONDS : DEFAULT_12H_TIME_FORMAT;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return config.showSeconds ? DEFAULT_TIME_FORMAT_WITH_SECONDS : DEFAULT_TIME_FORMAT;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get placeholder text for input field
|
|
51
|
+
*/
|
|
52
|
+
getPlaceholder() {
|
|
53
|
+
const config = this.host.getConfig();
|
|
54
|
+
if (config.format === TimeFormat.TwelveHour) {
|
|
55
|
+
return config.showSeconds ? 'hh:mm:ss AM/PM' : 'hh:mm AM/PM';
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
return config.showSeconds ? 'HH:mm:ss' : 'HH:mm';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Format time component with leading zeros
|
|
63
|
+
*/
|
|
64
|
+
formatTimeComponent(value, length = 2) {
|
|
65
|
+
return value.toString().padStart(length, '0');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Format hours based on current format
|
|
69
|
+
*/
|
|
70
|
+
formatHours(hours) {
|
|
71
|
+
const config = this.host.getConfig();
|
|
72
|
+
if (config.format === TimeFormat.TwelveHour) {
|
|
73
|
+
let displayHours = hours;
|
|
74
|
+
if (displayHours === 0) {
|
|
75
|
+
displayHours = 12;
|
|
76
|
+
}
|
|
77
|
+
else if (displayHours > 12) {
|
|
78
|
+
displayHours -= 12;
|
|
79
|
+
}
|
|
80
|
+
return displayHours.toString();
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
return this.formatTimeComponent(hours);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Format minutes with leading zero
|
|
88
|
+
*/
|
|
89
|
+
formatMinutes(minutes) {
|
|
90
|
+
return this.formatTimeComponent(minutes);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Format seconds with leading zero
|
|
94
|
+
*/
|
|
95
|
+
formatSeconds(seconds) {
|
|
96
|
+
return this.formatTimeComponent(seconds);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get period (AM/PM) for 12-hour format
|
|
100
|
+
*/
|
|
101
|
+
getPeriod(hours) {
|
|
102
|
+
return hours >= 12 ? TimePeriod.PM : TimePeriod.AM;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Format time parts separately
|
|
106
|
+
*/
|
|
107
|
+
formatTimeParts(time) {
|
|
108
|
+
const config = this.host.getConfig();
|
|
109
|
+
return {
|
|
110
|
+
hours: this.formatHours(time.hours),
|
|
111
|
+
minutes: this.formatMinutes(time.minutes),
|
|
112
|
+
seconds: this.formatSeconds(time.seconds),
|
|
113
|
+
period: config.format === TimeFormat.TwelveHour ? this.getPeriod(time.hours) : undefined,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Parse time parts from string
|
|
118
|
+
*/
|
|
119
|
+
parseTimeParts(timeString) {
|
|
120
|
+
const config = this.host.getConfig();
|
|
121
|
+
const parsedTime = TimeUtils.parseTimeString(timeString, config.format);
|
|
122
|
+
if (!parsedTime) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
hours: parsedTime.hours,
|
|
127
|
+
minutes: parsedTime.minutes,
|
|
128
|
+
seconds: parsedTime.seconds,
|
|
129
|
+
period: config.format === TimeFormat.TwelveHour ? this.getPeriod(parsedTime.hours) : undefined,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get time separator character
|
|
134
|
+
*/
|
|
135
|
+
getTimeSeparator() {
|
|
136
|
+
return ':';
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Check if format is valid
|
|
140
|
+
*/
|
|
141
|
+
isValidFormat(_format) {
|
|
142
|
+
const testTime = TimeUtils.createTimeValue(12, 30, 45);
|
|
143
|
+
try {
|
|
144
|
+
const formatted = this.formatForDisplay(testTime);
|
|
145
|
+
const parsed = this.parseInputValue(formatted);
|
|
146
|
+
return parsed !== null;
|
|
147
|
+
}
|
|
148
|
+
catch (_a) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get format examples
|
|
154
|
+
*/
|
|
155
|
+
getFormatExamples() {
|
|
156
|
+
const config = this.host.getConfig();
|
|
157
|
+
const exampleTimes = [
|
|
158
|
+
TimeUtils.createTimeValue(9, 15, 0),
|
|
159
|
+
TimeUtils.createTimeValue(14, 30, 45),
|
|
160
|
+
TimeUtils.createTimeValue(23, 59, 59),
|
|
161
|
+
];
|
|
162
|
+
return exampleTimes.map(time => TimeUtils.formatTimeValue(time, config.format, config.showSeconds));
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Convert between formats
|
|
166
|
+
*/
|
|
167
|
+
convertFormat(timeString, fromFormat, toFormat) {
|
|
168
|
+
const parsedTime = TimeUtils.parseTimeString(timeString, fromFormat);
|
|
169
|
+
if (!parsedTime) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
const config = this.host.getConfig();
|
|
173
|
+
return TimeUtils.formatTimeValue(parsedTime, toFormat, config.showSeconds);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Get human-readable time description
|
|
177
|
+
*/
|
|
178
|
+
getTimeDescription(time) {
|
|
179
|
+
const config = this.host.getConfig();
|
|
180
|
+
const formatted = TimeUtils.formatTimeValue(time, config.format, config.showSeconds);
|
|
181
|
+
// Add contextual information
|
|
182
|
+
const now = TimeUtils.getCurrentTime();
|
|
183
|
+
const comparison = TimeUtils.compareTime(time, now);
|
|
184
|
+
if (comparison === 0) {
|
|
185
|
+
return `${formatted} (now)`;
|
|
186
|
+
}
|
|
187
|
+
else if (comparison > 0) {
|
|
188
|
+
return `${formatted} (future)`;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
return `${formatted} (past)`;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=formatting.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatting.controller.js","sourceRoot":"","sources":["../../../../src/components/timepicker/controllers/formatting.controller.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { TimeValue, TimeFormat, TimePeriod } from '../timepicker.types.js';\nimport { TimePickerHost, TimeFormattingController } from '../interfaces/timepicker.interface.js';\nimport { TimeUtils } from '../utils/time.utils.js';\nimport { \n DEFAULT_TIME_FORMAT, \n DEFAULT_TIME_FORMAT_WITH_SECONDS,\n DEFAULT_12H_TIME_FORMAT,\n DEFAULT_12H_TIME_FORMAT_WITH_SECONDS\n} from '../timepicker.constants.js';\n\n/**\n * Controller for handling time formatting logic\n */\nexport class TimePickerFormattingController implements TimeFormattingController {\n constructor(private host: TimePickerHost) {}\n\n /**\n * Format time for display (user-facing format)\n */\n formatForDisplay(time: TimeValue): string {\n const config = this.host.getConfig();\n return TimeUtils.formatTimeValue(time, config.format, config.showSeconds);\n }\n\n /**\n * Format time for input field value\n */\n formatForInput(time: TimeValue): string {\n // Input format is typically the same as display format\n return this.formatForDisplay(time);\n }\n\n /**\n * Parse input value to TimeValue\n */\n parseInputValue(value: string): TimeValue | null {\n const config = this.host.getConfig();\n return TimeUtils.parseTimeString(value, config.format);\n }\n\n /**\n * Get time format pattern for the current configuration\n */\n getFormatPattern(): string {\n const config = this.host.getConfig();\n \n if (config.format === TimeFormat.TwelveHour) {\n return config.showSeconds ? DEFAULT_12H_TIME_FORMAT_WITH_SECONDS : DEFAULT_12H_TIME_FORMAT;\n } else {\n return config.showSeconds ? DEFAULT_TIME_FORMAT_WITH_SECONDS : DEFAULT_TIME_FORMAT;\n }\n }\n\n /**\n * Get placeholder text for input field\n */\n getPlaceholder(): string {\n const config = this.host.getConfig();\n \n if (config.format === TimeFormat.TwelveHour) {\n return config.showSeconds ? 'hh:mm:ss AM/PM' : 'hh:mm AM/PM';\n } else {\n return config.showSeconds ? 'HH:mm:ss' : 'HH:mm';\n }\n }\n\n /**\n * Format time component with leading zeros\n */\n formatTimeComponent(value: number, length: number = 2): string {\n return value.toString().padStart(length, '0');\n }\n\n /**\n * Format hours based on current format\n */\n formatHours(hours: number): string {\n const config = this.host.getConfig();\n \n if (config.format === TimeFormat.TwelveHour) {\n let displayHours = hours;\n if (displayHours === 0) {\n displayHours = 12;\n } else if (displayHours > 12) {\n displayHours -= 12;\n }\n return displayHours.toString();\n } else {\n return this.formatTimeComponent(hours);\n }\n }\n\n /**\n * Format minutes with leading zero\n */\n formatMinutes(minutes: number): string {\n return this.formatTimeComponent(minutes);\n }\n\n /**\n * Format seconds with leading zero\n */\n formatSeconds(seconds: number): string {\n return this.formatTimeComponent(seconds);\n }\n\n /**\n * Get period (AM/PM) for 12-hour format\n */\n getPeriod(hours: number): TimePeriod {\n return hours >= 12 ? TimePeriod.PM : TimePeriod.AM;\n }\n\n /**\n * Format time parts separately\n */\n formatTimeParts(time: TimeValue): {\n hours: string;\n minutes: string;\n seconds: string;\n period?: TimePeriod;\n } {\n const config = this.host.getConfig();\n \n return {\n hours: this.formatHours(time.hours),\n minutes: this.formatMinutes(time.minutes),\n seconds: this.formatSeconds(time.seconds),\n period: config.format === TimeFormat.TwelveHour ? this.getPeriod(time.hours) : undefined,\n };\n }\n\n /**\n * Parse time parts from string\n */\n parseTimeParts(timeString: string): {\n hours?: number;\n minutes?: number;\n seconds?: number;\n period?: TimePeriod;\n } | null {\n const config = this.host.getConfig();\n const parsedTime = TimeUtils.parseTimeString(timeString, config.format);\n \n if (!parsedTime) {\n return null;\n }\n\n return {\n hours: parsedTime.hours,\n minutes: parsedTime.minutes,\n seconds: parsedTime.seconds,\n period: config.format === TimeFormat.TwelveHour ? this.getPeriod(parsedTime.hours) : undefined,\n };\n }\n\n /**\n * Get time separator character\n */\n getTimeSeparator(): string {\n return ':';\n }\n\n /**\n * Check if format is valid\n */\n isValidFormat(_format: string): boolean {\n const testTime = TimeUtils.createTimeValue(12, 30, 45);\n try {\n const formatted = this.formatForDisplay(testTime);\n const parsed = this.parseInputValue(formatted);\n return parsed !== null;\n } catch {\n return false;\n }\n }\n\n /**\n * Get format examples\n */\n getFormatExamples(): string[] {\n const config = this.host.getConfig();\n const exampleTimes = [\n TimeUtils.createTimeValue(9, 15, 0),\n TimeUtils.createTimeValue(14, 30, 45),\n TimeUtils.createTimeValue(23, 59, 59),\n ];\n\n return exampleTimes.map(time => TimeUtils.formatTimeValue(time, config.format, config.showSeconds));\n }\n\n /**\n * Convert between formats\n */\n convertFormat(timeString: string, fromFormat: TimeFormat, toFormat: TimeFormat): string | null {\n const parsedTime = TimeUtils.parseTimeString(timeString, fromFormat);\n if (!parsedTime) {\n return null;\n }\n\n const config = this.host.getConfig();\n return TimeUtils.formatTimeValue(parsedTime, toFormat, config.showSeconds);\n }\n\n /**\n * Get human-readable time description\n */\n getTimeDescription(time: TimeValue): string {\n const config = this.host.getConfig();\n const formatted = TimeUtils.formatTimeValue(time, config.format, config.showSeconds);\n \n // Add contextual information\n const now = TimeUtils.getCurrentTime();\n const comparison = TimeUtils.compareTime(time, now);\n \n if (comparison === 0) {\n return `${formatted} (now)`;\n } else if (comparison > 0) {\n return `${formatted} (future)`;\n } else {\n return `${formatted} (past)`;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2023 Nuraly, Laabidi Aymen
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
export { TimePickerSelectionController } from './selection.controller.js';
|
|
7
|
+
export { TimePickerValidationController } from './validation.controller.js';
|
|
8
|
+
export { TimePickerFormattingController } from './formatting.controller.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/timepicker/controllers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2023 Nuraly, Laabidi Aymen
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
export { TimePickerSelectionController } from './selection.controller.js';
|
|
7
|
+
export { TimePickerValidationController } from './validation.controller.js';
|
|
8
|
+
export { TimePickerFormattingController } from './formatting.controller.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/components/timepicker/controllers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,6BAA6B,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nexport { TimePickerSelectionController } from './selection.controller.js';\nexport { TimePickerValidationController } from './validation.controller.js';\nexport { TimePickerFormattingController } from './formatting.controller.js';\n"]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2023 Nuraly, Laabidi Aymen
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { TimeValue } from '../timepicker.types.js';
|
|
7
|
+
import { TimePickerHost, TimeSelectionController } from '../interfaces/timepicker.interface.js';
|
|
8
|
+
/**
|
|
9
|
+
* Controller for handling time selection logic
|
|
10
|
+
*/
|
|
11
|
+
export declare class TimePickerSelectionController implements TimeSelectionController {
|
|
12
|
+
private host;
|
|
13
|
+
private selectedTime;
|
|
14
|
+
constructor(host: TimePickerHost);
|
|
15
|
+
/**
|
|
16
|
+
* Select a time value
|
|
17
|
+
*/
|
|
18
|
+
selectTime(time: TimeValue): void;
|
|
19
|
+
/**
|
|
20
|
+
* Get currently selected time
|
|
21
|
+
*/
|
|
22
|
+
getSelectedTime(): TimeValue | null;
|
|
23
|
+
/**
|
|
24
|
+
* Clear current selection
|
|
25
|
+
*/
|
|
26
|
+
clearSelection(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Check if a time is currently selected
|
|
29
|
+
*/
|
|
30
|
+
isTimeSelected(time: TimeValue): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Set time without triggering events (for internal use)
|
|
33
|
+
*/
|
|
34
|
+
setTimeInternal(time: TimeValue | null): void;
|
|
35
|
+
/**
|
|
36
|
+
* Update selected time with partial values
|
|
37
|
+
*/
|
|
38
|
+
updateTime(updates: Partial<TimeValue>): void;
|
|
39
|
+
/**
|
|
40
|
+
* Increment time component
|
|
41
|
+
*/
|
|
42
|
+
incrementTime(component: 'hours' | 'minutes' | 'seconds', step?: number): void;
|
|
43
|
+
/**
|
|
44
|
+
* Decrement time component
|
|
45
|
+
*/
|
|
46
|
+
decrementTime(component: 'hours' | 'minutes' | 'seconds', step?: number): void;
|
|
47
|
+
/**
|
|
48
|
+
* Set time from formatted string
|
|
49
|
+
*/
|
|
50
|
+
setTimeFromString(timeString: string): boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Get formatted time string
|
|
53
|
+
*/
|
|
54
|
+
getFormattedTime(): string;
|
|
55
|
+
/**
|
|
56
|
+
* Dispatch time change event
|
|
57
|
+
*/
|
|
58
|
+
private dispatchTimeChangeEvent;
|
|
59
|
+
/**
|
|
60
|
+
* Reset to initial/default time
|
|
61
|
+
*/
|
|
62
|
+
reset(): void;
|
|
63
|
+
/**
|
|
64
|
+
* Set time to current time
|
|
65
|
+
*/
|
|
66
|
+
setToCurrentTime(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Round current time to nearest interval
|
|
69
|
+
*/
|
|
70
|
+
roundToInterval(intervalMinutes: number): void;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=selection.controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.controller.d.ts","sourceRoot":"","sources":["../../../../src/components/timepicker/controllers/selection.controller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAIhG;;GAEG;AACH,qBAAa,6BAA8B,YAAW,uBAAuB;IAG/D,OAAO,CAAC,IAAI;IAFxB,OAAO,CAAC,YAAY,CAA0B;gBAE1B,IAAI,EAAE,cAAc;IAExC;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAejC;;OAEG;IACH,eAAe,IAAI,SAAS,GAAG,IAAI;IAInC;;OAEG;IACH,cAAc,IAAI,IAAI;IAUtB;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO;IAQxC;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI;IAI7C;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IAsB7C;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,EAAE,IAAI,GAAE,MAAU,GAAG,IAAI;IAwBjF;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,EAAE,IAAI,GAAE,MAAU,GAAG,IAAI;IAIjF;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAY9C;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAQ1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAuB/B;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAKxB;;OAEG;IACH,eAAe,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI;CAQ/C"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2023 Nuraly, Laabidi Aymen
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import { TimeUtils } from '../utils/time.utils.js';
|
|
7
|
+
import { TIME_PICKER_EVENTS } from '../timepicker.types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Controller for handling time selection logic
|
|
10
|
+
*/
|
|
11
|
+
export class TimePickerSelectionController {
|
|
12
|
+
constructor(host) {
|
|
13
|
+
this.host = host;
|
|
14
|
+
this.selectedTime = null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Select a time value
|
|
18
|
+
*/
|
|
19
|
+
selectTime(time) {
|
|
20
|
+
if (!this.host.validateTime(time)) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const previousTime = this.selectedTime;
|
|
24
|
+
this.selectedTime = Object.assign({}, time);
|
|
25
|
+
// Dispatch time change event
|
|
26
|
+
this.dispatchTimeChangeEvent(time, previousTime);
|
|
27
|
+
// Request host update
|
|
28
|
+
this.host.requestUpdate();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get currently selected time
|
|
32
|
+
*/
|
|
33
|
+
getSelectedTime() {
|
|
34
|
+
return this.selectedTime ? Object.assign({}, this.selectedTime) : null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Clear current selection
|
|
38
|
+
*/
|
|
39
|
+
clearSelection() {
|
|
40
|
+
const previousTime = this.selectedTime;
|
|
41
|
+
this.selectedTime = null;
|
|
42
|
+
if (previousTime) {
|
|
43
|
+
this.dispatchTimeChangeEvent(null, previousTime);
|
|
44
|
+
this.host.requestUpdate();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check if a time is currently selected
|
|
49
|
+
*/
|
|
50
|
+
isTimeSelected(time) {
|
|
51
|
+
if (!this.selectedTime) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
return TimeUtils.isTimeEqual(time, this.selectedTime);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Set time without triggering events (for internal use)
|
|
58
|
+
*/
|
|
59
|
+
setTimeInternal(time) {
|
|
60
|
+
this.selectedTime = time ? Object.assign({}, time) : null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Update selected time with partial values
|
|
64
|
+
*/
|
|
65
|
+
updateTime(updates) {
|
|
66
|
+
if (!this.selectedTime) {
|
|
67
|
+
// Create new time with current time as base
|
|
68
|
+
const currentTime = TimeUtils.getCurrentTime();
|
|
69
|
+
this.selectedTime = Object.assign(Object.assign({}, currentTime), updates);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// Update existing time
|
|
73
|
+
this.selectedTime = Object.assign(Object.assign({}, this.selectedTime), updates);
|
|
74
|
+
}
|
|
75
|
+
if (this.host.validateTime(this.selectedTime)) {
|
|
76
|
+
this.dispatchTimeChangeEvent(this.selectedTime, null);
|
|
77
|
+
this.host.requestUpdate();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Increment time component
|
|
82
|
+
*/
|
|
83
|
+
incrementTime(component, step = 1) {
|
|
84
|
+
if (!this.selectedTime) {
|
|
85
|
+
this.selectedTime = TimeUtils.getCurrentTime();
|
|
86
|
+
}
|
|
87
|
+
let newTime;
|
|
88
|
+
switch (component) {
|
|
89
|
+
case 'hours':
|
|
90
|
+
newTime = TimeUtils.addTime(this.selectedTime, step, 0, 0);
|
|
91
|
+
break;
|
|
92
|
+
case 'minutes':
|
|
93
|
+
newTime = TimeUtils.addTime(this.selectedTime, 0, step, 0);
|
|
94
|
+
break;
|
|
95
|
+
case 'seconds':
|
|
96
|
+
newTime = TimeUtils.addTime(this.selectedTime, 0, 0, step);
|
|
97
|
+
break;
|
|
98
|
+
default:
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
this.selectTime(newTime);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Decrement time component
|
|
105
|
+
*/
|
|
106
|
+
decrementTime(component, step = 1) {
|
|
107
|
+
this.incrementTime(component, -step);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Set time from formatted string
|
|
111
|
+
*/
|
|
112
|
+
setTimeFromString(timeString) {
|
|
113
|
+
const config = this.host.getConfig();
|
|
114
|
+
const parsedTime = TimeUtils.parseTimeString(timeString, config.format);
|
|
115
|
+
if (parsedTime && this.host.validateTime(parsedTime)) {
|
|
116
|
+
this.selectTime(parsedTime);
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get formatted time string
|
|
123
|
+
*/
|
|
124
|
+
getFormattedTime() {
|
|
125
|
+
if (!this.selectedTime) {
|
|
126
|
+
return '';
|
|
127
|
+
}
|
|
128
|
+
return this.host.formatTime(this.selectedTime);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Dispatch time change event
|
|
132
|
+
*/
|
|
133
|
+
dispatchTimeChangeEvent(newTime, previousTime) {
|
|
134
|
+
const hostElement = this.host;
|
|
135
|
+
if (!hostElement.dispatchEvent) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const detail = {
|
|
139
|
+
value: newTime ? this.host.formatTime(newTime) : '',
|
|
140
|
+
timeValue: newTime,
|
|
141
|
+
previousValue: previousTime ? this.host.formatTime(previousTime) : '',
|
|
142
|
+
previousTimeValue: previousTime,
|
|
143
|
+
};
|
|
144
|
+
const event = new CustomEvent(TIME_PICKER_EVENTS.TIME_CHANGE, {
|
|
145
|
+
detail,
|
|
146
|
+
bubbles: true,
|
|
147
|
+
composed: true,
|
|
148
|
+
});
|
|
149
|
+
hostElement.dispatchEvent(event);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Reset to initial/default time
|
|
153
|
+
*/
|
|
154
|
+
reset() {
|
|
155
|
+
this.clearSelection();
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Set time to current time
|
|
159
|
+
*/
|
|
160
|
+
setToCurrentTime() {
|
|
161
|
+
const currentTime = TimeUtils.getCurrentTime();
|
|
162
|
+
this.selectTime(currentTime);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Round current time to nearest interval
|
|
166
|
+
*/
|
|
167
|
+
roundToInterval(intervalMinutes) {
|
|
168
|
+
if (!this.selectedTime) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const roundedTime = TimeUtils.roundToInterval(this.selectedTime, intervalMinutes);
|
|
172
|
+
this.selectTime(roundedTime);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=selection.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.controller.js","sourceRoot":"","sources":["../../../../src/components/timepicker/controllers/selection.controller.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D;;GAEG;AACH,MAAM,OAAO,6BAA6B;IAGxC,YAAoB,IAAoB;QAApB,SAAI,GAAJ,IAAI,CAAgB;QAFhC,iBAAY,GAAqB,IAAI,CAAC;IAEH,CAAC;IAE5C;;OAEG;IACH,UAAU,CAAC,IAAe;QACxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;YACjC,OAAO;SACR;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,YAAY,qBAAQ,IAAI,CAAE,CAAC;QAEhC,6BAA6B;QAC7B,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;QAEjD,sBAAsB;QACtB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,mBAAM,IAAI,CAAC,YAAY,EAAG,CAAC,CAAC,IAAI,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,IAAI,YAAY,EAAE;YAChB,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YACjD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;SAC3B;IACH,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,IAAe;QAC5B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,OAAO,KAAK,CAAC;SACd;QAED,OAAO,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,IAAsB;QACpC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,mBAAM,IAAI,EAAG,CAAC,CAAC,IAAI,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAA2B;QACpC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,4CAA4C;YAC5C,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;YAC/C,IAAI,CAAC,YAAY,mCACZ,WAAW,GACX,OAAO,CACX,CAAC;SACH;aAAM;YACL,uBAAuB;YACvB,IAAI,CAAC,YAAY,mCACZ,IAAI,CAAC,YAAY,GACjB,OAAO,CACX,CAAC;SACH;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YAC7C,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;SAC3B;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,SAA0C,EAAE,OAAe,CAAC;QACxE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;SAChD;QAED,IAAI,OAAkB,CAAC;QAEvB,QAAQ,SAAS,EAAE;YACjB,KAAK,OAAO;gBACV,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC3D,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC3D,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC3D,MAAM;YACR;gBACE,OAAO;SACV;QAED,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,SAA0C,EAAE,OAAe,CAAC;QACxE,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,UAAkB;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,SAAS,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAExE,IAAI,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE;YACpD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;SACb;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,OAAO,EAAE,CAAC;SACX;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACK,uBAAuB,CAAC,OAAyB,EAAE,YAA8B;QACvF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAW,CAAC;QAErC,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;YAC9B,OAAO;SACR;QAED,MAAM,MAAM,GAAG;YACb,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;YACnD,SAAS,EAAE,OAAO;YAClB,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE;YACrE,iBAAiB,EAAE,YAAY;SAChC,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,kBAAkB,CAAC,WAAW,EAAE;YAC5D,MAAM;YACN,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CAAC;QAEH,WAAW,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,MAAM,WAAW,GAAG,SAAS,CAAC,cAAc,EAAE,CAAC;QAC/C,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,eAAuB;QACrC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,OAAO;SACR;QAED,MAAM,WAAW,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;QAClF,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;CACF","sourcesContent":["/**\n * @license\n * Copyright 2023 Nuraly, Laabidi Aymen\n * SPDX-License-Identifier: MIT\n */\n\nimport { TimeValue } from '../timepicker.types.js';\nimport { TimePickerHost, TimeSelectionController } from '../interfaces/timepicker.interface.js';\nimport { TimeUtils } from '../utils/time.utils.js';\nimport { TIME_PICKER_EVENTS } from '../timepicker.types.js';\n\n/**\n * Controller for handling time selection logic\n */\nexport class TimePickerSelectionController implements TimeSelectionController {\n private selectedTime: TimeValue | null = null;\n\n constructor(private host: TimePickerHost) {}\n\n /**\n * Select a time value\n */\n selectTime(time: TimeValue): void {\n if (!this.host.validateTime(time)) {\n return;\n }\n\n const previousTime = this.selectedTime;\n this.selectedTime = { ...time };\n\n // Dispatch time change event\n this.dispatchTimeChangeEvent(time, previousTime);\n \n // Request host update\n this.host.requestUpdate();\n }\n\n /**\n * Get currently selected time\n */\n getSelectedTime(): TimeValue | null {\n return this.selectedTime ? { ...this.selectedTime } : null;\n }\n\n /**\n * Clear current selection\n */\n clearSelection(): void {\n const previousTime = this.selectedTime;\n this.selectedTime = null;\n\n if (previousTime) {\n this.dispatchTimeChangeEvent(null, previousTime);\n this.host.requestUpdate();\n }\n }\n\n /**\n * Check if a time is currently selected\n */\n isTimeSelected(time: TimeValue): boolean {\n if (!this.selectedTime) {\n return false;\n }\n\n return TimeUtils.isTimeEqual(time, this.selectedTime);\n }\n\n /**\n * Set time without triggering events (for internal use)\n */\n setTimeInternal(time: TimeValue | null): void {\n this.selectedTime = time ? { ...time } : null;\n }\n\n /**\n * Update selected time with partial values\n */\n updateTime(updates: Partial<TimeValue>): void {\n if (!this.selectedTime) {\n // Create new time with current time as base\n const currentTime = TimeUtils.getCurrentTime();\n this.selectedTime = {\n ...currentTime,\n ...updates,\n };\n } else {\n // Update existing time\n this.selectedTime = {\n ...this.selectedTime,\n ...updates,\n };\n }\n\n if (this.host.validateTime(this.selectedTime)) {\n this.dispatchTimeChangeEvent(this.selectedTime, null);\n this.host.requestUpdate();\n }\n }\n\n /**\n * Increment time component\n */\n incrementTime(component: 'hours' | 'minutes' | 'seconds', step: number = 1): void {\n if (!this.selectedTime) {\n this.selectedTime = TimeUtils.getCurrentTime();\n }\n\n let newTime: TimeValue;\n\n switch (component) {\n case 'hours':\n newTime = TimeUtils.addTime(this.selectedTime, step, 0, 0);\n break;\n case 'minutes':\n newTime = TimeUtils.addTime(this.selectedTime, 0, step, 0);\n break;\n case 'seconds':\n newTime = TimeUtils.addTime(this.selectedTime, 0, 0, step);\n break;\n default:\n return;\n }\n\n this.selectTime(newTime);\n }\n\n /**\n * Decrement time component\n */\n decrementTime(component: 'hours' | 'minutes' | 'seconds', step: number = 1): void {\n this.incrementTime(component, -step);\n }\n\n /**\n * Set time from formatted string\n */\n setTimeFromString(timeString: string): boolean {\n const config = this.host.getConfig();\n const parsedTime = TimeUtils.parseTimeString(timeString, config.format);\n\n if (parsedTime && this.host.validateTime(parsedTime)) {\n this.selectTime(parsedTime);\n return true;\n }\n\n return false;\n }\n\n /**\n * Get formatted time string\n */\n getFormattedTime(): string {\n if (!this.selectedTime) {\n return '';\n }\n\n return this.host.formatTime(this.selectedTime);\n }\n\n /**\n * Dispatch time change event\n */\n private dispatchTimeChangeEvent(newTime: TimeValue | null, previousTime: TimeValue | null): void {\n const hostElement = this.host as any;\n \n if (!hostElement.dispatchEvent) {\n return;\n }\n\n const detail = {\n value: newTime ? this.host.formatTime(newTime) : '',\n timeValue: newTime,\n previousValue: previousTime ? this.host.formatTime(previousTime) : '',\n previousTimeValue: previousTime,\n };\n\n const event = new CustomEvent(TIME_PICKER_EVENTS.TIME_CHANGE, {\n detail,\n bubbles: true,\n composed: true,\n });\n\n hostElement.dispatchEvent(event);\n }\n\n /**\n * Reset to initial/default time\n */\n reset(): void {\n this.clearSelection();\n }\n\n /**\n * Set time to current time\n */\n setToCurrentTime(): void {\n const currentTime = TimeUtils.getCurrentTime();\n this.selectTime(currentTime);\n }\n\n /**\n * Round current time to nearest interval\n */\n roundToInterval(intervalMinutes: number): void {\n if (!this.selectedTime) {\n return;\n }\n\n const roundedTime = TimeUtils.roundToInterval(this.selectedTime, intervalMinutes);\n this.selectTime(roundedTime);\n }\n}\n"]}
|