@sustaina/shared-ui 1.2.0 → 1.4.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/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import * as React3 from 'react';
2
- import React3__default, { createContext, isValidElement, useState, useEffect, useId, useContext, useRef, useCallback, useMemo, createElement } from 'react';
1
+ import * as React4 from 'react';
2
+ import React4__default, { createContext, isValidElement, useState, useEffect, useId, useContext, useRef, useCallback, useMemo, createElement } from 'react';
3
3
  import { Controller, useFormContext, useForm, useFieldArray, FormProvider, get, set, appendErrors, useFormState } from 'react-hook-form';
4
4
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
5
5
  import clsx3, { clsx } from 'clsx';
@@ -980,6 +980,38 @@ var DataTable = ({
980
980
  );
981
981
  };
982
982
  var DataTable_default = DataTable;
983
+ var usePreventPageLeaveStore = create((set) => ({
984
+ isPreventing: false,
985
+ setPreventing: (value) => set({ isPreventing: value })
986
+ }));
987
+ var usePreventPageLeaveStore_default = usePreventPageLeaveStore;
988
+
989
+ // src/components/prevent-page-leave/PreventPageLeave.tsx
990
+ var PreventPageLeave = ({ children }) => {
991
+ const { isPreventing } = usePreventPageLeaveStore();
992
+ useEffect(() => {
993
+ if (!isPreventing || typeof window === "undefined") {
994
+ return;
995
+ }
996
+ function beforeUnload(event) {
997
+ event.preventDefault();
998
+ event.returnValue = true;
999
+ }
1000
+ window.addEventListener("beforeunload", beforeUnload);
1001
+ return () => {
1002
+ window.removeEventListener("beforeunload", beforeUnload);
1003
+ };
1004
+ }, [isPreventing]);
1005
+ return children;
1006
+ };
1007
+ var PreventPageLeave_default = PreventPageLeave;
1008
+ var usePreventPageLeave = ({ isPrevening }) => {
1009
+ const setPreventing = usePreventPageLeaveStore_default((state) => state.setPreventing);
1010
+ useEffect(() => {
1011
+ setPreventing(isPrevening);
1012
+ }, [isPrevening, setPreventing]);
1013
+ };
1014
+ var usePreventPageLeave_default = usePreventPageLeave;
983
1015
  var buttonVariants = cva(
984
1016
  "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive cursor-pointer",
985
1017
  {
@@ -1103,15 +1135,15 @@ var t2 = function(o3, t3, s2) {
1103
1135
  };
1104
1136
  };
1105
1137
  var Form = FormProvider;
1106
- var FormFieldContext2 = React3.createContext({});
1138
+ var FormFieldContext2 = React4.createContext({});
1107
1139
  var FormField2 = ({
1108
1140
  ...props
1109
1141
  }) => {
1110
1142
  return /* @__PURE__ */ jsx(FormFieldContext2.Provider, { value: { name: props.name }, children: /* @__PURE__ */ jsx(Controller, { ...props }) });
1111
1143
  };
1112
1144
  var useFormField2 = () => {
1113
- const fieldContext = React3.useContext(FormFieldContext2);
1114
- const itemContext = React3.useContext(FormItemContext2);
1145
+ const fieldContext = React4.useContext(FormFieldContext2);
1146
+ const itemContext = React4.useContext(FormItemContext2);
1115
1147
  const { getFieldState } = useFormContext();
1116
1148
  const formState = useFormState({ name: fieldContext.name });
1117
1149
  const fieldState = getFieldState(fieldContext.name, formState);
@@ -1128,9 +1160,9 @@ var useFormField2 = () => {
1128
1160
  ...fieldState
1129
1161
  };
1130
1162
  };
1131
- var FormItemContext2 = React3.createContext({});
1163
+ var FormItemContext2 = React4.createContext({});
1132
1164
  function FormItem2({ className, ...props }) {
1133
- const id = React3.useId();
1165
+ const id = React4.useId();
1134
1166
  return /* @__PURE__ */ jsx(FormItemContext2.Provider, { value: { id }, children: /* @__PURE__ */ jsx("div", { "data-slot": "form-item", className: cn("grid gap-2", className), ...props }) });
1135
1167
  }
1136
1168
  function FormControl({ ...props }) {
@@ -1476,7 +1508,9 @@ function SortableRow({
1476
1508
  children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "Choose column..." })
1477
1509
  }
1478
1510
  ) }),
1479
- /* @__PURE__ */ jsx(SelectContent, { children: options.filter((i2) => i2.id === field.value || !currentColumns?.some((c) => c.id === i2.id)).sort(
1511
+ /* @__PURE__ */ jsx(SelectContent, { children: options.filter(
1512
+ (i2) => i2.id === field.value || !currentColumns?.some((c, idx) => c.id === i2.id && idx !== index)
1513
+ ).sort(
1480
1514
  (a, b) => a.id === field.value ? -1 : b.id === field.value ? 1 : 0
1481
1515
  ).map((opt) => /* @__PURE__ */ jsx(
1482
1516
  SelectItem,
@@ -1690,16 +1724,16 @@ var GridSettingsModal = ({
1690
1724
  {
1691
1725
  items: fields?.slice(1).map((c) => c?.fieldId),
1692
1726
  strategy: verticalListSortingStrategy,
1693
- children: fields?.slice(1).map((col, index) => /* @__PURE__ */ jsx(
1727
+ children: fields?.slice(1).map((col, index2) => /* @__PURE__ */ jsx(
1694
1728
  SortableRow,
1695
1729
  {
1696
1730
  value: col?.fieldId,
1697
1731
  control,
1698
- name: `columns.${index + 1}.id`,
1732
+ name: `columns.${index2 + 1}.id`,
1699
1733
  isDragging,
1700
1734
  availableColumns,
1701
1735
  currentColumns: fields,
1702
- onRemove: () => remove(index + 1)
1736
+ onRemove: () => remove(index2 + 1)
1703
1737
  },
1704
1738
  col?.fieldId
1705
1739
  ))
@@ -1768,7 +1802,7 @@ var InfoIcon = (props) => {
1768
1802
  }
1769
1803
  );
1770
1804
  };
1771
- var InfoIcon_default = React3__default.memo(InfoIcon);
1805
+ var InfoIcon_default = React4__default.memo(InfoIcon);
1772
1806
  function TooltipProvider2({
1773
1807
  delayDuration = 0,
1774
1808
  ...props
@@ -1832,10 +1866,12 @@ var Navbar = ({
1832
1866
  subButtonDisable = false,
1833
1867
  onMainButtonClick,
1834
1868
  onSubButtonClick,
1869
+ separatorDisable = false,
1835
1870
  searchButton
1836
1871
  }) => {
1837
1872
  const { isMobile, isTablet, isDesktop } = useScreenSize_default();
1838
1873
  const Icon3 = CircleHelp;
1874
+ const shouldShowSeparator = !separatorDisable && isValidElement(searchButton);
1839
1875
  return /* @__PURE__ */ jsxs(
1840
1876
  "nav",
1841
1877
  {
@@ -1931,14 +1967,14 @@ var Navbar = ({
1931
1967
  children: subButtonText
1932
1968
  }
1933
1969
  ),
1934
- isValidElement(searchButton) ? /* @__PURE__ */ jsx("div", { role: "separator", className: "ml-1 w-[1px] h-10 bg-white" }) : "",
1970
+ shouldShowSeparator && /* @__PURE__ */ jsx("div", { role: "separator", className: "ml-1 w-[1px] h-10 bg-white" }),
1935
1971
  isValidElement(searchButton) ? searchButton : ""
1936
1972
  ] })
1937
1973
  ]
1938
1974
  }
1939
1975
  );
1940
1976
  };
1941
- var navbar_default = React3__default.memo(Navbar);
1977
+ var navbar_default = React4__default.memo(Navbar);
1942
1978
  var ExpandCollapse = ({ title, children, portalId }) => {
1943
1979
  const [isOpen, setIsOpen] = useState(false);
1944
1980
  const Panel = /* @__PURE__ */ jsx(
@@ -2473,13 +2509,13 @@ function DatePicker({
2473
2509
  className,
2474
2510
  ...props
2475
2511
  }) {
2476
- const today = React3.useMemo(() => startOfDay(/* @__PURE__ */ new Date()), []);
2477
- const [displayed, setDisplayed] = React3.useState(
2512
+ const today = React4.useMemo(() => startOfDay(/* @__PURE__ */ new Date()), []);
2513
+ const [displayed, setDisplayed] = React4.useState(
2478
2514
  selectedDate ? new Date(selectedDate) : /* @__PURE__ */ new Date()
2479
2515
  );
2480
2516
  minDate = clampToDay(minDate);
2481
2517
  maxDate = clampToDay(maxDate);
2482
- const disabledSet = React3.useMemo(() => {
2518
+ const disabledSet = React4.useMemo(() => {
2483
2519
  const s2 = /* @__PURE__ */ new Set();
2484
2520
  disabledDates?.forEach((d) => s2.add(startOfDay(d).toISOString()));
2485
2521
  return s2;
@@ -2488,7 +2524,7 @@ function DatePicker({
2488
2524
  const displayMonth = displayed.getMonth();
2489
2525
  const monthLabel = callbacks?.monthLabel?.(displayYear, displayMonth) ?? new Intl.DateTimeFormat(void 0, { month: "short" }).format(displayed);
2490
2526
  const yearLabel = callbacks?.yearLabel?.(displayYear) ?? String(displayYear);
2491
- const weekdays = React3.useMemo(() => {
2527
+ const weekdays = React4.useMemo(() => {
2492
2528
  const labels = [];
2493
2529
  for (let i2 = 0; i2 < 7; i2++) {
2494
2530
  const idx = i2;
@@ -2497,7 +2533,7 @@ function DatePicker({
2497
2533
  }
2498
2534
  return labels;
2499
2535
  }, [callbacks]);
2500
- const grid = React3.useMemo(() => buildCalendarGrid(displayed, true), [displayed]);
2536
+ const grid = React4.useMemo(() => buildCalendarGrid(displayed, true), [displayed]);
2501
2537
  const isDateDisabled = (date) => {
2502
2538
  const d = startOfDay(date);
2503
2539
  if (minDate && d < minDate) return true;
@@ -2584,8 +2620,8 @@ var TagsInput = ({ value = [], onChange, onClear, error }) => {
2584
2620
  onChange([...value, trimmed]);
2585
2621
  setInputValue("");
2586
2622
  };
2587
- const removeTag = (index) => {
2588
- const newTags = value.filter((_, i2) => i2 !== index);
2623
+ const removeTag = (index2) => {
2624
+ const newTags = value.filter((_, i2) => i2 !== index2);
2589
2625
  onChange(newTags);
2590
2626
  };
2591
2627
  const handleKeyDown = (e2) => {
@@ -2924,8 +2960,8 @@ function buildLocalizeFn(args) {
2924
2960
  const width = options?.width ? String(options.width) : args.defaultWidth;
2925
2961
  valuesArray = args.values[width] || args.values[defaultWidth];
2926
2962
  }
2927
- const index = args.argumentCallback ? args.argumentCallback(value) : value;
2928
- return valuesArray[index];
2963
+ const index2 = args.argumentCallback ? args.argumentCallback(value) : value;
2964
+ return valuesArray[index2];
2929
2965
  };
2930
2966
  }
2931
2967
 
@@ -3245,7 +3281,7 @@ var match = {
3245
3281
  defaultMatchWidth: "wide",
3246
3282
  parsePatterns: parseQuarterPatterns,
3247
3283
  defaultParseWidth: "any",
3248
- valueCallback: (index) => index + 1
3284
+ valueCallback: (index2) => index2 + 1
3249
3285
  }),
3250
3286
  month: buildMatchFn({
3251
3287
  matchPatterns: matchMonthPatterns,
@@ -4380,15 +4416,15 @@ function Label4({ className, ...props }) {
4380
4416
  );
4381
4417
  }
4382
4418
  var Form2 = FormProvider;
4383
- var FormFieldContext3 = React3.createContext({});
4419
+ var FormFieldContext3 = React4.createContext({});
4384
4420
  var FormField3 = ({
4385
4421
  ...props
4386
4422
  }) => {
4387
4423
  return /* @__PURE__ */ jsx(FormFieldContext3.Provider, { value: { name: props.name }, children: /* @__PURE__ */ jsx(Controller, { ...props }) });
4388
4424
  };
4389
4425
  var useFormField3 = () => {
4390
- const fieldContext = React3.useContext(FormFieldContext3);
4391
- const itemContext = React3.useContext(FormItemContext3);
4426
+ const fieldContext = React4.useContext(FormFieldContext3);
4427
+ const itemContext = React4.useContext(FormItemContext3);
4392
4428
  const { getFieldState } = useFormContext();
4393
4429
  const formState = useFormState({ name: fieldContext.name });
4394
4430
  const fieldState = getFieldState(fieldContext.name, formState);
@@ -4405,9 +4441,9 @@ var useFormField3 = () => {
4405
4441
  ...fieldState
4406
4442
  };
4407
4443
  };
4408
- var FormItemContext3 = React3.createContext({});
4444
+ var FormItemContext3 = React4.createContext({});
4409
4445
  function FormItem3({ className, ...props }) {
4410
- const id = React3.useId();
4446
+ const id = React4.useId();
4411
4447
  return /* @__PURE__ */ jsx(FormItemContext3.Provider, { value: { id }, children: /* @__PURE__ */ jsx("div", { "data-slot": "form-item", className: cn2("grid gap-2", className), ...props }) });
4412
4448
  }
4413
4449
  function FormControl2({ ...props }) {
@@ -4439,7 +4475,7 @@ var AdvanceSearchRow = ({
4439
4475
  const { control } = form;
4440
4476
  const fieldSchema = fields.find((f) => f.name === row.fieldName);
4441
4477
  const fieldType = fieldSchema?.type ?? "text";
4442
- React3__default.useEffect(() => {
4478
+ React4__default.useEffect(() => {
4443
4479
  if (operators && operators.length > 0 && !operators.includes(row.operator)) {
4444
4480
  onChangeOperator(operators[0]);
4445
4481
  }
@@ -4450,8 +4486,8 @@ var AdvanceSearchRow = ({
4450
4486
  const isLookup = fieldType === "lookup";
4451
4487
  const isNumber = fieldType === "number";
4452
4488
  const isDate2 = fieldType === "date" || fieldType === "datetime";
4453
- const [openDateValue1, setOpenDateValue1] = React3__default.useState(false);
4454
- const [openDateValue2, setOpenDateValue2] = React3__default.useState(false);
4489
+ const [openDateValue1, setOpenDateValue1] = React4__default.useState(false);
4490
+ const [openDateValue2, setOpenDateValue2] = React4__default.useState(false);
4455
4491
  const toDateFromISO = (v) => {
4456
4492
  if (!v) return void 0;
4457
4493
  try {
@@ -4687,7 +4723,8 @@ var AdvanceSearch = ({
4687
4723
  portalId,
4688
4724
  iconColor = "#ffffff",
4689
4725
  limitRows = 4,
4690
- onSearch
4726
+ onSearch,
4727
+ onClear
4691
4728
  }) => {
4692
4729
  const fieldsData = useMemo(() => fields || [], [fields]);
4693
4730
  const {
@@ -4730,6 +4767,8 @@ var AdvanceSearch = ({
4730
4767
  return { [r2.fieldName]: { startsWith: val1 } };
4731
4768
  case "endsWith":
4732
4769
  return { [r2.fieldName]: { endsWith: val1 } };
4770
+ case "equals":
4771
+ return { [r2.fieldName]: { equals: val1 } };
4733
4772
  case "notEquals":
4734
4773
  return { [r2.fieldName]: { not: val1 } };
4735
4774
  case "gt":
@@ -4756,8 +4795,12 @@ var AdvanceSearch = ({
4756
4795
  return { [r2.fieldName]: { hasEvery: String(val1).split(",") } };
4757
4796
  case "containsOnly":
4758
4797
  return { [r2.fieldName]: { equals: String(val1).split(",") } };
4759
- default:
4760
- return { [r2.fieldName]: val1 };
4798
+ case "on":
4799
+ return { [r2.fieldName]: { on: val1 } };
4800
+ case "after":
4801
+ return { [r2.fieldName]: { after: val1 } };
4802
+ case "before":
4803
+ return { [r2.fieldName]: { before: val1 } };
4761
4804
  }
4762
4805
  }).filter(Boolean)
4763
4806
  };
@@ -4813,7 +4856,7 @@ var AdvanceSearch = ({
4813
4856
  onClick: () => {
4814
4857
  clearAllRow();
4815
4858
  Object.keys(getValues()).forEach((k) => resetField(k));
4816
- onSubmit();
4859
+ if (onClear) onClear();
4817
4860
  },
4818
4861
  children: "Clear Search"
4819
4862
  }
@@ -5003,6 +5046,6 @@ function ConfirmDialog({ dialogData, setDialog, onClose }) {
5003
5046
  ] }) });
5004
5047
  }
5005
5048
 
5006
- export { AdvanceSearch_default as AdvanceSearch, Button, DataTable_default as DataTable, ConfirmDialog as Dialog, FormErrorMessage, FormField, FormFieldContext, FormItem, FormItemContext, FormLabel, GridSettingsModal_default as GridSettingsModal, HeaderCell_default as HeaderCell, navbar_default as Navbar, NumberInput, TextInput, booleanToSelectValue, buttonVariants, cn, compareAlphanumeric, getColumnIdFromTable, renderContentSlot, selectValueToBoolean, useFormField, useGridSettingsStore, useHover_default as useHover, useIntersectionObserver_default as useIntersectionObserver, useMediaQuery_default as useMediaQuery, useScreenSize_default as useScreenSize };
5049
+ export { AdvanceSearch_default as AdvanceSearch, Button, DataTable_default as DataTable, ConfirmDialog as Dialog, FormErrorMessage, FormField, FormFieldContext, FormItem, FormItemContext, FormLabel, GridSettingsModal_default as GridSettingsModal, HeaderCell_default as HeaderCell, navbar_default as Navbar, NumberInput, PreventPageLeave_default as PreventPageLeave, TextInput, booleanToSelectValue, buttonVariants, cn, compareAlphanumeric, getColumnIdFromTable, renderContentSlot, selectValueToBoolean, useFormField, useGridSettingsStore, useHover_default as useHover, useIntersectionObserver_default as useIntersectionObserver, useMediaQuery_default as useMediaQuery, usePreventPageLeave_default as usePreventPageLeave, usePreventPageLeaveStore_default as usePreventPageLeaveStore, useScreenSize_default as useScreenSize };
5007
5050
  //# sourceMappingURL=index.mjs.map
5008
5051
  //# sourceMappingURL=index.mjs.map