@acvl/frontend-components 0.0.27 → 0.0.28

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.
@@ -13,6 +13,6 @@ export interface JSONFormProps {
13
13
  useLabel?: boolean;
14
14
  props?: JSONParserProps;
15
15
  }
16
- export declare const jsonForm: ({ submitData, data, useLabel, props }: JSONFormProps) => any;
17
- export declare const formDataForm: ({ submitData, data, useLabel, props }: JSONFormProps) => FormData;
16
+ export declare const jsonForm: ({ submitData, data, useLabel, props, }: JSONFormProps) => any;
17
+ export declare const formDataForm: ({ submitData, data, useLabel, props, }: JSONFormProps) => FormData;
18
18
  export declare const setErrors: (form: any, error: any) => void;
@@ -1,10 +1,9 @@
1
1
  import { DataGridProps } from "@mui/x-data-grid";
2
2
  import { GridProps } from "@mui/material";
3
- import { FieldProps } from "../Field";
4
3
  import { PageType } from "../../../../types";
4
+ import { JSONParserProps } from "../../../../forms";
5
5
  declare module "@mui/x-data-grid" {
6
6
  interface ToolbarPropsOverrides {
7
- selected: number;
8
7
  handleCreate: () => void;
9
8
  handleDelete: () => void;
10
9
  pageType: PageType;
@@ -13,11 +12,14 @@ declare module "@mui/x-data-grid" {
13
12
  export interface ArrayFieldProps {
14
13
  name: string;
15
14
  label: string;
15
+ defaultValues: {
16
+ [key: string]: any;
17
+ };
16
18
  form?: any;
17
- fields: FieldProps[];
18
19
  dataGridProps: DataGridProps;
19
20
  gridProps?: GridProps;
20
21
  pageType?: PageType;
22
+ parser?: JSONParserProps;
21
23
  }
22
24
  declare const FieldArrayField: (props: ArrayFieldProps) => import("react/jsx-runtime").JSX.Element;
23
25
  export default FieldArrayField;
package/dist/esm/index.js CHANGED
@@ -74,7 +74,7 @@ import AddIcon from '@mui/icons-material/Add';
74
74
  import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';
75
75
  import LinearProgress$1 from '@mui/material/LinearProgress';
76
76
  import AttachFileIcon from '@mui/icons-material/AttachFile';
77
- import { useGridApiContext, ToolbarButton, QuickFilter, QuickFilterTrigger, QuickFilterControl, QuickFilterClear, ColumnsPanelTrigger, Toolbar, useGridSelector, gridPaginationSelector, GridRow, GridRowEditStartReasons, GridRowModes, GridActionsCellItem, useGridApiRef, DataGrid, GridRowEditStopReasons, GridEditSingleSelectCell, GridEditInputCell, GridEditBooleanCell } from '@mui/x-data-grid';
77
+ import { useGridApiContext, ToolbarButton, QuickFilter, QuickFilterTrigger, QuickFilterControl, QuickFilterClear, ColumnsPanelTrigger, Toolbar, useGridSelector, gridPaginationSelector, GridRow, GridRowEditStartReasons, GridRowModes, GridActionsCellItem, useGridApiRef, DataGrid, GridRowEditStopReasons, GridEditSingleSelectCell, GridEditInputCell, GridEditBooleanCell, GridActionsCell } from '@mui/x-data-grid';
78
78
  import Tooltip$1 from '@mui/material/Tooltip';
79
79
  import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
80
80
  import ExpandLessIcon from '@mui/icons-material/ExpandLess';
@@ -25742,8 +25742,7 @@ const typeSwitch = ({ base_object, base_key, response, submitData, useLabel, dat
25742
25742
  }
25743
25743
  else {
25744
25744
  forEach(object, (value, key2) => {
25745
- if (!includes(["id", "transporte.tarifa.cargos_adicionales"], key) &&
25746
- isEqual(get$1(data, `${key}.${key2}`), value))
25745
+ if (key2 !== "id" && isEqual(get$1(data, `${key}.${key2}`), value))
25747
25746
  return;
25748
25747
  typeSwitch({
25749
25748
  base_object: value,
@@ -25763,7 +25762,7 @@ const typeSwitch = ({ base_object, base_key, response, submitData, useLabel, dat
25763
25762
  break;
25764
25763
  }
25765
25764
  };
25766
- const jsonForm = ({ submitData, data, useLabel, props }) => {
25765
+ const jsonForm = ({ submitData, data, useLabel, props, }) => {
25767
25766
  const response = {};
25768
25767
  forEach(submitData, function (value, key) {
25769
25768
  if (key != "id" && isEqual(get$1(data, key), value))
@@ -25781,7 +25780,7 @@ const jsonForm = ({ submitData, data, useLabel, props }) => {
25781
25780
  });
25782
25781
  return response;
25783
25782
  };
25784
- const formDataForm = ({ submitData, data, useLabel, props }) => {
25783
+ const formDataForm = ({ submitData, data, useLabel, props, }) => {
25785
25784
  const formData = new FormData();
25786
25785
  forEach(submitData, function (value, key) {
25787
25786
  if (key != "id" && isEqual(get$1(data, key), value))
@@ -27468,7 +27467,7 @@ const editColumn = (props) => {
27468
27467
  width: 80,
27469
27468
  cellClassName: "actions",
27470
27469
  getActions: ({ id, row }) => {
27471
- const canEdit = get$1(row, "obj_permissions.edit");
27470
+ const canEdit = get$1(row, "obj_permissions.edit", true);
27472
27471
  const isInEditMode = props.rowModesModel[id]?.mode === GridRowModes.Edit;
27473
27472
  if (isInEditMode) {
27474
27473
  return [
@@ -28086,60 +28085,81 @@ const Field = (props) => {
28086
28085
  };
28087
28086
 
28088
28087
  const EditToolbar = (props) => {
28089
- return (jsxs(Toolbar, { children: [props.pageType != "detail" && (jsx(Tooltip$1, { title: "Crear", children: jsx(ToolbarButton, { onClick: props.handleCreate, children: jsx(AddIcon, { fontSize: "small" }) }) })), !!props.selected && (jsx(Tooltip$1, { title: "Borrar", children: jsx(ToolbarButton, { onClick: props.handleDelete, children: jsx(DeleteIcon, { fontSize: "small" }) }) }))] }));
28088
+ return (jsx(Toolbar, { children: props.pageType != "detail" && (jsx(Tooltip$1, { title: "Crear", children: jsx(ToolbarButton, { onClick: props.handleCreate, children: jsx(AddIcon, { fontSize: "small" }) }) })) }));
28090
28089
  };
28091
28090
  const FieldArrayField = (props) => {
28092
- const { fields, remove } = useFieldArray({
28091
+ const detail = useMemo(() => props.pageType === "detail", [props.pageType]);
28092
+ const { fields, append, update, remove } = useFieldArray({
28093
28093
  control: props.form.control,
28094
28094
  name: props.name,
28095
28095
  keyName: "_id",
28096
28096
  });
28097
- const [drawer, setDrawer] = useState({
28098
- open: false,
28099
- data: undefined,
28100
- });
28101
- const [rowSelectionModel, setRowSelectionModel] = useState({
28102
- type: "include",
28103
- ids: new Set(),
28104
- });
28097
+ const [rowModesModel, setRowModesModel] = useState({});
28105
28098
  const getIndex = useCallback((id) => findIndex(fields, function (field) {
28106
28099
  return field._id == id;
28107
28100
  }), [fields]);
28108
28101
  const handleCreate = () => {
28109
- setDrawer({ open: true, data: undefined });
28102
+ append(props.defaultValues);
28110
28103
  };
28111
- const handleDelete = () => {
28112
- remove(Array.from(rowSelectionModel.ids).map((id) => getIndex(id)));
28104
+ const handleDelete = (id) => {
28105
+ remove(getIndex(id));
28113
28106
  };
28114
- const closeDrawer = () => {
28115
- setDrawer({ open: false, data: undefined });
28116
- };
28117
- // const handleSave = () => {
28118
- // const index = getIndex(drawer.data?._id);
28119
- // closeDrawer();
28120
- // if (index > -1) {
28121
- // update(index, props.form.watch(`${props.name}.${index}`));
28122
- // } else {
28123
- // append(props.form.watch(`${props.name}.${index}`));
28124
- // }
28125
- //
28126
- // }
28127
- const handleRowClick = (e) => {
28128
- setDrawer({ open: true, data: e.row });
28107
+ const processRowUpdate = async (newRow, originalRow) => {
28108
+ const original_data = jsonForm({ submitData: originalRow, props: props.parser });
28109
+ const data = jsonForm({ submitData: newRow, props: props.parser });
28110
+ if (isEqual$1(data, original_data))
28111
+ return originalRow;
28112
+ const index = getIndex(data._id);
28113
+ update(index, data);
28114
+ return newRow;
28129
28115
  };
28130
- return (jsxs(Fragment, { children: [jsxs(Grid, { rowSpacing: 1, container: true, size: "grow", direction: "column", ...props.gridProps, children: [jsx(Grid, { size: 12, children: jsx(Typography$1, { variant: "body1", fontWeight: "bold", children: props.label }) }), jsx(Grid, { size: 12, children: jsx(DataGrid, { ...props.dataGridProps, rows: fields, checkboxSelection: props.pageType != "detail", onRowSelectionModelChange: (newRowSelectionModel) => {
28131
- setRowSelectionModel(newRowSelectionModel);
28132
- }, showToolbar: true, slots: { toolbar: EditToolbar }, slotProps: {
28133
- toolbar: {
28134
- selected: rowSelectionModel.ids.size,
28135
- handleCreate: handleCreate,
28136
- handleDelete: handleDelete,
28137
- pageType: props.pageType,
28138
- },
28139
- }, disableRowSelectionOnClick: true, onRowClick: handleRowClick, getRowId: (row) => row._id }) })] }), jsx(MainDrawer, { open: drawer.open, drawerToggle: closeDrawer, title: "Cargo Adicional", children: jsx(Grid, { size: 12, container: true, children: props.fields.map((field) => {
28140
- const fieldName = `${props.name}.${getIndex(drawer.data?._id)}.${field.name}`;
28141
- return (jsx(Field, { ...field, form: props.form, name: fieldName, fieldData: get(drawer.data, field.name) }, fieldName));
28142
- }) }) })] }));
28116
+ const handleProcessRowUpdateError = () => { };
28117
+ const dataGridProps = mergeSettings({
28118
+ columns: !detail
28119
+ ? [
28120
+ ...editColumn({
28121
+ displayEdit: true,
28122
+ rowModesModel,
28123
+ setRowModesModel,
28124
+ }),
28125
+ {
28126
+ field: "delete",
28127
+ type: "actions",
28128
+ headerName: "Borrar",
28129
+ renderCell: (params) => (jsx(GridActionsCell, { ...params, children: jsx(GridActionsCellItem, { icon: jsx(DeleteIcon, {}), label: "Delete", color: "primary", onClick: () => handleDelete(params.row._id) }) })),
28130
+ },
28131
+ ]
28132
+ : [],
28133
+ rows: fields,
28134
+ disableRowSelectionOnClick: true,
28135
+ disableColumnSelector: true,
28136
+ showToolbar: !detail,
28137
+ slots: { toolbar: EditToolbar },
28138
+ slotProps: {
28139
+ toolbar: {
28140
+ handleCreate: handleCreate,
28141
+ handleDelete: handleDelete,
28142
+ pageType: props.pageType,
28143
+ },
28144
+ baseCheckbox: {
28145
+ size: "small",
28146
+ },
28147
+ },
28148
+ getRowId: (row) => row._id,
28149
+ getRowClassName: (params) => params.indexRelativeToCurrentPage % 2 === 0 ? "even" : "odd",
28150
+ density: "compact",
28151
+ onRowClick: undefined,
28152
+ editMode: "row",
28153
+ rowModesModel: rowModesModel,
28154
+ onRowModesModelChange: setRowModesModel,
28155
+ processRowUpdate: processRowUpdate,
28156
+ onProcessRowUpdateError: handleProcessRowUpdateError,
28157
+ onRowEditStart: ({ reason }, event) => {
28158
+ if (reason === GridRowEditStartReasons.cellDoubleClick && detail)
28159
+ event.defaultMuiPrevented = true;
28160
+ },
28161
+ }, props.dataGridProps);
28162
+ return (jsx(Fragment, { children: jsxs(Grid, { rowSpacing: 1, container: true, size: "grow", direction: "column", ...props.gridProps, children: [jsx(Grid, { size: 12, children: jsx(Typography$1, { variant: "body1", fontWeight: "bold", children: props.label }) }), jsx(Grid, { size: 12, children: jsx(DataGrid, { ...dataGridProps }) })] }) }));
28143
28163
  };
28144
28164
 
28145
28165
  const Section = (props) => {
@@ -28386,7 +28406,11 @@ function DetailPage(props) {
28386
28406
  // ==============================|| SUBMIT ||============================== //
28387
28407
  const onSubmitHandler = (submitedData) => {
28388
28408
  const formData = "nativeEvent" in submitedData ? form.getValues() : submitedData;
28389
- const params = { submitData: formData, data: data, props: props.slotProps?.parser };
28409
+ const params = {
28410
+ submitData: formData,
28411
+ data: data,
28412
+ props: props.slotProps?.parser,
28413
+ };
28390
28414
  const dataToSend = props.edit.useFormData ? formDataForm(params) : jsonForm(params);
28391
28415
  mutation(props.edit.useFormData ? dataToSend : { ...dataToSend, ...props.api.mutate.args })
28392
28416
  .unwrap()
@@ -28412,6 +28436,7 @@ function DetailPage(props) {
28412
28436
  }
28413
28437
  });
28414
28438
  };
28439
+ const onError = (errors) => console.log("Validation Errors:", errors);
28415
28440
  // ==============================|| RENDER SECTIONS ||============================== //
28416
28441
  const renderContent = () => {
28417
28442
  let displayed_sections = -1;
@@ -28477,7 +28502,7 @@ function DetailPage(props) {
28477
28502
  }
28478
28503
  };
28479
28504
  return (jsxs(Fragment, { children: [jsx(ContentLayout, { button: renderButton(), badge: props.pageType == "detail" &&
28480
- badgeInfo && (jsx(StatusBadge, { title: badgeInfo["label"], severity: badgeInfo["value"] })), children: jsx(LoadingComponent, { height: 0.7, isLoading: isLoading || isFetching, children: jsx(FormProvider, { ...form, children: jsx(Box, { id: "formulario", component: "form", autoComplete: "off", noValidate: true, onSubmit: form.handleSubmit(onSubmitHandler), width: "100%", position: "relative", children: renderContent() }) }) }) }), renderPostAction()] }));
28505
+ badgeInfo && (jsx(StatusBadge, { title: badgeInfo["label"], severity: badgeInfo["value"] })), children: jsx(LoadingComponent, { height: 0.7, isLoading: isLoading || isFetching, children: jsx(FormProvider, { ...form, children: jsx(Box, { id: "formulario", component: "form", autoComplete: "off", noValidate: true, onSubmit: form.handleSubmit(onSubmitHandler, onError), width: "100%", position: "relative", children: renderContent() }) }) }) }), renderPostAction()] }));
28481
28506
  }
28482
28507
 
28483
28508
  const ListPage = (props) => {