@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/README.md +51 -251
- package/README.md.local-bak +273 -0
- package/dist/index.js +73 -84
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +74 -85
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
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:
|
|
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
|
-
...
|
|
5655
|
-
value:
|
|
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:
|
|
6091
|
+
rules: { required: "This field is required." },
|
|
6165
6092
|
render: ({ field, fieldState }) => {
|
|
6166
|
-
const
|
|
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
|
-
...
|
|
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
|
|
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
|
|
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
|
|
13889
|
-
if (
|
|
13877
|
+
const isValid7 = await trigger("columns");
|
|
13878
|
+
if (isValid7) {
|
|
13890
13879
|
append({ id: "" });
|
|
13891
13880
|
requestAnimationFrame(() => {
|
|
13892
13881
|
const container = scrollRef.current;
|