@rivtn/noseur 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +2 -0
  3. package/dist/esm/Template.d.ts +7 -0
  4. package/dist/esm/Template.js +13 -0
  5. package/dist/esm/compose/Composed.css +437 -0
  6. package/dist/esm/compose/exotic/ColorPicker.d.ts +41 -0
  7. package/dist/esm/compose/exotic/ColorPicker.js +85 -0
  8. package/dist/esm/compose/exotic/ColorSlider.d.ts +30 -0
  9. package/dist/esm/compose/exotic/ColorSlider.js +99 -0
  10. package/dist/esm/compose/form/ComposedPassword.d.ts +25 -0
  11. package/dist/esm/compose/form/ComposedPassword.js +103 -0
  12. package/dist/esm/compose/form/DateTimeInput.d.ts +28 -0
  13. package/dist/esm/compose/form/DateTimeInput.js +154 -0
  14. package/dist/esm/compose/form/DateTimePicker.d.ts +341 -0
  15. package/dist/esm/compose/form/DateTimePicker.js +1265 -0
  16. package/dist/esm/compose/form/FormControl.d.ts +33 -0
  17. package/dist/esm/compose/form/FormControl.js +163 -0
  18. package/dist/esm/compose/form/FormGroup.d.ts +14 -0
  19. package/dist/esm/compose/form/FormGroup.js +58 -0
  20. package/dist/esm/compose/overlay/Alert.d.ts +56 -0
  21. package/dist/esm/compose/overlay/Alert.js +267 -0
  22. package/dist/esm/constants/Alignment.d.ts +17 -0
  23. package/dist/esm/constants/Alignment.js +18 -0
  24. package/dist/esm/constants/Direction.d.ts +26 -0
  25. package/dist/esm/constants/Direction.js +22 -0
  26. package/dist/esm/constants/Orientation.d.ts +8 -0
  27. package/dist/esm/constants/Orientation.js +9 -0
  28. package/dist/esm/constants/Scheme.d.ts +39 -0
  29. package/dist/esm/constants/Scheme.js +43 -0
  30. package/dist/esm/constants/Transition.d.ts +81 -0
  31. package/dist/esm/constants/Transition.js +85 -0
  32. package/dist/esm/constants/Types.d.ts +74 -0
  33. package/dist/esm/constants/Types.js +14 -0
  34. package/dist/esm/core/ComponentBaseProps.d.ts +53 -0
  35. package/dist/esm/core/ComponentBaseProps.js +33 -0
  36. package/dist/esm/core/noseur.css +2390 -0
  37. package/dist/esm/data/Column.d.ts +235 -0
  38. package/dist/esm/data/Column.js +98 -0
  39. package/dist/esm/data/Data.css +213 -0
  40. package/dist/esm/data/Data.d.ts +98 -0
  41. package/dist/esm/data/Data.js +142 -0
  42. package/dist/esm/data/List.d.ts +14 -0
  43. package/dist/esm/data/List.js +117 -0
  44. package/dist/esm/data/Table.d.ts +22 -0
  45. package/dist/esm/data/Table.js +236 -0
  46. package/dist/esm/form/Button.d.ts +35 -0
  47. package/dist/esm/form/Button.js +131 -0
  48. package/dist/esm/form/Calendar.d.ts +20 -0
  49. package/dist/esm/form/Calendar.js +46 -0
  50. package/dist/esm/form/Checkbox.d.ts +20 -0
  51. package/dist/esm/form/Checkbox.js +155 -0
  52. package/dist/esm/form/ColorMap.d.ts +22 -0
  53. package/dist/esm/form/ColorMap.js +43 -0
  54. package/dist/esm/form/ColorPalette.d.ts +28 -0
  55. package/dist/esm/form/ColorPalette.js +87 -0
  56. package/dist/esm/form/Dropdown.d.ts +78 -0
  57. package/dist/esm/form/Dropdown.js +360 -0
  58. package/dist/esm/form/FileInput.d.ts +134 -0
  59. package/dist/esm/form/FileInput.js +523 -0
  60. package/dist/esm/form/Form.css +467 -0
  61. package/dist/esm/form/Input.d.ts +45 -0
  62. package/dist/esm/form/Input.js +186 -0
  63. package/dist/esm/form/RadioButton.d.ts +21 -0
  64. package/dist/esm/form/RadioButton.js +178 -0
  65. package/dist/esm/form/Slider.d.ts +21 -0
  66. package/dist/esm/form/Slider.js +163 -0
  67. package/dist/esm/hooks/useSearchParams.d.ts +15 -0
  68. package/dist/esm/hooks/useSearchParams.js +50 -0
  69. package/dist/esm/hooks/useSubscription.d.ts +9 -0
  70. package/dist/esm/hooks/useSubscription.js +26 -0
  71. package/dist/esm/index.d.ts +60 -0
  72. package/dist/esm/index.js +73 -0
  73. package/dist/esm/layout/GridView.d.ts +23 -0
  74. package/dist/esm/layout/GridView.js +34 -0
  75. package/dist/esm/layout/Layout.css +5 -0
  76. package/dist/esm/misc/Misc.css +164 -0
  77. package/dist/esm/misc/ProgressBar.d.ts +22 -0
  78. package/dist/esm/misc/ProgressBar.js +86 -0
  79. package/dist/esm/overlay/Dialog.d.ts +46 -0
  80. package/dist/esm/overlay/Dialog.js +290 -0
  81. package/dist/esm/overlay/Message.d.ts +35 -0
  82. package/dist/esm/overlay/Message.js +187 -0
  83. package/dist/esm/overlay/Overlay.css +382 -0
  84. package/dist/esm/overlay/Popover.d.ts +30 -0
  85. package/dist/esm/overlay/Popover.js +245 -0
  86. package/dist/esm/overlay/Portal.d.ts +11 -0
  87. package/dist/esm/overlay/Portal.js +29 -0
  88. package/dist/esm/overlay/Toast.d.ts +49 -0
  89. package/dist/esm/overlay/Toast.js +341 -0
  90. package/dist/esm/panel/Accordion.d.ts +26 -0
  91. package/dist/esm/panel/Accordion.js +127 -0
  92. package/dist/esm/panel/Panel.css +317 -0
  93. package/dist/esm/panel/Panel.d.ts +43 -0
  94. package/dist/esm/panel/Panel.js +125 -0
  95. package/dist/esm/panel/ScrollPanel.d.ts +27 -0
  96. package/dist/esm/panel/ScrollPanel.js +43 -0
  97. package/dist/esm/panel/TabPane.d.ts +82 -0
  98. package/dist/esm/panel/TabPane.js +237 -0
  99. package/dist/esm/presentation/Chart.d.ts +49 -0
  100. package/dist/esm/presentation/Chart.js +62 -0
  101. package/dist/esm/presentation/Paginator.d.ts +90 -0
  102. package/dist/esm/presentation/Paginator.js +331 -0
  103. package/dist/esm/presentation/Presentation.css +23 -0
  104. package/dist/esm/sensor/DragSensor.d.ts +50 -0
  105. package/dist/esm/sensor/DragSensor.js +156 -0
  106. package/dist/esm/sensor/ViewportSensor.d.ts +18 -0
  107. package/dist/esm/sensor/ViewportSensor.js +85 -0
  108. package/dist/esm/utils/BoolHelper.d.ts +13 -0
  109. package/dist/esm/utils/BoolHelper.js +105 -0
  110. package/dist/esm/utils/Classname.d.ts +9 -0
  111. package/dist/esm/utils/Classname.js +20 -0
  112. package/dist/esm/utils/ColorHelper.d.ts +127 -0
  113. package/dist/esm/utils/ColorHelper.js +198 -0
  114. package/dist/esm/utils/DOMUtils.d.ts +142 -0
  115. package/dist/esm/utils/DOMUtils.js +759 -0
  116. package/dist/esm/utils/DateHelper.d.ts +115 -0
  117. package/dist/esm/utils/DateHelper.js +338 -0
  118. package/dist/esm/utils/Debugger.d.ts +12 -0
  119. package/dist/esm/utils/Debugger.js +30 -0
  120. package/dist/esm/utils/FileHelper.d.ts +8 -0
  121. package/dist/esm/utils/FileHelper.js +65 -0
  122. package/dist/esm/utils/FunctionStackManager.d.ts +13 -0
  123. package/dist/esm/utils/FunctionStackManager.js +59 -0
  124. package/dist/esm/utils/InputHelper.d.ts +37 -0
  125. package/dist/esm/utils/InputHelper.js +70 -0
  126. package/dist/esm/utils/MicroBuilder.d.ts +24 -0
  127. package/dist/esm/utils/MicroBuilder.js +61 -0
  128. package/dist/esm/utils/ObjectHelper.d.ts +51 -0
  129. package/dist/esm/utils/ObjectHelper.js +334 -0
  130. package/dist/esm/utils/StringHelper.d.ts +10 -0
  131. package/dist/esm/utils/StringHelper.js +54 -0
  132. package/dist/esm/utils/Subscriber.d.ts +14 -0
  133. package/dist/esm/utils/Subscriber.js +27 -0
  134. package/dist/esm/utils/Timer.d.ts +32 -0
  135. package/dist/esm/utils/Timer.js +68 -0
  136. package/dist/esm/utils/TypeChecker.d.ts +12 -0
  137. package/dist/esm/utils/TypeChecker.js +38 -0
  138. package/package.json +63 -0
@@ -0,0 +1,1265 @@
1
+ import "../Composed.css";
2
+ import React from 'react';
3
+ import { Scheme } from "../../constants/Scheme";
4
+ import { DOMHelper } from "../../utils/DOMUtils";
5
+ import { Classname } from "../../utils/Classname";
6
+ import { BoolHelper } from "../../utils/BoolHelper";
7
+ import { TypeChecker } from "../../utils/TypeChecker";
8
+ import { ObjectHelper } from "../../utils/ObjectHelper";
9
+ import { buildButtonControl } from "../../form/Button";
10
+ import { Dialog } from "../../overlay/Dialog";
11
+ import { Popover } from "../../overlay/Popover";
12
+ import { DateHelper, Month, Weekday } from "../../utils/DateHelper";
13
+ import { ComponentRenderType, addClassesToComponentElementBasicAttributes } from "../../core/ComponentBaseProps";
14
+ // TODO multiple date multiple time
15
+ // TODO date range, time range too
16
+ export var DateTimePickerMode;
17
+ (function (DateTimePickerMode) {
18
+ DateTimePickerMode[DateTimePickerMode["YEAR"] = 0] = "YEAR";
19
+ DateTimePickerMode[DateTimePickerMode["MONTH"] = 1] = "MONTH";
20
+ DateTimePickerMode[DateTimePickerMode["DATETIME"] = 2] = "DATETIME";
21
+ })(DateTimePickerMode || (DateTimePickerMode = {}));
22
+ export var DateTimePickerSelectionMode;
23
+ (function (DateTimePickerSelectionMode) {
24
+ DateTimePickerSelectionMode[DateTimePickerSelectionMode["RANGE"] = 0] = "RANGE";
25
+ DateTimePickerSelectionMode[DateTimePickerSelectionMode["SINGLE"] = 1] = "SINGLE";
26
+ DateTimePickerSelectionMode[DateTimePickerSelectionMode["MULTIPLE"] = 2] = "MULTIPLE";
27
+ })(DateTimePickerSelectionMode || (DateTimePickerSelectionMode = {}));
28
+ export const DateTimePickerWeekdayIndex = [
29
+ Weekday.SUNDAY,
30
+ Weekday.MONDAY,
31
+ Weekday.TUESDAY,
32
+ Weekday.WEDNESDAY,
33
+ Weekday.THURSDAY,
34
+ Weekday.FRIDAY,
35
+ Weekday.SATURDAY,
36
+ ];
37
+ export const MonthIndex = [
38
+ Month.JANUARY,
39
+ Month.FEBRUARY,
40
+ Month.MARCH,
41
+ Month.APRIL,
42
+ Month.MAY,
43
+ Month.JUNE,
44
+ Month.JULY,
45
+ Month.AUGUST,
46
+ Month.SEPTEMBER,
47
+ Month.OCTOBER,
48
+ Month.NOVEMBER,
49
+ Month.DECEMBER,
50
+ ];
51
+ export var DateTimePickerLayoutElement;
52
+ (function (DateTimePickerLayoutElement) {
53
+ DateTimePickerLayoutElement["DashElement"] = "[d]";
54
+ DateTimePickerLayoutElement["SpaceElement"] = "[s]";
55
+ DateTimePickerLayoutElement["RowDividerElement"] = "[-]";
56
+ DateTimePickerLayoutElement["NowElement"] = "NowElement";
57
+ DateTimePickerLayoutElement["OpenRowGroupElement"] = "{";
58
+ DateTimePickerLayoutElement["DayElement"] = "DayElement";
59
+ DateTimePickerLayoutElement["CloseRowGroupElement"] = "}";
60
+ DateTimePickerLayoutElement["YearElement"] = "YearElement";
61
+ DateTimePickerLayoutElement["TimeElement"] = "TimeElement";
62
+ DateTimePickerLayoutElement["DateElement"] = "DateElement";
63
+ DateTimePickerLayoutElement["NextElement"] = "NextElement";
64
+ DateTimePickerLayoutElement["HourElement"] = "HourElement";
65
+ DateTimePickerLayoutElement["PanelSeparatorElement"] = "|";
66
+ DateTimePickerLayoutElement["ColumnDividerElement"] = "[|]";
67
+ DateTimePickerLayoutElement["SpaceLeftRightElement"] = "<>";
68
+ DateTimePickerLayoutElement["OpenColumnGroupElement"] = "<";
69
+ DateTimePickerLayoutElement["CloseColumnGroupElement"] = ">";
70
+ DateTimePickerLayoutElement["DaysElements"] = "DaysElements";
71
+ DateTimePickerLayoutElement["MonthElement"] = "MonthElement";
72
+ DateTimePickerLayoutElement["TodayElement"] = "TodayElement";
73
+ DateTimePickerLayoutElement["ClearElement"] = "ClearElement";
74
+ DateTimePickerLayoutElement["SelectElement"] = "SelectElement";
75
+ DateTimePickerLayoutElement["YearsElements"] = "YearsElements";
76
+ DateTimePickerLayoutElement["HeaderElement"] = "HeaderElement";
77
+ DateTimePickerLayoutElement["FooterElement"] = "FooterElement";
78
+ DateTimePickerLayoutElement["TimeSeparator"] = "TimeSeparator";
79
+ DateTimePickerLayoutElement["YearToElement"] = "YearToElement";
80
+ DateTimePickerLayoutElement["WeekDayElement"] = "WeekDayElement";
81
+ DateTimePickerLayoutElement["MonthsElements"] = "MonthsElements";
82
+ DateTimePickerLayoutElement["MinutesElement"] = "MinutesElement";
83
+ DateTimePickerLayoutElement["SecondsElement"] = "SecondsElement";
84
+ DateTimePickerLayoutElement["YearFromElement"] = "YearFromElement";
85
+ DateTimePickerLayoutElement["TopPanelElement"] = "TopPanelElement";
86
+ DateTimePickerLayoutElement["MeridianElement"] = "MeridianElement";
87
+ DateTimePickerLayoutElement["ThisYearElement"] = "ThisYearElement";
88
+ DateTimePickerLayoutElement["LastYearElement"] = "LastYearElement";
89
+ DateTimePickerLayoutElement["PreviousElement"] = "PreviousElement";
90
+ DateTimePickerLayoutElement["SelectionElement"] = "SelectionElement";
91
+ DateTimePickerLayoutElement["WeekdaysElements"] = "WeekdaysElements";
92
+ DateTimePickerLayoutElement["ThisMonthElement"] = "ThisMonthElement";
93
+ DateTimePickerLayoutElement["LastMonthElement"] = "LastMonthElement";
94
+ DateTimePickerLayoutElement["NextMonthElement"] = "NextMonthElement";
95
+ DateTimePickerLayoutElement["IncrementElement"] = "IncrementElement";
96
+ DateTimePickerLayoutElement["DecrementElement"] = "DecrementElement";
97
+ DateTimePickerLayoutElement["YesterdayElement"] = "YesterdayElement";
98
+ DateTimePickerLayoutElement["LeftPanelElement"] = "LeftPanelElement";
99
+ DateTimePickerLayoutElement["TodayDateElement"] = "TodayDateElement";
100
+ DateTimePickerLayoutElement["MainLayoutElement"] = "MainLayoutElement";
101
+ DateTimePickerLayoutElement["RightPanelElement"] = "RightPanelElement";
102
+ DateTimePickerLayoutElement["TodaysDateElement"] = "TodaysDateElement";
103
+ DateTimePickerLayoutElement["BottomPanelElement"] = "BottomPanelElement";
104
+ DateTimePickerLayoutElement["DateRangesElements"] = "DateRangesElements";
105
+ DateTimePickerLayoutElement["CustomHeaderElement"] = "CustomHeaderElement";
106
+ DateTimePickerLayoutElement["CustomFooterElement"] = "CustomFooterElement";
107
+ DateTimePickerLayoutElement["SelectedDateElement"] = "SelectedDateElement";
108
+ DateTimePickerLayoutElement["PreviousMonthElement"] = "PreviousMonthElement";
109
+ DateTimePickerLayoutElement["LastSevenDaysElement"] = "LastSevenDaysElement";
110
+ DateTimePickerLayoutElement["LastThirtyDaysElement"] = "LastThirtyDaysElement";
111
+ DateTimePickerLayoutElement["SelectedDatesElements"] = "SelectedDatesElements";
112
+ DateTimePickerLayoutElement["YearModeHeaderElement"] = "YearModeHeaderElement";
113
+ DateTimePickerLayoutElement["YearModeFooterElement"] = "YearModeFooterElement";
114
+ DateTimePickerLayoutElement["MonthModeHeaderElement"] = "MonthModeHeaderElement";
115
+ DateTimePickerLayoutElement["MonthModeFooterElement"] = "MonthModeFooterElement";
116
+ })(DateTimePickerLayoutElement || (DateTimePickerLayoutElement = {}));
117
+ export var DateTimePickerLayout;
118
+ (function (DateTimePickerLayout) {
119
+ DateTimePickerLayout["DEFAULT_SELECTION_LAYOUT"] = "SelectedDatesElements";
120
+ DateTimePickerLayout["DEFAULT_FOOTER_LAYOUT"] = "TodayDateElement <> ClearElement SelectElement";
121
+ DateTimePickerLayout["DEFAULT_MONTH_MODE_HEADER_LAYOUT"] = "PreviousElement <> YearElement <> NextElement";
122
+ DateTimePickerLayout["DEFAULT_YEAR_MODE_LAYOUT"] = "YearModeHeaderElement YearsElements YearModeFooterElement";
123
+ DateTimePickerLayout["DEFAULT_MONTH_MODE_LAYOUT"] = "MonthModeHeaderElement MonthsElements MonthModeFooterElement";
124
+ DateTimePickerLayout["DEFAULT_HEADER_LAYOUT"] = "PreviousElement <> MonthElement YearElement <> NextElement";
125
+ DateTimePickerLayout["DEFAULT_YEAR_MODE_HEADER_LAYOUT"] = "PreviousElement <> YearFromElement [s] [d] [s] YearToElement <> NextElement";
126
+ DateTimePickerLayout["DEFAULT_LAYOUT"] = "TopPanelElement [-] LeftPanelElement [|] HeaderElement WeekdaysElements DaysElements TimeElement FooterElement [|] RightPanelElement [-] BottomPanelElement";
127
+ DateTimePickerLayout["DEFAULT_TIME_LAYOUT"] = "< IncrementElement HourElement DecrementElement > TimeSeparator < IncrementElement MinutesElement DecrementElement > TimeSeparator < IncrementElement MeridianElement DecrementElement >";
128
+ DateTimePickerLayout["FINE_LEFT_LAYOUT"] = "TodayElement YesterdayElement LastSevenDaysElement LastThirtyDaysElement ThisMonthElement LastMonthElement ThisYearElement LastYearElement";
129
+ DateTimePickerLayout["TIME_LAYOUT_WITHOUT_MERIDIAN"] = "< IncrementElement HourElement DecrementElement > TimeSeparator < IncrementElement MinutesElement DecrementElement >";
130
+ DateTimePickerLayout["TIME_LAYOUT_WITH_SECONDS_WITHOUT_MERIDIAN"] = "< IncrementElement HourElement DecrementElement > TimeSeparator < IncrementElement MinutesElement DecrementElement > TimeSeparator < IncrementElement SecondsElement DecrementElement >";
131
+ DateTimePickerLayout["TIME_LAYOUT_WITH_SECONDS"] = "< IncrementElement HourElement DecrementElement > TimeSeparator < IncrementElement MinutesElement DecrementElement > TimeSeparator < IncrementElement SecondsElement DecrementElement > TimeSeparator < IncrementElement MeridianElement DecrementElement >";
132
+ })(DateTimePickerLayout || (DateTimePickerLayout = {}));
133
+ export const DateTimePickerDefaultProps = {
134
+ topLayout: "",
135
+ attrsRelay: {},
136
+ leftLayout: "",
137
+ rightLayout: "",
138
+ bottomLayout: "",
139
+ date: new Date(),
140
+ enabledYears: [],
141
+ enabledDates: [],
142
+ numberOfMonth: 1,
143
+ hourFormat: "12",
144
+ locale: "default",
145
+ selectedDates: [],
146
+ disabledYears: [],
147
+ enabledMonths: [],
148
+ disabledDates: [],
149
+ disabledMonths: [],
150
+ enabledWeekdays: [],
151
+ disabledWeekdays: [],
152
+ modeDifferenceCount: 12,
153
+ scheme: Scheme.SECONDARY,
154
+ yearModeFooterLayout: "",
155
+ monthModeFooterLayout: "",
156
+ idleScheme: Scheme.SECONDARY,
157
+ type: ComponentRenderType.INLINE,
158
+ maxMultipleModeDateSelection: 20,
159
+ mode: DateTimePickerMode.DATETIME,
160
+ layout: DateTimePickerLayout.DEFAULT_LAYOUT,
161
+ selectionMode: DateTimePickerSelectionMode.SINGLE,
162
+ timeLayout: DateTimePickerLayout.DEFAULT_TIME_LAYOUT,
163
+ headerLayout: DateTimePickerLayout.DEFAULT_HEADER_LAYOUT,
164
+ footerLayout: DateTimePickerLayout.DEFAULT_FOOTER_LAYOUT,
165
+ yearModeLayout: DateTimePickerLayout.DEFAULT_YEAR_MODE_LAYOUT,
166
+ selectionLayout: DateTimePickerLayout.DEFAULT_SELECTION_LAYOUT,
167
+ dateFormat: { day: '2-digit', month: 'short', year: 'numeric' },
168
+ monthModeLayout: DateTimePickerLayout.DEFAULT_MONTH_MODE_LAYOUT,
169
+ yearModeHeaderLayout: DateTimePickerLayout.DEFAULT_YEAR_MODE_HEADER_LAYOUT,
170
+ monthModeHeaderLayout: DateTimePickerLayout.DEFAULT_MONTH_MODE_HEADER_LAYOUT,
171
+ weekdays: [Weekday.SUNDAY, Weekday.MONDAY, Weekday.TUESDAY, Weekday.WEDNESDAY, Weekday.THURSDAY, Weekday.FRIDAY, Weekday.SATURDAY],
172
+ };
173
+ export class DateTimePickerComponent extends React.Component {
174
+ static defaultProps = DateTimePickerDefaultProps;
175
+ state = {
176
+ activeMode: this.props.mode,
177
+ modalVisible: this.props.modalVisible,
178
+ activeDate: DateHelper.clone(this.props.date),
179
+ time: DateHelper.getTime(this.props.date),
180
+ selectedDates: this.props.selectionMode === DateTimePickerSelectionMode.RANGE ? this.props.selectedDates.slice(0, 2) : this.props.selectedDates,
181
+ };
182
+ labelsMap = {
183
+ "NowElement": "Now",
184
+ "TodayElement": "Today",
185
+ "ClearElement": "Clear",
186
+ "SelectElement": "Select",
187
+ "TodayDateElement": "Today",
188
+ "ThisYearElement": "This year",
189
+ "LastYearElement": "Last year",
190
+ "YesterdayElement": "Yesterday",
191
+ "ThisMonthElement": "This month",
192
+ "LastMonthElement": "Last month",
193
+ "LastSevenDaysElement": "Last seven days",
194
+ "LastThirtyDaysElement": "Last thirty days",
195
+ ...(this.props.labelsMap || {})
196
+ };
197
+ dialogManageRef = {};
198
+ popoverManageRef = {};
199
+ constructor(props) {
200
+ super(props);
201
+ this.next = this.next.bind(this);
202
+ this.prev = this.prev.bind(this);
203
+ this.toggle = this.toggle.bind(this);
204
+ this.increment = this.increment.bind(this);
205
+ this.decrement = this.decrement.bind(this);
206
+ this.onSelectDate = this.onSelectDate.bind(this);
207
+ this.onSelectYear = this.onSelectYear.bind(this);
208
+ this.onSelectMonth = this.onSelectMonth.bind(this);
209
+ this.selectNowDate = this.selectNowDate.bind(this);
210
+ this.onMouseEnterDate = this.onMouseEnterDate.bind(this);
211
+ this.onMouseLeaveDate = this.onMouseLeaveDate.bind(this);
212
+ this.reportOnSelectDate = this.reportOnSelectDate.bind(this);
213
+ this.clearDateSelection = this.clearDateSelection.bind(this);
214
+ this.selectDatesInRange = this.selectDatesInRange.bind(this);
215
+ this.performDateControlAction = this.performDateControlAction.bind(this);
216
+ }
217
+ componentDidMount() {
218
+ ObjectHelper.resolveManageRef(this, {
219
+ prev: this.prev,
220
+ next: this.next,
221
+ toggle: this.toggle,
222
+ clear: this.clearDateSelection,
223
+ activeDate: () => this.state.activeDate,
224
+ dialogManageRef: () => this.dialogManageRef,
225
+ selectedDates: () => this.state.selectedDates,
226
+ popoverManageRef: () => this.popoverManageRef,
227
+ formattedValue: () => (this.state.selectedDates.length ? this.state.selectedDates[0] : new Date()).toLocaleString(this.props.locale, this.props.dateFormat),
228
+ });
229
+ }
230
+ componentWillUnmount() {
231
+ ObjectHelper.resolveManageRef(this, null);
232
+ }
233
+ toggle(event, target) {
234
+ switch (this.props.type) {
235
+ case ComponentRenderType.MODAL:
236
+ this.setState({ modalVisible: !this.state.modalVisible });
237
+ break;
238
+ case ComponentRenderType.POPOVER:
239
+ this.popoverManageRef.toggle(event, target);
240
+ break;
241
+ }
242
+ }
243
+ next(leftNeigbhor, rightNeigbhor) {
244
+ let activeDate = this.state.activeDate;
245
+ switch (leftNeigbhor) {
246
+ case DateTimePickerLayoutElement.HourElement:
247
+ activeDate = DateHelper.addHours(activeDate, 1);
248
+ break;
249
+ case DateTimePickerLayoutElement.MinutesElement:
250
+ activeDate = DateHelper.addMinutes(activeDate, 1);
251
+ break;
252
+ case DateTimePickerLayoutElement.SecondsElement:
253
+ activeDate = DateHelper.addSeconds(activeDate, 1);
254
+ break;
255
+ case DateTimePickerLayoutElement.MeridianElement:
256
+ activeDate = DateHelper.addHours(activeDate, 12);
257
+ break;
258
+ default:
259
+ if (this.props.onNext) {
260
+ this.props.onNext(leftNeigbhor, rightNeigbhor);
261
+ return;
262
+ }
263
+ switch (this.state.activeMode) {
264
+ case DateTimePickerMode.MONTH:
265
+ activeDate.setFullYear(activeDate.getFullYear() + 1);
266
+ break;
267
+ case DateTimePickerMode.YEAR:
268
+ activeDate.setFullYear(activeDate.getFullYear() + this.props.modeDifferenceCount);
269
+ break;
270
+ default:
271
+ activeDate.setMonth(activeDate.getMonth() + 1);
272
+ break;
273
+ }
274
+ }
275
+ this.setState({ activeDate });
276
+ this.props.onIncrease && this.props.onIncrease(activeDate, leftNeigbhor);
277
+ }
278
+ prev(leftNeigbhor, rightNeigbhor) {
279
+ let activeDate = this.state.activeDate;
280
+ switch (rightNeigbhor) {
281
+ case DateTimePickerLayoutElement.HourElement:
282
+ activeDate = DateHelper.addHours(activeDate, -1);
283
+ break;
284
+ case DateTimePickerLayoutElement.MinutesElement:
285
+ activeDate = DateHelper.addMinutes(activeDate, -1);
286
+ break;
287
+ case DateTimePickerLayoutElement.SecondsElement:
288
+ activeDate = DateHelper.addSeconds(activeDate, -1);
289
+ break;
290
+ case DateTimePickerLayoutElement.MeridianElement:
291
+ activeDate = DateHelper.addHours(activeDate, -12);
292
+ break;
293
+ default:
294
+ if (this.props.onPrevious) {
295
+ this.props.onPrevious(leftNeigbhor, rightNeigbhor);
296
+ return;
297
+ }
298
+ switch (this.state.activeMode) {
299
+ case DateTimePickerMode.MONTH:
300
+ activeDate.setFullYear(activeDate.getFullYear() - 1);
301
+ break;
302
+ case DateTimePickerMode.YEAR:
303
+ activeDate.setFullYear(activeDate.getFullYear() - this.props.modeDifferenceCount);
304
+ break;
305
+ default:
306
+ activeDate.setMonth(activeDate.getMonth() - 1);
307
+ break;
308
+ }
309
+ }
310
+ this.setState({ activeDate });
311
+ this.props.onDecrease && this.props.onDecrease(activeDate, rightNeigbhor);
312
+ }
313
+ increment(leftNeigbhor, rightNeigbhor) {
314
+ let activeDate = this.state.activeDate;
315
+ switch (rightNeigbhor) {
316
+ case DateTimePickerLayoutElement.HourElement:
317
+ activeDate = DateHelper.addHours(activeDate, 1);
318
+ break;
319
+ case DateTimePickerLayoutElement.MinutesElement:
320
+ activeDate = DateHelper.addMinutes(activeDate, 1);
321
+ break;
322
+ case DateTimePickerLayoutElement.SecondsElement:
323
+ activeDate = DateHelper.addSeconds(activeDate, 1);
324
+ break;
325
+ case DateTimePickerLayoutElement.MeridianElement:
326
+ activeDate = DateHelper.addHours(activeDate, 12);
327
+ break;
328
+ default:
329
+ this.props.onIncrement && this.props.onIncrement(leftNeigbhor, rightNeigbhor);
330
+ return;
331
+ }
332
+ this.setState({ activeDate });
333
+ this.props.onIncrease && this.props.onIncrease(activeDate, rightNeigbhor);
334
+ }
335
+ decrement(leftNeigbhor, rightNeigbhor) {
336
+ let activeDate = this.state.activeDate;
337
+ switch (leftNeigbhor) {
338
+ case DateTimePickerLayoutElement.HourElement:
339
+ activeDate = DateHelper.addHours(activeDate, -1);
340
+ break;
341
+ case DateTimePickerLayoutElement.MinutesElement:
342
+ activeDate = DateHelper.addMinutes(activeDate, -1);
343
+ break;
344
+ case DateTimePickerLayoutElement.SecondsElement:
345
+ activeDate = DateHelper.addSeconds(activeDate, -1);
346
+ break;
347
+ case DateTimePickerLayoutElement.MeridianElement:
348
+ activeDate = DateHelper.addHours(activeDate, -12);
349
+ break;
350
+ default:
351
+ this.props.onDecrement && this.props.onDecrement(leftNeigbhor, rightNeigbhor);
352
+ return;
353
+ }
354
+ this.setState({ activeDate });
355
+ this.props.onDecrease && this.props.onDecrease(activeDate, leftNeigbhor);
356
+ }
357
+ reportOnSelectDate(newSelectedDates) {
358
+ if (!this.props.onSelectDate)
359
+ return;
360
+ const selectedDates = newSelectedDates || this.state.selectedDates;
361
+ const options = {
362
+ selectedDates: selectedDates,
363
+ fromDate: selectedDates.length ? selectedDates[0] : undefined,
364
+ selectedDate: selectedDates.length ? selectedDates[0] : undefined,
365
+ toDate: selectedDates.length ? selectedDates[selectedDates.length - 1] : undefined,
366
+ formatDate: (date) => (new Date(date.getTime())).toLocaleString(this.props.locale, this.props.dateFormat),
367
+ };
368
+ this.props.onSelectDate(options);
369
+ }
370
+ clearDateSelection() {
371
+ this.setState({ selectedDates: [] });
372
+ this.props.onClear && this.props.onClear();
373
+ }
374
+ onMouseEnterDate(date) {
375
+ this.setState({ mouseOverDate: date });
376
+ }
377
+ onMouseLeaveDate() {
378
+ this.setState({ mouseOverDate: undefined });
379
+ }
380
+ selectDatesInRange(date, toDate) {
381
+ const activeDate = this.state.activeDate;
382
+ const selectedDates = [new Date(date.getFullYear(), date.getMonth(), date.getDate())];
383
+ if (toDate)
384
+ selectedDates.push(new Date(toDate.getFullYear(), toDate.getMonth(), toDate.getDate(), 23, 58, 59));
385
+ this.setState({
386
+ selectedDates,
387
+ activeDate: DateHelper.withTime(date, activeDate),
388
+ });
389
+ if (this.props.selectionMode === DateTimePickerSelectionMode.RANGE && selectedDates.length < 2)
390
+ return;
391
+ if (!this.props.reportOnSelectClickOnly && selectedDates.length)
392
+ this.reportOnSelectDate(selectedDates);
393
+ }
394
+ switchMode(element) {
395
+ let activeMode;
396
+ switch (element) {
397
+ case DateTimePickerLayoutElement.YearElement:
398
+ activeMode = DateTimePickerMode.YEAR;
399
+ break;
400
+ case DateTimePickerLayoutElement.MonthElement:
401
+ activeMode = DateTimePickerMode.MONTH;
402
+ break;
403
+ default:
404
+ activeMode = DateTimePickerMode.DATETIME;
405
+ break;
406
+ }
407
+ this.setState({ activeMode });
408
+ }
409
+ performDateControlAction(element) {
410
+ const date = new Date();
411
+ switch (element) {
412
+ case DateTimePickerLayoutElement.TodayElement:
413
+ case DateTimePickerLayoutElement.TodayDateElement:
414
+ this.selectDatesInRange(date, this.props.selectionMode === DateTimePickerSelectionMode.RANGE ? date : undefined);
415
+ break;
416
+ case DateTimePickerLayoutElement.YesterdayElement:
417
+ const newDate = DateHelper.addDays(date, -1);
418
+ this.selectDatesInRange(newDate, newDate);
419
+ break;
420
+ case DateTimePickerLayoutElement.LastYearElement:
421
+ case DateTimePickerLayoutElement.ThisYearElement:
422
+ const year = element === DateTimePickerLayoutElement.LastYearElement ? date.getFullYear() - 1 : date.getFullYear();
423
+ const start = new Date(year, 0, 1);
424
+ const end = new Date(year, 11, 1);
425
+ end.setDate(DateHelper.daysInMonth(year, 11));
426
+ this.selectDatesInRange(start, end);
427
+ break;
428
+ case DateTimePickerLayoutElement.ThisMonthElement:
429
+ case DateTimePickerLayoutElement.LastMonthElement:
430
+ const startth = element === DateTimePickerLayoutElement.LastMonthElement ? DateHelper.addMonths(date, -1) : date;
431
+ const endth = DateHelper.clone(startth);
432
+ startth.setDate(1);
433
+ endth.setDate(DateHelper.daysInMonth(startth));
434
+ this.selectDatesInRange(startth, endth);
435
+ break;
436
+ case DateTimePickerLayoutElement.LastSevenDaysElement:
437
+ case DateTimePickerLayoutElement.LastThirtyDaysElement:
438
+ const startlsd = DateHelper.addDays(date, element === DateTimePickerLayoutElement.LastSevenDaysElement ? -6 : -29);
439
+ this.selectDatesInRange(startlsd, date);
440
+ break;
441
+ }
442
+ }
443
+ selectNowDate() {
444
+ this.selectDatesInRange(new Date());
445
+ }
446
+ onSelectDate(date, reset = false) {
447
+ let activeDate = this.state.activeDate;
448
+ let newSelectedDates = this.state.selectedDates;
449
+ if (!reset && this.props.maxMultipleModeDateSelection
450
+ && !DateHelper.isInArrayOfDates(newSelectedDates, date)
451
+ && this.state.selectedDates.length >= this.props.maxMultipleModeDateSelection) {
452
+ this.props.onMaxMultipleDateSelected && this.props.onMaxMultipleDateSelected();
453
+ return;
454
+ }
455
+ date = DateHelper.withTime(date, activeDate);
456
+ if (reset)
457
+ newSelectedDates = [date];
458
+ if (!reset)
459
+ switch (this.props.selectionMode) {
460
+ case DateTimePickerSelectionMode.MULTIPLE:
461
+ if (DateHelper.isInArrayOfDates(newSelectedDates, date)) {
462
+ if (!this.props.dontUnselectOnSameDate)
463
+ newSelectedDates = newSelectedDates.filter((value) => value.getTime() !== date.getTime());
464
+ }
465
+ else {
466
+ newSelectedDates.push(date);
467
+ }
468
+ break;
469
+ case DateTimePickerSelectionMode.RANGE:
470
+ if (newSelectedDates.length) {
471
+ if (DateHelper.isInArrayOfDates(newSelectedDates, date)) {
472
+ if (newSelectedDates.length > 1)
473
+ newSelectedDates = newSelectedDates.filter((value) => value.getTime() !== date.getTime());
474
+ else
475
+ newSelectedDates.push(new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 58, 59));
476
+ }
477
+ else {
478
+ let existingDate = newSelectedDates[0];
479
+ newSelectedDates = [existingDate, existingDate];
480
+ newSelectedDates[(date > existingDate ? 1 : 0)] = date;
481
+ }
482
+ }
483
+ else {
484
+ newSelectedDates.push(date);
485
+ }
486
+ break;
487
+ case DateTimePickerSelectionMode.SINGLE:
488
+ default:
489
+ if (newSelectedDates.length && DateHelper.dateEquals([newSelectedDates[0], date])) {
490
+ if (!this.props.dontUnselectOnSameDate)
491
+ newSelectedDates = [];
492
+ }
493
+ else {
494
+ newSelectedDates = [date];
495
+ }
496
+ }
497
+ if (this.props.makeOverlapSelectable && newSelectedDates.length) {
498
+ activeDate = DateHelper.withTime(newSelectedDates[this.props.selectionMode === DateTimePickerSelectionMode.RANGE ? 0 : newSelectedDates.length - 1], activeDate);
499
+ }
500
+ this.setState({ activeDate, selectedDates: newSelectedDates });
501
+ if (this.props.selectionMode === DateTimePickerSelectionMode.RANGE && newSelectedDates.length < 2)
502
+ return;
503
+ if (!this.props.reportOnSelectClickOnly && newSelectedDates.length)
504
+ this.reportOnSelectDate(newSelectedDates);
505
+ }
506
+ onSelectYear(event, year) {
507
+ const selectedDate = (this.state.selectedDates.length ? this.state.selectedDates[0] : new Date());
508
+ selectedDate.setFullYear(year);
509
+ if (this.props.mode === DateTimePickerMode.YEAR) {
510
+ if (!this.props.sticky)
511
+ this.toggle(event);
512
+ this.onSelectDate(selectedDate, true);
513
+ return;
514
+ }
515
+ this.setState({ activeDate: selectedDate, activeMode: DateTimePickerMode.MONTH });
516
+ }
517
+ onSelectMonth(event, month, year) {
518
+ const selectedDate = (this.state.selectedDates.length ? this.state.selectedDates[0] : new Date());
519
+ selectedDate.setMonth(month);
520
+ selectedDate.setFullYear(year);
521
+ if (this.props.mode === DateTimePickerMode.MONTH) {
522
+ if (!this.props.sticky)
523
+ this.toggle(event);
524
+ this.onSelectDate(selectedDate, true);
525
+ return;
526
+ }
527
+ this.setState({ activeDate: selectedDate, activeMode: DateTimePickerMode.DATETIME });
528
+ }
529
+ dateShouldBeDisabled(date) {
530
+ let disable = false;
531
+ if (this.props.disableFromDate && date > this.props.disableFromDate)
532
+ disable = true;
533
+ if (this.props.disableToDate && date <= this.props.disableToDate)
534
+ disable = true;
535
+ if (!disable && this.props.disabledYears.includes(date.getFullYear()))
536
+ disable = true;
537
+ if (disable && this.props.enabledYears.includes(date.getFullYear()))
538
+ disable = false;
539
+ if (!disable && this.props.disabledMonths.includes(date.getMonth()))
540
+ disable = true;
541
+ if (disable && this.props.enabledMonths.includes(date.getMonth()))
542
+ disable = false;
543
+ if (!disable && this.props.disabledWeekdays.includes(DateTimePickerWeekdayIndex[date.getDay()]))
544
+ disable = true;
545
+ if (disable && this.props.enabledWeekdays.includes(DateTimePickerWeekdayIndex[date.getDay()]))
546
+ disable = false;
547
+ if (!disable && DateHelper.isInArrayOfDates(this.props.disabledDates, date))
548
+ disable = true;
549
+ if (disable && DateHelper.isInArrayOfDates(this.props.enabledDates, date))
550
+ disable = false;
551
+ return disable;
552
+ }
553
+ selectDateControlScheme(layoutElement) {
554
+ if (layoutElement === DateTimePickerLayoutElement.YearElement && this.props.staticMode)
555
+ return undefined;
556
+ if (layoutElement === DateTimePickerLayoutElement.MonthElement && this.props.staticMode)
557
+ return undefined;
558
+ if (!BoolHelper.equalsAny(layoutElement, [
559
+ DateTimePickerLayoutElement.TodayElement,
560
+ DateTimePickerLayoutElement.ThisYearElement,
561
+ DateTimePickerLayoutElement.LastYearElement,
562
+ DateTimePickerLayoutElement.YesterdayElement,
563
+ DateTimePickerLayoutElement.YesterdayElement,
564
+ DateTimePickerLayoutElement.ThisMonthElement,
565
+ DateTimePickerLayoutElement.LastMonthElement,
566
+ DateTimePickerLayoutElement.LastSevenDaysElement,
567
+ DateTimePickerLayoutElement.LastThirtyDaysElement,
568
+ ]))
569
+ return this.props.scheme;
570
+ let isSelected = false;
571
+ let date = DateHelper.withoutTime(new Date());
572
+ const fromDate = this.state.selectedDates.length ? this.state.selectedDates[0] : undefined;
573
+ const toDate = this.state.selectedDates.length && (this.state.selectedDates.length > 1 || this.props.selectionMode === DateTimePickerSelectionMode.SINGLE)
574
+ ? this.state.selectedDates[this.state.selectedDates.length - 1] : undefined;
575
+ const selectedDates = [fromDate, toDate ? DateHelper.withEndOfDayTime(toDate) : undefined];
576
+ if (!selectedDates[0] && !selectedDates[1])
577
+ return this.props.idleScheme;
578
+ if (layoutElement === DateTimePickerLayoutElement.TodayElement) {
579
+ isSelected = DateHelper.areInArrayOfDates(selectedDates, [date, DateHelper.withEndOfDayTime(date)], false);
580
+ }
581
+ if (layoutElement === DateTimePickerLayoutElement.YesterdayElement) {
582
+ date = DateHelper.addDays(date, -1);
583
+ isSelected = DateHelper.areInArrayOfDates(selectedDates, [date, DateHelper.withEndOfDayTime(date)], false);
584
+ }
585
+ if (layoutElement === DateTimePickerLayoutElement.LastYearElement
586
+ || layoutElement === DateTimePickerLayoutElement.ThisYearElement) {
587
+ const year = layoutElement === DateTimePickerLayoutElement.LastYearElement ? date.getFullYear() - 1 : date.getFullYear();
588
+ const start = new Date(year, 0, 1);
589
+ const end = new Date(year, 11, 1);
590
+ end.setDate(DateHelper.daysInMonth(year, 11));
591
+ isSelected = DateHelper.areInArrayOfDates(selectedDates, [start, DateHelper.withEndOfDayTime(end)], false);
592
+ }
593
+ if (layoutElement === DateTimePickerLayoutElement.ThisMonthElement
594
+ || layoutElement === DateTimePickerLayoutElement.LastMonthElement) {
595
+ const startth = layoutElement === DateTimePickerLayoutElement.LastMonthElement ? DateHelper.addMonths(date, -1) : date;
596
+ const endth = DateHelper.clone(startth);
597
+ startth.setDate(1);
598
+ endth.setDate(DateHelper.daysInMonth(startth));
599
+ isSelected = DateHelper.areInArrayOfDates(selectedDates, [startth, DateHelper.withEndOfDayTime(endth)], false);
600
+ }
601
+ if (layoutElement === DateTimePickerLayoutElement.LastSevenDaysElement
602
+ || layoutElement === DateTimePickerLayoutElement.LastThirtyDaysElement) {
603
+ const startlsd = DateHelper.addDays(date, layoutElement === DateTimePickerLayoutElement.LastSevenDaysElement ? -6 : -29);
604
+ isSelected = DateHelper.areInArrayOfDates(selectedDates, [startlsd, DateHelper.withEndOfDayTime(date)], false);
605
+ }
606
+ return isSelected ? this.props.scheme : this.props.idleScheme;
607
+ }
608
+ buildLayoutElement(options, formattedDate, layoutElements, layoutElement, layout, className, template, controlActionMap, key = DOMHelper.uniqueElementId()) {
609
+ if (template) {
610
+ return template({
611
+ options,
612
+ layoutElement,
613
+ formattedDate,
614
+ controlActionMap,
615
+ props: this.props,
616
+ labelsMap: this.labelsMap,
617
+ elementBuilder: dateTimePickerBuildLayoutElement,
618
+ });
619
+ }
620
+ const contents = [];
621
+ let subContents;
622
+ const layoutElementNames = layout.split(" ");
623
+ layoutElementNames.forEach((n, i) => {
624
+ const element = layoutElements[n];
625
+ if (!element)
626
+ return;
627
+ const props = { key: i };
628
+ // resolve increment decrement
629
+ if (n === DateTimePickerLayoutElement.NextElement || n === DateTimePickerLayoutElement.PreviousElement) {
630
+ const leftNeigbhor = i === 0 ? undefined : layoutElementNames[i - 1];
631
+ const rightNeigbhor = i === layoutElementNames.length - 1 ? undefined : layoutElementNames[i + 1];
632
+ const func = n === DateTimePickerLayoutElement.NextElement ? this.next : this.prev;
633
+ props.onClick = () => func(leftNeigbhor, rightNeigbhor);
634
+ }
635
+ else if (n === DateTimePickerLayoutElement.IncrementElement || n === DateTimePickerLayoutElement.DecrementElement) {
636
+ const leftNeigbhor = i === 0 ? undefined : layoutElementNames[i - 1];
637
+ const rightNeigbhor = i === layoutElementNames.length - 1 ? undefined : layoutElementNames[i + 1];
638
+ const func = n === DateTimePickerLayoutElement.IncrementElement ? this.increment : this.decrement;
639
+ props.onClick = () => func(leftNeigbhor, rightNeigbhor);
640
+ }
641
+ // resolve groups
642
+ if (element === DateTimePickerLayoutElement.OpenColumnGroupElement || element === DateTimePickerLayoutElement.OpenRowGroupElement) {
643
+ subContents = [];
644
+ return;
645
+ }
646
+ else if (element === DateTimePickerLayoutElement.CloseColumnGroupElement || element === DateTimePickerLayoutElement.CloseRowGroupElement) {
647
+ const relayAttrs = (element === DateTimePickerLayoutElement.CloseColumnGroupElement
648
+ ? this.props.attrsRelay?.columnGroup : this.props.attrsRelay?.rowGroup);
649
+ const className = Classname.build((element === DateTimePickerLayoutElement.CloseColumnGroupElement
650
+ ? "noseur-date-time-picker-column" : "noseur-date-time-picker-row"), relayAttrs?.className);
651
+ contents.push(React.createElement("div", { className: className, key: i, style: relayAttrs?.style }, subContents));
652
+ subContents = undefined;
653
+ return;
654
+ }
655
+ if (subContents) {
656
+ subContents.push(React.cloneElement(element, props));
657
+ return;
658
+ }
659
+ // default
660
+ contents.push(React.cloneElement(element, props));
661
+ });
662
+ if (!contents.length)
663
+ return null;
664
+ return (React.createElement("div", { className: className, key: key }, contents));
665
+ }
666
+ buildDateElement(_date, dayControl, controlActionMap) {
667
+ const isNotDate = TypeChecker.isString(_date);
668
+ const date = isNotDate ? new Date(1111, 0, 0) : _date;
669
+ const formattedDate = DateHelper.formatDateToObject(date, {
670
+ monthName: { month: 'long' },
671
+ longYear: { year: 'numeric' },
672
+ formatted: this.props.dateFormat,
673
+ }, this.props.locale, this.props.hourFormat, this.state.activeDate);
674
+ const dateShouldBeDisabled = this.dateShouldBeDisabled(date);
675
+ formattedDate.disabled = formattedDate.isNotInMonth || dateShouldBeDisabled;
676
+ const dateControlActionMap = {
677
+ ...controlActionMap, DayElement: (e) => {
678
+ if (!this.props.sticky)
679
+ this.toggle(e);
680
+ this.onSelectDate(date);
681
+ }
682
+ };
683
+ const text = this.props.dateTemplate ? this.props.dateTemplate(formattedDate) : (isNotDate ? _date : "" + date.getDate());
684
+ const selected = DateHelper.isInArrayOfDates(this.state.selectedDates, date);
685
+ const isWithinRange = this.props.selectionMode === DateTimePickerSelectionMode.RANGE && !selected && this.state.selectedDates.length && (this.state.selectedDates.length > 1 || this.state.mouseOverDate)
686
+ ? DateHelper.dateIsInRange(this.state.selectedDates[0], this.state.selectedDates[1] ?? this.state.mouseOverDate, date)
687
+ : false;
688
+ const relayAttrs = this.props.attrsRelay?.date;
689
+ const className = Classname.build("noseur-date-time-picker-days-date", relayAttrs?.className, (!selected ? Classname.build("noseur-date-time-picker-days-date-hover", relayAttrs?.hover?.className) : null), (selected ? Classname.build("noseur-date-time-picker-days-date-selected", relayAttrs?.selected?.className) : null), (isWithinRange ? Classname.build("noseur-date-time-picker-days-date-in-range", relayAttrs?.inRange?.className) : null), (this.props.makeOverlapSelectable && formattedDate.isNotInMonth && !dateShouldBeDisabled ? "noseur-all-pointer-event" : null), (!selected && this.props.highlightToday && DateHelper.isToday(date) ? Classname.build("noseur-date-time-picker-days-date-today") : null), (formattedDate.disabled ? Classname.build("noseur-date-time-picker-days-date-disabled", relayAttrs?.disabled?.className) : Classname.build("noseur-date-time-picker-days-date-enabled", relayAttrs?.enabled?.className)));
690
+ if ((!dayControl || (!React.isValidElement(dayControl) && (typeof dayControl) === "object"))) {
691
+ if (!dayControl)
692
+ dayControl = {};
693
+ dayControl.textOnly = !selected;
694
+ dayControl.className = className;
695
+ if (this.state.selectedDates.length && this.props.selectionMode === DateTimePickerSelectionMode.RANGE && this.props.highlightDatesInRange && !selected) {
696
+ dayControl.onMouseLeave = () => this.onMouseLeaveDate();
697
+ dayControl.onMouseEnter = () => this.onMouseEnterDate(date);
698
+ }
699
+ }
700
+ const options = {
701
+ text,
702
+ formattedDate,
703
+ control: dayControl,
704
+ action: dateControlActionMap["DayElement"],
705
+ layoutElement: DateTimePickerLayoutElement.DayElement,
706
+ scheme: (selected ? this.props.scheme : this.props.idleScheme),
707
+ };
708
+ if (this.props.dayTemplate) {
709
+ return this.props.dayTemplate(isNotDate ? -1 : date.getDate(), {
710
+ options,
711
+ formattedDate,
712
+ props: this.props,
713
+ labelsMap: this.labelsMap,
714
+ controlActionMap: dateControlActionMap,
715
+ elementBuilder: dateTimePickerBuildLayoutElement,
716
+ layoutElement: DateTimePickerLayoutElement.DayElement,
717
+ }, selected, date, formattedDate.isNotInMonth);
718
+ }
719
+ return dateTimePickerBuildLayoutElement(options);
720
+ }
721
+ buildLayoutElements(formattedDate, controlActionMap) {
722
+ const layoutElements = {};
723
+ const requiredLayoutElements = new Set();
724
+ this.props.layout.split(" ").forEach(l => requiredLayoutElements.add(l));
725
+ this.props.topLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
726
+ this.props.timeLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
727
+ this.props.leftLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
728
+ this.props.rightLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
729
+ this.props.footerLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
730
+ this.props.headerLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
731
+ this.props.bottomLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
732
+ this.props.yearModeLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
733
+ this.props.selectionLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
734
+ this.props.monthModeLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
735
+ this.props.yearModeHeaderLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
736
+ this.props.yearModeHeaderLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
737
+ this.props.monthModeHeaderLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
738
+ this.props.monthModeHeaderLayout.split(" ").forEach(l => requiredLayoutElements.add(l));
739
+ const excludedLayouts = [
740
+ DateTimePickerLayoutElement.TimeElement, DateTimePickerLayoutElement.WeekDayElement,
741
+ DateTimePickerLayoutElement.DayElement, DateTimePickerLayoutElement.SelectionElement,
742
+ DateTimePickerLayoutElement.LeftPanelElement, DateTimePickerLayoutElement.HeaderElement,
743
+ DateTimePickerLayoutElement.FooterElement, DateTimePickerLayoutElement.RightPanelElement,
744
+ DateTimePickerLayoutElement.TopPanelElement, DateTimePickerLayoutElement.BottomPanelElement,
745
+ DateTimePickerLayoutElement.YearModeHeaderElement, DateTimePickerLayoutElement.YearModeFooterElement,
746
+ DateTimePickerLayoutElement.MonthModeHeaderElement, DateTimePickerLayoutElement.MonthModeFooterElement,
747
+ ];
748
+ const activeYear = this.state.activeDate.getFullYear();
749
+ const selectedYear = (this.state.selectedDates.length ? this.state.selectedDates[0] : new Date()).getFullYear();
750
+ const controlPropsMap = {
751
+ DayElement: this.props.dayControl,
752
+ NextElement: this.props.nextControl,
753
+ PreviousElement: this.props.prevControl,
754
+ IncrementElement: this.props.incrementControl,
755
+ DecrementElement: this.props.decrementControl,
756
+ };
757
+ // TODO mltiple for multiple calender months
758
+ formattedDate.disabled = formattedDate.isNotInMonth;
759
+ requiredLayoutElements.forEach(requiredLayoutElement => {
760
+ if (!requiredLayoutElement.trim())
761
+ return;
762
+ if (excludedLayouts.includes(requiredLayoutElement))
763
+ return;
764
+ const options = {
765
+ formattedDate,
766
+ scheme: this.props.scheme,
767
+ layoutElement: requiredLayoutElement,
768
+ text: this.labelsMap[requiredLayoutElement],
769
+ action: controlActionMap[requiredLayoutElement],
770
+ control: controlPropsMap[requiredLayoutElement],
771
+ basicAttrs: this.props.attrsRelay[requiredLayoutElement],
772
+ };
773
+ if (requiredLayoutElement === DateTimePickerLayoutElement.WeekdaysElements) {
774
+ layoutElements[DateTimePickerLayoutElement.WeekdaysElements] = (React.createElement("div", { className: Classname.build("noseur-date-time-picker-weekdays", this.props.attrsRelay?.weekdays?.className) }, this.props.weekdays.map((weekDay) => {
775
+ const opts = {
776
+ ...options,
777
+ layoutElement: weekDay,
778
+ text: DateHelper.translateWeekday(weekDay, this.props.locale),
779
+ control: controlPropsMap[DateTimePickerLayoutElement.WeekDayElement],
780
+ basicAttrs: addClassesToComponentElementBasicAttributes(this.props.attrsRelay[weekDay], Classname.build("noseur-date-time-picker-weekdays-day", this.props.attrsRelay?.weekdays?.weekday?.className))
781
+ };
782
+ return (this.props.weekdayTemplate
783
+ ? this.props.weekdayTemplate(weekDay, {
784
+ options: opts,
785
+ formattedDate,
786
+ controlActionMap,
787
+ props: this.props,
788
+ labelsMap: this.labelsMap,
789
+ elementBuilder: dateTimePickerBuildLayoutElement,
790
+ layoutElement: DateTimePickerLayoutElement.WeekDayElement,
791
+ })
792
+ : dateTimePickerBuildLayoutElement(opts));
793
+ })));
794
+ return;
795
+ }
796
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.SelectedDatesElements) {
797
+ layoutElements[DateTimePickerLayoutElement.SelectedDatesElements] = (React.createElement(React.Fragment, null, this.state.selectedDates.map((date) => {
798
+ const opts = {
799
+ ...options,
800
+ layoutElement: DateTimePickerLayoutElement.SelectedDateElement,
801
+ text: date.toLocaleString(this.props.locale, this.props.dateFormat),
802
+ control: controlPropsMap[DateTimePickerLayoutElement.SelectedDateElement],
803
+ basicAttrs: addClassesToComponentElementBasicAttributes(this.props.attrsRelay[DateTimePickerLayoutElement.SelectedDateElement], Classname.build("noseur-date-time-picker-selected-dates-selected-date", this.props.attrsRelay?.selectedDate?.className))
804
+ };
805
+ return (this.props.selectedDateTemplate
806
+ ? this.props.selectedDateTemplate(date, {
807
+ options: opts,
808
+ formattedDate,
809
+ controlActionMap,
810
+ props: this.props,
811
+ labelsMap: this.labelsMap,
812
+ elementBuilder: dateTimePickerBuildLayoutElement,
813
+ layoutElement: DateTimePickerLayoutElement.SelectedDateElement,
814
+ })
815
+ : dateTimePickerBuildLayoutElement(opts));
816
+ })));
817
+ return;
818
+ }
819
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.DaysElements) {
820
+ const daysElements = [];
821
+ const row = 7, column = 6, rowColumnSum = row * column;
822
+ const underline = this.props.showDatesSeparator && !this.props.showGridLines;
823
+ const monthDays = DateHelper.getAllDaysInMonth(formattedDate.year, formattedDate.month);
824
+ const startWeekday = monthDays[0].getDay();
825
+ const previousMonthPadding = startWeekday;
826
+ const nextMonthPadding = rowColumnSum - (monthDays.length + previousMonthPadding);
827
+ const previousMonthDays = previousMonthPadding === 0 ? [] : this.props.dontOverlapDate
828
+ ? Array(previousMonthPadding).fill(" ")
829
+ : DateHelper.getAllDaysInMonth(formattedDate.year, formattedDate.month - 1, previousMonthPadding, true);
830
+ const nextMonthDays = this.props.dontOverlapDate
831
+ ? Array(nextMonthPadding).fill(" ")
832
+ : DateHelper.getAllDaysInMonth(formattedDate.year, formattedDate.month + 1, nextMonthPadding);
833
+ previousMonthDays.forEach(day => daysElements.push(this.buildDateElement(day, controlPropsMap[DateTimePickerLayoutElement.DayElement], controlActionMap)));
834
+ monthDays.forEach(day => daysElements.push(this.buildDateElement(day, controlPropsMap[DateTimePickerLayoutElement.DayElement], controlActionMap)));
835
+ nextMonthDays.forEach(day => daysElements.push(this.buildDateElement(day, controlPropsMap[DateTimePickerLayoutElement.DayElement], controlActionMap)));
836
+ const className = Classname.build("noseur-date-time-picker-days", this.props.attrsRelay?.days?.className, {
837
+ "noseur-date-time-picker-days-underline": underline,
838
+ }, (underline ? this.props.attrsRelay?.days?.underline?.className : null));
839
+ layoutElements[DateTimePickerLayoutElement.DaysElements] = (React.createElement("div", { className: className, style: { gridTemplateColumns: this.props.weekdays.map(_ => "auto").join(" ") } }, daysElements));
840
+ return;
841
+ }
842
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.YearsElements) {
843
+ const comparatorYear = this.props.mode === DateTimePickerMode.DATETIME ? activeYear : selectedYear;
844
+ layoutElements[DateTimePickerLayoutElement.YearsElements] = (React.createElement("div", { className: Classname.build("noseur-date-time-picker-years", this.props.attrsRelay?.years?.className) }, Array(this.props.modeDifferenceCount).fill(undefined).map((_, index) => {
845
+ const year = activeYear + index;
846
+ const action = (event) => this.onSelectYear(event, year);
847
+ const className = Classname.build("noseur-date-time-picker-long-year", this.props.attrsRelay?.years?.year?.className);
848
+ if (comparatorYear === year)
849
+ controlPropsMap[DateTimePickerLayoutElement.YearElement] = {
850
+ className: Classname.build(className, "noseur-date-time-picker-long-year-selected", this.props.attrsRelay?.years?.selected?.className)
851
+ };
852
+ else
853
+ controlPropsMap[DateTimePickerLayoutElement.YearElement] = { className };
854
+ const opts = {
855
+ ...options,
856
+ action,
857
+ text: year,
858
+ layoutElement: DateTimePickerLayoutElement.YearElement,
859
+ control: controlPropsMap[DateTimePickerLayoutElement.YearElement],
860
+ basicAttrs: addClassesToComponentElementBasicAttributes(this.props.attrsRelay[DateTimePickerLayoutElement.YearElement], Classname.build((controlPropsMap[DateTimePickerLayoutElement.YearElement] || {}).className))
861
+ };
862
+ return (this.props.yearTemplate
863
+ ? this.props.yearTemplate(index, {
864
+ options: opts,
865
+ formattedDate,
866
+ controlActionMap,
867
+ props: this.props,
868
+ labelsMap: this.labelsMap,
869
+ elementBuilder: dateTimePickerBuildLayoutElement,
870
+ layoutElement: DateTimePickerLayoutElement.YearElement,
871
+ })
872
+ : dateTimePickerBuildLayoutElement(opts));
873
+ })));
874
+ return;
875
+ }
876
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.MonthsElements) {
877
+ const activeSelectedDate = DateHelper.clone(this.state.selectedDates.length ? this.state.selectedDates[0] : new Date());
878
+ layoutElements[DateTimePickerLayoutElement.MonthsElements] = (React.createElement("div", { className: "noseur-date-time-picker-months" }, Array(12).fill(undefined).map((_, index) => {
879
+ const selectedDate = DateHelper.clone(activeSelectedDate);
880
+ selectedDate.setMonth(index);
881
+ const action = (event) => this.onSelectMonth(event, index, activeYear);
882
+ const className = Classname.build("noseur-date-time-picker-month-name", this.props.attrsRelay?.years?.year?.className);
883
+ if (activeSelectedDate.getMonth() === index && activeSelectedDate.getFullYear() === activeYear)
884
+ controlPropsMap[DateTimePickerLayoutElement.MonthElement] = {
885
+ className: Classname.build(className, "noseur-date-time-picker-month-name-selected", this.props.attrsRelay?.years?.selected?.className)
886
+ };
887
+ else
888
+ controlPropsMap[DateTimePickerLayoutElement.MonthElement] = { className };
889
+ const monthName = selectedDate.toLocaleString(this.props.locale, { month: 'short' });
890
+ const opts = {
891
+ ...options,
892
+ action,
893
+ text: monthName,
894
+ layoutElement: DateTimePickerLayoutElement.MonthElement,
895
+ control: controlPropsMap[DateTimePickerLayoutElement.MonthElement],
896
+ basicAttrs: addClassesToComponentElementBasicAttributes(this.props.attrsRelay[DateTimePickerLayoutElement.MonthElement], Classname.build((controlPropsMap[DateTimePickerLayoutElement.MonthElement] || {}).className))
897
+ };
898
+ return (this.props.monthTemplate
899
+ ? this.props.monthTemplate(MonthIndex[index], {
900
+ options: opts,
901
+ formattedDate,
902
+ controlActionMap,
903
+ props: this.props,
904
+ labelsMap: this.labelsMap,
905
+ elementBuilder: dateTimePickerBuildLayoutElement,
906
+ layoutElement: DateTimePickerLayoutElement.YearElement,
907
+ })
908
+ : dateTimePickerBuildLayoutElement(opts));
909
+ })));
910
+ return;
911
+ }
912
+ options.scheme = this.selectDateControlScheme(requiredLayoutElement);
913
+ if (!DateTimePickerLayoutElementsValues.includes(requiredLayoutElement) && this.props.customElementTemplate) {
914
+ const opts = {
915
+ ...options,
916
+ basicAttrs: addClassesToComponentElementBasicAttributes(this.props.attrsRelay[DateTimePickerLayoutElement.MonthElement], "noseur-date-time-picker-custom")
917
+ };
918
+ layoutElements[requiredLayoutElement] = this.props.customElementTemplate({
919
+ options: opts,
920
+ formattedDate,
921
+ controlActionMap,
922
+ props: this.props,
923
+ labelsMap: this.labelsMap,
924
+ layoutElement: requiredLayoutElement,
925
+ elementBuilder: dateTimePickerBuildLayoutElement,
926
+ });
927
+ return;
928
+ }
929
+ if (requiredLayoutElement === DateTimePickerLayoutElement.YearToElement)
930
+ options.text = `` + (activeYear + this.props.modeDifferenceCount - 1);
931
+ layoutElements[requiredLayoutElement] = dateTimePickerBuildLayoutElement(options);
932
+ });
933
+ requiredLayoutElements.forEach(requiredLayoutElement => {
934
+ const options = {
935
+ formattedDate,
936
+ scheme: this.props.scheme,
937
+ layoutElement: requiredLayoutElement,
938
+ text: this.labelsMap[requiredLayoutElement],
939
+ action: controlActionMap[requiredLayoutElement],
940
+ control: controlPropsMap[requiredLayoutElement],
941
+ basicAttrs: this.props.attrsRelay[requiredLayoutElement],
942
+ };
943
+ if (!requiredLayoutElement.includes("Element") || !excludedLayouts.includes(requiredLayoutElement))
944
+ return;
945
+ if (requiredLayoutElement === DateTimePickerLayoutElement.HeaderElement && !this.props.timeOnly) {
946
+ const className = Classname.build("noseur-date-time-picker-header");
947
+ layoutElements[DateTimePickerLayoutElement.HeaderElement] = this.buildLayoutElement(options, formattedDate, layoutElements, DateTimePickerLayoutElement.HeaderElement, this.props.headerLayout, className, this.props.headerTemplate, controlActionMap);
948
+ }
949
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.FooterElement && !this.props.timeOnly) {
950
+ const className = Classname.build("noseur-date-time-picker-footer");
951
+ layoutElements[DateTimePickerLayoutElement.FooterElement] = this.buildLayoutElement(options, formattedDate, layoutElements, DateTimePickerLayoutElement.FooterElement, this.props.footerLayout, className, this.props.footerTemplate, controlActionMap);
952
+ }
953
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.YearModeHeaderElement && !this.props.timeOnly) {
954
+ const className = Classname.build("noseur-date-time-picker-year-mode-header");
955
+ layoutElements[DateTimePickerLayoutElement.YearModeHeaderElement] = this.buildLayoutElement(options, formattedDate, layoutElements, DateTimePickerLayoutElement.YearModeHeaderElement, this.props.yearModeHeaderLayout, className, this.props.yearModeHeaderTemplate, controlActionMap);
956
+ }
957
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.YearModeFooterElement && !this.props.timeOnly) {
958
+ const className = Classname.build("noseur-date-time-picker-year-mode-footer");
959
+ layoutElements[DateTimePickerLayoutElement.YearModeFooterElement] = this.buildLayoutElement(options, formattedDate, layoutElements, DateTimePickerLayoutElement.YearModeFooterElement, this.props.yearModeFooterLayout, className, this.props.yearModeFooterTemplate, controlActionMap);
960
+ }
961
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.MonthModeHeaderElement && !this.props.timeOnly) {
962
+ const className = Classname.build("noseur-date-time-picker-month-mode-header");
963
+ layoutElements[DateTimePickerLayoutElement.MonthModeHeaderElement] = this.buildLayoutElement(options, formattedDate, layoutElements, DateTimePickerLayoutElement.MonthModeHeaderElement, this.props.monthModeHeaderLayout, className, this.props.monthModeHeaderTemplate, controlActionMap);
964
+ }
965
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.MonthModeFooterElement && !this.props.timeOnly) {
966
+ const className = Classname.build("noseur-date-time-picker-month-mode-footer");
967
+ layoutElements[DateTimePickerLayoutElement.MonthModeFooterElement] = this.buildLayoutElement(options, formattedDate, layoutElements, DateTimePickerLayoutElement.MonthModeFooterElement, this.props.monthModeFooterLayout, className, this.props.monthModeFooterTemplate, controlActionMap);
968
+ }
969
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.TopPanelElement && !this.props.timeOnly) {
970
+ const className = Classname.build("noseur-date-time-picker-top-panel");
971
+ layoutElements[DateTimePickerLayoutElement.TopPanelElement] = this.buildLayoutElement(options, formattedDate, layoutElements, DateTimePickerLayoutElement.TopPanelElement, this.props.topLayout, className, this.props.topPanelTemplate, controlActionMap);
972
+ }
973
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.BottomPanelElement && !this.props.timeOnly) {
974
+ const className = Classname.build("noseur-date-time-picker-bottom-panel");
975
+ layoutElements[DateTimePickerLayoutElement.BottomPanelElement] = this.buildLayoutElement(options, formattedDate, layoutElements, DateTimePickerLayoutElement.BottomPanelElement, this.props.bottomLayout, className, this.props.bottomPanelTemplate, controlActionMap);
976
+ }
977
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.LeftPanelElement && !this.props.timeOnly) {
978
+ const className = Classname.build("noseur-date-time-picker-left-panel");
979
+ layoutElements[DateTimePickerLayoutElement.LeftPanelElement] = this.buildLayoutElement(options, formattedDate, layoutElements, DateTimePickerLayoutElement.LeftPanelElement, this.props.leftLayout, className, this.props.leftPanelTemplate, controlActionMap);
980
+ }
981
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.RightPanelElement && !this.props.timeOnly) {
982
+ const className = Classname.build("noseur-date-time-picker-right-panel");
983
+ layoutElements[DateTimePickerLayoutElement.RightPanelElement] = this.buildLayoutElement(options, formattedDate, layoutElements, DateTimePickerLayoutElement.RightPanelElement, this.props.rightLayout, className, this.props.rightPanelTemplate, controlActionMap);
984
+ }
985
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.SelectionElement && !this.props.timeOnly) {
986
+ const className = Classname.build("noseur-date-time-picker-selection");
987
+ const selectionTemplate = !this.props.selectionTemplate ? null : (options) => this.props.selectionTemplate(this.state.selectedDates, options);
988
+ layoutElements[DateTimePickerLayoutElement.SelectionElement] = this.buildLayoutElement(options, formattedDate, layoutElements, DateTimePickerLayoutElement.SelectionElement, this.props.selectionLayout, className, selectionTemplate, controlActionMap);
989
+ }
990
+ else if (requiredLayoutElement === DateTimePickerLayoutElement.TimeElement && this.props.showTime) {
991
+ const className = Classname.build("noseur-date-time-picker-time");
992
+ layoutElements[DateTimePickerLayoutElement.TimeElement] = this.buildLayoutElement(options, formattedDate, layoutElements, DateTimePickerLayoutElement.TimeElement, this.props.timeLayout, className, this.props.timeTemplate, controlActionMap);
993
+ }
994
+ });
995
+ return layoutElements;
996
+ }
997
+ buildLayout(formattedDate, layoutElements, controlActionMap) {
998
+ let layout = this.props.layout;
999
+ if (this.state.activeMode === DateTimePickerMode.YEAR)
1000
+ layout = this.props.yearModeLayout;
1001
+ if (this.state.activeMode === DateTimePickerMode.MONTH)
1002
+ layout = this.props.monthModeLayout;
1003
+ const rows = layout.split(DateTimePickerLayoutElement.RowDividerElement);
1004
+ return rows.map((row, index) => {
1005
+ if (!row.trim())
1006
+ return null;
1007
+ const className = Classname.build("noseur-date-time-picker-layout noseur-date-time-picker-layout-row");
1008
+ const columns = row.split(DateTimePickerLayoutElement.ColumnDividerElement);
1009
+ return (React.createElement("div", { className: className, key: index }, columns.map((column, index) => {
1010
+ const className = Classname.build("noseur-date-time-picker-layout noseur-date-time-picker-layout-column", {
1011
+ "noseur-wd-100-pct": BoolHelper.equalsAny(column.trim(), ["TopPanelElement", "BottomPanelElement"])
1012
+ });
1013
+ const options = {
1014
+ formattedDate,
1015
+ layoutElement: column,
1016
+ scheme: this.props.scheme,
1017
+ text: this.labelsMap[column],
1018
+ action: controlActionMap[column],
1019
+ basicAttrs: addClassesToComponentElementBasicAttributes(this.props.attrsRelay[column], "noseur-date-time-picker-custom"),
1020
+ };
1021
+ return this.buildLayoutElement(options, formattedDate, layoutElements, DateTimePickerLayoutElement.MainLayoutElement, column, className, this.props.layoutTemplate, controlActionMap, index);
1022
+ })));
1023
+ });
1024
+ }
1025
+ render() {
1026
+ const formattedDate = DateHelper.formatDateToObject(this.state.activeDate, {
1027
+ monthName: { month: 'long' },
1028
+ longYear: { year: 'numeric' },
1029
+ formatted: this.props.dateFormat,
1030
+ }, this.props.locale, this.props.hourFormat, this.state.activeDate);
1031
+ const controlActionMap = {
1032
+ NowElement: this.selectNowDate,
1033
+ ClearElement: this.clearDateSelection,
1034
+ SelectElement: (e) => { this.reportOnSelectDate(); this.toggle(e); },
1035
+ TodayElement: () => this.performDateControlAction(DateTimePickerLayoutElement.TodayElement),
1036
+ LastYearElement: () => this.performDateControlAction(DateTimePickerLayoutElement.LastYearElement),
1037
+ ThisYearElement: () => this.performDateControlAction(DateTimePickerLayoutElement.ThisYearElement),
1038
+ TodayDateElement: () => this.performDateControlAction(DateTimePickerLayoutElement.TodayDateElement),
1039
+ YesterdayElement: () => this.performDateControlAction(DateTimePickerLayoutElement.YesterdayElement),
1040
+ ThisMonthElement: () => this.performDateControlAction(DateTimePickerLayoutElement.ThisMonthElement),
1041
+ LastMonthElement: () => this.performDateControlAction(DateTimePickerLayoutElement.LastMonthElement),
1042
+ YearElement: () => !this.props.staticMode && this.switchMode(DateTimePickerLayoutElement.YearElement),
1043
+ MonthElement: () => !this.props.staticMode && this.switchMode(DateTimePickerLayoutElement.MonthElement),
1044
+ LastSevenDaysElement: () => this.performDateControlAction(DateTimePickerLayoutElement.LastSevenDaysElement),
1045
+ LastThirtyDaysElement: () => this.performDateControlAction(DateTimePickerLayoutElement.LastThirtyDaysElement),
1046
+ };
1047
+ const layoutElements = this.buildLayoutElements(formattedDate, controlActionMap);
1048
+ const layoutPanel = this.buildLayout(formattedDate, layoutElements, controlActionMap);
1049
+ const className = Classname.build("noseur-date-time-picker", {
1050
+ "noseur-date-time-picker-time-only": this.props.timeOnly,
1051
+ "noseur-date-time-picker-modal": this.props.type === ComponentRenderType.MODAL,
1052
+ "noseur-date-time-picker-inline": this.props.type === ComponentRenderType.INLINE,
1053
+ "noseur-date-time-picker-popover": this.props.type === ComponentRenderType.POPOVER,
1054
+ }, this.props.scheme ? `${this.props.scheme}-vars` : null, this.props.className);
1055
+ const ref = (r) => {
1056
+ if (!r)
1057
+ return;
1058
+ if (this.props.autoFocus)
1059
+ r.focus();
1060
+ ObjectHelper.resolveRef(this.props.forwardRef, r);
1061
+ };
1062
+ switch (this.props.type) {
1063
+ case ComponentRenderType.MODAL:
1064
+ return (React.createElement(Dialog, { notClosable: true, ...this.props.attrsRelay?.dialog, ref: ref, className: className, style: this.props.style, manageRef: (m) => this.dialogManageRef = m, visible: this.state.modalVisible, onHide: () => this.setState({ modalVisible: false }) }, layoutPanel));
1065
+ case ComponentRenderType.POPOVER:
1066
+ return (React.createElement(Popover, { outsideClickLogic: "positional", ...this.props.attrsRelay?.popover, ref: ref, className: className, style: this.props.style, manageRef: (m) => this.popoverManageRef = m }, layoutPanel));
1067
+ default:
1068
+ return (React.createElement("div", { ref: ref, className: className, style: this.props.style }, layoutPanel));
1069
+ }
1070
+ }
1071
+ }
1072
+ export const DateTimePicker = ({ ref, ...props }) => (React.createElement(DateTimePickerComponent, { ...props, forwardRef: ref, showTime: true }));
1073
+ export const YearPicker = ({ ref, ...props }) => (React.createElement(DateTimePickerComponent, { ...props, forwardRef: ref, showTime: false, mode: DateTimePickerMode.YEAR }));
1074
+ export const MonthPicker = ({ ref, ...props }) => (React.createElement(DateTimePickerComponent, { ...props, forwardRef: ref, showTime: false, mode: DateTimePickerMode.MONTH }));
1075
+ export const DatePicker = ({ ref, ...props }) => (React.createElement(DateTimePickerComponent, { ...props, forwardRef: ref, showTime: false }));
1076
+ export const TimePicker = ({ ref, ...props }) => (React.createElement(DateTimePickerComponent, { ...props, forwardRef: ref, showTime: true, timeOnly: true, layout: DateTimePickerLayoutElement.TimeElement, attrsRelay: { ...props.attrsRelay, popover: { ...props.attrsRelay?.popover, pointingArrowClassName: "" } } }));
1077
+ export const DateTimePickerLayoutElementsValues = Object.values(DateTimePickerLayoutElement);
1078
+ export function dateTimePickerBuildLayoutElement(options) {
1079
+ let { basicAttrs, formattedDate, key, text, layoutElement, control, scheme, action } = options;
1080
+ key = key ?? DOMHelper.uniqueElementId();
1081
+ if (layoutElement === DateTimePickerLayoutElement.PreviousElement) {
1082
+ return buildButtonControl(control || {}, {
1083
+ key,
1084
+ rounded: true,
1085
+ textOnly: true,
1086
+ style: basicAttrs?.style,
1087
+ leftIcon: "fa fa-angle-left",
1088
+ scheme: basicAttrs?.scheme ?? scheme,
1089
+ }, action, Classname.build("noseur-date-time-picker-prev", basicAttrs?.className));
1090
+ }
1091
+ else if (layoutElement === DateTimePickerLayoutElement.NextElement) {
1092
+ return buildButtonControl(control || {}, {
1093
+ key,
1094
+ rounded: true,
1095
+ textOnly: true,
1096
+ style: basicAttrs?.style,
1097
+ leftIcon: "fa fa-angle-right",
1098
+ scheme: basicAttrs?.scheme ?? scheme,
1099
+ }, action, Classname.build("noseur-date-time-picker-next", basicAttrs?.className));
1100
+ }
1101
+ else if (layoutElement === DateTimePickerLayoutElement.IncrementElement) {
1102
+ return buildButtonControl(control || {}, {
1103
+ key,
1104
+ rounded: true,
1105
+ textOnly: true,
1106
+ style: basicAttrs?.style,
1107
+ leftIcon: "fa fa-angle-up",
1108
+ scheme: basicAttrs?.scheme ?? scheme,
1109
+ }, action, Classname.build("noseur-date-time-picker-incr", basicAttrs?.className));
1110
+ }
1111
+ else if (layoutElement === DateTimePickerLayoutElement.DecrementElement) {
1112
+ return buildButtonControl(control || {}, {
1113
+ key,
1114
+ rounded: true,
1115
+ textOnly: true,
1116
+ style: basicAttrs?.style,
1117
+ leftIcon: "fa fa-angle-down",
1118
+ scheme: basicAttrs?.scheme ?? scheme,
1119
+ }, action, Classname.build("noseur-date-time-picker-decr", basicAttrs?.className));
1120
+ }
1121
+ else if (layoutElement === DateTimePickerLayoutElement.TodayDateElement) {
1122
+ return buildButtonControl(control || {}, {
1123
+ key,
1124
+ text,
1125
+ style: basicAttrs?.style,
1126
+ scheme: basicAttrs?.scheme ?? scheme,
1127
+ }, action, Classname.build("noseur-date-time-picker-todays-date", basicAttrs?.className));
1128
+ }
1129
+ else if (layoutElement === DateTimePickerLayoutElement.ClearElement) {
1130
+ return buildButtonControl(control || {}, {
1131
+ key,
1132
+ text,
1133
+ style: basicAttrs?.style,
1134
+ scheme: basicAttrs?.scheme ?? scheme,
1135
+ }, action, Classname.build("noseur-date-time-picker-clear", basicAttrs?.className));
1136
+ }
1137
+ else if (layoutElement === DateTimePickerLayoutElement.SelectElement) {
1138
+ return buildButtonControl(control || {}, {
1139
+ key,
1140
+ text,
1141
+ style: basicAttrs?.style,
1142
+ scheme: basicAttrs?.scheme ?? scheme,
1143
+ }, action, Classname.build("noseur-date-time-picker-select", basicAttrs?.className));
1144
+ }
1145
+ else if (layoutElement === DateTimePickerLayoutElement.NowElement) {
1146
+ return buildButtonControl(control || {}, {
1147
+ key,
1148
+ text,
1149
+ style: basicAttrs?.style,
1150
+ scheme: basicAttrs?.scheme ?? scheme,
1151
+ }, action, Classname.build("noseur-date-time-picker-now", basicAttrs?.className));
1152
+ }
1153
+ else if (BoolHelper.equalsAny(layoutElement, [
1154
+ DateTimePickerLayoutElement.TodayElement,
1155
+ DateTimePickerLayoutElement.ThisYearElement,
1156
+ DateTimePickerLayoutElement.LastYearElement,
1157
+ DateTimePickerLayoutElement.YesterdayElement,
1158
+ DateTimePickerLayoutElement.YesterdayElement,
1159
+ DateTimePickerLayoutElement.ThisMonthElement,
1160
+ DateTimePickerLayoutElement.LastMonthElement,
1161
+ DateTimePickerLayoutElement.LastSevenDaysElement,
1162
+ DateTimePickerLayoutElement.LastThirtyDaysElement,
1163
+ ])) {
1164
+ return buildButtonControl(control || {}, {
1165
+ key,
1166
+ text,
1167
+ textOnly: true,
1168
+ style: basicAttrs?.style,
1169
+ scheme: basicAttrs?.scheme ?? scheme,
1170
+ }, action, Classname.build("noseur-date-time-picker-today", basicAttrs?.className));
1171
+ }
1172
+ else if (layoutElement === DateTimePickerLayoutElement.MonthElement) {
1173
+ const className = Classname.build("noseur-date-time-picker-month-name", {
1174
+ "noseur-date-time-picker-month-name-enabled": !!scheme
1175
+ }, (control || {}).className, basicAttrs?.className);
1176
+ return (React.createElement("span", { className: className, style: basicAttrs?.style, onClick: action, key: key }, text ?? formattedDate.monthName));
1177
+ }
1178
+ else if (layoutElement === DateTimePickerLayoutElement.YearElement) {
1179
+ const className = Classname.build("noseur-date-time-picker-long-year", {
1180
+ "noseur-date-time-picker-long-year-enabled": !!scheme
1181
+ }, (control || {}).className, basicAttrs?.className);
1182
+ return (React.createElement("span", { className: className, style: basicAttrs?.style, onClick: action, key: key }, text ?? formattedDate.longYear));
1183
+ }
1184
+ else if (BoolHelper.equalsAny(layoutElement, [
1185
+ Weekday.SUNDAY,
1186
+ Weekday.MONDAY,
1187
+ Weekday.FRIDAY,
1188
+ Weekday.TUESDAY,
1189
+ Weekday.THURSDAY,
1190
+ Weekday.SATURDAY,
1191
+ Weekday.WEDNESDAY,
1192
+ ])) {
1193
+ return (React.createElement("span", { style: basicAttrs?.style, className: Classname.build("noseur-date-time-picker-weekdays-day", basicAttrs?.className), key: key }, text ?? DateHelper.translateWeekday(layoutElement)));
1194
+ }
1195
+ else if (layoutElement === DateTimePickerLayoutElement.DayElement) {
1196
+ return buildButtonControl(control || {}, {
1197
+ text,
1198
+ scheme,
1199
+ rounded: true,
1200
+ textOnly: true,
1201
+ borderless: true,
1202
+ disabled: formattedDate.disabled,
1203
+ id: (formattedDate.isNotInMonth ? `N` : "") + formattedDate.day + key,
1204
+ key: (formattedDate.isNotInMonth ? `N` : "") + formattedDate.day + key,
1205
+ }, action);
1206
+ }
1207
+ else if (layoutElement === DateTimePickerLayoutElement.YearToElement) {
1208
+ return (React.createElement("span", { style: basicAttrs?.style, className: Classname.build("noseur-date-time-picker-year-to", basicAttrs?.className), key: key }, text ?? formattedDate.longYear));
1209
+ }
1210
+ else if (layoutElement === DateTimePickerLayoutElement.YearFromElement) {
1211
+ return (React.createElement("span", { style: basicAttrs?.style, className: Classname.build("noseur-date-time-picker-year-from", basicAttrs?.className), key: key }, text ?? formattedDate.longYear));
1212
+ }
1213
+ else if (layoutElement === DateTimePickerLayoutElement.TodaysDateElement) {
1214
+ return (React.createElement("span", { style: basicAttrs?.style, className: Classname.build("noseur-date-time-picker-todays-date", basicAttrs?.className), key: key }, formattedDate.formatted));
1215
+ }
1216
+ // time
1217
+ if (layoutElement === DateTimePickerLayoutElement.HourElement) {
1218
+ return (React.createElement("span", { style: basicAttrs?.style, className: Classname.build("noseur-date-time-picker-time-hours", basicAttrs?.className), key: key }, formattedDate.hours));
1219
+ }
1220
+ else if (layoutElement === DateTimePickerLayoutElement.MinutesElement) {
1221
+ return (React.createElement("span", { style: basicAttrs?.style, className: Classname.build("noseur-date-time-picker-time-minutes", basicAttrs?.className), key: key }, formattedDate.minutes));
1222
+ }
1223
+ else if (layoutElement === DateTimePickerLayoutElement.SecondsElement) {
1224
+ return (React.createElement("span", { style: basicAttrs?.style, className: Classname.build("noseur-date-time-picker-time-seconds", basicAttrs?.className), key: key }, formattedDate.seconds));
1225
+ }
1226
+ else if (layoutElement === DateTimePickerLayoutElement.MeridianElement) {
1227
+ return (React.createElement("span", { style: basicAttrs?.style, className: Classname.build("noseur-date-time-picker-time-meridian", basicAttrs?.className), key: key }, formattedDate.meridian));
1228
+ }
1229
+ else if (layoutElement === DateTimePickerLayoutElement.SelectedDateElement) {
1230
+ return (React.createElement("span", { style: basicAttrs?.style, className: Classname.build("noseur-date-time-picker-selected-dates-selected-date", basicAttrs?.className), key: key }, text));
1231
+ }
1232
+ // groups
1233
+ if (layoutElement === DateTimePickerLayoutElement.OpenColumnGroupElement
1234
+ || layoutElement === DateTimePickerLayoutElement.OpenRowGroupElement
1235
+ || layoutElement === DateTimePickerLayoutElement.CloseRowGroupElement
1236
+ || layoutElement === DateTimePickerLayoutElement.CloseColumnGroupElement) {
1237
+ return layoutElement;
1238
+ }
1239
+ // seperators
1240
+ if (layoutElement === DateTimePickerLayoutElement.DashElement) {
1241
+ return (React.createElement("div", { style: basicAttrs?.style, className: Classname.build("noseur-date-time-picker-dash", basicAttrs?.className), key: key }, "-"));
1242
+ }
1243
+ else if (layoutElement === DateTimePickerLayoutElement.SpaceElement) {
1244
+ return (React.createElement("div", { style: basicAttrs?.style, className: Classname.build("noseur-date-time-picker-space", basicAttrs?.className), key: key }, " "));
1245
+ }
1246
+ else if (layoutElement === DateTimePickerLayoutElement.TimeSeparator) {
1247
+ return (React.createElement("span", { style: basicAttrs?.style, className: Classname.build("noseur-date-time-picker-time-seperator", basicAttrs?.className), key: key }, ":"));
1248
+ }
1249
+ else if (layoutElement === DateTimePickerLayoutElement.SpaceLeftRightElement) {
1250
+ return (React.createElement("div", { style: basicAttrs?.style, className: Classname.build("noseur-date-time-picker-seperator", basicAttrs?.className), key: key }));
1251
+ }
1252
+ return (React.createElement("div", { className: Classname.build("noseur-date-time-picker-custom", basicAttrs?.className) }, text ?? layoutElement));
1253
+ }
1254
+ // TODO position on click for popover
1255
+ // do not close if it range until twio date selected
1256
+ // do not close for multiple selection mode
1257
+ /*numberOfMonth
1258
+ monthsSeparatorLayout
1259
+
1260
+ https://reactjsexample.com/a-group-calendar-application-using-the-mern-stack-intended-to-bring-discord-communities-closer/
1261
+ https://reactjsexample.com/an-open-source-fullcalendar-scheduler-using-react/
1262
+ https://reactjsexample.com/application-in-nextjs-using-fullcalendar-library/
1263
+ https://reactjsexample.com/lightweight-availability-bookings-calendar-built-with-react-and-typescript/
1264
+ https://tele.smarthealth.eclathealthcare.com/doctor/schedules
1265
+ https://tele.smarthealth.eclathealthcare.com/doctor/appointments*/