@undefine-ui/design-system 3.10.0 → 3.10.2

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/dist/index.cjs CHANGED
@@ -168,12 +168,22 @@ __export(index_exports, {
168
168
  defaultSettings: () => defaultSettings,
169
169
  dialogClasses: () => dialogClasses,
170
170
  drawerClasses: () => drawerClasses,
171
+ endOfDayTimestamp: () => endOfDayTimestamp,
171
172
  error: () => error,
172
173
  fCurrency: () => fCurrency,
173
174
  fData: () => fData,
175
+ fDate: () => fDate,
176
+ fDateRangeShortLabel: () => fDateRangeShortLabel,
177
+ fDateTime: () => fDateTime,
178
+ fIsAfter: () => fIsAfter,
179
+ fIsBetween: () => fIsBetween,
180
+ fIsSame: () => fIsSame,
174
181
  fNumber: () => fNumber,
175
182
  fPercent: () => fPercent,
176
183
  fShortenNumber: () => fShortenNumber,
184
+ fTime: () => fTime,
185
+ fTimestamp: () => fTimestamp,
186
+ fToNow: () => fToNow,
177
187
  feedbackDialogClasses: () => feedbackDialogClasses,
178
188
  fileData: () => fileData,
179
189
  fileNameByUrl: () => fileNameByUrl,
@@ -219,6 +229,7 @@ __export(index_exports, {
219
229
  shadows: () => shadows,
220
230
  snakeCase: () => snakeCase,
221
231
  splitFullname: () => splitFullname,
232
+ startOfDayTimestamp: () => startOfDayTimestamp,
222
233
  stylesMode: () => stylesMode,
223
234
  success: () => success,
224
235
  surface: () => surface,
@@ -295,6 +306,218 @@ var sentenceCase = (string) => {
295
306
  return string.charAt(0).toUpperCase() + string.slice(1);
296
307
  };
297
308
 
309
+ // src/libs/format-time.ts
310
+ var import_date_fns = require("date-fns");
311
+ var fDate = (date, newFormat) => {
312
+ const fm = newFormat || "dd MMM, yyyy";
313
+ if (typeof date === "number") {
314
+ try {
315
+ return (0, import_date_fns.format)((0, import_date_fns.fromUnixTime)(date), fm);
316
+ } catch (error2) {
317
+ console.error("Error formatting Unix timestamp:", error2);
318
+ return "";
319
+ }
320
+ }
321
+ if (date instanceof Date || typeof date === "string") {
322
+ try {
323
+ return (0, import_date_fns.format)(new Date(date), fm);
324
+ } catch (error2) {
325
+ console.error("Error formatting date:", error2);
326
+ return "";
327
+ }
328
+ }
329
+ return "";
330
+ };
331
+ var fTime = (date) => {
332
+ if (date) {
333
+ try {
334
+ if (typeof date === "number") {
335
+ return (0, import_date_fns.format)((0, import_date_fns.fromUnixTime)(date), "p");
336
+ }
337
+ return (0, import_date_fns.format)(new Date(date), "p");
338
+ } catch (error2) {
339
+ console.error("Error formatting time:", error2);
340
+ return "";
341
+ }
342
+ }
343
+ return "";
344
+ };
345
+ var fDateTime = (date, newFormat) => {
346
+ const fm = newFormat || "dd MMM yyyy p";
347
+ if (date) {
348
+ try {
349
+ if (typeof date === "number") {
350
+ return (0, import_date_fns.format)((0, import_date_fns.fromUnixTime)(date), fm);
351
+ }
352
+ return (0, import_date_fns.format)(new Date(date), fm);
353
+ } catch (error2) {
354
+ console.error("Error formatting date-time:", error2);
355
+ return "";
356
+ }
357
+ }
358
+ return "";
359
+ };
360
+ var fTimestamp = (date) => {
361
+ if (date) {
362
+ try {
363
+ if (typeof date === "number") {
364
+ return date > 9466848e5 ? date : date * 1e3;
365
+ }
366
+ return (0, import_date_fns.getTime)(new Date(date));
367
+ } catch (error2) {
368
+ console.error("Error getting timestamp:", error2);
369
+ return "";
370
+ }
371
+ }
372
+ return "";
373
+ };
374
+ var fToNow = (date) => {
375
+ if (date) {
376
+ try {
377
+ if (typeof date === "number") {
378
+ return (0, import_date_fns.formatDistanceToNow)((0, import_date_fns.fromUnixTime)(date), { addSuffix: true });
379
+ }
380
+ return (0, import_date_fns.formatDistanceToNow)(new Date(date), { addSuffix: true });
381
+ } catch (error2) {
382
+ console.error("Error formatting time distance:", error2);
383
+ return "";
384
+ }
385
+ }
386
+ return "";
387
+ };
388
+ var startOfDayTimestamp = (date) => {
389
+ if (date) {
390
+ try {
391
+ let dateObj;
392
+ if (typeof date === "number") {
393
+ dateObj = (0, import_date_fns.fromUnixTime)(date);
394
+ } else {
395
+ dateObj = new Date(date);
396
+ }
397
+ if (Number.isNaN(dateObj.getTime())) {
398
+ throw new Error("Invalid date input");
399
+ }
400
+ const start = (0, import_date_fns.startOfDay)(dateObj);
401
+ return Math.floor((0, import_date_fns.getTime)(start) / 1e3);
402
+ } catch (error2) {
403
+ console.error("Error calculating start of day timestamp:", error2);
404
+ return 0;
405
+ }
406
+ }
407
+ return 0;
408
+ };
409
+ var endOfDayTimestamp = (date) => {
410
+ if (date) {
411
+ try {
412
+ let dateObj;
413
+ if (typeof date === "number") {
414
+ dateObj = (0, import_date_fns.fromUnixTime)(date);
415
+ } else {
416
+ dateObj = new Date(date);
417
+ }
418
+ if (Number.isNaN(dateObj.getTime())) {
419
+ throw new Error("Invalid date input");
420
+ }
421
+ const end = (0, import_date_fns.endOfDay)(dateObj);
422
+ return Math.floor((0, import_date_fns.getTime)(end) / 1e3);
423
+ } catch (error2) {
424
+ console.error("Error calculating end of day timestamp:", error2);
425
+ return 0;
426
+ }
427
+ }
428
+ return 0;
429
+ };
430
+ var fIsBetween = (inputDate, startDate, endDate) => {
431
+ if (!inputDate || !startDate || !endDate) {
432
+ return false;
433
+ }
434
+ try {
435
+ const input = typeof inputDate === "string" ? (0, import_date_fns.parseISO)(inputDate) : new Date(inputDate);
436
+ const start = typeof startDate === "string" ? (0, import_date_fns.parseISO)(startDate) : new Date(startDate);
437
+ const end = typeof endDate === "string" ? (0, import_date_fns.parseISO)(endDate) : new Date(endDate);
438
+ if (!(0, import_date_fns.isValid)(input) || !(0, import_date_fns.isValid)(start) || !(0, import_date_fns.isValid)(end)) {
439
+ return false;
440
+ }
441
+ const inputTime = input.getTime();
442
+ const startTime = start.getTime();
443
+ const endTime = end.getTime();
444
+ return inputTime >= startTime && inputTime <= endTime;
445
+ } catch (error2) {
446
+ console.error("Error checking if date is between:", error2);
447
+ return false;
448
+ }
449
+ };
450
+ var fIsAfter = (startDate, endDate) => {
451
+ if (!startDate || !endDate) {
452
+ return false;
453
+ }
454
+ try {
455
+ const start = typeof startDate === "string" ? (0, import_date_fns.parseISO)(startDate) : new Date(startDate);
456
+ const end = typeof endDate === "string" ? (0, import_date_fns.parseISO)(endDate) : new Date(endDate);
457
+ if (!(0, import_date_fns.isValid)(start) || !(0, import_date_fns.isValid)(end)) {
458
+ return "Invalid time value";
459
+ }
460
+ return (0, import_date_fns.isAfter)(start, end);
461
+ } catch (error2) {
462
+ console.error("Error comparing dates:", error2);
463
+ return false;
464
+ }
465
+ };
466
+ var fIsSame = (startDate, endDate, units = "year") => {
467
+ if (!startDate || !endDate) {
468
+ return false;
469
+ }
470
+ try {
471
+ const start = typeof startDate === "string" ? (0, import_date_fns.parseISO)(startDate) : new Date(startDate);
472
+ const end = typeof endDate === "string" ? (0, import_date_fns.parseISO)(endDate) : new Date(endDate);
473
+ if (!(0, import_date_fns.isValid)(start) || !(0, import_date_fns.isValid)(end)) {
474
+ return "Invalid time value";
475
+ }
476
+ switch (units) {
477
+ case "day":
478
+ return (0, import_date_fns.isSameDay)(start, end);
479
+ case "month":
480
+ return (0, import_date_fns.isSameMonth)(start, end);
481
+ case "year":
482
+ default:
483
+ return (0, import_date_fns.isSameYear)(start, end);
484
+ }
485
+ } catch (error2) {
486
+ console.error("Error checking if dates are the same:", error2);
487
+ return false;
488
+ }
489
+ };
490
+ var fDateRangeShortLabel = (startDate, endDate, initial = false) => {
491
+ if (!startDate || !endDate) return "Invalid time value";
492
+ try {
493
+ const start = typeof startDate === "string" ? (0, import_date_fns.parseISO)(startDate) : new Date(startDate);
494
+ const end = typeof endDate === "string" ? (0, import_date_fns.parseISO)(endDate) : new Date(endDate);
495
+ const isValidDate = (0, import_date_fns.isValid)(start) && (0, import_date_fns.isValid)(end);
496
+ const dateIsAfter = fIsAfter(start, end);
497
+ if (!isValidDate || dateIsAfter === "Invalid time value" || dateIsAfter) {
498
+ return "Invalid time value";
499
+ }
500
+ let label = `${fDate(start)} - ${fDate(end)}`;
501
+ if (initial) {
502
+ return label;
503
+ }
504
+ const sameYear = fIsSame(start, end, "year");
505
+ const sameMonth = fIsSame(start, end, "month");
506
+ const sameDay = fIsSame(start, end, "day");
507
+ if (sameYear && !sameMonth) {
508
+ label = `${fDate(start, "dd MMM")} - ${fDate(end)}`;
509
+ } else if (sameYear && sameMonth && !sameDay) {
510
+ label = `${fDate(start, "dd")} - ${fDate(end)}`;
511
+ } else if (sameYear && sameMonth && sameDay) {
512
+ label = `${fDate(end)}`;
513
+ }
514
+ return label;
515
+ } catch (error2) {
516
+ console.error("Error formatting date range:", error2);
517
+ return "Invalid time value";
518
+ }
519
+ };
520
+
298
521
  // src/libs/format-number.ts
299
522
  var processInput = (inputValue) => {
300
523
  if (inputValue == null || Number.isNaN(Number(inputValue))) return null;
@@ -380,9 +603,12 @@ var fData = (inputValue) => {
380
603
 
381
604
  // src/libs/fullname-utils.ts
382
605
  var getInitials = (name) => {
383
- const names = name?.split(" ");
384
- const initials = names?.map((n) => n.charAt(0)?.toUpperCase())?.join("");
385
- return initials;
606
+ if (!name?.trim()) return "CN";
607
+ const words = name.trim().split(/\s+/);
608
+ if (words.length === 1) {
609
+ return words[0].slice(0, 2).toUpperCase();
610
+ }
611
+ return words.slice(0, 2).map((word) => word.charAt(0).toUpperCase()).join("");
386
612
  };
387
613
  var splitFullname = (name) => {
388
614
  if (!name) {
@@ -8795,7 +9021,7 @@ FilterDropdown.displayName = "FilterDropdown";
8795
9021
 
8796
9022
  // src/components/Toolbar/DateRangeDropdown.tsx
8797
9023
  var import_react22 = require("react");
8798
- var import_date_fns2 = require("date-fns");
9024
+ var import_date_fns3 = require("date-fns");
8799
9025
  var import_Popover3 = __toESM(require("@mui/material/Popover"), 1);
8800
9026
 
8801
9027
  // src/components/Toolbar/ToolbarDatePickerButton.tsx
@@ -8809,7 +9035,7 @@ var ToolbarDatePickerButton = ({
8809
9035
 
8810
9036
  // src/components/DateRangePicker/index.tsx
8811
9037
  var import_react21 = require("react");
8812
- var import_date_fns = require("date-fns");
9038
+ var import_date_fns2 = require("date-fns");
8813
9039
  var import_Box17 = __toESM(require("@mui/material/Box"), 1);
8814
9040
  var import_Radio3 = __toESM(require("@mui/material/Radio"), 1);
8815
9041
  var import_Button4 = __toESM(require("@mui/material/Button"), 1);
@@ -8835,20 +9061,20 @@ function getDateRangeFromPreset(preset) {
8835
9061
  const today = /* @__PURE__ */ new Date();
8836
9062
  switch (preset) {
8837
9063
  case "today":
8838
- return { start: (0, import_date_fns.startOfDay)(today), end: (0, import_date_fns.endOfDay)(today) };
9064
+ return { start: (0, import_date_fns2.startOfDay)(today), end: (0, import_date_fns2.endOfDay)(today) };
8839
9065
  case "yesterday":
8840
9066
  return {
8841
- start: (0, import_date_fns.startOfDay)((0, import_date_fns.subDays)(today, 1)),
8842
- end: (0, import_date_fns.endOfDay)((0, import_date_fns.subDays)(today, 1))
9067
+ start: (0, import_date_fns2.startOfDay)((0, import_date_fns2.subDays)(today, 1)),
9068
+ end: (0, import_date_fns2.endOfDay)((0, import_date_fns2.subDays)(today, 1))
8843
9069
  };
8844
9070
  case "last7days":
8845
- return { start: (0, import_date_fns.startOfDay)((0, import_date_fns.subDays)(today, 6)), end: (0, import_date_fns.endOfDay)(today) };
9071
+ return { start: (0, import_date_fns2.startOfDay)((0, import_date_fns2.subDays)(today, 6)), end: (0, import_date_fns2.endOfDay)(today) };
8846
9072
  case "last30days":
8847
- return { start: (0, import_date_fns.startOfDay)((0, import_date_fns.subDays)(today, 29)), end: (0, import_date_fns.endOfDay)(today) };
9073
+ return { start: (0, import_date_fns2.startOfDay)((0, import_date_fns2.subDays)(today, 29)), end: (0, import_date_fns2.endOfDay)(today) };
8848
9074
  case "last6months":
8849
- return { start: (0, import_date_fns.startOfDay)((0, import_date_fns.subMonths)(today, 6)), end: (0, import_date_fns.endOfDay)(today) };
9075
+ return { start: (0, import_date_fns2.startOfDay)((0, import_date_fns2.subMonths)(today, 6)), end: (0, import_date_fns2.endOfDay)(today) };
8850
9076
  case "lastyear":
8851
- return { start: (0, import_date_fns.startOfDay)((0, import_date_fns.subYears)(today, 1)), end: (0, import_date_fns.endOfDay)(today) };
9077
+ return { start: (0, import_date_fns2.startOfDay)((0, import_date_fns2.subYears)(today, 1)), end: (0, import_date_fns2.endOfDay)(today) };
8852
9078
  case "alltime":
8853
9079
  return { start: null, end: null };
8854
9080
  case "custom":
@@ -8894,7 +9120,7 @@ var DateRangePicker = (0, import_react21.forwardRef)(
8894
9120
  if (selectingDate === "start") {
8895
9121
  setTempRange((prev) => ({
8896
9122
  start: date,
8897
- end: prev.end && (0, import_date_fns.isAfter)(date, prev.end) ? null : prev.end
9123
+ end: prev.end && (0, import_date_fns2.isAfter)(date, prev.end) ? null : prev.end
8898
9124
  }));
8899
9125
  setSelectingDate("end");
8900
9126
  } else {
@@ -8914,15 +9140,15 @@ var DateRangePicker = (0, import_react21.forwardRef)(
8914
9140
  const handleEndDateClick = (0, import_react21.useCallback)(() => {
8915
9141
  setSelectingDate("end");
8916
9142
  }, []);
8917
- const formattedStartDate = tempRange.start ? (0, import_date_fns.format)(tempRange.start, dateFormat) : "";
8918
- const formattedEndDate = tempRange.end ? (0, import_date_fns.format)(tempRange.end, dateFormat) : "";
9143
+ const formattedStartDate = tempRange.start ? (0, import_date_fns2.format)(tempRange.start, dateFormat) : "";
9144
+ const formattedEndDate = tempRange.end ? (0, import_date_fns2.format)(tempRange.end, dateFormat) : "";
8919
9145
  const leftCalendarMonth = (0, import_react21.useMemo)(() => {
8920
9146
  if (tempRange.start) return tempRange.start;
8921
9147
  return /* @__PURE__ */ new Date();
8922
9148
  }, [tempRange.start]);
8923
9149
  const rightCalendarMonth = (0, import_react21.useMemo)(() => {
8924
9150
  if (tempRange.end) return tempRange.end;
8925
- return (0, import_date_fns.addMonths)(/* @__PURE__ */ new Date(), 1);
9151
+ return (0, import_date_fns2.addMonths)(/* @__PURE__ */ new Date(), 1);
8926
9152
  }, [tempRange.end]);
8927
9153
  return /* @__PURE__ */ (0, import_jsx_runtime88.jsx)(import_LocalizationProvider.LocalizationProvider, { dateAdapter: import_AdapterDateFns.AdapterDateFns, children: /* @__PURE__ */ (0, import_jsx_runtime88.jsxs)(
8928
9154
  import_Box17.default,
@@ -9097,8 +9323,8 @@ function DateRangeDropdown({
9097
9323
  if (preset === "custom" && value?.start && value?.end) {
9098
9324
  const startYear = value.start.getFullYear();
9099
9325
  const endYear = value.end.getFullYear();
9100
- const startStr = startYear !== endYear ? (0, import_date_fns2.format)(value.start, "MMM d, yyyy") : (0, import_date_fns2.format)(value.start, "MMM d");
9101
- const endStr = (0, import_date_fns2.format)(value.end, "MMM d, yyyy");
9326
+ const startStr = startYear !== endYear ? (0, import_date_fns3.format)(value.start, "MMM d, yyyy") : (0, import_date_fns3.format)(value.start, "MMM d");
9327
+ const endStr = (0, import_date_fns3.format)(value.end, "MMM d, yyyy");
9102
9328
  return `${startStr} - ${endStr}`;
9103
9329
  }
9104
9330
  const presetsToSearch = presets ?? defaultPresets;
@@ -10188,7 +10414,7 @@ var RHFToggleButton = ({
10188
10414
  // src/components/HookForm/RHFDateRangePicker.tsx
10189
10415
  var import_react25 = require("react");
10190
10416
  var import_react_hook_form10 = require("react-hook-form");
10191
- var import_date_fns3 = require("date-fns");
10417
+ var import_date_fns4 = require("date-fns");
10192
10418
  var import_Box23 = __toESM(require("@mui/material/Box"), 1);
10193
10419
  var import_Popover4 = __toESM(require("@mui/material/Popover"), 1);
10194
10420
  var import_TextField6 = __toESM(require("@mui/material/TextField"), 1);
@@ -10221,11 +10447,11 @@ function RHFDateRangePicker({
10221
10447
  const presetOption = presets.find((p) => p.value === value.preset);
10222
10448
  if (presetOption) return presetOption.label;
10223
10449
  }
10224
- if (value.start && value.end && (0, import_date_fns3.isValid)(value.start) && (0, import_date_fns3.isValid)(value.end)) {
10450
+ if (value.start && value.end && (0, import_date_fns4.isValid)(value.start) && (0, import_date_fns4.isValid)(value.end)) {
10225
10451
  const startYear = value.start.getFullYear();
10226
10452
  const endYear = value.end.getFullYear();
10227
- const startStr = startYear !== endYear ? (0, import_date_fns3.format)(value.start, dateFormat) : (0, import_date_fns3.format)(value.start, "MMM d");
10228
- const endStr = (0, import_date_fns3.format)(value.end, dateFormat);
10453
+ const startStr = startYear !== endYear ? (0, import_date_fns4.format)(value.start, dateFormat) : (0, import_date_fns4.format)(value.start, "MMM d");
10454
+ const endStr = (0, import_date_fns4.format)(value.end, dateFormat);
10229
10455
  return `${startStr} - ${endStr}`;
10230
10456
  }
10231
10457
  return "";
@@ -11005,7 +11231,7 @@ var RHFDatePickerComponent = ({
11005
11231
  slotProps,
11006
11232
  helperText,
11007
11233
  clearable = false,
11008
- format: format4 = "MMM d, yyyy",
11234
+ format: format5 = "MMM d, yyyy",
11009
11235
  ...other
11010
11236
  }) => {
11011
11237
  const { control } = (0, import_react_hook_form13.useFormContext)();
@@ -11031,7 +11257,7 @@ var RHFDatePickerComponent = ({
11031
11257
  value: field.value ?? null,
11032
11258
  onChange: (newValue) => field.onChange(newValue),
11033
11259
  enableAccessibleFieldDOMStructure: false,
11034
- format: format4,
11260
+ format: format5,
11035
11261
  open: isOpen,
11036
11262
  onClose: () => setIsOpen(false),
11037
11263
  slots: {
@@ -11069,7 +11295,7 @@ var RHFTimePickerComponent = ({
11069
11295
  slotProps,
11070
11296
  helperText,
11071
11297
  clearable = false,
11072
- format: format4 = "h:mma",
11298
+ format: format5 = "h:mma",
11073
11299
  ...other
11074
11300
  }) => {
11075
11301
  const { control } = (0, import_react_hook_form13.useFormContext)();
@@ -11095,7 +11321,7 @@ var RHFTimePickerComponent = ({
11095
11321
  value: field.value ?? null,
11096
11322
  onChange: (newValue) => field.onChange(newValue),
11097
11323
  enableAccessibleFieldDOMStructure: false,
11098
- format: format4,
11324
+ format: format5,
11099
11325
  open: isOpen,
11100
11326
  onClose: () => setIsOpen(false),
11101
11327
  slots: {
@@ -11133,7 +11359,7 @@ var RHFDateTimePickerComponent = ({
11133
11359
  slotProps,
11134
11360
  helperText,
11135
11361
  clearable = false,
11136
- format: format4 = "MMM d, yyyy h:mma",
11362
+ format: format5 = "MMM d, yyyy h:mma",
11137
11363
  ...other
11138
11364
  }) => {
11139
11365
  const { control } = (0, import_react_hook_form13.useFormContext)();
@@ -11159,7 +11385,7 @@ var RHFDateTimePickerComponent = ({
11159
11385
  value: field.value ?? null,
11160
11386
  onChange: (newValue) => field.onChange(newValue),
11161
11387
  enableAccessibleFieldDOMStructure: false,
11162
- format: format4,
11388
+ format: format5,
11163
11389
  open: isOpen,
11164
11390
  onClose: () => setIsOpen(false),
11165
11391
  slots: {
@@ -12688,12 +12914,22 @@ __reExport(index_exports, components_exports2, module.exports);
12688
12914
  defaultSettings,
12689
12915
  dialogClasses,
12690
12916
  drawerClasses,
12917
+ endOfDayTimestamp,
12691
12918
  error,
12692
12919
  fCurrency,
12693
12920
  fData,
12921
+ fDate,
12922
+ fDateRangeShortLabel,
12923
+ fDateTime,
12924
+ fIsAfter,
12925
+ fIsBetween,
12926
+ fIsSame,
12694
12927
  fNumber,
12695
12928
  fPercent,
12696
12929
  fShortenNumber,
12930
+ fTime,
12931
+ fTimestamp,
12932
+ fToNow,
12697
12933
  feedbackDialogClasses,
12698
12934
  fileData,
12699
12935
  fileNameByUrl,
@@ -12739,6 +12975,7 @@ __reExport(index_exports, components_exports2, module.exports);
12739
12975
  shadows,
12740
12976
  snakeCase,
12741
12977
  splitFullname,
12978
+ startOfDayTimestamp,
12742
12979
  stylesMode,
12743
12980
  success,
12744
12981
  surface,