diff --git a/frontend/packages/volto-workflow-manager/src/components/Workflow/WorkflowSidebar.tsx b/frontend/packages/volto-workflow-manager/src/components/Workflow/WorkflowSidebar.tsx index 6336e24..c06a061 100644 --- a/frontend/packages/volto-workflow-manager/src/components/Workflow/WorkflowSidebar.tsx +++ b/frontend/packages/volto-workflow-manager/src/components/Workflow/WorkflowSidebar.tsx @@ -1,14 +1,6 @@ -import { useState, Fragment, useCallback, useMemo } from 'react'; +import { useState, Fragment, useCallback } from 'react'; import PropTypes from 'prop-types'; -import { - ActionButton, - Button, - Flex, - Item, - TabList, - TabPanels, - Tabs, -} from '@adobe/react-spectrum'; +import { Button, Tab } from 'semantic-ui-react'; import { useDispatch, useSelector } from 'react-redux'; import { compose } from 'redux'; import { withCookies } from 'react-cookie'; @@ -17,22 +9,24 @@ import cx from 'classnames'; import BodyClass from '@plone/volto/helpers/BodyClass/BodyClass'; import { getCookieOptions } from '@plone/volto/helpers/Cookies/cookies'; import Icon from '@plone/volto/components/theme/Icon/Icon'; +import forbiddenSVG from '@plone/volto/icons/forbidden.svg'; import { setSidebarTab } from '@plone/volto/actions/sidebar/sidebar'; import expandSVG from '@plone/volto/icons/left-key.svg'; import collapseSVG from '@plone/volto/icons/right-key.svg'; +import { useClient } from '@plone/volto/hooks/client/useClient'; +import { createPortal } from 'react-dom'; import WorkflowTab from './WorkflowTab'; import State from '../States/State'; import Transition from '../Transitions/Transition'; -import type { GlobalRootState } from 'volto-workflow-manager/types'; const messages = defineMessages({ - document: { - id: 'Document', - defaultMessage: 'Document', + workflow: { + id: 'Workflow', + defaultMessage: 'Workflow', }, - block: { - id: 'Block', - defaultMessage: 'Block', + state: { + id: 'State', + defaultMessage: 'State', }, settings: { id: 'Settings', @@ -46,18 +40,6 @@ const messages = defineMessages({ id: 'Expand sidebar', defaultMessage: 'Expand sidebar', }, - order: { - id: 'Order', - defaultMessage: 'Order', - }, - workflow: { - id: 'Workflow', - defaultMessage: 'Workflow', - }, - states: { - id: 'States', - defaultMessage: 'States', - }, transitions: { id: 'Transitions', defaultMessage: 'Transitions', @@ -66,17 +48,12 @@ const messages = defineMessages({ const Sidebar = (props) => { const dispatch = useDispatch(); - const { currentWorkflow, onDataChange, isDisabled } = props; - const selectedItem = useSelector( - (state: GlobalRootState) => state.workflow.selectedItem, - ); - const intl = useIntl(); const { cookies, content, workflowTab = true, - statesTab = true, + stateTab = true, transitionsTab = true, } = props; const [expanded, setExpanded] = useState( @@ -84,10 +61,11 @@ const Sidebar = (props) => { ); const [size] = useState(0); const [showFull, setshowFull] = useState(true); - - const tabIndex = useSelector((state) => state?.sidebar.tab); - const toolbarExpanded = useSelector((state) => state?.toolbar.expanded); - + const isClient = useClient(); + const tab = useSelector((state) => state.sidebar.tab); + const toolbarExpanded = useSelector((state) => state.toolbar.expanded); + const type = useSelector((state) => state.schema?.schema?.title); + const { currentWorkflow, onDataChange, isDisabled } = props; const onToggleExpanded = () => { cookies.set('sidebar_expanded', !expanded, getCookieOptions()); setExpanded(!expanded); @@ -124,65 +102,9 @@ const Sidebar = (props) => { setshowFull(!showFull); }, [showFull, toolbarExpanded]); - const workflowTabs = useMemo( - () => - [ - workflowTab && { - key: 'workflow', - title: intl.formatMessage(messages.workflow), - content: ( - onDataChange(payload, 'workflow')} - isDisabled={isDisabled} - /> - ), - }, - statesTab && { - key: 'states', - title: intl.formatMessage(messages.states), - content: ( - onDataChange(payload, 'state')} - isDisabled={isDisabled} - /> - ), - }, - transitionsTab && { - key: 'transitions', - title: intl.formatMessage(messages.transitions), - content: ( - onDataChange(payload, 'transition')} - isDisabled={isDisabled} - /> - ), - }, - ].filter(Boolean), - // eslint-disable-next-line react-hooks/exhaustive-deps - [ - onDataChange, - workflowTab, - statesTab, - transitionsTab, - intl, - currentWorkflow, - isDisabled, - selectedItem, - ], - ); - - const selectedKey = workflowTabs[tabIndex]?.key; - - const handleTabChange = (key) => { - const newIndex = workflowTabs.findIndex((tab) => tab.key === key); - if (newIndex > -1) { - dispatch(setSidebarTab(newIndex)); - } + const onTabChange = (event, data) => { + event.nativeEvent.stopImmediatePropagation(); + dispatch(setSidebarTab(data.activeIndex)); }; return ( @@ -195,67 +117,135 @@ const Sidebar = (props) => { style={size > 0 ? { width: size } : null} > + + ), + }, + !!stateTab && { + menuItem: { + key: 'stateTab', + as: 'button', + className: 'ui button', + content: intl.formatMessage(messages.state), + }, + pane: ( + + + + ), + }, + !!transitionsTab && { + menuItem: intl.formatMessage(messages.transitions), + pane: ( + + + + ), + }, + ].filter((tab) => tab)} + />
+ {isClient && + createPortal( + { + onDataChange(payload, 'workflow'); + }} + isDisabled={isDisabled} + />, + document.getElementById('sidebar-workflow'), + )} + {isClient && + createPortal( + onDataChange(payload, 'state')} + isDisabled={isDisabled} + />, + document.getElementById('sidebar-state'), + )} + {isClient && + createPortal( + onDataChange(payload, 'transition')} + isDisabled={isDisabled} + />, + document.getElementById('sidebar-transition'), + )} ); }; Sidebar.propTypes = { - currentWorkflow: PropTypes.object.isRequired, - onDataChange: PropTypes.func.isRequired, - isDisabled: PropTypes.bool.isRequired, documentTab: PropTypes.bool, blockTab: PropTypes.bool, settingsTab: PropTypes.bool, diff --git a/frontend/packages/volto-workflow-manager/src/components/Workflow/WorkflowTab.tsx b/frontend/packages/volto-workflow-manager/src/components/Workflow/WorkflowTab.tsx index 46b35aa..4ade4c9 100644 --- a/frontend/packages/volto-workflow-manager/src/components/Workflow/WorkflowTab.tsx +++ b/frontend/packages/volto-workflow-manager/src/components/Workflow/WorkflowTab.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect, useCallback } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { View, ProgressCircle } from '@adobe/react-spectrum'; -import BlockDataForm from '@plone/volto/components/manage/Form/BlockDataForm'; +import Form from '@plone/volto/components/manage/Form/Form'; import { getWorkflow } from '../../actions/workflow'; import type { GlobalRootState } from '../../types'; import type { WorkflowTabProps } from '../../types/workflow'; @@ -69,26 +69,28 @@ const WorkflowTab: React.FC = ({ } else { onDataChange(formData); } - }, [formData, currentWorkflow, workflowId, onDataChange]); + }, [formData, currentWorkflow, workflowId]); - const handleChangeField = useCallback((id: string, value: any) => { - setFormData((prevData) => ({ - ...(prevData ?? { title: '', description: '' }), - [id]: value, - })); - }, []); + const handleChangeField = useCallback( + (data: any) => { + setFormData(data); + }, + [dispatch, workflowId], + ); if (!formData) { return ; } - + console.log('formData', formData); return ( - ); diff --git a/frontend/packages/volto-workflow-manager/src/components/Workflow/WorkflowView.tsx b/frontend/packages/volto-workflow-manager/src/components/Workflow/WorkflowView.tsx index 2e80c9c..bb93913 100644 --- a/frontend/packages/volto-workflow-manager/src/components/Workflow/WorkflowView.tsx +++ b/frontend/packages/volto-workflow-manager/src/components/Workflow/WorkflowView.tsx @@ -1,5 +1,4 @@ import { - Button, ProgressCircle, Text, Form, @@ -13,6 +12,7 @@ import '@xyflow/react/dist/style.css'; import { Link } from 'react-router-dom'; import { useAppSelector } from '../../types'; import ActionsToolbar from './ActionsToolbar'; +import { Button } from '@plone/components'; import Icon from '@plone/volto/components/theme/Icon/Icon'; import save from '@plone/volto/icons/save.svg'; import back from '@plone/volto/icons/back.svg'; @@ -21,14 +21,20 @@ import { createPortal } from 'react-dom'; import { useClient } from '@plone/volto/hooks/client/useClient'; import type { WorkflowViewProps } from '../../types/workflow'; import WorkflowSidebar from './WorkflowSidebar'; -import React, { useState, useCallback, useEffect, useRef } from 'react'; +import React, { + useState, + useCallback, + useEffect, + useRef, + useDebugValue, +} from 'react'; import { useDispatch } from 'react-redux'; import { updateState } from '../../actions/state'; import { updateTransition } from '../../actions/transition'; import { getWorkflow, updateWorkflow } from '../../actions/workflow'; import { toast } from 'react-toastify'; import Toast from '@plone/volto/components/manage/Toast/Toast'; - +import Hello from './Hello'; const WorkflowView: React.FC = ({ workflowId, pathname, @@ -104,21 +110,22 @@ const WorkflowView: React.FC = ({ prevIsDeletingTransition.current = isDeletingTransition; }, [isDeleting, isDeletingState, isDeletingTransition, dispatch, workflowId]); - const handleDataChange = useCallback( - (payload: any | null, kind: 'workflow' | 'state' | 'transition') => { - if (payload) { - setPayloadToSave({ payload, kind }); - } else { - setPayloadToSave(null); - } - }, - [], - ); + const handleDataChange = ( + payload: any | null, + kind: 'workflow' | 'state' | 'transition', + ) => { + if (payload && kind) { + console.log('data change', kind, payload); + const newPayloadData = { payload, kind }; - const handleSave = useCallback(() => { + setPayloadToSave(newPayloadData); + } + }; + const handleSave = () => { if (!payloadToSave || !workflowId) return; const { payload, kind } = payloadToSave; + console.log('handle save', kind, payload); if (kind === 'workflow') { dispatch(updateWorkflow(workflowId, payload)); @@ -127,7 +134,7 @@ const WorkflowView: React.FC = ({ } else if (kind === 'transition') { dispatch(updateTransition(workflowId, payload.id, payload)); } - }, [dispatch, payloadToSave, workflowId]); + }; if (isLoading || !workflow || workflow.id !== workflowId) { return ( @@ -186,9 +193,8 @@ const WorkflowView: React.FC = ({