From 3da5947cbcc51647dca72b00fc411be4edc526ba Mon Sep 17 00:00:00 2001 From: dougfabris Date: Thu, 23 May 2024 18:14:19 -0300 Subject: [PATCH 1/6] fix: add toggle to ignore threads --- .../Info/EditRoomInfo/EditRoomInfo.tsx | 15 +++++++++++++++ .../Info/EditRoomInfo/useEditRoomInitialValues.ts | 1 + .../client/views/room/hooks/useRetentionPolicy.ts | 12 ++++++++++++ packages/i18n/src/locales/en.i18n.json | 1 + 4 files changed, 29 insertions(+) diff --git a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx index 6b8d07779107..de973d0db6d5 100644 --- a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx +++ b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx @@ -152,6 +152,7 @@ const EditRoomInfo = ({ room, onClickClose, onClickBack }: EditRoomInfoProps) => retentionMaxAge, retentionExcludePinned, retentionFilesOnly, + retentionIgnoreThreads, ...formData }) => { const data = getDirtyFields(formData, dirtyFields); @@ -172,6 +173,7 @@ const EditRoomInfo = ({ room, onClickClose, onClickBack }: EditRoomInfoProps) => retentionMaxAge, retentionExcludePinned, retentionFilesOnly, + retentionIgnoreThreads, }), }); @@ -218,6 +220,7 @@ const EditRoomInfo = ({ room, onClickClose, onClickBack }: EditRoomInfoProps) => const retentionMaxAgeField = useUniqueId(); const retentionExcludePinnedField = useUniqueId(); const retentionFilesOnlyField = useUniqueId(); + const retentionIgnoreThreads = useUniqueId(); return ( <> @@ -543,6 +546,18 @@ const EditRoomInfo = ({ room, onClickClose, onClickBack }: EditRoomInfoProps) => /> + + + {t('RetentionPolicyRoom_IgnoreThreads')} + ( + + )} + /> + + {canViewEncrypted && ( diff --git a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/useEditRoomInitialValues.ts b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/useEditRoomInitialValues.ts index 128f6c3c66f8..60119edbaa45 100644 --- a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/useEditRoomInitialValues.ts +++ b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/useEditRoomInitialValues.ts @@ -30,6 +30,7 @@ export const useEditRoomInitialValues = (room: IRoomWithRetentionPolicy) => { retentionMaxAge: retention?.maxAge ?? retentionPolicy.maxAge, retentionExcludePinned: retention?.excludePinned ?? retentionPolicy.excludePinned, retentionFilesOnly: retention?.filesOnly ?? retentionPolicy.filesOnly, + retentionIgnoreThreads: retention?.ignoreThreads ?? retentionPolicy.ignoreThreads, }), }), [ diff --git a/apps/meteor/client/views/room/hooks/useRetentionPolicy.ts b/apps/meteor/client/views/room/hooks/useRetentionPolicy.ts index ce16df8bc329..1b048630ce74 100644 --- a/apps/meteor/client/views/room/hooks/useRetentionPolicy.ts +++ b/apps/meteor/client/views/room/hooks/useRetentionPolicy.ts @@ -8,6 +8,7 @@ type RetentionPolicySettings = { enabled: boolean; filesOnly: boolean; doNotPrunePinned: boolean; + ignoreThreads: boolean; appliesToChannels: boolean; maxAgeChannels: number; appliesToGroups: boolean; @@ -55,6 +56,14 @@ const extractExcludePinned = (room: IRoom, { doNotPrunePinned }: RetentionPolicy return doNotPrunePinned; }; +const extractIgnoreThreads = (room: IRoom, { ignoreThreads }: RetentionPolicySettings): boolean => { + if (hasRetentionPolicy(room) && room.retention.overrideGlobal) { + return room.retention.ignoreThreads; + } + + return ignoreThreads; +}; + const getMaxAge = (room: IRoom, { maxAgeChannels, maxAgeGroups, maxAgeDMs }: RetentionPolicySettings): number => { if (hasRetentionPolicy(room) && room.retention.overrideGlobal) { return room.retention.maxAge; @@ -81,6 +90,7 @@ export const useRetentionPolicy = ( isActive: boolean; filesOnly: boolean; excludePinned: boolean; + ignoreThreads: boolean; maxAge: number; } | undefined => { @@ -88,6 +98,7 @@ export const useRetentionPolicy = ( enabled: useSetting('RetentionPolicy_Enabled') as boolean, filesOnly: useSetting('RetentionPolicy_FilesOnly') as boolean, doNotPrunePinned: useSetting('RetentionPolicy_DoNotPrunePinned') as boolean, + ignoreThreads: useSetting('RetentionPolicy_DoNotPruneThreads') as boolean, appliesToChannels: useSetting('RetentionPolicy_AppliesToChannels') as boolean, maxAgeChannels: useSetting('RetentionPolicy_MaxAge_Channels') as number, appliesToGroups: useSetting('RetentionPolicy_AppliesToGroups') as boolean, @@ -105,6 +116,7 @@ export const useRetentionPolicy = ( isActive: isActive(room, settings), filesOnly: extractFilesOnly(room, settings), excludePinned: extractExcludePinned(room, settings), + ignoreThreads: extractIgnoreThreads(room, settings), maxAge: getMaxAge(room, settings), }; }; diff --git a/packages/i18n/src/locales/en.i18n.json b/packages/i18n/src/locales/en.i18n.json index c59f3887106c..5f8d2368d7f1 100644 --- a/packages/i18n/src/locales/en.i18n.json +++ b/packages/i18n/src/locales/en.i18n.json @@ -4496,6 +4496,7 @@ "RetentionPolicy_RoomWarning_UnpinnedFilesOnly": "Unpinned files older than {{time}} are automatically pruned here (messages stay intact)", "RetentionPolicyRoom_Enabled": "Automatically prune old messages", "RetentionPolicyRoom_ExcludePinned": "Exclude pinned messages", + "RetentionPolicyRoom_IgnoreThreads": "Ignore threads", "RetentionPolicyRoom_FilesOnly": "Prune files only, keep messages", "RetentionPolicyRoom_MaxAge": "Maximum message age in days (default: {{max}})", "RetentionPolicyRoom_OverrideGlobal": "Override global retention policy", From 9efbdd7c2166b3cb62a3bace79554b022daefb33 Mon Sep 17 00:00:00 2001 From: dougfabris Date: Thu, 23 May 2024 18:14:54 -0300 Subject: [PATCH 2/6] fix: ignoreThreads param is not added to database if its false --- apps/meteor/server/models/raw/Rooms.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/meteor/server/models/raw/Rooms.ts b/apps/meteor/server/models/raw/Rooms.ts index 64bde1c32924..78efa845ba34 100644 --- a/apps/meteor/server/models/raw/Rooms.ts +++ b/apps/meteor/server/models/raw/Rooms.ts @@ -1838,13 +1838,12 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { return this.updateOne(query, update); } - // 5 saveRetentionIgnoreThreadsById(_id: IRoom['_id'], value: boolean): Promise { const query: Filter = { _id }; const update: UpdateFilter = { - [value === true ? '$set' : '$unset']: { - 'retention.ignoreThreads': true, + $set: { + 'retention.ignoreThreads': value === true, }, }; From 616544a96e3ace8f1e0586dbeb9678f7c32011fc Mon Sep 17 00:00:00 2001 From: dougfabris Date: Thu, 23 May 2024 18:28:40 -0300 Subject: [PATCH 3/6] fix: input translation --- .../views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx | 2 +- packages/i18n/src/locales/en.i18n.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx index de973d0db6d5..eb912d22918e 100644 --- a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx +++ b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx @@ -548,7 +548,7 @@ const EditRoomInfo = ({ room, onClickClose, onClickBack }: EditRoomInfoProps) => - {t('RetentionPolicyRoom_IgnoreThreads')} + {t('RetentionPolicy_DoNotPruneThreads')} Date: Thu, 23 May 2024 18:51:09 -0300 Subject: [PATCH 4/6] chore: add e2e test --- .../page-objects/fragments/home-flextab-room.ts | 8 ++++++-- apps/meteor/tests/e2e/retention-policy.spec.ts | 14 +++++++++++++- apps/meteor/tests/e2e/utils/index.ts | 1 + 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts index fac98e630caa..df041855bddf 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts @@ -56,10 +56,14 @@ export class HomeFlextabRoom { } get checkboxPruneMessages(): Locator { - return this.page.locator('label', { has: this.page.getByRole('checkbox', { name: 'Automatically prune old messages' }) }); + return this.page.getByRole('dialog').locator('label', { has: this.page.getByRole('checkbox', { name: 'Automatically prune old messages' }) }); } get checkboxOverrideGlobalRetention(): Locator { - return this.page.locator('label', { has: this.page.getByRole('checkbox', { name: 'Override global retention policy' }) }); + return this.page.getByRole('dialog').locator('label', { has: this.page.getByRole('checkbox', { name: 'Override global retention policy' }) }); + } + + get checkboxIgnoreThreads(): Locator { + return this.page.getByRole('dialog').locator('label', { has: this.page.getByRole('checkbox', { name: 'Do not prune Threads' }) }); } } diff --git a/apps/meteor/tests/e2e/retention-policy.spec.ts b/apps/meteor/tests/e2e/retention-policy.spec.ts index 94acdc6d65f9..34df2f1f52f8 100644 --- a/apps/meteor/tests/e2e/retention-policy.spec.ts +++ b/apps/meteor/tests/e2e/retention-policy.spec.ts @@ -1,6 +1,6 @@ import { Users } from './fixtures/userStates'; import { HomeChannel } from './page-objects'; -import { createTargetChannel, createTargetPrivateChannel, setSettingValueById } from './utils'; +import { createTargetChannel, createTargetPrivateChannel, getSettingValueById, setSettingValueById } from './utils'; import { test, expect } from './utils/test'; test.use({ storageState: Users.admin.state }); @@ -102,7 +102,10 @@ test.describe.serial('retention-policy', () => { }); test.describe('retention policy override', () => { + let ignoreThreadsSetting: boolean; + test.beforeAll(async ({ api }) => { + ignoreThreadsSetting = await getSettingValueById(api, 'RetentionPolicy_DoNotPruneThreads') as boolean; expect((await setSettingValueById(api, 'RetentionPolicy_MaxAge_Channels', 15)).status()).toBe(200); }); @@ -133,6 +136,15 @@ test.describe.serial('retention-policy', () => { await expect(poHomeChannel.tabs.room.getMaxAgeLabel('15')).toBeVisible(); await expect(poHomeChannel.tabs.room.inputRetentionMaxAge).toHaveValue('365'); }); + + test('should ignore threads be checked accordingly with the global default value', async () => { + await poHomeChannel.sidenav.openChat(targetChannel); + await poHomeChannel.tabs.btnRoomInfo.click(); + await poHomeChannel.tabs.room.btnEdit.click(); + await poHomeChannel.tabs.room.pruneAccordion.click(); + + await expect(poHomeChannel.tabs.room.checkboxIgnoreThreads).toBeChecked({ checked: ignoreThreadsSetting }); + }); }); }); }); diff --git a/apps/meteor/tests/e2e/utils/index.ts b/apps/meteor/tests/e2e/utils/index.ts index 9f83fc0ae246..e1daf601f648 100644 --- a/apps/meteor/tests/e2e/utils/index.ts +++ b/apps/meteor/tests/e2e/utils/index.ts @@ -1,2 +1,3 @@ export * from './create-target-channel'; export * from './setSettingValueById'; +export * from './getSettingValueById'; From 9a1bd9cc5b85caa982621dc51f5c7f7676822944 Mon Sep 17 00:00:00 2001 From: dougfabris Date: Thu, 6 Jun 2024 20:32:54 -0300 Subject: [PATCH 5/6] chore: changeset --- .changeset/rare-dancers-own.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/rare-dancers-own.md diff --git a/.changeset/rare-dancers-own.md b/.changeset/rare-dancers-own.md new file mode 100644 index 000000000000..358963661bef --- /dev/null +++ b/.changeset/rare-dancers-own.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Adds the missing `ignoreThreads` param fixing the issue not allowing ignoring threads when overriding retention policy From 10ce98730c997e99e4dc1e281402d096a00b22b2 Mon Sep 17 00:00:00 2001 From: dougfabris Date: Tue, 11 Jun 2024 15:15:46 -0300 Subject: [PATCH 6/6] test: add override ignore threads --- .../fragments/home-flextab-room.ts | 8 ++++++-- apps/meteor/tests/e2e/retention-policy.spec.ts | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts index f5bd8deddf54..038409eceec9 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts @@ -56,11 +56,15 @@ export class HomeFlextabRoom { } get checkboxPruneMessages(): Locator { - return this.page.getByRole('dialog').locator('label', { has: this.page.getByRole('checkbox', { name: 'Automatically prune old messages' }) }); + return this.page + .getByRole('dialog') + .locator('label', { has: this.page.getByRole('checkbox', { name: 'Automatically prune old messages' }) }); } get checkboxOverrideGlobalRetention(): Locator { - return this.page.getByRole('dialog').locator('label', { has: this.page.getByRole('checkbox', { name: 'Override global retention policy' }) }); + return this.page + .getByRole('dialog') + .locator('label', { has: this.page.getByRole('checkbox', { name: 'Override global retention policy' }) }); } get checkboxIgnoreThreads(): Locator { diff --git a/apps/meteor/tests/e2e/retention-policy.spec.ts b/apps/meteor/tests/e2e/retention-policy.spec.ts index 0f709935f9d0..21c7fec981b8 100644 --- a/apps/meteor/tests/e2e/retention-policy.spec.ts +++ b/apps/meteor/tests/e2e/retention-policy.spec.ts @@ -143,7 +143,7 @@ test.describe.serial('retention-policy', () => { let ignoreThreadsSetting: boolean; test.beforeAll(async ({ api }) => { - ignoreThreadsSetting = await getSettingValueById(api, 'RetentionPolicy_DoNotPruneThreads') as boolean; + ignoreThreadsSetting = (await getSettingValueById(api, 'RetentionPolicy_DoNotPruneThreads')) as boolean; expect((await setSettingValueById(api, 'RetentionPolicy_MaxAge_Channels', 15)).status()).toBe(200); }); @@ -183,6 +183,22 @@ test.describe.serial('retention-policy', () => { await expect(poHomeChannel.tabs.room.checkboxIgnoreThreads).toBeChecked({ checked: ignoreThreadsSetting }); }); + + test('should override ignore threads default value', async () => { + await poHomeChannel.sidenav.openChat(targetChannel); + await poHomeChannel.tabs.btnRoomInfo.click(); + await poHomeChannel.tabs.room.btnEdit.click(); + await poHomeChannel.tabs.room.pruneAccordion.click(); + await poHomeChannel.tabs.room.checkboxIgnoreThreads.click(); + await poHomeChannel.tabs.room.btnSave.click(); + await poHomeChannel.dismissToast(); + + await poHomeChannel.tabs.btnRoomInfo.click(); + await poHomeChannel.tabs.room.btnEdit.click(); + await poHomeChannel.tabs.room.pruneAccordion.click(); + + await expect(poHomeChannel.tabs.room.checkboxIgnoreThreads).toBeChecked({ checked: !ignoreThreadsSetting }); + }); }); }); });