@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/README.md +51 -251
- package/README.md.local-bak +273 -0
- package/dist/index.js +71 -81
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +72 -82
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
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
|
|
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:
|
|
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
|
-
...
|
|
5611
|
-
value:
|
|
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:
|
|
6048
|
+
rules: { required: "This field is required." },
|
|
6121
6049
|
render: ({ field, fieldState }) => {
|
|
6122
|
-
const
|
|
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
|
-
...
|
|
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
|
|
13845
|
-
if (
|
|
13834
|
+
const isValid7 = await trigger("columns");
|
|
13835
|
+
if (isValid7) {
|
|
13846
13836
|
append({ id: "" });
|
|
13847
13837
|
requestAnimationFrame(() => {
|
|
13848
13838
|
const container = scrollRef.current;
|