@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.
Files changed (43) hide show
  1. package/controllers/formatting.controller.d.ts +93 -0
  2. package/controllers/formatting.controller.d.ts.map +1 -0
  3. package/controllers/formatting.controller.js +195 -0
  4. package/controllers/formatting.controller.js.map +1 -0
  5. package/controllers/index.d.ts +9 -0
  6. package/controllers/index.d.ts.map +1 -0
  7. package/controllers/index.js +9 -0
  8. package/controllers/index.js.map +1 -0
  9. package/controllers/selection.controller.d.ts +72 -0
  10. package/controllers/selection.controller.d.ts.map +1 -0
  11. package/controllers/selection.controller.js +175 -0
  12. package/controllers/selection.controller.js.map +1 -0
  13. package/controllers/validation.controller.d.ts +88 -0
  14. package/controllers/validation.controller.d.ts.map +1 -0
  15. package/controllers/validation.controller.js +200 -0
  16. package/controllers/validation.controller.js.map +1 -0
  17. package/index.d.ts +12 -0
  18. package/index.js +12 -0
  19. package/interfaces/timepicker.interface.d.ts +103 -0
  20. package/interfaces/timepicker.interface.d.ts.map +1 -0
  21. package/interfaces/timepicker.interface.js +7 -0
  22. package/interfaces/timepicker.interface.js.map +1 -0
  23. package/package.json +63 -0
  24. package/test/timepicker.test.d.ts +7 -0
  25. package/test/timepicker.test.d.ts.map +1 -0
  26. package/test/timepicker.test.js +218 -0
  27. package/test/timepicker.test.js.map +1 -0
  28. package/timepicker.component.backup.d.ts +165 -0
  29. package/timepicker.component.backup.js +890 -0
  30. package/timepicker.component.clean.d.ts +95 -0
  31. package/timepicker.component.clean.js +471 -0
  32. package/timepicker.component.d.ts +117 -0
  33. package/timepicker.component.js +747 -0
  34. package/timepicker.constants.d.ts +85 -0
  35. package/timepicker.constants.js +85 -0
  36. package/timepicker.style.d.ts +7 -0
  37. package/timepicker.style.js +646 -0
  38. package/timepicker.types.d.ts +161 -0
  39. package/timepicker.types.js +125 -0
  40. package/utils/time.utils.d.ts +87 -0
  41. package/utils/time.utils.d.ts.map +1 -0
  42. package/utils/time.utils.js +235 -0
  43. 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":"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","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"]}