Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FIX] Changes on department agents should mark form as dirty #19640

Merged
merged 10 commits into from Dec 21, 2021
Merged
3 changes: 2 additions & 1 deletion client/views/omnichannel/departments/AddAgent.js
Expand Up @@ -7,7 +7,7 @@ import { useToastMessageDispatch } from '../../../contexts/ToastMessagesContext'
import { useTranslation } from '../../../contexts/TranslationContext';
import { useEndpointAction } from '../../../hooks/useEndpointAction';

function AddAgent({ agentList, setAgentList, ...props }) {
function AddAgent({ agentList, setAgentsAdded, setAgentList, ...props }) {
const t = useTranslation();
const [userId, setUserId] = useState();
const getAgent = useEndpointAction('GET', `livechat/users/agent/${userId}`);
Expand All @@ -24,6 +24,7 @@ function AddAgent({ agentList, setAgentList, ...props }) {
if (agentList.filter((e) => e.agentId === user._id).length === 0) {
setAgentList([{ ...user, agentId: user._id }, ...agentList]);
setUserId();
setAgentsAdded((agents) => [...agents, { agentId: user._id }]);
} else {
dispatchToastMessage({ type: 'error', message: t('This_agent_was_already_selected') });
}
Expand Down
18 changes: 16 additions & 2 deletions client/views/omnichannel/departments/AgentRow.js
Expand Up @@ -6,7 +6,16 @@ import Count from './Count';
import Order from './Order';
import RemoveAgentButton from './RemoveAgentButton';

const AgentRow = ({ agentId, username, name, avatarETag, mediaQuery, agentList, setAgentList }) => (
const AgentRow = ({
agentId,
username,
name,
avatarETag,
mediaQuery,
agentList,
setAgentList,
setAgentsRemoved,
}) => (
<Table.Row key={agentId} tabIndex={0} role='link' action qa-user-id={agentId}>
<Table.Cell withTruncatedText>
<Box display='flex' alignItems='center'>
Expand Down Expand Up @@ -38,7 +47,12 @@ const AgentRow = ({ agentId, username, name, avatarETag, mediaQuery, agentList,
<Order agentId={agentId} agentList={agentList} setAgentList={setAgentList} />
</Table.Cell>
<Table.Cell fontScale='p3' color='hint'>
<RemoveAgentButton agentId={agentId} agentList={agentList} setAgentList={setAgentList} />
<RemoveAgentButton
agentId={agentId}
agentList={agentList}
setAgentList={setAgentList}
setAgentsRemoved={setAgentsRemoved}
/>
</Table.Cell>
</Table.Row>
);
Expand Down
Expand Up @@ -6,7 +6,7 @@ import { useTranslation } from '../../../contexts/TranslationContext';
import AddAgent from './AddAgent';
import AgentRow from './AgentRow';

function DepartmentsAgentsTable({ agents, setAgentListFinal }) {
function DepartmentsAgentsTable({ agents, setAgentListFinal, setAgentsAdded, setAgentsRemoved }) {
const t = useTranslation();
const [agentList, setAgentList] = useState((agents && JSON.parse(JSON.stringify(agents))) || []);

Expand All @@ -16,7 +16,7 @@ function DepartmentsAgentsTable({ agents, setAgentListFinal }) {

return (
<>
<AddAgent agentList={agentList} setAgentList={setAgentList} />
<AddAgent agentList={agentList} setAgentList={setAgentList} setAgentsAdded={setAgentsAdded} />
<GenericTable
header={
<>
Expand Down Expand Up @@ -44,6 +44,7 @@ function DepartmentsAgentsTable({ agents, setAgentListFinal }) {
mediaQuery={mediaQuery}
agentList={agentList}
setAgentList={setAgentList}
setAgentsRemoved={setAgentsRemoved}
{...props}
/>
)}
Expand Down
38 changes: 37 additions & 1 deletion client/views/omnichannel/departments/EditDepartment.js
Expand Up @@ -57,6 +57,8 @@ function EditDepartment({ data, id, title, reload, allowedToForwardData }) {
const DepartmentBusinessHours = useDepartmentBusinessHours();
const AutoCompleteDepartment = useSelectForwardDepartment();
const [agentList, setAgentList] = useState([]);
const [agentsRemoved, setAgentsRemoved] = useState([]);
const [agentsAdded, setAgentsAdded] = useState([]);

const { department } = data || { department: {} };

Expand Down Expand Up @@ -257,6 +259,33 @@ function EditDepartment({ data, id, title, reload, allowedToForwardData }) {
[data.agents, agentList],
);

const agentsHaveChanged = () => {
let hasChanges = false;
if (agentList.length !== initialAgents.current.length) {
hasChanges = true;
}

if (agentsAdded.length > 0 && agentsRemoved.length > 0) {
hasChanges = true;
}

agentList.forEach((agent) => {
const existingAgent = initialAgents.current.find(
(initial) => initial.agentId === agent.agentId,
);
if (existingAgent) {
if (agent.count !== existingAgent.count) {
hasChanges = true;
}
if (agent.order !== existingAgent.order) {
hasChanges = true;
}
}
});

return hasChanges;
};

return (
<Page flexDirection='row'>
<Page>
Expand All @@ -265,7 +294,12 @@ function EditDepartment({ data, id, title, reload, allowedToForwardData }) {
<Button onClick={handleReturn}>
<Icon name='back' /> {t('Back')}
</Button>
<Button type='submit' form={formId} primary disabled={invalidForm && hasNewAgent}>
<Button
type='submit'
form={formId}
primary
disabled={invalidForm && hasNewAgent && !(id && agentsHaveChanged())}
>
{t('Save')}
</Button>
</ButtonGroup>
Expand Down Expand Up @@ -480,6 +514,8 @@ function EditDepartment({ data, id, title, reload, allowedToForwardData }) {
<DepartmentsAgentsTable
agents={data && data.agents}
setAgentListFinal={setAgentList}
setAgentsAdded={setAgentsAdded}
setAgentsRemoved={setAgentsRemoved}
/>
</Box>
</Field>
Expand Down
3 changes: 2 additions & 1 deletion client/views/omnichannel/departments/RemoveAgentButton.js
Expand Up @@ -7,7 +7,7 @@ import { useSetModal } from '../../../contexts/ModalContext';
import { useToastMessageDispatch } from '../../../contexts/ToastMessagesContext';
import { useTranslation } from '../../../contexts/TranslationContext';

function RemoveAgentButton({ agentId, setAgentList, agentList }) {
function RemoveAgentButton({ agentId, setAgentList, agentList, setAgentsRemoved }) {
const setModal = useSetModal();
const dispatchToastMessage = useToastMessageDispatch();
const t = useTranslation();
Expand All @@ -19,6 +19,7 @@ function RemoveAgentButton({ agentId, setAgentList, agentList }) {
setAgentList(newList);
dispatchToastMessage({ type: 'success', message: t('Agent_removed') });
setModal();
setAgentsRemoved((agents) => [...agents, { agentId }]);
};

setModal(
Expand Down