From b0e2e658850f679802bb5550610f3a521d181095 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 17 Sep 2024 17:08:27 +0200 Subject: [PATCH] Add document history button with modal viewer This commit introduces a History button to the DocumentActionButtonsGroup component to view document versions. It includes new components for the modal dialog and API integrations to fetch and display version histories. This feature allows users to view and restore previous versions of stored objects. --- .../Resources/public/types.ts | 10 ++++ .../vuejs/DocumentActionButtonsGroup.vue | 10 +++- .../StoredObjectButton/HistoryButton.vue | 53 +++++++++++++++++++ .../HistoryButton/HistoryButtonList.vue | 30 +++++++++++ .../HistoryButton/HistoryButtonListItem.vue | 35 ++++++++++++ .../HistoryButton/HistoryButtonModal.vue | 39 ++++++++++++++ .../StoredObjectButton/HistoryButton/api.ts | 8 +++ 7 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton.vue create mode 100644 src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/HistoryButtonList.vue create mode 100644 src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/HistoryButtonListItem.vue create mode 100644 src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/HistoryButtonModal.vue create mode 100644 src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/api.ts diff --git a/src/Bundle/ChillDocStoreBundle/Resources/public/types.ts b/src/Bundle/ChillDocStoreBundle/Resources/public/types.ts index ee6b2bf98..a6ce41512 100644 --- a/src/Bundle/ChillDocStoreBundle/Resources/public/types.ts +++ b/src/Bundle/ChillDocStoreBundle/Resources/public/types.ts @@ -62,6 +62,16 @@ export interface StoredObjectStatusChange { type: string; } +export interface StoredObjectVersionWithPointInTime extends StoredObjectVersionPersisted { + "point-in-times": StoredObjectPointInTime[]; +} + +export interface StoredObjectPointInTime { + id: number; + byUser: User | null; + reason: 'keep-before-conversion'|'keep-by-user'; +} + /** * Function executed by the WopiEditButton component. */ diff --git a/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/DocumentActionButtonsGroup.vue b/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/DocumentActionButtonsGroup.vue index 66546f2a5..614dc7a78 100644 --- a/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/DocumentActionButtonsGroup.vue +++ b/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/DocumentActionButtonsGroup.vue @@ -16,6 +16,9 @@
  • +
  • + +
  • @@ -40,6 +43,7 @@ import { WopiEditButtonExecutableBeforeLeaveFunction } from "../types"; import DesktopEditButton from "ChillDocStoreAssets/vuejs/StoredObjectButton/DesktopEditButton.vue"; +import HistoryButton from "ChillDocStoreAssets/vuejs/StoredObjectButton/HistoryButton.vue"; interface DocumentActionButtonsGroupConfig { storedObject: StoredObject, @@ -126,7 +130,11 @@ const isConvertibleToPdf = computed(() => { && is_extension_viewable(props.storedObject.currentVersion.type) && props.storedObject.currentVersion.type !== 'application/pdf' && props.storedObject.currentVersion.persisted !== false; -}) +}); + +const isHistoryViewable = computed(() => { + return props.storedObject.status === 'ready'; +}); const checkForReady = function(): void { if ( diff --git a/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton.vue b/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton.vue new file mode 100644 index 000000000..108256909 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/HistoryButtonList.vue b/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/HistoryButtonList.vue new file mode 100644 index 000000000..fccdb6a0d --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/HistoryButtonList.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/HistoryButtonListItem.vue b/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/HistoryButtonListItem.vue new file mode 100644 index 000000000..c60d62302 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/HistoryButtonListItem.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/HistoryButtonModal.vue b/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/HistoryButtonModal.vue new file mode 100644 index 000000000..13b994be2 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/HistoryButtonModal.vue @@ -0,0 +1,39 @@ + + + + diff --git a/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/api.ts b/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/api.ts new file mode 100644 index 000000000..b48394826 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Resources/public/vuejs/StoredObjectButton/HistoryButton/api.ts @@ -0,0 +1,8 @@ +import {StoredObject, StoredObjectVersion, StoredObjectVersionWithPointInTime} from "../../../types"; +import {fetchResults, makeFetch} from "../../../../../../ChillMainBundle/Resources/public/lib/api/apiMethods"; + +export const get_versions = async (storedObject: StoredObject): Promise => { + const versions = await fetchResults(`/api/1.0/doc-store/stored-object/${storedObject.uuid}/versions`); + + return versions.sort((a: StoredObjectVersionWithPointInTime, b: StoredObjectVersionWithPointInTime) => a.version - b.version); +}