@jsonforms/material-renderers 3.3.0 → 3.4.0-alpha.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.
@@ -114,7 +114,7 @@ const fixedCellSmall = {
114
114
  paddingLeft: 0,
115
115
  paddingRight: 0,
116
116
  };
117
- const TableToolbar = React.memo(function TableToolbar({ numColumns, errors, label, description, path, addItem, schema, enabled, translations, rootSchema, }) {
117
+ const TableToolbar = React.memo(function TableToolbar({ numColumns, errors, label, description, path, addItem, schema, enabled, translations, rootSchema, disableAdd, }) {
118
118
  return (React.createElement(TableRow, null,
119
119
  React.createElement(NoBorderTableCell, { colSpan: numColumns },
120
120
  React.createElement(Stack, null,
@@ -124,7 +124,7 @@ const TableToolbar = React.memo(function TableToolbar({ numColumns, errors, labe
124
124
  React.createElement(Grid, { item: true }, errors.length !== 0 && (React.createElement(Grid, { item: true },
125
125
  React.createElement(ValidationIcon, { id: 'tooltip-validation', errorMessages: errors }))))),
126
126
  description && React.createElement(FormHelperText, null, description))),
127
- enabled ? (React.createElement(NoBorderTableCell, { align: 'right', style: fixedCellSmall },
127
+ enabled && !disableAdd ? (React.createElement(NoBorderTableCell, { align: 'right', style: fixedCellSmall },
128
128
  React.createElement(Tooltip, { id: 'tooltip-add', title: translations.addTooltip, placement: 'bottom' },
129
129
  React.createElement(IconButton, { "aria-label": translations.addAriaLabel, onClick: addItem(path, createDefaultValue(schema, rootSchema)), size: 'large' },
130
130
  React.createElement(Add, null))))) : null));
@@ -217,7 +217,7 @@ const NonEmptyCell = (ownProps) => {
217
217
  const isValid = isEmpty(emptyCellProps.errors);
218
218
  return React.createElement(NonEmptyCellComponent, { ...emptyCellProps, isValid: isValid });
219
219
  };
220
- const NonEmptyRowComponent = ({ childPath, schema, rowIndex, openDeleteDialog, moveUpCreator, moveDownCreator, enableUp, enableDown, showSortButtons, enabled, cells, path, translations, }) => {
220
+ const NonEmptyRowComponent = ({ childPath, schema, rowIndex, openDeleteDialog, moveUpCreator, moveDownCreator, enableUp, enableDown, showSortButtons, enabled, cells, path, translations, disableRemove, }) => {
221
221
  const moveUp = useMemo(() => moveUpCreator(path, rowIndex), [moveUpCreator, path, rowIndex]);
222
222
  const moveDown = useMemo(() => moveDownCreator(path, rowIndex), [moveDownCreator, path, rowIndex]);
223
223
  return (React.createElement(TableRow, { key: childPath, hover: true },
@@ -233,13 +233,13 @@ const NonEmptyRowComponent = ({ childPath, schema, rowIndex, openDeleteDialog, m
233
233
  React.createElement(Tooltip, { id: 'tooltip-down', title: translations.down, placement: 'bottom', open: enableDown ? undefined : false },
234
234
  React.createElement(IconButton, { "aria-label": translations.downAriaLabel, onClick: moveDown, disabled: !enableDown, size: 'large' },
235
235
  React.createElement(ArrowDownward, null)))))) : null,
236
- React.createElement(Grid, { item: true },
236
+ !disableRemove ? (React.createElement(Grid, { item: true },
237
237
  React.createElement(Tooltip, { id: 'tooltip-remove', title: translations.removeTooltip, placement: 'bottom' },
238
238
  React.createElement(IconButton, { "aria-label": translations.removeAriaLabel, onClick: () => openDeleteDialog(childPath, rowIndex), size: 'large' },
239
- React.createElement(Delete, null))))))) : null));
239
+ React.createElement(Delete, null))))) : null))) : null));
240
240
  };
241
241
  const NonEmptyRow = React.memo(NonEmptyRowComponent);
242
- const TableRows = ({ data, path, schema, openDeleteDialog, moveUp, moveDown, uischema, config, enabled, cells, translations, }) => {
242
+ const TableRows = ({ data, path, schema, openDeleteDialog, moveUp, moveDown, uischema, config, enabled, cells, translations, disableRemove, }) => {
243
243
  const isEmptyTable = data === 0;
244
244
  if (isEmptyTable) {
245
245
  return (React.createElement(EmptyTable, { numColumns: getValidColumnProps(schema).length + 1, translations: translations }));
@@ -248,7 +248,7 @@ const TableRows = ({ data, path, schema, openDeleteDialog, moveUp, moveDown, uis
248
248
  return (React.createElement(React.Fragment, null, range(data).map((index) => {
249
249
  const childPath = Paths.compose(path, `${index}`);
250
250
  return (React.createElement(NonEmptyRow, { key: childPath, childPath: childPath, rowIndex: index, schema: schema, openDeleteDialog: openDeleteDialog, moveUpCreator: moveUp, moveDownCreator: moveDown, enableUp: index !== 0, enableDown: index !== data - 1, showSortButtons: appliedUiSchemaOptions.showSortButtons ||
251
- appliedUiSchemaOptions.showArrayTableSortButtons, enabled: enabled, cells: cells, path: path, translations: translations }));
251
+ appliedUiSchemaOptions.showArrayTableSortButtons, enabled: enabled, cells: cells, path: path, translations: translations, disableRemove: disableRemove }));
252
252
  })));
253
253
  };
254
254
  class MaterialTableControl extends React.Component {
@@ -257,7 +257,10 @@ class MaterialTableControl extends React.Component {
257
257
  this.addItem = (path, value) => this.props.addItem(path, value);
258
258
  }
259
259
  render() {
260
- const { label, description, path, schema, rootSchema, uischema, errors, openDeleteDialog, visible, enabled, cells, translations, } = this.props;
260
+ const { label, description, path, schema, rootSchema, uischema, errors, openDeleteDialog, visible, enabled, cells, translations, disableAdd, disableRemove, config, } = this.props;
261
+ const appliedUiSchemaOptions = merge({}, config, uischema.options);
262
+ const doDisableAdd = disableAdd || appliedUiSchemaOptions.disableAdd;
263
+ const doDisableRemove = disableRemove || appliedUiSchemaOptions.disableRemove;
261
264
  const controlElement = uischema;
262
265
  const isObjectSchema = schema.type === 'object';
263
266
  const headerCells = isObjectSchema
@@ -268,12 +271,12 @@ class MaterialTableControl extends React.Component {
268
271
  }
269
272
  return (React.createElement(Table, null,
270
273
  React.createElement(TableHead, null,
271
- React.createElement(TableToolbar, { errors: errors, label: label, description: description, addItem: this.addItem, numColumns: isObjectSchema ? headerCells.length : 1, path: path, uischema: controlElement, schema: schema, rootSchema: rootSchema, enabled: enabled, translations: translations }),
274
+ React.createElement(TableToolbar, { errors: errors, label: label, description: description, addItem: this.addItem, numColumns: isObjectSchema ? headerCells.length : 1, path: path, uischema: controlElement, schema: schema, rootSchema: rootSchema, enabled: enabled, translations: translations, disableAdd: doDisableAdd }),
272
275
  isObjectSchema && (React.createElement(TableRow, null,
273
276
  headerCells,
274
277
  enabled ? React.createElement(TableCell, null) : null))),
275
278
  React.createElement(TableBody, null,
276
- React.createElement(TableRows, { openDeleteDialog: openDeleteDialog, translations: translations, ...this.props }))));
279
+ React.createElement(TableRows, { openDeleteDialog: openDeleteDialog, translations: translations, ...this.props, disableRemove: doDisableRemove }))));
277
280
  }
278
281
  }
279
282
 
@@ -675,7 +678,7 @@ const MaterialLabelRenderer = ({ text, visible }) => {
675
678
  };
676
679
  var MaterialLabelRenderer$1 = withJsonFormsLabelProps(MaterialLabelRenderer);
677
680
 
678
- const ArrayLayoutToolbar = React.memo(function ArrayLayoutToolbar({ label, description, errors, addItem, path, enabled, createDefault, translations, }) {
681
+ const ArrayLayoutToolbar = React.memo(function ArrayLayoutToolbar({ label, description, errors, addItem, path, enabled, createDefault, translations, disableAdd, }) {
679
682
  return (React.createElement(Toolbar, { disableGutters: true },
680
683
  React.createElement(Stack, null,
681
684
  React.createElement(Grid, { container: true, alignItems: 'center', justifyContent: 'space-between' },
@@ -685,7 +688,7 @@ const ArrayLayoutToolbar = React.memo(function ArrayLayoutToolbar({ label, descr
685
688
  React.createElement(Typography, { variant: 'h6' }, label)),
686
689
  React.createElement(Grid, { item: true }, errors.length !== 0 && (React.createElement(Grid, { item: true },
687
690
  React.createElement(ValidationIcon, { id: 'tooltip-validation', errorMessages: errors })))))),
688
- enabled && (React.createElement(Grid, { item: true },
691
+ enabled && !disableAdd && (React.createElement(Grid, { item: true },
689
692
  React.createElement(Grid, { container: true },
690
693
  React.createElement(Grid, { item: true },
691
694
  React.createElement(Tooltip, { id: 'tooltip-add', title: translations.addTooltip, placement: 'bottom' },
@@ -694,19 +697,19 @@ const ArrayLayoutToolbar = React.memo(function ArrayLayoutToolbar({ label, descr
694
697
  description && React.createElement(FormHelperText, null, description))));
695
698
  });
696
699
 
697
- const ListWithDetailMasterItem = ({ index, childLabel, selected, enabled, handleSelect, removeItem, path, translations, }) => {
700
+ const ListWithDetailMasterItem = ({ index, childLabel, selected, enabled, handleSelect, removeItem, path, translations, disableRemove, }) => {
698
701
  return (React.createElement(ListItem, { button: true, selected: selected, onClick: handleSelect(index) },
699
702
  React.createElement(ListItemAvatar, null,
700
703
  React.createElement(Avatar, { "aria-label": 'Index' }, index + 1)),
701
704
  React.createElement(ListItemText, { primary: childLabel }),
702
- enabled && (React.createElement(ListItemSecondaryAction, null,
705
+ enabled && !disableRemove && (React.createElement(ListItemSecondaryAction, null,
703
706
  React.createElement(Tooltip, { id: 'tooltip-remove', title: translations.removeTooltip, placement: 'bottom' },
704
707
  React.createElement(IconButton, { "aria-label": translations.removeAriaLabel, onClick: removeItem(path, index), size: 'large' },
705
708
  React.createElement(Delete, null)))))));
706
709
  };
707
710
  var ListWithDetailMasterItem$1 = withJsonFormsMasterListItemProps(ListWithDetailMasterItem);
708
711
 
709
- const MaterialListWithDetailRenderer = ({ uischemas, schema, uischema, path, enabled, errors, visible, label, required, removeItems, addItem, data, renderers, cells, config, rootSchema, translations, description, }) => {
712
+ const MaterialListWithDetailRenderer = ({ uischemas, schema, uischema, path, enabled, errors, visible, label, required, removeItems, addItem, data, renderers, cells, config, rootSchema, translations, description, disableAdd, disableRemove, }) => {
710
713
  const [selectedIndex, setSelectedIndex] = useState(undefined);
711
714
  const handleRemoveItem = useCallback((p, value) => () => {
712
715
  removeItems(p, [value])();
@@ -721,6 +724,8 @@ const MaterialListWithDetailRenderer = ({ uischemas, schema, uischema, path, ena
721
724
  const handleCreateDefaultValue = useCallback(() => createDefaultValue(schema, rootSchema), [createDefaultValue]);
722
725
  const foundUISchema = useMemo(() => findUISchema(uischemas, schema, uischema.scope, path, undefined, uischema, rootSchema), [uischemas, schema, uischema.scope, path, uischema, rootSchema]);
723
726
  const appliedUiSchemaOptions = merge({}, config, uischema.options);
727
+ const doDisableAdd = disableAdd || appliedUiSchemaOptions.disableAdd;
728
+ const doDisableRemove = disableRemove || appliedUiSchemaOptions.disableRemove;
724
729
  React.useEffect(() => {
725
730
  setSelectedIndex(undefined);
726
731
  }, [schema]);
@@ -728,10 +733,10 @@ const MaterialListWithDetailRenderer = ({ uischemas, schema, uischema, path, ena
728
733
  return null;
729
734
  }
730
735
  return (React.createElement(React.Fragment, null,
731
- React.createElement(ArrayLayoutToolbar, { translations: translations, label: computeLabel(label, required, appliedUiSchemaOptions.hideRequiredAsterisk), description: description, errors: errors, path: path, enabled: enabled, addItem: addItem, createDefault: handleCreateDefaultValue }),
736
+ React.createElement(ArrayLayoutToolbar, { translations: translations, label: computeLabel(label, required, appliedUiSchemaOptions.hideRequiredAsterisk), description: description, errors: errors, path: path, enabled: enabled, addItem: addItem, createDefault: handleCreateDefaultValue, disableAdd: doDisableAdd }),
732
737
  React.createElement(Grid, { container: true, direction: 'row', spacing: 2 },
733
738
  React.createElement(Grid, { item: true, xs: 3 },
734
- React.createElement(List, null, data > 0 ? (map(range(data), (index) => (React.createElement(ListWithDetailMasterItem$1, { index: index, path: path, schema: schema, enabled: enabled, handleSelect: handleListItemClick, removeItem: handleRemoveItem, selected: selectedIndex === index, key: index, uischema: foundUISchema, childLabelProp: appliedUiSchemaOptions.elementLabelProp, translations: translations })))) : (React.createElement("p", null, translations.noDataMessage)))),
739
+ React.createElement(List, null, data > 0 ? (map(range(data), (index) => (React.createElement(ListWithDetailMasterItem$1, { index: index, path: path, schema: schema, enabled: enabled, handleSelect: handleListItemClick, removeItem: handleRemoveItem, selected: selectedIndex === index, key: index, uischema: foundUISchema, childLabelProp: appliedUiSchemaOptions.elementLabelProp, translations: translations, disableRemove: doDisableRemove })))) : (React.createElement("p", null, translations.noDataMessage)))),
735
740
  React.createElement(Grid, { item: true, xs: true }, selectedIndex !== undefined ? (React.createElement(JsonFormsDispatch, { renderers: renderers, cells: cells, visible: visible, schema: schema, uischema: foundUISchema, path: composePaths(path, `${selectedIndex}`) })) : (React.createElement(Typography, { variant: 'h6' }, translations.noSelection))))));
736
741
  };
737
742
  const materialListWithDetailTester = rankWith(4, and(uiTypeIs('ListWithDetail'), isObjectArray));
@@ -1158,7 +1163,7 @@ const ExpandPanelRendererComponent = (props) => {
1158
1163
  removeId(labelHtmlId);
1159
1164
  };
1160
1165
  }, [labelHtmlId]);
1161
- const { enabled, childLabel, childPath, index, expanded, moveDown, moveUp, enableMoveDown, enableMoveUp, handleExpansion, removeItems, path, rootSchema, schema, uischema, uischemas, renderers, cells, config, translations, } = props;
1166
+ const { enabled, childLabel, childPath, index, expanded, moveDown, moveUp, enableMoveDown, enableMoveUp, handleExpansion, removeItems, path, rootSchema, schema, uischema, uischemas, renderers, cells, config, translations, disableRemove, } = props;
1162
1167
  const foundUISchema = useMemo(() => findUISchema(uischemas, schema, uischema.scope, path, undefined, uischema, rootSchema), [uischemas, schema, uischema.scope, path, uischema, rootSchema]);
1163
1168
  const appliedUiSchemaOptions = merge({}, config, uischema.options);
1164
1169
  const showSortButtons = appliedUiSchemaOptions.showSortButtons ||
@@ -1185,7 +1190,7 @@ const ExpandPanelRendererComponent = (props) => {
1185
1190
  React.createElement(Tooltip, { id: 'tooltip-down', title: translations.down, placement: 'bottom', open: enableMoveDown ? undefined : false },
1186
1191
  React.createElement(IconButton, { onClick: moveDown(path, index), style: iconStyle, disabled: !enableMoveDown, "aria-label": translations.downAriaLabel, size: 'large' },
1187
1192
  React.createElement(ArrowDownward, null)))))) : (''),
1188
- enabled && (React.createElement(Grid, { item: true },
1193
+ enabled && !disableRemove && (React.createElement(Grid, { item: true },
1189
1194
  React.createElement(Tooltip, { id: 'tooltip-remove', title: translations.removeTooltip, placement: 'bottom' },
1190
1195
  React.createElement(IconButton, { onClick: removeItems(path, [index]), style: iconStyle, "aria-label": translations.removeAriaLabel, size: 'large' },
1191
1196
  React.createElement(Delete, null))))))))))),
@@ -1202,13 +1207,16 @@ const ctxDispatchToExpandPanelProps = (dispatch) => ({
1202
1207
  .reverse()
1203
1208
  .forEach((s) => array.splice(s, 1));
1204
1209
  return array;
1205
- }));
1210
+ }, { type: 'REMOVE', indices: toDelete }));
1206
1211
  }, [dispatch]),
1207
1212
  moveUp: useCallback((path, toMove) => (event) => {
1208
1213
  event.stopPropagation();
1209
1214
  dispatch(update(path, (array) => {
1210
1215
  moveUp(array, toMove);
1211
1216
  return array;
1217
+ }, {
1218
+ type: 'MOVE',
1219
+ moves: [{ from: toMove, to: toMove - 1 }],
1212
1220
  }));
1213
1221
  }, [dispatch]),
1214
1222
  moveDown: useCallback((path, toMove) => (event) => {
@@ -1216,6 +1224,9 @@ const ctxDispatchToExpandPanelProps = (dispatch) => ({
1216
1224
  dispatch(update(path, (array) => {
1217
1225
  moveDown(array, toMove);
1218
1226
  return array;
1227
+ }, {
1228
+ type: 'MOVE',
1229
+ moves: [{ from: toMove, to: toMove + 1 }],
1219
1230
  }));
1220
1231
  }, [dispatch]),
1221
1232
  });
@@ -1351,12 +1362,14 @@ const MaterialArrayLayoutComponent = (props) => {
1351
1362
  setExpanded(expandedPanel ? panel : false);
1352
1363
  }, []);
1353
1364
  const isExpanded = (index) => expanded === composePaths(props.path, `${index}`);
1354
- const { enabled, data, path, schema, uischema, errors, addItem, renderers, cells, label, required, rootSchema, config, uischemas, translations, description, } = props;
1365
+ const { enabled, data, path, schema, uischema, errors, addItem, renderers, cells, label, required, rootSchema, config, uischemas, translations, description, disableAdd, disableRemove, } = props;
1355
1366
  const appliedUiSchemaOptions = merge({}, config, props.uischema.options);
1367
+ const doDisableAdd = disableAdd || appliedUiSchemaOptions.disableAdd;
1368
+ const doDisableRemove = disableRemove || appliedUiSchemaOptions.disableRemove;
1356
1369
  return (React.createElement("div", null,
1357
- React.createElement(ArrayLayoutToolbar, { translations: translations, label: computeLabel(label, required, appliedUiSchemaOptions.hideRequiredAsterisk), description: description, errors: errors, path: path, enabled: enabled, addItem: addItem, createDefault: innerCreateDefaultValue }),
1370
+ React.createElement(ArrayLayoutToolbar, { translations: translations, label: computeLabel(label, required, appliedUiSchemaOptions.hideRequiredAsterisk), description: description, errors: errors, path: path, enabled: enabled, addItem: addItem, createDefault: innerCreateDefaultValue, disableAdd: doDisableAdd }),
1358
1371
  React.createElement("div", null, data > 0 ? (map(range(data), (index) => {
1359
- return (React.createElement(ExpandPanelRenderer$1, { enabled: enabled, index: index, expanded: isExpanded(index), schema: schema, path: path, handleExpansion: handleChange, uischema: uischema, renderers: renderers, cells: cells, key: index, rootSchema: rootSchema, enableMoveUp: index != 0, enableMoveDown: index < data - 1, config: config, childLabelProp: appliedUiSchemaOptions.elementLabelProp, uischemas: uischemas, translations: translations }));
1372
+ return (React.createElement(ExpandPanelRenderer$1, { enabled: enabled, index: index, expanded: isExpanded(index), schema: schema, path: path, handleExpansion: handleChange, uischema: uischema, renderers: renderers, cells: cells, key: index, rootSchema: rootSchema, enableMoveUp: index != 0, enableMoveDown: index < data - 1, config: config, childLabelProp: appliedUiSchemaOptions.elementLabelProp, uischemas: uischemas, translations: translations, disableRemove: doDisableRemove }));
1360
1373
  })) : (React.createElement("p", null, translations.noDataMessage)))));
1361
1374
  };
1362
1375
  const MaterialArrayLayout$1 = React.memo(MaterialArrayLayoutComponent);