diff --git a/components/common/TransferBox/TransferBox.jsx b/components/common/TransferBox/TransferBox.jsx index 60cea62..0ca1d24 100644 --- a/components/common/TransferBox/TransferBox.jsx +++ b/components/common/TransferBox/TransferBox.jsx @@ -5,6 +5,70 @@ import DoNotDisturbIcon from '@mui/icons-material/DoNotDisturb'; import KeyboardArrowLeftIcon from '@mui/icons-material/KeyboardArrowLeft'; import KeyboardArrowRightIcon from '@mui/icons-material/KeyboardArrowRight'; +const OuterShell = styled('div')` + display: flex; + flex-direction: row; + width: 100%; + justify-content: space-around; +`; + +const TransferShell = styled('div')` + display: flex; + flex-direction: column; + width: 100%; + align-items: center; + padding: 5px; +`; + +const TransferButtonShell = styled('div')` + display: flex; + flex-direction: column; + width: 25%; + align-items: center; + justify-content: center; +`; + +const TransferHeader = styled('div')` + padding-bottom: 10px; +`; + +const TransferOuterBox = styled('div')` + display: flex; + width: 200px; + height: 250px; + border: 1px solid black; + border-radius: 5px; + background-color: #E8E8E8; +`; + +const TransferInnerBox = styled('div')` + display: flex; + flex-direction: column; + padding: 5px; +`; + +const TransferBoxItem = styled('div')` + display: flex; + align-items: center; + width: 188px; + padding: 2px 4px; + background-color: ${({ isSelected }) => (isSelected ? '#D3D3D3' : 'transparent')}; + cursor: ${({ disabled }) => (disabled ? 'not-allowed' : 'pointer')}; + color: ${({ disabled }) => (disabled ? '#999' : 'inherit')}; + border-radius: 4px; + overflow: hidden; + user-select: ${({ disabled }) => (disabled ? 'none' : 'auto')}; + opacity: ${({ disabled }) => (disabled ? 0.5 : 1)}; +`; + +const TransferBoxLabel = styled('span')` + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex: 1; + min-width: 0; +`; + const CenterButton = styled('div')` display: flex; justify-content: center; @@ -26,7 +90,21 @@ const CenterButton = styled('div')` `} `; -export const TransferBox = ({ fields, leftGroup, rightGroup }) => { +const sortByLastThenFirst = (arr) => { + return [...arr].sort((a, b) => { + const [aLast, aFirst] = a.value.split(',').map(s => s.trim()); + const [bLast, bFirst] = b.value.split(',').map(s => s.trim()); + + if (aLast < bLast) return -1; + if (aLast > bLast) return 1; + if (aFirst < bFirst) return -1; + if (aFirst > bFirst) return 1; + return 0; + }); +}; + + +export const TransferBox = ({ fields, leftGroup, rightGroup, onSave, user={} }) => { const { id, exclusionList, @@ -35,104 +113,141 @@ export const TransferBox = ({ fields, leftGroup, rightGroup }) => { } = fields; const [itemSelected, setItemSelected] = useState({}); - const [containsSelection, setContainsSelection] = useState([]); + const [leftItems, setLeftItems] = useState(sortByLastThenFirst(leftGroup || [])); + const [rightItems, setRightItems] = useState(sortByLastThenFirst(rightGroup || [])); + + const handleItemClick = (item, side) => { + setItemSelected({ ...item, from: side }); + }; + + const arraysEqual = (a, b) => { + if (a.length !== b.length) return false; + const aIds = a.map(i => i.id).sort(); + const bIds = b.map(i => i.id).sort(); + return JSON.stringify(aIds) === JSON.stringify(bIds); + }; + + const isLeftArrowEnabled = itemSelected?.from === 'right'; + const isRightArrowEnabled = itemSelected?.from === 'left'; + + const hasChanges = !arraysEqual(leftItems, leftGroup) || !arraysEqual(rightItems, rightGroup); return ( -
-
-
+ + +

{oldListLabel}

-
-
-
- {leftGroup?.map((j, index) => { + + + + {leftItems?.filter(leftItem => !rightItems.some(rightItem => rightItem.id === leftItem.id))?.map((j) => { + const isUser = user?.id === j?.id; + const isSelected = itemSelected?.id === j?.id && itemSelected?.from === 'left' && !isUser; return ( -
{ + if (isUser) return; + handleItemClick(j, 'left'); }} title={j?.value} > - {j?.value} -
+ + {j?.value} + + ) })} -
-
-
-
+ + + + { console.log('clicked Right') }} + onClick={() => { + if (!itemSelected) return; + if (itemSelected.from === 'left') { + setLeftItems(prev => prev.filter(item => item.id !== itemSelected.id)); + setRightItems(prev => sortByLastThenFirst([ + ...rightItems.filter(item => item.id !== itemSelected.id), + itemSelected + ])); + } + setItemSelected({}); + }} color='#A8A8A8' - buttonEnabled={itemSelected?.id} + buttonEnabled={isRightArrowEnabled} > { console.log('clicked Clear') }} + onClick={() => { + setLeftItems(sortByLastThenFirst(leftGroup)); + setRightItems(sortByLastThenFirst(rightGroup)); + setItemSelected({}); + }} color='#FF6666' - buttonEnabled={containsSelection?.length > 0} + buttonEnabled={hasChanges} > { console.log('clicked Save') }} + onClick={() => { + return onSave(rightItems?.map((item) => { return item?.id })) + }} color='#00B33C' - buttonEnabled={containsSelection?.length > 0} + buttonEnabled={hasChanges} > { console.log('clicked Left') }} + onClick={() => { + if (!itemSelected) return; + if (itemSelected.from === 'right') { + setRightItems(prev => prev.filter(item => item.id !== itemSelected.id)); + setLeftItems(prev => sortByLastThenFirst([ + ...leftItems.filter(item => item.id !== itemSelected.id), + itemSelected + ])); + } + setItemSelected({}); + }} color='#A8A8A8' - buttonEnabled={itemSelected?.id} + buttonEnabled={isLeftArrowEnabled} > -
-
-
+ + +

{newListLabel}

-
-
-
- {rightGroup?.map((j, index) => { + + + + {rightItems?.map((j) => { + const isUser = user?.id === j?.id; + const isSelected = itemSelected?.id === j?.id && itemSelected?.from === 'right' && !isUser; return ( -
{ + if (isUser) return; + handleItemClick(j, 'right'); }} title={j?.value} > - {j?.value} -
+ + {j?.value} + + ) })} -
-
-
-
+ + + + ); } \ No newline at end of file diff --git a/src/pages/Settings/Settings.jsx b/src/pages/Settings/Settings.jsx index 0b2d27d..c74f7ca 100644 --- a/src/pages/Settings/Settings.jsx +++ b/src/pages/Settings/Settings.jsx @@ -285,8 +285,22 @@ export const Settings = () => { }, [pageValue?.id, windowWidth, window.innerHeight]); useEffect(() => { - setPageValue(settingsFields?.filter((field) => field?.tab === tabValue?.value)[0]); - }, [tabValue]); + const filteredFields = settingsFields?.filter((field) => { + const hasAccess = + (field?.accessRequired === 'administrator' && isAdministrator) || + (field?.accessRequired === 'manager' && isManager) || + (field?.accessRequired === 'scheduler' && isScheduler) || + (!field?.accessRequired || field?.accessRequired === 'user'); + + return field?.tab === tabValue?.value && hasAccess; + }); + + if (filteredFields.length > 0) { + setPageValue(filteredFields[0]); + } else { + setPageValue(null); + } + }, [tabValue, isAdministrator, isManager, isScheduler]); return (
@@ -433,9 +447,11 @@ export const Settings = () => { } else if (field?.type === 'transfer') { fieldType = console.log(t)} /> } return field?.type !== 'header' && ( diff --git a/src/pages/Settings/helpers.js b/src/pages/Settings/helpers.js index 1a5b1c0..535d82c 100644 --- a/src/pages/Settings/helpers.js +++ b/src/pages/Settings/helpers.js @@ -85,22 +85,22 @@ export const settingsFields = [ title: 'Roles', tab: 'department', cards: [ - { - id: 'companyAdmins', - label: 'Company Administrators', - fields: [ - { - id: 'administrators', - type: 'transfer', - exclusionList: [], - origList: 'users', - oldListLabel: 'Users', - newListLabel: 'Administrators' - }, - ], - accessRequired: 'administrator', - removeEdit: true - }, + // Need to decide if Admins should be able to Add other Admins + // { + // id: 'companyAdmins', + // label: 'Company Administrators', + // fields: [ + // { + // id: 'administrators', + // type: 'transfer', + // origList: 'users', + // oldListLabel: 'Users', + // newListLabel: 'Administrators' + // }, + // ], + // accessRequired: 'administrator', + // removeEdit: true + // }, { id: 'companyMgrs', label: 'Company Managers', @@ -108,9 +108,6 @@ export const settingsFields = [ { id: 'managers', type: 'transfer', - exclusionList: [ - 'administrators' - ], origList: 'users', oldListLabel: 'Users', newListLabel: 'Managers' @@ -126,10 +123,6 @@ export const settingsFields = [ { id: 'schedulers', type: 'transfer', - exclusionList: [ - 'administrators', - 'managers' - ], origList: 'users', oldListLabel: 'Users', newListLabel: 'Schedulers'