From a992b334d3d3e8a7ffdcf4b3ba5dd2b60cf20b93 Mon Sep 17 00:00:00 2001 From: Aleksander Nicacio da Silva Date: Tue, 7 Mar 2023 13:18:39 -0300 Subject: [PATCH] [BREAK] Update livechat:saveDepartment to accept a string array in departmentsAllowedToForward (#28261) Co-authored-by: Murtaza Patrawala <34130764+murtaza98@users.noreply.github.com> --- .../client/components/AutoCompleteDepartment.tsx | 9 ++------- .../views/omnichannel/analytics/AnalyticsPage.js | 6 +++--- .../views/omnichannel/currentChats/FilterByText.tsx | 6 +++--- .../views/omnichannel/departments/EditDepartment.js | 4 ++-- .../EditDepartmentWithAllowedForwardData.js | 5 +---- .../views/omnichannel/queueList/QueueListFilter.tsx | 6 +++--- .../realTimeMonitoring/RealTimeMonitoringPage.js | 8 ++++---- .../server/lib/LivechatEnterprise.js | 1 + .../ee/app/models/server/models/LivechatDepartment.js | 3 --- .../omnichannel/cannedResponses/CannedResponseEdit.tsx | 10 ++++------ .../modals/CreateCannedResponse/index.tsx | 4 ++-- packages/core-typings/src/ILivechatDepartment.ts | 1 + packages/core-typings/src/ILivechatDepartmentRecord.ts | 1 + packages/rest-typings/src/v1/omnichannel.ts | 3 +-- 14 files changed, 28 insertions(+), 39 deletions(-) diff --git a/apps/meteor/client/components/AutoCompleteDepartment.tsx b/apps/meteor/client/components/AutoCompleteDepartment.tsx index de9e290d750..b4017b954ee 100644 --- a/apps/meteor/client/components/AutoCompleteDepartment.tsx +++ b/apps/meteor/client/components/AutoCompleteDepartment.tsx @@ -9,7 +9,7 @@ import { AsyncStatePhase } from '../hooks/useAsyncState'; import { useDepartmentsList } from './Omnichannel/hooks/useDepartmentsList'; type AutoCompleteDepartmentProps = { - value?: { value: string; label: string } | string; + value?: string; onChange: (value: string) => void; excludeDepartmentId?: string; onlyMyDepartments?: boolean; @@ -48,15 +48,10 @@ const AutoCompleteDepartment = ({ const { phase: departmentsPhase, items: departmentsItems, itemCount: departmentsTotal } = useRecordList(departmentsList); - const department = useMemo(() => { - const valueFound = typeof value === 'string' ? value : value?.value || ''; - return departmentsItems.find((dep) => dep.value === valueFound)?.value; - }, [departmentsItems, value]); - return ( void} diff --git a/apps/meteor/client/views/omnichannel/analytics/AnalyticsPage.js b/apps/meteor/client/views/omnichannel/analytics/AnalyticsPage.js index f1d227c5893..684006888b0 100644 --- a/apps/meteor/client/views/omnichannel/analytics/AnalyticsPage.js +++ b/apps/meteor/client/views/omnichannel/analytics/AnalyticsPage.js @@ -72,7 +72,7 @@ const AnalyticsPage = () => { - + @@ -90,12 +90,12 @@ const AnalyticsPage = () => { w='66%' h='100%' chartName={chartName} - departmentId={department?.value} + departmentId={department} dateRange={dateRange} alignSelf='stretch' /> - + diff --git a/apps/meteor/client/views/omnichannel/currentChats/FilterByText.tsx b/apps/meteor/client/views/omnichannel/currentChats/FilterByText.tsx index 3ed38bcb31b..fbda730b24c 100644 --- a/apps/meteor/client/views/omnichannel/currentChats/FilterByText.tsx +++ b/apps/meteor/client/views/omnichannel/currentChats/FilterByText.tsx @@ -35,7 +35,7 @@ const FilterByText: FilterByTextType = ({ setFilter, reload, customFields, setCu const [guest, setGuest] = useLocalStorage('guest', ''); const [servedBy, setServedBy] = useLocalStorage('servedBy', 'all'); const [status, setStatus] = useLocalStorage('status', 'all'); - const [department, setDepartment] = useLocalStorage<{ label: string; value: string }>('department', { value: 'all', label: t('All') }); + const [department, setDepartment] = useLocalStorage('department', 'all'); const [from, setFrom] = useLocalStorage('from', ''); const [to, setTo] = useLocalStorage('to', ''); const [tags, setTags] = useLocalStorage('tags', []); @@ -52,7 +52,7 @@ const FilterByText: FilterByTextType = ({ setFilter, reload, customFields, setCu setGuest(''); setServedBy('all'); setStatus('all'); - setDepartment({ value: 'all', label: t('All') }); + setDepartment('all'); setFrom(''); setTo(''); setTags([]); @@ -75,7 +75,7 @@ const FilterByText: FilterByTextType = ({ setFilter, reload, customFields, setCu guest, servedBy, status, - department: department?.value && department.value !== 'all' ? department.value : '', + department: department && department !== 'all' ? department : '', from: from && moment(new Date(from)).utc().format('YYYY-MM-DDTHH:mm:ss'), to: to && moment(new Date(to)).utc().format('YYYY-MM-DDTHH:mm:ss'), tags: tags.map((tag) => tag.label), diff --git a/apps/meteor/client/views/omnichannel/departments/EditDepartment.js b/apps/meteor/client/views/omnichannel/departments/EditDepartment.js index c44ab6bb2c3..4f037f1724b 100644 --- a/apps/meteor/client/views/omnichannel/departments/EditDepartment.js +++ b/apps/meteor/client/views/omnichannel/departments/EditDepartment.js @@ -200,8 +200,8 @@ function EditDepartment({ data, id, title, allowedToForwardData }) { visitorInactivityTimeoutInSeconds, abandonedRoomsCloseCustomMessage, waitingQueueMessage, - departmentsAllowedToForward: departmentsAllowedToForward?.map((dep) => dep.value).join(), - fallbackForwardDepartment: fallbackForwardDepartment.value, + departmentsAllowedToForward: departmentsAllowedToForward?.map((dep) => dep.value), + fallbackForwardDepartment, }; const agentListPayload = { diff --git a/apps/meteor/client/views/omnichannel/departments/EditDepartmentWithAllowedForwardData.js b/apps/meteor/client/views/omnichannel/departments/EditDepartmentWithAllowedForwardData.js index 774c13200be..ba2aff79bb7 100644 --- a/apps/meteor/client/views/omnichannel/departments/EditDepartmentWithAllowedForwardData.js +++ b/apps/meteor/client/views/omnichannel/departments/EditDepartmentWithAllowedForwardData.js @@ -17,10 +17,7 @@ function EditDepartmentWithAllowedForwardData({ data, ...props }) { } = useEndpointData('/v1/livechat/department.listByIds', { params: useMemo( () => ({ - ids: - data && data.department && data.department.departmentsAllowedToForward - ? data.department.departmentsAllowedToForward.split(',') - : [], + ids: data?.department?.departmentsAllowedToForward ?? [], }), [data], ), diff --git a/apps/meteor/client/views/omnichannel/queueList/QueueListFilter.tsx b/apps/meteor/client/views/omnichannel/queueList/QueueListFilter.tsx index 4ff32c3fe4c..b84045b64ac 100644 --- a/apps/meteor/client/views/omnichannel/queueList/QueueListFilter.tsx +++ b/apps/meteor/client/views/omnichannel/queueList/QueueListFilter.tsx @@ -21,7 +21,7 @@ export const QueueListFilter: QueueListFilterPropsType = ({ setFilter, ...props const [servedBy, setServedBy] = useLocalStorage('servedBy', 'all'); const [status, setStatus] = useLocalStorage('status', 'online'); - const [department, setDepartment] = useLocalStorage<{ label: string; value: string }>('department', { value: 'all', label: t('All') }); + const [department, setDepartment] = useLocalStorage('department', 'all'); const handleServedBy = useMutableCallback((e) => setServedBy(e)); const handleStatus = useMutableCallback((e) => setStatus(e)); @@ -39,8 +39,8 @@ export const QueueListFilter: QueueListFilterPropsType = ({ setFilter, ...props if (servedBy !== 'all') { filters.servedBy = servedBy; } - if (department?.value && department.value !== 'all') { - filters.departmentId = department.value; + if (department && department !== 'all') { + filters.departmentId = department; } setFilter(filters); diff --git a/apps/meteor/client/views/omnichannel/realTimeMonitoring/RealTimeMonitoringPage.js b/apps/meteor/client/views/omnichannel/realTimeMonitoring/RealTimeMonitoringPage.js index b719099221a..62994400ac3 100644 --- a/apps/meteor/client/views/omnichannel/realTimeMonitoring/RealTimeMonitoringPage.js +++ b/apps/meteor/client/views/omnichannel/realTimeMonitoring/RealTimeMonitoringPage.js @@ -24,15 +24,15 @@ const RealTimeMonitoringPage = () => { const t = useTranslation(); const [reloadFrequency, setReloadFrequency] = useState(5); - const [department, setDepartment] = useState(''); + const [departmentId, setDepartment] = useState(''); const reloadRef = useRef({}); const departmentParams = useMemo( () => ({ - ...(department?.value && { departmentId: department?.value }), + ...(departmentId && { departmentId }), }), - [department], + [departmentId], ); const allParams = useMemo( @@ -75,7 +75,7 @@ const RealTimeMonitoringPage = () => { 2 && !args[1].type) { args[1].type = 'd'; } - if (args[1] && args[1].departmentsAllowedToForward) { - args[1].departmentsAllowedToForward = args[1].departmentsAllowedToForward.split(','); - } return originalFn.apply(this, args); }, diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEdit.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEdit.tsx index b8d70706c14..daac8b05333 100644 --- a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEdit.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponseEdit.tsx @@ -19,7 +19,7 @@ const CannedResponseEdit: FC<{ departmentData?: { department: Serialized; }; -}> = ({ data, reload, totalDataReload, isNew = false, departmentData = {} }) => { +}> = ({ data, reload, totalDataReload, isNew = false }) => { const t = useTranslation(); const dispatchToastMessage = useToastMessageDispatch(); const Route = useRoute('omnichannel-canned-responses'); @@ -44,9 +44,7 @@ const CannedResponseEdit: FC<{ ? data.cannedResponse.tags.map((tag) => ({ label: tag, value: tag })) : [], scope: data ? data.cannedResponse.scope : 'user', - departmentId: data?.cannedResponse?.departmentId - ? { value: data.cannedResponse.departmentId, label: departmentData?.department?.name } - : '', + departmentId: data?.cannedResponse?.departmentId ? data.cannedResponse.departmentId : '', }); const { values, handlers, hasUnsavedChanges } = form; @@ -100,7 +98,7 @@ const CannedResponseEdit: FC<{ text: string; scope: string; tags: any; - departmentId: { value: string; label: string }; + departmentId: string; }; const mappedTags = tags.map((tag: string | { value: string; label: string }) => (typeof tag === 'object' ? tag?.value : tag)); await saveCannedResponse({ @@ -109,7 +107,7 @@ const CannedResponseEdit: FC<{ text, scope, ...(mappedTags.length > 0 && { tags: mappedTags }), - ...(departmentId && { departmentId: departmentId.value }), + ...(departmentId && { departmentId }), }); dispatchToastMessage({ type: 'success', diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/index.tsx b/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/index.tsx index 69209dabd5a..fc19de94813 100644 --- a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/index.tsx +++ b/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/index.tsx @@ -75,7 +75,7 @@ const WrapCreateCannedResponseModal: FC<{ data?: any; reloadCannedList?: any }> text: string; scope: string; tags: any; - departmentId: { value: string; label: string }; + departmentId: string; }; const mappedTags = tags.map((tag: string | { value: string; label: string }) => (typeof tag === 'object' ? tag?.value : tag)); await saveCannedResponse({ @@ -84,7 +84,7 @@ const WrapCreateCannedResponseModal: FC<{ data?: any; reloadCannedList?: any }> text, scope, ...(tags.length > 0 && { tags: mappedTags }), - ...(departmentId && { departmentId: departmentId.value }), + ...(departmentId && { departmentId }), }); dispatchToastMessage({ type: 'success', diff --git a/packages/core-typings/src/ILivechatDepartment.ts b/packages/core-typings/src/ILivechatDepartment.ts index 0f33d927bdd..e7050507d39 100644 --- a/packages/core-typings/src/ILivechatDepartment.ts +++ b/packages/core-typings/src/ILivechatDepartment.ts @@ -14,6 +14,7 @@ export interface ILivechatDepartment { businessHourId?: string; fallbackForwardDepartment?: string; archived?: boolean; + departmentsAllowedToForward?: string[]; // extra optional fields [k: string]: any; } diff --git a/packages/core-typings/src/ILivechatDepartmentRecord.ts b/packages/core-typings/src/ILivechatDepartmentRecord.ts index 19536a75bb4..383007e69a9 100644 --- a/packages/core-typings/src/ILivechatDepartmentRecord.ts +++ b/packages/core-typings/src/ILivechatDepartmentRecord.ts @@ -15,6 +15,7 @@ export interface ILivechatDepartmentRecord extends IRocketChatRecord { numAgents: number; businessHourId?: string; fallbackForwardDepartment?: string; + departmentsAllowedToForward?: string[]; // extra optional fields [k: string]: any; } diff --git a/packages/rest-typings/src/v1/omnichannel.ts b/packages/rest-typings/src/v1/omnichannel.ts index c1235322ea5..a4c78ed8399 100644 --- a/packages/rest-typings/src/v1/omnichannel.ts +++ b/packages/rest-typings/src/v1/omnichannel.ts @@ -2,7 +2,6 @@ import type { IOmnichannelCannedResponse, ILivechatAgent, ILivechatDepartment, - ILivechatDepartmentRecord, ILivechatDepartmentAgents, ILivechatMonitor, ILivechatTag, @@ -2938,7 +2937,7 @@ export type OmnichannelEndpoints = { }; '/v1/livechat/department/:_id': { GET: (params: LivechatDepartmentId) => { - department: ILivechatDepartmentRecord | null; + department: ILivechatDepartment | null; agents?: ILivechatDepartmentAgents[]; }; PUT: (params: { department: Partial[]; agents: any[] }) => {