From a6e56d91b701f6a5c27c887bda6e5a4646a9cc5e Mon Sep 17 00:00:00 2001 From: Michal Kowalczyk Date: Thu, 5 Sep 2024 16:26:07 +0200 Subject: [PATCH 01/14] feat(content-sidebar): add unchangeable versions feature to VersionsItem --- src/elements/content-sidebar/versions/VersionsItem.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/elements/content-sidebar/versions/VersionsItem.js b/src/elements/content-sidebar/versions/VersionsItem.js index 712cab087b..f3dadc12d9 100644 --- a/src/elements/content-sidebar/versions/VersionsItem.js +++ b/src/elements/content-sidebar/versions/VersionsItem.js @@ -22,10 +22,12 @@ import { VERSION_UPLOAD_ACTION, } from '../../../constants'; import type { BoxItemVersion } from '../../../common/types/core'; +import { withFeatureConsumer, isFeatureEnabled, type FeatureConfig } from '../../common/feature-checking'; import type { VersionActionCallback } from './flowTypes'; import './VersionsItem.scss'; type Props = { + features: FeatureConfig, fileId: string, isCurrent?: boolean, isSelected?: boolean, @@ -50,6 +52,7 @@ const FILE_EXTENSIONS_OFFICE = ['xlsb', 'xlsm', 'xlsx']; const FIVE_MINUTES_MS = 5 * 60 * 1000; const VersionsItem = ({ + features, fileId, isCurrent = false, isSelected = false, @@ -77,6 +80,7 @@ const VersionsItem = ({ version_promoted: versionPromoted, } = version; const { can_delete, can_download, can_preview, can_upload } = permissions; + const shouldDisablePromoteAndDelete = isFeatureEnabled(features, 'versionsItem.unchangeableVersions.enabled'); const { applied_at: retentionAppliedAt, disposition_at: retentionDispositionAt } = retention || {}; const retentionDispositionAtDate = retentionDispositionAt && new Date(retentionDispositionAt); @@ -104,9 +108,9 @@ const VersionsItem = ({ // Version action helpers const canPreview = can_preview && !isDeleted && !isLimited && !isRestricted; - const showDelete = can_delete && !isDeleted && !isCurrent; + const showDelete = can_delete && !isDeleted && !shouldDisablePromoteAndDelete && !isCurrent; const showDownload = can_download && !isDeleted && isDownloadable; - const showPromote = can_upload && !isDeleted && !isCurrent; + const showPromote = can_upload && !isDeleted && !shouldDisablePromoteAndDelete && !isCurrent; const showRestore = can_delete && isDeleted; const showPreview = canPreview && !isSelected; const hasActions = showDelete || showDownload || showPreview || showPromote || showRestore; @@ -192,4 +196,4 @@ const VersionsItem = ({ ); }; -export default VersionsItem; +export default withFeatureConsumer(VersionsItem); From 9fbdfc7d0dbe134be80ea3b82f2c7ac282b9bdfc Mon Sep 17 00:00:00 2001 From: Michal Kowalczyk Date: Fri, 6 Sep 2024 10:23:54 +0200 Subject: [PATCH 02/14] feat(content-sidebar): create tests for unchangeableVersionsFeature --- .../content-sidebar/versions/VersionsItem.js | 1 + .../versions/__tests__/VersionsItem.test.js | 110 +++++++++++++++++- 2 files changed, 109 insertions(+), 2 deletions(-) diff --git a/src/elements/content-sidebar/versions/VersionsItem.js b/src/elements/content-sidebar/versions/VersionsItem.js index f3dadc12d9..61ab4da846 100644 --- a/src/elements/content-sidebar/versions/VersionsItem.js +++ b/src/elements/content-sidebar/versions/VersionsItem.js @@ -196,4 +196,5 @@ const VersionsItem = ({ ); }; +export { VersionsItem as VersionsItemComponent }; export default withFeatureConsumer(VersionsItem); diff --git a/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js b/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js index 107b9dd270..5a64cd4001 100644 --- a/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js +++ b/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js @@ -3,7 +3,7 @@ import { FormattedMessage } from 'react-intl'; import { shallow } from 'enzyme/build'; import messages from '../messages'; import selectors from '../../../common/selectors/version'; -import VersionsItem from '../VersionsItem'; +import { VersionsItemComponent } from '../VersionsItem'; import VersionsItemActions from '../VersionsItemActions'; import VersionsItemButton from '../VersionsItemButton'; import VersionsItemRetention from '../VersionsItemRetention'; @@ -42,7 +42,8 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { ...defaults, ...overrides, }); - const getWrapper = (props = {}) => shallow(); + const getWrapper = (props = {}) => + shallow(); beforeEach(() => { selectors.getVersionAction = jest.fn().mockReturnValue(VERSION_UPLOAD_ACTION); @@ -238,5 +239,110 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { expect(wrapper.exists(VersionsItemRetention)).toBe(true); expect(wrapper.find(VersionsItemActions).prop('isRetained')).toBe(true); }); + + test.each` + permissions + ${{ can_delete: true, can_download: true, can_preview: true, can_upload: true }} + ${{ can_delete: true, can_download: true, can_preview: true, can_upload: false }} + ${{ can_delete: true, can_download: true, can_preview: false, can_upload: true }} + ${{ can_delete: true, can_download: false, can_preview: true, can_upload: true }} + ${{ can_delete: false, can_download: true, can_preview: true, can_upload: true }} + ${{ can_delete: true, can_download: true, can_preview: false, can_upload: false }} + ${{ can_delete: true, can_download: false, can_preview: true, can_upload: false }} + ${{ can_delete: false, can_download: true, can_preview: false, can_upload: true }} + ${{ can_delete: false, can_download: false, can_preview: true, can_upload: true }} + `( + 'should disable the correct menu items based on permissions when unchangeableVersions feature is enabled', + ({ permissions }) => { + const unchangeableVersionsFeature = { + versionsItem: { + unchangeableVersions: { + enabled: true, + }, + }, + }; + const wrapper = getWrapper({ + version: getVersion({ permissions }), + features: unchangeableVersionsFeature, + }); + const actions = wrapper.find(VersionsItemActions); + const button = wrapper.find(VersionsItemButton); + + expect(button.prop('isDisabled')).toBe(!permissions.can_preview); + expect(actions.prop('showDelete')).toBe(false); + expect(actions.prop('showDownload')).toBe(permissions.can_download); + expect(actions.prop('showPromote')).toBe(false); + expect(actions.prop('showPreview')).toBe(permissions.can_preview); + expect(wrapper.find(ReadableTime)).toBeTruthy(); + }, + ); + + test.each` + permissions + ${{ can_delete: true, can_download: false, can_preview: false, can_upload: true }} + ${{ can_delete: true, can_download: false, can_preview: false, can_upload: false }} + ${{ can_delete: false, can_download: false, can_preview: false, can_upload: true }} + `( + 'should not render actions based on permissions when unchangeableVersions feature is enabled', + ({ permissions }) => { + const unchangeableVersionsFeature = { + versionsItem: { + unchangeableVersions: { + enabled: true, + }, + }, + }; + const wrapper = getWrapper({ + version: getVersion({ permissions }), + features: unchangeableVersionsFeature, + }); + const actions = wrapper.exists(VersionsItemActions); + const button = wrapper.find(VersionsItemButton); + + expect(button.prop('isDisabled')).toBe(!permissions.can_preview); + expect(actions).toBeFalsy(); + expect(wrapper.find(ReadableTime)).toBeTruthy(); + }, + ); + + test.each` + permissions + ${{ can_delete: true, can_download: true, can_preview: true, can_upload: true }} + ${{ can_delete: true, can_download: true, can_preview: true, can_upload: false }} + ${{ can_delete: true, can_download: true, can_preview: false, can_upload: true }} + ${{ can_delete: true, can_download: false, can_preview: true, can_upload: true }} + ${{ can_delete: false, can_download: true, can_preview: true, can_upload: true }} + ${{ can_delete: true, can_download: true, can_preview: false, can_upload: false }} + ${{ can_delete: true, can_download: false, can_preview: true, can_upload: false }} + ${{ can_delete: false, can_download: true, can_preview: false, can_upload: true }} + ${{ can_delete: false, can_download: false, can_preview: true, can_upload: true }} + ${{ can_delete: true, can_download: false, can_preview: false, can_upload: true }} + ${{ can_delete: true, can_download: false, can_preview: false, can_upload: false }} + ${{ can_delete: false, can_download: false, can_preview: false, can_upload: true }} + `( + 'should show the correct menu items based on permissions when unchangeableVersions feature is disabled', + ({ permissions }) => { + const unchangeableVersionsFeature = { + versionsItem: { + unchangeableVersions: { + enabled: false, + }, + }, + }; + const wrapper = getWrapper({ + version: getVersion({ permissions }), + features: unchangeableVersionsFeature, + }); + const actions = wrapper.find(VersionsItemActions); + const button = wrapper.find(VersionsItemButton); + + expect(button.prop('isDisabled')).toBe(!permissions.can_preview); + expect(actions.prop('showDelete')).toBe(permissions.can_delete); + expect(actions.prop('showDownload')).toBe(permissions.can_download); + expect(actions.prop('showPromote')).toBe(permissions.can_upload); + expect(actions.prop('showPreview')).toBe(permissions.can_preview); + expect(wrapper.find(ReadableTime)).toBeTruthy(); + }, + ); }); }); From ea10fee27a684a1220e53e7ff8fd9cec1756ea45 Mon Sep 17 00:00:00 2001 From: Michal Kowalczyk Date: Fri, 6 Sep 2024 12:59:55 +0200 Subject: [PATCH 03/14] feat(content-sidebar): add more exhaustive test cases for permissions --- .../versions/__tests__/VersionsItem.test.js | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js b/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js index 5a64cd4001..d41e70045f 100644 --- a/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js +++ b/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js @@ -249,8 +249,11 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { ${{ can_delete: false, can_download: true, can_preview: true, can_upload: true }} ${{ can_delete: true, can_download: true, can_preview: false, can_upload: false }} ${{ can_delete: true, can_download: false, can_preview: true, can_upload: false }} + ${{ can_delete: false, can_download: true, can_preview: true, can_upload: false }} ${{ can_delete: false, can_download: true, can_preview: false, can_upload: true }} ${{ can_delete: false, can_download: false, can_preview: true, can_upload: true }} + ${{ can_delete: false, can_download: true, can_preview: false, can_upload: false }} + ${{ can_delete: false, can_download: false, can_preview: true, can_upload: false }} `( 'should disable the correct menu items based on permissions when unchangeableVersions feature is enabled', ({ permissions }) => { @@ -282,6 +285,7 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { ${{ can_delete: true, can_download: false, can_preview: false, can_upload: true }} ${{ can_delete: true, can_download: false, can_preview: false, can_upload: false }} ${{ can_delete: false, can_download: false, can_preview: false, can_upload: true }} + ${{ can_delete: false, can_download: false, can_preview: false, can_upload: false }} `( 'should not render actions based on permissions when unchangeableVersions feature is enabled', ({ permissions }) => { @@ -319,6 +323,9 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { ${{ can_delete: true, can_download: false, can_preview: false, can_upload: true }} ${{ can_delete: true, can_download: false, can_preview: false, can_upload: false }} ${{ can_delete: false, can_download: false, can_preview: false, can_upload: true }} + ${{ can_delete: false, can_download: true, can_preview: true, can_upload: false }} + ${{ can_delete: false, can_download: true, can_preview: false, can_upload: false }} + ${{ can_delete: false, can_download: false, can_preview: true, can_upload: false }} `( 'should show the correct menu items based on permissions when unchangeableVersions feature is disabled', ({ permissions }) => { @@ -344,5 +351,25 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { expect(wrapper.find(ReadableTime)).toBeTruthy(); }, ); + test('should not render actions on all false permissions when unchangeableVersions feature is disabled', () => { + const permissions = { can_delete: false, can_download: false, can_preview: false, can_upload: false }; + const unchangeableVersionsFeature = { + versionsItem: { + unchangeableVersions: { + enabled: false, + }, + }, + }; + const wrapper = getWrapper({ + version: getVersion({ permissions }), + features: unchangeableVersionsFeature, + }); + const actions = wrapper.exists(VersionsItemActions); + const button = wrapper.find(VersionsItemButton); + + expect(button.prop('isDisabled')).toBe(!permissions.can_preview); + expect(actions).toBeFalsy(); + expect(wrapper.find(ReadableTime)).toBeTruthy(); + }); }); }); From 08ab0b1fdf113c0010c884bc69c330845793bf28 Mon Sep 17 00:00:00 2001 From: Michal Kowalczyk Date: Fri, 6 Sep 2024 13:15:50 +0200 Subject: [PATCH 04/14] feat(content-sidebar): block restore on unchangeableVersions enabled --- .../content-sidebar/versions/VersionsItem.js | 8 +- .../versions/__tests__/VersionsItem.test.js | 71 ++++++ .../__snapshots__/VersionsItem.test.js.snap | 213 ++++++++++++++++++ 3 files changed, 288 insertions(+), 4 deletions(-) diff --git a/src/elements/content-sidebar/versions/VersionsItem.js b/src/elements/content-sidebar/versions/VersionsItem.js index 61ab4da846..e86fff5059 100644 --- a/src/elements/content-sidebar/versions/VersionsItem.js +++ b/src/elements/content-sidebar/versions/VersionsItem.js @@ -80,7 +80,7 @@ const VersionsItem = ({ version_promoted: versionPromoted, } = version; const { can_delete, can_download, can_preview, can_upload } = permissions; - const shouldDisablePromoteAndDelete = isFeatureEnabled(features, 'versionsItem.unchangeableVersions.enabled'); + const shouldDisableVersionChanges = isFeatureEnabled(features, 'versionsItem.unchangeableVersions.enabled'); const { applied_at: retentionAppliedAt, disposition_at: retentionDispositionAt } = retention || {}; const retentionDispositionAtDate = retentionDispositionAt && new Date(retentionDispositionAt); @@ -108,10 +108,10 @@ const VersionsItem = ({ // Version action helpers const canPreview = can_preview && !isDeleted && !isLimited && !isRestricted; - const showDelete = can_delete && !isDeleted && !shouldDisablePromoteAndDelete && !isCurrent; + const showDelete = can_delete && !shouldDisableVersionChanges && !isDeleted && !isCurrent; const showDownload = can_download && !isDeleted && isDownloadable; - const showPromote = can_upload && !isDeleted && !shouldDisablePromoteAndDelete && !isCurrent; - const showRestore = can_delete && isDeleted; + const showPromote = can_upload && !shouldDisableVersionChanges && !isDeleted && !isCurrent; + const showRestore = can_delete && !shouldDisableVersionChanges && isDeleted; const showPreview = canPreview && !isSelected; const hasActions = showDelete || showDownload || showPreview || showPromote || showRestore; diff --git a/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js b/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js index d41e70045f..3da4584c01 100644 --- a/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js +++ b/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js @@ -371,5 +371,76 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { expect(actions).toBeFalsy(); expect(wrapper.find(ReadableTime)).toBeTruthy(); }); + + test.each` + action | showDelete | showDownload | showPreview | showPromote | showRestore + ${'restore'} | ${false} | ${true} | ${true} | ${false} | ${false} + ${'upload'} | ${false} | ${true} | ${true} | ${false} | ${false} + `( + "should show actions correctly when the version's action is $action and unchangeableVersions feature is disabled", + ({ action, showDelete, showDownload, showPreview, showPromote, showRestore }) => { + const unchangeableVersionsFeature = { + versionsItem: { + unchangeableVersions: { + enabled: true, + }, + }, + }; + selectors.getVersionAction.mockReturnValueOnce(action); + + const wrapper = getWrapper({ + version: getVersion({ + permissions: { + can_delete: true, + can_download: true, + can_preview: true, + can_upload: true, + }, + }), + features: unchangeableVersionsFeature, + }); + const actions = wrapper.find(VersionsItemActions); + const button = wrapper.find(VersionsItemButton); + + expect(button.prop('isDisabled')).toBe(!showPreview); + expect(actions.prop('showDelete')).toBe(showDelete); + expect(actions.prop('showDownload')).toBe(showDownload); + expect(actions.prop('showPromote')).toBe(showPromote); + expect(actions.prop('showPreview')).toBe(showPreview); + expect(actions.prop('showRestore')).toBe(showRestore); + expect(wrapper.find(ReadableTime)).toBeTruthy(); + expect(wrapper).toMatchSnapshot(); + }, + ); + + test("should show actions correctly when the version's action is $action and unchangeableVersions feature is disabled", () => { + const unchangeableVersionsFeature = { + versionsItem: { + unchangeableVersions: { + enabled: true, + }, + }, + }; + selectors.getVersionAction.mockReturnValueOnce('delete'); + + const wrapper = getWrapper({ + version: getVersion({ + permissions: { + can_delete: true, + can_download: true, + can_preview: true, + can_upload: true, + }, + }), + features: unchangeableVersionsFeature, + }); + const actions = wrapper.exists(VersionsItemActions); + const button = wrapper.find(VersionsItemButton); + + expect(button.prop('isDisabled')).toBe(true); + expect(actions).toBeFalsy(); + expect(wrapper.find(ReadableTime)).toBeTruthy(); + expect(wrapper).toMatchSnapshot(); + }); }); }); diff --git a/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsItem.test.js.snap b/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsItem.test.js.snap index 90c66667d1..947275d391 100644 --- a/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsItem.test.js.snap +++ b/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsItem.test.js.snap @@ -1,5 +1,66 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`elements/content-sidebar/versions/VersionsItem render should show actions correctly when the version's action is $action and unchangeableVersions feature is disabled 1`] = ` +
+ +
+ +
+
+
+ +
+
+ + + 10 KB + +
+
+
+
+`; + exports[`elements/content-sidebar/versions/VersionsItem render should show actions correctly when the version's action is delete 1`] = `
`; +exports[`elements/content-sidebar/versions/VersionsItem render should show actions correctly when the version's action is restore and unchangeableVersions feature is disabled 1`] = ` +
+ +
+ +
+
+
+ +
+
+ + + 10 KB + +
+
+
+ +
+`; + exports[`elements/content-sidebar/versions/VersionsItem render should show actions correctly when the version's action is upload 1`] = `
`; + +exports[`elements/content-sidebar/versions/VersionsItem render should show actions correctly when the version's action is upload and unchangeableVersions feature is disabled 1`] = ` +
+ +
+ +
+
+
+ +
+
+ + + 10 KB + +
+
+
+ +
+`; From c2c76f3d3afba8527437e03769cae8ff27a601df Mon Sep 17 00:00:00 2001 From: Michal Kowalczyk Date: Fri, 6 Sep 2024 15:06:34 +0200 Subject: [PATCH 05/14] feat(content-sidebar): fix VersionsItem test names --- .../content-sidebar/versions/__tests__/VersionsItem.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js b/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js index 3da4584c01..e8d5cd376e 100644 --- a/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js +++ b/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js @@ -377,7 +377,7 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { ${'restore'} | ${false} | ${true} | ${true} | ${false} | ${false} ${'upload'} | ${false} | ${true} | ${true} | ${false} | ${false} `( - "should show actions correctly when the version's action is $action and unchangeableVersions feature is disabled", + "should show actions correctly when the version's action is $action and unchangeableVersions feature is enabled", ({ action, showDelete, showDownload, showPreview, showPromote, showRestore }) => { const unchangeableVersionsFeature = { versionsItem: { @@ -413,7 +413,7 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { }, ); - test("should show actions correctly when the version's action is $action and unchangeableVersions feature is disabled", () => { + test("should not show actions when the version's action is delete and unchangeableVersions feature is enabled", () => { const unchangeableVersionsFeature = { versionsItem: { unchangeableVersions: { From 07843c6322c264abf6d940f65f99ff5c57665c65 Mon Sep 17 00:00:00 2001 From: Michal Kowalczyk Date: Wed, 2 Oct 2024 18:02:05 +0200 Subject: [PATCH 06/14] feat(content-sidebar): revert changes to VersionsItem --- .../content-sidebar/versions/VersionsItem.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/elements/content-sidebar/versions/VersionsItem.js b/src/elements/content-sidebar/versions/VersionsItem.js index e86fff5059..712cab087b 100644 --- a/src/elements/content-sidebar/versions/VersionsItem.js +++ b/src/elements/content-sidebar/versions/VersionsItem.js @@ -22,12 +22,10 @@ import { VERSION_UPLOAD_ACTION, } from '../../../constants'; import type { BoxItemVersion } from '../../../common/types/core'; -import { withFeatureConsumer, isFeatureEnabled, type FeatureConfig } from '../../common/feature-checking'; import type { VersionActionCallback } from './flowTypes'; import './VersionsItem.scss'; type Props = { - features: FeatureConfig, fileId: string, isCurrent?: boolean, isSelected?: boolean, @@ -52,7 +50,6 @@ const FILE_EXTENSIONS_OFFICE = ['xlsb', 'xlsm', 'xlsx']; const FIVE_MINUTES_MS = 5 * 60 * 1000; const VersionsItem = ({ - features, fileId, isCurrent = false, isSelected = false, @@ -80,7 +77,6 @@ const VersionsItem = ({ version_promoted: versionPromoted, } = version; const { can_delete, can_download, can_preview, can_upload } = permissions; - const shouldDisableVersionChanges = isFeatureEnabled(features, 'versionsItem.unchangeableVersions.enabled'); const { applied_at: retentionAppliedAt, disposition_at: retentionDispositionAt } = retention || {}; const retentionDispositionAtDate = retentionDispositionAt && new Date(retentionDispositionAt); @@ -108,10 +104,10 @@ const VersionsItem = ({ // Version action helpers const canPreview = can_preview && !isDeleted && !isLimited && !isRestricted; - const showDelete = can_delete && !shouldDisableVersionChanges && !isDeleted && !isCurrent; + const showDelete = can_delete && !isDeleted && !isCurrent; const showDownload = can_download && !isDeleted && isDownloadable; - const showPromote = can_upload && !shouldDisableVersionChanges && !isDeleted && !isCurrent; - const showRestore = can_delete && !shouldDisableVersionChanges && isDeleted; + const showPromote = can_upload && !isDeleted && !isCurrent; + const showRestore = can_delete && isDeleted; const showPreview = canPreview && !isSelected; const hasActions = showDelete || showDownload || showPreview || showPromote || showRestore; @@ -196,5 +192,4 @@ const VersionsItem = ({
); }; -export { VersionsItem as VersionsItemComponent }; -export default withFeatureConsumer(VersionsItem); +export default VersionsItem; From fc18385859ae2e890b97ff992761a94ba3bd3f8b Mon Sep 17 00:00:00 2001 From: Michal Kowalczyk Date: Wed, 2 Oct 2024 19:28:29 +0200 Subject: [PATCH 07/14] feat(content-sidebar): update VersionsItem to use archive metadata --- .../content-sidebar/versions/VersionsItem.js | 8 +- .../versions/VersionsSidebarContainer.js | 11 +- .../versions/__tests__/VersionsItem.test.js | 140 +++--------------- .../__snapshots__/VersionsItem.test.js.snap | 6 +- 4 files changed, 36 insertions(+), 129 deletions(-) diff --git a/src/elements/content-sidebar/versions/VersionsItem.js b/src/elements/content-sidebar/versions/VersionsItem.js index 712cab087b..ff852167e1 100644 --- a/src/elements/content-sidebar/versions/VersionsItem.js +++ b/src/elements/content-sidebar/versions/VersionsItem.js @@ -27,6 +27,7 @@ import './VersionsItem.scss'; type Props = { fileId: string, + isArchiveFile?: boolean, isCurrent?: boolean, isSelected?: boolean, isWatermarked?: boolean, @@ -51,6 +52,7 @@ const FIVE_MINUTES_MS = 5 * 60 * 1000; const VersionsItem = ({ fileId, + isArchiveFile = false, isCurrent = false, isSelected = false, isWatermarked = false, @@ -104,10 +106,10 @@ const VersionsItem = ({ // Version action helpers const canPreview = can_preview && !isDeleted && !isLimited && !isRestricted; - const showDelete = can_delete && !isDeleted && !isCurrent; + const showDelete = can_delete && !isDeleted && !isArchiveFile && !isCurrent; const showDownload = can_download && !isDeleted && isDownloadable; - const showPromote = can_upload && !isDeleted && !isCurrent; - const showRestore = can_delete && isDeleted; + const showPromote = can_upload && !isDeleted && !isArchiveFile && !isCurrent; + const showRestore = can_delete && isDeleted && !isArchiveFile; const showPreview = canPreview && !isSelected; const hasActions = showDelete || showDownload || showPreview || showPromote || showRestore; diff --git a/src/elements/content-sidebar/versions/VersionsSidebarContainer.js b/src/elements/content-sidebar/versions/VersionsSidebarContainer.js index 9622984b20..36ae2e9b8e 100644 --- a/src/elements/content-sidebar/versions/VersionsSidebarContainer.js +++ b/src/elements/content-sidebar/versions/VersionsSidebarContainer.js @@ -13,6 +13,7 @@ import { generatePath, withRouter } from 'react-router-dom'; import type { Match, RouterHistory } from 'react-router-dom'; import type { MessageDescriptor } from 'react-intl'; import API from '../../../api'; +import { FIELD_METADATA_ARCHIVE } from '../../../constants'; import messages from './messages'; import openUrlInsideIframe from '../../../utils/iframe'; import StaticVersionsSidebar from './StaticVersionSidebar'; @@ -43,6 +44,7 @@ type Props = { type State = { error?: MessageDescriptor, isLoading: boolean, + isArchiveFile: boolean, isWatermarked: boolean, versionCount: number, versionLimit: number, @@ -66,6 +68,7 @@ class VersionsSidebarContainer extends React.Component { props: Props; state: State = { + isArchiveFile: false, isLoading: true, isWatermarked: false, versionCount: Infinity, @@ -168,6 +171,7 @@ class VersionsSidebarContainer extends React.Component { handleFetchError = (): void => { this.setState({ error: messages.versionFetchError, + isArchiveFile: false, isLoading: false, isWatermarked: false, versionCount: 0, @@ -178,6 +182,7 @@ class VersionsSidebarContainer extends React.Component { handleFetchSuccess = ([fileResponse, versionsResponse]): [BoxItem, FileVersions] => { const { api } = this.props; const { version_limit } = fileResponse; + const isArchiveFile = !!getProp(fileResponse, FIELD_METADATA_ARCHIVE); const isWatermarked = getProp(fileResponse, 'watermark_info.is_watermarked', false); const versionLimit = version_limit !== null && version_limit !== undefined ? version_limit : Infinity; const versionsWithPermissions = api.getVersionsAPI(false).addPermissions(versionsResponse, fileResponse) || {}; @@ -186,6 +191,7 @@ class VersionsSidebarContainer extends React.Component { this.setState( { error: undefined, + isArchiveFile, isLoading: false, isWatermarked, versionCount, @@ -211,10 +217,7 @@ class VersionsSidebarContainer extends React.Component { }; fetchData = (): Promise => { - return this.api - .fetchData() - .then(this.handleFetchSuccess) - .catch(this.handleFetchError); + return this.api.fetchData().then(this.handleFetchSuccess).catch(this.handleFetchError); }; findVersion = (versionId: ?string): ?BoxItemVersion => { diff --git a/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js b/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js index e8d5cd376e..9ca61c701a 100644 --- a/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js +++ b/src/elements/content-sidebar/versions/__tests__/VersionsItem.test.js @@ -3,7 +3,7 @@ import { FormattedMessage } from 'react-intl'; import { shallow } from 'enzyme/build'; import messages from '../messages'; import selectors from '../../../common/selectors/version'; -import { VersionsItemComponent } from '../VersionsItem'; +import VersionsItem from '../VersionsItem'; import VersionsItemActions from '../VersionsItemActions'; import VersionsItemButton from '../VersionsItemButton'; import VersionsItemRetention from '../VersionsItemRetention'; @@ -42,8 +42,7 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { ...defaults, ...overrides, }); - const getWrapper = (props = {}) => - shallow(); + const getWrapper = (props = {}) => shallow(); beforeEach(() => { selectors.getVersionAction = jest.fn().mockReturnValue(VERSION_UPLOAD_ACTION); @@ -254,31 +253,21 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { ${{ can_delete: false, can_download: false, can_preview: true, can_upload: true }} ${{ can_delete: false, can_download: true, can_preview: false, can_upload: false }} ${{ can_delete: false, can_download: false, can_preview: true, can_upload: false }} - `( - 'should disable the correct menu items based on permissions when unchangeableVersions feature is enabled', - ({ permissions }) => { - const unchangeableVersionsFeature = { - versionsItem: { - unchangeableVersions: { - enabled: true, - }, - }, - }; - const wrapper = getWrapper({ - version: getVersion({ permissions }), - features: unchangeableVersionsFeature, - }); - const actions = wrapper.find(VersionsItemActions); - const button = wrapper.find(VersionsItemButton); + `('should disable the correct menu items based on permissions when is archive file', ({ permissions }) => { + const wrapper = getWrapper({ + version: getVersion({ permissions }), + isArchiveFile: true, + }); + const actions = wrapper.find(VersionsItemActions); + const button = wrapper.find(VersionsItemButton); - expect(button.prop('isDisabled')).toBe(!permissions.can_preview); - expect(actions.prop('showDelete')).toBe(false); - expect(actions.prop('showDownload')).toBe(permissions.can_download); - expect(actions.prop('showPromote')).toBe(false); - expect(actions.prop('showPreview')).toBe(permissions.can_preview); - expect(wrapper.find(ReadableTime)).toBeTruthy(); - }, - ); + expect(button.prop('isDisabled')).toBe(!permissions.can_preview); + expect(actions.prop('showDelete')).toBe(false); + expect(actions.prop('showDownload')).toBe(permissions.can_download); + expect(actions.prop('showPromote')).toBe(false); + expect(actions.prop('showPreview')).toBe(permissions.can_preview); + expect(wrapper.find(ReadableTime)).toBeTruthy(); + }); test.each` permissions @@ -286,83 +275,10 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { ${{ can_delete: true, can_download: false, can_preview: false, can_upload: false }} ${{ can_delete: false, can_download: false, can_preview: false, can_upload: true }} ${{ can_delete: false, can_download: false, can_preview: false, can_upload: false }} - `( - 'should not render actions based on permissions when unchangeableVersions feature is enabled', - ({ permissions }) => { - const unchangeableVersionsFeature = { - versionsItem: { - unchangeableVersions: { - enabled: true, - }, - }, - }; - const wrapper = getWrapper({ - version: getVersion({ permissions }), - features: unchangeableVersionsFeature, - }); - const actions = wrapper.exists(VersionsItemActions); - const button = wrapper.find(VersionsItemButton); - - expect(button.prop('isDisabled')).toBe(!permissions.can_preview); - expect(actions).toBeFalsy(); - expect(wrapper.find(ReadableTime)).toBeTruthy(); - }, - ); - - test.each` - permissions - ${{ can_delete: true, can_download: true, can_preview: true, can_upload: true }} - ${{ can_delete: true, can_download: true, can_preview: true, can_upload: false }} - ${{ can_delete: true, can_download: true, can_preview: false, can_upload: true }} - ${{ can_delete: true, can_download: false, can_preview: true, can_upload: true }} - ${{ can_delete: false, can_download: true, can_preview: true, can_upload: true }} - ${{ can_delete: true, can_download: true, can_preview: false, can_upload: false }} - ${{ can_delete: true, can_download: false, can_preview: true, can_upload: false }} - ${{ can_delete: false, can_download: true, can_preview: false, can_upload: true }} - ${{ can_delete: false, can_download: false, can_preview: true, can_upload: true }} - ${{ can_delete: true, can_download: false, can_preview: false, can_upload: true }} - ${{ can_delete: true, can_download: false, can_preview: false, can_upload: false }} - ${{ can_delete: false, can_download: false, can_preview: false, can_upload: true }} - ${{ can_delete: false, can_download: true, can_preview: true, can_upload: false }} - ${{ can_delete: false, can_download: true, can_preview: false, can_upload: false }} - ${{ can_delete: false, can_download: false, can_preview: true, can_upload: false }} - `( - 'should show the correct menu items based on permissions when unchangeableVersions feature is disabled', - ({ permissions }) => { - const unchangeableVersionsFeature = { - versionsItem: { - unchangeableVersions: { - enabled: false, - }, - }, - }; - const wrapper = getWrapper({ - version: getVersion({ permissions }), - features: unchangeableVersionsFeature, - }); - const actions = wrapper.find(VersionsItemActions); - const button = wrapper.find(VersionsItemButton); - - expect(button.prop('isDisabled')).toBe(!permissions.can_preview); - expect(actions.prop('showDelete')).toBe(permissions.can_delete); - expect(actions.prop('showDownload')).toBe(permissions.can_download); - expect(actions.prop('showPromote')).toBe(permissions.can_upload); - expect(actions.prop('showPreview')).toBe(permissions.can_preview); - expect(wrapper.find(ReadableTime)).toBeTruthy(); - }, - ); - test('should not render actions on all false permissions when unchangeableVersions feature is disabled', () => { - const permissions = { can_delete: false, can_download: false, can_preview: false, can_upload: false }; - const unchangeableVersionsFeature = { - versionsItem: { - unchangeableVersions: { - enabled: false, - }, - }, - }; + `('should not render actions based on permissions when is archive file', ({ permissions }) => { const wrapper = getWrapper({ version: getVersion({ permissions }), - features: unchangeableVersionsFeature, + isArchiveFile: true, }); const actions = wrapper.exists(VersionsItemActions); const button = wrapper.find(VersionsItemButton); @@ -377,15 +293,8 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { ${'restore'} | ${false} | ${true} | ${true} | ${false} | ${false} ${'upload'} | ${false} | ${true} | ${true} | ${false} | ${false} `( - "should show actions correctly when the version's action is $action and unchangeableVersions feature is enabled", + "should show actions correctly when the version's action is $action and is archive file", ({ action, showDelete, showDownload, showPreview, showPromote, showRestore }) => { - const unchangeableVersionsFeature = { - versionsItem: { - unchangeableVersions: { - enabled: true, - }, - }, - }; selectors.getVersionAction.mockReturnValueOnce(action); const wrapper = getWrapper({ @@ -397,7 +306,7 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { can_upload: true, }, }), - features: unchangeableVersionsFeature, + isArchiveFile: true, }); const actions = wrapper.find(VersionsItemActions); const button = wrapper.find(VersionsItemButton); @@ -414,13 +323,6 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { ); test("should not show actions when the version's action is delete and unchangeableVersions feature is enabled", () => { - const unchangeableVersionsFeature = { - versionsItem: { - unchangeableVersions: { - enabled: true, - }, - }, - }; selectors.getVersionAction.mockReturnValueOnce('delete'); const wrapper = getWrapper({ @@ -432,7 +334,7 @@ describe('elements/content-sidebar/versions/VersionsItem', () => { can_upload: true, }, }), - features: unchangeableVersionsFeature, + isArchiveFile: true, }); const actions = wrapper.exists(VersionsItemActions); const button = wrapper.find(VersionsItemButton); diff --git a/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsItem.test.js.snap b/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsItem.test.js.snap index 947275d391..8c4261d301 100644 --- a/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsItem.test.js.snap +++ b/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsItem.test.js.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`elements/content-sidebar/versions/VersionsItem render should show actions correctly when the version's action is $action and unchangeableVersions feature is disabled 1`] = ` +exports[`elements/content-sidebar/versions/VersionsItem render should not show actions when the version's action is delete and unchangeableVersions feature is enabled 1`] = `
@@ -213,7 +213,7 @@ exports[`elements/content-sidebar/versions/VersionsItem render should show actio
`; -exports[`elements/content-sidebar/versions/VersionsItem render should show actions correctly when the version's action is restore and unchangeableVersions feature is disabled 1`] = ` +exports[`elements/content-sidebar/versions/VersionsItem render should show actions correctly when the version's action is restore and is archive file 1`] = `
@@ -365,7 +365,7 @@ exports[`elements/content-sidebar/versions/VersionsItem render should show actio
`; -exports[`elements/content-sidebar/versions/VersionsItem render should show actions correctly when the version's action is upload and unchangeableVersions feature is disabled 1`] = ` +exports[`elements/content-sidebar/versions/VersionsItem render should show actions correctly when the version's action is upload and is archive file 1`] = `
From 1dcc7c6809d5c3f4db6f25c9e6ac29a1bd84c82f Mon Sep 17 00:00:00 2001 From: Michal Kowalczyk Date: Wed, 2 Oct 2024 20:29:11 +0200 Subject: [PATCH 08/14] feat(content-sidebar): implement archive fetch for versions --- .../versions/VersionsSidebarAPI.js | 21 ++++++++++++++++--- .../versions/VersionsSidebarContainer.js | 11 ++++++++-- .../__tests__/VersionsSidebarAPI.test.js | 17 ++++++++++++--- .../VersionsSidebarContainer.test.js | 17 +++++++++++++-- .../VersionsSidebarContainer.test.js.snap | 3 +++ src/utils/fields.js | 4 ++++ 6 files changed, 63 insertions(+), 10 deletions(-) diff --git a/src/elements/content-sidebar/versions/VersionsSidebarAPI.js b/src/elements/content-sidebar/versions/VersionsSidebarAPI.js index 5014eb9f00..9436829638 100644 --- a/src/elements/content-sidebar/versions/VersionsSidebarAPI.js +++ b/src/elements/content-sidebar/versions/VersionsSidebarAPI.js @@ -4,7 +4,7 @@ * @author Box */ import API from '../../../api'; -import { FILE_VERSION_FIELDS_TO_FETCH } from '../../../utils/fields'; +import { FILE_VERSION_FIELDS_TO_FETCH, FILE_VERSION_FIELDS_TO_FETCH_ARCHIVE } from '../../../utils/fields'; import type { BoxItem, FileVersions, BoxItemVersion } from '../../../common/types/core'; export type fetchPayload = [BoxItem, FileVersions]; @@ -14,9 +14,20 @@ export default class VersionsSidebarAPI { fileId: string; - constructor({ api, fileId }: { api: API, fileId: string }) { + isArchiveFeatureEnabled: boolean; + + constructor({ + api, + fileId, + isArchiveFeatureEnabled, + }: { + api: API, + fileId: string, + isArchiveFeatureEnabled: boolean, + }) { this.api = api; this.fileId = fileId; + this.isArchiveFeatureEnabled = isArchiveFeatureEnabled; } fetchData = (): Promise => { @@ -34,9 +45,13 @@ export default class VersionsSidebarAPI { }; fetchFile = (): Promise => { + const fields = this.isArchiveFeatureEnabled + ? FILE_VERSION_FIELDS_TO_FETCH_ARCHIVE + : FILE_VERSION_FIELDS_TO_FETCH; + return new Promise((resolve, reject) => this.api.getFileAPI().getFile(this.fileId, resolve, reject, { - fields: FILE_VERSION_FIELDS_TO_FETCH, + fields, forceFetch: true, }), ); diff --git a/src/elements/content-sidebar/versions/VersionsSidebarContainer.js b/src/elements/content-sidebar/versions/VersionsSidebarContainer.js index 36ae2e9b8e..d773016593 100644 --- a/src/elements/content-sidebar/versions/VersionsSidebarContainer.js +++ b/src/elements/content-sidebar/versions/VersionsSidebarContainer.js @@ -12,6 +12,7 @@ import noop from 'lodash/noop'; import { generatePath, withRouter } from 'react-router-dom'; import type { Match, RouterHistory } from 'react-router-dom'; import type { MessageDescriptor } from 'react-intl'; +import { withFeatureConsumer, isFeatureEnabled } from '../../common/feature-checking'; import API from '../../../api'; import { FIELD_METADATA_ARCHIVE } from '../../../constants'; import messages from './messages'; @@ -20,11 +21,13 @@ import StaticVersionsSidebar from './StaticVersionSidebar'; import VersionsSidebar from './VersionsSidebar'; import VersionsSidebarAPI from './VersionsSidebarAPI'; import { withAPIContext } from '../../common/api-context'; +import type { FeatureConfig } from '../../common/feature-checking'; import type { VersionActionCallback, VersionChangeCallback, SidebarLoadCallback } from './flowTypes'; import type { BoxItemVersion, BoxItem, FileVersions } from '../../../common/types/core'; type Props = { api: API, + features: FeatureConfig, fileId: string, hasSidebarInitialized?: boolean, history: RouterHistory, @@ -213,7 +216,10 @@ class VersionsSidebarContainer extends React.Component { }; initialize = (): void => { - this.api = new VersionsSidebarAPI(this.props); + const { api, features, fileId }: Props = this.props; + const isArchiveFeatureEnabled = isFeatureEnabled(features, 'contentSidebar.archive.enabled'); + + this.api = new VersionsSidebarAPI({ api, fileId, isArchiveFeatureEnabled }); }; fetchData = (): Promise => { @@ -302,4 +308,5 @@ class VersionsSidebarContainer extends React.Component { } export type VersionsSidebarProps = Props; -export default flow([withRouter, withAPIContext])(VersionsSidebarContainer); +export { VersionsSidebarContainer as VersionsSidebarContainerComponent }; +export default flow([withRouter, withAPIContext, withFeatureConsumer])(VersionsSidebarContainer); diff --git a/src/elements/content-sidebar/versions/__tests__/VersionsSidebarAPI.test.js b/src/elements/content-sidebar/versions/__tests__/VersionsSidebarAPI.test.js index b20235c831..c609c5ba45 100644 --- a/src/elements/content-sidebar/versions/__tests__/VersionsSidebarAPI.test.js +++ b/src/elements/content-sidebar/versions/__tests__/VersionsSidebarAPI.test.js @@ -1,5 +1,5 @@ import VersionsSidebarAPI from '../VersionsSidebarAPI'; -import { FILE_VERSION_FIELDS_TO_FETCH } from '../../../../utils/fields'; +import { FILE_VERSION_FIELDS_TO_FETCH, FILE_VERSION_FIELDS_TO_FETCH_ARCHIVE } from '../../../../utils/fields'; describe('VersionsSidebarAPI', () => { const defaultFileId = '123'; @@ -24,7 +24,8 @@ describe('VersionsSidebarAPI', () => { }; const mockPermissons = { can_delete: true, can_download: true, can_upload: true }; const mockVersion = { id: defaultVersionId, permissions: mockPermissons }; - const getInstance = (options = {}) => new VersionsSidebarAPI({ api: mockAPI, fileId: defaultFileId, ...options }); + const getInstance = (options = {}) => + new VersionsSidebarAPI({ api: mockAPI, fileId: defaultFileId, isArchiveFeatureEnabled: false, ...options }); describe('deleteVersion', () => { test('should call deleteVersion', () => { @@ -68,7 +69,7 @@ describe('VersionsSidebarAPI', () => { }); describe('fetchFile', () => { - test('should call getFile', () => { + test('should call getFile without archive field when feature is disabled', () => { const instance = getInstance(); expect(instance.fetchFile()).toBeInstanceOf(Promise); @@ -77,6 +78,16 @@ describe('VersionsSidebarAPI', () => { forceFetch: true, }); }); + + test('should call getFile with archive field when feature is enabled', () => { + const instance = getInstance({ isArchiveFeatureEnabled: true }); + + expect(instance.fetchFile()).toBeInstanceOf(Promise); + expect(fileAPI.getFile).toBeCalledWith(defaultFileId, expect.any(Function), expect.any(Function), { + fields: FILE_VERSION_FIELDS_TO_FETCH_ARCHIVE, + forceFetch: true, + }); + }); }); describe('fetchVersions', () => { diff --git a/src/elements/content-sidebar/versions/__tests__/VersionsSidebarContainer.test.js b/src/elements/content-sidebar/versions/__tests__/VersionsSidebarContainer.test.js index 6178d9efad..33f61e9104 100644 --- a/src/elements/content-sidebar/versions/__tests__/VersionsSidebarContainer.test.js +++ b/src/elements/content-sidebar/versions/__tests__/VersionsSidebarContainer.test.js @@ -2,7 +2,7 @@ import * as React from 'react'; import { shallow } from 'enzyme/build'; import messages from '../messages'; import openUrlInsideIframe from '../../../../utils/iframe'; -import VersionsSidebar from '../VersionsSidebarContainer'; +import { VersionsSidebarContainerComponent } from '../VersionsSidebarContainer'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), @@ -32,7 +32,8 @@ describe('elements/content-sidebar/versions/VersionsSidebarContainer', () => { const api = { getVersionsAPI: () => versionsAPI, }; - const getWrapper = ({ ...props } = {}) => shallow(); + const getWrapper = ({ ...props } = {}) => + shallow(); describe('componentDidUpdate', () => { let onVersionChange; @@ -245,6 +246,7 @@ describe('elements/content-sidebar/versions/VersionsSidebarContainer', () => { expect(instance.sortVersions).toBeCalledWith(versionsWithCurrent.entries); expect(wrapper.state()).toMatchObject({ error: undefined, + isArchiveFile: false, isLoading: false, isWatermarked: false, versionCount: 2, @@ -263,6 +265,17 @@ describe('elements/content-sidebar/versions/VersionsSidebarContainer', () => { expect(wrapper.state('isWatermarked')).toBe(true); }); + + test('should set state with isArchiveFile if file is archive file', () => { + const wrapper = getWrapper(); + const instance = wrapper.instance(); + const testFile = { ...file, metadata: { global: { archivedItemTemplate: { archiveDate: '1726832355' } } } }; + + instance.verifyVersion = jest.fn(); + instance.handleFetchSuccess([testFile, versionsWithCurrent]); + + expect(wrapper.state('isArchiveFile')).toBe(true); + }); }); describe('findVersion', () => { diff --git a/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsSidebarContainer.test.js.snap b/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsSidebarContainer.test.js.snap index a05b5e1fb8..5b9bd9c5b7 100644 --- a/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsSidebarContainer.test.js.snap +++ b/src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsSidebarContainer.test.js.snap @@ -8,6 +8,7 @@ exports[`elements/content-sidebar/versions/VersionsSidebarContainer handleFetchE "id": "be.sidebarVersions.fetchError", } } + isArchiveFile={false} isLoading={false} isWatermarked={false} onUpgradeClick={[Function]} @@ -27,6 +28,7 @@ exports[`elements/content-sidebar/versions/VersionsSidebarContainer handleFetchE } } fileId="12345" + isArchiveFile={false} isLoading={false} isWatermarked={false} onDelete={[Function]} @@ -44,6 +46,7 @@ exports[`elements/content-sidebar/versions/VersionsSidebarContainer handleFetchE exports[`elements/content-sidebar/versions/VersionsSidebarContainer render should match its snapshot 1`] = ` = FILE_VERSION_FIELDS_TO_FETCH.concat(FIELD_METADATA_ARCHIVE); + // Fields needed to get versions for a file const FILE_VERSIONS_FIELDS_TO_FETCH = [ FIELD_AUTHENTICATED_DOWNLOAD_URL, // Expensive field to fetch @@ -282,6 +285,7 @@ export { FEED_FILE_VERSIONS_FIELDS_TO_FETCH, FILE_SHARED_LINK_FIELDS_TO_FETCH, FILE_VERSION_FIELDS_TO_FETCH, + FILE_VERSION_FIELDS_TO_FETCH_ARCHIVE, FILE_VERSIONS_FIELDS_TO_FETCH, fillMissingProperties, fillUserPlaceholder, From 37e767c41865063b74e86d5fef2704f83d55745d Mon Sep 17 00:00:00 2001 From: Michal Kowalczyk Date: Wed, 2 Oct 2024 20:43:47 +0200 Subject: [PATCH 09/14] feat(content-sidebar): fix flow error --- .../content-sidebar/versions/VersionsSidebarContainer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/elements/content-sidebar/versions/VersionsSidebarContainer.js b/src/elements/content-sidebar/versions/VersionsSidebarContainer.js index d773016593..946d38decb 100644 --- a/src/elements/content-sidebar/versions/VersionsSidebarContainer.js +++ b/src/elements/content-sidebar/versions/VersionsSidebarContainer.js @@ -182,7 +182,7 @@ class VersionsSidebarContainer extends React.Component { }); }; - handleFetchSuccess = ([fileResponse, versionsResponse]): [BoxItem, FileVersions] => { + handleFetchSuccess = ([fileResponse, versionsResponse]: [BoxItem, FileVersions]): [BoxItem, FileVersions] => { const { api } = this.props; const { version_limit } = fileResponse; const isArchiveFile = !!getProp(fileResponse, FIELD_METADATA_ARCHIVE); From c0d4e86f5e169a87ed5ca6e576578fb4fcc92c3a Mon Sep 17 00:00:00 2001 From: Michal Kowalczyk Date: Tue, 8 Oct 2024 16:00:59 +0200 Subject: [PATCH 10/14] feat(content-sidebar): udpate VersionsItem tests to RTL --- .../content-sidebar/versions/VersionsItem.js | 4 +- .../versions/__tests__/VersionsItem.test.js | 291 +++++++----- .../__snapshots__/VersionsItem.test.js.snap | 442 ------------------ 3 files changed, 166 insertions(+), 571 deletions(-) delete mode 100644 src/elements/content-sidebar/versions/__tests__/__snapshots__/VersionsItem.test.js.snap diff --git a/src/elements/content-sidebar/versions/VersionsItem.js b/src/elements/content-sidebar/versions/VersionsItem.js index ff852167e1..efc3c04df8 100644 --- a/src/elements/content-sidebar/versions/VersionsItem.js +++ b/src/elements/content-sidebar/versions/VersionsItem.js @@ -147,7 +147,7 @@ const VersionsItem = ({ />
-
+
{versionTimestamp && (