瀏覽代碼

update: 增加API

wzl 8 月之前
父節點
當前提交
bef6dbea61

+ 22 - 25
packages/core/src/editor/content_container.js

@@ -22,8 +22,6 @@ export class ContentContainer {
     this.tool = this.pageViewer.tool || ''
     this.color = this.pageViewer.color || ''
     this._selectedFrameIndex = -1
-    this.undoList = this.historyManager.undoList
-    this.redoList = this.historyManager.redoList
 
     this.onHandleTool = this.handleTool.bind(this)
     this.onKeydown = this.handleKeyDown.bind(this)
@@ -31,17 +29,19 @@ export class ContentContainer {
   }
 
   async init() {
-    this.undoList.length = 0
-    this.redoList.length = 0
+    this.historyManager.undoList.length = 0
+    this.historyManager.redoList.length = 0
+
     this.eventBus.dispatch('changeOperateList', {
-      undoListLength: this.undoList.length,
-      redoListLength: this.redoList.length
+      undoListLength: 0,
+      redoListLength: 0
     })
 
     const { editPagePtr } = await this.messageHandler.sendWithPromise('InitEditPage', {
       pagePtr: this.pagePtr
     })
     this.editPagePtr = editPagePtr
+    this.historyManager.editPagePtr = editPagePtr
 
     const result = await this.messageHandler.sendWithPromise('BeginEdit', {
       editPagePtr: this.editPagePtr,
@@ -68,7 +68,7 @@ export class ContentContainer {
     this.contentContainer = contentContainer
     this.pageDiv.append(this.contentContainer)
 
-    this.eventBus._on('pagechanging', this.onPageChanging)
+    this.eventBus._on('onPageNumberUpdated', this.onPageChanging)
 
     this.frameEditorList.forEach(editor => {
       editor.removeViewer()
@@ -186,6 +186,9 @@ export class ContentContainer {
     }
 
     this.destroyed = true
+    this.historyManager.editPagePtr = 0
+    this.historyManager.undoList.length = 0
+    this.historyManager.redoList.length = 0
 
     this.eventBus._off('toolChanged', this.onHandleTool)
     document.removeEventListener('keydown', this.onKeydown)
@@ -352,38 +355,32 @@ export class ContentContainer {
   // undo/redo
   async handleResetOperate(op) {
     if (op === 'undo') {
-      const lastUndo = this.undoList.pop()
-      const res = await this.messageHandler.sendWithPromise('Undo', this.editPagePtr)
-      const canRedo = await this.messageHandler.sendWithPromise('CanRedo', this.editPagePtr)
-      canRedo && this.redoList.push(lastUndo)
-      
+      const res = await this.historyManager.undo()
       await this.updateFrameEditor(res)
 
     } else if (op === 'redo') {
-      const lastRedo = this.redoList.pop()
-      const res = await this.messageHandler.sendWithPromise('Redo', lastRedo.editPagePtr)
-      this.undoList.push(lastRedo)
-
+      const res = await this.historyManager.redo()
       await this.updateFrameEditor(res)
     }
 
     this.eventBus.dispatch('changeOperateList', {
-      undoListLength: this.undoList.length,
-      redoListLength: this.redoList.length
+      undoListLength: this.historyManager.undoList.length,
+      redoListLength: this.historyManager.redoList.length
     })
   }
 
   // 修改后添加到undo列表
   async handleOperateList(data) {
-    const canUndo = await this.messageHandler.sendWithPromise('CanUndo', data.editPagePtr)
+    const canUndo = await this.historyManager.canUndo()
     if (!canUndo) return
-    this.undoList.push(data)
-    this.redoList.length = 0
+    this.historyManager.undoList.push(data)
+    this.historyManager.redoList.length = 0
 
     this.eventBus.dispatch('changeOperateList', {
-      undoListLength: this.undoList.length,
-      redoListLength: this.redoList.length
+      undoListLength: this.historyManager.undoList.length,
+      redoListLength: this.historyManager.redoList.length
     })
+    this.eventBus.dispatch('isContentEditModyfied', true)
   }
 
   // undo/redo后,更新视图
@@ -454,8 +451,8 @@ export class ContentContainer {
   handlePageChanging ({pageNumber}) {
     if (this.pageIndex + 1 !== pageNumber) return
     this.eventBus.dispatch('changeOperateList', {
-      undoListLength: this.undoList.length,
-      redoListLength: this.redoList.length
+      undoListLength: this.historyManager.undoList.length,
+      redoListLength: this.historyManager.redoList.length
     })
   }
 }

+ 61 - 0
packages/core/src/editor/content_edit_history_manager.js

@@ -0,0 +1,61 @@
+export class ContentEditHistoryManager {
+  constructor(options) {
+    this.pageIndex = options.pageIndex
+    this.messageHandler = options.messageHandler
+
+    this.undoList = []
+    this.redoList = []
+    this.editPagePtr = 0
+  }
+
+  async canRedo() {
+    if (!this.editPagePtr) {
+      console.warn('Not in content edit mode')
+      return false
+    }
+
+    return await this.messageHandler.sendWithPromise('CanRedo', this.editPagePtr)
+  }
+
+  async canUndo() {
+    if (!this.editPagePtr) {
+      console.warn('Not in content edit mode')
+      return false
+    }
+
+    return await this.messageHandler.sendWithPromise('CanUndo', this.editPagePtr)
+  }
+
+  async redo() {
+    if (!this.editPagePtr) {
+      console.warn('Not in content edit mode')
+      return false
+    }
+
+    const lastRedo = this.redoList.pop()
+    if (!lastRedo) {
+      console.warn('No actions to redo')
+      return false
+    }
+    const res = await this.messageHandler.sendWithPromise('Redo', this.editPagePtr)
+    this.undoList.push(lastRedo)
+    return res
+  }
+
+  async undo() {
+    if (!this.editPagePtr) {
+      console.warn('Not in content edit mode')
+      return false
+    }
+
+    const lastUndo = this.undoList.pop()
+    if (!lastUndo) {
+      console.warn('No actions to undo')
+      return false
+    }
+    const res = await this.messageHandler.sendWithPromise('Undo', this.editPagePtr)
+    const canRedo = await this.canRedo()
+    canRedo && this.redoList.push(lastUndo)
+    return res
+  }
+}

+ 24 - 0
packages/core/src/editor/content_edit_manager.js

@@ -0,0 +1,24 @@
+export class ContentEditManager {
+  constructor(documentViewer) {
+    this.documentViewer = documentViewer
+  }
+
+  async startContentEditMode() {
+    for (const pageView of this.documentViewer.pdfViewer._pages) {
+      if (pageView.contentContainer) {
+        await pageView.contentContainer.init()
+      }
+    }
+    // this.documentViewer.setToolMode('editor')
+  }
+
+  async endContentEditMode() {
+    for (const pageView of this.documentViewer.pdfViewer._pages) {
+      if (pageView.contentContainer) {
+        pageView.contentContainer.destroy()
+        pageView.contentContainer = null
+      }
+    }
+    await this.documentViewer.updateTextPtr()
+  }
+}

+ 0 - 6
packages/core/src/history_manager.js

@@ -1,6 +0,0 @@
-export class HistoryManager {
-  constructor() {
-    this.undoList = []
-    this.redoList = []
-  }
-}

+ 37 - 5
packages/core/src/index.js

@@ -21,6 +21,7 @@ import MessageHandler from "./message_handler"
 import JSZip from 'jszip'
 import Outline from './Outline'
 import { v4 as uuidv4 } from 'uuid';
+import { ContentEditManager } from "./editor/content_edit_manager.js";
 
 GlobalWorkerOptions.workerSrc = './lib/pdf.worker.min.js'
 const CMAP_URL = './cmaps/'
@@ -86,8 +87,8 @@ class ComPDFKitViewer {
 
     this.initWorker()
     this.annotator = 'Guest'
-    this.undoList = []
-    this.redoList = []
+    this.isAnnotationModified = false
+    this.isContentEditModyfied = false
   }
 
   get pagesCount() {
@@ -114,6 +115,10 @@ class ComPDFKitViewer {
     return this.pdfViewer.currentScale;
   }
 
+  get isDocumentModified() {
+    return this.isAnnotationModified || this.isContentEditModyfied;
+  }
+
   getPageWidth(pageNumber) {
     return this.pagesPtr[pageNumber - 1].width
   }
@@ -480,6 +485,8 @@ class ComPDFKitViewer {
     annotationStore.selectedName = null
     this.fontFileInited = false
     this.saveAction = options.saveAction || null
+    this.isAnnotationModified = false
+    this.isContentEditModyfied = false
     const parameters = {
       cMapUrl: CMAP_URL,
       cMapPacked: true,
@@ -1514,7 +1521,7 @@ class ComPDFKitViewer {
     eventBus._on("resize", this.webViewerResize.bind(this));
     eventBus._on("pagerendered", this.webViewerPageRendered.bind(this));
     eventBus._on("updateviewarea", this.webViewerUpdateViewarea.bind(this));
-    eventBus._on("pagechanging", this.webViewerPageChanging.bind(this));
+    eventBus._on("onPageNumberUpdated", this.webViewerPageChanging.bind(this));
     eventBus._on("rotationchanging", this.webViewerRotationChanging.bind(this));
     eventBus._on("sidebarviewchanged", this.webViewerSidebarViewChanged.bind(this));
     eventBus._on("presentationmodechanged", this.webViewerPresentationModeChanged.bind(this));
@@ -1546,6 +1553,7 @@ class ComPDFKitViewer {
     eventBus._on("handleField", this.handleField.bind(this));
     eventBus._on("pageNumberChanged", this.pageNumberChanged.bind(this));
     eventBus._on("updateSignatureAp", this.updateSignatureAp.bind(this));
+    eventBus._on("isContentEditModyfied", this.setContentEditModyfied.bind(this));
   }
 
   bindWindowEvents() {
@@ -1767,6 +1775,8 @@ class ComPDFKitViewer {
       this.#convertAnnotationsForBackend(annotateHandles)
       await this.#postAnnotations(annotateHandles)
     }
+
+    this.isAnnotationModified = true
     return true
   }
 
@@ -2312,8 +2322,7 @@ class ComPDFKitViewer {
       enablePrintAutoRotate: true,
       eventBus: this.eventBus,
       $t: this.$t,
-      doc: this.doc,
-      messageHandler: this.messageHandler
+      doc: this.doc
     });
 
     pdfRenderingQueue.setViewer(this.pdfViewer);
@@ -2364,6 +2373,8 @@ class ComPDFKitViewer {
       });
       this.pdfSidebar.onToggled = this.forceRendering.bind(this);
     }
+
+    this.contentEditManager = new ContentEditManager(this);
   }
 
   setInitialView(
@@ -2475,6 +2486,12 @@ class ComPDFKitViewer {
       top
     })
   }
+  
+  scrollToPercent(percent) {
+    const scrollTotalHeight = this.scrollContainer.scrollHeight - this.scrollContainer.clientHeight;
+    const top = scrollTotalHeight * percent / 100;
+    this.scrollTo({ top });
+  }
 
   webViewerAnnotationsCountChanged(evt) {
     this.annotationsNumChangedCallback(evt.annotationsCount);
@@ -2601,6 +2618,7 @@ class ComPDFKitViewer {
       this.pdfThumbnailViewer.scrollThumbnailIntoView(pageNumber);
     }
     this.pageChangedCallback(this.page)
+    return pageNumber
   }
 
   webViewerSidebarViewChanged({ view }) {
@@ -4071,6 +4089,8 @@ class ComPDFKitViewer {
       this.#convertAnnotationsForBackend(annotateHandles)
       this.#postAnnotations(annotateHandles)
     }
+
+    this.isAnnotationModified = true
   }
 
   async #postAnnotations(annotateHandles) {
@@ -4212,6 +4232,18 @@ class ComPDFKitViewer {
     const { operation, pageNumber } = data
     this.pdfViewer._pages[pageNumber - 1].contentContainer.handleResetOperate(operation)
   }
+
+  getContentEditManager() {
+    return this.contentEditManager
+  }
+
+  getContentEditHistoryManager() {
+    return this.pdfViewer.contentEditHistoryManager
+  }
+
+  setContentEditModyfied(value) {
+    this.isContentEditModyfied = value
+  }
 }
 
 class PDFWorker {

+ 1 - 1
packages/core/src/pdf_page_view.js

@@ -282,7 +282,7 @@ class PDFPageView {
         await this.contentContainer.init()
       } else {
         this.contentContainer.destroy()
-        this.contentContainer = null
+        // this.contentContainer = null
       }
     }
 

+ 15 - 5
packages/core/src/pdf_viewer.js

@@ -37,7 +37,7 @@ import {
 } from "./ui_utils.js";
 
 import { PDFPageView } from "./pdf_page_view.js";
-import { HistoryManager } from "./history_manager.js";
+import { ContentEditHistoryManager } from "./editor/content_edit_history_manager.js";
 
 const DEFAULT_CACHE_SIZE = 3;
 const ENABLE_PERMISSIONS_CLASS = "enablePermissions";
@@ -181,6 +181,7 @@ class PDFViewer {
     this.doc = options.doc;
     this.messageHandler = options.messageHandler;
     this._fontFile = null;
+    this.contentEditHistoryManager = [];
 
     if (
       this.pageColors &&
@@ -272,7 +273,7 @@ class PDFViewer {
     const previous = this._currentPageNumber;
     this._currentPageNumber = val;
 
-    this.eventBus.dispatch("pagechanging", {
+    this.eventBus.dispatch("onPageNumberUpdated", {
       source: this,
       pageNumber: val,
       pageLabel: this._pageLabels?.[val - 1] ?? null,
@@ -624,15 +625,22 @@ class PDFViewer {
         this.viewer.style.setProperty("--scale-factor", viewport.scale);
 
         for (let pageNum = 1; pageNum <= pagesCount; ++pageNum) {
+          const pageIndex = pageNum - 1;
+
+          const historyManager = new ContentEditHistoryManager({
+            pageIndex,
+            messageHandler: this.messageHandler,
+          })
+
           const pageView = new PDFPageView({
             container: viewerElement,
             eventBus: this.eventBus,
             id: pageNum,
-            pageIndex: pageNum - 1,
+            pageIndex,
             scale,
             messageHandler: this.messageHandler,
             annotationStore: this.annotationStore,
-            annotations: annotations && annotations[pageNum - 1] || null,
+            annotations: annotations && annotations[pageIndex] || null,
             annotationsAll: annotations,
             pagesPtr,
             defaultViewport: viewport.clone(),
@@ -654,9 +662,10 @@ class PDFViewer {
             $t: this.$t,
             doc: this.doc,
             messageHandler: this.messageHandler,
-            historyManager: new HistoryManager({ pageIndex: pageNum - 1,  }),
+            historyManager,
           });
           this._pages.push(pageView);
+          this.contentEditHistoryManager.push(historyManager);
         }
         // Set the first `pdfPage` immediately, since it's already loaded,
         // rather than having to repeat the `PDFDocumentProxy.getPage` call in
@@ -798,6 +807,7 @@ class PDFViewer {
     this._scrollMode = ScrollMode.VERTICAL;
     this._previousScrollMode = ScrollMode.UNKNOWN;
     this._spreadMode = SpreadMode.NONE;
+    this.contentEditHistoryManager = [];
 
     this.#scrollModePageState = {
       previousPageNumber: 1,

+ 2 - 2
packages/core/src/tools.js

@@ -184,13 +184,13 @@ class AnnotationManager {
     this._container = container;
     this._eventBus = eventBus;
     this._eventBus._on("editingaction", this._boundOnEditingAction);
-    this._eventBus._on("pagechanging", this._boundOnPageChanging);
+    this._eventBus._on("onPageNumberUpdated", this._boundOnPageChanging);
   }
 
   destroy() {
     this._removeKeyboardManager();
     this._eventBus._off("editingaction", this._boundOnEditingAction);
-    this._eventBus._off("pagechanging", this._boundOnPageChanging);
+    this._eventBus._off("onPageNumberUpdated", this._boundOnPageChanging);
     for (const layer of this._allLayers.values()) {
       layer.destroy();
     }

+ 2 - 0
packages/webview/src/apis/closeElement.js

@@ -0,0 +1,2 @@
+
+export default (store) => (dataElement) => store.dispatch('closeElement')(dataElement);

+ 4 - 4
packages/webview/src/apis/disableElements.js

@@ -12,16 +12,16 @@ export default (store) => (dataElements) => {
   if (Array.isArray(dataElements)) {
     for (let i = 0; i < headerItems.length; i++) {
       dataElements.forEach(element => {
-        if (element === 'header') {
-          store.setDisabledElements('header')
+        if (store.getDisabledElementsObj[dataElements]) {
+          store.setDisabledElements(dataElements)
         } else if (headerItems[i].dataElement === element) {
           headerItems[i].hidden = true;
         }
       });
     }
   } else if (typeof dataElements === 'string') {
-    if (dataElements === 'header') {
-      store.setDisabledElements('header')
+    if (store.getDisabledElementsObj[dataElements]) {
+      store.setDisabledElements(dataElements)
       return
     }
     const obj = headerItems.find(obj => obj.dataElement === dataElements);

+ 4 - 4
packages/webview/src/apis/enableElements.js

@@ -12,16 +12,16 @@ export default (store) => (dataElements) => {
   if (Array.isArray(dataElements)) {
     for (let i = 0; i < headerItems.length; i++) {
       dataElements.forEach(element => {
-        if (element === 'header') {
-          store.setEnabledElements('header')
+        if (store.getDisabledElementsObj[dataElements]) {
+          store.setEnabledElements(dataElements)
         } else if (headerItems[i].dataElement === element) {
           headerItems[i].hidden = false;
         }
       });
     }
   } else if (typeof dataElements === 'string') {
-    if (dataElements === 'header') {
-      store.setEnabledElements('header')
+    if (store.getDisabledElementsObj[dataElements]) {
+      store.setEnabledElements(dataElements)
       return
     }
     const obj = headerItems.find(obj => obj.dataElement === dataElements);

+ 7 - 1
packages/webview/src/apis/index.js

@@ -11,6 +11,9 @@ import setActiceToolMode from './setActiceToolMode';
 import setLanguage from './setLanguage';
 import getPassword from './getPassword';
 import textPopup from './textPopup';
+import openElement from './openElement';
+import closeElement from './closeElement';
+import isElementOpen from './isElementOpen';
 
 export default () => {
   const { locale } = i18n.global
@@ -39,7 +42,10 @@ export default () => {
     setActiceToolMode: setActiceToolMode(useViewer),
     setLanguage: setLanguage(useViewer),
     getPassword: getPassword(documentStore),
-    textPopup: textPopup(viewerStore)
+    textPopup: textPopup(viewerStore),
+    openElement: openElement(useViewer),
+    closeElement: closeElement(useViewer),
+    isElementOpen: isElementOpen(useViewer),
   }
   const documentViewer = core.getDocumentViewer(1);
 

+ 2 - 0
packages/webview/src/apis/isElementOpen.js

@@ -0,0 +1,2 @@
+
+export default (store) => (dataElement) => store.dispatch('isElementOpen')(dataElement);

+ 4 - 0
packages/webview/src/apis/openElement.js

@@ -0,0 +1,4 @@
+export default (store) => (dataElement) => {
+  if ((dataElement === 'rightPanel' || dataElement === 'contentEditorPanel') && store.getRightPanelButtonDisabled) return false;
+  store.dispatch('openElement')(dataElement);
+};

+ 1 - 0
packages/webview/src/components/ContentEditorPanel/ContentEditorPanel.vue

@@ -215,6 +215,7 @@
 
   const isOpen = computed(() => useViewer.isElementOpen('contentEditorPanel'))
   const type = computed(() => useViewer.getContentEditorType)
+  const rightPanelButtonDisabled = computed(() => useViewer.getRightPanelButtonDisabled)
 
   const imageUrl = ref('')
 

+ 2 - 1
packages/webview/src/components/DocumentContainer/DocumentContainer.vue

@@ -9,7 +9,7 @@
       'top': isDisabled ? '0px' : '44px'
     }">
     <div ref="viewerContainer" class="document"></div>
-    <PageNavOverlay :style="{ left: `calc(50% + ${leftPanelSpace / 2}px - ${rightPanelSpace / 2}px)` }" />
+    <PageNavOverlay v-if="!isPageNavOverlayDisabled" :style="{ left: `calc(50% + ${leftPanelSpace / 2}px - ${rightPanelSpace / 2}px)` }" />
   </div>
   <!-- <div id="findbar" class="findbar hidden">
     <div id="findbarInputContainer" class="findbarInputContainer">
@@ -98,6 +98,7 @@ const topSpace = computed(() => {
 const loading = computed(() => useViewer.getUploadLoading && useViewer.getUpload)
 const activePanelTab = computed(() => useViewer.getActiveElementTab('leftPanelTab'))
 const load = computed(() => useViewer.getUpload)
+const isPageNavOverlayDisabled = computed(() => useViewer.getDisabledElements('pageNavOverlay'))
 
 async function handleUpload(evt) {
   const file = evt.target.files[0];

+ 1 - 1
packages/webview/src/components/PageNavOverlay/PageNavOverlay.vue

@@ -1,5 +1,5 @@
 <template>
-  <div v-if="totalPages > 0 && !fullMode" class="page-nav">
+  <div v-if="totalPages > 0 && !fullMode" class="page-nav" data-element="pageNavOverlay">
     <Button
       className="side-arrow-container"
       img="icon-previous-left"

+ 1 - 1
packages/webview/src/components/RightPanel/RightPanel.vue

@@ -242,8 +242,8 @@
   const isOpen = computed(() => useViewer.isElementOpen('rightPanel'))
   const activeTool = computed(() => useDocument.getActiveTool)
   const totalPages = computed(() => useDocument.getTotalPages)
-
   const toolMode = computed(() => useViewer.getToolMode)
+  const rightPanelButtonDisabled = computed(() => useViewer.getRightPanelButtonDisabled)
 
   let property = reactive(useDocument.propertyPanel)
   let oldDestPage = property.destPage

+ 11 - 1
packages/webview/src/components/ToggleRightPanelButton/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <Button :isActive="isActive || contentEditorPanel" v-bind="{ ...item }" :onClick="onClick" :class="{disabled: (isDisabled && isEditorPanelDisabled) || (toolMode !== 'form' && toolMode !== 'editor')}" :title="$t('header.rightPanel')">
+  <Button :isActive="isActive || contentEditorPanel" v-bind="{ ...item }" :onClick="onClick" :class="{ disabled: rightPanelButtonDisabled }" :title="$t('header.rightPanel')">
     <PanelRight />
   </Button>
 </template>
@@ -18,6 +18,7 @@
   })
   const contentEditorPanel = computed(() => useViewer.isElementOpen('contentEditorPanel'))
   const contentEditorType = computed(() => useViewer.getContentEditorType)
+  const rightPanelButtonDisabled = computed(() => useViewer.getRightPanelButtonDisabled)
 
   let isDisabled = ref(true)
   let isEditorPanelDisabled = ref(true)
@@ -33,6 +34,15 @@
     }
   })
 
+  watch([isDisabled, isEditorPanelDisabled, toolMode], (newValues, oldValues) => {
+    const disabled = (newValues[0] && newValues[1]) || (newValues[2] !== 'form' && newValues[2] !== 'editor')
+    useViewer.setRightPanelButtonDisabled(disabled)
+  })
+
+  watch(() => isActive.value, (newValue, oldValue) => {
+    core.eventBus().dispatch('isRightSidePanelOpened', newValue)
+  })
+
   const onClick = () => {
     setTimeout(() => {
       isDisabled.value = document.getElementsByClassName('outline-container').length === 0

+ 2 - 0
packages/webview/src/core/index.js

@@ -74,6 +74,7 @@ import jumpToAnnotation from './jumpToAnnotation'
 import getPageAreaImage from './getPageAreaImage'
 import handleCropPagePopup from './handleCropPagePopup'
 import resetOperate from './resetOperate'
+import eventBus from './eventBus'
 
 export default {
   getDocumentViewer,
@@ -155,4 +156,5 @@ export default {
   getPageAreaImage,
   handleCropPagePopup,
   resetOperate,
+  eventBus,
 }

+ 13 - 4
packages/webview/src/stores/modules/viewer.js

@@ -61,9 +61,8 @@ export const useViewerStore = defineStore({
       signPanelTab: 'keyboard'
     },
     disabledElements: {
-      header: {
-        disabled: false,
-      }
+      header: { disabled: false },
+      pageNavOverlay: { disabled: false },
     },
     headers: [
       {
@@ -392,7 +391,8 @@ export const useViewerStore = defineStore({
       { type: 'cropPage', dataElement: 'cropPageButton' },
       { type: 'close', dataElement: 'exitCroppingButton' }
     ],
-    isDisabledHeader: false
+    isDisabledHeader: false,
+    rightPanelButtonDisabled: true,
   }),
   getters: {
     getLanguage () {
@@ -506,9 +506,15 @@ export const useViewerStore = defineStore({
     getDisabledHeader () {
       return this.isDisabledHeader
     },
+    getDisabledElementsObj: (state) => {
+      return state.disabledElements
+    },
     getDisabledElements: (state) => {
       return (dataElement) => state.disabledElements[dataElement]?.disabled
     },
+    getRightPanelButtonDisabled () {
+      return this.rightPanelButtonDisabled
+    }
   },
   actions: {
     resetSetting () {
@@ -708,6 +714,9 @@ export const useViewerStore = defineStore({
       } else {
         disabledElements[dataElement] = { disabled: false }
       }
+    },
+    setRightPanelButtonDisabled (value) {
+      this.rightPanelButtonDisabled = value
     }
   }
 })