@sustaina/shared-ui 1.71.0 → 1.80.1

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,78 +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, fieldType) => {
5507
- if (!val) return val;
5508
- if (Array.isArray(val)) {
5509
- return val.map((v) => sanitizeInput(v, fieldType));
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
- if (fieldType === "text") return val;
5518
- const trimmed = val.trim();
5519
- if (/^\{.*\}$/s.test(trimmed) || /^\[.*\]$/s.test(trimmed)) return "__INVALID_JSON_LITERAL__";
5520
- if (/\\\{/.test(val) || /\\\}/.test(val)) return "__INVALID_JSON_ESCAPE__";
5521
- if (/[%*~^]/.test(trimmed)) return "__INVALID_WILDCARD__";
5522
- if (/[%><={}\\[\]"']/u.test(trimmed)) return "__INVALID_CHAR__";
5523
- if (/\p{Cc}/u.test(val)) return "__INVALID_CONTROL_CHAR__";
5524
- return val;
5525
- };
5526
- var numericTypes = ["number"];
5527
- var dateTypes = ["date", "datemonth"];
5528
- var validateByFieldType = (value, fieldType) => {
5529
- if (!value) return { valid: true };
5530
- if (Array.isArray(value)) {
5531
- return { valid: true };
5532
- }
5533
- if (numericTypes.includes(fieldType)) {
5534
- if (!/^-?\d+(\.\d+)?$/.test(value)) {
5535
- return { valid: false, message: "Please enter a valid number." };
5536
- }
5537
- }
5538
- if (fieldType === "uuid") {
5539
- if (!UUIDregex.test(value)) {
5540
- return { valid: false, message: "Please enter a valid UUID." };
5541
- }
5542
- }
5543
- if (dateTypes.includes(fieldType)) {
5544
- const normalized = fieldType === "datemonth" ? `${value}-01` : value;
5545
- const parsed = parseISO(normalized);
5546
- if (!isValid(parsed)) {
5547
- return { valid: false, message: "Invalid date format." };
5548
- }
5549
- }
5550
- return { valid: true };
5551
- };
5552
- var parseRangeValue = (raw, fieldType) => {
5553
- if (!raw) return void 0;
5554
- const normalized = fieldType === "datemonth" ? `${raw}-01` : raw;
5555
- const parsed = parseISO(normalized);
5556
- return isValid(parsed) ? parsed : void 0;
5557
- };
5558
- var validateDateRange = (which, row, formValues) => {
5559
- if (row.operator !== "between" || !RANGE_VALIDATED_TYPES.includes(row.fieldType)) return true;
5560
- const start = formValues[`value_${row.id}`];
5561
- const end = formValues[`value2_${row.id}`];
5562
- if (typeof start !== "string" || typeof end !== "string" || !start || !end) return true;
5563
- const d1 = parseRangeValue(start, row.fieldType);
5564
- const d2 = parseRangeValue(end, row.fieldType);
5565
- if (d1 && d2 && isAfter(d1, d2)) {
5566
- return which === "value" ? RANGE_START_ERROR : RANGE_END_ERROR;
5567
- }
5568
- return true;
5569
- };
5570
- var buildValueRules = (which, row) => ({
5571
- required: "This field is required.",
5572
- validate: (_value, formValues) => validateDateRange(which, row, formValues),
5573
- deps: [which === "value" ? `value2_${row.id}` : `value_${row.id}`]
5574
- });
5575
5503
  var ConditionDateInput = ({
5576
5504
  row,
5577
5505
  control,
@@ -5595,9 +5523,8 @@ var ConditionDateInput = ({
5595
5523
  {
5596
5524
  control,
5597
5525
  name: fieldName,
5598
- rules: buildValueRules(which, row),
5526
+ rules: { required: "This field is required." },
5599
5527
  render: ({ field, fieldState }) => {
5600
- const { value: fieldValue, ...fieldRest } = field;
5601
5528
  const handleValueChange = (next) => {
5602
5529
  field.onChange(next ?? void 0);
5603
5530
  if (!next) {
@@ -5608,8 +5535,8 @@ var ConditionDateInput = ({
5608
5535
  /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(
5609
5536
  DatePicker2,
5610
5537
  {
5611
- ...fieldRest,
5612
- value: fieldValue || void 0,
5538
+ ...field,
5539
+ value: field.value || void 0,
5613
5540
  onValueChange: handleValueChange,
5614
5541
  placeholder: dateFormat,
5615
5542
  ariaLabel: buildAriaLabel(options?.isEnd),
@@ -6118,10 +6045,9 @@ var ConditionMonthInput = ({ row, control, onClear }) => {
6118
6045
  {
6119
6046
  control,
6120
6047
  name: fieldName,
6121
- rules: buildValueRules(which, row),
6048
+ rules: { required: "This field is required." },
6122
6049
  render: ({ field, fieldState }) => {
6123
- const { value: fieldValue, ...fieldRest } = field;
6124
- const value = fieldValue || void 0;
6050
+ const value = field.value || void 0;
6125
6051
  const handleValueChange = (next) => {
6126
6052
  field.onChange(next ?? void 0);
6127
6053
  if (!next) {
@@ -6132,7 +6058,7 @@ var ConditionMonthInput = ({ row, control, onClear }) => {
6132
6058
  /* @__PURE__ */ jsx(FormControl, { children: /* @__PURE__ */ jsx(
6133
6059
  MonthPicker2,
6134
6060
  {
6135
- ...fieldRest,
6061
+ ...field,
6136
6062
  value,
6137
6063
  onValueChange: handleValueChange,
6138
6064
  placeholder,
@@ -8679,6 +8605,51 @@ function transformFilterKeys(obj, fieldMap = FILTER_FIELD_MAP) {
8679
8605
  }
8680
8606
  return obj;
8681
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
+ };
8682
8653
  var AdvanceSearch = ({
8683
8654
  fields,
8684
8655
  portalId,
@@ -8731,6 +8702,13 @@ var AdvanceSearch = ({
8731
8702
  },
8732
8703
  [resetField, clearErrors]
8733
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
+ }, []);
8734
8712
  const onSubmit = useCallback(() => {
8735
8713
  const operatorValidation = {};
8736
8714
  rows.forEach((r) => {
@@ -8747,7 +8725,7 @@ var AdvanceSearch = ({
8747
8725
  const endField = `value2_${r.id}`;
8748
8726
  let v1 = currentValues[startField];
8749
8727
  let v2 = currentValues[endField];
8750
- const s1 = sanitizeInput(v1, r.fieldType);
8728
+ const s1 = sanitizeInput(v1);
8751
8729
  if (Array.isArray(s1) && s1.some((v) => v?.startsWith("__INVALID")) || typeof s1 === "string" && s1?.startsWith("__INVALID")) {
8752
8730
  hasError = true;
8753
8731
  setError(startField, { type: "validate", message: "Invalid input." });
@@ -8761,7 +8739,7 @@ var AdvanceSearch = ({
8761
8739
  return null;
8762
8740
  }
8763
8741
  if (r.operator === "between") {
8764
- const s2 = sanitizeInput(v2, r.fieldType);
8742
+ const s2 = sanitizeInput(v2);
8765
8743
  if (Array.isArray(s2) && s2.some((v) => v?.startsWith("__INVALID")) || typeof s2 === "string" && s2?.startsWith("__INVALID")) {
8766
8744
  hasError = true;
8767
8745
  setError(endField, { type: "validate", message: "Invalid input." });
@@ -8774,6 +8752,16 @@ var AdvanceSearch = ({
8774
8752
  setError(endField, { type: "validate", message: valid2.message });
8775
8753
  return null;
8776
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
+ }
8777
8765
  return { ...r, value: v1, value2: v2 };
8778
8766
  }
8779
8767
  return { ...r, value: v1 };
@@ -8803,6 +8791,7 @@ var AdvanceSearch = ({
8803
8791
  rows,
8804
8792
  operatorsForField,
8805
8793
  getValues,
8794
+ parseRangeValue,
8806
8795
  setError,
8807
8796
  setOperatorErrors,
8808
8797
  filterFieldMap,
@@ -13842,8 +13831,8 @@ var GridSettingsModal = ({
13842
13831
  }
13843
13832
  }, [isOpen, currentColumns, form]);
13844
13833
  const addColumn = async () => {
13845
- const isValid6 = await trigger("columns");
13846
- if (isValid6) {
13834
+ const isValid7 = await trigger("columns");
13835
+ if (isValid7) {
13847
13836
  append({ id: "" });
13848
13837
  requestAnimationFrame(() => {
13849
13838
  const container = scrollRef.current;