@bsol-oss/react-datatable5 11.0.0-beta.3 → 11.0.0-beta.5
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
|
@@ -28,8 +28,8 @@ var gr = require('react-icons/gr');
|
|
|
28
28
|
var hi = require('react-icons/hi');
|
|
29
29
|
var reactI18next = require('react-i18next');
|
|
30
30
|
var axios = require('axios');
|
|
31
|
-
var dayjs = require('dayjs');
|
|
32
31
|
var reactHookForm = require('react-hook-form');
|
|
32
|
+
var dayjs = require('dayjs');
|
|
33
33
|
var ti = require('react-icons/ti');
|
|
34
34
|
|
|
35
35
|
function _interopNamespaceDefault(e) {
|
|
@@ -3567,16 +3567,6 @@ const SchemaFormContext = React.createContext({
|
|
|
3567
3567
|
requestOptions: {},
|
|
3568
3568
|
});
|
|
3569
3569
|
|
|
3570
|
-
const HoverCardContent = React__namespace.forwardRef(function HoverCardContent(props, ref) {
|
|
3571
|
-
const { portalled = true, portalRef, ...rest } = props;
|
|
3572
|
-
return (jsxRuntime.jsx(react.Portal, { disabled: !portalled, container: portalRef, children: jsxRuntime.jsx(react.HoverCard.Positioner, { children: jsxRuntime.jsx(react.HoverCard.Content, { ref: ref, ...rest }) }) }));
|
|
3573
|
-
});
|
|
3574
|
-
const HoverCardArrow = React__namespace.forwardRef(function HoverCardArrow(props, ref) {
|
|
3575
|
-
return (jsxRuntime.jsx(react.HoverCard.Arrow, { ref: ref, ...props, children: jsxRuntime.jsx(react.HoverCard.ArrowTip, {}) }));
|
|
3576
|
-
});
|
|
3577
|
-
const HoverCardRoot = react.HoverCard.Root;
|
|
3578
|
-
const HoverCardTrigger = react.HoverCard.Trigger;
|
|
3579
|
-
|
|
3580
3570
|
const useSchemaContext = () => {
|
|
3581
3571
|
const { schema, serverUrl, requestUrl, order, ignore, onSubmit, rowNumber, idMap, setIdMap, translate, requestOptions, } = React.useContext(SchemaFormContext);
|
|
3582
3572
|
return {
|
|
@@ -3594,22 +3584,6 @@ const useSchemaContext = () => {
|
|
|
3594
3584
|
};
|
|
3595
3585
|
};
|
|
3596
3586
|
|
|
3597
|
-
const IdViewer = ({ value, column }) => {
|
|
3598
|
-
const { schema, idMap, translate } = useSchemaContext();
|
|
3599
|
-
if (schema.properties == undefined) {
|
|
3600
|
-
throw new Error("schema properties when using DatePicker");
|
|
3601
|
-
}
|
|
3602
|
-
const { foreign_key } = schema.properties[column];
|
|
3603
|
-
if (foreign_key === undefined) {
|
|
3604
|
-
throw new Error("foreign_key when variant is id-picker");
|
|
3605
|
-
}
|
|
3606
|
-
const { display_column } = foreign_key;
|
|
3607
|
-
if (value === undefined) {
|
|
3608
|
-
return (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", children: [jsxRuntime.jsx(react.Text, { children: translate.t(`${column}.fieldLabel`) }), jsxRuntime.jsx(react.Text, { children: translate.t(`empty`) })] }));
|
|
3609
|
-
}
|
|
3610
|
-
return (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", children: [jsxRuntime.jsx(react.Text, { children: translate.t(`${column}.fieldLabel`) }), jsxRuntime.jsxs(HoverCardRoot, { children: [jsxRuntime.jsx(HoverCardTrigger, { asChild: true, children: jsxRuntime.jsx(react.Text, { cursor: 'pointer', children: idMap[value][display_column] }) }), jsxRuntime.jsxs(HoverCardContent, { children: [jsxRuntime.jsx(HoverCardArrow, {}), jsxRuntime.jsx(RecordDisplay, { object: idMap[value] })] })] })] }));
|
|
3611
|
-
};
|
|
3612
|
-
|
|
3613
3587
|
const clearEmptyString = (object) => {
|
|
3614
3588
|
return Object.fromEntries(Object.entries(object).filter(([, value]) => value !== ""));
|
|
3615
3589
|
};
|
|
@@ -3624,20 +3598,24 @@ const AccordionItemContent = React__namespace.forwardRef(function AccordionItemC
|
|
|
3624
3598
|
const AccordionRoot = react.Accordion.Root;
|
|
3625
3599
|
const AccordionItem = react.Accordion.Item;
|
|
3626
3600
|
|
|
3627
|
-
const
|
|
3628
|
-
const {
|
|
3629
|
-
|
|
3630
|
-
}
|
|
3631
|
-
const
|
|
3632
|
-
const {
|
|
3633
|
-
|
|
3634
|
-
|
|
3635
|
-
|
|
3636
|
-
|
|
3637
|
-
|
|
3638
|
-
|
|
3639
|
-
|
|
3640
|
-
|
|
3601
|
+
const ArrayRenderer = ({ schema, column, prefix, }) => {
|
|
3602
|
+
const { gridRow, gridColumn = "1/span 12", required, items } = schema;
|
|
3603
|
+
const { translate } = useSchemaContext();
|
|
3604
|
+
const colLabel = `${prefix}${column}`;
|
|
3605
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
3606
|
+
const { formState: { errors }, control, } = reactHookForm.useFormContext();
|
|
3607
|
+
const { fields, append, prepend, remove, swap, move, insert } = reactHookForm.useFieldArray({
|
|
3608
|
+
control, // control props comes from useForm (optional: if you are using FormContext)
|
|
3609
|
+
name: "test", // unique name for your Field Array
|
|
3610
|
+
});
|
|
3611
|
+
return (jsxRuntime.jsxs(react.Box, { gridRow, gridColumn, children: [jsxRuntime.jsxs(react.Box, { as: "label", gridColumn: "1/span12", children: [`${translate.t(`${colLabel}.fieldLabel`)}`, isRequired && jsxRuntime.jsx("span", { children: "*" })] }), fields.map((field, index) => (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", children: [jsxRuntime.jsx(react.Grid, { gap: "4", padding: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat("auto-fit", auto)`, children: jsxRuntime.jsx(SchemaRenderer, { column: `${column}.${index}`,
|
|
3612
|
+
prefix: `${prefix}`,
|
|
3613
|
+
schema: items }, `form-${column}`) }), jsxRuntime.jsx(react.Flex, { justifyContent: "end", children: jsxRuntime.jsx(react.Button, { variant: "ghost", onClick: () => {
|
|
3614
|
+
remove(index);
|
|
3615
|
+
}, children: translate.t(`${colLabel}.remove`) }) })] }))), jsxRuntime.jsx(react.Flex, { children: jsxRuntime.jsx(react.Button, { onClick: () => {
|
|
3616
|
+
append({});
|
|
3617
|
+
}, children: translate.t(`${colLabel}.add`) }) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }));
|
|
3618
|
+
};
|
|
3641
3619
|
|
|
3642
3620
|
const Field = React__namespace.forwardRef(function Field(props, ref) {
|
|
3643
3621
|
const { label, children, helperText, errorText, optionalText, ...rest } = props;
|
|
@@ -4350,16 +4328,21 @@ const NumberInputField = ({ schema, column, prefix, }) => {
|
|
|
4350
4328
|
};
|
|
4351
4329
|
|
|
4352
4330
|
const ObjectInput = ({ schema, column, prefix }) => {
|
|
4353
|
-
const { properties } = schema;
|
|
4331
|
+
const { properties, gridRow, gridColumn = "1/span 12", required } = schema;
|
|
4332
|
+
const { translate } = useSchemaContext();
|
|
4333
|
+
const colLabel = `${prefix}${column}`;
|
|
4334
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4335
|
+
const { watch, formState: { errors }, setValue, control, } = reactHookForm.useFormContext();
|
|
4354
4336
|
if (properties === undefined) {
|
|
4355
4337
|
throw new Error(`properties is undefined when using ObjectInput`);
|
|
4356
4338
|
}
|
|
4357
|
-
return (jsxRuntime.jsx(jsxRuntime.
|
|
4358
|
-
|
|
4359
|
-
|
|
4360
|
-
|
|
4361
|
-
|
|
4362
|
-
|
|
4339
|
+
return (jsxRuntime.jsxs(react.Box, { gridRow, gridColumn, children: [jsxRuntime.jsxs(react.Box, { as: "label", gridColumn: "1/span12", children: [`${translate.t(`${colLabel}.fieldLabel`)}`, isRequired && jsxRuntime.jsx("span", { children: "*" })] }), jsxRuntime.jsx(react.Grid, { gap: "4", padding: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat("auto-fit", auto)`, children: Object.keys(properties ?? {}).map((key) => {
|
|
4340
|
+
return (
|
|
4341
|
+
// @ts-expect-error find suitable types
|
|
4342
|
+
jsxRuntime.jsx(ColumnRenderer, { column: `${key}`,
|
|
4343
|
+
prefix: `${prefix}${column}.`,
|
|
4344
|
+
properties }, `form-${column}`));
|
|
4345
|
+
}) }), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }));
|
|
4363
4346
|
};
|
|
4364
4347
|
|
|
4365
4348
|
const RecordInput = ({ column, schema, prefix }) => {
|
|
@@ -4433,13 +4416,13 @@ const RadioCardRoot = react.RadioCard.Root;
|
|
|
4433
4416
|
react.RadioCard.Label;
|
|
4434
4417
|
react.RadioCard.ItemIndicator;
|
|
4435
4418
|
|
|
4436
|
-
const TagPicker = ({ column }) => {
|
|
4419
|
+
const TagPicker = ({ column, schema, prefix }) => {
|
|
4437
4420
|
const { watch, formState: { errors }, setValue, } = reactHookForm.useFormContext();
|
|
4438
|
-
const {
|
|
4421
|
+
const { serverUrl } = useSchemaContext();
|
|
4439
4422
|
if (schema.properties == undefined) {
|
|
4440
4423
|
throw new Error("schema properties undefined when using DatePicker");
|
|
4441
4424
|
}
|
|
4442
|
-
const { gridColumn, gridRow, in_table, object_id_column } = schema
|
|
4425
|
+
const { gridColumn, gridRow, in_table, object_id_column } = schema;
|
|
4443
4426
|
if (in_table === undefined) {
|
|
4444
4427
|
throw new Error("in_table is undefined when using TagPicker");
|
|
4445
4428
|
}
|
|
@@ -4465,7 +4448,7 @@ const TagPicker = ({ column }) => {
|
|
|
4465
4448
|
});
|
|
4466
4449
|
const object_id = watch(object_id_column);
|
|
4467
4450
|
const existingTagsQuery = reactQuery.useQuery({
|
|
4468
|
-
queryKey: [`existing`, in_table, object_id_column, object_id],
|
|
4451
|
+
queryKey: [`existing`, { in_table, object_id_column }, object_id],
|
|
4469
4452
|
queryFn: async () => {
|
|
4470
4453
|
return await getTableData({
|
|
4471
4454
|
serverUrl,
|
|
@@ -4518,20 +4501,11 @@ const TagPicker = ({ column }) => {
|
|
|
4518
4501
|
}), errors[`${column}`] && (jsxRuntime.jsx(react.Text, { color: "red.400", children: (errors[`${column}`]?.message ?? "No error message") }))] }));
|
|
4519
4502
|
};
|
|
4520
4503
|
|
|
4521
|
-
const
|
|
4522
|
-
|
|
4523
|
-
|
|
4524
|
-
}
|
|
4525
|
-
console.log(`${column} does not exist when using ColumnRenderer`, { properties,
|
|
4526
|
-
column,
|
|
4527
|
-
prefix, }, "fdpok");
|
|
4528
|
-
const colSchema = properties[column];
|
|
4529
|
-
if (colSchema === undefined) {
|
|
4530
|
-
throw new Error(`${column} does not exist when using ColumnRenderer`);
|
|
4531
|
-
}
|
|
4532
|
-
const { type, variant, foreign_key, properties: innerProperties } = colSchema;
|
|
4504
|
+
const SchemaRenderer = ({ schema, prefix, column, }) => {
|
|
4505
|
+
const colSchema = schema;
|
|
4506
|
+
const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
|
|
4533
4507
|
if (type === "string") {
|
|
4534
|
-
if ((
|
|
4508
|
+
if ((schema.enum ?? []).length > 0) {
|
|
4535
4509
|
return jsxRuntime.jsx(EnumPicker, { schema: colSchema, prefix, column });
|
|
4536
4510
|
}
|
|
4537
4511
|
if (variant === "id-picker") {
|
|
@@ -4566,6 +4540,9 @@ const ColumnRenderer = ({ column, properties, prefix, }) => {
|
|
|
4566
4540
|
if (variant === "file-picker") {
|
|
4567
4541
|
return jsxRuntime.jsx(FilePicker, { schema: colSchema, prefix, column });
|
|
4568
4542
|
}
|
|
4543
|
+
if (items) {
|
|
4544
|
+
return jsxRuntime.jsx(ArrayRenderer, { schema: colSchema, prefix, column });
|
|
4545
|
+
}
|
|
4569
4546
|
return jsxRuntime.jsx(react.Text, { children: `array ${column}` });
|
|
4570
4547
|
}
|
|
4571
4548
|
if (type === "null") {
|
|
@@ -4574,6 +4551,18 @@ const ColumnRenderer = ({ column, properties, prefix, }) => {
|
|
|
4574
4551
|
return jsxRuntime.jsx(react.Text, { children: "missing type" });
|
|
4575
4552
|
};
|
|
4576
4553
|
|
|
4554
|
+
const ColumnRenderer = ({ column, properties, prefix, }) => {
|
|
4555
|
+
if (properties === undefined) {
|
|
4556
|
+
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
4557
|
+
}
|
|
4558
|
+
console.log(`${column} does not exist when using ColumnRenderer`, { properties, column, prefix }, "fdpok");
|
|
4559
|
+
const colSchema = properties[column];
|
|
4560
|
+
if (colSchema === undefined) {
|
|
4561
|
+
throw new Error(`${column} does not exist when using ColumnRenderer`);
|
|
4562
|
+
}
|
|
4563
|
+
return jsxRuntime.jsx(SchemaRenderer, { schema: colSchema, prefix, column });
|
|
4564
|
+
};
|
|
4565
|
+
|
|
4577
4566
|
const idPickerSanityCheck = (column, foreign_key) => {
|
|
4578
4567
|
if (!!foreign_key == false) {
|
|
4579
4568
|
throw new Error(`The key foreign_key does not exist in properties of column ${column} when using id-picker.`);
|
|
@@ -4654,121 +4643,34 @@ const FormInternal = () => {
|
|
|
4654
4643
|
return [...order, ...not_exist];
|
|
4655
4644
|
};
|
|
4656
4645
|
const ordered = renderOrder(order, Object.keys(properties));
|
|
4657
|
-
const getDataListProps = (value) => {
|
|
4658
|
-
if (value == undefined || value.length <= 0) {
|
|
4659
|
-
return {
|
|
4660
|
-
value: `<${translate.t("empty") ?? "Empty"}>`,
|
|
4661
|
-
color: "gray.400",
|
|
4662
|
-
};
|
|
4663
|
-
}
|
|
4664
|
-
return {
|
|
4665
|
-
value: value,
|
|
4666
|
-
};
|
|
4667
|
-
};
|
|
4668
4646
|
if (isSuccess) {
|
|
4669
|
-
return (jsxRuntime.jsxs(react.Grid, { gap: 2, children: [jsxRuntime.jsx(react.Heading, { children: translate.t("title") }), jsxRuntime.jsxs(react.Alert.Root, { status: "success", children: [jsxRuntime.jsx(react.Alert.Indicator, {}), jsxRuntime.jsx(react.Alert.Title, { children: translate.t("submitSuccess") })] }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4670
|
-
|
|
4671
|
-
|
|
4672
|
-
|
|
4673
|
-
|
|
4674
|
-
|
|
4675
|
-
|
|
4676
|
-
|
|
4647
|
+
return (jsxRuntime.jsxs(react.Grid, { gap: 2, children: [jsxRuntime.jsx(react.Heading, { children: translate.t("title") }), jsxRuntime.jsxs(react.Alert.Root, { status: "success", children: [jsxRuntime.jsx(react.Alert.Indicator, {}), jsxRuntime.jsx(react.Alert.Title, { children: translate.t("submitSuccess") })] }), jsxRuntime.jsx(react.Flex, { justifyContent: "end", children: jsxRuntime.jsx(Button, { onClick: () => {
|
|
4648
|
+
setIsError(false);
|
|
4649
|
+
setIsSubmiting(false);
|
|
4650
|
+
setIsSuccess(false);
|
|
4651
|
+
setIsConfirming(false);
|
|
4652
|
+
setValidatedData(undefined);
|
|
4653
|
+
methods.reset();
|
|
4654
|
+
}, formNoValidate: true, children: translate.t("submitAgain") }) })] }));
|
|
4677
4655
|
}
|
|
4678
4656
|
if (isConfirming) {
|
|
4679
|
-
return (jsxRuntime.jsxs(react.Grid, { gap: 2, children: [jsxRuntime.jsxs(react.Heading, { children: [" ", translate.t("title")] }), jsxRuntime.jsx(
|
|
4680
|
-
|
|
4681
|
-
|
|
4682
|
-
|
|
4683
|
-
|
|
4684
|
-
const values = properties[column];
|
|
4685
|
-
const shouldIgnore = ignore.some((column) => {
|
|
4686
|
-
return column == key;
|
|
4687
|
-
});
|
|
4688
|
-
if (shouldIgnore) {
|
|
4689
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
4690
|
-
}
|
|
4691
|
-
const { type, variant, gridColumn, gridRow, foreign_key } = values;
|
|
4692
|
-
if (type === "string") {
|
|
4693
|
-
if (variant === "id-picker") {
|
|
4694
|
-
idPickerSanityCheck(column, foreign_key);
|
|
4695
|
-
return (jsxRuntime.jsx(IdViewer, { value: (validatedData ?? {})[column], column,
|
|
4696
|
-
dataListItemProps: { gridColumn, gridRow } }, `form-${key}`));
|
|
4697
|
-
}
|
|
4698
|
-
if (variant === "date-picker") {
|
|
4699
|
-
const value = (validatedData ?? {})[column];
|
|
4700
|
-
if (!!value === false) {
|
|
4701
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
|
|
4702
|
-
}
|
|
4703
|
-
const date = dayjs(value).format("YYYY-MM-DD");
|
|
4704
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(date) }, `form-${key}`));
|
|
4705
|
-
}
|
|
4706
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
|
|
4707
|
-
}
|
|
4708
|
-
if (type === "object") {
|
|
4709
|
-
const value = (validatedData ?? {})[column];
|
|
4710
|
-
if (!!value === false) {
|
|
4711
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
|
|
4712
|
-
}
|
|
4713
|
-
return (jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: 2, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsxRuntime.jsx(react.Text, { children: translate.t(`input.${column}`) }), jsxRuntime.jsx(DataListRoot, { orientation: "horizontal", padding: 4, borderColor: "gray.200", borderWidth: 1, borderRadius: 4, children: Object.entries(value).map(([key, value]) => {
|
|
4714
|
-
return (jsxRuntime.jsx(DataListItem, { label: `${key}`, ...getDataListProps(value) }, `form-${column}-${key}`));
|
|
4715
|
-
}) })] }, `form-${key}`));
|
|
4716
|
-
}
|
|
4717
|
-
if (type === "boolean") {
|
|
4718
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
|
|
4719
|
-
}
|
|
4720
|
-
if (type === "number" || type === "integer") {
|
|
4721
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
|
|
4722
|
-
}
|
|
4723
|
-
if (type === "array") {
|
|
4724
|
-
if (variant === "tag-picker") {
|
|
4725
|
-
const value = (validatedData ?? {})[column];
|
|
4726
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(value)) }, `form-${key}`));
|
|
4727
|
-
}
|
|
4728
|
-
if (variant === "file-picker") {
|
|
4729
|
-
const fileNames = ((validatedData ?? {})[column] ?? []).map((file) => {
|
|
4730
|
-
return file.name;
|
|
4731
|
-
});
|
|
4732
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(fileNames)) }, `form-${key}`));
|
|
4733
|
-
}
|
|
4734
|
-
if (variant === "id-picker") {
|
|
4735
|
-
const value = (validatedData ?? {})[column];
|
|
4736
|
-
if (schema.properties == undefined) {
|
|
4737
|
-
throw new Error("schema properties when using DatePicker");
|
|
4738
|
-
}
|
|
4739
|
-
const { foreign_key } = schema.properties[column];
|
|
4740
|
-
if (foreign_key === undefined) {
|
|
4741
|
-
throw new Error("foreign_key when variant is id-picker");
|
|
4742
|
-
}
|
|
4743
|
-
const { display_column } = foreign_key;
|
|
4744
|
-
const mapped = value.map((item) => {
|
|
4745
|
-
return idMap[item][display_column];
|
|
4746
|
-
});
|
|
4747
|
-
return (jsxRuntime.jsxs(react.Grid, { flexFlow: "column", gridColumn,
|
|
4748
|
-
gridRow, children: [jsxRuntime.jsx(react.Text, { children: translate.t(`input.${column}`) }), jsxRuntime.jsx(RecordDisplay, { object: mapped })] }, `form-${key}`));
|
|
4749
|
-
}
|
|
4750
|
-
const objectString = JSON.stringify((validatedData ?? {})[column]);
|
|
4751
|
-
return (jsxRuntime.jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(objectString) }, `form-${key}`));
|
|
4752
|
-
}
|
|
4753
|
-
if (type === "null") {
|
|
4754
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: `null ${column}` });
|
|
4755
|
-
}
|
|
4756
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: `unknown type ${column}` });
|
|
4757
|
-
}) }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4758
|
-
onFormSubmit(validatedData);
|
|
4759
|
-
}, children: translate.t("confirm") }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4760
|
-
setIsConfirming(false);
|
|
4761
|
-
}, variant: "subtle", children: translate.t("cancel") }), isSubmiting && (jsxRuntime.jsx(react.Box, { pos: "absolute", inset: "0", bg: "bg/80", children: jsxRuntime.jsx(react.Center, { h: "full", children: jsxRuntime.jsx(react.Spinner, { color: "teal.500" }) }) })), isError && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(react.Alert.Root, { status: "error", children: jsxRuntime.jsx(react.Alert.Title, { children: jsxRuntime.jsx(AccordionRoot, { collapsible: true, defaultValue: ["b"], children: jsxRuntime.jsxs(AccordionItem, { value: "b", children: [jsxRuntime.jsxs(AccordionItemTrigger, { children: [jsxRuntime.jsx(react.Alert.Indicator, {}), `${error}`] }), jsxRuntime.jsx(AccordionItemContent, { children: `${JSON.stringify(error)}` })] }) }) }) }) }))] }));
|
|
4657
|
+
return (jsxRuntime.jsxs(react.Grid, { gap: 2, children: [jsxRuntime.jsxs(react.Heading, { children: [" ", translate.t("title")] }), jsxRuntime.jsx(react.Grid, { gap: 4, gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: jsxRuntime.jsx(RecordDisplay, { object: validatedData ?? {}, boxProps: { gridColumn: "1/span12" } }) }), jsxRuntime.jsxs(react.Flex, { justifyContent: "end", gap: "2", children: [jsxRuntime.jsx(Button, { onClick: () => {
|
|
4658
|
+
setIsConfirming(false);
|
|
4659
|
+
}, variant: "subtle", children: translate.t("cancel") }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4660
|
+
onFormSubmit(validatedData);
|
|
4661
|
+
}, children: translate.t("confirm") })] }), isSubmiting && (jsxRuntime.jsx(react.Box, { pos: "absolute", inset: "0", bg: "bg/80", children: jsxRuntime.jsx(react.Center, { h: "full", children: jsxRuntime.jsx(react.Spinner, { color: "teal.500" }) }) })), isError && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(react.Alert.Root, { status: "error", children: jsxRuntime.jsx(react.Alert.Title, { children: jsxRuntime.jsx(AccordionRoot, { collapsible: true, defaultValue: ["b"], children: jsxRuntime.jsxs(AccordionItem, { value: "b", children: [jsxRuntime.jsxs(AccordionItemTrigger, { children: [jsxRuntime.jsx(react.Alert.Indicator, {}), `${error}`] }), jsxRuntime.jsx(AccordionItemContent, { children: `${JSON.stringify(error)}` })] }) }) }) }) }))] }));
|
|
4762
4662
|
}
|
|
4763
|
-
return (jsxRuntime.
|
|
4764
|
-
|
|
4663
|
+
return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(react.Grid, { gap: "2", children: [jsxRuntime.jsxs(react.Heading, { children: [" ", translate.t("title")] }), jsxRuntime.jsx(react.Grid, { gap: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: ordered.map((column) => {
|
|
4664
|
+
return (jsxRuntime.jsx(ColumnRenderer
|
|
4665
|
+
// @ts-expect-error find suitable types
|
|
4666
|
+
, {
|
|
4765
4667
|
// @ts-expect-error find suitable types
|
|
4766
|
-
, {
|
|
4767
|
-
|
|
4768
|
-
|
|
4769
|
-
|
|
4770
|
-
|
|
4771
|
-
|
|
4668
|
+
properties: properties, prefix: ``, column }, `form-${column}`));
|
|
4669
|
+
}) }), jsxRuntime.jsxs(react.Flex, { justifyContent: "end", gap: "2", children: [jsxRuntime.jsx(Button, { onClick: () => {
|
|
4670
|
+
methods.reset();
|
|
4671
|
+
}, variant: "subtle", children: translate.t("reset") }), jsxRuntime.jsx(Button, { onClick: () => {
|
|
4672
|
+
methods.handleSubmit(onValid)();
|
|
4673
|
+
}, formNoValidate: true, children: translate.t("submit") })] })] }) }));
|
|
4772
4674
|
};
|
|
4773
4675
|
const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [], ignore = [], onSubmit = undefined, rowNumber = undefined, requestOptions = {}, }) => {
|
|
4774
4676
|
const { properties } = schema;
|
|
@@ -4790,7 +4692,9 @@ const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [],
|
|
|
4790
4692
|
};
|
|
4791
4693
|
|
|
4792
4694
|
const useForm = ({ preLoadedValues, keyPrefix }) => {
|
|
4793
|
-
const form = reactHookForm.useForm({
|
|
4695
|
+
const form = reactHookForm.useForm({
|
|
4696
|
+
values: preLoadedValues,
|
|
4697
|
+
});
|
|
4794
4698
|
const [idMap, setIdMap] = React.useState({});
|
|
4795
4699
|
const translate = reactI18next.useTranslation("", { keyPrefix });
|
|
4796
4700
|
return {
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Flex, Text, Tag as Tag$1, Input, useDisclosure, DialogBackdrop, CheckboxCard as CheckboxCard$1, Menu, createRecipeContext, createContext as createContext$1, Pagination as Pagination$1, usePaginationContext, Image, Card, DataList, Checkbox as Checkbox$1, Table as Table$1, Tooltip as Tooltip$1, Group, InputElement, Icon, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, EmptyState as EmptyState$2, VStack, List, Alert,
|
|
2
|
+
import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Flex, Text, Tag as Tag$1, Input, useDisclosure, DialogBackdrop, CheckboxCard as CheckboxCard$1, Menu, createRecipeContext, createContext as createContext$1, Pagination as Pagination$1, usePaginationContext, Image, Card, DataList, Checkbox as Checkbox$1, Table as Table$1, Tooltip as Tooltip$1, Group, InputElement, Icon, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, EmptyState as EmptyState$2, VStack, List, Alert, Accordion, Field as Field$1, Popover, NumberInput, Show, RadioCard, CheckboxGroup, Heading, Center } from '@chakra-ui/react';
|
|
3
3
|
import { AiOutlineColumnWidth } from 'react-icons/ai';
|
|
4
4
|
import * as React from 'react';
|
|
5
5
|
import React__default, { createContext, useContext, useState, useEffect, useRef } from 'react';
|
|
@@ -24,11 +24,11 @@ import { useDebounce } from '@uidotdev/usehooks';
|
|
|
24
24
|
import { useQueryClient, useQuery } from '@tanstack/react-query';
|
|
25
25
|
import { IoReload } from 'react-icons/io5';
|
|
26
26
|
import { GrAscend, GrDescend } from 'react-icons/gr';
|
|
27
|
-
import { HiColorSwatch
|
|
27
|
+
import { HiColorSwatch } from 'react-icons/hi';
|
|
28
28
|
import { useTranslation } from 'react-i18next';
|
|
29
29
|
import axios from 'axios';
|
|
30
|
+
import { useFormContext, useFieldArray, FormProvider, useForm as useForm$1 } from 'react-hook-form';
|
|
30
31
|
import dayjs from 'dayjs';
|
|
31
|
-
import { useFormContext, FormProvider, useForm as useForm$1 } from 'react-hook-form';
|
|
32
32
|
import { TiDeleteOutline } from 'react-icons/ti';
|
|
33
33
|
|
|
34
34
|
const DataTableContext = createContext({
|
|
@@ -3547,16 +3547,6 @@ const SchemaFormContext = createContext({
|
|
|
3547
3547
|
requestOptions: {},
|
|
3548
3548
|
});
|
|
3549
3549
|
|
|
3550
|
-
const HoverCardContent = React.forwardRef(function HoverCardContent(props, ref) {
|
|
3551
|
-
const { portalled = true, portalRef, ...rest } = props;
|
|
3552
|
-
return (jsx(Portal, { disabled: !portalled, container: portalRef, children: jsx(HoverCard.Positioner, { children: jsx(HoverCard.Content, { ref: ref, ...rest }) }) }));
|
|
3553
|
-
});
|
|
3554
|
-
const HoverCardArrow = React.forwardRef(function HoverCardArrow(props, ref) {
|
|
3555
|
-
return (jsx(HoverCard.Arrow, { ref: ref, ...props, children: jsx(HoverCard.ArrowTip, {}) }));
|
|
3556
|
-
});
|
|
3557
|
-
const HoverCardRoot = HoverCard.Root;
|
|
3558
|
-
const HoverCardTrigger = HoverCard.Trigger;
|
|
3559
|
-
|
|
3560
3550
|
const useSchemaContext = () => {
|
|
3561
3551
|
const { schema, serverUrl, requestUrl, order, ignore, onSubmit, rowNumber, idMap, setIdMap, translate, requestOptions, } = useContext(SchemaFormContext);
|
|
3562
3552
|
return {
|
|
@@ -3574,22 +3564,6 @@ const useSchemaContext = () => {
|
|
|
3574
3564
|
};
|
|
3575
3565
|
};
|
|
3576
3566
|
|
|
3577
|
-
const IdViewer = ({ value, column }) => {
|
|
3578
|
-
const { schema, idMap, translate } = useSchemaContext();
|
|
3579
|
-
if (schema.properties == undefined) {
|
|
3580
|
-
throw new Error("schema properties when using DatePicker");
|
|
3581
|
-
}
|
|
3582
|
-
const { foreign_key } = schema.properties[column];
|
|
3583
|
-
if (foreign_key === undefined) {
|
|
3584
|
-
throw new Error("foreign_key when variant is id-picker");
|
|
3585
|
-
}
|
|
3586
|
-
const { display_column } = foreign_key;
|
|
3587
|
-
if (value === undefined) {
|
|
3588
|
-
return (jsxs(Flex, { flexFlow: "column", children: [jsx(Text, { children: translate.t(`${column}.fieldLabel`) }), jsx(Text, { children: translate.t(`empty`) })] }));
|
|
3589
|
-
}
|
|
3590
|
-
return (jsxs(Flex, { flexFlow: "column", children: [jsx(Text, { children: translate.t(`${column}.fieldLabel`) }), jsxs(HoverCardRoot, { children: [jsx(HoverCardTrigger, { asChild: true, children: jsx(Text, { cursor: 'pointer', children: idMap[value][display_column] }) }), jsxs(HoverCardContent, { children: [jsx(HoverCardArrow, {}), jsx(RecordDisplay, { object: idMap[value] })] })] })] }));
|
|
3591
|
-
};
|
|
3592
|
-
|
|
3593
3567
|
const clearEmptyString = (object) => {
|
|
3594
3568
|
return Object.fromEntries(Object.entries(object).filter(([, value]) => value !== ""));
|
|
3595
3569
|
};
|
|
@@ -3604,20 +3578,24 @@ const AccordionItemContent = React.forwardRef(function AccordionItemContent(prop
|
|
|
3604
3578
|
const AccordionRoot = Accordion.Root;
|
|
3605
3579
|
const AccordionItem = Accordion.Item;
|
|
3606
3580
|
|
|
3607
|
-
const
|
|
3608
|
-
const {
|
|
3609
|
-
|
|
3610
|
-
}
|
|
3611
|
-
const
|
|
3612
|
-
const {
|
|
3613
|
-
|
|
3614
|
-
|
|
3615
|
-
|
|
3616
|
-
|
|
3617
|
-
|
|
3618
|
-
|
|
3619
|
-
|
|
3620
|
-
|
|
3581
|
+
const ArrayRenderer = ({ schema, column, prefix, }) => {
|
|
3582
|
+
const { gridRow, gridColumn = "1/span 12", required, items } = schema;
|
|
3583
|
+
const { translate } = useSchemaContext();
|
|
3584
|
+
const colLabel = `${prefix}${column}`;
|
|
3585
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
3586
|
+
const { formState: { errors }, control, } = useFormContext();
|
|
3587
|
+
const { fields, append, prepend, remove, swap, move, insert } = useFieldArray({
|
|
3588
|
+
control, // control props comes from useForm (optional: if you are using FormContext)
|
|
3589
|
+
name: "test", // unique name for your Field Array
|
|
3590
|
+
});
|
|
3591
|
+
return (jsxs(Box, { gridRow, gridColumn, children: [jsxs(Box, { as: "label", gridColumn: "1/span12", children: [`${translate.t(`${colLabel}.fieldLabel`)}`, isRequired && jsx("span", { children: "*" })] }), fields.map((field, index) => (jsxs(Flex, { flexFlow: "column", children: [jsx(Grid, { gap: "4", padding: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat("auto-fit", auto)`, children: jsx(SchemaRenderer, { column: `${column}.${index}`,
|
|
3592
|
+
prefix: `${prefix}`,
|
|
3593
|
+
schema: items }, `form-${column}`) }), jsx(Flex, { justifyContent: "end", children: jsx(Button$1, { variant: "ghost", onClick: () => {
|
|
3594
|
+
remove(index);
|
|
3595
|
+
}, children: translate.t(`${colLabel}.remove`) }) })] }))), jsx(Flex, { children: jsx(Button$1, { onClick: () => {
|
|
3596
|
+
append({});
|
|
3597
|
+
}, children: translate.t(`${colLabel}.add`) }) }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }));
|
|
3598
|
+
};
|
|
3621
3599
|
|
|
3622
3600
|
const Field = React.forwardRef(function Field(props, ref) {
|
|
3623
3601
|
const { label, children, helperText, errorText, optionalText, ...rest } = props;
|
|
@@ -4330,16 +4308,21 @@ const NumberInputField = ({ schema, column, prefix, }) => {
|
|
|
4330
4308
|
};
|
|
4331
4309
|
|
|
4332
4310
|
const ObjectInput = ({ schema, column, prefix }) => {
|
|
4333
|
-
const { properties } = schema;
|
|
4311
|
+
const { properties, gridRow, gridColumn = "1/span 12", required } = schema;
|
|
4312
|
+
const { translate } = useSchemaContext();
|
|
4313
|
+
const colLabel = `${prefix}${column}`;
|
|
4314
|
+
const isRequired = required?.some((columnId) => columnId === column);
|
|
4315
|
+
const { watch, formState: { errors }, setValue, control, } = useFormContext();
|
|
4334
4316
|
if (properties === undefined) {
|
|
4335
4317
|
throw new Error(`properties is undefined when using ObjectInput`);
|
|
4336
4318
|
}
|
|
4337
|
-
return (jsx(
|
|
4338
|
-
|
|
4339
|
-
|
|
4340
|
-
|
|
4341
|
-
|
|
4342
|
-
|
|
4319
|
+
return (jsxs(Box, { gridRow, gridColumn, children: [jsxs(Box, { as: "label", gridColumn: "1/span12", children: [`${translate.t(`${colLabel}.fieldLabel`)}`, isRequired && jsx("span", { children: "*" })] }), jsx(Grid, { gap: "4", padding: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat("auto-fit", auto)`, children: Object.keys(properties ?? {}).map((key) => {
|
|
4320
|
+
return (
|
|
4321
|
+
// @ts-expect-error find suitable types
|
|
4322
|
+
jsx(ColumnRenderer, { column: `${key}`,
|
|
4323
|
+
prefix: `${prefix}${column}.`,
|
|
4324
|
+
properties }, `form-${column}`));
|
|
4325
|
+
}) }), errors[`${column}`] && (jsx(Text, { color: "red.400", children: translate.t(`${colLabel}.fieldRequired`) }))] }));
|
|
4343
4326
|
};
|
|
4344
4327
|
|
|
4345
4328
|
const RecordInput = ({ column, schema, prefix }) => {
|
|
@@ -4413,13 +4396,13 @@ const RadioCardRoot = RadioCard.Root;
|
|
|
4413
4396
|
RadioCard.Label;
|
|
4414
4397
|
RadioCard.ItemIndicator;
|
|
4415
4398
|
|
|
4416
|
-
const TagPicker = ({ column }) => {
|
|
4399
|
+
const TagPicker = ({ column, schema, prefix }) => {
|
|
4417
4400
|
const { watch, formState: { errors }, setValue, } = useFormContext();
|
|
4418
|
-
const {
|
|
4401
|
+
const { serverUrl } = useSchemaContext();
|
|
4419
4402
|
if (schema.properties == undefined) {
|
|
4420
4403
|
throw new Error("schema properties undefined when using DatePicker");
|
|
4421
4404
|
}
|
|
4422
|
-
const { gridColumn, gridRow, in_table, object_id_column } = schema
|
|
4405
|
+
const { gridColumn, gridRow, in_table, object_id_column } = schema;
|
|
4423
4406
|
if (in_table === undefined) {
|
|
4424
4407
|
throw new Error("in_table is undefined when using TagPicker");
|
|
4425
4408
|
}
|
|
@@ -4445,7 +4428,7 @@ const TagPicker = ({ column }) => {
|
|
|
4445
4428
|
});
|
|
4446
4429
|
const object_id = watch(object_id_column);
|
|
4447
4430
|
const existingTagsQuery = useQuery({
|
|
4448
|
-
queryKey: [`existing`, in_table, object_id_column, object_id],
|
|
4431
|
+
queryKey: [`existing`, { in_table, object_id_column }, object_id],
|
|
4449
4432
|
queryFn: async () => {
|
|
4450
4433
|
return await getTableData({
|
|
4451
4434
|
serverUrl,
|
|
@@ -4498,20 +4481,11 @@ const TagPicker = ({ column }) => {
|
|
|
4498
4481
|
}), errors[`${column}`] && (jsx(Text, { color: "red.400", children: (errors[`${column}`]?.message ?? "No error message") }))] }));
|
|
4499
4482
|
};
|
|
4500
4483
|
|
|
4501
|
-
const
|
|
4502
|
-
|
|
4503
|
-
|
|
4504
|
-
}
|
|
4505
|
-
console.log(`${column} does not exist when using ColumnRenderer`, { properties,
|
|
4506
|
-
column,
|
|
4507
|
-
prefix, }, "fdpok");
|
|
4508
|
-
const colSchema = properties[column];
|
|
4509
|
-
if (colSchema === undefined) {
|
|
4510
|
-
throw new Error(`${column} does not exist when using ColumnRenderer`);
|
|
4511
|
-
}
|
|
4512
|
-
const { type, variant, foreign_key, properties: innerProperties } = colSchema;
|
|
4484
|
+
const SchemaRenderer = ({ schema, prefix, column, }) => {
|
|
4485
|
+
const colSchema = schema;
|
|
4486
|
+
const { type, variant, properties: innerProperties, foreign_key, items, } = schema;
|
|
4513
4487
|
if (type === "string") {
|
|
4514
|
-
if ((
|
|
4488
|
+
if ((schema.enum ?? []).length > 0) {
|
|
4515
4489
|
return jsx(EnumPicker, { schema: colSchema, prefix, column });
|
|
4516
4490
|
}
|
|
4517
4491
|
if (variant === "id-picker") {
|
|
@@ -4546,6 +4520,9 @@ const ColumnRenderer = ({ column, properties, prefix, }) => {
|
|
|
4546
4520
|
if (variant === "file-picker") {
|
|
4547
4521
|
return jsx(FilePicker, { schema: colSchema, prefix, column });
|
|
4548
4522
|
}
|
|
4523
|
+
if (items) {
|
|
4524
|
+
return jsx(ArrayRenderer, { schema: colSchema, prefix, column });
|
|
4525
|
+
}
|
|
4549
4526
|
return jsx(Text, { children: `array ${column}` });
|
|
4550
4527
|
}
|
|
4551
4528
|
if (type === "null") {
|
|
@@ -4554,6 +4531,18 @@ const ColumnRenderer = ({ column, properties, prefix, }) => {
|
|
|
4554
4531
|
return jsx(Text, { children: "missing type" });
|
|
4555
4532
|
};
|
|
4556
4533
|
|
|
4534
|
+
const ColumnRenderer = ({ column, properties, prefix, }) => {
|
|
4535
|
+
if (properties === undefined) {
|
|
4536
|
+
return jsx(Fragment, {});
|
|
4537
|
+
}
|
|
4538
|
+
console.log(`${column} does not exist when using ColumnRenderer`, { properties, column, prefix }, "fdpok");
|
|
4539
|
+
const colSchema = properties[column];
|
|
4540
|
+
if (colSchema === undefined) {
|
|
4541
|
+
throw new Error(`${column} does not exist when using ColumnRenderer`);
|
|
4542
|
+
}
|
|
4543
|
+
return jsx(SchemaRenderer, { schema: colSchema, prefix, column });
|
|
4544
|
+
};
|
|
4545
|
+
|
|
4557
4546
|
const idPickerSanityCheck = (column, foreign_key) => {
|
|
4558
4547
|
if (!!foreign_key == false) {
|
|
4559
4548
|
throw new Error(`The key foreign_key does not exist in properties of column ${column} when using id-picker.`);
|
|
@@ -4634,121 +4623,34 @@ const FormInternal = () => {
|
|
|
4634
4623
|
return [...order, ...not_exist];
|
|
4635
4624
|
};
|
|
4636
4625
|
const ordered = renderOrder(order, Object.keys(properties));
|
|
4637
|
-
const getDataListProps = (value) => {
|
|
4638
|
-
if (value == undefined || value.length <= 0) {
|
|
4639
|
-
return {
|
|
4640
|
-
value: `<${translate.t("empty") ?? "Empty"}>`,
|
|
4641
|
-
color: "gray.400",
|
|
4642
|
-
};
|
|
4643
|
-
}
|
|
4644
|
-
return {
|
|
4645
|
-
value: value,
|
|
4646
|
-
};
|
|
4647
|
-
};
|
|
4648
4626
|
if (isSuccess) {
|
|
4649
|
-
return (jsxs(Grid, { gap: 2, children: [jsx(Heading, { children: translate.t("title") }), jsxs(Alert.Root, { status: "success", children: [jsx(Alert.Indicator, {}), jsx(Alert.Title, { children: translate.t("submitSuccess") })] }), jsx(Button, { onClick: () => {
|
|
4650
|
-
|
|
4651
|
-
|
|
4652
|
-
|
|
4653
|
-
|
|
4654
|
-
|
|
4655
|
-
|
|
4656
|
-
|
|
4627
|
+
return (jsxs(Grid, { gap: 2, children: [jsx(Heading, { children: translate.t("title") }), jsxs(Alert.Root, { status: "success", children: [jsx(Alert.Indicator, {}), jsx(Alert.Title, { children: translate.t("submitSuccess") })] }), jsx(Flex, { justifyContent: "end", children: jsx(Button, { onClick: () => {
|
|
4628
|
+
setIsError(false);
|
|
4629
|
+
setIsSubmiting(false);
|
|
4630
|
+
setIsSuccess(false);
|
|
4631
|
+
setIsConfirming(false);
|
|
4632
|
+
setValidatedData(undefined);
|
|
4633
|
+
methods.reset();
|
|
4634
|
+
}, formNoValidate: true, children: translate.t("submitAgain") }) })] }));
|
|
4657
4635
|
}
|
|
4658
4636
|
if (isConfirming) {
|
|
4659
|
-
return (jsxs(Grid, { gap: 2, children: [jsxs(Heading, { children: [" ", translate.t("title")] }), jsx(
|
|
4660
|
-
|
|
4661
|
-
|
|
4662
|
-
|
|
4663
|
-
|
|
4664
|
-
const values = properties[column];
|
|
4665
|
-
const shouldIgnore = ignore.some((column) => {
|
|
4666
|
-
return column == key;
|
|
4667
|
-
});
|
|
4668
|
-
if (shouldIgnore) {
|
|
4669
|
-
return jsx(Fragment, {});
|
|
4670
|
-
}
|
|
4671
|
-
const { type, variant, gridColumn, gridRow, foreign_key } = values;
|
|
4672
|
-
if (type === "string") {
|
|
4673
|
-
if (variant === "id-picker") {
|
|
4674
|
-
idPickerSanityCheck(column, foreign_key);
|
|
4675
|
-
return (jsx(IdViewer, { value: (validatedData ?? {})[column], column,
|
|
4676
|
-
dataListItemProps: { gridColumn, gridRow } }, `form-${key}`));
|
|
4677
|
-
}
|
|
4678
|
-
if (variant === "date-picker") {
|
|
4679
|
-
const value = (validatedData ?? {})[column];
|
|
4680
|
-
if (!!value === false) {
|
|
4681
|
-
return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
|
|
4682
|
-
}
|
|
4683
|
-
const date = dayjs(value).format("YYYY-MM-DD");
|
|
4684
|
-
return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(date) }, `form-${key}`));
|
|
4685
|
-
}
|
|
4686
|
-
return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
|
|
4687
|
-
}
|
|
4688
|
-
if (type === "object") {
|
|
4689
|
-
const value = (validatedData ?? {})[column];
|
|
4690
|
-
if (!!value === false) {
|
|
4691
|
-
return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(undefined) }, `form-${key}`));
|
|
4692
|
-
}
|
|
4693
|
-
return (jsxs(Flex, { flexFlow: "column", gap: 2, gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", children: [jsx(Text, { children: translate.t(`input.${column}`) }), jsx(DataListRoot, { orientation: "horizontal", padding: 4, borderColor: "gray.200", borderWidth: 1, borderRadius: 4, children: Object.entries(value).map(([key, value]) => {
|
|
4694
|
-
return (jsx(DataListItem, { label: `${key}`, ...getDataListProps(value) }, `form-${column}-${key}`));
|
|
4695
|
-
}) })] }, `form-${key}`));
|
|
4696
|
-
}
|
|
4697
|
-
if (type === "boolean") {
|
|
4698
|
-
return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
|
|
4699
|
-
}
|
|
4700
|
-
if (type === "number" || type === "integer") {
|
|
4701
|
-
return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps((validatedData ?? {})[column]) }, `form-${key}`));
|
|
4702
|
-
}
|
|
4703
|
-
if (type === "array") {
|
|
4704
|
-
if (variant === "tag-picker") {
|
|
4705
|
-
const value = (validatedData ?? {})[column];
|
|
4706
|
-
return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 1", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(value)) }, `form-${key}`));
|
|
4707
|
-
}
|
|
4708
|
-
if (variant === "file-picker") {
|
|
4709
|
-
const fileNames = ((validatedData ?? {})[column] ?? []).map((file) => {
|
|
4710
|
-
return file.name;
|
|
4711
|
-
});
|
|
4712
|
-
return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(JSON.stringify(fileNames)) }, `form-${key}`));
|
|
4713
|
-
}
|
|
4714
|
-
if (variant === "id-picker") {
|
|
4715
|
-
const value = (validatedData ?? {})[column];
|
|
4716
|
-
if (schema.properties == undefined) {
|
|
4717
|
-
throw new Error("schema properties when using DatePicker");
|
|
4718
|
-
}
|
|
4719
|
-
const { foreign_key } = schema.properties[column];
|
|
4720
|
-
if (foreign_key === undefined) {
|
|
4721
|
-
throw new Error("foreign_key when variant is id-picker");
|
|
4722
|
-
}
|
|
4723
|
-
const { display_column } = foreign_key;
|
|
4724
|
-
const mapped = value.map((item) => {
|
|
4725
|
-
return idMap[item][display_column];
|
|
4726
|
-
});
|
|
4727
|
-
return (jsxs(Grid, { flexFlow: "column", gridColumn,
|
|
4728
|
-
gridRow, children: [jsx(Text, { children: translate.t(`input.${column}`) }), jsx(RecordDisplay, { object: mapped })] }, `form-${key}`));
|
|
4729
|
-
}
|
|
4730
|
-
const objectString = JSON.stringify((validatedData ?? {})[column]);
|
|
4731
|
-
return (jsx(DataListItem, { gridColumn: gridColumn ?? "span 4", gridRow: gridRow ?? "span 4", label: `${translate.t(`${column}.fieldLabel`)}`, ...getDataListProps(objectString) }, `form-${key}`));
|
|
4732
|
-
}
|
|
4733
|
-
if (type === "null") {
|
|
4734
|
-
return jsx(Fragment, { children: `null ${column}` });
|
|
4735
|
-
}
|
|
4736
|
-
return jsx(Fragment, { children: `unknown type ${column}` });
|
|
4737
|
-
}) }), jsx(Button, { onClick: () => {
|
|
4738
|
-
onFormSubmit(validatedData);
|
|
4739
|
-
}, children: translate.t("confirm") }), jsx(Button, { onClick: () => {
|
|
4740
|
-
setIsConfirming(false);
|
|
4741
|
-
}, variant: "subtle", children: translate.t("cancel") }), isSubmiting && (jsx(Box, { pos: "absolute", inset: "0", bg: "bg/80", children: jsx(Center, { h: "full", children: jsx(Spinner, { color: "teal.500" }) }) })), isError && (jsx(Fragment, { children: jsx(Alert.Root, { status: "error", children: jsx(Alert.Title, { children: jsx(AccordionRoot, { collapsible: true, defaultValue: ["b"], children: jsxs(AccordionItem, { value: "b", children: [jsxs(AccordionItemTrigger, { children: [jsx(Alert.Indicator, {}), `${error}`] }), jsx(AccordionItemContent, { children: `${JSON.stringify(error)}` })] }) }) }) }) }))] }));
|
|
4637
|
+
return (jsxs(Grid, { gap: 2, children: [jsxs(Heading, { children: [" ", translate.t("title")] }), jsx(Grid, { gap: 4, gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: jsx(RecordDisplay, { object: validatedData ?? {}, boxProps: { gridColumn: "1/span12" } }) }), jsxs(Flex, { justifyContent: "end", gap: "2", children: [jsx(Button, { onClick: () => {
|
|
4638
|
+
setIsConfirming(false);
|
|
4639
|
+
}, variant: "subtle", children: translate.t("cancel") }), jsx(Button, { onClick: () => {
|
|
4640
|
+
onFormSubmit(validatedData);
|
|
4641
|
+
}, children: translate.t("confirm") })] }), isSubmiting && (jsx(Box, { pos: "absolute", inset: "0", bg: "bg/80", children: jsx(Center, { h: "full", children: jsx(Spinner, { color: "teal.500" }) }) })), isError && (jsx(Fragment, { children: jsx(Alert.Root, { status: "error", children: jsx(Alert.Title, { children: jsx(AccordionRoot, { collapsible: true, defaultValue: ["b"], children: jsxs(AccordionItem, { value: "b", children: [jsxs(AccordionItemTrigger, { children: [jsx(Alert.Indicator, {}), `${error}`] }), jsx(AccordionItemContent, { children: `${JSON.stringify(error)}` })] }) }) }) }) }))] }));
|
|
4742
4642
|
}
|
|
4743
|
-
return (
|
|
4744
|
-
|
|
4643
|
+
return (jsx(Fragment, { children: jsxs(Grid, { gap: "2", children: [jsxs(Heading, { children: [" ", translate.t("title")] }), jsx(Grid, { gap: "4", gridTemplateColumns: "repeat(12, 1fr)", gridTemplateRows: `repeat(${rowNumber ?? "auto-fit"}, auto)`, children: ordered.map((column) => {
|
|
4644
|
+
return (jsx(ColumnRenderer
|
|
4645
|
+
// @ts-expect-error find suitable types
|
|
4646
|
+
, {
|
|
4745
4647
|
// @ts-expect-error find suitable types
|
|
4746
|
-
, {
|
|
4747
|
-
|
|
4748
|
-
|
|
4749
|
-
|
|
4750
|
-
|
|
4751
|
-
|
|
4648
|
+
properties: properties, prefix: ``, column }, `form-${column}`));
|
|
4649
|
+
}) }), jsxs(Flex, { justifyContent: "end", gap: "2", children: [jsx(Button, { onClick: () => {
|
|
4650
|
+
methods.reset();
|
|
4651
|
+
}, variant: "subtle", children: translate.t("reset") }), jsx(Button, { onClick: () => {
|
|
4652
|
+
methods.handleSubmit(onValid)();
|
|
4653
|
+
}, formNoValidate: true, children: translate.t("submit") })] })] }) }));
|
|
4752
4654
|
};
|
|
4753
4655
|
const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [], ignore = [], onSubmit = undefined, rowNumber = undefined, requestOptions = {}, }) => {
|
|
4754
4656
|
const { properties } = schema;
|
|
@@ -4770,7 +4672,9 @@ const Form = ({ schema, idMap, setIdMap, form, serverUrl, translate, order = [],
|
|
|
4770
4672
|
};
|
|
4771
4673
|
|
|
4772
4674
|
const useForm = ({ preLoadedValues, keyPrefix }) => {
|
|
4773
|
-
const form = useForm$1({
|
|
4675
|
+
const form = useForm$1({
|
|
4676
|
+
values: preLoadedValues,
|
|
4677
|
+
});
|
|
4774
4678
|
const [idMap, setIdMap] = useState({});
|
|
4775
4679
|
const translate = useTranslation("", { keyPrefix });
|
|
4776
4680
|
return {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CustomJSONSchema7 } from "./StringInputField";
|
|
2
|
+
export interface ArrayRendererProps {
|
|
3
|
+
column: string;
|
|
4
|
+
schema: CustomJSONSchema7;
|
|
5
|
+
prefix: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const ArrayRenderer: ({ schema, column, prefix, }: ArrayRendererProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CustomJSONSchema7 } from "./StringInputField";
|
|
2
|
+
export interface SchemaRendererProps {
|
|
3
|
+
column: string;
|
|
4
|
+
schema: CustomJSONSchema7;
|
|
5
|
+
prefix: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const SchemaRenderer: ({ schema, prefix, column, }: SchemaRendererProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { CustomJSONSchema7 } from "./StringInputField";
|
|
1
2
|
export interface TagPickerProps {
|
|
2
3
|
column: string;
|
|
4
|
+
schema: CustomJSONSchema7;
|
|
5
|
+
prefix: string;
|
|
3
6
|
}
|
|
4
7
|
export interface Tag {
|
|
5
8
|
id: string;
|
|
@@ -24,4 +27,4 @@ export interface TagData {
|
|
|
24
27
|
export interface TagResponse {
|
|
25
28
|
data: TagData[];
|
|
26
29
|
}
|
|
27
|
-
export declare const TagPicker: ({ column }: TagPickerProps) => import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
export declare const TagPicker: ({ column, schema, prefix }: TagPickerProps) => import("react/jsx-runtime").JSX.Element;
|