@acvl/frontend-components 0.0.26 → 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';
@@ -107,8 +107,10 @@ import { useDispatch, useSelector } from 'react-redux';
107
107
  const NormalOrIcon = (props) => {
108
108
  const theme = useTheme();
109
109
  const belowLG = useMediaQuery(theme.breakpoints.down("lg"));
110
- if ((belowLG && !(props.type == "button")) || props.type == "icon")
111
- return (jsx(Tooltip, { title: props.buttonProps.children, children: jsx(IconButton, { ...props.buttonProps, children: props.buttonProps.startIcon }) }));
110
+ if ((belowLG && !(props.type == "button")) || props.type == "icon") {
111
+ const { startIcon, ...others } = props.buttonProps;
112
+ return (jsx(Tooltip, { title: props.buttonProps.children, children: jsx(IconButton, { ...others, children: startIcon }) }));
113
+ }
112
114
  return jsx(Button, { ...props.buttonProps });
113
115
  };
114
116
 
@@ -25740,8 +25742,7 @@ const typeSwitch = ({ base_object, base_key, response, submitData, useLabel, dat
25740
25742
  }
25741
25743
  else {
25742
25744
  forEach(object, (value, key2) => {
25743
- if (!includes(["id", "transporte.tarifa.cargos_adicionales"], key) &&
25744
- isEqual(get$1(data, `${key}.${key2}`), value))
25745
+ if (key2 !== "id" && isEqual(get$1(data, `${key}.${key2}`), value))
25745
25746
  return;
25746
25747
  typeSwitch({
25747
25748
  base_object: value,
@@ -25761,7 +25762,7 @@ const typeSwitch = ({ base_object, base_key, response, submitData, useLabel, dat
25761
25762
  break;
25762
25763
  }
25763
25764
  };
25764
- const jsonForm = ({ submitData, data, useLabel, props }) => {
25765
+ const jsonForm = ({ submitData, data, useLabel, props, }) => {
25765
25766
  const response = {};
25766
25767
  forEach(submitData, function (value, key) {
25767
25768
  if (key != "id" && isEqual(get$1(data, key), value))
@@ -25779,7 +25780,7 @@ const jsonForm = ({ submitData, data, useLabel, props }) => {
25779
25780
  });
25780
25781
  return response;
25781
25782
  };
25782
- const formDataForm = ({ submitData, data, useLabel, props }) => {
25783
+ const formDataForm = ({ submitData, data, useLabel, props, }) => {
25783
25784
  const formData = new FormData();
25784
25785
  forEach(submitData, function (value, key) {
25785
25786
  if (key != "id" && isEqual(get$1(data, key), value))
@@ -27345,11 +27346,12 @@ const EditGridWrapper = (props) => {
27345
27346
  }
27346
27347
  catch (e) {
27347
27348
  setErrors((prevState) => produce(prevState, (draft) => {
27348
- draft[newRow.id] = get(e, "data");
27349
+ draft[newRow.id] = get(e, "data.invalid_params");
27349
27350
  }));
27350
27351
  notifications.show("Error actualizando información!", { severity: "error" });
27351
27352
  }
27352
27353
  };
27354
+ const handleProcessRowUpdateError = () => { };
27353
27355
  // ===== || KEYDOWN || ===== //
27354
27356
  const handleKeyPress = useCallback((event) => {
27355
27357
  if (props.permission) {
@@ -27430,6 +27432,7 @@ const EditGridWrapper = (props) => {
27430
27432
  rowModesModel: rowModesModel,
27431
27433
  onRowModesModelChange: setRowModesModel,
27432
27434
  processRowUpdate: processRowUpdate,
27435
+ onProcessRowUpdateError: handleProcessRowUpdateError,
27433
27436
  loadingParams: [loadingMutation],
27434
27437
  }, props.dataGridProps);
27435
27438
  const renderEditGrid = () => (jsx(DndContext, { sensors: sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd, modifiers: [restrictToVerticalAxis, restrictToWindowEdges, restrictToParentElement], autoScroll: false, children: jsx(SortableContext, { items: rows ? rows.map((row) => row.id.toString()) : [], strategy: verticalListSortingStrategy, children: props.renderFunction({
@@ -27464,7 +27467,7 @@ const editColumn = (props) => {
27464
27467
  width: 80,
27465
27468
  cellClassName: "actions",
27466
27469
  getActions: ({ id, row }) => {
27467
- const canEdit = get$1(row, "obj_permissions.edit");
27470
+ const canEdit = get$1(row, "obj_permissions.edit", true);
27468
27471
  const isInEditMode = props.rowModesModel[id]?.mode === GridRowModes.Edit;
27469
27472
  if (isInEditMode) {
27470
27473
  return [
@@ -27920,7 +27923,7 @@ const MyGridEditSingleSelect = (props) => {
27920
27923
  } }));
27921
27924
  };
27922
27925
 
27923
- const StyledTooltip = styled$1(({ className, ...props }) => (jsx(Tooltip, { ...props, placement: 'top', classes: { popper: className } })))(({ theme }) => ({
27926
+ const StyledTooltip = styled$1(({ className, ...props }) => (jsx(Tooltip, { ...props, placement: "top", classes: { popper: className } })))(({ theme }) => ({
27924
27927
  [`& .${tooltipClasses.tooltip}`]: {
27925
27928
  backgroundColor: theme.palette.error.main,
27926
27929
  color: theme.palette.error.contrastText,
@@ -27930,27 +27933,29 @@ const EditCellWithErrorTooltip = (props) => {
27930
27933
  const { error } = props;
27931
27934
  const renderCell = () => {
27932
27935
  switch (props.colDef.type) {
27933
- case 'boolean':
27936
+ case "boolean":
27934
27937
  return jsx(GridEditBooleanCell, { ...props });
27935
- case 'singleSelect':
27938
+ case "singleSelect":
27936
27939
  return jsx(MyGridEditSingleSelect, { ...props });
27937
27940
  default:
27938
- return jsx(GridEditInputCell, { ...props, slotProps: {
27941
+ return (jsx(GridEditInputCell, { ...props, slotProps: {
27939
27942
  root: {
27940
27943
  onFocus: (e) => {
27941
- if (props.field == 'cotizacion__total')
27944
+ if (props.field == "cotizacion__total")
27942
27945
  return e.target.select();
27943
27946
  },
27944
- }
27945
- } });
27947
+ },
27948
+ } }));
27946
27949
  }
27947
27950
  };
27948
- return (jsx(StyledTooltip, { open: !!error, title: error, children: renderCell() }));
27951
+ return (jsx(StyledTooltip, { open: !!error, title: error?.reason.join(", "), children: jsx("div", { style: { display: "flex" }, children: renderCell() }) }));
27949
27952
  };
27950
27953
 
27951
27954
  function renderEditCellWithErrorTooltip(params, mutationErrors, path) {
27952
- const hasError = get(get(mutationErrors, params.id), path || params.field);
27953
- return jsx(EditCellWithErrorTooltip, { ...params, error: hasError });
27955
+ const error = find(get(mutationErrors, params.id), function (e) {
27956
+ return e.name == (path || params.field);
27957
+ });
27958
+ return jsx(EditCellWithErrorTooltip, { ...params, error: error });
27954
27959
  }
27955
27960
 
27956
27961
  const CoverPage = (props) => {
@@ -28080,60 +28085,81 @@ const Field = (props) => {
28080
28085
  };
28081
28086
 
28082
28087
  const EditToolbar = (props) => {
28083
- 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" }) }) })) }));
28084
28089
  };
28085
28090
  const FieldArrayField = (props) => {
28086
- const { fields, remove } = useFieldArray({
28091
+ const detail = useMemo(() => props.pageType === "detail", [props.pageType]);
28092
+ const { fields, append, update, remove } = useFieldArray({
28087
28093
  control: props.form.control,
28088
28094
  name: props.name,
28089
28095
  keyName: "_id",
28090
28096
  });
28091
- const [drawer, setDrawer] = useState({
28092
- open: false,
28093
- data: undefined,
28094
- });
28095
- const [rowSelectionModel, setRowSelectionModel] = useState({
28096
- type: "include",
28097
- ids: new Set(),
28098
- });
28097
+ const [rowModesModel, setRowModesModel] = useState({});
28099
28098
  const getIndex = useCallback((id) => findIndex(fields, function (field) {
28100
28099
  return field._id == id;
28101
28100
  }), [fields]);
28102
28101
  const handleCreate = () => {
28103
- setDrawer({ open: true, data: undefined });
28104
- };
28105
- const handleDelete = () => {
28106
- remove(Array.from(rowSelectionModel.ids).map((id) => getIndex(id)));
28102
+ append(props.defaultValues);
28107
28103
  };
28108
- const closeDrawer = () => {
28109
- setDrawer({ open: false, data: undefined });
28104
+ const handleDelete = (id) => {
28105
+ remove(getIndex(id));
28110
28106
  };
28111
- // const handleSave = () => {
28112
- // const index = getIndex(drawer.data?._id);
28113
- // closeDrawer();
28114
- // if (index > -1) {
28115
- // update(index, props.form.watch(`${props.name}.${index}`));
28116
- // } else {
28117
- // append(props.form.watch(`${props.name}.${index}`));
28118
- // }
28119
- //
28120
- // }
28121
- const handleRowClick = (e) => {
28122
- 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;
28123
28115
  };
28124
- 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) => {
28125
- setRowSelectionModel(newRowSelectionModel);
28126
- }, showToolbar: true, slots: { toolbar: EditToolbar }, slotProps: {
28127
- toolbar: {
28128
- selected: rowSelectionModel.ids.size,
28129
- handleCreate: handleCreate,
28130
- handleDelete: handleDelete,
28131
- pageType: props.pageType,
28132
- },
28133
- }, 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) => {
28134
- const fieldName = `${props.name}.${getIndex(drawer.data?._id)}.${field.name}`;
28135
- return (jsx(Field, { ...field, form: props.form, name: fieldName, fieldData: get(drawer.data, field.name) }, fieldName));
28136
- }) }) })] }));
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 }) })] }) }));
28137
28163
  };
28138
28164
 
28139
28165
  const Section = (props) => {
@@ -28380,7 +28406,11 @@ function DetailPage(props) {
28380
28406
  // ==============================|| SUBMIT ||============================== //
28381
28407
  const onSubmitHandler = (submitedData) => {
28382
28408
  const formData = "nativeEvent" in submitedData ? form.getValues() : submitedData;
28383
- 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
+ };
28384
28414
  const dataToSend = props.edit.useFormData ? formDataForm(params) : jsonForm(params);
28385
28415
  mutation(props.edit.useFormData ? dataToSend : { ...dataToSend, ...props.api.mutate.args })
28386
28416
  .unwrap()
@@ -28406,6 +28436,7 @@ function DetailPage(props) {
28406
28436
  }
28407
28437
  });
28408
28438
  };
28439
+ const onError = (errors) => console.log("Validation Errors:", errors);
28409
28440
  // ==============================|| RENDER SECTIONS ||============================== //
28410
28441
  const renderContent = () => {
28411
28442
  let displayed_sections = -1;
@@ -28471,7 +28502,7 @@ function DetailPage(props) {
28471
28502
  }
28472
28503
  };
28473
28504
  return (jsxs(Fragment, { children: [jsx(ContentLayout, { button: renderButton(), badge: props.pageType == "detail" &&
28474
- 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()] }));
28475
28506
  }
28476
28507
 
28477
28508
  const ListPage = (props) => {
@@ -28482,7 +28513,6 @@ function SlideTransition(props) {
28482
28513
  return jsx(Slide, { ...props, direction: "left" });
28483
28514
  }
28484
28515
  const BaseProgressSnack = (props) => {
28485
- console.log(props);
28486
28516
  const dispatch = useDispatch();
28487
28517
  const handleClose = (e) => {
28488
28518
  if (e?.defaultMuiPrevented)