nexheal-lib 0.0.58 → 0.0.59
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/fesm2022/nexheal-lib.mjs +218 -311
- package/fesm2022/nexheal-lib.mjs.map +1 -1
- package/index.d.ts +32 -41
- package/package.json +1 -1
package/fesm2022/nexheal-lib.mjs
CHANGED
|
@@ -423,10 +423,6 @@ class CalendarControl {
|
|
|
423
423
|
errorMessage = "";
|
|
424
424
|
hourFormat = "24";
|
|
425
425
|
selectionMode = "single";
|
|
426
|
-
/** `week` = Sun–Sat calendar week. `sevenDays` = clicked date through +6 days. */
|
|
427
|
-
get isWeekLikeMode() {
|
|
428
|
-
return this.selectionMode === "week" || this.selectionMode === "sevenDays";
|
|
429
|
-
}
|
|
430
426
|
timeOnly = false;
|
|
431
427
|
dateFormat = "dd/MM/yyyy";
|
|
432
428
|
placeholder = "";
|
|
@@ -454,9 +450,9 @@ class CalendarControl {
|
|
|
454
450
|
selectionCleared = new EventEmitter();
|
|
455
451
|
blurEvent = new EventEmitter();
|
|
456
452
|
dateSelected = new EventEmitter();
|
|
457
|
-
/** Emitted in `selectionMode="week"`
|
|
453
|
+
/** Emitted in `selectionMode="week"` with the selected week's start/end (or null when cleared). */
|
|
458
454
|
weekSelected = new EventEmitter();
|
|
459
|
-
/** Emitted in `selectionMode="range"` with the selected start/end (or null when cleared). */
|
|
455
|
+
/** Emitted in `selectionMode="range"` with the selected range's start/end (or null when cleared). */
|
|
460
456
|
rangeSelected = new EventEmitter();
|
|
461
457
|
_defaultDate;
|
|
462
458
|
get defaultDate() {
|
|
@@ -509,11 +505,12 @@ class CalendarControl {
|
|
|
509
505
|
selectedWeekEnd = null;
|
|
510
506
|
hoverWeekStart = null;
|
|
511
507
|
hoverWeekEnd = null;
|
|
508
|
+
// ── range mode state ──
|
|
512
509
|
rangeStart = null;
|
|
513
510
|
rangeEnd = null;
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
511
|
+
rangeHoverEnd = null;
|
|
512
|
+
/** Tracks whether the user is picking the end date (true) or the start date (false). */
|
|
513
|
+
rangePicking = 'start';
|
|
517
514
|
today = new Date();
|
|
518
515
|
todayYear = this.today.getFullYear();
|
|
519
516
|
todayMonth = this.today.getMonth();
|
|
@@ -554,13 +551,22 @@ class CalendarControl {
|
|
|
554
551
|
this.selectedDate = null;
|
|
555
552
|
this.selectedWeekStart = null;
|
|
556
553
|
this.selectedWeekEnd = null;
|
|
557
|
-
this.
|
|
554
|
+
this.rangeStart = null;
|
|
555
|
+
this.rangeEnd = null;
|
|
556
|
+
this.rangePicking = 'start';
|
|
558
557
|
this.inputControl.setValue("", { emitEvent: false });
|
|
559
558
|
return;
|
|
560
559
|
}
|
|
560
|
+
// Range mode: delegate to separate handler
|
|
561
|
+
if (this.selectionMode === "range") {
|
|
562
|
+
this.writeValueRange(value);
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
561
565
|
// Week mode: value is a "start - end" range string
|
|
562
|
-
if (this.
|
|
563
|
-
const
|
|
566
|
+
if (this.selectionMode === "week") {
|
|
567
|
+
const raw = String(value);
|
|
568
|
+
const firstPart = raw.split(" - ")[0].trim();
|
|
569
|
+
const parsed = this.parseDate(firstPart) || this.parseDate(raw);
|
|
564
570
|
if (!parsed) {
|
|
565
571
|
this.selectedWeekStart = null;
|
|
566
572
|
this.selectedWeekEnd = null;
|
|
@@ -577,20 +583,6 @@ class CalendarControl {
|
|
|
577
583
|
this.inputControl.setValue(this.formatWeek(start, end), { emitEvent: false });
|
|
578
584
|
return;
|
|
579
585
|
}
|
|
580
|
-
if (this.selectionMode === "range") {
|
|
581
|
-
const parsedRange = this.parseIncomingRange(value);
|
|
582
|
-
if (!parsedRange) {
|
|
583
|
-
this.applyDateRange(null, null, false);
|
|
584
|
-
this.selectedDate = null;
|
|
585
|
-
this.inputControl.setValue("", { emitEvent: false });
|
|
586
|
-
return;
|
|
587
|
-
}
|
|
588
|
-
this.applyDateRange(parsedRange.start, parsedRange.end, false);
|
|
589
|
-
this.selectedDate = parsedRange.start;
|
|
590
|
-
this.displayMonth = parsedRange.start.getMonth();
|
|
591
|
-
this.displayYear = parsedRange.start.getFullYear();
|
|
592
|
-
return;
|
|
593
|
-
}
|
|
594
586
|
if (this.timeOnly) {
|
|
595
587
|
let hours, mins;
|
|
596
588
|
if (typeof value === "string") {
|
|
@@ -719,9 +711,14 @@ class CalendarControl {
|
|
|
719
711
|
// events
|
|
720
712
|
onBlur() {
|
|
721
713
|
this.onTouchedFn();
|
|
714
|
+
// Range mode: delegate to separate handler
|
|
715
|
+
if (this.selectionMode === "range") {
|
|
716
|
+
this.onBlurRange();
|
|
717
|
+
return;
|
|
718
|
+
}
|
|
722
719
|
// Week mode keeps a "start - end" range string; the single-date parsing
|
|
723
720
|
// below would fail to parse it and wipe the selection, so handle it here.
|
|
724
|
-
if (this.
|
|
721
|
+
if (this.selectionMode === "week") {
|
|
725
722
|
const rawWeek = (this.inputControl.value || "").trim();
|
|
726
723
|
const current = this.selectedWeekStart && this.selectedWeekEnd
|
|
727
724
|
? this.formatWeek(this.selectedWeekStart, this.selectedWeekEnd)
|
|
@@ -742,8 +739,8 @@ class CalendarControl {
|
|
|
742
739
|
this.blurEvent.emit();
|
|
743
740
|
return;
|
|
744
741
|
}
|
|
745
|
-
// typed a different value -> recompute the week, else revert
|
|
746
|
-
const parsed = this.
|
|
742
|
+
// typed a different value -> recompute the week from the first date, else revert
|
|
743
|
+
const parsed = this.parseDate(rawWeek.split(" - ")[0].trim());
|
|
747
744
|
if (!parsed) {
|
|
748
745
|
this.inputControl.setValue(current, { emitEvent: false });
|
|
749
746
|
this.blurEvent.emit();
|
|
@@ -763,10 +760,6 @@ class CalendarControl {
|
|
|
763
760
|
this.blurEvent.emit();
|
|
764
761
|
return;
|
|
765
762
|
}
|
|
766
|
-
if (this.selectionMode === "range") {
|
|
767
|
-
this.onRangeBlur();
|
|
768
|
-
return;
|
|
769
|
-
}
|
|
770
763
|
const raw = (this.inputControl.value || "");
|
|
771
764
|
let currentFormatted = "";
|
|
772
765
|
if (this.selectedDate) {
|
|
@@ -908,10 +901,7 @@ class CalendarControl {
|
|
|
908
901
|
this.toggleCalendar();
|
|
909
902
|
break;
|
|
910
903
|
case "Escape":
|
|
911
|
-
|
|
912
|
-
this.closeCalendar();
|
|
913
|
-
else
|
|
914
|
-
this.isOpen = false;
|
|
904
|
+
this.isOpen = false;
|
|
915
905
|
break;
|
|
916
906
|
case " ":
|
|
917
907
|
case "Spacebar":
|
|
@@ -919,10 +909,7 @@ class CalendarControl {
|
|
|
919
909
|
this.toggleCalendar();
|
|
920
910
|
break;
|
|
921
911
|
case "Tab":
|
|
922
|
-
|
|
923
|
-
this.closeCalendar();
|
|
924
|
-
else
|
|
925
|
-
this.isOpen = false;
|
|
912
|
+
this.isOpen = false;
|
|
926
913
|
break;
|
|
927
914
|
}
|
|
928
915
|
}
|
|
@@ -931,8 +918,13 @@ class CalendarControl {
|
|
|
931
918
|
if (!cell || cell.disabled)
|
|
932
919
|
return;
|
|
933
920
|
const base = cell.date;
|
|
934
|
-
//
|
|
935
|
-
if (this.
|
|
921
|
+
// Range mode: delegate to separate handler
|
|
922
|
+
if (this.selectionMode === "range") {
|
|
923
|
+
this.selectDayRange(cell);
|
|
924
|
+
return;
|
|
925
|
+
}
|
|
926
|
+
// Week mode: select the whole week containing the clicked day
|
|
927
|
+
if (this.selectionMode === "week") {
|
|
936
928
|
const { start, end } = this.getWeekRange(base);
|
|
937
929
|
this.selectedWeekStart = start;
|
|
938
930
|
this.selectedWeekEnd = end;
|
|
@@ -946,10 +938,6 @@ class CalendarControl {
|
|
|
946
938
|
this.isOpen = false;
|
|
947
939
|
return;
|
|
948
940
|
}
|
|
949
|
-
if (this.selectionMode === "range") {
|
|
950
|
-
this.selectRangeDay(cell);
|
|
951
|
-
return;
|
|
952
|
-
}
|
|
953
941
|
const picked = this.showTime
|
|
954
942
|
? new Date(base.getFullYear(), base.getMonth(), base.getDate(), this.selectedHour, this.selectedMinute)
|
|
955
943
|
: new Date(base.getFullYear(), base.getMonth(), base.getDate());
|
|
@@ -973,20 +961,36 @@ class CalendarControl {
|
|
|
973
961
|
start.setDate(1 - firstOfMonth.getDay());
|
|
974
962
|
const end = new Date(lastOfMonth);
|
|
975
963
|
end.setDate(lastOfMonth.getDate() + (6 - lastOfMonth.getDay()));
|
|
964
|
+
const isRange = this.selectionMode === "range";
|
|
976
965
|
const cells = [];
|
|
977
966
|
const cursor = new Date(start);
|
|
978
967
|
while (cursor <= end) {
|
|
979
968
|
const date = new Date(cursor.getFullYear(), cursor.getMonth(), cursor.getDate());
|
|
980
|
-
|
|
969
|
+
const cell = {
|
|
981
970
|
date,
|
|
982
971
|
day: date.getDate(),
|
|
983
972
|
otherMonth: date.getMonth() !== this.displayMonth,
|
|
984
973
|
disabled: this.isDateDisabled(date),
|
|
985
|
-
selected:
|
|
974
|
+
selected: isRange
|
|
975
|
+
? this.isRangeEdge(date)
|
|
976
|
+
: this.selectionMode === "week"
|
|
977
|
+
? this.isWithin(date, this.selectedWeekStart, this.selectedWeekEnd)
|
|
978
|
+
: !!this.selectedDate &&
|
|
979
|
+
this.selectedDate.getFullYear() === date.getFullYear() &&
|
|
980
|
+
this.selectedDate.getMonth() === date.getMonth() &&
|
|
981
|
+
this.selectedDate.getDate() === date.getDate(),
|
|
986
982
|
today: this.todayYear === date.getFullYear() &&
|
|
987
983
|
this.todayMonth === date.getMonth() &&
|
|
988
984
|
this.todayDate === date.getDate(),
|
|
989
|
-
}
|
|
985
|
+
};
|
|
986
|
+
// Populate range-specific flags
|
|
987
|
+
if (isRange) {
|
|
988
|
+
cell.isRangeStart = this.isSameDay(date, this.rangeStart);
|
|
989
|
+
cell.isRangeEnd = this.isSameDay(date, this.rangeEnd);
|
|
990
|
+
cell.isInRange = this.isInFinalRange(date);
|
|
991
|
+
cell.isInHoverRange = this.isInHoverRange(date);
|
|
992
|
+
}
|
|
993
|
+
cells.push(cell);
|
|
990
994
|
cursor.setDate(cursor.getDate() + 1);
|
|
991
995
|
}
|
|
992
996
|
return cells;
|
|
@@ -1007,11 +1011,6 @@ class CalendarControl {
|
|
|
1007
1011
|
const d = +m[1], mo = +m[2] - 1, y = +m[3];
|
|
1008
1012
|
return new Date(y, mo, d);
|
|
1009
1013
|
}
|
|
1010
|
-
// Date-only ISO must be local; `new Date("yyyy-MM-dd")` is UTC and shifts the day in IST.
|
|
1011
|
-
const isoDateOnly = val.match(/^(\d{4})-(\d{2})-(\d{2})$/);
|
|
1012
|
-
if (isoDateOnly) {
|
|
1013
|
-
return new Date(+isoDateOnly[1], +isoDateOnly[2] - 1, +isoDateOnly[3]);
|
|
1014
|
-
}
|
|
1015
1014
|
}
|
|
1016
1015
|
// fallback
|
|
1017
1016
|
const date = new Date(val);
|
|
@@ -1051,292 +1050,210 @@ class CalendarControl {
|
|
|
1051
1050
|
this.isDateDisabled(new Date(this.displayYear, this.displayMonth, day)));
|
|
1052
1051
|
}
|
|
1053
1052
|
// week
|
|
1054
|
-
/**
|
|
1055
|
-
* `week`: Sun–Sat containing `date`.
|
|
1056
|
-
* `sevenDays`: `date` through the next 6 days.
|
|
1057
|
-
*/
|
|
1053
|
+
/** The Sun–Sat range for the week containing `date`. */
|
|
1058
1054
|
getWeekRange(date) {
|
|
1059
|
-
const
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
const start = new Date(day.getFullYear(), day.getMonth(), day.getDate() - day.getDay());
|
|
1066
|
-
const end = new Date(start.getFullYear(), start.getMonth(), start.getDate() + 6, 23, 59, 59, 999);
|
|
1055
|
+
const start = new Date(date);
|
|
1056
|
+
start.setHours(0, 0, 0, 0);
|
|
1057
|
+
start.setDate(start.getDate() - start.getDay()); // back to Sunday
|
|
1058
|
+
const end = new Date(start);
|
|
1059
|
+
end.setDate(start.getDate() + 6); // Saturday
|
|
1060
|
+
end.setHours(23, 59, 59, 999);
|
|
1067
1061
|
return { start, end };
|
|
1068
1062
|
}
|
|
1069
|
-
/**
|
|
1070
|
-
* `sevenDays` anchors on the start date (clicked day).
|
|
1071
|
-
* `week` (Sun–Sat) prefers the end date when both are present so Sunday 00:00 IST
|
|
1072
|
-
* does not snap the previous UTC day back a calendar week.
|
|
1073
|
-
*/
|
|
1074
|
-
parseWeekAnchor(value) {
|
|
1075
|
-
if (value instanceof Date && !isNaN(value.getTime())) {
|
|
1076
|
-
return this.startOfDay(value);
|
|
1077
|
-
}
|
|
1078
|
-
if (Array.isArray(value) && value.length) {
|
|
1079
|
-
if (this.selectionMode === "week" && value[1] != null) {
|
|
1080
|
-
const end = this.parseDate(value[1]);
|
|
1081
|
-
if (end)
|
|
1082
|
-
return end;
|
|
1083
|
-
}
|
|
1084
|
-
return this.parseWeekAnchor(value[0]);
|
|
1085
|
-
}
|
|
1086
|
-
if (value && typeof value === "object" && !(value instanceof Date) && (value.start || value.end)) {
|
|
1087
|
-
if (this.selectionMode === "week" && value.end) {
|
|
1088
|
-
const end = this.parseDate(value.end);
|
|
1089
|
-
if (end)
|
|
1090
|
-
return end;
|
|
1091
|
-
}
|
|
1092
|
-
return this.parseWeekAnchor(value.start);
|
|
1093
|
-
}
|
|
1094
|
-
const raw = String(value ?? "").trim();
|
|
1095
|
-
if (!raw)
|
|
1096
|
-
return null;
|
|
1097
|
-
const parts = raw.split(/\s+[-–—]\s+/).map((part) => part.trim()).filter(Boolean);
|
|
1098
|
-
if (this.selectionMode === "week" && parts.length >= 2) {
|
|
1099
|
-
const end = this.parseDate(parts[1]);
|
|
1100
|
-
if (end)
|
|
1101
|
-
return end;
|
|
1102
|
-
}
|
|
1103
|
-
if (parts.length >= 1) {
|
|
1104
|
-
const start = this.parseDate(parts[0]);
|
|
1105
|
-
if (start)
|
|
1106
|
-
return start;
|
|
1107
|
-
}
|
|
1108
|
-
return this.parseDate(raw);
|
|
1109
|
-
}
|
|
1110
1063
|
formatWeek(start, end) {
|
|
1111
1064
|
return `${this.datePipe.transform(start, this.dateFormat)} - ${this.datePipe.transform(end, this.dateFormat)}`;
|
|
1112
1065
|
}
|
|
1113
1066
|
isWithin(date, start, end) {
|
|
1114
1067
|
if (!start || !end)
|
|
1115
1068
|
return false;
|
|
1116
|
-
return
|
|
1069
|
+
return date >= start && date <= end;
|
|
1117
1070
|
}
|
|
1118
1071
|
isInHoverWeek(date) {
|
|
1119
|
-
if (
|
|
1072
|
+
if (this.selectionMode !== "week")
|
|
1120
1073
|
return false;
|
|
1121
1074
|
return this.isWithin(date, this.hoverWeekStart, this.hoverWeekEnd);
|
|
1122
1075
|
}
|
|
1123
1076
|
onDayHover(cell) {
|
|
1124
|
-
if (this.isWeekLikeMode) {
|
|
1125
|
-
const { start, end } = this.getWeekRange(cell.date);
|
|
1126
|
-
this.hoverWeekStart = start;
|
|
1127
|
-
this.hoverWeekEnd = end;
|
|
1128
|
-
return;
|
|
1129
|
-
}
|
|
1130
1077
|
if (this.selectionMode === "range") {
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
this.hoverDate = cell.date;
|
|
1078
|
+
this.onDayHoverRange(cell);
|
|
1079
|
+
return;
|
|
1134
1080
|
}
|
|
1081
|
+
if (this.selectionMode !== "week")
|
|
1082
|
+
return;
|
|
1083
|
+
const { start, end } = this.getWeekRange(cell.date);
|
|
1084
|
+
this.hoverWeekStart = start;
|
|
1085
|
+
this.hoverWeekEnd = end;
|
|
1135
1086
|
}
|
|
1136
1087
|
onDayLeave() {
|
|
1137
1088
|
this.hoverWeekStart = null;
|
|
1138
1089
|
this.hoverWeekEnd = null;
|
|
1139
|
-
this.
|
|
1090
|
+
this.rangeHoverEnd = null;
|
|
1140
1091
|
}
|
|
1141
1092
|
/** Stable identity for day cells so they aren't re-created every change-detection. */
|
|
1142
1093
|
trackByDate = (_, cell) => cell.date.getTime();
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1094
|
+
// ══════════════════════════════════════════════════════════════════════
|
|
1095
|
+
// ── Range Mode Methods (selectionMode === 'range') ──────────────────
|
|
1096
|
+
// ══════════════════════════════════════════════════════════════════════
|
|
1097
|
+
/** Handle day click in range mode. First click = start, second click = end. */
|
|
1098
|
+
selectDayRange(cell) {
|
|
1099
|
+
if (!cell || cell.disabled)
|
|
1100
|
+
return;
|
|
1101
|
+
const clicked = new Date(cell.date.getFullYear(), cell.date.getMonth(), cell.date.getDate());
|
|
1102
|
+
if (this.rangePicking === 'start' || (this.rangeStart && this.rangeEnd)) {
|
|
1103
|
+
// Starting a new range (or restarting after a complete range)
|
|
1104
|
+
this.rangeStart = clicked;
|
|
1105
|
+
this.rangeEnd = null;
|
|
1106
|
+
this.rangePicking = 'end';
|
|
1107
|
+
// Follow click into adjacent month
|
|
1108
|
+
this.displayMonth = clicked.getMonth();
|
|
1109
|
+
this.displayYear = clicked.getFullYear();
|
|
1110
|
+
return; // keep the picker open for the end date
|
|
1111
|
+
}
|
|
1112
|
+
// Picking the end date
|
|
1113
|
+
let start = this.rangeStart;
|
|
1114
|
+
let end = clicked;
|
|
1115
|
+
// Auto-swap if end < start
|
|
1116
|
+
if (end < start) {
|
|
1117
|
+
const tmp = start;
|
|
1118
|
+
start = end;
|
|
1119
|
+
end = tmp;
|
|
1149
1120
|
}
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
return false;
|
|
1163
|
-
if (this.rangeEnd)
|
|
1164
|
-
return this.isSameDay(date, this.rangeEnd);
|
|
1165
|
-
return !!this.rangeStart && !!this.hoverDate && this.isSameDay(date, this.hoverDate);
|
|
1121
|
+
this.rangeStart = start;
|
|
1122
|
+
this.rangeEnd = end;
|
|
1123
|
+
this.rangePicking = 'start';
|
|
1124
|
+
this.rangeHoverEnd = null;
|
|
1125
|
+
this.selectedDate = start; // keep selectedDate in sync for the clear button
|
|
1126
|
+
const out = this.formatRange(start, end);
|
|
1127
|
+
this.inputControl.setValue(out, { emitEvent: false });
|
|
1128
|
+
this.onChangeFn(out);
|
|
1129
|
+
this.onTouchedFn();
|
|
1130
|
+
this.rangeSelected.emit({ start, end });
|
|
1131
|
+
this.dateSelected.emit(start);
|
|
1132
|
+
this.isOpen = false;
|
|
1166
1133
|
}
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1134
|
+
/** Hover handler for range mode — shows preview band while picking end date. */
|
|
1135
|
+
onDayHoverRange(cell) {
|
|
1136
|
+
if (this.rangePicking === 'end' && this.rangeStart) {
|
|
1137
|
+
this.rangeHoverEnd = cell.date;
|
|
1138
|
+
}
|
|
1171
1139
|
}
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
const ordered = this.orderDateRange(this.rangeStart, this.hoverDate);
|
|
1176
|
-
return this.isWithinDayRange(date, ordered.start, ordered.end);
|
|
1140
|
+
/** Format a range as "start - end" using the configured dateFormat. */
|
|
1141
|
+
formatRange(start, end) {
|
|
1142
|
+
return `${this.datePipe.transform(start, this.dateFormat)} - ${this.datePipe.transform(end, this.dateFormat)}`;
|
|
1177
1143
|
}
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1144
|
+
/** writeValue delegate for range mode. */
|
|
1145
|
+
writeValueRange(value) {
|
|
1146
|
+
const raw = String(value);
|
|
1147
|
+
const parts = raw.split(" - ");
|
|
1148
|
+
if (parts.length === 2) {
|
|
1149
|
+
const s = this.parseDate(parts[0].trim());
|
|
1150
|
+
const e = this.parseDate(parts[1].trim());
|
|
1151
|
+
if (s && e) {
|
|
1152
|
+
this.rangeStart = s;
|
|
1153
|
+
this.rangeEnd = e;
|
|
1154
|
+
this.selectedDate = s;
|
|
1155
|
+
this.rangePicking = 'start';
|
|
1156
|
+
this.displayMonth = s.getMonth();
|
|
1157
|
+
this.displayYear = s.getFullYear();
|
|
1158
|
+
this.inputControl.setValue(this.formatRange(s, e), { emitEvent: false });
|
|
1159
|
+
return;
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
// single date fallback — treat as rangeStart only
|
|
1163
|
+
const parsed = this.parseDate(raw);
|
|
1164
|
+
if (parsed) {
|
|
1165
|
+
this.rangeStart = parsed;
|
|
1182
1166
|
this.rangeEnd = null;
|
|
1183
|
-
this.
|
|
1184
|
-
this.
|
|
1185
|
-
this.displayMonth =
|
|
1186
|
-
this.displayYear =
|
|
1187
|
-
this.inputControl.setValue(this.
|
|
1188
|
-
|
|
1167
|
+
this.selectedDate = parsed;
|
|
1168
|
+
this.rangePicking = 'end';
|
|
1169
|
+
this.displayMonth = parsed.getMonth();
|
|
1170
|
+
this.displayYear = parsed.getFullYear();
|
|
1171
|
+
this.inputControl.setValue(this.datePipe.transform(parsed, this.dateFormat), { emitEvent: false });
|
|
1172
|
+
}
|
|
1173
|
+
else {
|
|
1174
|
+
this.rangeStart = null;
|
|
1175
|
+
this.rangeEnd = null;
|
|
1176
|
+
this.selectedDate = null;
|
|
1177
|
+
this.rangePicking = 'start';
|
|
1178
|
+
this.inputControl.setValue("", { emitEvent: false });
|
|
1189
1179
|
}
|
|
1190
|
-
const ordered = this.orderDateRange(this.rangeStart, picked);
|
|
1191
|
-
this.applyDateRange(ordered.start, ordered.end, true);
|
|
1192
|
-
this.selectedDate = ordered.start;
|
|
1193
|
-
this.displayMonth = ordered.start.getMonth();
|
|
1194
|
-
this.displayYear = ordered.start.getFullYear();
|
|
1195
|
-
this.onTouchedFn();
|
|
1196
|
-
this.rangeSelected.emit({ start: ordered.start, end: ordered.end });
|
|
1197
|
-
this.dateSelected.emit(ordered.start);
|
|
1198
|
-
this.closeCalendar();
|
|
1199
1180
|
}
|
|
1200
|
-
|
|
1181
|
+
/** onBlur delegate for range mode. */
|
|
1182
|
+
onBlurRange() {
|
|
1201
1183
|
const raw = (this.inputControl.value || "").trim();
|
|
1202
|
-
const current = this.
|
|
1184
|
+
const current = this.rangeStart && this.rangeEnd
|
|
1185
|
+
? this.formatRange(this.rangeStart, this.rangeEnd)
|
|
1186
|
+
: "";
|
|
1187
|
+
// Unchanged — keep selection
|
|
1203
1188
|
if (raw === current) {
|
|
1204
1189
|
this.blurEvent.emit();
|
|
1205
1190
|
return;
|
|
1206
1191
|
}
|
|
1192
|
+
// Cleared by user
|
|
1207
1193
|
if (!raw) {
|
|
1208
|
-
this.
|
|
1194
|
+
this.rangeStart = null;
|
|
1195
|
+
this.rangeEnd = null;
|
|
1209
1196
|
this.selectedDate = null;
|
|
1197
|
+
this.rangePicking = 'start';
|
|
1198
|
+
this.onChangeFn(null);
|
|
1210
1199
|
this.rangeSelected.emit(null);
|
|
1211
1200
|
this.dateSelected.emit(null);
|
|
1212
1201
|
this.blurEvent.emit();
|
|
1213
1202
|
return;
|
|
1214
1203
|
}
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1204
|
+
// Try to parse what the user typed
|
|
1205
|
+
const parts = raw.split(" - ");
|
|
1206
|
+
if (parts.length === 2) {
|
|
1207
|
+
const s = this.parseDate(parts[0].trim());
|
|
1208
|
+
const e = this.parseDate(parts[1].trim());
|
|
1209
|
+
if (s && e) {
|
|
1210
|
+
const start = s < e ? s : e;
|
|
1211
|
+
const end = s < e ? e : s;
|
|
1212
|
+
this.rangeStart = start;
|
|
1213
|
+
this.rangeEnd = end;
|
|
1214
|
+
this.selectedDate = start;
|
|
1215
|
+
this.rangePicking = 'start';
|
|
1216
|
+
this.displayMonth = start.getMonth();
|
|
1217
|
+
this.displayYear = start.getFullYear();
|
|
1218
|
+
const out = this.formatRange(start, end);
|
|
1219
|
+
this.inputControl.setValue(out, { emitEvent: false });
|
|
1220
|
+
this.onChangeFn(out);
|
|
1221
|
+
this.rangeSelected.emit({ start, end });
|
|
1222
|
+
this.dateSelected.emit(start);
|
|
1223
|
+
this.blurEvent.emit();
|
|
1224
|
+
return;
|
|
1225
|
+
}
|
|
1233
1226
|
}
|
|
1227
|
+
// Invalid — revert
|
|
1234
1228
|
this.inputControl.setValue(current, { emitEvent: false });
|
|
1235
|
-
this.rangeStart = this.committedRangeStart;
|
|
1236
|
-
this.rangeEnd = this.committedRangeEnd;
|
|
1237
|
-
this.selectedDate = this.rangeStart;
|
|
1238
1229
|
this.blurEvent.emit();
|
|
1239
1230
|
}
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
this.
|
|
1244
|
-
this.committedRangeStart = start;
|
|
1245
|
-
this.committedRangeEnd = end;
|
|
1246
|
-
const out = start && end ? this.formatWeek(start, end) : "";
|
|
1247
|
-
this.inputControl.setValue(out, { emitEvent: false });
|
|
1248
|
-
if (emit) {
|
|
1249
|
-
this.onChangeFn(out || null);
|
|
1250
|
-
}
|
|
1251
|
-
}
|
|
1252
|
-
formatInProgressRange(start) {
|
|
1253
|
-
return `${this.datePipe.transform(start, this.dateFormat)} - `;
|
|
1254
|
-
}
|
|
1255
|
-
formatCommittedRangeInput() {
|
|
1256
|
-
if (this.committedRangeStart && this.committedRangeEnd) {
|
|
1257
|
-
return this.formatWeek(this.committedRangeStart, this.committedRangeEnd);
|
|
1258
|
-
}
|
|
1259
|
-
if (this.rangeStart && !this.rangeEnd) {
|
|
1260
|
-
return this.formatInProgressRange(this.rangeStart);
|
|
1261
|
-
}
|
|
1262
|
-
return "";
|
|
1263
|
-
}
|
|
1264
|
-
parseIncomingRange(value) {
|
|
1265
|
-
if (Array.isArray(value) && value.length >= 2) {
|
|
1266
|
-
const start = this.parseDate(value[0]);
|
|
1267
|
-
const end = this.parseDate(value[1]);
|
|
1268
|
-
if (start && end)
|
|
1269
|
-
return this.orderDateRange(start, end);
|
|
1270
|
-
return null;
|
|
1271
|
-
}
|
|
1272
|
-
if (value && typeof value === "object" && !(value instanceof Date) && value.start && value.end) {
|
|
1273
|
-
const start = this.parseDate(value.start);
|
|
1274
|
-
const end = this.parseDate(value.end);
|
|
1275
|
-
if (start && end)
|
|
1276
|
-
return this.orderDateRange(start, end);
|
|
1277
|
-
return null;
|
|
1278
|
-
}
|
|
1279
|
-
if (typeof value === "string") {
|
|
1280
|
-
const parts = value.split(" - ").map((part) => part.trim()).filter(Boolean);
|
|
1281
|
-
if (parts.length === 2) {
|
|
1282
|
-
const start = this.parseDate(parts[0]);
|
|
1283
|
-
const end = this.parseDate(parts[1]);
|
|
1284
|
-
if (start && end)
|
|
1285
|
-
return this.orderDateRange(start, end);
|
|
1286
|
-
}
|
|
1287
|
-
}
|
|
1288
|
-
return null;
|
|
1231
|
+
// ── Range helper predicates ──
|
|
1232
|
+
/** True when `date` matches either rangeStart or rangeEnd (day-level). */
|
|
1233
|
+
isRangeEdge(date) {
|
|
1234
|
+
return this.isSameDay(date, this.rangeStart) || this.isSameDay(date, this.rangeEnd);
|
|
1289
1235
|
}
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
}
|
|
1296
|
-
return { start, end };
|
|
1297
|
-
}
|
|
1298
|
-
startOfDay(d) {
|
|
1299
|
-
return new Date(d.getFullYear(), d.getMonth(), d.getDate());
|
|
1236
|
+
/** True when `date` falls strictly between the finalised rangeStart and rangeEnd. */
|
|
1237
|
+
isInFinalRange(date) {
|
|
1238
|
+
if (!this.rangeStart || !this.rangeEnd)
|
|
1239
|
+
return false;
|
|
1240
|
+
return date > this.rangeStart && date < this.rangeEnd;
|
|
1300
1241
|
}
|
|
1301
|
-
|
|
1302
|
-
|
|
1242
|
+
/** True during the "pick end" phase, for hover preview highlighting. */
|
|
1243
|
+
isInHoverRange(date) {
|
|
1244
|
+
if (this.rangePicking !== 'end' || !this.rangeStart || !this.rangeHoverEnd)
|
|
1245
|
+
return false;
|
|
1246
|
+
const lo = this.rangeStart < this.rangeHoverEnd ? this.rangeStart : this.rangeHoverEnd;
|
|
1247
|
+
const hi = this.rangeStart < this.rangeHoverEnd ? this.rangeHoverEnd : this.rangeStart;
|
|
1248
|
+
return date >= lo && date <= hi;
|
|
1303
1249
|
}
|
|
1250
|
+
/** Day-level equality check (ignores time). */
|
|
1304
1251
|
isSameDay(a, b) {
|
|
1305
|
-
|
|
1306
|
-
}
|
|
1307
|
-
isWithinDayRange(date, start, end) {
|
|
1308
|
-
const key = this.toDayKey(date);
|
|
1309
|
-
return key >= this.toDayKey(start) && key <= this.toDayKey(end);
|
|
1310
|
-
}
|
|
1311
|
-
rangeCoversMonth(year, monthIndex) {
|
|
1312
|
-
if (!this.rangeStart)
|
|
1313
|
-
return false;
|
|
1314
|
-
const start = this.rangeStart;
|
|
1315
|
-
const end = this.rangeEnd || this.rangeStart;
|
|
1316
|
-
const monthStart = new Date(year, monthIndex, 1);
|
|
1317
|
-
const monthEnd = new Date(year, monthIndex + 1, 0);
|
|
1318
|
-
return this.toDayKey(start) <= this.toDayKey(monthEnd) && this.toDayKey(end) >= this.toDayKey(monthStart);
|
|
1319
|
-
}
|
|
1320
|
-
rangeCoversYear(year) {
|
|
1321
|
-
if (!this.rangeStart)
|
|
1252
|
+
if (!b)
|
|
1322
1253
|
return false;
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
}
|
|
1327
|
-
restoreIncompleteRange() {
|
|
1328
|
-
if (this.selectionMode !== "range")
|
|
1329
|
-
return;
|
|
1330
|
-
if (!this.rangeStart || this.rangeEnd)
|
|
1331
|
-
return;
|
|
1332
|
-
this.rangeStart = this.committedRangeStart;
|
|
1333
|
-
this.rangeEnd = this.committedRangeEnd;
|
|
1334
|
-
this.hoverDate = null;
|
|
1335
|
-
this.selectedDate = this.rangeStart;
|
|
1336
|
-
const out = this.committedRangeStart && this.committedRangeEnd
|
|
1337
|
-
? this.formatWeek(this.committedRangeStart, this.committedRangeEnd)
|
|
1338
|
-
: "";
|
|
1339
|
-
this.inputControl.setValue(out, { emitEvent: false });
|
|
1254
|
+
return a.getFullYear() === b.getFullYear() &&
|
|
1255
|
+
a.getMonth() === b.getMonth() &&
|
|
1256
|
+
a.getDate() === b.getDate();
|
|
1340
1257
|
}
|
|
1341
1258
|
// month
|
|
1342
1259
|
goToMonthView() {
|
|
@@ -1378,9 +1295,6 @@ class CalendarControl {
|
|
|
1378
1295
|
return this.months[this.displayMonth];
|
|
1379
1296
|
}
|
|
1380
1297
|
isMonthSelected(monthIndex) {
|
|
1381
|
-
if (this.selectionMode === "range") {
|
|
1382
|
-
return this.rangeCoversMonth(this.displayYear, monthIndex);
|
|
1383
|
-
}
|
|
1384
1298
|
return (!!this.selectedDate &&
|
|
1385
1299
|
this.selectedDate.getFullYear() === this.displayYear &&
|
|
1386
1300
|
this.selectedDate.getMonth() === monthIndex);
|
|
@@ -1389,9 +1303,6 @@ class CalendarControl {
|
|
|
1389
1303
|
return this.todayYear === this.displayYear && this.todayMonth === monthIndex;
|
|
1390
1304
|
}
|
|
1391
1305
|
isYearSelected(year) {
|
|
1392
|
-
if (this.selectionMode === "range") {
|
|
1393
|
-
return this.rangeCoversYear(year);
|
|
1394
|
-
}
|
|
1395
1306
|
return !!this.selectedDate && this.selectedDate.getFullYear() === year;
|
|
1396
1307
|
}
|
|
1397
1308
|
isYearCurrent(year) {
|
|
@@ -1693,9 +1604,6 @@ class CalendarControl {
|
|
|
1693
1604
|
}
|
|
1694
1605
|
}
|
|
1695
1606
|
else {
|
|
1696
|
-
if (this.selectionMode === "range") {
|
|
1697
|
-
this.restoreIncompleteRange();
|
|
1698
|
-
}
|
|
1699
1607
|
this.destroyPopper();
|
|
1700
1608
|
}
|
|
1701
1609
|
}
|
|
@@ -1706,18 +1614,10 @@ class CalendarControl {
|
|
|
1706
1614
|
}
|
|
1707
1615
|
clickOutside(event) {
|
|
1708
1616
|
if (!this.rootElement.nativeElement.contains(event.target) && this.isOpen) {
|
|
1709
|
-
|
|
1710
|
-
this.closeCalendar();
|
|
1711
|
-
}
|
|
1712
|
-
else {
|
|
1713
|
-
this.isOpen = false;
|
|
1714
|
-
}
|
|
1617
|
+
this.isOpen = false;
|
|
1715
1618
|
}
|
|
1716
1619
|
}
|
|
1717
1620
|
closeCalendar() {
|
|
1718
|
-
if (this.selectionMode === "range") {
|
|
1719
|
-
this.restoreIncompleteRange();
|
|
1720
|
-
}
|
|
1721
1621
|
this.destroyPopper();
|
|
1722
1622
|
this.isOpen = false;
|
|
1723
1623
|
if (CalendarControl._currentlyOpen === this) {
|
|
@@ -1730,7 +1630,11 @@ class CalendarControl {
|
|
|
1730
1630
|
this.selectedDate = null;
|
|
1731
1631
|
this.selectedWeekStart = null;
|
|
1732
1632
|
this.selectedWeekEnd = null;
|
|
1733
|
-
|
|
1633
|
+
// Clear range state
|
|
1634
|
+
this.rangeStart = null;
|
|
1635
|
+
this.rangeEnd = null;
|
|
1636
|
+
this.rangeHoverEnd = null;
|
|
1637
|
+
this.rangePicking = 'start';
|
|
1734
1638
|
if (this._minDate) {
|
|
1735
1639
|
const parsed = new Date(this._minDate);
|
|
1736
1640
|
if (!isNaN(parsed.getTime())) {
|
|
@@ -1753,7 +1657,7 @@ class CalendarControl {
|
|
|
1753
1657
|
this.onChangeFn(null);
|
|
1754
1658
|
this.onTouchedFn();
|
|
1755
1659
|
this.dateSelected.emit(null);
|
|
1756
|
-
if (this.
|
|
1660
|
+
if (this.selectionMode === "week")
|
|
1757
1661
|
this.weekSelected.emit(null);
|
|
1758
1662
|
if (this.selectionMode === "range")
|
|
1759
1663
|
this.rangeSelected.emit(null);
|
|
@@ -1766,7 +1670,7 @@ class CalendarControl {
|
|
|
1766
1670
|
useExisting: forwardRef(() => CalendarControl),
|
|
1767
1671
|
multi: true,
|
|
1768
1672
|
},
|
|
1769
|
-
], viewQueries: [{ propertyName: "rootElement", first: true, predicate: ["root"], descendants: true, static: true }, { propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, static: true }, { propertyName: "datePickerEl", first: true, predicate: ["datePicker"], descendants: true }], ngImport: i0, template: "<div class=\"form-group calendar\" [ngClass]=\"customClass\" [class.readonly]=\"readonly\" [class.disabled]=\"disabled\" #root\r\n (click)=\"openCalendar()\">\r\n <label class=\"inp-label\" [ngClass]=\"{'required' : required}\" *ngIf=\"title\">{{ title }}</label>\r\n <input type=\"text\" #inputEl [placeholder]=\"placeholder\" [formControl]=\"inputControl\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': error }\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" [readonly]=\"readonly\"\r\n (click)=\"openCalendar(); $event.stopPropagation()\" (keydown)=\"onInputKeydown($event)\" />\r\n\r\n <span class=\"focus-border\" *ngIf=\"deFocus\"></span>\r\n @if(!inputLoader) {\r\n <span class=\"calendar-icon\">\r\n <i class=\"he\" [ngClass]=\"!timeOnly ? 'he-calendar-blank' : 'he-clock'\"></i>\r\n </span>\r\n }\r\n\r\n @if(!inputLoader &&(selectedDate && !disabled && !readonly) && clearVal) {\r\n <label class=\"clear\" (click)=\"clearDate($event)\">\r\n <i class=\"he he-close\"></i>\r\n </label>\r\n }\r\n\r\n @if(inputLoader) {\r\n <label class=\"loader input-loader\"></label>\r\n }\r\n @if(error) {\r\n <div class=\"val-msg\">{{ errorMessage }}</div>\r\n }\r\n\r\n <div class=\"datepicker-group\" #datePicker *ngIf=\"isOpen\" (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- time picker -->\r\n <ng-container *ngIf=\"timeOnly\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{ ((selectedHour % 12) || 12) | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">\r\n {{ selectedHour | number:'2.0' }}\r\n </div>\r\n </ng-template>\r\n\r\n <button (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <div class=\"time-value\">{{ selectedMinute | number:'2.0' }}</div>\r\n <button (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- day view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'day'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevMonth()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToMonthView()\">\r\n <div>{{ displayMonthName }}</div>\r\n <div>{{ displayYear }}</div>\r\n </div>\r\n <button class=\"calendar-arrow\" (click)=\"nextMonth()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"week-header\">\r\n <div>Sun</div>\r\n <div>Mon</div>\r\n <div>Tue</div>\r\n <div>Wed</div>\r\n <div>Thu</div>\r\n <div>Fri</div>\r\n <div>Sat</div>\r\n </div>\r\n <div class=\"days-grid\" [class.week-mode]=\"isWeekLikeMode\"\r\n [class.range-mode]=\"selectionMode === 'range'\" (mouseleave)=\"onDayLeave()\">\r\n <div class=\"day-cell\" *ngFor=\"let cell of daysInMonth; trackBy: trackByDate\" (click)=\"selectDay(cell)\"\r\n (mouseenter)=\"onDayHover(cell)\" (mouseleave)=\"onDayLeave()\"\r\n [class.other-month]=\"cell.otherMonth\"\r\n [class.disabled]=\"cell.disabled\"\r\n [class.selected]=\"cell.selected\"\r\n [class.week-hover]=\"isInHoverWeek(cell.date)\"\r\n [class.range-start]=\"isRangeStart(cell.date)\"\r\n [class.range-end]=\"isRangeEnd(cell.date)\"\r\n [class.in-range]=\"isInSelectedRange(cell.date)\"\r\n [class.range-hover]=\"isInHoverRange(cell.date)\"\r\n [class.today]=\"cell.today\">\r\n {{ cell.day }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showTime\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{\r\n selectedHour % 12 === 0\r\n ? 12\r\n : selectedHour % 12\r\n | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">{{ selectedHour | number:'2.0' }}</div>\r\n </ng-template>\r\n <button type=\"button\" (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <div class=\"time-value\">\r\n {{ selectedMinute < 10 ? '0' +selectedMinute : selectedMinute }} </div>\r\n <button type=\"button\" (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- month view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'month'\">\r\n <div class=\"header\" *ngIf=\"viewMode !== 'month'\">\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear - 1\"><i\r\n class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToYearRangeView()\">{{ displayYear }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear + 1\"><i\r\n class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"month-grid\">\r\n <div class=\"month-cell\" *ngFor=\"let m of months; index as i\" (click)=\"selectMonth(i)\"\r\n [class.selected]=\"isMonthSelected(i)\" [class.today]=\"isMonthCurrent(i)\">{{ m }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- year range view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'yearRange'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevYearRange()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\">{{ yearRange[0] }} ~ {{ yearRange[yearRangeSize-1] }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"nextYearRange()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"year-grid\">\r\n <div class=\"year-cell\" *ngFor=\"let y of yearRange\" (click)=\"selectYear(y)\"\r\n [class.selected]=\"isYearSelected(y)\" [class.today]=\"isYearCurrent(y)\">{{ y }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n</div>", styles: [".form-group.calendar{position:relative}.form-group.calendar .datepicker-group{left:0;width:100%;z-index:1000;padding:.5rem;color:#495057;min-width:240px;max-width:260px;border-radius:3px;background:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.form-group.calendar .datepicker-group .header{display:flex;font-weight:600;padding:5px;align-items:center;justify-content:space-between;border-bottom:1px solid #dee2e6}.form-group.calendar .datepicker-group .header .title{gap:8px;display:flex;font-size:15px;cursor:pointer;font-weight:600}.form-group.calendar .datepicker-group .header .calendar-arrow{width:28px;height:28px;border:none;line-height:1;cursor:pointer;background:none}.form-group.calendar .datepicker-group .header .calendar-arrow i{font-size:14px}.form-group.calendar .datepicker-group .header .calendar-arrow:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .week-header{display:grid;padding:8px 0;font-size:13px;font-weight:700;text-align:center;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid,.form-group.calendar .datepicker-group .month-grid,.form-group.calendar .datepicker-group .year-grid{gap:3px;padding:5px;display:grid;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{display:flex;font-size:14px;cursor:pointer;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .days-grid .day-cell.today,.form-group.calendar .datepicker-group .days-grid .month-cell.today,.form-group.calendar .datepicker-group .days-grid .year-cell.today,.form-group.calendar .datepicker-group .month-grid .day-cell.today,.form-group.calendar .datepicker-group .month-grid .month-cell.today,.form-group.calendar .datepicker-group .month-grid .year-cell.today,.form-group.calendar .datepicker-group .year-grid .day-cell.today,.form-group.calendar .datepicker-group .year-grid .month-cell.today,.form-group.calendar .datepicker-group .year-grid .year-cell.today{color:#37c0b3;font-weight:700;border:1px solid #37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.selected,.form-group.calendar .datepicker-group .days-grid .day-cell:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.selected,.form-group.calendar .datepicker-group .days-grid .month-cell:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.selected,.form-group.calendar .datepicker-group .days-grid .year-cell:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.selected,.form-group.calendar .datepicker-group .month-grid .day-cell:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.selected,.form-group.calendar .datepicker-group .month-grid .month-cell:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.selected,.form-group.calendar .datepicker-group .month-grid .year-cell:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.selected,.form-group.calendar .datepicker-group .year-grid .day-cell:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.selected,.form-group.calendar .datepicker-group .year-grid .month-cell:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.selected,.form-group.calendar .datepicker-group .year-grid .year-cell:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled{color:#e0e0e0;background:none;-webkit-user-select:none;user-select:none;cursor:not-allowed}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today{color:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled:hover{color:#e0e0e0;background:transparent}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .day-cell{padding:5px 2px;border-radius:50%}.form-group.calendar .datepicker-group .days-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .month-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .year-grid .day-cell.other-month:not(.selected):not(:hover){color:#c5c5c5}.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{padding:8px 2px;border-radius:3px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell{border-radius:4px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell.week-hover:not(.selected){color:#0d6f7d;background:#e6f5f3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell{border-radius:4px}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.in-range:not(.range-start):not(.range-end),.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-hover:not(.range-start):not(.range-end){color:#0d6f7d;background:#e6f5f3;border-radius:0}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.other-month.in-range:not(.range-start):not(.range-end),.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.other-month.range-hover:not(.range-start):not(.range-end){color:#0d6f7d}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start,.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-end,.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.selected{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start:not(.range-end){border-radius:4px 0 0 4px}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-end:not(.range-start){border-radius:0 4px 4px 0}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell:hover:not(.disabled):not(.range-start):not(.range-end){color:#0d6f7d;background:#e6f5f3}.form-group.calendar .datepicker-group .month-grid{grid-template-columns:repeat(3,1fr)}.form-group.calendar .datepicker-group .year-grid{grid-template-columns:repeat(4,1fr)}.form-group.calendar .datepicker-group .time-picker{display:flex;-webkit-user-select:none;user-select:none;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle{gap:6px;display:flex;margin-left:1rem;flex-direction:column;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button{cursor:pointer;padding:3px 8px;font-size:.75rem;background:#fff;border:1px solid #cccccc}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button.active{color:#fff;border-color:#37c0b3;background-color:#37c0b3}.form-group.calendar .datepicker-group .time-picker .time-select{display:flex;margin:0 .75rem;align-items:center;flex-direction:column}.form-group.calendar .datepicker-group .time-picker .time-select button{border:none;cursor:pointer;padding:4px 8px;background:transparent}.form-group.calendar .datepicker-group .time-picker .time-select button i{font-size:1rem}.form-group.calendar .datepicker-group .time-picker .time-select button:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .time-picker .time-select .time-value{width:2rem;font-size:1rem;text-align:center;margin:2px 3px 4px}.form-group.calendar .datepicker-group .time-picker .time-separator{line-height:1;font-size:1rem}.form-group.calendar .clear{right:35px}.form-group.calendar.group-sm .clear{top:7px;right:35px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
|
|
1673
|
+
], viewQueries: [{ propertyName: "rootElement", first: true, predicate: ["root"], descendants: true, static: true }, { propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, static: true }, { propertyName: "datePickerEl", first: true, predicate: ["datePicker"], descendants: true }], ngImport: i0, template: "<div class=\"form-group calendar\" [ngClass]=\"customClass\" [class.readonly]=\"readonly\" [class.disabled]=\"disabled\" #root\r\n (click)=\"openCalendar()\">\r\n <label class=\"inp-label\" [ngClass]=\"{'required' : required}\" *ngIf=\"title\">{{ title }}</label>\r\n <input type=\"text\" #inputEl [placeholder]=\"placeholder\" [formControl]=\"inputControl\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': error }\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" [readonly]=\"readonly\"\r\n (click)=\"openCalendar(); $event.stopPropagation()\" (keydown)=\"onInputKeydown($event)\" />\r\n\r\n <span class=\"focus-border\" *ngIf=\"deFocus\"></span>\r\n @if(!inputLoader) {\r\n <span class=\"calendar-icon\">\r\n <i class=\"he\" [ngClass]=\"!timeOnly ? 'he-calendar-blank' : 'he-clock'\"></i>\r\n </span>\r\n }\r\n\r\n @if(!inputLoader &&((selectedDate || rangeStart) && !disabled && !readonly) && clearVal) {\r\n <label class=\"clear\" (click)=\"clearDate($event)\">\r\n <i class=\"he he-close\"></i>\r\n </label>\r\n }\r\n\r\n @if(inputLoader) {\r\n <label class=\"loader input-loader\"></label>\r\n }\r\n @if(error) {\r\n <div class=\"val-msg\">{{ errorMessage }}</div>\r\n }\r\n\r\n <div class=\"datepicker-group\" #datePicker *ngIf=\"isOpen\" (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- time picker -->\r\n <ng-container *ngIf=\"timeOnly\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{ ((selectedHour % 12) || 12) | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">\r\n {{ selectedHour | number:'2.0' }}\r\n </div>\r\n </ng-template>\r\n\r\n <button (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <div class=\"time-value\">{{ selectedMinute | number:'2.0' }}</div>\r\n <button (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- day view (single / week modes) -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'day' && selectionMode !== 'range'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevMonth()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToMonthView()\">\r\n <div>{{ displayMonthName }}</div>\r\n <div>{{ displayYear }}</div>\r\n </div>\r\n <button class=\"calendar-arrow\" (click)=\"nextMonth()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"week-header\">\r\n <div>Sun</div>\r\n <div>Mon</div>\r\n <div>Tue</div>\r\n <div>Wed</div>\r\n <div>Thu</div>\r\n <div>Fri</div>\r\n <div>Sat</div>\r\n </div>\r\n <div class=\"days-grid\" [class.week-mode]=\"selectionMode === 'week'\">\r\n <div class=\"day-cell\" *ngFor=\"let cell of daysInMonth; trackBy: trackByDate\" (click)=\"selectDay(cell)\"\r\n (mouseenter)=\"onDayHover(cell)\" (mouseleave)=\"onDayLeave()\"\r\n [class.other-month]=\"cell.otherMonth\"\r\n [class.disabled]=\"cell.disabled\"\r\n [class.selected]=\"cell.selected\"\r\n [class.week-hover]=\"isInHoverWeek(cell.date)\"\r\n [class.today]=\"cell.today\">\r\n {{ cell.day }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showTime\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{\r\n selectedHour % 12 === 0\r\n ? 12\r\n : selectedHour % 12\r\n | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">{{ selectedHour | number:'2.0' }}</div>\r\n </ng-template>\r\n <button type=\"button\" (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <div class=\"time-value\">\r\n {{ selectedMinute < 10 ? '0' +selectedMinute : selectedMinute }} </div>\r\n <button type=\"button\" (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- day view (range mode) -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'day' && selectionMode === 'range'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevMonth()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToMonthView()\">\r\n <div>{{ displayMonthName }}</div>\r\n <div>{{ displayYear }}</div>\r\n </div>\r\n <button class=\"calendar-arrow\" (click)=\"nextMonth()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"week-header\">\r\n <div>Sun</div>\r\n <div>Mon</div>\r\n <div>Tue</div>\r\n <div>Wed</div>\r\n <div>Thu</div>\r\n <div>Fri</div>\r\n <div>Sat</div>\r\n </div>\r\n <div class=\"days-grid range-mode\">\r\n <div class=\"day-cell\" *ngFor=\"let cell of daysInMonth; trackBy: trackByDate\" (click)=\"selectDay(cell)\"\r\n (mouseenter)=\"onDayHover(cell)\" (mouseleave)=\"onDayLeave()\"\r\n [class.other-month]=\"cell.otherMonth\"\r\n [class.disabled]=\"cell.disabled\"\r\n [class.selected]=\"cell.selected\"\r\n [class.range-start]=\"cell.isRangeStart\"\r\n [class.range-end]=\"cell.isRangeEnd\"\r\n [class.in-range]=\"cell.isInRange\"\r\n [class.range-hover]=\"cell.isInHoverRange\"\r\n [class.today]=\"cell.today\">\r\n {{ cell.day }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- month view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'month'\">\r\n <div class=\"header\" *ngIf=\"viewMode !== 'month'\">\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear - 1\"><i\r\n class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToYearRangeView()\">{{ displayYear }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear + 1\"><i\r\n class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"month-grid\">\r\n <div class=\"month-cell\" *ngFor=\"let m of months; index as i\" (click)=\"selectMonth(i)\"\r\n [class.selected]=\"isMonthSelected(i)\" [class.today]=\"isMonthCurrent(i)\">{{ m }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- year range view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'yearRange'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevYearRange()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\">{{ yearRange[0] }} ~ {{ yearRange[yearRangeSize-1] }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"nextYearRange()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"year-grid\">\r\n <div class=\"year-cell\" *ngFor=\"let y of yearRange\" (click)=\"selectYear(y)\"\r\n [class.selected]=\"isYearSelected(y)\" [class.today]=\"isYearCurrent(y)\">{{ y }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n</div>", styles: [".form-group.calendar{position:relative}.form-group.calendar .datepicker-group{left:0;width:100%;z-index:1000;padding:.5rem;color:#495057;min-width:240px;max-width:260px;border-radius:3px;background:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.form-group.calendar .datepicker-group .header{display:flex;font-weight:600;padding:5px;align-items:center;justify-content:space-between;border-bottom:1px solid #dee2e6}.form-group.calendar .datepicker-group .header .title{gap:8px;display:flex;font-size:15px;cursor:pointer;font-weight:600}.form-group.calendar .datepicker-group .header .calendar-arrow{width:28px;height:28px;border:none;line-height:1;cursor:pointer;background:none}.form-group.calendar .datepicker-group .header .calendar-arrow i{font-size:14px}.form-group.calendar .datepicker-group .header .calendar-arrow:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .week-header{display:grid;padding:8px 0;font-size:13px;font-weight:700;text-align:center;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid,.form-group.calendar .datepicker-group .month-grid,.form-group.calendar .datepicker-group .year-grid{gap:3px;padding:5px;display:grid;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{display:flex;font-size:14px;cursor:pointer;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .days-grid .day-cell.today,.form-group.calendar .datepicker-group .days-grid .month-cell.today,.form-group.calendar .datepicker-group .days-grid .year-cell.today,.form-group.calendar .datepicker-group .month-grid .day-cell.today,.form-group.calendar .datepicker-group .month-grid .month-cell.today,.form-group.calendar .datepicker-group .month-grid .year-cell.today,.form-group.calendar .datepicker-group .year-grid .day-cell.today,.form-group.calendar .datepicker-group .year-grid .month-cell.today,.form-group.calendar .datepicker-group .year-grid .year-cell.today{color:#37c0b3;font-weight:700;border:1px solid #37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.selected,.form-group.calendar .datepicker-group .days-grid .day-cell:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.selected,.form-group.calendar .datepicker-group .days-grid .month-cell:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.selected,.form-group.calendar .datepicker-group .days-grid .year-cell:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.selected,.form-group.calendar .datepicker-group .month-grid .day-cell:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.selected,.form-group.calendar .datepicker-group .month-grid .month-cell:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.selected,.form-group.calendar .datepicker-group .month-grid .year-cell:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.selected,.form-group.calendar .datepicker-group .year-grid .day-cell:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.selected,.form-group.calendar .datepicker-group .year-grid .month-cell:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.selected,.form-group.calendar .datepicker-group .year-grid .year-cell:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled{color:#e0e0e0;background:none;-webkit-user-select:none;user-select:none;cursor:not-allowed}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today{color:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled:hover{color:#e0e0e0;background:transparent}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .day-cell{padding:5px 2px;border-radius:50%}.form-group.calendar .datepicker-group .days-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .month-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .year-grid .day-cell.other-month:not(.selected):not(:hover){color:#c5c5c5}.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{padding:8px 2px;border-radius:3px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell{border-radius:4px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell.week-hover:not(.selected){color:#0d6f7d;background:#e6f5f3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell{border-radius:0}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start{border-radius:50% 0 0 50%;color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-end{border-radius:0 50% 50% 0;color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start.range-end{border-radius:50%}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.in-range:not(.range-start):not(.range-end){background:#e6f5f3;color:#0d6f7d}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-hover:not(.in-range):not(.range-start):not(.range-end):not(.selected){background:#f0faf9;color:#0d6f7d}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.selected:not(.range-start):not(.range-end):not(.in-range){color:#fff;background:#37c0b3;border-radius:50%}.form-group.calendar .datepicker-group .month-grid{grid-template-columns:repeat(3,1fr)}.form-group.calendar .datepicker-group .year-grid{grid-template-columns:repeat(4,1fr)}.form-group.calendar .datepicker-group .time-picker{display:flex;-webkit-user-select:none;user-select:none;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle{gap:6px;display:flex;margin-left:1rem;flex-direction:column;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button{cursor:pointer;padding:3px 8px;font-size:.75rem;background:#fff;border:1px solid #cccccc}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button.active{color:#fff;border-color:#37c0b3;background-color:#37c0b3}.form-group.calendar .datepicker-group .time-picker .time-select{display:flex;margin:0 .75rem;align-items:center;flex-direction:column}.form-group.calendar .datepicker-group .time-picker .time-select button{border:none;cursor:pointer;padding:4px 8px;background:transparent}.form-group.calendar .datepicker-group .time-picker .time-select button i{font-size:1rem}.form-group.calendar .datepicker-group .time-picker .time-select button:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .time-picker .time-select .time-value{width:2rem;font-size:1rem;text-align:center;margin:2px 3px 4px}.form-group.calendar .datepicker-group .time-picker .time-separator{line-height:1;font-size:1rem}.form-group.calendar .clear{right:35px}.form-group.calendar.group-sm .clear{top:7px;right:35px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { kind: "pipe", type: i1.DecimalPipe, name: "number" }] });
|
|
1770
1674
|
}
|
|
1771
1675
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: CalendarControl, decorators: [{
|
|
1772
1676
|
type: Component,
|
|
@@ -1781,7 +1685,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
|
|
|
1781
1685
|
useExisting: forwardRef(() => CalendarControl),
|
|
1782
1686
|
multi: true,
|
|
1783
1687
|
},
|
|
1784
|
-
], template: "<div class=\"form-group calendar\" [ngClass]=\"customClass\" [class.readonly]=\"readonly\" [class.disabled]=\"disabled\" #root\r\n (click)=\"openCalendar()\">\r\n <label class=\"inp-label\" [ngClass]=\"{'required' : required}\" *ngIf=\"title\">{{ title }}</label>\r\n <input type=\"text\" #inputEl [placeholder]=\"placeholder\" [formControl]=\"inputControl\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': error }\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" [readonly]=\"readonly\"\r\n (click)=\"openCalendar(); $event.stopPropagation()\" (keydown)=\"onInputKeydown($event)\" />\r\n\r\n <span class=\"focus-border\" *ngIf=\"deFocus\"></span>\r\n @if(!inputLoader) {\r\n <span class=\"calendar-icon\">\r\n <i class=\"he\" [ngClass]=\"!timeOnly ? 'he-calendar-blank' : 'he-clock'\"></i>\r\n </span>\r\n }\r\n\r\n @if(!inputLoader &&(selectedDate && !disabled && !readonly) && clearVal) {\r\n <label class=\"clear\" (click)=\"clearDate($event)\">\r\n <i class=\"he he-close\"></i>\r\n </label>\r\n }\r\n\r\n @if(inputLoader) {\r\n <label class=\"loader input-loader\"></label>\r\n }\r\n @if(error) {\r\n <div class=\"val-msg\">{{ errorMessage }}</div>\r\n }\r\n\r\n <div class=\"datepicker-group\" #datePicker *ngIf=\"isOpen\" (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- time picker -->\r\n <ng-container *ngIf=\"timeOnly\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{ ((selectedHour % 12) || 12) | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">\r\n {{ selectedHour | number:'2.0' }}\r\n </div>\r\n </ng-template>\r\n\r\n <button (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <div class=\"time-value\">{{ selectedMinute | number:'2.0' }}</div>\r\n <button (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- day view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'day'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevMonth()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToMonthView()\">\r\n <div>{{ displayMonthName }}</div>\r\n <div>{{ displayYear }}</div>\r\n </div>\r\n <button class=\"calendar-arrow\" (click)=\"nextMonth()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"week-header\">\r\n <div>Sun</div>\r\n <div>Mon</div>\r\n <div>Tue</div>\r\n <div>Wed</div>\r\n <div>Thu</div>\r\n <div>Fri</div>\r\n <div>Sat</div>\r\n </div>\r\n <div class=\"days-grid\" [class.week-mode]=\"isWeekLikeMode\"\r\n [class.range-mode]=\"selectionMode === 'range'\" (mouseleave)=\"onDayLeave()\">\r\n <div class=\"day-cell\" *ngFor=\"let cell of daysInMonth; trackBy: trackByDate\" (click)=\"selectDay(cell)\"\r\n (mouseenter)=\"onDayHover(cell)\" (mouseleave)=\"onDayLeave()\"\r\n [class.other-month]=\"cell.otherMonth\"\r\n [class.disabled]=\"cell.disabled\"\r\n [class.selected]=\"cell.selected\"\r\n [class.week-hover]=\"isInHoverWeek(cell.date)\"\r\n [class.range-start]=\"isRangeStart(cell.date)\"\r\n [class.range-end]=\"isRangeEnd(cell.date)\"\r\n [class.in-range]=\"isInSelectedRange(cell.date)\"\r\n [class.range-hover]=\"isInHoverRange(cell.date)\"\r\n [class.today]=\"cell.today\">\r\n {{ cell.day }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showTime\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{\r\n selectedHour % 12 === 0\r\n ? 12\r\n : selectedHour % 12\r\n | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">{{ selectedHour | number:'2.0' }}</div>\r\n </ng-template>\r\n <button type=\"button\" (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <div class=\"time-value\">\r\n {{ selectedMinute < 10 ? '0' +selectedMinute : selectedMinute }} </div>\r\n <button type=\"button\" (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- month view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'month'\">\r\n <div class=\"header\" *ngIf=\"viewMode !== 'month'\">\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear - 1\"><i\r\n class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToYearRangeView()\">{{ displayYear }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear + 1\"><i\r\n class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"month-grid\">\r\n <div class=\"month-cell\" *ngFor=\"let m of months; index as i\" (click)=\"selectMonth(i)\"\r\n [class.selected]=\"isMonthSelected(i)\" [class.today]=\"isMonthCurrent(i)\">{{ m }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- year range view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'yearRange'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevYearRange()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\">{{ yearRange[0] }} ~ {{ yearRange[yearRangeSize-1] }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"nextYearRange()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"year-grid\">\r\n <div class=\"year-cell\" *ngFor=\"let y of yearRange\" (click)=\"selectYear(y)\"\r\n [class.selected]=\"isYearSelected(y)\" [class.today]=\"isYearCurrent(y)\">{{ y }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n</div>", styles: [".form-group.calendar{position:relative}.form-group.calendar .datepicker-group{left:0;width:100%;z-index:1000;padding:.5rem;color:#495057;min-width:240px;max-width:260px;border-radius:3px;background:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.form-group.calendar .datepicker-group .header{display:flex;font-weight:600;padding:5px;align-items:center;justify-content:space-between;border-bottom:1px solid #dee2e6}.form-group.calendar .datepicker-group .header .title{gap:8px;display:flex;font-size:15px;cursor:pointer;font-weight:600}.form-group.calendar .datepicker-group .header .calendar-arrow{width:28px;height:28px;border:none;line-height:1;cursor:pointer;background:none}.form-group.calendar .datepicker-group .header .calendar-arrow i{font-size:14px}.form-group.calendar .datepicker-group .header .calendar-arrow:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .week-header{display:grid;padding:8px 0;font-size:13px;font-weight:700;text-align:center;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid,.form-group.calendar .datepicker-group .month-grid,.form-group.calendar .datepicker-group .year-grid{gap:3px;padding:5px;display:grid;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{display:flex;font-size:14px;cursor:pointer;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .days-grid .day-cell.today,.form-group.calendar .datepicker-group .days-grid .month-cell.today,.form-group.calendar .datepicker-group .days-grid .year-cell.today,.form-group.calendar .datepicker-group .month-grid .day-cell.today,.form-group.calendar .datepicker-group .month-grid .month-cell.today,.form-group.calendar .datepicker-group .month-grid .year-cell.today,.form-group.calendar .datepicker-group .year-grid .day-cell.today,.form-group.calendar .datepicker-group .year-grid .month-cell.today,.form-group.calendar .datepicker-group .year-grid .year-cell.today{color:#37c0b3;font-weight:700;border:1px solid #37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.selected,.form-group.calendar .datepicker-group .days-grid .day-cell:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.selected,.form-group.calendar .datepicker-group .days-grid .month-cell:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.selected,.form-group.calendar .datepicker-group .days-grid .year-cell:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.selected,.form-group.calendar .datepicker-group .month-grid .day-cell:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.selected,.form-group.calendar .datepicker-group .month-grid .month-cell:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.selected,.form-group.calendar .datepicker-group .month-grid .year-cell:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.selected,.form-group.calendar .datepicker-group .year-grid .day-cell:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.selected,.form-group.calendar .datepicker-group .year-grid .month-cell:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.selected,.form-group.calendar .datepicker-group .year-grid .year-cell:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled{color:#e0e0e0;background:none;-webkit-user-select:none;user-select:none;cursor:not-allowed}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today{color:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled:hover{color:#e0e0e0;background:transparent}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .day-cell{padding:5px 2px;border-radius:50%}.form-group.calendar .datepicker-group .days-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .month-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .year-grid .day-cell.other-month:not(.selected):not(:hover){color:#c5c5c5}.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{padding:8px 2px;border-radius:3px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell{border-radius:4px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell.week-hover:not(.selected){color:#0d6f7d;background:#e6f5f3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell{border-radius:4px}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.in-range:not(.range-start):not(.range-end),.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-hover:not(.range-start):not(.range-end){color:#0d6f7d;background:#e6f5f3;border-radius:0}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.other-month.in-range:not(.range-start):not(.range-end),.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.other-month.range-hover:not(.range-start):not(.range-end){color:#0d6f7d}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start,.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-end,.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.selected{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start:not(.range-end){border-radius:4px 0 0 4px}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-end:not(.range-start){border-radius:0 4px 4px 0}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell:hover:not(.disabled):not(.range-start):not(.range-end){color:#0d6f7d;background:#e6f5f3}.form-group.calendar .datepicker-group .month-grid{grid-template-columns:repeat(3,1fr)}.form-group.calendar .datepicker-group .year-grid{grid-template-columns:repeat(4,1fr)}.form-group.calendar .datepicker-group .time-picker{display:flex;-webkit-user-select:none;user-select:none;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle{gap:6px;display:flex;margin-left:1rem;flex-direction:column;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button{cursor:pointer;padding:3px 8px;font-size:.75rem;background:#fff;border:1px solid #cccccc}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button.active{color:#fff;border-color:#37c0b3;background-color:#37c0b3}.form-group.calendar .datepicker-group .time-picker .time-select{display:flex;margin:0 .75rem;align-items:center;flex-direction:column}.form-group.calendar .datepicker-group .time-picker .time-select button{border:none;cursor:pointer;padding:4px 8px;background:transparent}.form-group.calendar .datepicker-group .time-picker .time-select button i{font-size:1rem}.form-group.calendar .datepicker-group .time-picker .time-select button:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .time-picker .time-select .time-value{width:2rem;font-size:1rem;text-align:center;margin:2px 3px 4px}.form-group.calendar .datepicker-group .time-picker .time-separator{line-height:1;font-size:1rem}.form-group.calendar .clear{right:35px}.form-group.calendar.group-sm .clear{top:7px;right:35px}\n"] }]
|
|
1688
|
+
], template: "<div class=\"form-group calendar\" [ngClass]=\"customClass\" [class.readonly]=\"readonly\" [class.disabled]=\"disabled\" #root\r\n (click)=\"openCalendar()\">\r\n <label class=\"inp-label\" [ngClass]=\"{'required' : required}\" *ngIf=\"title\">{{ title }}</label>\r\n <input type=\"text\" #inputEl [placeholder]=\"placeholder\" [formControl]=\"inputControl\" class=\"form-control\"\r\n [ngClass]=\"{ 'is-invalid': error }\" (blur)=\"onBlur()\" (focus)=\"onFocus()\" [readonly]=\"readonly\"\r\n (click)=\"openCalendar(); $event.stopPropagation()\" (keydown)=\"onInputKeydown($event)\" />\r\n\r\n <span class=\"focus-border\" *ngIf=\"deFocus\"></span>\r\n @if(!inputLoader) {\r\n <span class=\"calendar-icon\">\r\n <i class=\"he\" [ngClass]=\"!timeOnly ? 'he-calendar-blank' : 'he-clock'\"></i>\r\n </span>\r\n }\r\n\r\n @if(!inputLoader &&((selectedDate || rangeStart) && !disabled && !readonly) && clearVal) {\r\n <label class=\"clear\" (click)=\"clearDate($event)\">\r\n <i class=\"he he-close\"></i>\r\n </label>\r\n }\r\n\r\n @if(inputLoader) {\r\n <label class=\"loader input-loader\"></label>\r\n }\r\n @if(error) {\r\n <div class=\"val-msg\">{{ errorMessage }}</div>\r\n }\r\n\r\n <div class=\"datepicker-group\" #datePicker *ngIf=\"isOpen\" (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"$event.stopPropagation()\">\r\n\r\n <!-- time picker -->\r\n <ng-container *ngIf=\"timeOnly\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{ ((selectedHour % 12) || 12) | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">\r\n {{ selectedHour | number:'2.0' }}\r\n </div>\r\n </ng-template>\r\n\r\n <button (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\"><i\r\n class=\"he he-chevron-up\"></i></button>\r\n <div class=\"time-value\">{{ selectedMinute | number:'2.0' }}</div>\r\n <button (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\"><i\r\n class=\"he he-chevron-down\"></i></button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- day view (single / week modes) -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'day' && selectionMode !== 'range'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevMonth()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToMonthView()\">\r\n <div>{{ displayMonthName }}</div>\r\n <div>{{ displayYear }}</div>\r\n </div>\r\n <button class=\"calendar-arrow\" (click)=\"nextMonth()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"week-header\">\r\n <div>Sun</div>\r\n <div>Mon</div>\r\n <div>Tue</div>\r\n <div>Wed</div>\r\n <div>Thu</div>\r\n <div>Fri</div>\r\n <div>Sat</div>\r\n </div>\r\n <div class=\"days-grid\" [class.week-mode]=\"selectionMode === 'week'\">\r\n <div class=\"day-cell\" *ngFor=\"let cell of daysInMonth; trackBy: trackByDate\" (click)=\"selectDay(cell)\"\r\n (mouseenter)=\"onDayHover(cell)\" (mouseleave)=\"onDayLeave()\"\r\n [class.other-month]=\"cell.otherMonth\"\r\n [class.disabled]=\"cell.disabled\"\r\n [class.selected]=\"cell.selected\"\r\n [class.week-hover]=\"isInHoverWeek(cell.date)\"\r\n [class.today]=\"cell.today\">\r\n {{ cell.day }}\r\n </div>\r\n </div>\r\n <ng-container *ngIf=\"showTime\">\r\n <div class=\"time-picker\">\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementHour()\" [disabled]=\"!isIncrementHourValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <ng-container *ngIf=\"hourFormat === '12'; else show24\">\r\n <div class=\"time-value\">\r\n {{\r\n selectedHour % 12 === 0\r\n ? 12\r\n : selectedHour % 12\r\n | number:'2.0' }}\r\n </div>\r\n </ng-container>\r\n <ng-template #show24>\r\n <div class=\"time-value\">{{ selectedHour | number:'2.0' }}</div>\r\n </ng-template>\r\n <button type=\"button\" (click)=\"decrementHour()\" [disabled]=\"!isDecrementHourValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <span class=\"time-separator\">:</span>\r\n <div class=\"time-select\">\r\n <button type=\"button\" (click)=\"incrementMinute()\" [disabled]=\"!isIncrementMinuteValid()\">\r\n <i class=\"he he-chevron-up\"></i>\r\n </button>\r\n <div class=\"time-value\">\r\n {{ selectedMinute < 10 ? '0' +selectedMinute : selectedMinute }} </div>\r\n <button type=\"button\" (click)=\"decrementMinute()\" [disabled]=\"!isDecrementMinuteValid()\">\r\n <i class=\"he he-chevron-down\"></i>\r\n </button>\r\n </div>\r\n <div class=\"ampm-toggle\" *ngIf=\"hourFormat === '12'\">\r\n <button type=\"button\" [class.active]=\"meridian === 'AM'\" (click)=\"setMeridian('AM')\">AM</button>\r\n <button type=\"button\" [class.active]=\"meridian === 'PM'\" (click)=\"setMeridian('PM')\">PM</button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- day view (range mode) -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'day' && selectionMode === 'range'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevMonth()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToMonthView()\">\r\n <div>{{ displayMonthName }}</div>\r\n <div>{{ displayYear }}</div>\r\n </div>\r\n <button class=\"calendar-arrow\" (click)=\"nextMonth()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"week-header\">\r\n <div>Sun</div>\r\n <div>Mon</div>\r\n <div>Tue</div>\r\n <div>Wed</div>\r\n <div>Thu</div>\r\n <div>Fri</div>\r\n <div>Sat</div>\r\n </div>\r\n <div class=\"days-grid range-mode\">\r\n <div class=\"day-cell\" *ngFor=\"let cell of daysInMonth; trackBy: trackByDate\" (click)=\"selectDay(cell)\"\r\n (mouseenter)=\"onDayHover(cell)\" (mouseleave)=\"onDayLeave()\"\r\n [class.other-month]=\"cell.otherMonth\"\r\n [class.disabled]=\"cell.disabled\"\r\n [class.selected]=\"cell.selected\"\r\n [class.range-start]=\"cell.isRangeStart\"\r\n [class.range-end]=\"cell.isRangeEnd\"\r\n [class.in-range]=\"cell.isInRange\"\r\n [class.range-hover]=\"cell.isInHoverRange\"\r\n [class.today]=\"cell.today\">\r\n {{ cell.day }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- month view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'month'\">\r\n <div class=\"header\" *ngIf=\"viewMode !== 'month'\">\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear - 1\"><i\r\n class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\" (click)=\"goToYearRangeView()\">{{ displayYear }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"displayYear = displayYear + 1\"><i\r\n class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"month-grid\">\r\n <div class=\"month-cell\" *ngFor=\"let m of months; index as i\" (click)=\"selectMonth(i)\"\r\n [class.selected]=\"isMonthSelected(i)\" [class.today]=\"isMonthCurrent(i)\">{{ m }}\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- year range view -->\r\n <ng-container *ngIf=\"!timeOnly && currentView === 'yearRange'\">\r\n <div class=\"header\">\r\n <button class=\"calendar-arrow\" (click)=\"prevYearRange()\"><i class=\"he he-chevron-left\"></i></button>\r\n <div class=\"title\">{{ yearRange[0] }} ~ {{ yearRange[yearRangeSize-1] }}</div>\r\n <button class=\"calendar-arrow\" (click)=\"nextYearRange()\"><i class=\"he he-chevron-right\"></i></button>\r\n </div>\r\n <div class=\"year-grid\">\r\n <div class=\"year-cell\" *ngFor=\"let y of yearRange\" (click)=\"selectYear(y)\"\r\n [class.selected]=\"isYearSelected(y)\" [class.today]=\"isYearCurrent(y)\">{{ y }}</div>\r\n </div>\r\n </ng-container>\r\n\r\n </div>\r\n</div>", styles: [".form-group.calendar{position:relative}.form-group.calendar .datepicker-group{left:0;width:100%;z-index:1000;padding:.5rem;color:#495057;min-width:240px;max-width:260px;border-radius:3px;background:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.form-group.calendar .datepicker-group .header{display:flex;font-weight:600;padding:5px;align-items:center;justify-content:space-between;border-bottom:1px solid #dee2e6}.form-group.calendar .datepicker-group .header .title{gap:8px;display:flex;font-size:15px;cursor:pointer;font-weight:600}.form-group.calendar .datepicker-group .header .calendar-arrow{width:28px;height:28px;border:none;line-height:1;cursor:pointer;background:none}.form-group.calendar .datepicker-group .header .calendar-arrow i{font-size:14px}.form-group.calendar .datepicker-group .header .calendar-arrow:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .week-header{display:grid;padding:8px 0;font-size:13px;font-weight:700;text-align:center;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid,.form-group.calendar .datepicker-group .month-grid,.form-group.calendar .datepicker-group .year-grid{gap:3px;padding:5px;display:grid;grid-template-columns:repeat(7,1fr)}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{display:flex;font-size:14px;cursor:pointer;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .days-grid .day-cell.today,.form-group.calendar .datepicker-group .days-grid .month-cell.today,.form-group.calendar .datepicker-group .days-grid .year-cell.today,.form-group.calendar .datepicker-group .month-grid .day-cell.today,.form-group.calendar .datepicker-group .month-grid .month-cell.today,.form-group.calendar .datepicker-group .month-grid .year-cell.today,.form-group.calendar .datepicker-group .year-grid .day-cell.today,.form-group.calendar .datepicker-group .year-grid .month-cell.today,.form-group.calendar .datepicker-group .year-grid .year-cell.today{color:#37c0b3;font-weight:700;border:1px solid #37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.selected,.form-group.calendar .datepicker-group .days-grid .day-cell:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.selected,.form-group.calendar .datepicker-group .days-grid .month-cell:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.selected,.form-group.calendar .datepicker-group .days-grid .year-cell:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.selected,.form-group.calendar .datepicker-group .month-grid .day-cell:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.selected,.form-group.calendar .datepicker-group .month-grid .month-cell:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.selected,.form-group.calendar .datepicker-group .month-grid .year-cell:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.selected,.form-group.calendar .datepicker-group .year-grid .day-cell:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.selected,.form-group.calendar .datepicker-group .year-grid .month-cell:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.selected,.form-group.calendar .datepicker-group .year-grid .year-cell:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled{color:#e0e0e0;background:none;-webkit-user-select:none;user-select:none;cursor:not-allowed}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today{color:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled.today:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled.today:hover{color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .days-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .month-grid .year-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .day-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .month-cell.disabled:hover,.form-group.calendar .datepicker-group .year-grid .year-cell.disabled:hover{color:#e0e0e0;background:transparent}.form-group.calendar .datepicker-group .days-grid .day-cell,.form-group.calendar .datepicker-group .month-grid .day-cell,.form-group.calendar .datepicker-group .year-grid .day-cell{padding:5px 2px;border-radius:50%}.form-group.calendar .datepicker-group .days-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .month-grid .day-cell.other-month:not(.selected):not(:hover),.form-group.calendar .datepicker-group .year-grid .day-cell.other-month:not(.selected):not(:hover){color:#c5c5c5}.form-group.calendar .datepicker-group .days-grid .month-cell,.form-group.calendar .datepicker-group .days-grid .year-cell,.form-group.calendar .datepicker-group .month-grid .month-cell,.form-group.calendar .datepicker-group .month-grid .year-cell,.form-group.calendar .datepicker-group .year-grid .month-cell,.form-group.calendar .datepicker-group .year-grid .year-cell{padding:8px 2px;border-radius:3px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell{border-radius:4px}.form-group.calendar .datepicker-group .days-grid.week-mode .day-cell.week-hover:not(.selected){color:#0d6f7d;background:#e6f5f3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell{border-radius:0}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start{border-radius:50% 0 0 50%;color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-end{border-radius:0 50% 50% 0;color:#fff;background:#37c0b3}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-start.range-end{border-radius:50%}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.in-range:not(.range-start):not(.range-end){background:#e6f5f3;color:#0d6f7d}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.range-hover:not(.in-range):not(.range-start):not(.range-end):not(.selected){background:#f0faf9;color:#0d6f7d}.form-group.calendar .datepicker-group .days-grid.range-mode .day-cell.selected:not(.range-start):not(.range-end):not(.in-range){color:#fff;background:#37c0b3;border-radius:50%}.form-group.calendar .datepicker-group .month-grid{grid-template-columns:repeat(3,1fr)}.form-group.calendar .datepicker-group .year-grid{grid-template-columns:repeat(4,1fr)}.form-group.calendar .datepicker-group .time-picker{display:flex;-webkit-user-select:none;user-select:none;align-items:center;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle{gap:6px;display:flex;margin-left:1rem;flex-direction:column;justify-content:center}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button{cursor:pointer;padding:3px 8px;font-size:.75rem;background:#fff;border:1px solid #cccccc}.form-group.calendar .datepicker-group .time-picker .ampm-toggle button.active{color:#fff;border-color:#37c0b3;background-color:#37c0b3}.form-group.calendar .datepicker-group .time-picker .time-select{display:flex;margin:0 .75rem;align-items:center;flex-direction:column}.form-group.calendar .datepicker-group .time-picker .time-select button{border:none;cursor:pointer;padding:4px 8px;background:transparent}.form-group.calendar .datepicker-group .time-picker .time-select button i{font-size:1rem}.form-group.calendar .datepicker-group .time-picker .time-select button:hover{background:#f0f0f0}.form-group.calendar .datepicker-group .time-picker .time-select .time-value{width:2rem;font-size:1rem;text-align:center;margin:2px 3px 4px}.form-group.calendar .datepicker-group .time-picker .time-separator{line-height:1;font-size:1rem}.form-group.calendar .clear{right:35px}.form-group.calendar.group-sm .clear{top:7px;right:35px}\n"] }]
|
|
1785
1689
|
}], ctorParameters: () => [{ type: i1.DatePipe }], propDecorators: { title: [{
|
|
1786
1690
|
type: Input
|
|
1787
1691
|
}], required: [{
|
|
@@ -3011,6 +2915,9 @@ class MultiselectControl {
|
|
|
3011
2915
|
.map((item) => item[this.optionDisplayProperty])
|
|
3012
2916
|
.join(", ");
|
|
3013
2917
|
}
|
|
2918
|
+
// Sync the form control value so the input displays the selected items
|
|
2919
|
+
// (formControl binding overrides [value], so we must set it explicitly)
|
|
2920
|
+
this.inputControl.setValue(this.selectedItemList, { emitEvent: false });
|
|
3014
2921
|
}
|
|
3015
2922
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: MultiselectControl, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
3016
2923
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: MultiselectControl, isStandalone: true, selector: "multiselect-control", inputs: { title: "title", selectedItems: "selectedItems", required: "required", placeholder: "placeholder", customClass: "customClass", clearVal: "clearVal", deFocus: "deFocus", optionValueProperty: "optionValueProperty", inputLoader: "inputLoader", error: "error", errorMessage: "errorMessage", autocomplete: "autocomplete", showSearch: "showSearch", optionDisplayProperty: "optionDisplayProperty", options: "options", readonly: "readonly", disabled: "disabled" }, outputs: { optionsSelected: "optionsSelected", selectionCleared: "selectionCleared", blurEvent: "blurEvent" }, host: { listeners: { "window:keydown": "handleWindowKeydown($event)" } }, providers: [
|