From 7fec2ff28f2896dcd1bffa19510722b55cc1498b Mon Sep 17 00:00:00 2001 From: Martin Lingstuyl Date: Wed, 18 Sep 2024 11:49:41 +0200 Subject: [PATCH] Adds multi-item view and bulk features --- README.md | 16 + config/config.json | 2 +- config/package-solution.json | 2 +- package-lock.json | 109 +++-- package.json | 1 + screenshot_3.jpg | Bin 0 -> 156706 bytes screenshot_4.jpg | Bin 0 -> 164690 bytes .../retentionControls/AlertDialogManager.tsx | 55 +++ .../ConfirmationDialogManager.tsx | 57 +++ .../RetentionControlsCommandSet.ts | 25 +- .../RetentionControlsDialogManager.tsx | 32 ++ .../components/ItemColumn.tsx | 110 +++++ .../components/LibraryView.tsx | 419 +++++++++++++++++ .../components/MultiItemView.tsx | 430 +++++++++++++++++ .../components/RetentionControlsDialog.tsx | 71 ++- .../RetentionControlsDialogContent.tsx | 438 ------------------ .../components/SingleItemView.tsx | 403 ++++++++++++++++ src/extensions/retentionControls/loc/en-us.js | 99 ++-- .../retentionControls/loc/myStrings.d.ts | 97 ++-- src/shared/constants.ts | 18 + src/shared/interfaces/IBatchErrorResponse.ts | 5 + src/shared/interfaces/ICustomColumn.ts | 5 + src/shared/interfaces/IDriveItem.ts | 10 + src/shared/interfaces/IItemMetadata.ts | 19 + src/shared/interfaces/IItemState.ts | 8 + src/shared/interfaces/INotification.ts | 7 + src/shared/interfaces/IPagedDriveItems.ts | 7 + src/shared/services/SharePointService.ts | 228 +++++++-- src/shared/styles.ts | 46 ++ src/shared/utils.ts | 62 +++ 30 files changed, 2160 insertions(+), 621 deletions(-) create mode 100644 screenshot_3.jpg create mode 100644 screenshot_4.jpg create mode 100644 src/extensions/retentionControls/AlertDialogManager.tsx create mode 100644 src/extensions/retentionControls/ConfirmationDialogManager.tsx create mode 100644 src/extensions/retentionControls/RetentionControlsDialogManager.tsx create mode 100644 src/extensions/retentionControls/components/ItemColumn.tsx create mode 100644 src/extensions/retentionControls/components/LibraryView.tsx create mode 100644 src/extensions/retentionControls/components/MultiItemView.tsx delete mode 100644 src/extensions/retentionControls/components/RetentionControlsDialogContent.tsx create mode 100644 src/extensions/retentionControls/components/SingleItemView.tsx create mode 100644 src/shared/constants.ts create mode 100644 src/shared/interfaces/IBatchErrorResponse.ts create mode 100644 src/shared/interfaces/ICustomColumn.ts create mode 100644 src/shared/interfaces/IDriveItem.ts create mode 100644 src/shared/interfaces/IItemMetadata.ts create mode 100644 src/shared/interfaces/IItemState.ts create mode 100644 src/shared/interfaces/INotification.ts create mode 100644 src/shared/interfaces/IPagedDriveItems.ts create mode 100644 src/shared/styles.ts create mode 100644 src/shared/utils.ts diff --git a/README.md b/README.md index 34764d4..a05e488 100644 --- a/README.md +++ b/README.md @@ -7,13 +7,29 @@ Using this solution you can: - view retention information from files and folders labeled with a retention label. - toggle record lock status - clear the retention label from a file or folder. +- bulk toggle record status for selected items or the entire library. +- bulk clear labels for selected items or the entire library. This solution comes in handy if you choose to not publish any retention label, for example for purposes of automatic labelling. In such a scenario, the retention label dropdown would not be visible, and thus it would be impossible to clear the label of an item. +Opening the Retention Controls dialog: + ![Opening the retention controls screen](screenshot_1.jpg) +Viewing retention information for a single selected item: + ![The retention controls screen](screenshot_2.jpg) +Viewing retention information for multiple selected items or the entire library: + +![Retention controls for the entire library](screenshot_3.jpg) + +Taking action on a single item, all selected items or the entire library: + +![Executing actions](screenshot_4.jpg) + +> "Take bulk action" encompasses the entire library if no items were selected before opening the retention controls dialog. + ## Used SharePoint Framework Version ![version](https://img.shields.io/badge/version-1.19.0-green.svg) diff --git a/config/config.json b/config/config.json index 240728a..5bd768e 100644 --- a/config/config.json +++ b/config/config.json @@ -15,4 +15,4 @@ "localizedResources": { "RetentionControlsCommandSetStrings": "lib/extensions/retentionControls/loc/{locale}.js" } -} +} \ No newline at end of file diff --git a/config/package-solution.json b/config/package-solution.json index 50bd1cc..9894739 100644 --- a/config/package-solution.json +++ b/config/package-solution.json @@ -3,7 +3,7 @@ "solution": { "name": "Blimped SPFx Retention Controls Client Side Solution", "id": "39608f99-117d-457c-9001-79c8d257aab5", - "version": "1.0.8.1", + "version": "1.1.0.1", "includeClientSideAssets": true, "skipFeatureDeployment": true, "isDomainIsolated": false, diff --git a/package-lock.json b/package-lock.json index fb600be..e666cb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.0.1", "dependencies": { "@fluentui/react": "8.118.9", + "@fluentui/react-file-type-icons": "8.11.21", "@microsoft/decorators": "1.19.0", "@microsoft/sp-core-library": "1.19.0", "@microsoft/sp-dialog": "1.19.0", @@ -1142,25 +1143,25 @@ } }, "node_modules/@fluentui/font-icons-mdl2": { - "version": "8.5.45", - "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.45.tgz", - "integrity": "sha512-aRMZNrFPldABPeWzqqqWUTbK8vh5mksQiFERnLsbSoDmthXDqvaZJ8qTFS43m80yhMHCvYkaPVikArC87J64pw==", + "version": "8.5.50", + "resolved": "https://registry.npmjs.org/@fluentui/font-icons-mdl2/-/font-icons-mdl2-8.5.50.tgz", + "integrity": "sha512-04pRRmuBf9r/3cnBlIedF+SFk2UW7GdRQvdfKxoMuL4dDMLPqo4ruPkI/dz8Mp3EDERQU01XDWtBx11w9obmFQ==", "dependencies": { "@fluentui/set-version": "^8.2.23", - "@fluentui/style-utilities": "^8.10.16", - "@fluentui/utilities": "^8.15.11", + "@fluentui/style-utilities": "^8.10.21", + "@fluentui/utilities": "^8.15.15", "tslib": "^2.1.0" } }, "node_modules/@fluentui/foundation-legacy": { - "version": "8.4.11", - "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.4.11.tgz", - "integrity": "sha512-EccLnbmfHo3gHRKlV+qpYvPzIjMkrVIfLZXdjJ/wF0cx3Rl1jD8B343uYhGs9IH3xIP2OHoe1mGhh/1icsZrpQ==", + "version": "8.4.16", + "resolved": "https://registry.npmjs.org/@fluentui/foundation-legacy/-/foundation-legacy-8.4.16.tgz", + "integrity": "sha512-01/uQPQ2pEkQ6nUUF+tXaYeOG8UssfoEgAVLPolYXr1DC4tT66hPi7Smgsh6tzUkt/Ljy0nw9TIMRoHDHlfRyg==", "dependencies": { - "@fluentui/merge-styles": "^8.6.11", + "@fluentui/merge-styles": "^8.6.13", "@fluentui/set-version": "^8.2.23", - "@fluentui/style-utilities": "^8.10.16", - "@fluentui/utilities": "^8.15.11", + "@fluentui/style-utilities": "^8.10.21", + "@fluentui/utilities": "^8.15.15", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1177,9 +1178,9 @@ } }, "node_modules/@fluentui/merge-styles": { - "version": "8.6.11", - "resolved": "https://registry.npmjs.org/@fluentui/merge-styles/-/merge-styles-8.6.11.tgz", - "integrity": "sha512-tXexIDxsxnKNcr9dk3JtZIS/2NlzioSN188Thgu56W25ZpApw/lkUpMq7fOH2BIexuDdozXOy/QjWSnvyhnIjg==", + "version": "8.6.13", + "resolved": "https://registry.npmjs.org/@fluentui/merge-styles/-/merge-styles-8.6.13.tgz", + "integrity": "sha512-IWgvi2CC+mcQ7/YlCvRjsmHL2+PUz7q+Pa2Rqk3a+QHN0V1uBvgIbKk5y/Y/awwDXy1yJHiqMCcDHjBNmS1d4A==", "dependencies": { "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" @@ -1212,16 +1213,30 @@ "react-dom": ">=16.8.0 <19.0.0" } }, + "node_modules/@fluentui/react-file-type-icons": { + "version": "8.11.21", + "resolved": "https://registry.npmjs.org/@fluentui/react-file-type-icons/-/react-file-type-icons-8.11.21.tgz", + "integrity": "sha512-RLVrHOXAsRx/1lMTzw3//74kRMC/gEHIfyTWklozR+AUFGH9MhDUL5POQFpilbgemwA6cq6r/U7pSBEgjtUKcw==", + "dependencies": { + "@fluentui/set-version": "^8.2.23", + "@fluentui/style-utilities": "^8.10.21", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@types/react": ">=16.8.0 <19.0.0", + "react": ">=16.8.0 <19.0.0" + } + }, "node_modules/@fluentui/react-focus": { - "version": "8.9.8", - "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.9.8.tgz", - "integrity": "sha512-EA9li3KREBm+EyXbXksIk9cyI3MZRz4sh7Gf550cLXmAep/KtrR38bWtMjH3zhhrQc95byiMxqDGqYjSsRl8DA==", + "version": "8.9.13", + "resolved": "https://registry.npmjs.org/@fluentui/react-focus/-/react-focus-8.9.13.tgz", + "integrity": "sha512-oUtY4F+tp0RmV0Wr30CoYFdTQEqHWKjU3/dYHPbI0xKH4emLrf8+sc0FAHJdeHH2rx4T1XSA807pm7YB4CQqWw==", "dependencies": { "@fluentui/keyboard-key": "^0.4.23", - "@fluentui/merge-styles": "^8.6.11", + "@fluentui/merge-styles": "^8.6.13", "@fluentui/set-version": "^8.2.23", - "@fluentui/style-utilities": "^8.10.16", - "@fluentui/utilities": "^8.15.11", + "@fluentui/style-utilities": "^8.10.21", + "@fluentui/utilities": "^8.15.15", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1230,13 +1245,13 @@ } }, "node_modules/@fluentui/react-hooks": { - "version": "8.8.8", - "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.8.8.tgz", - "integrity": "sha512-H6rnPWXWhPBJuToa287Lxmy0mOPlA0vnxPWJyD26mWjkaJ4jN5V4v8qG5jLVINjWUQGJdBK71bia4zWRF421yQ==", + "version": "8.8.12", + "resolved": "https://registry.npmjs.org/@fluentui/react-hooks/-/react-hooks-8.8.12.tgz", + "integrity": "sha512-lplre6x5dONjd12D0BWs4LKq4lX++o0w07pIk2XhxikOW1e4Xfjn6VM52WSdtx+tU4rbLUoCA8drN2y/wDvhGg==", "dependencies": { - "@fluentui/react-window-provider": "^2.2.27", + "@fluentui/react-window-provider": "^2.2.28", "@fluentui/set-version": "^8.2.23", - "@fluentui/utilities": "^8.15.11", + "@fluentui/utilities": "^8.15.15", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1245,9 +1260,9 @@ } }, "node_modules/@fluentui/react-portal-compat-context": { - "version": "9.0.11", - "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.11.tgz", - "integrity": "sha512-ubvW/ej0O+Pago9GH3mPaxzUgsNnBoqvghNamWjyKvZIViyaXUG6+sgcAl721R+qGAFac+A20akI5qDJz/xtdg==", + "version": "9.0.12", + "resolved": "https://registry.npmjs.org/@fluentui/react-portal-compat-context/-/react-portal-compat-context-9.0.12.tgz", + "integrity": "sha512-5AVXWX9GnbvwnJZYUb4LSIF7BsI/N8oTI6+7Yn0w6B3yaWykA8Menlz757X5tgVBjouEj4Eom+AoVvA7u8gPDA==", "dependencies": { "@swc/helpers": "^0.5.1" }, @@ -1257,9 +1272,9 @@ } }, "node_modules/@fluentui/react-window-provider": { - "version": "2.2.27", - "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-2.2.27.tgz", - "integrity": "sha512-Dg0G9bizjryV0Q/r0CPtCVTPa2II/EsT9E6JT3jPSALjQADDLlW4/+ZXbcEC7geZ/40+KpZDmhplvk/AJSFBKg==", + "version": "2.2.28", + "resolved": "https://registry.npmjs.org/@fluentui/react-window-provider/-/react-window-provider-2.2.28.tgz", + "integrity": "sha512-YdZ74HTaoDwlvLDzoBST80/17ExIl93tLJpTxnqK5jlJOAUVQ+mxLPF2HQEJq+SZr5IMXHsQ56w/KaZVRn72YA==", "dependencies": { "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" @@ -1283,14 +1298,14 @@ } }, "node_modules/@fluentui/style-utilities": { - "version": "8.10.16", - "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.10.16.tgz", - "integrity": "sha512-sRigtvU1awF6l3GmLOuUzdprI2XWU+Yiru/4PCAMUqD2RA37tlZBLLzWwZemrkPVPInB8b3J0il95FznqYbZLg==", + "version": "8.10.21", + "resolved": "https://registry.npmjs.org/@fluentui/style-utilities/-/style-utilities-8.10.21.tgz", + "integrity": "sha512-tqdSQI1MAnNUPtNKKV9LeNqmEhBZL+lpV+m6Ngl6SDuR0aQkMkuo1jA9rPxNRLUf5+pbI8LrNQ4WiCWqYkV/QQ==", "dependencies": { - "@fluentui/merge-styles": "^8.6.11", + "@fluentui/merge-styles": "^8.6.13", "@fluentui/set-version": "^8.2.23", - "@fluentui/theme": "^2.6.54", - "@fluentui/utilities": "^8.15.11", + "@fluentui/theme": "^2.6.59", + "@fluentui/utilities": "^8.15.15", "@microsoft/load-themed-styles": "^1.10.26", "tslib": "^2.1.0" } @@ -1301,13 +1316,13 @@ "integrity": "sha512-W+IzEBw8a6LOOfRJM02dTT7BDZijxm+Z7lhtOAz1+y9vQm1Kdz9jlAO+qCEKsfxtUOmKilW8DIRqFw2aUgKeGg==" }, "node_modules/@fluentui/theme": { - "version": "2.6.54", - "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.54.tgz", - "integrity": "sha512-t+IlWkVCTi7WPJ8DI9vijCSpVojzhBRNfpLkZN8AoMysglhvqGuQUUnhP3zcQfEYDBJlEUdSbwJusJSv+5yBqQ==", + "version": "2.6.59", + "resolved": "https://registry.npmjs.org/@fluentui/theme/-/theme-2.6.59.tgz", + "integrity": "sha512-o/6UgKgPW6QI/+2OfCXeJfcOCbtzLIwM/3W/DzI2Pjt56ubT98IEcb32NCHoIKB2xkEnJoTjGgN1m+vHAvcQxA==", "dependencies": { - "@fluentui/merge-styles": "^8.6.11", + "@fluentui/merge-styles": "^8.6.13", "@fluentui/set-version": "^8.2.23", - "@fluentui/utilities": "^8.15.11", + "@fluentui/utilities": "^8.15.15", "tslib": "^2.1.0" }, "peerDependencies": { @@ -1316,13 +1331,13 @@ } }, "node_modules/@fluentui/utilities": { - "version": "8.15.11", - "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.15.11.tgz", - "integrity": "sha512-0+SmseiBY+L+biZrKeJ8M5nVXtLdCc3KTAbbkGJ5TOdTCqaVTZq0ut9IfrJAmP+nYWKChWdn+hE3dpY8koPdsQ==", + "version": "8.15.15", + "resolved": "https://registry.npmjs.org/@fluentui/utilities/-/utilities-8.15.15.tgz", + "integrity": "sha512-7GpET/AuWR8aBEQSQj9iO2j+9riAaoK1qBduCB4Ht6353d25vwwsKXreHZGqS8efv+NNIxQTlLWz0Rq73iQFWw==", "dependencies": { "@fluentui/dom-utilities": "^2.3.7", - "@fluentui/merge-styles": "^8.6.11", - "@fluentui/react-window-provider": "^2.2.27", + "@fluentui/merge-styles": "^8.6.13", + "@fluentui/react-window-provider": "^2.2.28", "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" }, diff --git a/package.json b/package.json index 982df74..2110ab0 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ }, "dependencies": { "@fluentui/react": "8.118.9", + "@fluentui/react-file-type-icons": "8.11.21", "@microsoft/decorators": "1.19.0", "@microsoft/sp-core-library": "1.19.0", "@microsoft/sp-dialog": "1.19.0", diff --git a/screenshot_3.jpg b/screenshot_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7a730a62f2f0299ccef2e048c0f78df757a7338c GIT binary patch literal 156706 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 pyDB#QngFj;`uRrMN%q0cAAdnQ9| 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 TGJ+%`rE}0WkN}GJ>*W6fF2oX@ literal 0 HcmV?d00001 diff --git a/screenshot_4.jpg b/screenshot_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1fe4ca40c7306f06c7797ace792a6dc06e56ae84 GIT binary patch literal 164690 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 + + ReactDOM.render(reactElement, + this.domElement); + } +} diff --git a/src/extensions/retentionControls/ConfirmationDialogManager.tsx b/src/extensions/retentionControls/ConfirmationDialogManager.tsx new file mode 100644 index 0000000..55d7b62 --- /dev/null +++ b/src/extensions/retentionControls/ConfirmationDialogManager.tsx @@ -0,0 +1,57 @@ +import * as ReactDOM from "react-dom"; +import * as React from "react"; +import Dialog, { DialogFooter, DialogType } from "@fluentui/react/lib/Dialog"; +import { DefaultButton, PrimaryButton } from "@fluentui/react/lib/Button"; +import * as strings from "RetentionControlsCommandSetStrings"; + +export default class ConfirmationDialogManager { + private domElement: HTMLDivElement | null = null; + private onClosedCallback: (confirmed?: boolean) => void; + + constructor(private title: string, private subText: string, private primaryButtonText?: string, private secondaryButtonText?: string, private showPrimaryButton: boolean = true, private showSecondaryButton: boolean = true) { + } + + public async close(confirmed?: boolean): Promise { + if (this.domElement) { + ReactDOM.unmountComponentAtNode(this.domElement); + this.domElement.remove(); + this.domElement = null; + } + + if (this.onClosedCallback !== undefined) { + this.onClosedCallback(confirmed); + } + } + + public onClosed(callback: (confirmed?:boolean)=>void): void { + this.onClosedCallback = callback; + } + + public async show(): Promise { + this.domElement = document.createElement('div'); + document.body.appendChild(this.domElement); + + const close = async (confirmed?: boolean): Promise => { + await this.close(confirmed); + }; + + const reactElement = + + ReactDOM.render(reactElement, + this.domElement); + } +} diff --git a/src/extensions/retentionControls/RetentionControlsCommandSet.ts b/src/extensions/retentionControls/RetentionControlsCommandSet.ts index ff4460e..9040271 100644 --- a/src/extensions/retentionControls/RetentionControlsCommandSet.ts +++ b/src/extensions/retentionControls/RetentionControlsCommandSet.ts @@ -1,10 +1,10 @@ import { Log } from "@microsoft/sp-core-library"; import { BaseListViewCommandSet, RowAccessor, type Command, type IListViewCommandSetExecuteEventParameters, type ListViewStateChangedEventArgs } from "@microsoft/sp-listview-extensibility"; -import RetentionControlsDialog from "./components/RetentionControlsDialog"; +import RetentionControlsDialogManager from "./RetentionControlsDialogManager"; export interface IRetentionControlsCommandSetProperties {} -const LOG_SOURCE: string = "RetentionControlsCommandSet"; +export const LOG_SOURCE: string = "RetentionControlsCommandSet"; export default class RetentionControlsCommandSet extends BaseListViewCommandSet { public onInit(): Promise { @@ -14,7 +14,7 @@ export default class RetentionControlsCommandSet extends BaseListViewCommandSet< const color = encodeURIComponent(this.context.isServedFromLocalhost ? "#ff0000" : themePrimary); //"#ff0000" const command: Command = this.tryGetCommand("RETENTION_CONTROLS_COMMAND"); - command.visible = false; + command.visible = true; command.iconImageUrl = `data:image/svg+xml,`; this.context.listView.listViewStateChangedEvent.add(this, this._onListViewStateChanged); @@ -27,7 +27,12 @@ export default class RetentionControlsCommandSet extends BaseListViewCommandSet< return; } - const dialog = new RetentionControlsDialog(this.context, this.context.pageContext.list.id.toString(), listItems); + const itemsWithLabel = listItems.filter(item => { + const _complianceTag = item.getValueByName("_ComplianceTag"); + return _complianceTag !== undefined && _complianceTag !== "" + }); + + const dialog = new RetentionControlsDialogManager(this.context, this.context.pageContext.list.id.toString(), itemsWithLabel, listItems.length); await dialog.show(); }; @@ -35,18 +40,18 @@ export default class RetentionControlsCommandSet extends BaseListViewCommandSet< if (event.itemId !== "RETENTION_CONTROLS_COMMAND") { throw new Error("Unknown command"); } - + this.openRetentionControls(event.selectedRows).catch(console.error); } private _onListViewStateChanged = (args: ListViewStateChangedEventArgs): void => { Log.info(LOG_SOURCE, "List view state changed"); - const command: Command = this.tryGetCommand("RETENTION_CONTROLS_COMMAND"); - if (command) { - const hasSelectedItemsWithRetentionLabel = (this.context.listView.selectedRows && this.context.listView.selectedRows.length > 0 && this.context.listView.selectedRows?.some((row) => row.getValueByName("_ComplianceTag") !== undefined && row.getValueByName("_ComplianceTag") !== "")) || false; - command.visible = hasSelectedItemsWithRetentionLabel; - } + // const command: Command = this.tryGetCommand("RETENTION_CONTROLS_COMMAND"); + // // if (command) { + // // const hasSelectedItemsWithRetentionLabel = (this.context.listView.selectedRows && this.context.listView.selectedRows.length > 0 && this.context.listView.selectedRows?.some((row) => row.getValueByName("_ComplianceTag") !== undefined && row.getValueByName("_ComplianceTag") !== "")) || false; + // // command.visible = hasSelectedItemsWithRetentionLabel; + // // } this.raiseOnChange(); }; diff --git a/src/extensions/retentionControls/RetentionControlsDialogManager.tsx b/src/extensions/retentionControls/RetentionControlsDialogManager.tsx new file mode 100644 index 0000000..684d5d9 --- /dev/null +++ b/src/extensions/retentionControls/RetentionControlsDialogManager.tsx @@ -0,0 +1,32 @@ +import { BaseComponentContext } from "@microsoft/sp-component-base"; +import * as ReactDOM from "react-dom"; +import RetentionControlsDialog from "./components/RetentionControlsDialog"; +import * as React from "react"; +import { RowAccessor } from "@microsoft/sp-listview-extensibility"; + +export default class RetentionControlsDialogManager { + private domElement: HTMLDivElement | null = null; + + constructor(private context: BaseComponentContext, private listId: string, private listItems: readonly RowAccessor[], private selectedItems: number) { + } + + public async close(): Promise { + if (this.domElement) { + ReactDOM.unmountComponentAtNode(this.domElement); + this.domElement.remove(); + this.domElement = null; + } + } + + public async show(): Promise { + this.domElement = document.createElement('div'); + document.body.appendChild(this.domElement); + + const close = async (): Promise => { + await this.close(); + }; + + ReactDOM.render(, + this.domElement); + } +} diff --git a/src/extensions/retentionControls/components/ItemColumn.tsx b/src/extensions/retentionControls/components/ItemColumn.tsx new file mode 100644 index 0000000..ff857c4 --- /dev/null +++ b/src/extensions/retentionControls/components/ItemColumn.tsx @@ -0,0 +1,110 @@ +import * as React from "react"; +import { ICustomColumn } from "../../../shared/interfaces/ICustomColumn"; +import { IItemMetadata } from "../../../shared/interfaces/IItemMetadata"; +import { FontIcon } from "@fluentui/react/lib/Icon"; +import { getBehaviorLabel } from "../../../shared/utils"; +import { getFileTypeIconProps, FileIconType } from "@fluentui/react-file-type-icons"; +import { Spinner, SpinnerSize } from "@fluentui/react/lib/Spinner"; +import * as strings from "RetentionControlsCommandSetStrings"; +import { classNames } from "../../../shared/styles"; +import { format } from "@fluentui/react/lib/Utilities"; +import { IItemState } from "../../../shared/interfaces/IItemState"; +import ConfirmationDialogManager from "../ConfirmationDialogManager"; +import AlertDialogManager from "../AlertDialogManager"; + +export interface IItemColumn { + item: IItemMetadata; + itemState?: IItemState; + column: ICustomColumn; + onClearing: (item: IItemMetadata) => void; + onToggling: (item: IItemMetadata) => void; +} + +export const ItemColumn: React.FC = (props) => { + const { item, itemState, column, onToggling, onClearing } = props; + + const onToggleClick = async (item: IItemMetadata): Promise => { + if (!item.isRecordTypeLabel) { + const dialog = new AlertDialogManager(strings.ToggleRecordForNonRecordLabelAlertTitle, strings.ToggleRecordForNonRecordLabelAlertMessage); + await dialog.show(); + } + else if (item.isFolder) { + const dialog = new AlertDialogManager(strings.ToggleRecordForFolderAlertTitle, strings.ToggleRecordForFolderAlertMessage); + await dialog.show(); + } + else { + onToggling(item) + } + } + + const onClearClick = async (item: IItemMetadata): Promise => { + if (item.isFolder) { + const dialog = new ConfirmationDialogManager(strings.ClearLabelConfirmationTitle, strings.ClearLabelConfirmationMessage); + dialog.onClosed((confirmed?: boolean) => { + if (confirmed === true) { + onClearing(item); + } + }); + await dialog.show(); + } + else if (item.isRecordTypeLabel && !item.isRecordLocked) { + const dialog = new AlertDialogManager(strings.CannotClearWhileUnlockedTitle, strings.CannotClearWhileUnlockedMessage); + await dialog.show(); + } + else { + onClearing(item); + } + } + + if (column.key === "icon") { + if (item.contentTypeId.indexOf("0x0120D520") > -1) { + return ; + } else if (item.contentTypeId.indexOf("0x0120") > -1) { + return ; + } + + const extension = item.name.substring(item.name.lastIndexOf(".")); + return ; + } else if (column.key === "name") { + return {item.name}; + } else if (column.key === "behaviorDuringRetentionPeriod") { + const fieldValue = getBehaviorLabel(item.behaviorDuringRetentionPeriod); + return {fieldValue}; + } else if (column.key === "isDeleteAllowed" || column.key === "isMetadataUpdateAllowed" || column.key === "isContentUpdateAllowed" || column.key === "isLabelUpdateAllowed") { + const boolValue = item[column.key as keyof IItemMetadata]; + if (boolValue === true) { + return ; + } else if (boolValue === false) { + return ; + } + + return <>; + } else if (column.key === "isRecordLocked") { + if (itemState?.toggling) { + return ; + } + if (itemState?.errorToggling !== undefined) { + return onToggleClick(item)} />; + } + if (item.isRecordLocked === true) { + return onToggleClick(item)} />; + } else if (item.isRecordLocked === false) { + return onToggleClick(item)} />; + } + + return <>; + } + else if (column.key === "clearLabel") { + if (itemState?.clearing) { + return ; + } + if (itemState?.errorClearing === true) { + return onClearClick(item)} />; + } + + return onClearClick(item)} />; + } + + const fieldValue = item[column.key as keyof IItemMetadata] as string; + return {fieldValue}; +}; diff --git a/src/extensions/retentionControls/components/LibraryView.tsx b/src/extensions/retentionControls/components/LibraryView.tsx new file mode 100644 index 0000000..d5fbd10 --- /dev/null +++ b/src/extensions/retentionControls/components/LibraryView.tsx @@ -0,0 +1,419 @@ +import * as React from "react"; +import { useEffect, useState } from "react"; +import * as strings from "RetentionControlsCommandSetStrings"; +import { format, SelectionMode } from "@fluentui/react/lib/Utilities"; +import { ShimmeredDetailsList } from "@fluentui/react/lib/ShimmeredDetailsList"; +import { IItemMetadata } from "../../../shared/interfaces/IItemMetadata"; +import { ICustomColumn } from "../../../shared/interfaces/ICustomColumn"; +import { ItemColumn } from "./ItemColumn"; +import Dialog, { DialogFooter, DialogType } from "@fluentui/react/lib/Dialog"; +import { DefaultButton, IButtonProps, PrimaryButton } from "@fluentui/react/lib/Button"; +import { dialogFooterStyles, messageBarStyles } from "../../../shared/styles"; +import { Stack } from "@fluentui/react/lib/Stack"; +import { Spinner, SpinnerSize } from "@fluentui/react/lib/Spinner"; +import { ContextualMenu, IContextualMenuProps } from "@fluentui/react/lib/ContextualMenu"; +import { Log } from "@microsoft/sp-core-library"; +import { LOG_SOURCE } from "../RetentionControlsCommandSet"; +import { MessageBar, MessageBarType } from "@fluentui/react/lib/MessageBar"; +import { IItemState } from "../../../shared/interfaces/IItemState"; +import { IBatchItemResponse } from "../../../shared/interfaces/IBatchErrorResponse"; +import { flattenItemMetadata, flattenItemMetadataList, updateObjectProperties } from "../../../shared/utils"; +import { INotification } from "../../../shared/interfaces/INotification"; +import { ResponsiveMode } from "@fluentui/react/lib/ResponsiveMode"; +import { IPagedDriveItems } from "../../../shared/interfaces/IPagedDriveItems"; +import { itemMetadataColumns } from "../../../shared/constants"; +import { IDriveItem } from "../../../shared/interfaces/IDriveItem"; + +export interface ILibraryView { + onClose: () => void; + onFetching: (listItemIds: number[]) => Promise; + onFetchingPaged: (pageSize: number, nextLink?: string) => Promise; + onClearing: (listItemIds: number[]) => Promise; + onToggling: (listItemIds: number[], newLockstate: boolean) => Promise; +} + +export const LibraryView: React.FC = (props) => { + const fetchPageSize = 100; + const pageSize = 10; + const shimmerLines = 10; + const [nextLink, setNextLink] = useState(); + const [loading, setLoading] = useState(true); + const [notification, setNotification] = useState(); + const [totalPages, setTotalPages] = useState(1); + const [pageNumber, setPageNumber] = useState(1); + const [executingAction, setExecutingAction] = useState(false); + const [actionStatus, setActionStatus] = useState(""); + const [fetchedItems, setFetchedItems] = useState([]); + const [itemsWithMetadata, setItemsWithMetadata] = useState(); + const [itemsState, setItemsState] = useState([]); + + const refreshItemMetadata = async (listItemId: number): Promise => { + if (itemsWithMetadata === undefined) { + return; + } + + try { + const response = await props.onFetching([listItemId]); + + if (!response || response.length === 0) { + throw new Error(strings.ErrorFetchingData); + } + + const updatedItem = flattenItemMetadata(response[0]) as IItemMetadata; + const fetchedItem = fetchedItems.filter(i => i.id === updatedItem.id)[0]; + const item = itemsWithMetadata.filter(i => i.id === updatedItem.id)[0]; + + updateObjectProperties(fetchedItem, updatedItem); + updateObjectProperties(item, updatedItem); + + setFetchedItems([...fetchedItems]); + setItemsWithMetadata([...itemsWithMetadata]); + } catch (error) { + const message = strings.ErrorFetchingData + ": " + error.message; + Log.error(LOG_SOURCE, new Error(message)); + setNotification({ message: message, notificationType: MessageBarType.error }); + } + }; + + const fetchData = async (page: number, showLoader: boolean = true, appendToFetchedList: boolean = true): Promise => { + try { + if (showLoader) + setLoading(true); + + let fetchedItemsList = fetchedItems; + + if (!appendToFetchedList) + fetchedItemsList = []; + + setPageNumber(page); + const retrieveNewItems = (page === 1 && fetchedItemsList.length === 0) || (page * pageSize > (fetchedItemsList?.length ?? 0) && nextLink !== undefined); + + if (retrieveNewItems) { + const response = await props.onFetchingPaged(fetchPageSize, nextLink); + const newItems = flattenItemMetadataList(response.items); + + for (const item of newItems) { + if (!fetchedItemsList.some(i => i.driveItemId === item.driveItemId)) { + fetchedItemsList.push(item); + } + } + + setNextLink(response.nextLink); + setFetchedItems([...fetchedItemsList]); + } + + const slice = fetchedItemsList.slice((page - 1) * pageSize, page * pageSize); + setItemsWithMetadata(slice); + setTotalPages(Math.ceil(fetchedItemsList.length / pageSize)); + + if (showLoader) + setLoading(false); + } catch (error) { + const message = strings.ErrorFetchingData + ": " + error.message; + Log.error(LOG_SOURCE, new Error(message)); + setNotification({ message: message, notificationType: MessageBarType.error }); + + if (showLoader) + setLoading(false); + } + }; + + const onTogglingRecord = async (item: IItemMetadata): Promise => { + if (itemsState === undefined || itemsWithMetadata === undefined) { + return; + } + + Log.info(LOG_SOURCE, `Toggling record status for '${item.name}'`); + + setItemsState([...itemsState.filter(i => i.listItemId !== item.id), { listItemId: item.id, toggling: true, errorToggling: undefined, clearing: false, errorClearing: false }]); + setNotification(undefined); + setExecutingAction(true); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + + try { + const newLockState = !item.isRecordLocked; + const response = await props.onToggling([item.id], newLockState); + const success = response[0].success; + + if (!success) { + setNotification({ message: format(strings.ToggleErrorForSingleItem, newLockState === true ? strings.Locked.toLowerCase() : strings.Unlocked.toLowerCase()) + " " + response[0].errorMessage, notificationType: MessageBarType.error }); + } + else { + setNotification({ message: format(strings.RecordStatusToggled, newLockState === true ? strings.Locked.toLowerCase() : strings.Unlocked.toLowerCase()), notificationType: MessageBarType.success }); + } + + setItemsState([...itemsState.filter(i => i.listItemId !== item.id), { listItemId: item.id, toggling: false, errorToggling: response[0].success === false ? response[0].errorMessage : undefined, clearing: false, errorClearing: false }]); + await refreshItemMetadata(item.id); + } + catch (error) { + setNotification({ message: error.message, notificationType: MessageBarType.error }); + Log.error(LOG_SOURCE, new Error(error.message)); + + setItemsState([...itemsState.filter(i => i.listItemId !== item.id), { listItemId: item.id, toggling: true, errorToggling: undefined, clearing: false, errorClearing: false }]); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + } + finally { + setExecutingAction(false); + } + } + + const onTogglingAllRecords = (newLockState: boolean): void => { + Promise.resolve().then(async () => { + if (itemsWithMetadata === undefined) { + return; + } + + Log.info(LOG_SOURCE, `Toggling record status for all items`); + + setActionStatus(`0 ${strings.ItemsDone}`); + setItemsState([]); + setNotification(undefined); + setExecutingAction(true); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + + try { + let newItemsState: IItemState[] = []; + let errorCount = 0; + let more = true; + let nextLink = undefined; + + while (more) { + const itemsPage: IPagedDriveItems = await props.onFetchingPaged(100, nextLink); + const itemsToToggle = flattenItemMetadataList(itemsPage.items).filter(i => !i.isFolder && i.isRecordTypeLabel && i.isRecordLocked !== newLockState).map(i => i.id); + const responses = await props.onToggling(itemsToToggle, newLockState); + more = itemsPage.nextLink !== undefined && itemsPage.items.length > 0; + nextLink = itemsPage.nextLink; + errorCount += responses.filter(r => !r.success).length; + + for(const itemResponse of responses) { + newItemsState = [...newItemsState.filter(i => i.listItemId !== itemResponse.listItemId), { listItemId: itemResponse.listItemId, toggling: false, errorToggling: itemResponse.errorMessage, clearing: false, errorClearing: false }]; + } + + setActionStatus(`${newItemsState.length} ${strings.ItemsDone}`); + } + + if (errorCount > 0) { + setNotification({ message: format(strings.ToggleErrorForMultipleItems, newLockState === true ? strings.Locked.toLowerCase() : strings.Unlocked.toLowerCase(), errorCount, newItemsState.length), notificationType: MessageBarType.warning }); + } + else if (errorCount === 0) { + setNotification({ message: format(strings.RecordStatusToggledEntireLibrary, newLockState === true ? strings.Locked.toLowerCase() : strings.Unlocked.toLowerCase()), notificationType: MessageBarType.success }); + } + + setItemsState(newItemsState); + await fetchData(1, true, false); + } catch (error) { + setNotification({ message: error.message, notificationType: MessageBarType.error }); + Log.error(LOG_SOURCE, new Error(error.message)); + + setItemsState([]); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + } + finally { + setExecutingAction(false); + setActionStatus(""); + } + }).catch(error => console.log(error)); + } + + const onClearingLabel = async (item: IItemMetadata): Promise => { + if (itemsState === undefined || itemsWithMetadata === undefined) { + return; + } + + Log.info(LOG_SOURCE, `Clearing label for '${item.name}'`); + + setItemsState([...itemsState.filter(i => i.listItemId !== item.id), { listItemId: item.id, toggling: false, errorToggling: undefined, clearing: true, errorClearing: false }]); + setNotification(undefined); + setExecutingAction(true); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + + try { + const responses = await props.onClearing([item.id]); + const success = responses[0].success; + + if (!success) { + setNotification({ message: strings.ClearErrorForSingleItem, notificationType: MessageBarType.error }); + } + else { + setNotification({ message: strings.LabelCleared, notificationType: MessageBarType.success }); + } + + setItemsState([...itemsState.filter(i => i.listItemId !== item.id), { listItemId: item.id, toggling: false, errorToggling: undefined, clearing: false, errorClearing: responses[0].success === false }]); + setItemsWithMetadata([...itemsWithMetadata.filter(i => i.id !== item.id)]); + setFetchedItems([...fetchedItems.filter(i => i.id !== item.id)]); + } + catch (error) { + setNotification({ message: error.message, notificationType: MessageBarType.error }); + Log.error(LOG_SOURCE, new Error(error.message)); + + setItemsState([...itemsState.filter(i => i.listItemId !== item.id), { listItemId: item.id, toggling: false, errorToggling: undefined, clearing: false, errorClearing: false }]); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + } + finally { + setExecutingAction(false); + } + } + + const onClearingAllLabels = (): void => { + Promise.resolve().then(async () => { + if (itemsWithMetadata === undefined) { + return; + } + + Log.info(LOG_SOURCE, `Clearing all labels`); + + setActionStatus(`0 ${strings.ItemsDone}`); + setItemsState([]); + setNotification(undefined); + setExecutingAction(true); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + + try { + let newItemsState: IItemState[] = []; + let errorCount = 0; + let more = true; + let nextLink = undefined; + + while (more) { + const itemsPage: IPagedDriveItems = await props.onFetchingPaged(100, nextLink); + const responses = await props.onClearing(itemsPage.items.map(i => parseFloat(i.listItem.id))); + more = itemsPage.nextLink !== undefined && itemsPage.items.length > 0; + nextLink = itemsPage.nextLink; + errorCount += responses.filter(r => !r.success).length; + + for(const itemResponse of responses) { + newItemsState = [...newItemsState.filter(i => i.listItemId !== itemResponse.listItemId), { listItemId: itemResponse.listItemId, toggling: false, errorToggling: undefined, clearing: false, errorClearing: itemResponse.success === false }]; + } + + setActionStatus(`${newItemsState.length} ${strings.ItemsDone}`); + } + + if (errorCount > 0) { + setNotification({ message: format(strings.ClearErrorForMultipleItems, errorCount, newItemsState.length), notificationType: MessageBarType.warning }); + } + else { + setNotification({ message: strings.LabelClearedForLibrary, notificationType: MessageBarType.success }); + } + + setItemsState(newItemsState); + await fetchData(1, true, false); + } catch (error) { + setNotification({ message: error.message, notificationType: MessageBarType.error }); + Log.error(LOG_SOURCE, new Error(error.message)); + + setItemsState([]); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + } + finally { + setExecutingAction(false); + setActionStatus(""); + } + }).catch(error => console.log(error)); + } + + const onRenderItemColumn = (item: IItemMetadata, index: number, column: ICustomColumn): JSX.Element => { + return i.listItemId === item.id)[0]} column={column} onToggling={onTogglingRecord} onClearing={onClearingLabel} />; + } + + const menuProps: IContextualMenuProps = { + items: [ + { + key: 'lockRecords', + text: strings.LockRecords, + title: strings.LockRecordsTooltip, + onClick: () => onTogglingAllRecords(true), + iconProps: { iconName: 'Lock' }, + }, + { + key: 'unlockRecords', + text: strings.UnlockRecords, + title: strings.UnlockRecordsTooltip, + onClick: () => onTogglingAllRecords(false), + iconProps: { iconName: 'Unlock' }, + }, + { + key: 'clearAllLabels', + text: strings.ClearLabels, + title: strings.ClearLabelsTooltip, + onClick: () => onClearingAllLabels(), + iconProps: { iconName: 'Untag' }, + }, + ], + directionalHintFixed: true, + }; + + const getMenu = (props: IContextualMenuProps): JSX.Element => { + return ; + } + + const getPage = (page: number): void => { + Log.info(LOG_SOURCE, `Fetching page ${page}`); + fetchData(page).catch((error) => { console.log(error); }); + } + + useEffect(() => { + fetchData(pageNumber).catch((error) => { console.log(error); }); + }, []); + + let paginationButtons: IButtonProps[] = []; + + if (totalPages > 1) { + paginationButtons = [ + { iconProps: { iconName: "ChevronLeft"}, onClick: () => getPage(pageNumber-1), disabled: pageNumber === 1, title: pageNumber === 1 ? strings.IsFirstPage : format(strings.ToPage, pageNumber-1) }, + { iconProps: { iconName: "ChevronRight"}, onClick: () => getPage(pageNumber+1), disabled: pageNumber === totalPages, title: pageNumber === totalPages ? strings.IsLastPage : format(strings.ToPage, pageNumber+1) } + ]; + } + + return <> + + ; +}; \ No newline at end of file diff --git a/src/extensions/retentionControls/components/MultiItemView.tsx b/src/extensions/retentionControls/components/MultiItemView.tsx new file mode 100644 index 0000000..29ac0b4 --- /dev/null +++ b/src/extensions/retentionControls/components/MultiItemView.tsx @@ -0,0 +1,430 @@ +import * as React from "react"; +import { useEffect, useState } from "react"; +import { IDriveItem } from "../../../shared/interfaces/IDriveItem"; +import * as strings from "RetentionControlsCommandSetStrings"; +import { RowAccessor } from "@microsoft/sp-listview-extensibility"; +import { format, SelectionMode } from "@fluentui/react/lib/Utilities"; +import { ShimmeredDetailsList } from "@fluentui/react/lib/ShimmeredDetailsList"; +import { IItemMetadata } from "../../../shared/interfaces/IItemMetadata"; +import { ICustomColumn } from "../../../shared/interfaces/ICustomColumn"; +import { ItemColumn } from "./ItemColumn"; +import Dialog, { DialogFooter, DialogType } from "@fluentui/react/lib/Dialog"; +import { DefaultButton, IButtonProps, PrimaryButton } from "@fluentui/react/lib/Button"; +import { dialogFooterStyles, messageBarStyles } from "../../../shared/styles"; +import { Stack } from "@fluentui/react/lib/Stack"; +import { Spinner, SpinnerSize } from "@fluentui/react/lib/Spinner"; +import { ContextualMenu, IContextualMenuProps } from "@fluentui/react/lib/ContextualMenu"; +import { Log } from "@microsoft/sp-core-library"; +import { LOG_SOURCE } from "../RetentionControlsCommandSet"; +import { MessageBar, MessageBarType } from "@fluentui/react/lib/MessageBar"; +import { IItemState } from "../../../shared/interfaces/IItemState"; +import { IBatchItemResponse } from "../../../shared/interfaces/IBatchErrorResponse"; +import { flattenItemMetadata, flattenItemMetadataList, updateObjectProperties } from "../../../shared/utils"; +import { INotification } from "../../../shared/interfaces/INotification"; +import { ResponsiveMode } from "@fluentui/react/lib/ResponsiveMode"; +import { itemMetadataColumns } from "../../../shared/constants"; + +export interface IMultiItemView { + listItems: readonly RowAccessor[]; + onClose: () => void; + onFetching: (listItemIds: number[]) => Promise; + onClearing: (listItemIds: number[]) => Promise; + onToggling: (listItemIds: number[], newLockstate: boolean) => Promise; +} + +export const MultiItemView: React.FC = (props) => { + const pageSize = 10; + const shimmerLines = props.listItems.length > pageSize ? pageSize : props.listItems.length; + const [listItemIds, setListItemIds] = useState(props.listItems.map(i => parseFloat(i.getValueByName("ID")))); + const [loading, setLoading] = useState(true); + const [notification, setNotification] = useState(); + const [pageNumber, setPageNumber] = useState(1); + const [totalPages, setTotalPages] = useState(1); + const [executingAction, setExecutingAction] = useState(false); + const [actionStatus, setActionStatus] = useState(""); + const [fetchedItems, setFetchedItems] = useState([]); + const [itemsState, setItemsState] = useState([]); + const [itemsWithMetadata, setItemsWithMetadata] = useState(); + + const refreshItemMetadata = async (listItemId: number): Promise => { + if (itemsWithMetadata === undefined) { + return; + } + + try { + const response = await props.onFetching([listItemId]); + + if (!response || response.length === 0) { + throw new Error(strings.ErrorFetchingData); + } + + const updatedItem = flattenItemMetadata(response[0]) as IItemMetadata; + const item = itemsWithMetadata.filter(i => i.id === updatedItem.id)[0]; + + updateObjectProperties(item, updatedItem); + + setItemsWithMetadata([...itemsWithMetadata]); + } catch (error) { + const message = strings.ErrorFetchingData + ": " + error.message; + Log.error(LOG_SOURCE, new Error(message)); + setNotification({ message: message, notificationType: MessageBarType.error }); + } + }; + + const fetchAllItems = async (): Promise => { + const allItemsWithMetadata: IItemMetadata[] = []; + const pages = Math.ceil(listItemIds.length / pageSize); + + for (let page = 1; page <= pages; page++) { + const itemIds = listItemIds.slice((page - 1) * pageSize, page * pageSize); + const response = await props.onFetching(itemIds); + + for (const item of flattenItemMetadataList(response)) { + if (item.retentionLabel !== "") { + allItemsWithMetadata.push(item); + } + } + } + + return allItemsWithMetadata; + } + + const fetchData = async (data: number[], page: number, showLoader: boolean = true, appendToFetchedList: boolean = true): Promise => { + try { + if (showLoader) + setLoading(true); + + let fetchedItemsList = fetchedItems; + + if (!appendToFetchedList) + fetchedItemsList = []; + + setPageNumber(page); + + if (data.length > 0) { + const retrieveNewItems = (page === 1 && fetchedItemsList.length === 0) || (page * pageSize > (fetchedItemsList?.length ?? 0) && fetchedItemsList?.length > ((page-1) * pageSize)); + + if (retrieveNewItems) { + const itemIds = data.slice((page - 1) * pageSize, (page * pageSize) + 1); // Retrieve one item extra to check if more pages are available. + const response = await props.onFetching(itemIds); + const newItems = flattenItemMetadataList(response); + + for (const item of newItems) { + if (!fetchedItemsList.some(i => i.driveItemId === item.driveItemId)) { + fetchedItemsList.push(item); + } + } + + setFetchedItems([...fetchedItemsList]); + } + + + const items = fetchedItemsList.slice((page - 1) * pageSize, page * pageSize); + setItemsWithMetadata(items); + setTotalPages(Math.ceil(fetchedItemsList.length / pageSize)); + } + else { + setItemsWithMetadata([]); + setTotalPages(1); + } + + if (showLoader) + setLoading(false); + } catch (error) { + const message = strings.ErrorFetchingData + ": " + error.message; + Log.error(LOG_SOURCE, new Error(message)); + setNotification({ message: message, notificationType: MessageBarType.error }); + + if (showLoader) + setLoading(false); + } + }; + + const onTogglingRecord = async (item: IItemMetadata): Promise => { + if (itemsState === undefined || itemsWithMetadata === undefined) { + return; + } + + Log.info(LOG_SOURCE, `Toggling record status for '${item.name}'`); + + setItemsState([...itemsState.filter(i => i.listItemId !== item.id), { listItemId: item.id, toggling: true, errorToggling: undefined, clearing: false, errorClearing: false }]); + setNotification(undefined); + setExecutingAction(true); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + + try { + const newLockState = !item.isRecordLocked; + const response = await props.onToggling([item.id], newLockState); + const success = response[0].success; + + if (!success) { + setNotification({ message: format(strings.ToggleErrorForSingleItem, newLockState === true ? strings.Locked.toLowerCase() : strings.Unlocked.toLowerCase()) + " " + response[0].errorMessage, notificationType: MessageBarType.error }); + } + else { + setNotification({ message: format(strings.RecordStatusToggled, newLockState === true ? strings.Locked.toLowerCase() : strings.Unlocked.toLowerCase()), notificationType: MessageBarType.success }); + } + + setItemsState([...itemsState.filter(i => i.listItemId !== item.id), { listItemId: item.id, toggling: false, errorToggling: response[0].errorMessage, clearing: false, errorClearing: false }]); + await refreshItemMetadata(item.id); + } + catch (error) { + setNotification({ message: error.message, notificationType: MessageBarType.error }); + Log.error(LOG_SOURCE, new Error(error.message)); + + setItemsState([...itemsState.filter(i => i.listItemId !== item.id), { listItemId: item.id, toggling: false, errorToggling: undefined, clearing: false, errorClearing: false }]); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + } + finally { + setExecutingAction(false); + } + } + + const onTogglingAllRecords = (newLockState: boolean): void => { + Promise.resolve().then(async () => { + if (itemsWithMetadata === undefined) { + return; + } + + Log.info(LOG_SOURCE, `Toggling record status for all items`); + + setActionStatus(strings.CheckingItems); + setItemsState([]); + setNotification(undefined); + setExecutingAction(true); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + + try { + const allItemsWithMetadata: IItemMetadata[] = await fetchAllItems(); + + const itemsToToggle = allItemsWithMetadata.filter(i => !i.isFolder && i.isRecordTypeLabel && i.isRecordLocked !== newLockState).map(i => i.id); + setActionStatus(format(strings.TogglingItems, itemsToToggle.length)); + const responses = await props.onToggling(itemsToToggle, newLockState); + const errorCount = responses.filter(r => !r.success).length; + + if (errorCount > 0) { + setNotification({ message: format(strings.ToggleErrorForMultipleItems, newLockState === true ? strings.Locked.toLowerCase() : strings.Unlocked.toLowerCase(), errorCount, listItemIds.length), notificationType: MessageBarType.warning }); + } + else { + setNotification({ message: format(strings.RecordStatusToggled, newLockState === true ? strings.Locked.toLowerCase() : strings.Unlocked.toLowerCase()), notificationType: MessageBarType.success }); + } + + let newItemsState: IItemState[] = []; + for(const itemResponse of responses) { + newItemsState = [...newItemsState.filter(i => i.listItemId !== itemResponse.listItemId), { listItemId: itemResponse.listItemId, toggling: false, errorToggling: itemResponse.errorMessage, clearing: false, errorClearing: false }]; + } + + setItemsState(newItemsState); + await fetchData(listItemIds, 1, true, false); + } catch (error) { + setNotification({ message: error.message, notificationType: MessageBarType.error }); + Log.error(LOG_SOURCE, new Error(error.message)); + + setItemsState([]); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + } + finally { + setExecutingAction(false); + setActionStatus(""); + } + }).catch(error => console.log(error)); + } + + const onClearingLabel = async (item: IItemMetadata): Promise => { + if (itemsState === undefined || itemsWithMetadata === undefined) { + return; + } + + Log.info(LOG_SOURCE, `Clearing label for '${item.name}'`); + + setItemsState([...itemsState.filter(i => i.listItemId !== item.id), { listItemId: item.id, toggling: false, errorToggling: undefined, clearing: true, errorClearing: false }]); + setNotification(undefined); + setExecutingAction(true); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + + try { + const responses = await props.onClearing([item.id]); + const success = responses[0].success; + + if (!success) { + setNotification({ message: strings.ClearErrorForSingleItem, notificationType: MessageBarType.error }); + } + else { + setNotification({ message: strings.LabelCleared, notificationType: MessageBarType.success }); + } + + setItemsState([...itemsState.filter(i => i.listItemId !== item.id), { listItemId: item.id, toggling: false, errorToggling: undefined, clearing: false, errorClearing: responses[0].success === false }]); + setListItemIds(listItemIds.filter(i => i !== item.id)); + setItemsWithMetadata([...itemsWithMetadata.filter(i => i.id !== item.id)]); + setFetchedItems([...fetchedItems.filter(i => i.id !== item.id)]); + } + catch (error) { + setNotification({ message: error.message, notificationType: MessageBarType.error }); + Log.error(LOG_SOURCE, new Error(error.message)); + + setItemsState([...itemsState.filter(i => i.listItemId !== item.id), { listItemId: item.id, toggling: false, errorToggling: undefined, clearing: false, errorClearing: false }]); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + } + finally { + setExecutingAction(false); + } + } + + const onClearingAllLabels = (): void => { + Promise.resolve().then(async () => { + if (itemsWithMetadata === undefined) { + return; + } + + Log.info(LOG_SOURCE, `Clearing all labels`); + + setActionStatus(strings.CheckingItems); + setItemsState([]); + setNotification(undefined); + setExecutingAction(true); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + + try { + const allItemsWithMetadata: IItemMetadata[] = await fetchAllItems(); + + const itemsToClear = allItemsWithMetadata.filter(i => i.retentionLabel !== "").map(i => i.id); + setActionStatus(format(strings.ClearingItems, itemsToClear.length)); + const responses = await props.onClearing(itemsToClear); + const errorCount = responses.filter(r => !r.success).length; + + if (errorCount > 0) { + setNotification({ message: format(strings.ClearErrorForMultipleItems, errorCount, listItemIds.length), notificationType: MessageBarType.warning }); + } + else { + setNotification({ message: strings.LabelCleared, notificationType: MessageBarType.success }); + } + + let newItemsState: IItemState[] = []; + let newListItemIds: number[] = listItemIds; + for(const itemResponse of responses) { + newItemsState = [...newItemsState.filter(i => i.listItemId !== itemResponse.listItemId), { listItemId: itemResponse.listItemId, toggling: false, errorToggling: undefined, clearing: false, errorClearing: !itemResponse.success }]; + if (itemResponse.success) { + newListItemIds = newListItemIds.filter(i => i !== itemResponse.listItemId); + } + } + + setItemsState(newItemsState); + setListItemIds([...newListItemIds]); + await fetchData(newListItemIds, 1, true, false); + } catch (error) { + setNotification({ message: error.message, notificationType: MessageBarType.error }); + Log.error(LOG_SOURCE, new Error(error.message)); + + // Trigger re-render table + setItemsWithMetadata([...itemsWithMetadata]); + } + finally { + setExecutingAction(false); + setActionStatus(""); + } + }).catch(error => console.log(error)); + } + + const onRenderItemColumn = (item: IItemMetadata, index: number, column: ICustomColumn): JSX.Element => { + return i.listItemId === item.id)[0]} column={column} onToggling={onTogglingRecord} onClearing={onClearingLabel} />; + } + + const menuProps: IContextualMenuProps = { + items: [ + { + key: 'lockRecords', + text: strings.LockRecords, + title: strings.LockRecordsTooltip, + onClick: () => onTogglingAllRecords(true), + iconProps: { iconName: 'Lock' }, + }, + { + key: 'unlockRecords', + text: strings.UnlockRecords, + title: strings.UnlockRecordsTooltip, + onClick: () => onTogglingAllRecords(false), + iconProps: { iconName: 'Unlock' }, + }, + { + key: 'clearAllLabels', + text: strings.ClearLabels, + title: strings.ClearLabelsTooltip, + onClick: () => onClearingAllLabels(), + iconProps: { iconName: 'Untag' }, + }, + ], + directionalHintFixed: true, + }; + + const getMenu = (props: IContextualMenuProps): JSX.Element => { + return ; + } + + const getPage = (page: number): void => { + Log.info(LOG_SOURCE, `Fetching page ${page}`); + fetchData(listItemIds, page).catch((error) => { console.log(error); }); + } + + useEffect(() => { + fetchData(listItemIds, pageNumber).catch((error) => { console.log(error); }); + }, []); + + let paginationButtons: IButtonProps[] = []; + + if (totalPages > 1) { + paginationButtons = [ + { iconProps: { iconName: "ChevronLeft"}, onClick: () => getPage(pageNumber-1), disabled: pageNumber === 1, title: pageNumber === 1 ? strings.IsFirstPage : format(strings.ToPage, pageNumber-1) }, + { iconProps: { iconName: "ChevronRight"}, onClick: () => getPage(pageNumber+1), disabled: pageNumber === totalPages, title: pageNumber === totalPages ? strings.IsLastPage : format(strings.ToPage, pageNumber+1) } + ]; + } + + return <> + + ; +}; \ No newline at end of file diff --git a/src/extensions/retentionControls/components/RetentionControlsDialog.tsx b/src/extensions/retentionControls/components/RetentionControlsDialog.tsx index b2828d3..0d67968 100644 --- a/src/extensions/retentionControls/components/RetentionControlsDialog.tsx +++ b/src/extensions/retentionControls/components/RetentionControlsDialog.tsx @@ -1,28 +1,59 @@ -import { BaseDialog, IDialogConfiguration } from "@microsoft/sp-dialog"; import { BaseComponentContext } from "@microsoft/sp-component-base"; -import * as ReactDOM from "react-dom"; -import RetentionControlsDialogContent from "./RetentionControlsDialogContent"; import * as React from "react"; +import { SharePointService } from "../../../shared/services/SharePointService"; import { RowAccessor } from "@microsoft/sp-listview-extensibility"; +import { IDriveItem } from "../../../shared/interfaces/IDriveItem"; +import { SingleItemView } from "./SingleItemView"; +import { MultiItemView } from "./MultiItemView"; +import { IBatchItemResponse } from "../../../shared/interfaces/IBatchErrorResponse"; +import { LibraryView } from "./LibraryView"; +import { IPagedDriveItems } from "../../../shared/interfaces/IPagedDriveItems"; -export default class RetentionControlsDialog extends BaseDialog { - constructor(private context: BaseComponentContext, private listId: string, private listItems: readonly RowAccessor[]) { - super(); - } +export interface IRetentionControlsDialogProps { + context: BaseComponentContext; + listId: string; + listItems: readonly RowAccessor[]; + selectedItems: number; + onClose: { (): void }; +} - public render(): void { - ReactDOM.render(, this.domElement); - //ReactDOM.render(
Test {this.context.pageContext.list?.id} {this.listId} {this.listItemIds.map(x =>
{x}
)}
, this.domElement); - } +const RetentionControlsDialog: React.FC = (props) => { + const { selectedItems } = props; + const spoService = props.context.serviceScope.consume(SharePointService.serviceKey); - public getConfig(): IDialogConfiguration { - return { isBlocking: true }; - } + const fetchItemMetadata = async (listItemIds: number[]): Promise => { + return await spoService.getDriveItems(props.listId, listItemIds); + }; - protected onAfterClose(): void { - super.onAfterClose(); + const fetchItemsPaged = async (pageSize: number, nextLink?: string): Promise => { + return nextLink !== undefined ? + await spoService.getPagedDriveItemsUsingNextLink(nextLink) : + await spoService.getPagedDriveItems(props.listId, pageSize); + }; - // Clean up the element for the next dialog - ReactDOM.unmountComponentAtNode(this.domElement); - } -} + const onClearingLabels = async (listItemIds: number[]): Promise => { + if (listItemIds.length === 0) { + return []; + } + + return await spoService.clearRetentionLabels(listItemIds); + }; + + const onTogglingRecords = async (listItemIds: number[], newLockState: boolean): Promise => { + if (listItemIds.length === 0) { + return []; + } + + return await spoService.toggleLockStatus(listItemIds, newLockState); + }; + + return selectedItems === 1 ? <> + + : selectedItems > 1 ? <> + + : <> + + ; +}; + +export default RetentionControlsDialog; diff --git a/src/extensions/retentionControls/components/RetentionControlsDialogContent.tsx b/src/extensions/retentionControls/components/RetentionControlsDialogContent.tsx deleted file mode 100644 index 08ee2fc..0000000 --- a/src/extensions/retentionControls/components/RetentionControlsDialogContent.tsx +++ /dev/null @@ -1,438 +0,0 @@ -import { BaseComponentContext } from "@microsoft/sp-component-base"; -import * as React from "react"; -import { SharePointService } from "../../../shared/services/SharePointService"; -import { IRetentionLabel } from "../../../shared/interfaces/IRetentionLabel"; -import { useState } from "react"; -import * as strings from "RetentionControlsCommandSetStrings"; -import { initializeIcons } from "@fluentui/font-icons-mdl2"; -import { FontIcon } from "@fluentui/react/lib/Icon"; -import { Warning } from "../../../shared/Warning"; -import { RowAccessor } from "@microsoft/sp-listview-extensibility"; -import { IListItemFields } from "../../../shared/interfaces/IListItemFields"; -import { format } from "@fluentui/react/lib/Utilities"; -import { IMessageBarStyles, MessageBar, MessageBarType } from "@fluentui/react/lib/MessageBar"; -import { DialogContent, DialogFooter, DialogType, IDialogFooterStyles } from "@fluentui/react/lib/Dialog"; -import { ResponsiveMode } from "@fluentui/react/lib/ResponsiveMode"; -import { IStackItemStyles, IStackTokens, Stack } from "@fluentui/react/lib/Stack"; -import { mergeStyles, mergeStyleSets } from "@fluentui/react/lib/Styling"; -import { Spinner, SpinnerSize } from "@fluentui/react/lib/Spinner"; -import { Link } from "@fluentui/react/lib/Link"; -import { Shimmer } from "@fluentui/react/lib/Shimmer"; -import { DefaultButton } from "@fluentui/react/lib/Button"; -initializeIcons(); - -export interface IRetentionControlsDialogProps { - context: BaseComponentContext; - listId: string; - listItems: readonly RowAccessor[]; - close: { (): void }; -} - -const stackItemStyles: IStackItemStyles = { - root: { - alignItems: "center", - display: "flex", - width: "250px", - }, -}; - -const dialogFooterStyles: IDialogFooterStyles = { - action: { - width: "100%", - }, - actions: {}, - actionsRight: {}, -}; - -const messageBarStyles: IMessageBarStyles = { - root: { - marginBottom: "10px", - }, -}; - -const stackTokens: IStackTokens = { - childrenGap: 5, -}; - -const iconClass = mergeStyles({ - fontSize: 14, - height: 14, - width: 14, - margin: "0 10px 0 0", -}); - -const classNames = mergeStyleSets({ - green: [{ color: "darkgreen" }, iconClass], - red: [{ color: "indianred" }, iconClass], - blue: [{ color: "#28a8ea" }, iconClass], -}); - -const getBehaviorLabel = (behavior: string | undefined): string => { - switch (behavior) { - case "retain": - return "Retain"; - case "doNotRetain": - return "Do not retain"; - case "retainAsRecord": - return "Retain as record"; - case "retainAsRegulatoryRecord": - return "Retain as regulatory record"; - default: - return "N/A"; - } -}; - -const RetentionControlsDialogContent: React.FC = (props) => { - const [error, setError] = useState(); - const [warning, setWarning] = useState(); - const [loading, setLoading] = useState(true); - const [successMessage, setSuccessMessage] = useState(); - const [clearing, setClearing] = useState(false); - const [toggling, setToggling] = useState(false); - const [driveItemLabel, setDriveItemLabel] = useState(); - const [listItemFields, setListItemFields] = useState(); - const spoService = props.context.serviceScope.consume(SharePointService.serviceKey); - - const fetchListItemData = async (): Promise => { - try { - const listItemIds = props.listItems.map((item) => parseFloat(item.getValueByName("ID"))); - const response = await spoService.getListItemFields(props.listId, listItemIds[0]); - setListItemFields(response); - - return response; - } catch (error) { - setError(error.message); - } - }; - - const fetchRetentionLabelSettings = async (): Promise => { - try { - const listItemIds = props.listItems.map((item) => parseFloat(item.getValueByName("ID"))); - const response = await spoService.getRetentionSettings(props.listId, listItemIds[0]); - setDriveItemLabel(response); - - return response; - } catch (error) { - setError(error.message); - } - }; - - const fetchData = async (): Promise => { - await fetchListItemData(); - await fetchRetentionLabelSettings(); - setLoading(false); - }; - - const clearLabel = async (): Promise => { - setSuccessMessage(undefined); - setError(undefined); - setWarning(undefined); - - try { - if (driveItemLabel?.retentionSettings?.isRecordLocked === false) { - throw new Error(strings.CannotClearWhileUnlocked); - } - - setClearing(true); - const listItemIds = props.listItems.map((item) => parseFloat(item.getValueByName("ID"))); - await spoService.clearRetentionLabels(listItemIds); - setDriveItemLabel(undefined); - setSuccessMessage(strings.LabelCleared); - setClearing(false); - } catch (error) { - if ((error as Warning).isWarning) { - setWarning(error.message); - } else { - setError(error.message); - } - setClearing(false); - } - }; - - const toggleLockStatus = async (): Promise => { - setSuccessMessage(undefined); - setError(undefined); - setWarning(undefined); - - try { - setToggling(true); - await spoService.toggleLockStatus(props.listItems[0].getValueByName("ID"), driveItemLabel?.retentionSettings?.isRecordLocked === true ? false : true); - const retentionLabel = await fetchRetentionLabelSettings(); - - setSuccessMessage(format(strings.RecordStatusToggled, retentionLabel?.retentionSettings?.isRecordLocked === true ? strings.Locked.toLowerCase() : strings.Unlocked.toLowerCase())); - setToggling(false); - } catch (error) { - setError(error.message); - setToggling(false); - } - }; - - React.useEffect(() => { - if (props.listItems.length === 1) { - fetchData().catch(() => { - setError(error); - }); - } else { - setLoading(false); - } - }, []); - - const labelAppliedDate = driveItemLabel?.labelAppliedDateTime ? new Date(driveItemLabel.labelAppliedDateTime).toLocaleDateString() : "N/A"; - - // Get a unique list of retention labels applied to the selected items - const retentionLabels = props.listItems - .map((item) => item.getValueByName("_ComplianceTag")) - .filter((label) => label !== undefined && label !== null && label !== "") - .filter((label, index, array) => array.indexOf(label) === index); - - const eventDate = props.listItems.length === 1 && listItemFields?.TagEventDate !== undefined && listItemFields?.TagEventDate?.indexOf("9999") === -1 ? new Date(listItemFields.TagEventDate).toLocaleDateString() : undefined; - - return ( - - {successMessage ? ( - - {successMessage} - - ) : ( - <> - )} - {error ? ( - - {error} - - ) : ( - <> - )} - {warning ? ( - - {warning} - - ) : ( - <> - )} - {!loading && props.listItems.length === 1 && driveItemLabel?.name === undefined ? ( - - {strings.NoLabelApplied} - - ) : ( - <> - )} - {!loading && props.listItems.length > 1 ? ( - - - - {retentionLabels.length > 1 ? strings.RetentionLabelsApplied : strings.RetentionLabelApplied} - - - <> - {retentionLabels[0]} {retentionLabels.length > 1 ? <>+{retentionLabels.length - 1} : <>} - - {clearing ? : <>{retentionLabels.length > 1 ? strings.ClearLabels : strings.ClearLabel}} - - - - - {format(strings.MultipleItemsSelected, props.listItems.length)} - - ) : ( - <> - )} - {props.listItems.length === 1 && (loading || (!loading && driveItemLabel?.name !== undefined)) ? ( - - - - {strings.RetentionLabelApplied} - - - <> - {retentionLabels[0]} - - {clearing ? : <>{strings.ClearLabel}} - - - - - - - - {strings.RetentionLabelApplicationDate} - - - - -
{labelAppliedDate}
-
-
-
- - - - {strings.RetentionLabelAppliedBy} - - - - -
{driveItemLabel?.labelAppliedBy?.user?.displayName || (driveItemLabel?.labelAppliedBy as { application?: { displayName: string } })?.application?.displayName}
-
-
-
- - {eventDate ? ( - - - - {strings.RetentionLabelEventDate} - - - - -
{eventDate}
-
-
-
- ) : ( - <> - )} - - - - - {strings.BehaviorDuringRetentionPeriod} - - - - - {getBehaviorLabel(driveItemLabel?.retentionSettings?.behaviorDuringRetentionPeriod)} - - - - - - - - {strings.IsMetadataUpdateAllowed} - - - - - - {driveItemLabel?.retentionSettings?.isMetadataUpdateAllowed === true ? ( - <> - {strings.ToggleOnText} - - ) : ( - <> - {strings.ToggleOffText} - - )} - - - - - - - {strings.IsContentUpdateAllowed} - - - - - - {driveItemLabel?.retentionSettings?.isContentUpdateAllowed === true ? ( - <> - {strings.ToggleOnText} - - ) : ( - <> - {strings.ToggleOffText} - - )} - - - - - - - {strings.IsDeleteAllowed} - - - - - - {driveItemLabel?.retentionSettings?.isDeleteAllowed === true ? ( - <> - {strings.ToggleOnText} - - ) : ( - <> - {strings.ToggleOffText} - - )} - - - - - - - {strings.IsLabelUpdateAllowed} - - - - - - {driveItemLabel?.retentionSettings?.isLabelUpdateAllowed === true ? ( - <> - {strings.ToggleOnText} - - ) : ( - <> - {strings.ToggleOffText} - - )} - - - - - {driveItemLabel?.retentionSettings?.behaviorDuringRetentionPeriod === "retainAsRecord" ? ( - <> - - - - {strings.RecordStatus} - - - - - - <> - {driveItemLabel?.retentionSettings?.isRecordLocked === true ? ( - <> - {strings.Locked} - - ) : ( - <> - {strings.Unlocked} - - )} - - {toggling ? : <>{strings.ToggleLockStatus}} - - - - - - - ) : ( - <> - )} -
- ) : ( - <> - )} - - - - -
- ); -}; -export default RetentionControlsDialogContent; diff --git a/src/extensions/retentionControls/components/SingleItemView.tsx b/src/extensions/retentionControls/components/SingleItemView.tsx new file mode 100644 index 0000000..b6eb46f --- /dev/null +++ b/src/extensions/retentionControls/components/SingleItemView.tsx @@ -0,0 +1,403 @@ +import * as React from "react"; +import { IDriveItem } from "../../../shared/interfaces/IDriveItem"; +import * as strings from "RetentionControlsCommandSetStrings"; +import { classNames, dialogFooterStyles, messageBarStyles, stackItemStyles, stackTokens } from "../../../shared/styles"; +import { Stack } from "@fluentui/react/lib/Stack"; +import { Shimmer } from "@fluentui/react/lib/Shimmer"; +import { Spinner, SpinnerSize } from "@fluentui/react/lib/Spinner"; +import { Link } from "@fluentui/react/lib/Link"; +import { FontIcon } from "@fluentui/react/lib/Icon"; +import { flattenItemMetadata, getBehaviorLabel } from "../../../shared/utils"; +import { initializeIcons } from "@fluentui/react/lib/Icons"; +import Dialog, { DialogFooter, DialogType } from "@fluentui/react/lib/Dialog"; +import { DefaultButton } from "@fluentui/react/lib/Button"; +import { MessageBar, MessageBarType } from "@fluentui/react/lib/MessageBar"; +import { useEffect, useState } from "react"; +import { Log } from "@microsoft/sp-core-library"; +import { LOG_SOURCE } from "../RetentionControlsCommandSet"; +import { IItemState } from "../../../shared/interfaces/IItemState"; +import { RowAccessor } from "@microsoft/sp-listview-extensibility"; +import { IBatchItemResponse } from "../../../shared/interfaces/IBatchErrorResponse"; +import { format } from "@fluentui/react/lib/Utilities"; +import { ResponsiveMode } from "@fluentui/react/lib/ResponsiveMode"; +import { INotification } from "../../../shared/interfaces/INotification"; +import AlertDialogManager from "../AlertDialogManager"; +import ConfirmationDialogManager from "../ConfirmationDialogManager"; +import { IItemMetadata } from "../../../shared/interfaces/IItemMetadata"; +initializeIcons(); + +export interface ISingleItemView { + listItems: readonly RowAccessor[]; + onClose: () => void; + onFetching: (listItemIds: number[]) => Promise; + onClearing: (listItemIds: number[]) => Promise; + onToggling: (listItemIds: number[], newLockState: boolean) => Promise; +} + +export const SingleItemView: React.FC = (props) => { + const { listItems } = props; + const listItem = listItems[0]; + const listItemId = listItem !== undefined ? parseFloat(listItem.getValueByName("ID")) : undefined; + const fileName = listItem?.getValueByName("FileLeafRef"); + const initialRetentionLabel = listItem?.getValueByName("_ComplianceTag"); + + const [loading, setLoading] = useState(true); + const [notification, setNotification] = useState(); + const [itemDetails, setItemDetails] = useState(); + const [itemState, setItemState] = useState>({ clearing: false, toggling: false, errorClearing: false }); + + const labelAppliedDate = itemDetails?.labelAppliedDate ? itemDetails?.labelAppliedDate : "N/A"; + const eventDate = itemDetails?.eventDate !== undefined && itemDetails?.eventDate?.indexOf("9999") === -1 ? new Date(itemDetails?.eventDate).toLocaleDateString() : undefined; + + const fetchData = async (): Promise => { + try { + setLoading(true); + + if (listItemId) { + const response = await props.onFetching([listItemId]); + setItemDetails(flattenItemMetadata(response[0])); + } + else + setNotification({ message: strings.NoLabelApplied, notificationType: MessageBarType.info }); + + setLoading(false); + } catch (error) { + const message = strings.ErrorFetchingData + ": " + error.message; + Log.error(LOG_SOURCE, new Error(message)); + setNotification({ message: message, notificationType: MessageBarType.error }); + setLoading(false); + } + }; + + const onClearingLabel = async (): Promise => { + if (!itemDetails || !listItemId) { + return; + } + + Log.info(LOG_SOURCE, `Clearing label for '${itemDetails.name}'`); + + setNotification(undefined); + setItemState({ ...itemState, clearing: true, errorClearing: false }); + + try { + const responses = await props.onClearing([itemDetails.id]); + const isError = responses.every((r) => r.success === false); + const newItemDetails = await props.onFetching([listItemId]); + setItemDetails(flattenItemMetadata(newItemDetails[0])); + + if (isError) { + setNotification({ message: strings.ClearErrorForSingleItem, notificationType: MessageBarType.error }); + } + else if (!isError && newItemDetails.every(d => d.retentionLabel?.name === undefined)) { + setNotification({ message: strings.LabelCleared, notificationType: MessageBarType.success }); + } + + setItemState({ ...itemState, clearing: false, errorClearing: isError === true }); + } + catch (error) { + setNotification({ message: error.message, notificationType: MessageBarType.error }); + Log.error(LOG_SOURCE, new Error(error.message)); + setItemState({ ...itemState, clearing: false, errorClearing: true }); + } + }; + + const onTogglingLabel = async (): Promise => { + if (!itemDetails || !listItemId) { + return; + } + + Log.info(LOG_SOURCE, `Toggling record state for '${itemDetails.name}'`); + + setNotification(undefined); + setItemState({ ...itemState, toggling: true, errorToggling: undefined }); + + try { + const newLockState = itemDetails.isRecordLocked === true ? false : true; + const responses = await props.onToggling([itemDetails.id], newLockState); + const isError = responses.every((r) => r.success === false); + const newItemDetails = await props.onFetching([listItemId]); + setItemDetails(flattenItemMetadata(newItemDetails[0])); + + if (isError) { + setNotification({ message: strings.ClearErrorForSingleItem, notificationType: MessageBarType.error }); + } + else if (!isError) { + setNotification({ message: format(strings.RecordStatusToggled, newLockState === true ? strings.Locked.toLowerCase() : strings.Unlocked.toLowerCase()), notificationType: MessageBarType.success }); + } + + setItemState({ ...itemState, toggling: false, errorToggling: responses[0].errorMessage }); + } + catch (error) { + setNotification({ message: error.message, notificationType: MessageBarType.error }); + Log.error(LOG_SOURCE, new Error(error.message)); + setItemState({ ...itemState, toggling: false }); + } + }; + + const onToggleClick = async (): Promise => { + if (!itemDetails || !listItemId) { + return; + } + + if (itemDetails.isFolder) { + const dialog = new AlertDialogManager(strings.ToggleRecordForFolderAlertTitle, strings.ToggleRecordForFolderAlertMessage); + await dialog.show(); + } + else if (!itemDetails.isRecordTypeLabel) { + const dialog = new AlertDialogManager(strings.ToggleRecordForNonRecordLabelAlertTitle, strings.ToggleRecordForNonRecordLabelAlertMessage); + await dialog.show(); + } + else { + await onTogglingLabel(); + } + } + + const onClearClick = async (): Promise => { + if (!itemDetails || !listItemId) { + return; + } + + if (itemDetails.isFolder) { + const dialog = new ConfirmationDialogManager(strings.ClearLabelConfirmationTitle, strings.ClearLabelConfirmationMessage); + dialog.onClosed(async (confirmed?: boolean) => { + if (confirmed === true) { + await onClearingLabel(); + } + }); + await dialog.show(); + } + else if (itemDetails.isRecordTypeLabel && !itemDetails.isRecordLocked) { + const dialog = new AlertDialogManager(strings.CannotClearWhileUnlockedTitle, strings.CannotClearWhileUnlockedMessage); + await dialog.show(); + } + else { + await onClearingLabel(); + } + } + + useEffect(() => { + fetchData().catch((error) => { console.log(error); }); + }, []); + + return <> + + ; +}; diff --git a/src/extensions/retentionControls/loc/en-us.js b/src/extensions/retentionControls/loc/en-us.js index e306a50..90219a8 100644 --- a/src/extensions/retentionControls/loc/en-us.js +++ b/src/extensions/retentionControls/loc/en-us.js @@ -1,43 +1,80 @@ define([], function () { return { - RetentionControlsHeader: "Retention controls", - RetentionLabelApplied: "Retention label", - RetentionLabelsApplied: "Retention labels", - RetentionLabelApplicationDate: "Applied", - RetentionLabelAppliedBy: "Applied by", - RetentionLabelEventDate: "Event date", - RecordStatus: "Record status", - IsDeleteAllowed: "Delete allowed", + BehaviorDoNotRetain: "Do not retain", BehaviorDuringRetentionPeriod: "Behavior during retention period", - IsMetadataUpdateAllowed: "Metadata update allowed", - IsContentUpdateAllowed: "Content update allowed", - IsLabelUpdateAllowed: "Label update allowed", - ToggleOnText: "Yes", - ToggleOffText: "No", - Locked: "Locked", - Unlocked: "Unlocked", - Toggling: "Toggling...", - Clearing: "Clearing...", - ToggleLockStatus: "Toggle", BehaviorRetain: "Retain", - BehaviorDoNotRetain: "Do not retain", BehaviorRetainAsRecord: "Retain as record", BehaviorRetainAsRegulatoryRecord: "Retain as regulatory record", - NoLabelApplied: "No retention label has been applied to this file/folder", - MultipleItemsSelected: "You have selected {0} items. Select one item at a time for more information.", - ClearLabel: "Clear label", - ClearLabels: "Clear labels", - LabelCleared: "The retention label has been cleared for the selected item(s).", - RecordStatusToggled: "This record has been {0} for editing.", - CloseModal: "Close", - CannotClearWhileUnlocked: "This record is unlocked for editing. Please lock it first before clearing the label.", + CannotClearWhileUnlockedTitle: "Unlocked Record", + CannotClearWhileUnlockedMessage: "This record is unlocked for editing. Please lock it first before clearing the label.", + CheckingItems: "Checking items", ClearErrorForMultipleItems: "The retention label could not be cleared for {0} out of {1} items. Possible reasons may be that the items are unlocked for editing, or that you don't have permission.", ClearErrorForSingleItem: "The retention label could not be cleared for this item. A possible reasons might be that the items are unlocked for editing, or that you don't have permission.", - UnhandledError: "A generic error occurred while executing an HTTP-request", - IsMetadataUpdateAllowedTooltip: "Specifies whether updates to the item metadata (for example, the Title field) are allowed.", - IsDeleteAllowedTooltip: "Specifies whether item deletion is allowed.", - isLabelUpdateAllowedTooltip: "Specifies whether you're allowed to change the retention label on the document.", + Clearing: "Clearing...", + ClearingItems: "Clearing {0} items", + ClearLabel: "Clear label", + ClearLabelWarningTooltip: "Something went wrong while clearing the label. Click here to try again.", + ClearLabels: "Clear all labels", + ClearLabelsTooltip: "Click to clear all labels", + ClearLabelConfirmationTitle: "About folders", + ClearLabelConfirmationMessage: "The selected item is a folder. This operation does not clear the retention label from any content in the folder. It will only make sure new content created in the folder will not automatically get a retention label. Do you want to continue clearing the label from just the folder?", + CloseModal: "Close", + ErrorFetchingData: "An error occurred while fetching data", + FileName: "File", + IsContentUpdateAllowed: "Content update allowed", IsContentUpdateAllowedTooltip: "Specifies whether updates to document content are allowed.", + IsDeleteAllowed: "Delete allowed", + IsDeleteAllowedTooltip: "Specifies whether item deletion is allowed.", + IsFirstPage: "This is the first page", + IsLabelUpdateAllowed: "Label update allowed", + IsLabelUpdateAllowedTooltip: "Specifies whether you're allowed to change the retention label on the document.", + IsLastPage: "This is the last page", + IsMetadataUpdateAllowed: "Metadata update allowed", + IsMetadataUpdateAllowedTooltip: "Specifies whether updates to the item metadata (for example, the Title field) are allowed.", + IsRecordLocked: "Record locked", + ItemsDone: "items done", + LabelCleared: "The retention label has been cleared for the selected item(s).", + LabelClearedForLibrary: "The retention label has been cleared for all items in this library.", + Locked: "Locked", + LockRecords: "Lock all records", + LockRecordsTooltip: "Click to lock all unlocked records", + UnlockRecords: "Unlock all records", + UnlockRecordsTooltip: "Unlock all locked records for editing", + MultipleItemsSelected: "You have selected {0} items. Select one item at a time for more information.", + NoLabelApplied: "No retention label has been applied to this file/folder", + NoLabelsApplied: "No retention labels have been applied to selected files/folders", + NoLabelsAppliedEntireLibrary: "No items with retention labels found in this library", + No: "No", + None: "None", + RecordStatus: "Record status", + RecordStatusToggled: "Record(s) have been {0} for editing.", + RecordStatusToggledEntireLibrary: "All records in this library have been {0} for editing.", RecordStatusTooltip: "Specifies whether the item is locked for editing.", + RetentionControlsHeader: "Retention controls", + RetentionLabelApplicationDate: "Applied", + RetentionLabelApplied: "Retention label", + RetentionLabelAppliedBy: "Applied by", + RetentionLabelEventDate: "Event date", + RetentionLabelsApplied: "Retention labels", + TakeBulkActionsSelectedItems: "Take bulk action (on selected items)", + TakeBulkActionsSelectedItemsTooltip: "Click to take bulk actions on the selected items", + TakeBulkActionsEntireLibrary: "Take bulk action (on entire library)", + TakeBulkActionsEntireLibraryTooltip: "Click to take bulk actions on the entire library", + ToggleLockStatus: "Toggle", + ToggleOffText: "No", + ToggleOnText: "Yes", + Toggling: "Toggling...", + ToggleErrorForMultipleItems: "The record could not be {0} for {1} out of {2} items.", + ToggleErrorForSingleItem: "The record could not be {0} for this item.", + TogglingItems: "Toggling {0} items", + ToggleWarning: "Record status: {0}. An error occurred: {1} Click to try toggling the lock status again.", + ToggleRecordForFolderAlertTitle: "About folders", + ToggleRecordForFolderAlertMessage: "The selected item is a folder and cannot be unlocked.", + ToggleRecordForNonRecordLabelAlertTitle: "Non-record label applied", + ToggleRecordForNonRecordLabelAlertMessage: "The selected item is labelled with a non-record retention label and therefore cannot be locked.", + ToPage: "Navigate to page {0}", + UnhandledError: "A generic error occurred while executing an HTTP-request", + Unlocked: "Unlocked", + Yes: "Yes", }; }); diff --git a/src/extensions/retentionControls/loc/myStrings.d.ts b/src/extensions/retentionControls/loc/myStrings.d.ts index a375984..205c600 100644 --- a/src/extensions/retentionControls/loc/myStrings.d.ts +++ b/src/extensions/retentionControls/loc/myStrings.d.ts @@ -1,43 +1,80 @@ declare interface IRetentionControlsCommandSetStrings { - RetentionControlsHeader: string; - RetentionLabelApplied: string; - RetentionLabelsApplied: string; - RetentionLabelApplicationDate: string; - RetentionLabelAppliedBy: string; - RetentionLabelEventDate: string; - RecordStatus: string; - IsDeleteAllowed: string; + BehaviorDoNotRetain: string; BehaviorDuringRetentionPeriod: string; - IsMetadataUpdateAllowed: string; - IsContentUpdateAllowed: string; - IsLabelUpdateAllowed: string; - ToggleOnText: string; - ToggleOffText: string; - Locked: string; - Unlocked: string; - Toggling: string; - Clearing: string; - ToggleLockStatus: string; BehaviorRetain: string; - BehaviorDoNotRetain: string; BehaviorRetainAsRecord: string; BehaviorRetainAsRegulatoryRecord: string; - NoLabelApplied: string; - MultipleItemsSelected: string; + CannotClearWhileUnlockedTitle: string; + CannotClearWhileUnlockedMessage: string; + CheckingItems: string; + ClearErrorForMultipleItems: string; + ClearErrorForSingleItem: string; + Clearing: string; + ClearingItems: string; ClearLabel: string; + ClearLabelWarningTooltip: string; ClearLabels: string; - LabelCleared: string; - RecordStatusToggled: string; + ClearLabelsTooltip: string; + ClearLabelConfirmationTitle: string; + ClearLabelConfirmationMessage: string; CloseModal: string; - CannotClearWhileUnlocked: string; - ClearErrorForMultipleItems: string; - ClearErrorForSingleItem: string; - UnhandledError: string; - IsMetadataUpdateAllowedTooltip: string; - IsDeleteAllowedTooltip: string; - isLabelUpdateAllowedTooltip: string; + ErrorFetchingData: string; + FileName: string; + IsContentUpdateAllowed: string; IsContentUpdateAllowedTooltip: string; + IsDeleteAllowed: string; + IsDeleteAllowedTooltip: string; + IsFirstPage: string; + IsLabelUpdateAllowed: string; + IsLabelUpdateAllowedTooltip: string; + IsLastPage: string; + IsMetadataUpdateAllowed: string; + IsMetadataUpdateAllowedTooltip: string; + IsRecordLocked: string; + ItemsDone: string; + LabelCleared: string; + LabelClearedForLibrary: string; + Locked: string; + LockRecords: string; + LockRecordsTooltip: string; + UnlockRecords: string; + UnlockRecordsTooltip: string; + MultipleItemsSelected: string; + NoLabelApplied: string; + NoLabelsApplied: string; + NoLabelsAppliedEntireLibrary: string; + No: string; + None: string; + RecordStatus: string; + RecordStatusToggled: string; + RecordStatusToggledEntireLibrary: string; RecordStatusTooltip: string; + RetentionControlsHeader: string; + RetentionLabelApplicationDate: string; + RetentionLabelApplied: string; + RetentionLabelAppliedBy: string; + RetentionLabelEventDate: string; + RetentionLabelsApplied: string; + TakeBulkActionsSelectedItems: string; + TakeBulkActionsSelectedItemsTooltip: string; + TakeBulkActionsEntireLibrary: string; + TakeBulkActionsEntireLibraryTooltip: string; + ToggleLockStatus: string; + ToggleOffText: string; + ToggleOnText: string; + Toggling: string; + ToggleErrorForMultipleItems: string; + ToggleErrorForSingleItem: string; + TogglingItems: string; + ToggleWarning: string; + ToggleRecordForFolderAlertTitle: string; + ToggleRecordForFolderAlertMessage: string; + ToggleRecordForNonRecordLabelAlertTitle: string; + ToggleRecordForNonRecordLabelAlertMessage: string; + ToPage: string; + UnhandledError: string; + Unlocked: string; + Yes: string; } declare module "RetentionControlsCommandSetStrings" { diff --git a/src/shared/constants.ts b/src/shared/constants.ts new file mode 100644 index 0000000..bc92aab --- /dev/null +++ b/src/shared/constants.ts @@ -0,0 +1,18 @@ +import * as strings from "RetentionControlsCommandSetStrings"; +import { ICustomColumn } from "./interfaces/ICustomColumn"; + +export const itemMetadataColumns: ICustomColumn[] = [ + { key: "icon", name: "Icon", fieldName: "icon", minWidth: 16, maxWidth: 16, isResizable: false, isIconOnly: true, iconName: "Page" }, + { key: "name", name: "Name", fieldName: "name", minWidth: 80, maxWidth: 200, isResizable: true, }, + { key: "retentionLabel", name: "Label", fieldName: "retentionLabel", minWidth: 80, maxWidth: 200, isResizable: true }, + { key: "labelAppliedBy", name: "Applied by", fieldName: "labelAppliedBy", minWidth: 80, maxWidth: 200, isResizable: true }, + { key: "labelAppliedDate", name: "Applied", fieldName: "labelAppliedDate", minWidth: 80, maxWidth: 200, isResizable: true }, + { key: "eventDate", name: "Event date", fieldName: "eventDate", minWidth: 80, maxWidth: 200, isResizable: true }, + { key: "behaviorDuringRetentionPeriod", name: "Behavior", fieldName: "name", minWidth: 80, maxWidth: 200, isResizable: true }, + { key: "isDeleteAllowed", name: "Delete", fieldName: "isDeleteAllowed", minWidth: 16, maxWidth: 16, isResizable: false, isIconOnly: true, iconName: "Delete", title: strings.IsDeleteAllowed }, + { key: "isMetadataUpdateAllowed", name: "Metadata update", fieldName: "isMetadataUpdateAllowed", minWidth: 16, maxWidth: 16, isResizable: false, isIconOnly: true, iconName: "PageHeaderEdit", title: strings.IsMetadataUpdateAllowed }, + { key: "isContentUpdateAllowed", name: "Content update", fieldName: "isContentUpdateAllowed", minWidth: 16, maxWidth: 16, isResizable: false, isIconOnly: true, iconName: "PageEdit", title: strings.IsContentUpdateAllowed }, + { key: "isLabelUpdateAllowed", name: "Label update", fieldName: "isLabelUpdateAllowed", minWidth: 16, maxWidth: 16, isResizable: false, isIconOnly: true, iconName: "Tag", title: strings.IsLabelUpdateAllowed }, + { key: "isRecordLocked", name: "Locked", fieldName: "isRecordLocked", minWidth: 16, maxWidth: 16, isResizable: false, isIconOnly: true, iconName: "Lock", title: strings.RecordStatus }, + { key: "clearLabel", name: "clearLabel", fieldName: "clearLabel", minWidth: 16, maxWidth: 16, isResizable: false, isIconOnly: true, iconName: "Untag", title: strings.ClearLabel }, +]; \ No newline at end of file diff --git a/src/shared/interfaces/IBatchErrorResponse.ts b/src/shared/interfaces/IBatchErrorResponse.ts new file mode 100644 index 0000000..fa63dc7 --- /dev/null +++ b/src/shared/interfaces/IBatchErrorResponse.ts @@ -0,0 +1,5 @@ +export interface IBatchItemResponse { + listItemId: number; + success: boolean; + errorMessage?: string; +} \ No newline at end of file diff --git a/src/shared/interfaces/ICustomColumn.ts b/src/shared/interfaces/ICustomColumn.ts new file mode 100644 index 0000000..2927fa1 --- /dev/null +++ b/src/shared/interfaces/ICustomColumn.ts @@ -0,0 +1,5 @@ +import { IColumn } from "@fluentui/react/lib/components/DetailsList"; + +export interface ICustomColumn extends IColumn { + title?: string; +} \ No newline at end of file diff --git a/src/shared/interfaces/IDriveItem.ts b/src/shared/interfaces/IDriveItem.ts new file mode 100644 index 0000000..d133b10 --- /dev/null +++ b/src/shared/interfaces/IDriveItem.ts @@ -0,0 +1,10 @@ +import { IListItemFields } from "./IListItemFields"; +import { IRetentionLabel } from "./IRetentionLabel"; + +export interface IDriveItem { + name: string; + id: string; + parentReference: { path: string }; + listItem: { fields: IListItemFields, id: string, contentType: { id: string, name: string } }; + retentionLabel?: IRetentionLabel; +} \ No newline at end of file diff --git a/src/shared/interfaces/IItemMetadata.ts b/src/shared/interfaces/IItemMetadata.ts new file mode 100644 index 0000000..1bbafde --- /dev/null +++ b/src/shared/interfaces/IItemMetadata.ts @@ -0,0 +1,19 @@ +export interface IItemMetadata { + id: number; + driveItemId: string; + name: string; + path: string; + contentTypeId: string; + isFolder: boolean; + isRecordTypeLabel: boolean; + retentionLabel?: string; + labelAppliedBy?: string; + labelAppliedDate?: string; + eventDate?: string; + behaviorDuringRetentionPeriod?: string; + isDeleteAllowed?: boolean; + isRecordLocked?: boolean; + isMetadataUpdateAllowed?: boolean; + isContentUpdateAllowed?: boolean; + isLabelUpdateAllowed?: boolean; +} \ No newline at end of file diff --git a/src/shared/interfaces/IItemState.ts b/src/shared/interfaces/IItemState.ts new file mode 100644 index 0000000..9c9ca3a --- /dev/null +++ b/src/shared/interfaces/IItemState.ts @@ -0,0 +1,8 @@ + +export interface IItemState { + listItemId: number; + toggling: boolean; + clearing: boolean; + errorToggling?: string | undefined; + errorClearing: boolean; +} diff --git a/src/shared/interfaces/INotification.ts b/src/shared/interfaces/INotification.ts new file mode 100644 index 0000000..93f3acb --- /dev/null +++ b/src/shared/interfaces/INotification.ts @@ -0,0 +1,7 @@ +import { MessageBarType } from "@fluentui/react/lib/MessageBar"; + +export interface INotification { + message: string; + notificationType: MessageBarType; +} + \ No newline at end of file diff --git a/src/shared/interfaces/IPagedDriveItems.ts b/src/shared/interfaces/IPagedDriveItems.ts new file mode 100644 index 0000000..bfd0239 --- /dev/null +++ b/src/shared/interfaces/IPagedDriveItems.ts @@ -0,0 +1,7 @@ +import { IDriveItem } from "./IDriveItem"; + +export interface IPagedDriveItems { + nextLink?: string; + items: IDriveItem[]; +} + \ No newline at end of file diff --git a/src/shared/services/SharePointService.ts b/src/shared/services/SharePointService.ts index 195febd..72d33ba 100644 --- a/src/shared/services/SharePointService.ts +++ b/src/shared/services/SharePointService.ts @@ -1,17 +1,21 @@ -import { ServiceKey, ServiceScope } from "@microsoft/sp-core-library"; +import { Guid, ServiceKey, ServiceScope } from "@microsoft/sp-core-library"; import { SPHttpClient } from "@microsoft/sp-http"; import { PageContext } from "@microsoft/sp-page-context"; import { IRetentionLabel } from "../interfaces/IRetentionLabel"; -import { Warning } from "../Warning"; import * as strings from "RetentionControlsCommandSetStrings"; -import { format } from "@fluentui/react"; import { IListItemFields } from "../interfaces/IListItemFields"; +import { IDriveItem as IDriveItem } from "../interfaces/IDriveItem"; +import { IBatchItemResponse } from "../interfaces/IBatchErrorResponse"; +import { IPagedDriveItems } from "../interfaces/IPagedDriveItems"; export interface ISharePointService { + getPagedDriveItems(listId: string, pageSize?: number): Promise + getPagedDriveItemsUsingNextLink(nextLink: string): Promise + getDriveItems: (listId: string, listItemId: number[]) => Promise; getListItemFields: (listId: string, listItemId: number) => Promise; getRetentionSettings: (listId: string, listItemId: number) => Promise; - clearRetentionLabels: (listItemId: number[]) => Promise; - toggleLockStatus: (listItemId: string, lockStatus: boolean) => Promise; + clearRetentionLabels: (listItemIds: number[]) => Promise; + toggleLockStatus: (listItemIds: number[], lockStatus: boolean) => Promise; } export class SharePointService implements ISharePointService { @@ -27,6 +31,51 @@ export class SharePointService implements ISharePointService { }); } + /** + * Get a recursively paged list of Drive Items with retention labels + */ + public async getPagedDriveItems(listId: string, pageSize: number = 10): Promise { + const driveId = await this.getDriveId(listId); + const requestUrl = `${this._pageContext.site.absoluteUrl}/_api/v2.0/drives/${driveId}/items`; + + const queryStrings = [ + `$filter=retentionLabel/name ne null`, + `$expand=retentionLabel,listItem($select=id,contentType;$expand=fields($select=FileLeafRef,TagEventDate))`, + `$select=id,name,parentReference,retentionLabel,id,listItem`, + `$top=${pageSize}` + ]; + + return await this.executeGetPagedDriveItems(`${requestUrl}?${queryStrings.join("&")}`); + } + + public async getPagedDriveItemsUsingNextLink(nextLink: string): Promise { + return await this.executeGetPagedDriveItems(nextLink); + } + + /** + * Get Drive Items based on a list of item ID's + */ + public async getDriveItems(listId: string, listItemId: number[]): Promise { + const driveId = await this.getDriveId(listId); + const requestUrl = `${this._pageContext.site.absoluteUrl}/_api/v2.0/drives/${driveId}/items`; + const filterString = listItemId.map((id) => `listItem/id eq '${id}'`).join(" or "); + const queryStrings = [ + `$filter=${filterString}`, + `$expand=retentionLabel,listItem($select=id,contentType;$expand=fields($select=FileLeafRef,TagEventDate))`, + `$select=id,name,parentReference,retentionLabel,id,listItem` + ]; + + const response = await this._spoHttpClient.get(`${requestUrl}?${queryStrings.join("&")}`, SPHttpClient.configurations.v1); + + if (!response.ok) { + const error: { error: { message: string } } = await response.json(); + throw new Error(error?.error?.message ?? strings.UnhandledError); + } + + const responseContent: { value: IDriveItem[] } = await response.json(); + return responseContent.value; + } + public async getListItemFields(listId: string, listItemId: number): Promise { const requestUrl = `${this._pageContext.site.absoluteUrl}/_api/web/lists(guid'${listId}')/items(${listItemId})?$select=TagEventDate`; const response = await this._spoHttpClient.get(requestUrl, SPHttpClient.configurations.v1); @@ -66,60 +115,88 @@ export class SharePointService implements ISharePointService { return responseContent; } - public async clearRetentionLabels(listItemIds: number[]): Promise { + public async clearRetentionLabels(listItemIds: number[]): Promise { if (this._pageContext.list === undefined) { throw new Error("List information not available"); } + const listAbsoluteUrl = new URL(this._pageContext.list.serverRelativeUrl, this._pageContext.site.absoluteUrl); const url = `${this._pageContext.site.absoluteUrl}/_api/SP_CompliancePolicy_SPPolicyStoreProxy_SetComplianceTagOnBulkItems`; - const body = { - listUrl: listAbsoluteUrl.href, - complianceTagValue: "", - itemIds: listItemIds, - }; + const batchArray = [...listItemIds]; + const allResponses: IBatchItemResponse[] = []; + + // Loop through the array in batches of 100 items, which is the max amount to post at this endpoint + while (batchArray.length > 0) { + const listItemIdsBatch = batchArray.splice(0, 100); + + const body = { + listUrl: listAbsoluteUrl.href, + complianceTagValue: "", + itemIds: listItemIdsBatch, + }; + + const response = await this._spoHttpClient.post(url, SPHttpClient.configurations.v1, { + body: JSON.stringify(body), + }); + + if (!response.ok) { + const error: { error: { message: string } } = await response.json(); + throw new Error(error?.error?.message ?? strings.UnhandledError); + } - const response = await this._spoHttpClient.post(url, SPHttpClient.configurations.v1, { - body: JSON.stringify(body), - }); + const content: { value?: number[] } = await response.json(); - if (!response.ok) { - const error: { error: { message: string } } = await response.json(); - throw new Error(error?.error?.message ?? strings.UnhandledError); + if (content.value && content.value.length > 0) { + for (const itemId of listItemIdsBatch) { + allResponses.push({ listItemId: itemId, success: content.value.indexOf(itemId) === -1 }); + } + } + else { + for (const itemId of listItemIdsBatch) { + allResponses.push({ listItemId: itemId, success: true }); + } + } } - const content: { value?: number[] } = await response.json(); + return allResponses; + } - if (content.value && content.value.length > 0) { - if (listItemIds.length !== content.value.length) { - throw new Warning(format(strings.ClearErrorForMultipleItems, content.value.length, listItemIds.length)); + public async toggleLockStatus(listItemIds: number[], lockStatus: boolean): Promise { + const absoluteUrl = new URL(this._pageContext.site.absoluteUrl); + const host = absoluteUrl.host; + const requestUrl = `${this._pageContext.site.absoluteUrl}/_api/$batch`; + + const batchArray = [...listItemIds]; + const allResponses: IBatchItemResponse[] = []; + + // Loop through the array in batches of 100 items + while (batchArray.length > 0) { + const listItemIdsBatch = batchArray.splice(0, 100); + const batchId = Guid.newGuid().toString(); + const body = this.buildBatchBody(listItemIdsBatch, lockStatus, batchId) + + const response = await this._spoHttpClient.post(requestUrl, SPHttpClient.configurations.v1, { + body: body, + headers: { + "Content-Type": `multipart/mixed; boundary="batch_${batchId}"`, + "Content-Transfer-Encoding": "binary", + "Host": host + }, + }); + + if (!response.ok) { + const error: { error: { message: string } } = await response.json(); + throw new Error(error?.error?.message ?? strings.UnhandledError); } - throw new Error(strings.ClearErrorForSingleItem); - } - } - - public async toggleLockStatus(listItemId: string, lockStatus: boolean): Promise { - if (this._pageContext.list === undefined) { - throw new Error("List information not available"); + const responseContent = await response.text(); + const responses = this.parseBatchResponseBody(responseContent, listItemIdsBatch); + allResponses.push(...responses); } - const url = lockStatus ? `${this._pageContext.site.absoluteUrl}/_api/SP.CompliancePolicy.SPPolicyStoreProxy.LockRecordItem()` : `${this._pageContext.site.absoluteUrl}/_api/SP.CompliancePolicy.SPPolicyStoreProxy.UnlockRecordItem()`; - - const body = { - listUrl: this._pageContext.list.serverRelativeUrl, - itemId: listItemId, - }; - - const response = await this._spoHttpClient.post(url, SPHttpClient.configurations.v1, { - body: JSON.stringify(body), - }); - - if (!response.ok) { - const error: { error: { message: string } } = await response.json(); - throw new Error(error?.error?.message ?? strings.UnhandledError); - } + return allResponses; } private async getDriveId(listId: string): Promise { @@ -161,4 +238,69 @@ export class SharePointService implements ISharePointService { return responseContent.value[0].id; } + + private buildBatchBody(listItemIds: number[], lockStatus: boolean, batchId: string): string { + const serverRelativeUrl = this._pageContext.list?.serverRelativeUrl; + if (serverRelativeUrl === undefined) { + throw new Error("List information not available"); + } + + const batchUrl = lockStatus ? `${this._pageContext.site.absoluteUrl}/_api/SP.CompliancePolicy.SPPolicyStoreProxy.LockRecordItem()` : `${this._pageContext.site.absoluteUrl}/_api/SP.CompliancePolicy.SPPolicyStoreProxy.UnlockRecordItem()`; + const changeSetId = Guid.newGuid().toString(); + const batchBody: string[] = []; + + batchBody.push(`--batch_${batchId}\n`); + batchBody.push(`Content-Type: multipart/mixed; boundary="changeset_${changeSetId}"\n\n`); + batchBody.push('Content-Transfer-Encoding: binary\n\n'); + + listItemIds.forEach((listItemId, index) => { + batchBody.push(`--changeset_${changeSetId}\n`); + batchBody.push(`Content-Type: application/http\n`); + batchBody.push(`Content-ID: ${index}\n`); + batchBody.push(`Content-Transfer-Encoding: binary\n\n`); + batchBody.push(`POST ${batchUrl} HTTP/1.1\n`); + batchBody.push(`Accept: application/json\n`); + batchBody.push(`Content-Type: application/json;odata=nometadata\n\n`); + batchBody.push(`{ "listUrl": "${serverRelativeUrl}", "itemId": ${listItemId} }\n\n`); + batchBody.push(``); + }); + + batchBody.push(`--changeset_${changeSetId}--\n\n`); + batchBody.push(`--batch_${batchId}--\n`); + + return batchBody.join(''); + } + + private parseBatchResponseBody(response: string, listItemIds: number[]): IBatchItemResponse[] { + const responses: IBatchItemResponse[] = []; + + response.split('\r\n') + .filter((line: string) => line.indexOf('{') === 0) + .forEach((line: string, index: number) => { + const parsedResponse = JSON.parse(line); + + if (parsedResponse.error) { + // if an error object is returned, the request failed + const error = parsedResponse.error as { message: string }; + responses.push({ errorMessage: error.message, listItemId: listItemIds[index], success: false }); + } + else { + responses.push({ listItemId: listItemIds[index], success: true }); + } + }); + + return responses; + } + + private async executeGetPagedDriveItems(requestUrl: string): Promise { + const response = await this._spoHttpClient.get(requestUrl, SPHttpClient.configurations.v1); + + if (!response.ok) { + const error: { error: { message: string } } = await response.json(); + throw new Error(error?.error?.message ?? strings.UnhandledError); + } + + const responseContent: { value: IDriveItem[] } = await response.json(); + return { nextLink: (responseContent as never)['@odata.nextLink'], items: responseContent.value }; + } } diff --git a/src/shared/styles.ts b/src/shared/styles.ts new file mode 100644 index 0000000..1865c28 --- /dev/null +++ b/src/shared/styles.ts @@ -0,0 +1,46 @@ +import { IDialogFooterStyles } from "@fluentui/react/lib/Dialog"; +import { IMessageBarStyles } from "@fluentui/react/lib/MessageBar"; +import { IStackItemStyles, IStackTokens } from "@fluentui/react/lib/Stack"; +import { mergeStyles, mergeStyleSets } from "@fluentui/react/lib/Styling"; + +export const messageBarStyles: IMessageBarStyles = { + root: { + marginBottom: "10px", + }, +}; + +export const stackItemStyles: IStackItemStyles = { + root: { + alignItems: "center", + display: "flex", + width: "250px", + }, +}; + +export const dialogFooterStyles: IDialogFooterStyles = { + action: { }, + actions: {}, + actionsRight: { + justifyContent: "space-between", + display: "flex" + }, +}; + +export const stackTokens: IStackTokens = { + childrenGap: 5, +}; + +export const iconClass = mergeStyles({ + fontSize: 14, + height: 14, + width: 14, + margin: "0 0 0 0", + cursor: "pointer", +}); + +export const classNames = mergeStyleSets({ + green: [{ color: "darkgreen" }, iconClass], + red: [{ color: "indianred" }, iconClass], + blue: [{ color: "#28a8ea" }, iconClass], + dark: [{ }, iconClass], +}); diff --git a/src/shared/utils.ts b/src/shared/utils.ts new file mode 100644 index 0000000..af9a9b9 --- /dev/null +++ b/src/shared/utils.ts @@ -0,0 +1,62 @@ +import { IDriveItem } from "./interfaces/IDriveItem"; +import { IItemMetadata } from "./interfaces/IItemMetadata"; + +export const getBehaviorLabel = (behavior: string | undefined): string => { + switch (behavior) { + case "retain": + return "Retain"; + case "doNotRetain": + return "Do not retain"; + case "retainAsRecord": + return "Retain as record"; + case "retainAsRegulatoryRecord": + return "Retain as regulatory record"; + default: + return "N/A"; + } +}; + +export const isRecordTypeLabel = (behavior: string | undefined): boolean => { + return behavior === "retainAsRecord" || behavior === "retainAsRegulatoryRecord"; +} + +export const flattenItemMetadata = (item: IDriveItem | undefined): IItemMetadata | undefined => { + if (item === undefined) { + return undefined; + } + + const siteRelativeFolder = item.parentReference.path.split(":").pop()?.replace(/^\//,''); + const libraryRelativePath = siteRelativeFolder ? `${siteRelativeFolder}/${item.name}` : item.name; + + return { + id: parseFloat(item.listItem.id), + driveItemId: item.id, + name: item.name, + path: libraryRelativePath, + contentTypeId: item.listItem.contentType.id, + isFolder: item.listItem.contentType.id.indexOf("0x0120") !== -1, + isRecordTypeLabel: isRecordTypeLabel(item.retentionLabel?.retentionSettings?.behaviorDuringRetentionPeriod), + retentionLabel: item.retentionLabel?.name, + labelAppliedBy: item?.retentionLabel?.labelAppliedBy?.user?.displayName || (item?.retentionLabel?.labelAppliedBy as { application?: { displayName: string } })?.application?.displayName, + labelAppliedDate: item?.retentionLabel?.labelAppliedDateTime ? new Date(item?.retentionLabel?.labelAppliedDateTime).toLocaleDateString() : undefined, + eventDate: item?.listItem.fields.TagEventDate !== undefined && item?.listItem.fields.TagEventDate?.indexOf("9999") === -1 ? new Date(item?.listItem.fields.TagEventDate).toLocaleDateString() : undefined, + behaviorDuringRetentionPeriod: item.retentionLabel?.retentionSettings?.behaviorDuringRetentionPeriod, + isDeleteAllowed: item.retentionLabel?.retentionSettings?.isDeleteAllowed, + isRecordLocked: item.retentionLabel?.retentionSettings?.isRecordLocked, + isMetadataUpdateAllowed: item.retentionLabel?.retentionSettings?.isMetadataUpdateAllowed, + isContentUpdateAllowed: item.retentionLabel?.retentionSettings?.isContentUpdateAllowed, + isLabelUpdateAllowed: item.retentionLabel?.retentionSettings?.isLabelUpdateAllowed + } as IItemMetadata; +}; + +export const flattenItemMetadataList = (items: IDriveItem[] | undefined): IItemMetadata[] => { + return items ? items.filter(i => i.retentionLabel?.name !== undefined).map(item => flattenItemMetadata(item) as IItemMetadata) : []; +}; + +export const updateObjectProperties = (original: T, updated: T): void => { + for (const key in updated) { + if (Object.prototype.hasOwnProperty.call(original, key)) { + (original as never)[key] = (updated as never)[key]; + } + } +}; \ No newline at end of file

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 rnXSD!L0dr7YUjTJdO*h^ literal 0 HcmV?d00001 diff --git a/src/extensions/retentionControls/AlertDialogManager.tsx b/src/extensions/retentionControls/AlertDialogManager.tsx new file mode 100644 index 0000000..bdb4572 --- /dev/null +++ b/src/extensions/retentionControls/AlertDialogManager.tsx @@ -0,0 +1,55 @@ +import * as ReactDOM from "react-dom"; +import * as React from "react"; +import Dialog, { DialogFooter, DialogType } from "@fluentui/react/lib/Dialog"; +import { DefaultButton } from "@fluentui/react/lib/Button"; +import * as strings from "RetentionControlsCommandSetStrings"; + +export default class AlertDialogManager { + private domElement: HTMLDivElement | null = null; + private onClosedCallback: (confirmed?: boolean) => void; + + constructor(private title: string, private subText: string, private buttonText?: string) { + } + + public async close(confirmed?: boolean): Promise { + if (this.domElement) { + ReactDOM.unmountComponentAtNode(this.domElement); + this.domElement.remove(); + this.domElement = null; + } + + if (this.onClosedCallback !== undefined) { + this.onClosedCallback(confirmed); + } + } + + public onClosed(callback: (confirmed?:boolean)=>void): void { + this.onClosedCallback = callback; + } + + public async show(): Promise { + this.domElement = document.createElement('div'); + document.body.appendChild(this.domElement); + + const close = async (confirmed?: boolean): Promise => { + await this.close(confirmed); + }; + + const reactElement =