@sustaina/shared-ui 1.71.0 → 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.js CHANGED
@@ -5543,78 +5543,6 @@ var DatePicker2 = (props) => {
5543
5543
  // src/components/advanceSearch/components/constants/index.ts
5544
5544
  var fallbackShortDateFormat = "DD/MM/YYYY";
5545
5545
  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;
5546
- var RANGE_START_ERROR = "Start value must be before end value.";
5547
- var RANGE_END_ERROR = "End value must be after start value.";
5548
- var RANGE_VALIDATED_TYPES = ["date", "datetime", "datemonth"];
5549
- var sanitizeInput = (val, fieldType) => {
5550
- if (!val) return val;
5551
- if (Array.isArray(val)) {
5552
- return val.map((v) => sanitizeInput(v, fieldType));
5553
- }
5554
- if (val.includes("\n") || val.includes("\r") || /[\u2028\u2029]/u.test(val))
5555
- return "__INVALID_NEWLINE__";
5556
- if (/\\\\/.test(val)) return "__INVALID_ESCAPE__";
5557
- if (/\\(n|t|r|b|f|u[0-9a-fA-F]{4})/.test(val)) return "__INVALID_ESCAPE__";
5558
- if (/\p{Cf}/u.test(val)) return "__INVALID_UNICODE_WHITESPACE__";
5559
- if (/[\u00A0\u1680\u180E\u202F\u205F\u3000]/u.test(val)) return "__INVALID_UNICODE_WHITESPACE__";
5560
- if (fieldType === "text") return val;
5561
- const trimmed = val.trim();
5562
- if (/^\{.*\}$/s.test(trimmed) || /^\[.*\]$/s.test(trimmed)) return "__INVALID_JSON_LITERAL__";
5563
- if (/\\\{/.test(val) || /\\\}/.test(val)) return "__INVALID_JSON_ESCAPE__";
5564
- if (/[%*~^]/.test(trimmed)) return "__INVALID_WILDCARD__";
5565
- if (/[%><={}\\[\]"']/u.test(trimmed)) return "__INVALID_CHAR__";
5566
- if (/\p{Cc}/u.test(val)) return "__INVALID_CONTROL_CHAR__";
5567
- return val;
5568
- };
5569
- var numericTypes = ["number"];
5570
- var dateTypes = ["date", "datemonth"];
5571
- var validateByFieldType = (value, fieldType) => {
5572
- if (!value) return { valid: true };
5573
- if (Array.isArray(value)) {
5574
- return { valid: true };
5575
- }
5576
- if (numericTypes.includes(fieldType)) {
5577
- if (!/^-?\d+(\.\d+)?$/.test(value)) {
5578
- return { valid: false, message: "Please enter a valid number." };
5579
- }
5580
- }
5581
- if (fieldType === "uuid") {
5582
- if (!UUIDregex.test(value)) {
5583
- return { valid: false, message: "Please enter a valid UUID." };
5584
- }
5585
- }
5586
- if (dateTypes.includes(fieldType)) {
5587
- const normalized = fieldType === "datemonth" ? `${value}-01` : value;
5588
- const parsed = dateFns.parseISO(normalized);
5589
- if (!dateFns.isValid(parsed)) {
5590
- return { valid: false, message: "Invalid date format." };
5591
- }
5592
- }
5593
- return { valid: true };
5594
- };
5595
- var parseRangeValue = (raw, fieldType) => {
5596
- if (!raw) return void 0;
5597
- const normalized = fieldType === "datemonth" ? `${raw}-01` : raw;
5598
- const parsed = dateFns.parseISO(normalized);
5599
- return dateFns.isValid(parsed) ? parsed : void 0;
5600
- };
5601
- var validateDateRange = (which, row, formValues) => {
5602
- if (row.operator !== "between" || !RANGE_VALIDATED_TYPES.includes(row.fieldType)) return true;
5603
- const start = formValues[`value_${row.id}`];
5604
- const end = formValues[`value2_${row.id}`];
5605
- if (typeof start !== "string" || typeof end !== "string" || !start || !end) return true;
5606
- const d1 = parseRangeValue(start, row.fieldType);
5607
- const d2 = parseRangeValue(end, row.fieldType);
5608
- if (d1 && d2 && dateFns.isAfter(d1, d2)) {
5609
- return which === "value" ? RANGE_START_ERROR : RANGE_END_ERROR;
5610
- }
5611
- return true;
5612
- };
5613
- var buildValueRules = (which, row) => ({
5614
- required: "This field is required.",
5615
- validate: (_value, formValues) => validateDateRange(which, row, formValues),
5616
- deps: [which === "value" ? `value2_${row.id}` : `value_${row.id}`]
5617
- });
5618
5546
  var ConditionDateInput = ({
5619
5547
  row,
5620
5548
  control,
@@ -5638,9 +5566,8 @@ var ConditionDateInput = ({
5638
5566
  {
5639
5567
  control,
5640
5568
  name: fieldName,
5641
- rules: buildValueRules(which, row),
5569
+ rules: { required: "This field is required." },
5642
5570
  render: ({ field, fieldState }) => {
5643
- const { value: fieldValue, ...fieldRest } = field;
5644
5571
  const handleValueChange = (next) => {
5645
5572
  field.onChange(next ?? void 0);
5646
5573
  if (!next) {
@@ -5651,8 +5578,8 @@ var ConditionDateInput = ({
5651
5578
  /* @__PURE__ */ jsxRuntime.jsx(FormControl, { children: /* @__PURE__ */ jsxRuntime.jsx(
5652
5579
  DatePicker2,
5653
5580
  {
5654
- ...fieldRest,
5655
- value: fieldValue || void 0,
5581
+ ...field,
5582
+ value: field.value || void 0,
5656
5583
  onValueChange: handleValueChange,
5657
5584
  placeholder: dateFormat,
5658
5585
  ariaLabel: buildAriaLabel(options?.isEnd),
@@ -6161,10 +6088,9 @@ var ConditionMonthInput = ({ row, control, onClear }) => {
6161
6088
  {
6162
6089
  control,
6163
6090
  name: fieldName,
6164
- rules: buildValueRules(which, row),
6091
+ rules: { required: "This field is required." },
6165
6092
  render: ({ field, fieldState }) => {
6166
- const { value: fieldValue, ...fieldRest } = field;
6167
- const value = fieldValue || void 0;
6093
+ const value = field.value || void 0;
6168
6094
  const handleValueChange = (next) => {
6169
6095
  field.onChange(next ?? void 0);
6170
6096
  if (!next) {
@@ -6175,7 +6101,7 @@ var ConditionMonthInput = ({ row, control, onClear }) => {
6175
6101
  /* @__PURE__ */ jsxRuntime.jsx(FormControl, { children: /* @__PURE__ */ jsxRuntime.jsx(
6176
6102
  MonthPicker2,
6177
6103
  {
6178
- ...fieldRest,
6104
+ ...field,
6179
6105
  value,
6180
6106
  onValueChange: handleValueChange,
6181
6107
  placeholder,
@@ -8722,6 +8648,51 @@ function transformFilterKeys(obj, fieldMap = FILTER_FIELD_MAP) {
8722
8648
  }
8723
8649
  return obj;
8724
8650
  }
8651
+ var sanitizeInput = (val) => {
8652
+ if (!val) return val;
8653
+ if (Array.isArray(val)) {
8654
+ return val.map((v) => sanitizeInput(v));
8655
+ }
8656
+ if (val.includes("\n") || val.includes("\r") || /[\u2028\u2029]/u.test(val))
8657
+ return "__INVALID_NEWLINE__";
8658
+ if (/\\\\/.test(val)) return "__INVALID_ESCAPE__";
8659
+ if (/\\(n|t|r|b|f|u[0-9a-fA-F]{4})/.test(val)) return "__INVALID_ESCAPE__";
8660
+ if (/\p{Cf}/u.test(val)) return "__INVALID_UNICODE_WHITESPACE__";
8661
+ if (/[\u00A0\u1680\u180E\u202F\u205F\u3000]/u.test(val)) return "__INVALID_UNICODE_WHITESPACE__";
8662
+ const trimmed = val.trim();
8663
+ if (/^\{.*\}$/s.test(trimmed) || /^\[.*\]$/s.test(trimmed)) return "__INVALID_JSON_LITERAL__";
8664
+ if (/\\\{/.test(val) || /\\\}/.test(val)) return "__INVALID_JSON_ESCAPE__";
8665
+ if (/[%*~^]/.test(trimmed)) return "__INVALID_WILDCARD__";
8666
+ if (/[%><={}\\[\]"']/u.test(trimmed)) return "__INVALID_CHAR__";
8667
+ if (/\p{Cc}/u.test(val)) return "__INVALID_CONTROL_CHAR__";
8668
+ return val;
8669
+ };
8670
+ var numericTypes = ["number"];
8671
+ var dateTypes = ["date", "datemonth"];
8672
+ var validateByFieldType = (value, fieldType) => {
8673
+ if (!value) return { valid: true };
8674
+ if (Array.isArray(value)) {
8675
+ return { valid: true };
8676
+ }
8677
+ if (numericTypes.includes(fieldType)) {
8678
+ if (!/^-?\d+(\.\d+)?$/.test(value)) {
8679
+ return { valid: false, message: "Please enter a valid number." };
8680
+ }
8681
+ }
8682
+ if (fieldType === "uuid") {
8683
+ if (!UUIDregex.test(value)) {
8684
+ return { valid: false, message: "Please enter a valid UUID." };
8685
+ }
8686
+ }
8687
+ if (dateTypes.includes(fieldType)) {
8688
+ const normalized = fieldType === "datemonth" ? `${value}-01` : value;
8689
+ const parsed = dateFns.parseISO(normalized);
8690
+ if (!dateFns.isValid(parsed)) {
8691
+ return { valid: false, message: "Invalid date format." };
8692
+ }
8693
+ }
8694
+ return { valid: true };
8695
+ };
8725
8696
  var AdvanceSearch = ({
8726
8697
  fields,
8727
8698
  portalId,
@@ -8774,6 +8745,13 @@ var AdvanceSearch = ({
8774
8745
  },
8775
8746
  [resetField, clearErrors]
8776
8747
  );
8748
+ const parseRangeValue = React.useCallback((raw, fieldType) => {
8749
+ if (!raw) return void 0;
8750
+ if (Array.isArray(raw)) return void 0;
8751
+ const normalized = fieldType === "datemonth" ? `${raw}-01` : raw;
8752
+ const parsed = dateFns.parseISO(normalized);
8753
+ return dateFns.isValid(parsed) ? parsed : void 0;
8754
+ }, []);
8777
8755
  const onSubmit = React.useCallback(() => {
8778
8756
  const operatorValidation = {};
8779
8757
  rows.forEach((r) => {
@@ -8790,7 +8768,7 @@ var AdvanceSearch = ({
8790
8768
  const endField = `value2_${r.id}`;
8791
8769
  let v1 = currentValues[startField];
8792
8770
  let v2 = currentValues[endField];
8793
- const s1 = sanitizeInput(v1, r.fieldType);
8771
+ const s1 = sanitizeInput(v1);
8794
8772
  if (Array.isArray(s1) && s1.some((v) => v?.startsWith("__INVALID")) || typeof s1 === "string" && s1?.startsWith("__INVALID")) {
8795
8773
  hasError = true;
8796
8774
  setError(startField, { type: "validate", message: "Invalid input." });
@@ -8804,7 +8782,7 @@ var AdvanceSearch = ({
8804
8782
  return null;
8805
8783
  }
8806
8784
  if (r.operator === "between") {
8807
- const s2 = sanitizeInput(v2, r.fieldType);
8785
+ const s2 = sanitizeInput(v2);
8808
8786
  if (Array.isArray(s2) && s2.some((v) => v?.startsWith("__INVALID")) || typeof s2 === "string" && s2?.startsWith("__INVALID")) {
8809
8787
  hasError = true;
8810
8788
  setError(endField, { type: "validate", message: "Invalid input." });
@@ -8817,6 +8795,16 @@ var AdvanceSearch = ({
8817
8795
  setError(endField, { type: "validate", message: valid2.message });
8818
8796
  return null;
8819
8797
  }
8798
+ if (v1 && v2 && ["date", "datemonth"].includes(r.fieldType)) {
8799
+ const d1 = parseRangeValue(v1, r.fieldType);
8800
+ const d2 = parseRangeValue(v2, r.fieldType);
8801
+ if (d1 && d2 && dateFns.isAfter(d1, d2)) {
8802
+ hasError = true;
8803
+ setError(startField, { type: "validate", message: "Start value must be before end value." });
8804
+ setError(endField, { type: "validate", message: "End value must be after start value." });
8805
+ return null;
8806
+ }
8807
+ }
8820
8808
  return { ...r, value: v1, value2: v2 };
8821
8809
  }
8822
8810
  return { ...r, value: v1 };
@@ -8846,6 +8834,7 @@ var AdvanceSearch = ({
8846
8834
  rows,
8847
8835
  operatorsForField,
8848
8836
  getValues,
8837
+ parseRangeValue,
8849
8838
  setError,
8850
8839
  setOperatorErrors,
8851
8840
  filterFieldMap,
@@ -13885,8 +13874,8 @@ var GridSettingsModal = ({
13885
13874
  }
13886
13875
  }, [isOpen, currentColumns, form]);
13887
13876
  const addColumn = async () => {
13888
- const isValid6 = await trigger("columns");
13889
- if (isValid6) {
13877
+ const isValid7 = await trigger("columns");
13878
+ if (isValid7) {
13890
13879
  append({ id: "" });
13891
13880
  requestAnimationFrame(() => {
13892
13881
  const container = scrollRef.current;