Untitled

 avatar
unknown
plain_text
2 years ago
6.4 kB
3
Indexable
import React from 'react';
import GeneralHelper from 'system/helpers/GeneralHelper';
import findByType from 'system/utils/FindByType';
import appSettingsConstants from 'system/constants/constants';
import useEntityType from 'system/hooks/useEntityType';

const EntityFormButtons = (
  entityState,
  detailContextState,
  SaveActionButtons,
  CustomActionButtons,
  CustomActionButtonsWithConfirmationModal,
  DeleteActionButtons,
  CopyActionButtons,
  saveWithFieldUpdate,
  setSaveClicked,
  setShowDeleteModal,
  hasErrors,
  children
) => {
  const [entityType] = useEntityType(entityState.entity.entityTypeCode);

  const isSingleGrid = () => {
    if (detailContextState && GeneralHelper.isEmpty(detailContextState.detail)) return true;

    if (
      detailContextState &&
      detailContextState.detail.parts.length === 1 &&
      (detailContextState.detail.parts[0].relationshipDisplayType ===
        appSettingsConstants.relationship.relationshipDisplay.grid ||
        detailContextState.detail.parts[0].relationshipDisplayType ===
          appSettingsConstants.relationship.relationshipDisplay.externalEntity)
    )
      return true;

    return false;
  };

  const onClickDelete = (e) => {
    e.preventDefault();
    setShowDeleteModal(true);
  };

  const renderSaveActionButtons = () => {
    if (entityState.displayMode === appSettingsConstants.displayMode.view) return null;

    if (isSingleGrid()) return null;

    const actionBtns = findByType(children, SaveActionButtons);

    if (!actionBtns) return null;

    const saveActionBtns = [];

    React.Children.map(actionBtns.props.children, (actionBtn) => {
      let isHidden = false;
      if (actionBtn.props.isHidden) isHidden = actionBtn.props.isHidden(entityState.entity);
      if (!isHidden) {
        saveActionBtns.push(
          React.cloneElement(actionBtn, {
            onClick: (e) => {
              e.preventDefault();

              if (actionBtn.props.onClick) {
                if (actionBtn.props.triggerSaveWithFieldUpdate) {
                  const updatedField = actionBtn.props.onClick(entityState.entity);
                  actionBtn.props.disabled(entityState.isLoading);
                  saveWithFieldUpdate(updatedField);
                } else {
                  actionBtn.props.onClick(entityState.entity);
                  actionBtn.props.disabled(entityState.isLoading);
                }
              } else if (!actionBtn.props.items) {
                setSaveClicked();
                actionBtn.props.disabled(entityState.isLoading);
              }
            },
            key: actionBtn.props.title,
          })
        );
      }
    });

    return saveActionBtns;
  };

  const renderCustomActionButtons = () => {
    if (isSingleGrid()) return null;

    const actionBtns = findByType(children, CustomActionButtons);

    if (!actionBtns) return null;

    const customActionBtns = [];

    React.Children.map(actionBtns.props.children, (actionBtn) => {
      if (actionBtn) {
        let isHidden = false;

        if (actionBtn.props.isHidden)
          isHidden = actionBtn.props.isHidden(entityState.entity, entityState.displayMode, entityState.permissions);

        if (!isHidden)
          customActionBtns.push(
            React.cloneElement(actionBtn, {
              onClick: () => {
                if (actionBtn.props.triggerValidation === true && hasErrors()) return;
                if (actionBtn.props.triggerSaveWithFieldUpdate) {
                  const updatedField = actionBtn.props.onClick(entityState.entity);
                  saveWithFieldUpdate(updatedField);
                } else actionBtn.props.onClick(entityState.entity);
              },
              key: actionBtn.props.title,
            })
          );
      }
    });

    return customActionBtns;
  };

  const renderCustomActionButtonsWithConfirmationModal = () => {
    if (isSingleGrid()) return null;

    const actionBtns = findByType(children, CustomActionButtonsWithConfirmationModal);

    if (!actionBtns) return null;

    const customActionBtnsWithConfirmationModal = [];

    React.Children.map(actionBtns.props.children, (actionBtn) => {
      let isHidden = false;
      if (actionBtn.props.isHidden)
        isHidden = actionBtn.props.isHidden(entityState.entity, entityState.displayMode, entityState.permissions);

      if (!isHidden) customActionBtnsWithConfirmationModal.push(React.cloneElement(actionBtn));
    });

    return customActionBtnsWithConfirmationModal;
  };

  const renderDeleteActionButtons = () => {
    if (entityState.displayMode === appSettingsConstants.displayMode.view) return null;

    if (isSingleGrid()) return null;

    const actionBtns = findByType(children, DeleteActionButtons);

    if (!actionBtns) return null;

    const deleteActionBtns = [];

    React.Children.map(actionBtns.props.children, (actionBtn) => {
      let isHidden = false;
      if (actionBtn.props.isHidden) isHidden = actionBtn.props.isHidden(entityState.entity);
      if (!isHidden)
        deleteActionBtns.push(React.cloneElement(actionBtn, { onClick: onClickDelete, key: actionBtn.props.title }));
    });

    return deleteActionBtns;
  };

  const renderCopyActionButtons = (handleCopy) => {
    if (entityState.displayMode === appSettingsConstants.displayMode.view || !entityType?.canBeCopied) return null;
    if (isSingleGrid()) return null;
    const actionBtns = findByType(children, CopyActionButtons);
    if (!actionBtns) return null;
    const copyActionBtns = [];
    React.Children.map(actionBtns.props.children, (actionBtn) => {
      let isHidden = false;
      if (actionBtn.props.isHidden) isHidden = actionBtn.props.isHidden(entityState.entity, entityState.displayMode);
      if (!isHidden)
        copyActionBtns.push(
          React.cloneElement(actionBtn, {
            onClick: () => handleCopy(entityState.entity.id),
            key: actionBtn.props.title,
          })
        );
    });

    return copyActionBtns;
  };

  return {
    renderSaveActionButtons,
    renderCustomActionButtons,
    renderCustomActionButtonsWithConfirmationModal,
    renderDeleteActionButtons,
    renderCopyActionButtons,
  };
};

export default EntityFormButtons;
Editor is loading...