Skip to main content

Editable

More info

Usage​

import MaterialTable from "@material-table/core";

<MaterialTable
// ...
editable={{
onBulkUpdate: (changes) => {
return new Promise((resolve, reject) => {
// Must return a Promise
});
},
onRowAddCancelled: (rowData) => {
return new Promise((resolve, reject) => {
// Must return a Promise
});
},
onRowUpdateCancelled: (rowData) => {
return new Promise((resolve, reject) => {
// Must return a Promise
});
},
onRowAdd: (newData) => {
return new Promise((resolve, reject) => {
// Must return a Promise
});
},
onRowUpdate: (newData, oldData) => {
return new Promise((resolve, reject) => {
// Must return a Promise
});
},
onRowDelete: (oldData) => {
return new Promise((resolve, reject) => {
// Must return a Promise
});
},
}}
// ...
/>;

Live Demo​

note

See here for more on the GLOBAL_VARS we use in our demos

Live Editor
function BasicEditPanelDemo() {
  const [data, setData] = useState(EDITABLE_DATA);

  // Helper function
  function getNewDataBulkEdit(changes, copyData) {
    // key matches the column data id
    const keys = Object.keys(changes);
    for (let i = 0; i < keys.length; i++) {
      if (changes[keys[i]] && changes[keys[i]].newData) {
        // Find the data item with the same key in copyData[]
        let targetData = copyData.find((el) => el.id === keys[i]);
        if (targetData) {
          let newTargetDataIndex = copyData.indexOf(targetData);
          copyData[newTargetDataIndex] = changes[keys[i]].newData;
        }
      }
    }
    return copyData;
  }

  return (
    <MaterialTable
      data={data}
      columns={EDITABLE_COLUMNS}
      editable={{
        onBulkUpdate: (changes) => {
          return new Promise((resolve, reject) => {
            setTimeout(() => {
              let copyData = [...data];
              setData(getNewDataBulkEdit(changes, copyData));
              resolve();
            }, 1000);
          });
        },
        onRowAddCancelled: (rowData) => console.log("Row adding cancelled"),
        onRowUpdateCancelled: (rowData) => console.log("Row editing cancelled"),
        onRowAdd: (newData) => {
          return new Promise((resolve, reject) => {
            setTimeout(() => {
              newData.id = "uuid-" + Math.random() * 10000000;
              setData([...data, newData]);
              resolve();
            }, 1000);
          });
        },
        onRowUpdate: (newData, oldData) => {
          return new Promise((resolve, reject) => {
            setTimeout(() => {
              const dataUpdate = [...data];
              // In dataUpdate, find target
              const target = dataUpdate.find((el) => el.id === oldData.id);
              const index = dataUpdate.indexOf(target);
              dataUpdate[index] = newData;
              setData(dataUpdate);
              resolve();
            }, 1000);
          });
        },
        onRowDelete: (oldData) => {
          return new Promise((resolve, reject) => {
            setTimeout(() => {
              const dataDelete = data.filter((el) => el.id !== oldData.id);
              setData(dataDelete);
              resolve();
            }, 1000);
          });
        },
      }}
    />
  );
}
Result
Loading...