@sustaina/shared-ui 1.70.8 → 1.80.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
@@ -15,7 +15,7 @@ import { createPortal } from 'react-dom';
15
15
  import * as SelectPrimitive from '@radix-ui/react-select';
16
16
  import { useForm, FormProvider, Controller, useFormContext, useFormState, useFieldArray, useWatch } from 'react-hook-form';
17
17
  import * as LabelPrimitive from '@radix-ui/react-label';
18
- import { format, isValid, parseISO, compareAsc, parse, isAfter } from 'date-fns';
18
+ import { format, isValid, parseISO, isAfter, compareAsc, parse } from 'date-fns';
19
19
  import * as PopoverPrimitive from '@radix-ui/react-popover';
20
20
  import { Command as Command$1 } from 'cmdk';
21
21
  import * as DialogPrimitive2 from '@radix-ui/react-dialog';
@@ -5500,77 +5500,6 @@ var DatePicker2 = (props) => {
5500
5500
  // src/components/advanceSearch/components/constants/index.ts
5501
5501
  var fallbackShortDateFormat = "DD/MM/YYYY";
5502
5502
  var UUIDregex = /^[0-9a-f]{8}-?[0-9a-f]{4}-?4[0-9a-f]{3}-?[89ab][0-9a-f]{3}-?[0-9a-f]{12}$/i;
5503
- var RANGE_START_ERROR = "Start value must be before end value.";
5504
- var RANGE_END_ERROR = "End value must be after start value.";
5505
- var RANGE_VALIDATED_TYPES = ["date", "datetime", "datemonth"];
5506
- var sanitizeInput = (val) => {
5507
- if (!val) return val;
5508
- if (Array.isArray(val)) {
5509
- return val.map((v) => sanitizeInput(v));
5510
- }
5511
- if (val.includes("\n") || val.includes("\r") || /[\u2028\u2029]/u.test(val))
5512
- return "__INVALID_NEWLINE__";
5513
- if (/\\\\/.test(val)) return "__INVALID_ESCAPE__";
5514
- if (/\\(n|t|r|b|f|u[0-9a-fA-F]{4})/.test(val)) return "__INVALID_ESCAPE__";
5515
- if (/\p{Cf}/u.test(val)) return "__INVALID_UNICODE_WHITESPACE__";
5516
- if (/[\u00A0\u1680\u180E\u202F\u205F\u3000]/u.test(val)) return "__INVALID_UNICODE_WHITESPACE__";
5517
- const trimmed = val.trim();
5518
- if (/^\{.*\}$/s.test(trimmed) || /^\[.*\]$/s.test(trimmed)) return "__INVALID_JSON_LITERAL__";
5519
- if (/\\\{/.test(val) || /\\\}/.test(val)) return "__INVALID_JSON_ESCAPE__";
5520
- if (/[%*~^]/.test(trimmed)) return "__INVALID_WILDCARD__";
5521
- if (/[%><={}\\[\]"']/u.test(trimmed)) return "__INVALID_CHAR__";
5522
- if (/\p{Cc}/u.test(val)) return "__INVALID_CONTROL_CHAR__";
5523
- return val;
5524
- };
5525
- var numericTypes = ["number"];
5526
- var dateTypes = ["date", "datemonth"];
5527
- var validateByFieldType = (value, fieldType) => {
5528
- if (!value) return { valid: true };
5529
- if (Array.isArray(value)) {
5530
- return { valid: true };
5531
- }
5532
- if (numericTypes.includes(fieldType)) {
5533
- if (!/^-?\d+(\.\d+)?$/.test(value)) {
5534
- return { valid: false, message: "Please enter a valid number." };
5535
- }
5536
- }
5537
- if (fieldType === "uuid") {
5538
- if (!UUIDregex.test(value)) {
5539
- return { valid: false, message: "Please enter a valid UUID." };
5540
- }
5541
- }
5542
- if (dateTypes.includes(fieldType)) {
5543
- const normalized = fieldType === "datemonth" ? `${value}-01` : value;
5544
- const parsed = parseISO(normalized);
5545
- if (!isValid(parsed)) {
5546
- return { valid: false, message: "Invalid date format." };
5547
- }
5548
- }
5549
- return { valid: true };
5550
- };
5551
- var parseRangeValue = (raw, fieldType) => {
5552
- if (!raw) return void 0;
5553
- const normalized = fieldType === "datemonth" ? `${raw}-01` : raw;
5554
- const parsed = parseISO(normalized);
5555
- return isValid(parsed) ? parsed : void 0;
5556
- };
5557
- var validateDateRange = (which, row, formValues) => {
5558
- if (row.operator !== "between" || !RANGE_VALIDATED_TYPES.includes(row.fieldType)) return true;
5559
- const start = formValues[`value_${row.id}`];
5560
- const end = formValues[`value2_${row.id}`];
5561
- if (typeof start !== "string" || typeof end !== "string" || !start || !end) return true;
5562
- const d1 = parseRangeValue(start, row.fieldType);
5563
- const d2 = parseRangeValue(end, row.fieldType);
5564
- if (d1 && d2 && isAfter(d1, d2)) {
5565
- return which === "value" ? RANGE_START_ERROR : RANGE_END_ERROR;
5566
- }
5567
- return true;
5568
- };
5569
- var buildValueRules = (which, row) => ({
5570
- required: "This field is required.",
5571
- validate: (_value, formValues) => validateDateRange(which, row, formValues),
5572
- deps: [which === "value" ? `value2_${row.id}` : `value_${row.id}`]
5573
- });
5574
5503
  var ConditionDateInput = ({
5575
5504
  row,
5576
5505
  control,
@@ -5594,9 +5523,8 @@ var ConditionDateInput = ({
5594
5523
  {
5595
5524
  control,
5596
5525
  name: fieldName,
5597
- rules: buildValueRules(which, row),
5526
+ rules: { required: "This field is required." },
5598
5527
  render: ({ field, fieldState }) => {
5599
- const { value: fieldValue, ...fieldRest } = field;
5600
5528
  const handleValueChange = (next) => {
5601
5529
  field.onChange(next ?? void 0);
5602
5530
  if (!next) {
@@ -5607,8 +5535,8 @@ var ConditionDateInput = ({
5607
5535
  /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(
5608
5536
  DatePicker2,
5609
5537
  {
5610
- ...fieldRest,
5611
- value: fieldValue || void 0,
5538
+ ...field,
5539
+ value: field.value || void 0,
5612
5540
  onValueChange: handleValueChange,
5613
5541
  placeholder: dateFormat,
5614
5542
  ariaLabel: buildAriaLabel(options?.isEnd),
@@ -6117,10 +6045,9 @@ var ConditionMonthInput = ({ row, control, onClear }) => {
6117
6045
  {
6118
6046
  control,
6119
6047
  name: fieldName,
6120
- rules: buildValueRules(which, row),
6048
+ rules: { required: "This field is required." },
6121
6049
  render: ({ field, fieldState }) => {
6122
- const { value: fieldValue, ...fieldRest } = field;
6123
- const value = fieldValue || void 0;
6050
+ const value = field.value || void 0;
6124
6051
  const handleValueChange = (next) => {
6125
6052
  field.onChange(next ?? void 0);
6126
6053
  if (!next) {
@@ -6131,7 +6058,7 @@ var ConditionMonthInput = ({ row, control, onClear }) => {
6131
6058
  /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(
6132
6059
  MonthPicker2,
6133
6060
  {
6134
- ...fieldRest,
6061
+ ...field,
6135
6062
  value,
6136
6063
  onValueChange: handleValueChange,
6137
6064
  placeholder,
@@ -8678,6 +8605,51 @@ function transformFilterKeys(obj, fieldMap = FILTER_FIELD_MAP) {
8678
8605
  }
8679
8606
  return obj;
8680
8607
  }
8608
+ var sanitizeInput = (val) => {
8609
+ if (!val) return val;
8610
+ if (Array.isArray(val)) {
8611
+ return val.map((v) => sanitizeInput(v));
8612
+ }
8613
+ if (val.includes("\n") || val.includes("\r") || /[\u2028\u2029]/u.test(val))
8614
+ return "__INVALID_NEWLINE__";
8615
+ if (/\\\\/.test(val)) return "__INVALID_ESCAPE__";
8616
+ if (/\\(n|t|r|b|f|u[0-9a-fA-F]{4})/.test(val)) return "__INVALID_ESCAPE__";
8617
+ if (/\p{Cf}/u.test(val)) return "__INVALID_UNICODE_WHITESPACE__";
8618
+ if (/[\u00A0\u1680\u180E\u202F\u205F\u3000]/u.test(val)) return "__INVALID_UNICODE_WHITESPACE__";
8619
+ const trimmed = val.trim();
8620
+ if (/^\{.*\}$/s.test(trimmed) || /^\[.*\]$/s.test(trimmed)) return "__INVALID_JSON_LITERAL__";
8621
+ if (/\\\{/.test(val) || /\\\}/.test(val)) return "__INVALID_JSON_ESCAPE__";
8622
+ if (/[%*~^]/.test(trimmed)) return "__INVALID_WILDCARD__";
8623
+ if (/[%><={}\\[\]"']/u.test(trimmed)) return "__INVALID_CHAR__";
8624
+ if (/\p{Cc}/u.test(val)) return "__INVALID_CONTROL_CHAR__";
8625
+ return val;
8626
+ };
8627
+ var numericTypes = ["number"];
8628
+ var dateTypes = ["date", "datemonth"];
8629
+ var validateByFieldType = (value, fieldType) => {
8630
+ if (!value) return { valid: true };
8631
+ if (Array.isArray(value)) {
8632
+ return { valid: true };
8633
+ }
8634
+ if (numericTypes.includes(fieldType)) {
8635
+ if (!/^-?\d+(\.\d+)?$/.test(value)) {
8636
+ return { valid: false, message: "Please enter a valid number." };
8637
+ }
8638
+ }
8639
+ if (fieldType === "uuid") {
8640
+ if (!UUIDregex.test(value)) {
8641
+ return { valid: false, message: "Please enter a valid UUID." };
8642
+ }
8643
+ }
8644
+ if (dateTypes.includes(fieldType)) {
8645
+ const normalized = fieldType === "datemonth" ? `${value}-01` : value;
8646
+ const parsed = parseISO(normalized);
8647
+ if (!isValid(parsed)) {
8648
+ return { valid: false, message: "Invalid date format." };
8649
+ }
8650
+ }
8651
+ return { valid: true };
8652
+ };
8681
8653
  var AdvanceSearch = ({
8682
8654
  fields,
8683
8655
  portalId,
@@ -8730,6 +8702,13 @@ var AdvanceSearch = ({
8730
8702
  },
8731
8703
  [resetField, clearErrors]
8732
8704
  );
8705
+ const parseRangeValue = useCallback((raw, fieldType) => {
8706
+ if (!raw) return void 0;
8707
+ if (Array.isArray(raw)) return void 0;
8708
+ const normalized = fieldType === "datemonth" ? `${raw}-01` : raw;
8709
+ const parsed = parseISO(normalized);
8710
+ return isValid(parsed) ? parsed : void 0;
8711
+ }, []);
8733
8712
  const onSubmit = useCallback(() => {
8734
8713
  const operatorValidation = {};
8735
8714
  rows.forEach((r) => {
@@ -8773,6 +8752,16 @@ var AdvanceSearch = ({
8773
8752
  setError(endField, { type: "validate", message: valid2.message });
8774
8753
  return null;
8775
8754
  }
8755
+ if (v1 && v2 && ["date", "datemonth"].includes(r.fieldType)) {
8756
+ const d1 = parseRangeValue(v1, r.fieldType);
8757
+ const d2 = parseRangeValue(v2, r.fieldType);
8758
+ if (d1 && d2 && isAfter(d1, d2)) {
8759
+ hasError = true;
8760
+ setError(startField, { type: "validate", message: "Start value must be before end value." });
8761
+ setError(endField, { type: "validate", message: "End value must be after start value." });
8762
+ return null;
8763
+ }
8764
+ }
8776
8765
  return { ...r, value: v1, value2: v2 };
8777
8766
  }
8778
8767
  return { ...r, value: v1 };
@@ -8802,6 +8791,7 @@ var AdvanceSearch = ({
8802
8791
  rows,
8803
8792
  operatorsForField,
8804
8793
  getValues,
8794
+ parseRangeValue,
8805
8795
  setError,
8806
8796
  setOperatorErrors,
8807
8797
  filterFieldMap,
@@ -13841,8 +13831,8 @@ var GridSettingsModal = ({
13841
13831
  }
13842
13832
  }, [isOpen, currentColumns, form]);
13843
13833
  const addColumn = async () => {
13844
- const isValid6 = await trigger("columns");
13845
- if (isValid6) {
13834
+ const isValid7 = await trigger("columns");
13835
+ if (isValid7) {
13846
13836
  append({ id: "" });
13847
13837
  requestAnimationFrame(() => {
13848
13838
  const container = scrollRef.current;