[Editor] Edit an existing FreeText annotation in double-clicking on it (bug 1787298)
This commit is contained in:
		
							parent
							
								
									c33e6ceb03
								
							
						
					
					
						commit
						5c5f9af803
					
				@ -601,6 +601,20 @@ class AnnotationElement {
 | 
			
		||||
      triggers.classList.add("highlightArea");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  _editOnDoubleClick() {
 | 
			
		||||
    const {
 | 
			
		||||
      annotationEditorType: mode,
 | 
			
		||||
      data: { id: editId },
 | 
			
		||||
    } = this;
 | 
			
		||||
    this.container.addEventListener("dblclick", () => {
 | 
			
		||||
      this.linkService.eventBus?.dispatch("switchannotationeditormode", {
 | 
			
		||||
        source: this,
 | 
			
		||||
        mode,
 | 
			
		||||
        editId,
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class LinkAnnotationElement extends AnnotationElement {
 | 
			
		||||
@ -2217,6 +2231,9 @@ class FreeTextAnnotationElement extends AnnotationElement {
 | 
			
		||||
    if (!this.data.popupRef) {
 | 
			
		||||
      this._createPopup();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this._editOnDoubleClick();
 | 
			
		||||
 | 
			
		||||
    return this.container;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -621,6 +621,11 @@ class AnnotationEditor {
 | 
			
		||||
   */
 | 
			
		||||
  enableEditing() {}
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The editor is about to be edited.
 | 
			
		||||
   */
 | 
			
		||||
  enterInEditMode() {}
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Get the div which really contains the displayed content.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
@ -403,13 +403,18 @@ class FreeTextEditor extends AnnotationEditor {
 | 
			
		||||
    return this.isInEditMode();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /** @inheritdoc */
 | 
			
		||||
  enterInEditMode() {
 | 
			
		||||
    this.enableEditMode();
 | 
			
		||||
    this.editorDiv.focus();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * ondblclick callback.
 | 
			
		||||
   * @param {MouseEvent} event
 | 
			
		||||
   */
 | 
			
		||||
  dblclick(event) {
 | 
			
		||||
    this.enableEditMode();
 | 
			
		||||
    this.editorDiv.focus();
 | 
			
		||||
    this.enterInEditMode();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@ -418,8 +423,7 @@ class FreeTextEditor extends AnnotationEditor {
 | 
			
		||||
   */
 | 
			
		||||
  keydown(event) {
 | 
			
		||||
    if (event.target === this.div && event.key === "Enter") {
 | 
			
		||||
      this.enableEditMode();
 | 
			
		||||
      this.editorDiv.focus();
 | 
			
		||||
      this.enterInEditMode();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -912,18 +912,29 @@ class AnnotationEditorUIManager {
 | 
			
		||||
  /**
 | 
			
		||||
   * Change the editor mode (None, FreeText, Ink, ...)
 | 
			
		||||
   * @param {number} mode
 | 
			
		||||
   * @param {string|null} editId
 | 
			
		||||
   */
 | 
			
		||||
  updateMode(mode) {
 | 
			
		||||
  updateMode(mode, editId = null) {
 | 
			
		||||
    this.#mode = mode;
 | 
			
		||||
    if (mode === AnnotationEditorType.NONE) {
 | 
			
		||||
      this.setEditingState(false);
 | 
			
		||||
      this.#disableAll();
 | 
			
		||||
    } else {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    this.setEditingState(true);
 | 
			
		||||
    this.#enableAll();
 | 
			
		||||
    for (const layer of this.#allLayers.values()) {
 | 
			
		||||
      layer.updateMode(mode);
 | 
			
		||||
    }
 | 
			
		||||
    if (!editId) {
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    for (const editor of this.#allEditors.values()) {
 | 
			
		||||
      if (editor.annotationElementId === editId) {
 | 
			
		||||
        this.setSelected(editor);
 | 
			
		||||
        editor.enterInEditMode();
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1115,6 +1115,39 @@ describe("FreeText Editor", () => {
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  describe("FreeText (edit existing in double clicking on it)", () => {
 | 
			
		||||
    let pages;
 | 
			
		||||
 | 
			
		||||
    beforeAll(async () => {
 | 
			
		||||
      pages = await loadAndWait("freetexts.pdf", ".annotationEditorLayer");
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    afterAll(async () => {
 | 
			
		||||
      await closePages(pages);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    it("must move an annotation", async () => {
 | 
			
		||||
      await Promise.all(
 | 
			
		||||
        pages.map(async ([browserName, page]) => {
 | 
			
		||||
          await page.click("[data-annotation-id='26R']", { clickCount: 2 });
 | 
			
		||||
          await page.waitForTimeout(10);
 | 
			
		||||
 | 
			
		||||
          const [focusedId, editable] = await page.evaluate(() => {
 | 
			
		||||
            const el = document.activeElement;
 | 
			
		||||
            return [el.id, el.contentEditable];
 | 
			
		||||
          });
 | 
			
		||||
          expect(focusedId)
 | 
			
		||||
            .withContext(`In ${browserName}`)
 | 
			
		||||
            .toEqual("pdfjs_internal_editor_0-editor");
 | 
			
		||||
          expect(editable).withContext(`In ${browserName}`).toEqual("true");
 | 
			
		||||
 | 
			
		||||
          const editorIds = await getEditors(page, "freeText");
 | 
			
		||||
          expect(editorIds.length).withContext(`In ${browserName}`).toEqual(6);
 | 
			
		||||
        })
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  describe("FreeText with popup", () => {
 | 
			
		||||
    let pages;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2518,7 +2518,7 @@ function webViewerPresentationMode() {
 | 
			
		||||
  PDFViewerApplication.requestPresentationMode();
 | 
			
		||||
}
 | 
			
		||||
function webViewerSwitchAnnotationEditorMode(evt) {
 | 
			
		||||
  PDFViewerApplication.pdfViewer.annotationEditorMode = evt.mode;
 | 
			
		||||
  PDFViewerApplication.pdfViewer.annotationEditorMode = evt;
 | 
			
		||||
}
 | 
			
		||||
function webViewerSwitchAnnotationEditorParams(evt) {
 | 
			
		||||
  PDFViewerApplication.pdfViewer.annotationEditorParams = evt;
 | 
			
		||||
 | 
			
		||||
@ -175,7 +175,9 @@ class PDFPresentationMode {
 | 
			
		||||
      this.pdfViewer.currentScaleValue = "page-fit";
 | 
			
		||||
 | 
			
		||||
      if (this.#args.annotationEditorMode !== null) {
 | 
			
		||||
        this.pdfViewer.annotationEditorMode = AnnotationEditorType.NONE;
 | 
			
		||||
        this.pdfViewer.annotationEditorMode = {
 | 
			
		||||
          mode: AnnotationEditorType.NONE,
 | 
			
		||||
        };
 | 
			
		||||
      }
 | 
			
		||||
    }, 0);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2203,7 +2203,7 @@ class PDFViewer {
 | 
			
		||||
  /**
 | 
			
		||||
   * @param {number} mode - AnnotationEditor mode (None, FreeText, Ink, ...)
 | 
			
		||||
   */
 | 
			
		||||
  set annotationEditorMode(mode) {
 | 
			
		||||
  set annotationEditorMode({ mode, editId = null }) {
 | 
			
		||||
    if (!this.#annotationEditorUIManager) {
 | 
			
		||||
      throw new Error(`The AnnotationEditor is not enabled.`);
 | 
			
		||||
    }
 | 
			
		||||
@ -2222,7 +2222,7 @@ class PDFViewer {
 | 
			
		||||
      mode,
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    this.#annotationEditorUIManager.updateMode(mode);
 | 
			
		||||
    this.#annotationEditorUIManager.updateMode(mode, editId);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // eslint-disable-next-line accessor-pairs
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user