@govtechsg/sgds-web-component 3.25.0 → 3.25.1-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/Checkbox/index.umd.min.js +233 -233
- package/components/Checkbox/index.umd.min.js.map +1 -1
- package/components/Checkbox/sgds-checkbox.d.ts +1 -0
- package/components/Checkbox/sgds-checkbox.js +6 -1
- package/components/Checkbox/sgds-checkbox.js.map +1 -1
- package/components/ComboBox/index.umd.min.js +241 -242
- package/components/ComboBox/index.umd.min.js.map +1 -1
- package/components/ComboBox/sgds-combo-box.js +0 -1
- package/components/ComboBox/sgds-combo-box.js.map +1 -1
- package/components/DataTable/data-table.js +6 -0
- package/components/DataTable/data-table.js.map +1 -0
- package/components/DataTable/index.d.ts +12 -0
- package/components/DataTable/index.js +11 -0
- package/components/DataTable/index.js.map +1 -0
- package/components/DataTable/index.umd.min.js +2633 -0
- package/components/DataTable/index.umd.min.js.map +1 -0
- package/components/DataTable/sgds-data-table-cell.d.ts +15 -0
- package/components/DataTable/sgds-data-table-cell.js +32 -0
- package/components/DataTable/sgds-data-table-cell.js.map +1 -0
- package/components/DataTable/sgds-data-table-head.d.ts +28 -0
- package/components/DataTable/sgds-data-table-head.js +69 -0
- package/components/DataTable/sgds-data-table-head.js.map +1 -0
- package/components/DataTable/sgds-data-table-row.d.ts +76 -0
- package/components/DataTable/sgds-data-table-row.js +333 -0
- package/components/DataTable/sgds-data-table-row.js.map +1 -0
- package/components/DataTable/sgds-data-table.d.ts +82 -0
- package/components/DataTable/sgds-data-table.js +405 -0
- package/components/DataTable/sgds-data-table.js.map +1 -0
- package/components/Datepicker/datepicker-calendar.js +4 -4
- package/components/Datepicker/datepicker-calendar.js.map +1 -1
- package/components/Datepicker/datepicker-header.js +2 -2
- package/components/Datepicker/datepicker-header.js.map +1 -1
- package/components/Datepicker/datepicker-input.js +13 -48
- package/components/Datepicker/datepicker-input.js.map +1 -1
- package/components/Datepicker/index.umd.min.js +341 -341
- package/components/Datepicker/index.umd.min.js.map +1 -1
- package/components/Datepicker/sgds-datepicker.js +6 -6
- package/components/Datepicker/sgds-datepicker.js.map +1 -1
- package/components/Footer/index.umd.min.js +1 -1
- package/components/Input/index.umd.min.js +2 -2
- package/components/Input/index.umd.min.js.map +1 -1
- package/components/Input/input.js +1 -1
- package/components/QuantityToggle/index.umd.min.js +1 -1
- package/components/QuantityToggle/index.umd.min.js.map +1 -1
- package/components/Select/index.umd.min.js +21 -22
- package/components/Select/index.umd.min.js.map +1 -1
- package/components/Select/sgds-select.js +0 -1
- package/components/Select/sgds-select.js.map +1 -1
- package/components/Sidebar/index.umd.min.js +24 -24
- package/components/Sidebar/index.umd.min.js.map +1 -1
- package/components/Sidebar/sgds-sidebar-group.d.ts +1 -0
- package/components/Sidebar/sgds-sidebar-group.js +7 -1
- package/components/Sidebar/sgds-sidebar-group.js.map +1 -1
- package/components/Sidebar/sgds-sidebar-section.d.ts +1 -0
- package/components/Sidebar/sgds-sidebar-section.js +12 -2
- package/components/Sidebar/sgds-sidebar-section.js.map +1 -1
- package/components/Sidebar/sgds-sidebar.d.ts +5 -4
- package/components/Sidebar/sgds-sidebar.js.map +1 -1
- package/components/Sidebar/sidebar-element.d.ts +2 -2
- package/components/Sidebar/sidebar-element.js +12 -34
- package/components/Sidebar/sidebar-element.js.map +1 -1
- package/components/Sidebar/types.d.ts +3 -0
- package/components/Subnav/index.umd.min.js +1 -1
- package/components/Tab/index.umd.min.js +8 -8
- package/components/Tab/index.umd.min.js.map +1 -1
- package/components/Tab/sgds-tab-group.d.ts +2 -0
- package/components/Tab/sgds-tab-group.js +9 -0
- package/components/Tab/sgds-tab-group.js.map +1 -1
- package/components/Tab/tab-group.js +1 -1
- package/components/Tab/tab-panel.js +1 -1
- package/components/Tab/tab.js +1 -1
- package/components/Textarea/index.umd.min.js +1 -1
- package/components/index.d.ts +4 -0
- package/components/index.js +4 -0
- package/components/index.js.map +1 -1
- package/components/index.umd.min.js +567 -475
- package/components/index.umd.min.js.map +1 -1
- package/css/fouc.css +4 -0
- package/css/grid.css +347 -124
- package/css/grid.js +1 -1
- package/css/utility.css +0 -1
- package/custom-elements.json +1541 -149
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/index.umd.min.js +422 -330
- package/index.umd.min.js.map +1 -1
- package/package.json +1 -3
- package/react/components/Checkbox/sgds-checkbox.cjs.js +6 -1
- package/react/components/Checkbox/sgds-checkbox.cjs.js.map +1 -1
- package/react/components/Checkbox/sgds-checkbox.js +6 -1
- package/react/components/Checkbox/sgds-checkbox.js.map +1 -1
- package/react/components/ComboBox/sgds-combo-box.cjs.js +0 -1
- package/react/components/ComboBox/sgds-combo-box.cjs.js.map +1 -1
- package/react/components/ComboBox/sgds-combo-box.js +0 -1
- package/react/components/ComboBox/sgds-combo-box.js.map +1 -1
- package/react/components/DataTable/data-table.cjs.js +11 -0
- package/react/components/DataTable/data-table.cjs.js.map +1 -0
- package/react/components/DataTable/data-table.js +7 -0
- package/react/components/DataTable/data-table.js.map +1 -0
- package/react/components/DataTable/sgds-data-table-cell.cjs.js +38 -0
- package/react/components/DataTable/sgds-data-table-cell.cjs.js.map +1 -0
- package/react/components/DataTable/sgds-data-table-cell.js +33 -0
- package/react/components/DataTable/sgds-data-table-cell.js.map +1 -0
- package/react/components/DataTable/sgds-data-table-head.cjs.js +75 -0
- package/react/components/DataTable/sgds-data-table-head.cjs.js.map +1 -0
- package/react/components/DataTable/sgds-data-table-head.js +70 -0
- package/react/components/DataTable/sgds-data-table-head.js.map +1 -0
- package/react/components/DataTable/sgds-data-table-row.cjs.js +339 -0
- package/react/components/DataTable/sgds-data-table-row.cjs.js.map +1 -0
- package/react/components/DataTable/sgds-data-table-row.js +334 -0
- package/react/components/DataTable/sgds-data-table-row.js.map +1 -0
- package/react/components/DataTable/sgds-data-table.cjs.js +411 -0
- package/react/components/DataTable/sgds-data-table.cjs.js.map +1 -0
- package/react/components/DataTable/sgds-data-table.js +406 -0
- package/react/components/DataTable/sgds-data-table.js.map +1 -0
- package/react/components/Datepicker/datepicker-calendar.cjs.js +4 -4
- package/react/components/Datepicker/datepicker-calendar.cjs.js.map +1 -1
- package/react/components/Datepicker/datepicker-calendar.js +4 -4
- package/react/components/Datepicker/datepicker-calendar.js.map +1 -1
- package/react/components/Datepicker/datepicker-header.cjs.js +2 -2
- package/react/components/Datepicker/datepicker-header.cjs.js.map +1 -1
- package/react/components/Datepicker/datepicker-header.js +2 -2
- package/react/components/Datepicker/datepicker-header.js.map +1 -1
- package/react/components/Datepicker/datepicker-input.cjs.js +13 -52
- package/react/components/Datepicker/datepicker-input.cjs.js.map +1 -1
- package/react/components/Datepicker/datepicker-input.js +13 -48
- package/react/components/Datepicker/datepicker-input.js.map +1 -1
- package/react/components/Datepicker/sgds-datepicker.cjs.js +6 -6
- package/react/components/Datepicker/sgds-datepicker.cjs.js.map +1 -1
- package/react/components/Datepicker/sgds-datepicker.js +6 -6
- package/react/components/Datepicker/sgds-datepicker.js.map +1 -1
- package/react/components/Input/input.cjs.js +1 -1
- package/react/components/Input/input.js +1 -1
- package/react/components/Select/sgds-select.cjs.js +0 -1
- package/react/components/Select/sgds-select.cjs.js.map +1 -1
- package/react/components/Select/sgds-select.js +0 -1
- package/react/components/Select/sgds-select.js.map +1 -1
- package/react/components/Sidebar/sgds-sidebar-group.cjs.js +7 -1
- package/react/components/Sidebar/sgds-sidebar-group.cjs.js.map +1 -1
- package/react/components/Sidebar/sgds-sidebar-group.js +7 -1
- package/react/components/Sidebar/sgds-sidebar-group.js.map +1 -1
- package/react/components/Sidebar/sgds-sidebar-section.cjs.js +12 -2
- package/react/components/Sidebar/sgds-sidebar-section.cjs.js.map +1 -1
- package/react/components/Sidebar/sgds-sidebar-section.js +12 -2
- package/react/components/Sidebar/sgds-sidebar-section.js.map +1 -1
- package/react/components/Sidebar/sgds-sidebar.cjs.js.map +1 -1
- package/react/components/Sidebar/sgds-sidebar.js.map +1 -1
- package/react/components/Sidebar/sidebar-element.cjs.js +12 -34
- package/react/components/Sidebar/sidebar-element.cjs.js.map +1 -1
- package/react/components/Sidebar/sidebar-element.js +12 -34
- package/react/components/Sidebar/sidebar-element.js.map +1 -1
- package/react/components/Tab/sgds-tab-group.cjs.js +9 -0
- package/react/components/Tab/sgds-tab-group.cjs.js.map +1 -1
- package/react/components/Tab/sgds-tab-group.js +9 -0
- package/react/components/Tab/sgds-tab-group.js.map +1 -1
- package/react/components/Tab/tab-group.cjs.js +1 -1
- package/react/components/Tab/tab-group.js +1 -1
- package/react/components/Tab/tab-panel.cjs.js +1 -1
- package/react/components/Tab/tab-panel.js +1 -1
- package/react/components/Tab/tab.cjs.js +1 -1
- package/react/components/Tab/tab.js +1 -1
- package/react/css/grid.cjs.js +1 -1
- package/react/css/grid.js +1 -1
- package/react/data-table/index.cjs.js +44 -0
- package/react/data-table/index.cjs.js.map +1 -0
- package/react/data-table/index.d.ts +4 -0
- package/react/data-table/index.js +20 -0
- package/react/data-table/index.js.map +1 -0
- package/react/data-table-cell/index.cjs.js +40 -0
- package/react/data-table-cell/index.cjs.js.map +1 -0
- package/react/data-table-cell/index.d.ts +4 -0
- package/react/data-table-cell/index.js +16 -0
- package/react/data-table-cell/index.js.map +1 -0
- package/react/data-table-head/index.cjs.js +40 -0
- package/react/data-table-head/index.cjs.js.map +1 -0
- package/react/data-table-head/index.d.ts +4 -0
- package/react/data-table-head/index.js +16 -0
- package/react/data-table-head/index.js.map +1 -0
- package/react/data-table-row/index.cjs.js +45 -0
- package/react/data-table-row/index.cjs.js.map +1 -0
- package/react/data-table-row/index.d.ts +4 -0
- package/react/data-table-row/index.js +21 -0
- package/react/data-table-row/index.js.map +1 -0
- package/react/index.cjs.js +126 -118
- package/react/index.cjs.js.map +1 -1
- package/react/index.d.ts +4 -0
- package/react/index.js +4 -0
- package/react/index.js.map +1 -1
- package/react/styles/form-text-control.cjs.js +1 -1
- package/react/styles/form-text-control.js +1 -1
- package/react/utils/date-helpers.cjs.js +120 -0
- package/react/utils/date-helpers.cjs.js.map +1 -0
- package/react/utils/date-helpers.js +108 -0
- package/react/utils/date-helpers.js.map +1 -0
- package/react/utils/date-mask.cjs.js +203 -0
- package/react/utils/date-mask.cjs.js.map +1 -0
- package/react/utils/date-mask.js +199 -0
- package/react/utils/date-mask.js.map +1 -0
- package/react/utils/time.cjs.js +7 -7
- package/react/utils/time.cjs.js.map +1 -1
- package/react/utils/time.js +1 -1
- package/react/utils/time.js.map +1 -1
- package/styles/form-text-control.js +1 -1
- package/types/react.d.ts +101 -0
- package/utils/date-helpers.d.ts +22 -0
- package/utils/date-helpers.js +107 -0
- package/utils/date-helpers.js.map +1 -0
- package/utils/date-mask.d.ts +44 -0
- package/utils/date-mask.js +198 -0
- package/utils/date-mask.js.map +1 -0
- package/utils/time.js +1 -1
- package/utils/time.js.map +1 -1
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
/**
|
|
3
|
+
* Lightweight date input mask replacing imask.
|
|
4
|
+
* Handles digit-only input with placeholder display for date formats.
|
|
5
|
+
*/
|
|
6
|
+
class DateMask {
|
|
7
|
+
constructor(input, options) {
|
|
8
|
+
this.listeners = new Map();
|
|
9
|
+
this.input = input;
|
|
10
|
+
this.placeholderStr = this._buildPlaceholder(options.pattern);
|
|
11
|
+
this._state = this.placeholderStr;
|
|
12
|
+
this.listeners.set("accept", []);
|
|
13
|
+
this.listeners.set("complete", []);
|
|
14
|
+
const masked = { value: "", isComplete: false };
|
|
15
|
+
Object.defineProperties(masked, {
|
|
16
|
+
value: { get: () => this._state, enumerable: true },
|
|
17
|
+
isComplete: { get: () => this._state.length > 0 && !/[DMY]/.test(this._state), enumerable: true }
|
|
18
|
+
});
|
|
19
|
+
this.masked = masked;
|
|
20
|
+
// If input already has a value that looks like a filled date, use it
|
|
21
|
+
if (this.input.value && this.input.value.length === this._state.length && !/[DMY]/.test(this.input.value)) {
|
|
22
|
+
this._state = this.input.value;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
this.input.value = this._state;
|
|
26
|
+
}
|
|
27
|
+
this._boundHandleBeforeInput = this._handleBeforeInput.bind(this);
|
|
28
|
+
this._boundHandleInput = this._handleInput.bind(this);
|
|
29
|
+
this._boundHandleKeydown = this._handleKeydown.bind(this);
|
|
30
|
+
this._boundHandleFocus = this._handleFocus.bind(this);
|
|
31
|
+
this._boundHandleBlur = this._handleBlur.bind(this);
|
|
32
|
+
this._valueAtFocus = this._state;
|
|
33
|
+
this.input.addEventListener("beforeinput", this._boundHandleBeforeInput);
|
|
34
|
+
this.input.addEventListener("input", this._boundHandleInput);
|
|
35
|
+
this.input.addEventListener("keydown", this._boundHandleKeydown);
|
|
36
|
+
this.input.addEventListener("focus", this._boundHandleFocus);
|
|
37
|
+
this.input.addEventListener("blur", this._boundHandleBlur);
|
|
38
|
+
}
|
|
39
|
+
get value() {
|
|
40
|
+
return this._state;
|
|
41
|
+
}
|
|
42
|
+
set value(val) {
|
|
43
|
+
if (!val || val === "") {
|
|
44
|
+
this._state = this.placeholderStr;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
this._state = val;
|
|
48
|
+
}
|
|
49
|
+
this.input.value = this._state;
|
|
50
|
+
this._emit("accept");
|
|
51
|
+
}
|
|
52
|
+
on(event, handler) {
|
|
53
|
+
var _a;
|
|
54
|
+
(_a = this.listeners.get(event)) === null || _a === void 0 ? void 0 : _a.push(handler);
|
|
55
|
+
}
|
|
56
|
+
updateValue() {
|
|
57
|
+
// Sync state from input (used when value set externally on input)
|
|
58
|
+
this._state = this.input.value;
|
|
59
|
+
}
|
|
60
|
+
destroy() {
|
|
61
|
+
this.input.removeEventListener("beforeinput", this._boundHandleBeforeInput);
|
|
62
|
+
this.input.removeEventListener("input", this._boundHandleInput);
|
|
63
|
+
this.input.removeEventListener("keydown", this._boundHandleKeydown);
|
|
64
|
+
this.input.removeEventListener("focus", this._boundHandleFocus);
|
|
65
|
+
this.input.removeEventListener("blur", this._boundHandleBlur);
|
|
66
|
+
this.listeners.clear();
|
|
67
|
+
}
|
|
68
|
+
_handleFocus() {
|
|
69
|
+
this._valueAtFocus = this._state;
|
|
70
|
+
}
|
|
71
|
+
_handleBlur() {
|
|
72
|
+
// Dispatch native change event if value changed during this focus session
|
|
73
|
+
if (this._state !== this._valueAtFocus) {
|
|
74
|
+
this.input.dispatchEvent(new Event("change", { bubbles: true }));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
_buildPlaceholder(pattern) {
|
|
78
|
+
return pattern
|
|
79
|
+
.replace(/`/g, "")
|
|
80
|
+
.replace(/\{(\/)\}/g, "$1")
|
|
81
|
+
.replace(/d/g, "D")
|
|
82
|
+
.replace(/m/g, "M")
|
|
83
|
+
.replace(/y/g, "Y");
|
|
84
|
+
}
|
|
85
|
+
_getDigitPositions() {
|
|
86
|
+
const positions = [];
|
|
87
|
+
for (let i = 0; i < this.placeholderStr.length; i++) {
|
|
88
|
+
const ch = this.placeholderStr[i];
|
|
89
|
+
if (ch === "D" || ch === "M" || ch === "Y") {
|
|
90
|
+
positions.push(i);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return positions;
|
|
94
|
+
}
|
|
95
|
+
_handleBeforeInput(e) {
|
|
96
|
+
// Prevent browser's default text handling — we handle everything in keydown
|
|
97
|
+
e.preventDefault();
|
|
98
|
+
}
|
|
99
|
+
_handleInput() {
|
|
100
|
+
// If browser still modified the value (some edge cases), restore our state
|
|
101
|
+
if (this.input.value !== this._state) {
|
|
102
|
+
this.input.value = this._state;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
_handleKeydown(e) {
|
|
106
|
+
if (e.key === "Backspace") {
|
|
107
|
+
e.preventDefault();
|
|
108
|
+
this._backspace();
|
|
109
|
+
}
|
|
110
|
+
else if (e.key === "Delete") {
|
|
111
|
+
e.preventDefault();
|
|
112
|
+
this._deleteForward();
|
|
113
|
+
}
|
|
114
|
+
else if (e.key.length === 1 && /\d/.test(e.key)) {
|
|
115
|
+
e.preventDefault();
|
|
116
|
+
this._insertDigit(e.key);
|
|
117
|
+
}
|
|
118
|
+
// Arrow keys: let browser handle cursor movement naturally
|
|
119
|
+
}
|
|
120
|
+
_insertDigit(digit) {
|
|
121
|
+
const digitPositions = this._getDigitPositions();
|
|
122
|
+
const currentVal = this._state.split("");
|
|
123
|
+
// Find the first unfilled placeholder position
|
|
124
|
+
let insertPos = -1;
|
|
125
|
+
for (const pos of digitPositions) {
|
|
126
|
+
if (/[DMY]/.test(currentVal[pos])) {
|
|
127
|
+
insertPos = pos;
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (insertPos === -1) {
|
|
132
|
+
// All filled — no room
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
currentVal[insertPos] = digit;
|
|
136
|
+
this._state = currentVal.join("");
|
|
137
|
+
this.input.value = this._state;
|
|
138
|
+
// Move cursor after the inserted digit
|
|
139
|
+
const nextPos = this._findNextInputPos(insertPos);
|
|
140
|
+
this.input.setSelectionRange(nextPos, nextPos);
|
|
141
|
+
this._emit("accept");
|
|
142
|
+
if (this.masked.isComplete) {
|
|
143
|
+
this._emit("complete");
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
_backspace() {
|
|
147
|
+
var _a;
|
|
148
|
+
const pos = (_a = this.input.selectionStart) !== null && _a !== void 0 ? _a : this._state.length;
|
|
149
|
+
const val = this._state.split("");
|
|
150
|
+
// Find previous digit position from cursor
|
|
151
|
+
let targetPos = pos - 1;
|
|
152
|
+
while (targetPos >= 0 && !/\d/.test(val[targetPos])) {
|
|
153
|
+
targetPos--;
|
|
154
|
+
}
|
|
155
|
+
if (targetPos >= 0) {
|
|
156
|
+
val[targetPos] = this.placeholderStr[targetPos];
|
|
157
|
+
this._state = val.join("");
|
|
158
|
+
this.input.value = this._state;
|
|
159
|
+
this.input.setSelectionRange(targetPos, targetPos);
|
|
160
|
+
this._emit("accept");
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
_deleteForward() {
|
|
164
|
+
var _a;
|
|
165
|
+
const pos = (_a = this.input.selectionStart) !== null && _a !== void 0 ? _a : 0;
|
|
166
|
+
const val = this._state.split("");
|
|
167
|
+
let targetPos = pos;
|
|
168
|
+
while (targetPos < val.length && !/\d/.test(val[targetPos])) {
|
|
169
|
+
targetPos++;
|
|
170
|
+
}
|
|
171
|
+
if (targetPos < val.length) {
|
|
172
|
+
val[targetPos] = this.placeholderStr[targetPos];
|
|
173
|
+
this._state = val.join("");
|
|
174
|
+
this.input.value = this._state;
|
|
175
|
+
this.input.setSelectionRange(pos, pos);
|
|
176
|
+
this._emit("accept");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
_findNextInputPos(pos) {
|
|
180
|
+
for (let i = pos + 1; i < this._state.length; i++) {
|
|
181
|
+
if (/[DMY]/.test(this._state[i])) {
|
|
182
|
+
return i;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// If no more placeholders, place cursor at end
|
|
186
|
+
return this._state.length;
|
|
187
|
+
}
|
|
188
|
+
_emit(event) {
|
|
189
|
+
const handlers = this.listeners.get(event);
|
|
190
|
+
if (handlers) {
|
|
191
|
+
for (const handler of handlers) {
|
|
192
|
+
handler();
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export { DateMask };
|
|
199
|
+
//# sourceMappingURL=date-mask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-mask.js","sources":["../../../src/utils/date-mask.ts"],"sourcesContent":["/**\n * Lightweight date input mask replacing imask.\n * Handles digit-only input with placeholder display for date formats.\n */\n\ntype MaskEventType = \"accept\" | \"complete\";\ntype MaskEventHandler = () => void;\n\nexport class DateMask {\n private input: HTMLInputElement;\n private placeholderStr: string;\n private _state: string; // tracks the current masked value\n private listeners: Map<MaskEventType, MaskEventHandler[]> = new Map();\n private _boundHandleBeforeInput: (e: InputEvent) => void;\n private _boundHandleInput: (e: InputEvent) => void;\n private _boundHandleKeydown: (e: KeyboardEvent) => void;\n private _boundHandleFocus: () => void;\n private _boundHandleBlur: () => void;\n private _valueAtFocus: string;\n\n public masked: { value: string; isComplete: boolean };\n\n constructor(input: HTMLInputElement, options: DateMaskOptions) {\n this.input = input;\n this.placeholderStr = this._buildPlaceholder(options.pattern);\n this._state = this.placeholderStr;\n this.listeners.set(\"accept\", []);\n this.listeners.set(\"complete\", []);\n\n const masked = { value: \"\", isComplete: false };\n Object.defineProperties(masked, {\n value: { get: () => this._state, enumerable: true },\n isComplete: { get: () => this._state.length > 0 && !/[DMY]/.test(this._state), enumerable: true }\n });\n this.masked = masked;\n\n // If input already has a value that looks like a filled date, use it\n if (this.input.value && this.input.value.length === this._state.length && !/[DMY]/.test(this.input.value)) {\n this._state = this.input.value;\n } else {\n this.input.value = this._state;\n }\n\n this._boundHandleBeforeInput = this._handleBeforeInput.bind(this);\n this._boundHandleInput = this._handleInput.bind(this);\n this._boundHandleKeydown = this._handleKeydown.bind(this);\n this._boundHandleFocus = this._handleFocus.bind(this);\n this._boundHandleBlur = this._handleBlur.bind(this);\n this._valueAtFocus = this._state;\n\n this.input.addEventListener(\"beforeinput\", this._boundHandleBeforeInput);\n this.input.addEventListener(\"input\", this._boundHandleInput);\n this.input.addEventListener(\"keydown\", this._boundHandleKeydown);\n this.input.addEventListener(\"focus\", this._boundHandleFocus);\n this.input.addEventListener(\"blur\", this._boundHandleBlur);\n }\n\n get value(): string {\n return this._state;\n }\n\n set value(val: string) {\n if (!val || val === \"\") {\n this._state = this.placeholderStr;\n } else {\n this._state = val;\n }\n this.input.value = this._state;\n this._emit(\"accept\");\n }\n\n on(event: MaskEventType, handler: MaskEventHandler): void {\n this.listeners.get(event)?.push(handler);\n }\n\n updateValue(): void {\n // Sync state from input (used when value set externally on input)\n this._state = this.input.value;\n }\n\n destroy(): void {\n this.input.removeEventListener(\"beforeinput\", this._boundHandleBeforeInput);\n this.input.removeEventListener(\"input\", this._boundHandleInput);\n this.input.removeEventListener(\"keydown\", this._boundHandleKeydown);\n this.input.removeEventListener(\"focus\", this._boundHandleFocus);\n this.input.removeEventListener(\"blur\", this._boundHandleBlur);\n this.listeners.clear();\n }\n\n private _handleFocus(): void {\n this._valueAtFocus = this._state;\n }\n\n private _handleBlur(): void {\n // Dispatch native change event if value changed during this focus session\n if (this._state !== this._valueAtFocus) {\n this.input.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n }\n\n private _buildPlaceholder(pattern: string): string {\n return pattern\n .replace(/`/g, \"\")\n .replace(/\\{(\\/)\\}/g, \"$1\")\n .replace(/d/g, \"D\")\n .replace(/m/g, \"M\")\n .replace(/y/g, \"Y\");\n }\n\n private _getDigitPositions(): number[] {\n const positions: number[] = [];\n for (let i = 0; i < this.placeholderStr.length; i++) {\n const ch = this.placeholderStr[i];\n if (ch === \"D\" || ch === \"M\" || ch === \"Y\") {\n positions.push(i);\n }\n }\n return positions;\n }\n\n private _handleBeforeInput(e: InputEvent): void {\n // Prevent browser's default text handling — we handle everything in keydown\n e.preventDefault();\n }\n\n private _handleInput(): void {\n // If browser still modified the value (some edge cases), restore our state\n if (this.input.value !== this._state) {\n this.input.value = this._state;\n }\n }\n\n private _handleKeydown(e: KeyboardEvent): void {\n if (e.key === \"Backspace\") {\n e.preventDefault();\n this._backspace();\n } else if (e.key === \"Delete\") {\n e.preventDefault();\n this._deleteForward();\n } else if (e.key.length === 1 && /\\d/.test(e.key)) {\n e.preventDefault();\n this._insertDigit(e.key);\n }\n // Arrow keys: let browser handle cursor movement naturally\n }\n\n private _insertDigit(digit: string): void {\n const digitPositions = this._getDigitPositions();\n const currentVal = this._state.split(\"\");\n\n // Find the first unfilled placeholder position\n let insertPos = -1;\n for (const pos of digitPositions) {\n if (/[DMY]/.test(currentVal[pos])) {\n insertPos = pos;\n break;\n }\n }\n\n if (insertPos === -1) {\n // All filled — no room\n return;\n }\n\n currentVal[insertPos] = digit;\n this._state = currentVal.join(\"\");\n this.input.value = this._state;\n\n // Move cursor after the inserted digit\n const nextPos = this._findNextInputPos(insertPos);\n this.input.setSelectionRange(nextPos, nextPos);\n\n this._emit(\"accept\");\n\n if (this.masked.isComplete) {\n this._emit(\"complete\");\n }\n }\n\n private _backspace(): void {\n const pos = this.input.selectionStart ?? this._state.length;\n const val = this._state.split(\"\");\n\n // Find previous digit position from cursor\n let targetPos = pos - 1;\n while (targetPos >= 0 && !/\\d/.test(val[targetPos])) {\n targetPos--;\n }\n\n if (targetPos >= 0) {\n val[targetPos] = this.placeholderStr[targetPos];\n this._state = val.join(\"\");\n this.input.value = this._state;\n this.input.setSelectionRange(targetPos, targetPos);\n this._emit(\"accept\");\n }\n }\n\n private _deleteForward(): void {\n const pos = this.input.selectionStart ?? 0;\n const val = this._state.split(\"\");\n\n let targetPos = pos;\n while (targetPos < val.length && !/\\d/.test(val[targetPos])) {\n targetPos++;\n }\n\n if (targetPos < val.length) {\n val[targetPos] = this.placeholderStr[targetPos];\n this._state = val.join(\"\");\n this.input.value = this._state;\n this.input.setSelectionRange(pos, pos);\n this._emit(\"accept\");\n }\n }\n\n private _findNextInputPos(pos: number): number {\n for (let i = pos + 1; i < this._state.length; i++) {\n if (/[DMY]/.test(this._state[i])) {\n return i;\n }\n }\n // If no more placeholders, place cursor at end\n return this._state.length;\n }\n\n private _emit(event: MaskEventType): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n for (const handler of handlers) {\n handler();\n }\n }\n }\n}\n\nexport interface DateMaskOptions {\n pattern: string;\n}\n"],"names":[],"mappings":"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"}
|
package/react/utils/time.cjs.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var dateHelpers = require('./date-helpers.cjs.js');
|
|
7
7
|
|
|
8
8
|
const DATE_PATTERNS = {
|
|
9
9
|
"DD/MM/YYYY": {
|
|
@@ -45,9 +45,9 @@ const sanitizedNextMonth = (d) => {
|
|
|
45
45
|
const year = d.getFullYear();
|
|
46
46
|
const date = d.getDate();
|
|
47
47
|
const nextMonthDate = new Date(year, month + 1);
|
|
48
|
-
const numberOfDaysNextMonth =
|
|
49
|
-
if (
|
|
50
|
-
return
|
|
48
|
+
const numberOfDaysNextMonth = dateHelpers.getDaysInMonth(nextMonthDate);
|
|
49
|
+
if (dateHelpers.isLastDayOfMonth(d) && numberOfDaysNextMonth < date) {
|
|
50
|
+
return dateHelpers.lastDayOfMonth(nextMonthDate);
|
|
51
51
|
}
|
|
52
52
|
else {
|
|
53
53
|
return new Date(year, month + 1, date);
|
|
@@ -58,9 +58,9 @@ const sanitizedPreviousMonth = (d) => {
|
|
|
58
58
|
const year = d.getFullYear();
|
|
59
59
|
const date = d.getDate();
|
|
60
60
|
const prevMonthDate = new Date(year, month - 1);
|
|
61
|
-
const numberOfDaysPrevMonth =
|
|
62
|
-
if (
|
|
63
|
-
return
|
|
61
|
+
const numberOfDaysPrevMonth = dateHelpers.getDaysInMonth(prevMonthDate);
|
|
62
|
+
if (dateHelpers.isLastDayOfMonth(d) && numberOfDaysPrevMonth < date) {
|
|
63
|
+
return dateHelpers.lastDayOfMonth(prevMonthDate);
|
|
64
64
|
}
|
|
65
65
|
else {
|
|
66
66
|
return new Date(year, month - 1, date);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.cjs.js","sources":["../../../src/utils/time.ts"],"sourcesContent":["import { getDaysInMonth, isLastDayOfMonth, lastDayOfMonth } from \"date-
|
|
1
|
+
{"version":3,"file":"time.cjs.js","sources":["../../../src/utils/time.ts"],"sourcesContent":["import { getDaysInMonth, isLastDayOfMonth, lastDayOfMonth } from \"./date-helpers\";\n\nexport const DATE_PATTERNS = {\n \"DD/MM/YYYY\": {\n imPattern: \"`dd{/}`mm{/}`yyyy\",\n imRangePattern: \"`dd{/}`mm{/}`yyyy - `DD{/}`MM{/}`YYYY\",\n fnsPattern: \"dd/MM/yyyy\"\n },\n \"MM/DD/YYYY\": {\n imPattern: \"`mm{/}`dd{/}`yyyy\",\n imRangePattern: \"`mm{/}`dd{/}`yyyy - `MM{/}`DD{/}`YYYY\",\n fnsPattern: \"MM/dd/yyyy\"\n },\n \"YYYY/MM/DD\": {\n imPattern: \"`yyyy{/}`mm{/}`dd\",\n imRangePattern: \"`yyyy{/}`mm{/}`dd - `YYYY{/}`MM{/}`DD\",\n fnsPattern: \"yyyy/MM/dd\"\n }\n};\n\n/**\n * @description - creates calendar's year view years array with context of\n * datepicker's displayDate and current year\n * Fixes current year to the start of array\n */\nexport const createYearViewArray = (displayDate: Date, currentYear: number) => {\n // keeping the year range position to be always fixed by setting current year to the first element of the calendar\n const displayYear = displayDate.getFullYear();\n const remainder = (displayYear - currentYear) % 12;\n const yearsPosition = remainder < 0 ? 12 + remainder : remainder;\n\n const yearArray = [];\n const startLimit = displayYear - yearsPosition;\n const endLimit = displayYear - yearsPosition + 12 - 1; // -1 to match the index of the years (index starts from 0)\n\n for (let i = startLimit; i < endLimit + 1; i++) {\n yearArray.push(i);\n }\n\n return yearArray;\n};\nexport const sanitizedNextMonth = (d: Date) => {\n const month = d.getMonth();\n const year = d.getFullYear();\n const date = d.getDate();\n const nextMonthDate = new Date(year, month + 1);\n const numberOfDaysNextMonth = getDaysInMonth(nextMonthDate);\n\n if (isLastDayOfMonth(d) && numberOfDaysNextMonth < date) {\n return lastDayOfMonth(nextMonthDate);\n } else {\n return new Date(year, month + 1, date);\n }\n};\nexport const sanitizedPreviousMonth = (d: Date) => {\n const month = d.getMonth();\n const year = d.getFullYear();\n const date = d.getDate();\n const prevMonthDate = new Date(year, month - 1);\n const numberOfDaysPrevMonth = getDaysInMonth(prevMonthDate);\n if (isLastDayOfMonth(d) && numberOfDaysPrevMonth < date) {\n return lastDayOfMonth(prevMonthDate);\n } else {\n return new Date(year, month - 1, date);\n }\n};\nexport const setTimeToNoon = (date: Date): Date => {\n const newDate = new Date(date);\n newDate.setHours(12);\n newDate.setMinutes(0);\n newDate.setSeconds(0);\n newDate.setMilliseconds(0);\n return newDate;\n};\n\nexport const sortAscDates = (dates: Date[]) => {\n return dates.sort((a, b) => a.getTime() - b.getTime());\n};\n"],"names":["getDaysInMonth","isLastDayOfMonth","lastDayOfMonth"],"mappings":"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"}
|
package/react/utils/time.js
CHANGED
package/react/utils/time.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.js","sources":["../../../src/utils/time.ts"],"sourcesContent":["import { getDaysInMonth, isLastDayOfMonth, lastDayOfMonth } from \"date-
|
|
1
|
+
{"version":3,"file":"time.js","sources":["../../../src/utils/time.ts"],"sourcesContent":["import { getDaysInMonth, isLastDayOfMonth, lastDayOfMonth } from \"./date-helpers\";\n\nexport const DATE_PATTERNS = {\n \"DD/MM/YYYY\": {\n imPattern: \"`dd{/}`mm{/}`yyyy\",\n imRangePattern: \"`dd{/}`mm{/}`yyyy - `DD{/}`MM{/}`YYYY\",\n fnsPattern: \"dd/MM/yyyy\"\n },\n \"MM/DD/YYYY\": {\n imPattern: \"`mm{/}`dd{/}`yyyy\",\n imRangePattern: \"`mm{/}`dd{/}`yyyy - `MM{/}`DD{/}`YYYY\",\n fnsPattern: \"MM/dd/yyyy\"\n },\n \"YYYY/MM/DD\": {\n imPattern: \"`yyyy{/}`mm{/}`dd\",\n imRangePattern: \"`yyyy{/}`mm{/}`dd - `YYYY{/}`MM{/}`DD\",\n fnsPattern: \"yyyy/MM/dd\"\n }\n};\n\n/**\n * @description - creates calendar's year view years array with context of\n * datepicker's displayDate and current year\n * Fixes current year to the start of array\n */\nexport const createYearViewArray = (displayDate: Date, currentYear: number) => {\n // keeping the year range position to be always fixed by setting current year to the first element of the calendar\n const displayYear = displayDate.getFullYear();\n const remainder = (displayYear - currentYear) % 12;\n const yearsPosition = remainder < 0 ? 12 + remainder : remainder;\n\n const yearArray = [];\n const startLimit = displayYear - yearsPosition;\n const endLimit = displayYear - yearsPosition + 12 - 1; // -1 to match the index of the years (index starts from 0)\n\n for (let i = startLimit; i < endLimit + 1; i++) {\n yearArray.push(i);\n }\n\n return yearArray;\n};\nexport const sanitizedNextMonth = (d: Date) => {\n const month = d.getMonth();\n const year = d.getFullYear();\n const date = d.getDate();\n const nextMonthDate = new Date(year, month + 1);\n const numberOfDaysNextMonth = getDaysInMonth(nextMonthDate);\n\n if (isLastDayOfMonth(d) && numberOfDaysNextMonth < date) {\n return lastDayOfMonth(nextMonthDate);\n } else {\n return new Date(year, month + 1, date);\n }\n};\nexport const sanitizedPreviousMonth = (d: Date) => {\n const month = d.getMonth();\n const year = d.getFullYear();\n const date = d.getDate();\n const prevMonthDate = new Date(year, month - 1);\n const numberOfDaysPrevMonth = getDaysInMonth(prevMonthDate);\n if (isLastDayOfMonth(d) && numberOfDaysPrevMonth < date) {\n return lastDayOfMonth(prevMonthDate);\n } else {\n return new Date(year, month - 1, date);\n }\n};\nexport const setTimeToNoon = (date: Date): Date => {\n const newDate = new Date(date);\n newDate.setHours(12);\n newDate.setMinutes(0);\n newDate.setSeconds(0);\n newDate.setMilliseconds(0);\n return newDate;\n};\n\nexport const sortAscDates = (dates: Date[]) => {\n return dates.sort((a, b) => a.getTime() - b.getTime());\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { css } from 'lit';
|
|
2
2
|
|
|
3
|
-
var css_248z = css`.form-control-container{display:flex;flex-direction:column;gap:var(--sgds-form-gap-md)}.m-width-160{min-width:var(--sgds-dimension-160)}.m-width-256{min-width:var(--sgds-dimension-256)}.form-label{color:var(--sgds-form-color-default);font-size:var(--sgds-font-size-label-md);font-weight:var(--sgds-font-weight-semibold)}.form-control-group{align-items:center;background-color:var(--sgds-form-surface-default);border:var(--sgds-form-border-width-default) solid var(--sgds-border-color-default);border-radius:var(--input-border-radius,var(--sgds-form-border-radius-md));display:flex;gap:var(--sgds-form-gap-
|
|
3
|
+
var css_248z = css`.form-control-container{display:flex;flex-direction:column;gap:var(--sgds-form-gap-md)}.m-width-160{min-width:var(--sgds-dimension-160)}.m-width-256{min-width:var(--sgds-dimension-256)}.form-label{color:var(--sgds-form-color-default);font-size:var(--sgds-font-size-label-md);font-weight:var(--sgds-font-weight-semibold)}.form-control-group{align-items:center;background-color:var(--sgds-form-surface-default);border:var(--sgds-form-border-width-default) solid var(--sgds-border-color-default);border-radius:var(--input-border-radius,var(--sgds-form-border-radius-md));display:flex;gap:var(--sgds-form-gap-xl);height:var(--sgds-dimension-48);justify-content:center;overflow:hidden;padding:0 var(--sgds-form-padding-x);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:-webkit-fill-available;width:-moz-available}.form-control{appearance:none;background-clip:padding-box;background:none;border:none;color:var(--sgds-form-color-default);display:block;flex-grow:1;font-family:var(--sgds-font-family-brand);font-size:var(--sgds-font-size-label-md);line-height:var(--sgds-line-height-xs);min-width:0;outline:none;padding:0;width:100%}.form-clearable{color:var(--sgds-color-subtle);cursor:pointer}@media (prefers-reduced-motion:reduce){.form-control-group{transition:none}}.form-control-group:not(.disabled):not(.is-invalid):not(.readonly):not(:focus-within):hover{outline:var(--sgds-form-border-width-thick) solid var(--sgds-border-color-emphasis);outline-offset:var(--sgds-form-outline-offset-focus)}.form-control-group:not(.disabled):not(.is-invalid):focus-within{outline:var(--sgds-form-outline-focus);outline-offset:var(--sgds-form-outline-offset-focus)}.form-control-container.disabled{opacity:var(--sgds-opacity-40)}.form-control-group.disabled{background-color:var(--sgds-form-surface-muted);cursor:not-allowed}.form-control-group.readonly{background-color:var(--sgds-form-surface-raised)}.form-control-group.is-invalid:not(.disabled){border:var(--sgds-form-border-width-default) solid var(--sgds-form-danger-border-color-default)}.form-control-group:not(.disabled).is-invalid:focus-within{outline:var(--sgds-border-width-2) solid var(--sgds-form-danger-color-default);outline-offset:var(--sgds-form-outline-offset-focus)}`;
|
|
4
4
|
|
|
5
5
|
export { css_248z as default };
|
|
6
6
|
//# sourceMappingURL=form-text-control.js.map
|
package/types/react.d.ts
CHANGED
|
@@ -82,6 +82,12 @@ interface ISgdsRadioGroupChangeEventDetail {
|
|
|
82
82
|
value: string;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
+
// ── Sidebar ─────────────────────────────────────────────────────────────
|
|
86
|
+
|
|
87
|
+
interface ISgdsSidebarSelectEventDetail {
|
|
88
|
+
activeItem: string;
|
|
89
|
+
}
|
|
90
|
+
|
|
85
91
|
// ── Stepper ─────────────────────────────────────────────────────────────
|
|
86
92
|
|
|
87
93
|
interface IStepMetaData {
|
|
@@ -477,6 +483,91 @@ value: string;
|
|
|
477
483
|
onSgdsAfterHide?: SgdsEventHandler;
|
|
478
484
|
}
|
|
479
485
|
|
|
486
|
+
// ── DataTableCell ─────────────────────────────────────────────────────────────
|
|
487
|
+
|
|
488
|
+
export interface SgdsDataTableCellProps extends SgdsBaseProps {
|
|
489
|
+
/** Number of columns this cell spans. */
|
|
490
|
+
colspan?: number | undefined;
|
|
491
|
+
/** Number of rows this cell spans. */
|
|
492
|
+
rowspan?: number | undefined;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// ── DataTableHead ─────────────────────────────────────────────────────────────
|
|
496
|
+
|
|
497
|
+
export interface SgdsDataTableHeadProps extends SgdsBaseProps {
|
|
498
|
+
/** Sets the column width. */
|
|
499
|
+
width?: string | undefined;
|
|
500
|
+
/** Number of columns this cell spans. */
|
|
501
|
+
colspan?: number | undefined;
|
|
502
|
+
/** Number of rows this cell spans. */
|
|
503
|
+
rowspan?: number | undefined;
|
|
504
|
+
/** Text alignment for the header content. */
|
|
505
|
+
textAlign?: "left" | "right";
|
|
506
|
+
/** Current sort direction for this column. */
|
|
507
|
+
ariasort?: "ascending" | "descending" | "none" | "other" | undefined;
|
|
508
|
+
/** When true, clicking this header cycles through ascending → descending → none sort. */
|
|
509
|
+
sorting?: boolean;
|
|
510
|
+
/** Column key emitted in the row's internal sort payload, used to identify which column to sort. */
|
|
511
|
+
sortKey?: string;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
// ── DataTableRow ─────────────────────────────────────────────────────────────
|
|
515
|
+
|
|
516
|
+
export interface SgdsDataTableRowProps extends SgdsBaseProps {
|
|
517
|
+
/** Arbitrary data associated with this row. Returned in event detail on row selection. */
|
|
518
|
+
rowData?: Record<string, unknown>;
|
|
519
|
+
/** When true, the row has an expandable content area toggled by a chevron. */
|
|
520
|
+
expand?: boolean;
|
|
521
|
+
/** When true, the expandable content area is open. */
|
|
522
|
+
open?: boolean;
|
|
523
|
+
/** When true, the row is checked. */
|
|
524
|
+
checked?: boolean;
|
|
525
|
+
/** The checkbox rendered inside this row, if `showCheckbox` is true. */
|
|
526
|
+
checkbox?: SgdsCheckbox | null;
|
|
527
|
+
"onsgds-show"?: SgdsEventHandler;
|
|
528
|
+
onSgdsShow?: SgdsEventHandler;
|
|
529
|
+
"onsgds-after-show"?: SgdsEventHandler;
|
|
530
|
+
onSgdsAfterShow?: SgdsEventHandler;
|
|
531
|
+
"onsgds-hide"?: SgdsEventHandler;
|
|
532
|
+
onSgdsHide?: SgdsEventHandler;
|
|
533
|
+
"onsgds-after-hide"?: SgdsEventHandler;
|
|
534
|
+
onSgdsAfterHide?: SgdsEventHandler;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// ── DataTable ─────────────────────────────────────────────────────────────
|
|
538
|
+
|
|
539
|
+
export interface SgdsDataTableProps extends SgdsBaseProps {
|
|
540
|
+
/** If true, renders a checkbox column for row selection. */
|
|
541
|
+
multiSelect?: boolean;
|
|
542
|
+
/** Total number of data items (for server-side pagination). */
|
|
543
|
+
dataLength?: number;
|
|
544
|
+
/** Current page (1-based). */
|
|
545
|
+
currentPage?: number;
|
|
546
|
+
/** Number of rows per page. */
|
|
547
|
+
itemsPerPage?: number;
|
|
548
|
+
/** Custom text shown on the footer's left side. */
|
|
549
|
+
footerText?: string;
|
|
550
|
+
/** If true, hides the footer (summary text and pagination controls). */
|
|
551
|
+
hideFooter?: boolean;
|
|
552
|
+
/** When true, shows a loading state and hides body rows. */
|
|
553
|
+
isLoading?: boolean;
|
|
554
|
+
/** When true, emits sort events for external handling instead of local sorting. */
|
|
555
|
+
serverSort?: boolean;
|
|
556
|
+
/** Controls the CSS `table-layout` algorithm.
|
|
557
|
+
Use "auto" to let the browser size columns based on content, or "fixed" to distribute column widths evenly regardless of content. */
|
|
558
|
+
layout?: "auto" | "fixed";
|
|
559
|
+
/** Pagination mode. `client` (default) slices rows and renders pagination controls.
|
|
560
|
+
`server` renders all slotted rows as-is — the caller is responsible for passing
|
|
561
|
+
the correct page of data and handling `sgds-page-change` externally. */
|
|
562
|
+
mode?: "client" | "server";
|
|
563
|
+
"onsgds-row-select"?: SgdsEventHandler;
|
|
564
|
+
onSgdsRowSelect?: SgdsEventHandler;
|
|
565
|
+
"onsgds-sort"?: SgdsEventHandler;
|
|
566
|
+
onSgdsSort?: SgdsEventHandler;
|
|
567
|
+
"onsgds-page-change"?: SgdsEventHandler;
|
|
568
|
+
onSgdsPageChange?: SgdsEventHandler;
|
|
569
|
+
}
|
|
570
|
+
|
|
480
571
|
// ── Datepicker ─────────────────────────────────────────────────────────────
|
|
481
572
|
|
|
482
573
|
export interface SgdsDatepickerProps extends SgdsBaseProps {
|
|
@@ -1493,6 +1584,8 @@ export interface SgdsTabGroupProps extends SgdsBaseProps {
|
|
|
1493
1584
|
orientation?: "horizontal" | "vertical";
|
|
1494
1585
|
/** The density of tabs. Controls the density of all `sgds-tabs` in its slot. It also sets the density attribute of `sgds-tab` */
|
|
1495
1586
|
density?: "compact" | "default";
|
|
1587
|
+
/** When set, all `sgds-tabs` in its slot will be in full width. Only takes effect when `orientation` is set to `horizontal` */
|
|
1588
|
+
fullWidth?: boolean;
|
|
1496
1589
|
"onsgds-tab-show"?: SgdsEventHandler;
|
|
1497
1590
|
onSgdsTabShow?: SgdsEventHandler;
|
|
1498
1591
|
"onsgds-tab-hide"?: SgdsEventHandler;
|
|
@@ -1733,6 +1826,10 @@ declare module "react" {
|
|
|
1733
1826
|
"sgds-close-button": React.DetailedHTMLProps<SgdsCloseButtonProps, HTMLElement>;
|
|
1734
1827
|
"sgds-combo-box-option": React.DetailedHTMLProps<SgdsComboBoxOptionProps, HTMLElement>;
|
|
1735
1828
|
"sgds-combo-box": React.DetailedHTMLProps<SgdsComboBoxProps, HTMLElement>;
|
|
1829
|
+
"sgds-data-table-cell": React.DetailedHTMLProps<SgdsDataTableCellProps, HTMLElement>;
|
|
1830
|
+
"sgds-data-table-head": React.DetailedHTMLProps<SgdsDataTableHeadProps, HTMLElement>;
|
|
1831
|
+
"sgds-data-table-row": React.DetailedHTMLProps<SgdsDataTableRowProps, HTMLElement>;
|
|
1832
|
+
"sgds-data-table": React.DetailedHTMLProps<SgdsDataTableProps, HTMLElement>;
|
|
1736
1833
|
"sgds-datepicker": React.DetailedHTMLProps<SgdsDatepickerProps, HTMLElement>;
|
|
1737
1834
|
"sgds-description-list-group": React.DetailedHTMLProps<SgdsDescriptionListGroupProps, HTMLElement>;
|
|
1738
1835
|
"sgds-description-list": React.DetailedHTMLProps<SgdsDescriptionListProps, HTMLElement>;
|
|
@@ -1816,6 +1913,10 @@ declare global {
|
|
|
1816
1913
|
"sgds-close-button": HTMLElement;
|
|
1817
1914
|
"sgds-combo-box-option": HTMLElement;
|
|
1818
1915
|
"sgds-combo-box": HTMLElement;
|
|
1916
|
+
"sgds-data-table-cell": HTMLElement;
|
|
1917
|
+
"sgds-data-table-head": HTMLElement;
|
|
1918
|
+
"sgds-data-table-row": HTMLElement;
|
|
1919
|
+
"sgds-data-table": HTMLElement;
|
|
1819
1920
|
"sgds-datepicker": HTMLElement;
|
|
1820
1921
|
"sgds-description-list-group": HTMLElement;
|
|
1821
1922
|
"sgds-description-list": HTMLElement;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight date utility functions replacing date-fns.
|
|
3
|
+
* Only supports the 3 date patterns used by the Datepicker component.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Format a date using one of the 3 known patterns or "PPPP" (full locale date).
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatDate(date: Date, pattern: string): string;
|
|
9
|
+
export declare function getDaysInMonth(date: Date): number;
|
|
10
|
+
export declare function isAfterDate(a: Date, b: Date): boolean;
|
|
11
|
+
export declare function isBeforeDate(a: Date, b: Date): boolean;
|
|
12
|
+
export declare function isEqualDate(a: Date, b: Date): boolean;
|
|
13
|
+
export declare function isLastDayOfMonth(date: Date): boolean;
|
|
14
|
+
export declare function isValidDate(date: Date): boolean;
|
|
15
|
+
export declare function lastDayOfMonth(date: Date): Date;
|
|
16
|
+
/**
|
|
17
|
+
* Parse a date string using one of the 3 known patterns:
|
|
18
|
+
* - "dd/MM/yyyy"
|
|
19
|
+
* - "MM/dd/yyyy"
|
|
20
|
+
* - "yyyy/MM/dd"
|
|
21
|
+
*/
|
|
22
|
+
export declare function parseDate(dateStr: string, pattern: string): Date;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight date utility functions replacing date-fns.
|
|
3
|
+
* Only supports the 3 date patterns used by the Datepicker component.
|
|
4
|
+
*/
|
|
5
|
+
function getOrdinalSuffix(day) {
|
|
6
|
+
if (day >= 11 && day <= 13)
|
|
7
|
+
return day + "th";
|
|
8
|
+
switch (day % 10) {
|
|
9
|
+
case 1:
|
|
10
|
+
return day + "st";
|
|
11
|
+
case 2:
|
|
12
|
+
return day + "nd";
|
|
13
|
+
case 3:
|
|
14
|
+
return day + "rd";
|
|
15
|
+
default:
|
|
16
|
+
return day + "th";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Format a date using one of the 3 known patterns or "PPPP" (full locale date).
|
|
21
|
+
*/
|
|
22
|
+
function formatDate(date, pattern) {
|
|
23
|
+
const day = date.getDate();
|
|
24
|
+
const month = date.getMonth() + 1;
|
|
25
|
+
const year = date.getFullYear();
|
|
26
|
+
const dd = day < 10 ? "0" + day : String(day);
|
|
27
|
+
const mm = month < 10 ? "0" + month : String(month);
|
|
28
|
+
const yyyy = String(year);
|
|
29
|
+
switch (pattern) {
|
|
30
|
+
case "dd/MM/yyyy":
|
|
31
|
+
return `${dd}/${mm}/${yyyy}`;
|
|
32
|
+
case "MM/dd/yyyy":
|
|
33
|
+
return `${mm}/${dd}/${yyyy}`;
|
|
34
|
+
case "yyyy/MM/dd":
|
|
35
|
+
return `${yyyy}/${mm}/${dd}`;
|
|
36
|
+
case "PPPP": {
|
|
37
|
+
const weekday = new Intl.DateTimeFormat("en-US", { weekday: "long" }).format(date);
|
|
38
|
+
const month = new Intl.DateTimeFormat("en-US", { month: "long" }).format(date);
|
|
39
|
+
const ordinal = getOrdinalSuffix(date.getDate());
|
|
40
|
+
return `${weekday}, ${month} ${ordinal}, ${date.getFullYear()}`;
|
|
41
|
+
}
|
|
42
|
+
default:
|
|
43
|
+
return `${dd}/${mm}/${yyyy}`;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function getDaysInMonth(date) {
|
|
47
|
+
return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
|
|
48
|
+
}
|
|
49
|
+
function isAfterDate(a, b) {
|
|
50
|
+
return a.getTime() > b.getTime();
|
|
51
|
+
}
|
|
52
|
+
function isBeforeDate(a, b) {
|
|
53
|
+
return a.getTime() < b.getTime();
|
|
54
|
+
}
|
|
55
|
+
function isEqualDate(a, b) {
|
|
56
|
+
return a.getTime() === b.getTime();
|
|
57
|
+
}
|
|
58
|
+
function isLastDayOfMonth(date) {
|
|
59
|
+
return date.getDate() === getDaysInMonth(date);
|
|
60
|
+
}
|
|
61
|
+
function isValidDate(date) {
|
|
62
|
+
return date instanceof Date && !isNaN(date.getTime());
|
|
63
|
+
}
|
|
64
|
+
function lastDayOfMonth(date) {
|
|
65
|
+
return new Date(date.getFullYear(), date.getMonth() + 1, 0);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Parse a date string using one of the 3 known patterns:
|
|
69
|
+
* - "dd/MM/yyyy"
|
|
70
|
+
* - "MM/dd/yyyy"
|
|
71
|
+
* - "yyyy/MM/dd"
|
|
72
|
+
*/
|
|
73
|
+
function parseDate(dateStr, pattern) {
|
|
74
|
+
const parts = dateStr.split("/");
|
|
75
|
+
let day, month, year;
|
|
76
|
+
switch (pattern) {
|
|
77
|
+
case "dd/MM/yyyy":
|
|
78
|
+
day = parseInt(parts[0], 10);
|
|
79
|
+
month = parseInt(parts[1], 10) - 1;
|
|
80
|
+
year = parseInt(parts[2], 10);
|
|
81
|
+
break;
|
|
82
|
+
case "MM/dd/yyyy":
|
|
83
|
+
month = parseInt(parts[0], 10) - 1;
|
|
84
|
+
day = parseInt(parts[1], 10);
|
|
85
|
+
year = parseInt(parts[2], 10);
|
|
86
|
+
break;
|
|
87
|
+
case "yyyy/MM/dd":
|
|
88
|
+
year = parseInt(parts[0], 10);
|
|
89
|
+
month = parseInt(parts[1], 10) - 1;
|
|
90
|
+
day = parseInt(parts[2], 10);
|
|
91
|
+
break;
|
|
92
|
+
default:
|
|
93
|
+
return new Date(NaN);
|
|
94
|
+
}
|
|
95
|
+
if (isNaN(day) || isNaN(month) || isNaN(year)) {
|
|
96
|
+
return new Date(NaN);
|
|
97
|
+
}
|
|
98
|
+
const date = new Date(year, month, day, 12, 0, 0, 0);
|
|
99
|
+
// Validate that the parsed date matches the input (catches invalid dates like 31/02/2024)
|
|
100
|
+
if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) {
|
|
101
|
+
return new Date(NaN);
|
|
102
|
+
}
|
|
103
|
+
return date;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export { formatDate, getDaysInMonth, isAfterDate, isBeforeDate, isEqualDate, isLastDayOfMonth, isValidDate, lastDayOfMonth, parseDate };
|
|
107
|
+
//# sourceMappingURL=date-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"date-helpers.js","sources":["../../src/utils/date-helpers.ts"],"sourcesContent":["/**\n * Lightweight date utility functions replacing date-fns.\n * Only supports the 3 date patterns used by the Datepicker component.\n */\n\nfunction getOrdinalSuffix(day: number): string {\n if (day >= 11 && day <= 13) return day + \"th\";\n switch (day % 10) {\n case 1:\n return day + \"st\";\n case 2:\n return day + \"nd\";\n case 3:\n return day + \"rd\";\n default:\n return day + \"th\";\n }\n}\n\n/**\n * Format a date using one of the 3 known patterns or \"PPPP\" (full locale date).\n */\nexport function formatDate(date: Date, pattern: string): string {\n const day = date.getDate();\n const month = date.getMonth() + 1;\n const year = date.getFullYear();\n const dd = day < 10 ? \"0\" + day : String(day);\n const mm = month < 10 ? \"0\" + month : String(month);\n const yyyy = String(year);\n\n switch (pattern) {\n case \"dd/MM/yyyy\":\n return `${dd}/${mm}/${yyyy}`;\n case \"MM/dd/yyyy\":\n return `${mm}/${dd}/${yyyy}`;\n case \"yyyy/MM/dd\":\n return `${yyyy}/${mm}/${dd}`;\n case \"PPPP\": {\n const weekday = new Intl.DateTimeFormat(\"en-US\", { weekday: \"long\" }).format(date);\n const month = new Intl.DateTimeFormat(\"en-US\", { month: \"long\" }).format(date);\n const ordinal = getOrdinalSuffix(date.getDate());\n return `${weekday}, ${month} ${ordinal}, ${date.getFullYear()}`;\n }\n default:\n return `${dd}/${mm}/${yyyy}`;\n }\n}\n\nexport function getDaysInMonth(date: Date): number {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();\n}\n\nexport function isAfterDate(a: Date, b: Date): boolean {\n return a.getTime() > b.getTime();\n}\n\nexport function isBeforeDate(a: Date, b: Date): boolean {\n return a.getTime() < b.getTime();\n}\n\nexport function isEqualDate(a: Date, b: Date): boolean {\n return a.getTime() === b.getTime();\n}\n\nexport function isLastDayOfMonth(date: Date): boolean {\n return date.getDate() === getDaysInMonth(date);\n}\n\nexport function isValidDate(date: Date): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n}\n\nexport function lastDayOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth() + 1, 0);\n}\n\n/**\n * Parse a date string using one of the 3 known patterns:\n * - \"dd/MM/yyyy\"\n * - \"MM/dd/yyyy\"\n * - \"yyyy/MM/dd\"\n */\nexport function parseDate(dateStr: string, pattern: string): Date {\n const parts = dateStr.split(\"/\");\n let day: number, month: number, year: number;\n\n switch (pattern) {\n case \"dd/MM/yyyy\":\n day = parseInt(parts[0], 10);\n month = parseInt(parts[1], 10) - 1;\n year = parseInt(parts[2], 10);\n break;\n case \"MM/dd/yyyy\":\n month = parseInt(parts[0], 10) - 1;\n day = parseInt(parts[1], 10);\n year = parseInt(parts[2], 10);\n break;\n case \"yyyy/MM/dd\":\n year = parseInt(parts[0], 10);\n month = parseInt(parts[1], 10) - 1;\n day = parseInt(parts[2], 10);\n break;\n default:\n return new Date(NaN);\n }\n\n if (isNaN(day) || isNaN(month) || isNaN(year)) {\n return new Date(NaN);\n }\n\n const date = new Date(year, month, day, 12, 0, 0, 0);\n // Validate that the parsed date matches the input (catches invalid dates like 31/02/2024)\n if (date.getFullYear() !== year || date.getMonth() !== month || date.getDate() !== day) {\n return new Date(NaN);\n }\n return date;\n}\n"],"names":[],"mappings":"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"}
|