/**
* WordPress dependencies
*/
import { useState } from '@safe-wordpress/element';
import { DropdownMenu, type DropdownOption } from '@safe-wordpress/components';
import { _x } from '@safe-wordpress/i18n';
/**
* External dependencies
*/
import { v4 as uuid } from 'uuid';
import { css } from '@nelio/forms/css';
import { useActionTypes } from '@nelio/forms/actions';
import { isPremium, makePremiumLabel } from '@nelio/forms/utils';
import type { ActionInstance } from '@nelio/forms/types';
/**
* Internal dependencies
*/
import { ActionItem } from './action-item';
import { EditActionModal } from './edit-action-modal';
export type ActionListControlProps = {
readonly formId: number;
readonly actions: ReadonlyArray< ActionInstance >;
readonly setActions: ( actions: ReadonlyArray< ActionInstance > ) => void;
};
export const ActionListControl = (
props: ActionListControlProps
): JSX.Element => {
const [ editAction, setEditAction ] = useState< ActionInstance >();
const { formId, actions, setActions } = props;
const isDeleteActive = actions.length > 1;
const duplicate = ( a: ActionInstance ): ActionInstance => ( {
...a,
id: uuid(),
name: `(${ _x( 'copy', 'text', 'nelio-forms' ) }) ${ a.name }`.trim(),
} );
return (
<>
{ actions.map( ( action, index ) => (
setActions(
[ ...actions ].map( ( a ) =>
a.id === action.id
? {
...action,
isActive: ! action.isActive,
}
: a
)
)
}
onEdit={ () => setEditAction( action ) }
onDuplicate={ () =>
setActions( [
...actions.slice( 0, index + 1 ),
duplicate( action ),
...actions.slice( index + 1 ),
] )
}
onRemove={ () =>
setActions(
[ ...actions ].filter(
( a ) => a.id !== action.id
)
)
}
/>
) ) }
{ !! editAction && (
setEditAction( undefined ) }
onSave={ ( newAction ) => {
if ( actions.includes( editAction ) ) {
setActions(
[ ...actions ].map( ( a ) =>
a.id === newAction.id ? newAction : a
)
);
} else {
setActions( [ ...actions, newAction ] );
} //end if
setEditAction( undefined );
} }
/>
) }
>
);
};
type AddActionControlProps = {
readonly actions: ReadonlyArray< ActionInstance >;
readonly onAdd: ( action: ActionInstance ) => void;
};
const AddActionControl = ( props: AddActionControlProps ): JSX.Element => {
const { actions, onAdd } = props;
const actionTypes = useActionTypes();
const controls = actionTypes.map( ( actionType ) => {
const { label, isPremium: isPremiumAction, icon, type } = actionType;
const isDisabled =
actionType.isDisabled ||
( actionType.isUnique &&
actions.some( ( a ) => a.type === actionType.type ) );
return {
title:
isPremiumAction && ! isPremium()
? makePremiumLabel( label )
: label,
icon,
isDisabled,
onClick: () =>
! isDisabled &&
onAdd( {
type,
name: label,
id: uuid(),
isActive: true,
attributes: actionType.defaults,
} ),
} as DropdownOption;
} );
return (
);
};
// ======
// STYLES
// ======
const ACTION_LIST = css( {
display: 'flex',
flexDirection: 'column',
gap: '0.5em',
} );
const ADD_DROPDOWN = css( {
width: '100%',
marginTop: '1em',
textAlign: 'center',
'.components-dropdown-menu__toggle > .dashicon': {
display: 'none',
},
} );