dce-reactkit 3.4.0-beta.6 → 3.4.0-beta.7

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.
@@ -26,6 +26,7 @@ declare type Props = {
26
26
  entryFields: DBEntryField[];
27
27
  dbEntryToEdit?: DBEntry;
28
28
  idPropName: string;
29
+ itemName: string;
29
30
  saveEndpointPath: string;
30
31
  entries: DBEntry[];
31
32
  };
package/dist/esm/index.js CHANGED
@@ -39663,7 +39663,7 @@ const AddOrEditDBEntry = (props) => {
39663
39663
  /*------------------------------------------------------------------------*/
39664
39664
  /* -------------- Props ------------- */
39665
39665
  // Destructure all props
39666
- const { onFinished, entryFields, dbEntryToEdit, validateEntry, modifyEntry, idPropName, saveEndpointPath, entries, } = props;
39666
+ const { onFinished, entryFields, dbEntryToEdit, validateEntry, modifyEntry, idPropName, saveEndpointPath, entries, itemName, } = props;
39667
39667
  /* -------------- State ------------- */
39668
39668
  // Initial state
39669
39669
  const initialState = {
@@ -39691,6 +39691,8 @@ const AddOrEditDBEntry = (props) => {
39691
39691
  }
39692
39692
  });
39693
39693
  const modifiedEntry = modifyEntry ? modifyEntry(entry) : entry;
39694
+ // add id key to entry so that when we delete the item, the key will always be "id"
39695
+ modifiedEntry.id = modifiedEntry[idPropName];
39694
39696
  // Send to server
39695
39697
  try {
39696
39698
  yield visitServerEndpoint({
@@ -39714,41 +39716,31 @@ const AddOrEditDBEntry = (props) => {
39714
39716
  const cancel = () => {
39715
39717
  onFinished(undefined);
39716
39718
  };
39717
- /*------------------------------------------------------------------------*/
39718
- /* ------------------------------- Render ------------------------------- */
39719
- /*------------------------------------------------------------------------*/
39720
- /*----------------------------------------*/
39721
- /* ---------------- Views --------------- */
39722
- /*----------------------------------------*/
39723
- // Body
39724
- let body;
39725
- /* ------------- Loading ------------ */
39726
- if (saving) {
39727
- body = (React__default.createElement(LoadingSpinner, null));
39728
- }
39729
- /* -------------- Form -------------- */
39730
- // If not saving, validate what the user has entered
39731
- if (!saving) {
39732
- // Validation error if there is one
39733
- let validationError = undefined;
39734
- // Validate each field
39735
- for (let i = 0; i < entryFields.length; i += 1) {
39736
- const field = entryFields[i];
39719
+ /**
39720
+ * Create validation error message for the DBEntry
39721
+ * @author Yuen Ler Chow
39722
+ * @param fields the fields to validate
39723
+ * @returns the validation error message, or an empty string if no error
39724
+ */
39725
+ const validate = (fields) => {
39726
+ let validationError = '';
39727
+ for (let i = 0; i < fields.length; i += 1) {
39728
+ const field = fields[i];
39737
39729
  const value = entry[field.objectKey];
39738
- // Check if required field is empty
39739
- if (field.required && !value) {
39730
+ // Check if required field is empty. Field is automatically required if it is the idPropName
39731
+ if ((field.required || (field.objectKey === idPropName)) && !value) {
39740
39732
  validationError = `Please fill in the ${field.label} field`;
39741
- break;
39733
+ return validationError;
39742
39734
  }
39743
39735
  // Check if unique field is unique
39744
39736
  if (field.objectKey === idPropName) {
39745
39737
  if (entries.find((e) => { return e[idPropName] === value; })) {
39746
39738
  validationError = `An item with the ${field.label} ${value} already exists. ${field.label} must be unique.`;
39747
- break;
39739
+ return validationError;
39748
39740
  }
39749
39741
  }
39750
39742
  // If they have entered a value for the field, check if it is valid
39751
- if (value) {
39743
+ if (value || field.type === DBEntryFieldType$1.Object) {
39752
39744
  // String validation
39753
39745
  if (field.type === DBEntryFieldType$1.String) {
39754
39746
  if (
@@ -39809,24 +39801,46 @@ const AddOrEditDBEntry = (props) => {
39809
39801
  // Value is too small
39810
39802
  && value[j] < field.minNumber) {
39811
39803
  validationError = `${field.label} values must be at least ${field.minNumber}`;
39812
- break;
39804
+ return validationError;
39813
39805
  }
39814
- else if (
39806
+ if (
39815
39807
  // Maximum value requirement is defined
39816
39808
  field.maxNumber
39817
39809
  // Value is too large
39818
39810
  && value[j] > field.maxNumber) {
39819
39811
  validationError = `${field.label} values must be at most ${field.maxNumber}`;
39820
- break;
39812
+ return validationError;
39821
39813
  }
39822
39814
  }
39823
39815
  }
39824
39816
  }
39817
+ else if (field.type === DBEntryFieldType$1.Object) {
39818
+ validationError = validate(field.subfields);
39819
+ }
39825
39820
  }
39826
39821
  if (validationError) {
39827
- break;
39822
+ return validationError;
39828
39823
  }
39829
39824
  }
39825
+ return validationError;
39826
+ };
39827
+ /*------------------------------------------------------------------------*/
39828
+ /* ------------------------------- Render ------------------------------- */
39829
+ /*------------------------------------------------------------------------*/
39830
+ /*----------------------------------------*/
39831
+ /* ---------------- Views --------------- */
39832
+ /*----------------------------------------*/
39833
+ // Body
39834
+ let body;
39835
+ /* ------------- Loading ------------ */
39836
+ if (saving) {
39837
+ body = (React__default.createElement(LoadingSpinner, null));
39838
+ }
39839
+ /* -------------- Form -------------- */
39840
+ // If not saving, validate what the user has entered
39841
+ if (!saving) {
39842
+ // Validation error if there is one
39843
+ const validationError = validate(entryFields);
39830
39844
  /**
39831
39845
  * Render a single entry field
39832
39846
  * @author Yuen Ler Chow
@@ -39932,19 +39946,20 @@ const AddOrEditDBEntry = (props) => {
39932
39946
  });
39933
39947
  } })))));
39934
39948
  }
39935
- if (field.type == DBEntryFieldType$1.Object) {
39949
+ if (field.type === DBEntryFieldType$1.Object) {
39936
39950
  return (React__default.createElement("div", { key: field.objectKey, className: "mb-2" },
39937
39951
  React__default.createElement("div", { className: "input-group" },
39938
39952
  React__default.createElement("span", { className: "AddOrEditDBEntry-input-label input-group-text" }, field.label),
39939
- field.subfields.map((subfield) => {
39940
- return renderEntryField(subfield, disabled);
39941
- }))));
39953
+ React__default.createElement("div", { className: "flex-grow-1 p-2 form-control" }, field.subfields.map((subfield) => {
39954
+ return React__default.createElement("div", null, renderEntryField(subfield, disabled));
39955
+ })))));
39942
39956
  }
39943
39957
  // This should never happen
39944
39958
  return null;
39945
39959
  };
39946
39960
  // UI
39947
39961
  body = (React__default.createElement("div", null,
39962
+ React__default.createElement("h1", null, dbEntryToEdit ? `Edit ${itemName}` : `Create ${itemName}`),
39948
39963
  entryFields.map((field) => {
39949
39964
  const disabled = (idPropName === field.objectKey && dbEntryToEdit !== undefined)
39950
39965
  || (field.lockAfterCreation !== undefined && dbEntryToEdit !== undefined);
@@ -39952,12 +39967,12 @@ const AddOrEditDBEntry = (props) => {
39952
39967
  }),
39953
39968
  React__default.createElement("div", { className: "text-center mt-2" },
39954
39969
  React__default.createElement("button", { type: "button", id: "AddOrEditDBEntry-save-changes-button", className: "btn btn-primary btn-lg me-1", "aria-label": "Save changes", onClick: () => __awaiter(void 0, void 0, void 0, function* () {
39955
- if (validationError) {
39970
+ if (validationError && validationError.length > 0) {
39956
39971
  return alert$1('Please fix the following error', validationError);
39957
39972
  }
39958
39973
  if (validateEntry) {
39959
39974
  try {
39960
- validateEntry(entry);
39975
+ yield validateEntry(entry);
39961
39976
  }
39962
39977
  catch (error) {
39963
39978
  return alert$1('Please fix the following error', String(error));
@@ -40073,7 +40088,7 @@ const reducer = (state, action) => {
40073
40088
  /*------------------------------------------------------------------------*/
40074
40089
  const DBEntryManagerPanel = (props) => {
40075
40090
  // Destructure all props
40076
- const { entryFields, titlePropName, descriptionPropName, idPropName, itemListTitle, itemName, validateEntry, modifyEntry, disableEdit, collectionName, adminsOnly, filterQuery } = props;
40091
+ const { entryFields, titlePropName, descriptionPropName, idPropName, itemListTitle, itemName, validateEntry, modifyEntry, disableEdit, collectionName, adminsOnly, filterQuery, } = props;
40077
40092
  /* -------------- State ------------- */
40078
40093
  // Initial state
40079
40094
  const initialState = {
@@ -40209,7 +40224,7 @@ const DBEntryManagerPanel = (props) => {
40209
40224
  }
40210
40225
  /* --------- Create or edit entry -------- */
40211
40226
  if (!loading && (adding || dbEntryToEdit)) {
40212
- body = (React__default.createElement(AddOrEditDBEntry, { saveEndpointPath: endpoint, validateEntry: validateEntry, modifyEntry: modifyEntry, entryFields: entryFields, dbEntryToEdit: dbEntryToEdit, idPropName: idPropName, entries: dbEntries, onFinished: (entry) => {
40227
+ body = (React__default.createElement(AddOrEditDBEntry, { saveEndpointPath: endpoint, validateEntry: validateEntry, modifyEntry: modifyEntry, entryFields: entryFields, dbEntryToEdit: dbEntryToEdit, idPropName: idPropName, entries: dbEntries, itemName: itemName, onFinished: (entry) => {
40213
40228
  dispatch({
40214
40229
  type: ActionType.FinishAdd,
40215
40230
  dbEntry: entry,