@superleapai/flow-ui 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.
- package/CHANGELOG.md +65 -0
- package/LICENSE +21 -0
- package/README.md +451 -0
- package/components/alert.js +282 -0
- package/components/avatar.js +195 -0
- package/components/badge.js +135 -0
- package/components/button.js +201 -0
- package/components/checkbox.js +254 -0
- package/components/currency.js +227 -0
- package/components/date-time-picker/date-time-picker-utils.js +253 -0
- package/components/date-time-picker/date-time-picker.js +532 -0
- package/components/duration/duration-constants.js +46 -0
- package/components/duration/duration-utils.js +164 -0
- package/components/duration/duration.js +448 -0
- package/components/enum-multiselect.js +869 -0
- package/components/enum-select.js +831 -0
- package/components/enumeration.js +213 -0
- package/components/file-input.js +533 -0
- package/components/icon.js +200 -0
- package/components/input.js +259 -0
- package/components/label.js +111 -0
- package/components/multiselect.js +351 -0
- package/components/phone-input/phone-input.js +392 -0
- package/components/phone-input/phone-utils.js +157 -0
- package/components/popover.js +240 -0
- package/components/radio-group.js +435 -0
- package/components/record-multiselect.js +956 -0
- package/components/record-select.js +930 -0
- package/components/select.js +544 -0
- package/components/spinner.js +136 -0
- package/components/table.js +335 -0
- package/components/textarea.js +114 -0
- package/components/time-picker.js +357 -0
- package/components/toast.js +343 -0
- package/core/flow.js +1729 -0
- package/core/superleapClient.js +146 -0
- package/dist/output.css +2 -0
- package/index.d.ts +458 -0
- package/index.js +253 -0
- package/package.json +70 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Date-time-picker utilities (vanilla JS, no date-fns).
|
|
3
|
+
* Helpers for calendar grid, validation, formatting, quick dates.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
(function (global) {
|
|
7
|
+
"use strict";
|
|
8
|
+
|
|
9
|
+
var MONTH_NAMES = [
|
|
10
|
+
"January", "February", "March", "April", "May", "June",
|
|
11
|
+
"July", "August", "September", "October", "November", "December",
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
var MONTH_SHORT = [
|
|
15
|
+
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
|
16
|
+
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
function isValidDate(d) {
|
|
20
|
+
return d instanceof Date && !isNaN(d.getTime());
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function startOfDay(d) {
|
|
24
|
+
var x = new Date(d.getTime());
|
|
25
|
+
x.setHours(0, 0, 0, 0);
|
|
26
|
+
return x;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function addDays(d, n) {
|
|
30
|
+
var x = new Date(d.getTime());
|
|
31
|
+
x.setDate(x.getDate() + n);
|
|
32
|
+
return x;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function addMonths(d, n) {
|
|
36
|
+
var x = new Date(d.getTime());
|
|
37
|
+
x.setMonth(x.getMonth() + n);
|
|
38
|
+
return x;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function isSameDay(a, b) {
|
|
42
|
+
if (!a || !b) return false;
|
|
43
|
+
return (
|
|
44
|
+
a.getFullYear() === b.getFullYear() &&
|
|
45
|
+
a.getMonth() === b.getMonth() &&
|
|
46
|
+
a.getDate() === b.getDate()
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function isSameMonth(a, b) {
|
|
51
|
+
if (!a || !b) return false;
|
|
52
|
+
return a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function isBefore(a, b) {
|
|
56
|
+
return a.getTime() < b.getTime();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function isAfter(a, b) {
|
|
60
|
+
return a.getTime() > b.getTime();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function getValidDate(date, fromDate, toDate) {
|
|
64
|
+
var now = new Date();
|
|
65
|
+
if (!date) return undefined;
|
|
66
|
+
if (!isValidDate(date)) {
|
|
67
|
+
if (fromDate && isAfter(fromDate, now)) return new Date(fromDate.getTime());
|
|
68
|
+
if (toDate && isBefore(toDate, now)) return new Date(toDate.getTime());
|
|
69
|
+
return new Date(now.getTime());
|
|
70
|
+
}
|
|
71
|
+
if (fromDate && isBefore(date, fromDate)) return new Date(fromDate.getTime());
|
|
72
|
+
if (toDate && isAfter(date, toDate)) return new Date(toDate.getTime());
|
|
73
|
+
return new Date(date.getTime());
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function isDateInRange(date, fromDate, toDate) {
|
|
77
|
+
var d = startOfDay(date);
|
|
78
|
+
if (fromDate && isBefore(d, startOfDay(fromDate))) return false;
|
|
79
|
+
if (toDate && isAfter(d, startOfDay(toDate))) return false;
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function getQuickSelectionDates(fromDate, toDate) {
|
|
84
|
+
var today = new Date();
|
|
85
|
+
var tomorrow = addDays(today, 1);
|
|
86
|
+
return {
|
|
87
|
+
today: isDateInRange(today, fromDate, toDate) ? today : undefined,
|
|
88
|
+
tomorrow: isDateInRange(tomorrow, fromDate, toDate) ? tomorrow : undefined,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function isPreviousMonthDisabled(currentMonth, fromDate) {
|
|
93
|
+
if (!fromDate) return false;
|
|
94
|
+
return isSameMonth(currentMonth, fromDate) || isBefore(currentMonth, fromDate);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function isNextMonthDisabled(currentMonth, toDate) {
|
|
98
|
+
if (!toDate) return false;
|
|
99
|
+
return isSameMonth(currentMonth, toDate) || isAfter(currentMonth, toDate);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function genMonths() {
|
|
103
|
+
return MONTH_NAMES.map(function (label, i) {
|
|
104
|
+
return { value: i, label: label };
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function genYears(fromDate, toDate, yearRange) {
|
|
109
|
+
yearRange = yearRange == null ? 50 : yearRange;
|
|
110
|
+
var today = new Date();
|
|
111
|
+
var startYear = fromDate ? fromDate.getFullYear() : today.getFullYear() - yearRange;
|
|
112
|
+
var endYear = toDate ? toDate.getFullYear() : today.getFullYear() + yearRange;
|
|
113
|
+
var out = [];
|
|
114
|
+
for (var y = startYear; y <= endYear; y++) {
|
|
115
|
+
out.push({ value: y, label: String(y) });
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Get calendar grid for a month: array of weeks, each week is array of { date, currentMonth, isToday, isSelected, disabled }
|
|
122
|
+
*/
|
|
123
|
+
function getMonthGrid(displayMonth, selectedDate, fromDate, toDate) {
|
|
124
|
+
var year = displayMonth.getFullYear();
|
|
125
|
+
var month = displayMonth.getMonth();
|
|
126
|
+
var first = new Date(year, month, 1);
|
|
127
|
+
var last = new Date(year, month + 1, 0);
|
|
128
|
+
var startDow = first.getDay();
|
|
129
|
+
var daysInMonth = last.getDate();
|
|
130
|
+
var today = startOfDay(new Date());
|
|
131
|
+
var grid = [];
|
|
132
|
+
var week = [];
|
|
133
|
+
|
|
134
|
+
// Leading days from previous month
|
|
135
|
+
for (var i = 0; i < startDow; i++) {
|
|
136
|
+
var d = new Date(year, month, -startDow + i + 1);
|
|
137
|
+
week.push(cellFor(d, false, today, selectedDate, fromDate, toDate));
|
|
138
|
+
}
|
|
139
|
+
// Current month
|
|
140
|
+
for (var j = 1; j <= daysInMonth; j++) {
|
|
141
|
+
var d2 = new Date(year, month, j);
|
|
142
|
+
week.push(cellFor(d2, true, today, selectedDate, fromDate, toDate));
|
|
143
|
+
if (week.length === 7) {
|
|
144
|
+
grid.push(week);
|
|
145
|
+
week = [];
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Trailing days from next month
|
|
149
|
+
var trailing = 1;
|
|
150
|
+
while (week.length > 0 && week.length < 7) {
|
|
151
|
+
var d3 = new Date(year, month + 1, trailing);
|
|
152
|
+
week.push(cellFor(d3, false, today, selectedDate, fromDate, toDate));
|
|
153
|
+
trailing++;
|
|
154
|
+
if (week.length === 7) {
|
|
155
|
+
grid.push(week);
|
|
156
|
+
week = [];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return grid;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function cellFor(date, currentMonth, today, selectedDate, fromDate, toDate) {
|
|
163
|
+
return {
|
|
164
|
+
date: date,
|
|
165
|
+
currentMonth: currentMonth,
|
|
166
|
+
isToday: isSameDay(date, today),
|
|
167
|
+
isSelected: selectedDate ? isSameDay(date, selectedDate) : false,
|
|
168
|
+
disabled: (fromDate && isBefore(date, startOfDay(fromDate))) ||
|
|
169
|
+
(toDate && isAfter(date, startOfDay(toDate))),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Format date for display.
|
|
175
|
+
* @param {Date|undefined} value
|
|
176
|
+
* @param {12|24} hourCycle
|
|
177
|
+
* @param {'day'|'hour'|'minute'|'second'} granularity
|
|
178
|
+
* @param {string} [customFormat] - ignored in vanilla impl; we use granularity
|
|
179
|
+
*/
|
|
180
|
+
function formatDateTime(value, hourCycle, granularity, customFormat) {
|
|
181
|
+
if (!value || !isValidDate(value)) return "";
|
|
182
|
+
var d = value;
|
|
183
|
+
var pad = function (n) {
|
|
184
|
+
return (n < 10 ? "0" : "") + n;
|
|
185
|
+
};
|
|
186
|
+
var month = MONTH_SHORT[d.getMonth()];
|
|
187
|
+
var day = d.getDate();
|
|
188
|
+
var year = d.getFullYear();
|
|
189
|
+
var dateStr = month + " " + day + ", " + year;
|
|
190
|
+
if (granularity === "day") return dateStr;
|
|
191
|
+
var h = d.getHours();
|
|
192
|
+
var m = d.getMinutes();
|
|
193
|
+
var s = d.getSeconds();
|
|
194
|
+
if (hourCycle === 24) {
|
|
195
|
+
var timeStr = pad(h) + ":" + pad(m);
|
|
196
|
+
if (granularity === "second") timeStr += ":" + pad(s);
|
|
197
|
+
return dateStr + " " + timeStr;
|
|
198
|
+
}
|
|
199
|
+
var h12 = h === 0 ? 12 : h > 12 ? h - 12 : h;
|
|
200
|
+
var amPm = h >= 12 ? "PM" : "AM";
|
|
201
|
+
var timeStr12 = h12 + ":" + pad(m);
|
|
202
|
+
if (granularity === "second") timeStr12 += ":" + pad(s);
|
|
203
|
+
timeStr12 += " " + amPm;
|
|
204
|
+
return dateStr + " " + timeStr12;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Parse "HH:mm" into hours and minutes; apply to a date (mutates).
|
|
209
|
+
*/
|
|
210
|
+
function setTimeFromString(date, timeStr) {
|
|
211
|
+
if (!timeStr || typeof timeStr !== "string") return date;
|
|
212
|
+
var parts = timeStr.trim().split(":");
|
|
213
|
+
var h = Math.min(23, Math.max(0, parseInt(parts[0], 10) || 0));
|
|
214
|
+
var m = Math.min(59, Math.max(0, parseInt(parts[1], 10) || 0));
|
|
215
|
+
date.setHours(h, m, 0, 0);
|
|
216
|
+
return date;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Get "HH:mm" from a Date.
|
|
221
|
+
*/
|
|
222
|
+
function getTimeString(date) {
|
|
223
|
+
if (!date || !isValidDate(date)) return "00:00";
|
|
224
|
+
var pad = function (n) {
|
|
225
|
+
return (n < 10 ? "0" : "") + n;
|
|
226
|
+
};
|
|
227
|
+
return pad(date.getHours()) + ":" + pad(date.getMinutes());
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
global.DateTimePickerUtils = {
|
|
231
|
+
MONTH_NAMES: MONTH_NAMES,
|
|
232
|
+
MONTH_SHORT: MONTH_SHORT,
|
|
233
|
+
isValidDate: isValidDate,
|
|
234
|
+
startOfDay: startOfDay,
|
|
235
|
+
addDays: addDays,
|
|
236
|
+
addMonths: addMonths,
|
|
237
|
+
isSameDay: isSameDay,
|
|
238
|
+
isSameMonth: isSameMonth,
|
|
239
|
+
isBefore: isBefore,
|
|
240
|
+
isAfter: isAfter,
|
|
241
|
+
getValidDate: getValidDate,
|
|
242
|
+
isDateInRange: isDateInRange,
|
|
243
|
+
getQuickSelectionDates: getQuickSelectionDates,
|
|
244
|
+
isPreviousMonthDisabled: isPreviousMonthDisabled,
|
|
245
|
+
isNextMonthDisabled: isNextMonthDisabled,
|
|
246
|
+
genMonths: genMonths,
|
|
247
|
+
genYears: genYears,
|
|
248
|
+
getMonthGrid: getMonthGrid,
|
|
249
|
+
formatDateTime: formatDateTime,
|
|
250
|
+
setTimeFromString: setTimeFromString,
|
|
251
|
+
getTimeString: getTimeString,
|
|
252
|
+
};
|
|
253
|
+
})(typeof window !== "undefined" ? window : this);
|