@fiduswriter/editor 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +22 -0
- package/dist/bibliography/tools.js +53 -0
- package/dist/bibliography/tools.js.map +1 -0
- package/dist/citations/index.js +339 -0
- package/dist/citations/index.js.map +1 -0
- package/dist/citations/render.js +47 -0
- package/dist/citations/render.js.map +1 -0
- package/dist/clipboard/copy/index.js +2 -0
- package/dist/clipboard/copy/index.js.map +1 -0
- package/dist/clipboard/copy/schema.js +54 -0
- package/dist/clipboard/copy/schema.js.map +1 -0
- package/dist/clipboard/copy/serializers.js +132 -0
- package/dist/clipboard/copy/serializers.js.map +1 -0
- package/dist/clipboard/paste/fidus_writer.js +45 -0
- package/dist/clipboard/paste/fidus_writer.js.map +1 -0
- package/dist/clipboard/paste/general.js +76 -0
- package/dist/clipboard/paste/general.js.map +1 -0
- package/dist/clipboard/paste/google_docs.js +24 -0
- package/dist/clipboard/paste/google_docs.js.map +1 -0
- package/dist/clipboard/paste/html.js +68 -0
- package/dist/clipboard/paste/html.js.map +1 -0
- package/dist/clipboard/paste/index.js +3 -0
- package/dist/clipboard/paste/index.js.map +1 -0
- package/dist/clipboard/paste/libreoffice_writer.js +27 -0
- package/dist/clipboard/paste/libreoffice_writer.js.map +1 -0
- package/dist/clipboard/paste/microsoft_word.js +79 -0
- package/dist/clipboard/paste/microsoft_word.js.map +1 -0
- package/dist/clipboard/paste/text.js +41 -0
- package/dist/clipboard/paste/text.js.map +1 -0
- package/dist/collab/chat.js +154 -0
- package/dist/collab/chat.js.map +1 -0
- package/dist/collab/colors.js +62 -0
- package/dist/collab/colors.js.map +1 -0
- package/dist/collab/doc.js +1090 -0
- package/dist/collab/doc.js.map +1 -0
- package/dist/collab/index.js +75 -0
- package/dist/collab/index.js.map +1 -0
- package/dist/collab/merge/changeset.js +90 -0
- package/dist/collab/merge/changeset.js.map +1 -0
- package/dist/collab/merge/editor.js +708 -0
- package/dist/collab/merge/editor.js.map +1 -0
- package/dist/collab/merge/footnotes.js +149 -0
- package/dist/collab/merge/footnotes.js.map +1 -0
- package/dist/collab/merge/index.js +270 -0
- package/dist/collab/merge/index.js.map +1 -0
- package/dist/collab/merge/recreate_transform.js +259 -0
- package/dist/collab/merge/recreate_transform.js.map +1 -0
- package/dist/collab/merge/schema.js +117 -0
- package/dist/collab/merge/schema.js.map +1 -0
- package/dist/collab/merge/state_plugins/action.js +138 -0
- package/dist/collab/merge/state_plugins/action.js.map +1 -0
- package/dist/collab/merge/state_plugins/clipboard.js +32 -0
- package/dist/collab/merge/state_plugins/clipboard.js.map +1 -0
- package/dist/collab/merge/state_plugins/diff.js +541 -0
- package/dist/collab/merge/state_plugins/diff.js.map +1 -0
- package/dist/collab/merge/state_plugins/index.js +3 -0
- package/dist/collab/merge/state_plugins/index.js.map +1 -0
- package/dist/collab/merge/tools.js +175 -0
- package/dist/collab/merge/tools.js.map +1 -0
- package/dist/collab/templates.js +10 -0
- package/dist/collab/templates.js.map +1 -0
- package/dist/comments/comment.js +17 -0
- package/dist/comments/comment.js.map +1 -0
- package/dist/comments/editors/answer.js +43 -0
- package/dist/comments/editors/answer.js.map +1 -0
- package/dist/comments/editors/comment.js +278 -0
- package/dist/comments/editors/comment.js.map +1 -0
- package/dist/comments/editors/index.js +4 -0
- package/dist/comments/editors/index.js.map +1 -0
- package/dist/comments/editors/notify.js +13 -0
- package/dist/comments/editors/notify.js.map +1 -0
- package/dist/comments/editors/schema.js +60 -0
- package/dist/comments/editors/schema.js.map +1 -0
- package/dist/comments/index.js +11 -0
- package/dist/comments/index.js.map +1 -0
- package/dist/comments/interactions.js +379 -0
- package/dist/comments/interactions.js.map +1 -0
- package/dist/comments/store.js +438 -0
- package/dist/comments/store.js.map +1 -0
- package/dist/contacts/add_dialog.js +88 -0
- package/dist/contacts/add_dialog.js.map +1 -0
- package/dist/contacts/templates.js +23 -0
- package/dist/contacts/templates.js.map +1 -0
- package/dist/copyright_dialog/index.js +148 -0
- package/dist/copyright_dialog/index.js.map +1 -0
- package/dist/copyright_dialog/templates.js +48 -0
- package/dist/copyright_dialog/templates.js.map +1 -0
- package/dist/databases/bibliography.js +162 -0
- package/dist/databases/bibliography.js.map +1 -0
- package/dist/databases/images.js +260 -0
- package/dist/databases/images.js.map +1 -0
- package/dist/databases/index.js +55 -0
- package/dist/databases/index.js.map +1 -0
- package/dist/dialogs/citation.js +321 -0
- package/dist/dialogs/citation.js.map +1 -0
- package/dist/dialogs/code_block.js +192 -0
- package/dist/dialogs/code_block.js.map +1 -0
- package/dist/dialogs/contributor.js +132 -0
- package/dist/dialogs/contributor.js.map +1 -0
- package/dist/dialogs/figure.js +378 -0
- package/dist/dialogs/figure.js.map +1 -0
- package/dist/dialogs/index.js +11 -0
- package/dist/dialogs/index.js.map +1 -0
- package/dist/dialogs/language.js +47 -0
- package/dist/dialogs/language.js.map +1 -0
- package/dist/dialogs/link.js +243 -0
- package/dist/dialogs/link.js.map +1 -0
- package/dist/dialogs/math.js +121 -0
- package/dist/dialogs/math.js.map +1 -0
- package/dist/dialogs/ordered_list.js +67 -0
- package/dist/dialogs/ordered_list.js.map +1 -0
- package/dist/dialogs/revision.js +36 -0
- package/dist/dialogs/revision.js.map +1 -0
- package/dist/dialogs/subsup.js +109 -0
- package/dist/dialogs/subsup.js.map +1 -0
- package/dist/dialogs/table.js +217 -0
- package/dist/dialogs/table.js.map +1 -0
- package/dist/dialogs/templates.js +366 -0
- package/dist/dialogs/templates.js.map +1 -0
- package/dist/document_template/exporter.js +83 -0
- package/dist/document_template/exporter.js.map +1 -0
- package/dist/document_template/index.js +327 -0
- package/dist/document_template/index.js.map +1 -0
- package/dist/documents/access_rights/index.js +532 -0
- package/dist/documents/access_rights/index.js.map +1 -0
- package/dist/documents/access_rights/templates.js +150 -0
- package/dist/documents/access_rights/templates.js.map +1 -0
- package/dist/e2ee/encryptor.js +201 -0
- package/dist/e2ee/encryptor.js.map +1 -0
- package/dist/e2ee/key-manager.js +171 -0
- package/dist/e2ee/key-manager.js.map +1 -0
- package/dist/e2ee/passphrase-crypto.js +365 -0
- package/dist/e2ee/passphrase-crypto.js.map +1 -0
- package/dist/e2ee/passphrase-dialog.js +548 -0
- package/dist/e2ee/passphrase-dialog.js.map +1 -0
- package/dist/e2ee/passphrase-manager.js +350 -0
- package/dist/e2ee/passphrase-manager.js.map +1 -0
- package/dist/e2ee/password-dialog.js +552 -0
- package/dist/e2ee/password-dialog.js.map +1 -0
- package/dist/e2ee/snapshot-manager.js +238 -0
- package/dist/e2ee/snapshot-manager.js.map +1 -0
- package/dist/exporter/native/copy.js +29 -0
- package/dist/exporter/native/copy.js.map +1 -0
- package/dist/exporter/native/file.js +19 -0
- package/dist/exporter/native/file.js.map +1 -0
- package/dist/exporter/native/index.js +4 -0
- package/dist/exporter/native/index.js.map +1 -0
- package/dist/exporter/native/revision.js +54 -0
- package/dist/exporter/native/revision.js.map +1 -0
- package/dist/exporter/native/zip.js +2 -0
- package/dist/exporter/native/zip.js.map +1 -0
- package/dist/footnotes/editor.js +180 -0
- package/dist/footnotes/editor.js.map +1 -0
- package/dist/footnotes/index.js +15 -0
- package/dist/footnotes/index.js.map +1 -0
- package/dist/footnotes/layout.js +125 -0
- package/dist/footnotes/layout.js.map +1 -0
- package/dist/footnotes/state_plugins/access_rights.js +25 -0
- package/dist/footnotes/state_plugins/access_rights.js.map +1 -0
- package/dist/footnotes/state_plugins/index.js +2 -0
- package/dist/footnotes/state_plugins/index.js.map +1 -0
- package/dist/images/edit_dialog/edit_dialog/index.js +186 -0
- package/dist/images/edit_dialog/edit_dialog/index.js.map +1 -0
- package/dist/images/edit_dialog/edit_dialog/model.js +152 -0
- package/dist/images/edit_dialog/edit_dialog/model.js.map +1 -0
- package/dist/images/edit_dialog/edit_dialog/templates.js +33 -0
- package/dist/images/edit_dialog/edit_dialog/templates.js.map +1 -0
- package/dist/images/edit_dialog/model.js +6 -0
- package/dist/images/edit_dialog/model.js.map +1 -0
- package/dist/images/selection_dialog/index.js +149 -0
- package/dist/images/selection_dialog/index.js.map +1 -0
- package/dist/index.js +1002 -0
- package/dist/index.js.map +1 -0
- package/dist/keymap.js +73 -0
- package/dist/keymap.js.map +1 -0
- package/dist/marginboxes/index.js +674 -0
- package/dist/marginboxes/index.js.map +1 -0
- package/dist/marginboxes/templates.js +447 -0
- package/dist/marginboxes/templates.js.map +1 -0
- package/dist/menus/code_block/index.js +2 -0
- package/dist/menus/code_block/index.js.map +1 -0
- package/dist/menus/code_block/model.js +49 -0
- package/dist/menus/code_block/model.js.map +1 -0
- package/dist/menus/figure/index.js +3 -0
- package/dist/menus/figure/index.js.map +1 -0
- package/dist/menus/figure/model.js +80 -0
- package/dist/menus/figure/model.js.map +1 -0
- package/dist/menus/figure/utils.js +6 -0
- package/dist/menus/figure/utils.js.map +1 -0
- package/dist/menus/headerbar/index.js +3 -0
- package/dist/menus/headerbar/index.js.map +1 -0
- package/dist/menus/headerbar/model.js +743 -0
- package/dist/menus/headerbar/model.js.map +1 -0
- package/dist/menus/headerbar/view.js +579 -0
- package/dist/menus/headerbar/view.js.map +1 -0
- package/dist/menus/image/index.js +2 -0
- package/dist/menus/image/index.js.map +1 -0
- package/dist/menus/image/model.js +32 -0
- package/dist/menus/image/model.js.map +1 -0
- package/dist/menus/index.js +10 -0
- package/dist/menus/index.js.map +1 -0
- package/dist/menus/navigator/index.js +2 -0
- package/dist/menus/navigator/index.js.map +1 -0
- package/dist/menus/navigator/model.js +29 -0
- package/dist/menus/navigator/model.js.map +1 -0
- package/dist/menus/ordered_list/index.js +2 -0
- package/dist/menus/ordered_list/index.js.map +1 -0
- package/dist/menus/ordered_list/model.js +17 -0
- package/dist/menus/ordered_list/model.js.map +1 -0
- package/dist/menus/selection/index.js +3 -0
- package/dist/menus/selection/index.js.map +1 -0
- package/dist/menus/selection/model.js +108 -0
- package/dist/menus/selection/model.js.map +1 -0
- package/dist/menus/selection/view.js +125 -0
- package/dist/menus/selection/view.js.map +1 -0
- package/dist/menus/table/index.js +2 -0
- package/dist/menus/table/index.js.map +1 -0
- package/dist/menus/table/model.js +319 -0
- package/dist/menus/table/model.js.map +1 -0
- package/dist/menus/toolbar/index.js +3 -0
- package/dist/menus/toolbar/index.js.map +1 -0
- package/dist/menus/toolbar/model.js +747 -0
- package/dist/menus/toolbar/model.js.map +1 -0
- package/dist/menus/toolbar/view.js +314 -0
- package/dist/menus/toolbar/view.js.map +1 -0
- package/dist/navigator/index.js +435 -0
- package/dist/navigator/index.js.map +1 -0
- package/dist/no_collab_save/index.js +169 -0
- package/dist/no_collab_save/index.js.map +1 -0
- package/dist/plugins/citation_dialog/index.js +2 -0
- package/dist/plugins/citation_dialog/index.js.map +1 -0
- package/dist/plugins/editor/index.js +2 -0
- package/dist/plugins/editor/index.js.map +1 -0
- package/dist/state_plugins/access_rights.js +30 -0
- package/dist/state_plugins/access_rights.js.map +1 -0
- package/dist/state_plugins/citation_render.js +78 -0
- package/dist/state_plugins/citation_render.js.map +1 -0
- package/dist/state_plugins/clipboard.js +217 -0
- package/dist/state_plugins/clipboard.js.map +1 -0
- package/dist/state_plugins/code_block.js +165 -0
- package/dist/state_plugins/code_block.js.map +1 -0
- package/dist/state_plugins/collab_carets.js +115 -0
- package/dist/state_plugins/collab_carets.js.map +1 -0
- package/dist/state_plugins/comments.js +197 -0
- package/dist/state_plugins/comments.js.map +1 -0
- package/dist/state_plugins/contributor_input/add_button.js +101 -0
- package/dist/state_plugins/contributor_input/add_button.js.map +1 -0
- package/dist/state_plugins/contributor_input/dropup.js +273 -0
- package/dist/state_plugins/contributor_input/dropup.js.map +1 -0
- package/dist/state_plugins/contributor_input/helpers.js +23 -0
- package/dist/state_plugins/contributor_input/helpers.js.map +1 -0
- package/dist/state_plugins/contributor_input/index.js +3 -0
- package/dist/state_plugins/contributor_input/index.js.map +1 -0
- package/dist/state_plugins/contributor_input/node_view.js +76 -0
- package/dist/state_plugins/contributor_input/node_view.js.map +1 -0
- package/dist/state_plugins/contributor_input/plugin.js +236 -0
- package/dist/state_plugins/contributor_input/plugin.js.map +1 -0
- package/dist/state_plugins/document_template.js +213 -0
- package/dist/state_plugins/document_template.js.map +1 -0
- package/dist/state_plugins/figure.js +90 -0
- package/dist/state_plugins/figure.js.map +1 -0
- package/dist/state_plugins/footnote_markers.js +187 -0
- package/dist/state_plugins/footnote_markers.js.map +1 -0
- package/dist/state_plugins/headerbar.js +10 -0
- package/dist/state_plugins/headerbar.js.map +1 -0
- package/dist/state_plugins/index.js +27 -0
- package/dist/state_plugins/index.js.map +1 -0
- package/dist/state_plugins/inline_math.js +719 -0
- package/dist/state_plugins/inline_math.js.map +1 -0
- package/dist/state_plugins/inline_reference/dropup.js +182 -0
- package/dist/state_plugins/inline_reference/dropup.js.map +1 -0
- package/dist/state_plugins/inline_reference/index.js +2 -0
- package/dist/state_plugins/inline_reference/index.js.map +1 -0
- package/dist/state_plugins/inline_reference/plugin.js +1134 -0
- package/dist/state_plugins/inline_reference/plugin.js.map +1 -0
- package/dist/state_plugins/jump_hidden_nodes.js +47 -0
- package/dist/state_plugins/jump_hidden_nodes.js.map +1 -0
- package/dist/state_plugins/links.js +622 -0
- package/dist/state_plugins/links.js.map +1 -0
- package/dist/state_plugins/marginboxes.js +13 -0
- package/dist/state_plugins/marginboxes.js.map +1 -0
- package/dist/state_plugins/ordered_list_menu.js +72 -0
- package/dist/state_plugins/ordered_list_menu.js.map +1 -0
- package/dist/state_plugins/placeholders.js +98 -0
- package/dist/state_plugins/placeholders.js.map +1 -0
- package/dist/state_plugins/search.js +212 -0
- package/dist/state_plugins/search.js.map +1 -0
- package/dist/state_plugins/selection_menu.js +10 -0
- package/dist/state_plugins/selection_menu.js.map +1 -0
- package/dist/state_plugins/settings.js +191 -0
- package/dist/state_plugins/settings.js.map +1 -0
- package/dist/state_plugins/table.js +104 -0
- package/dist/state_plugins/table.js.map +1 -0
- package/dist/state_plugins/tag_input/helpers.js +55 -0
- package/dist/state_plugins/tag_input/helpers.js.map +1 -0
- package/dist/state_plugins/tag_input/index.js +3 -0
- package/dist/state_plugins/tag_input/index.js.map +1 -0
- package/dist/state_plugins/tag_input/node_view.js +77 -0
- package/dist/state_plugins/tag_input/node_view.js.map +1 -0
- package/dist/state_plugins/tag_input/plugin.js +199 -0
- package/dist/state_plugins/tag_input/plugin.js.map +1 -0
- package/dist/state_plugins/tag_input/tag_editor.js +159 -0
- package/dist/state_plugins/tag_input/tag_editor.js.map +1 -0
- package/dist/state_plugins/tag_input/tag_editor_plugins.js +61 -0
- package/dist/state_plugins/tag_input/tag_editor_plugins.js.map +1 -0
- package/dist/state_plugins/toc_render.js +142 -0
- package/dist/state_plugins/toc_render.js.map +1 -0
- package/dist/state_plugins/toolbar.js +10 -0
- package/dist/state_plugins/toolbar.js.map +1 -0
- package/dist/state_plugins/track/find_selected_changes.js +82 -0
- package/dist/state_plugins/track/find_selected_changes.js.map +1 -0
- package/dist/state_plugins/track/helpers.js +67 -0
- package/dist/state_plugins/track/helpers.js.map +1 -0
- package/dist/state_plugins/track/index.js +3 -0
- package/dist/state_plugins/track/index.js.map +1 -0
- package/dist/state_plugins/track/plugin.js +114 -0
- package/dist/state_plugins/track/plugin.js.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/key_bindings/index.js +20 -0
- package/dist/tools/key_bindings/index.js.map +1 -0
- package/dist/tools/key_bindings/templates.js +68 -0
- package/dist/tools/key_bindings/templates.js.map +1 -0
- package/dist/tools/search_replace/index.js +275 -0
- package/dist/tools/search_replace/index.js.map +1 -0
- package/dist/tools/search_replace/templates.js +18 -0
- package/dist/tools/search_replace/templates.js.map +1 -0
- package/dist/tools/word_count/index.js +40 -0
- package/dist/tools/word_count/index.js.map +1 -0
- package/dist/tools/word_count/templates.js +27 -0
- package/dist/tools/word_count/templates.js.map +1 -0
- package/dist/track/accept.js +66 -0
- package/dist/track/accept.js.map +1 -0
- package/dist/track/accept_all.js +51 -0
- package/dist/track/accept_all.js.map +1 -0
- package/dist/track/accept_all_no_insertions.js +63 -0
- package/dist/track/accept_all_no_insertions.js.map +1 -0
- package/dist/track/amend_transaction.js +390 -0
- package/dist/track/amend_transaction.js.map +1 -0
- package/dist/track/delete.js +62 -0
- package/dist/track/delete.js.map +1 -0
- package/dist/track/index.js +6 -0
- package/dist/track/index.js.map +1 -0
- package/dist/track/mod.js +86 -0
- package/dist/track/mod.js.map +1 -0
- package/dist/track/reject.js +67 -0
- package/dist/track/reject.js.map +1 -0
- package/dist/track/reject_all.js +56 -0
- package/dist/track/reject_all.js.map +1 -0
- package/package.json +80 -0
- package/src/bibliography/tools.js +58 -0
- package/src/citations/index.js +443 -0
- package/src/citations/render.js +68 -0
- package/src/clipboard/copy/index.js +1 -0
- package/src/clipboard/copy/schema.js +62 -0
- package/src/clipboard/copy/serializers.js +179 -0
- package/src/clipboard/paste/fidus_writer.js +55 -0
- package/src/clipboard/paste/general.js +80 -0
- package/src/clipboard/paste/google_docs.js +26 -0
- package/src/clipboard/paste/html.js +76 -0
- package/src/clipboard/paste/index.js +2 -0
- package/src/clipboard/paste/libreoffice_writer.js +32 -0
- package/src/clipboard/paste/microsoft_word.js +87 -0
- package/src/clipboard/paste/text.js +58 -0
- package/src/collab/chat.js +195 -0
- package/src/collab/colors.js +67 -0
- package/src/collab/doc.js +1436 -0
- package/src/collab/index.js +81 -0
- package/src/collab/merge/changeset.js +103 -0
- package/src/collab/merge/editor.js +1065 -0
- package/src/collab/merge/footnotes.js +175 -0
- package/src/collab/merge/index.js +401 -0
- package/src/collab/merge/recreate_transform.js +326 -0
- package/src/collab/merge/schema.js +135 -0
- package/src/collab/merge/state_plugins/action.js +171 -0
- package/src/collab/merge/state_plugins/clipboard.js +32 -0
- package/src/collab/merge/state_plugins/diff.js +780 -0
- package/src/collab/merge/state_plugins/index.js +2 -0
- package/src/collab/merge/tools.js +217 -0
- package/src/collab/templates.js +10 -0
- package/src/comments/comment.js +29 -0
- package/src/comments/editors/answer.js +55 -0
- package/src/comments/editors/comment.js +318 -0
- package/src/comments/editors/index.js +4 -0
- package/src/comments/editors/notify.js +13 -0
- package/src/comments/editors/schema.js +65 -0
- package/src/comments/index.js +11 -0
- package/src/comments/interactions.js +465 -0
- package/src/comments/store.js +513 -0
- package/src/contacts/add_dialog.js +110 -0
- package/src/contacts/templates.js +28 -0
- package/src/copyright_dialog/index.js +179 -0
- package/src/copyright_dialog/templates.js +56 -0
- package/src/databases/bibliography.js +179 -0
- package/src/databases/images.js +320 -0
- package/src/databases/index.js +69 -0
- package/src/dialogs/citation.js +428 -0
- package/src/dialogs/code_block.js +242 -0
- package/src/dialogs/contributor.js +173 -0
- package/src/dialogs/figure.js +479 -0
- package/src/dialogs/index.js +10 -0
- package/src/dialogs/language.js +58 -0
- package/src/dialogs/link.js +358 -0
- package/src/dialogs/math.js +148 -0
- package/src/dialogs/ordered_list.js +84 -0
- package/src/dialogs/revision.js +43 -0
- package/src/dialogs/subsup.js +116 -0
- package/src/dialogs/table.js +258 -0
- package/src/dialogs/templates.js +426 -0
- package/src/document_template/exporter.js +97 -0
- package/src/document_template/index.js +483 -0
- package/src/documents/access_rights/index.js +693 -0
- package/src/documents/access_rights/templates.js +178 -0
- package/src/e2ee/encryptor.js +228 -0
- package/src/e2ee/key-manager.js +202 -0
- package/src/e2ee/passphrase-crypto.js +606 -0
- package/src/e2ee/passphrase-dialog.js +655 -0
- package/src/e2ee/passphrase-manager.js +502 -0
- package/src/e2ee/password-dialog.js +652 -0
- package/src/e2ee/snapshot-manager.js +305 -0
- package/src/exporter/native/copy.js +54 -0
- package/src/exporter/native/file.js +37 -0
- package/src/exporter/native/index.js +3 -0
- package/src/exporter/native/revision.js +86 -0
- package/src/exporter/native/zip.js +1 -0
- package/src/footnotes/editor.js +227 -0
- package/src/footnotes/index.js +16 -0
- package/src/footnotes/layout.js +190 -0
- package/src/footnotes/state_plugins/access_rights.js +39 -0
- package/src/footnotes/state_plugins/index.js +1 -0
- package/src/images/edit_dialog/edit_dialog/index.js +222 -0
- package/src/images/edit_dialog/edit_dialog/model.js +183 -0
- package/src/images/edit_dialog/edit_dialog/templates.js +41 -0
- package/src/images/edit_dialog/model.js +5 -0
- package/src/images/selection_dialog/index.js +176 -0
- package/src/index.js +1252 -0
- package/src/keymap.js +102 -0
- package/src/marginboxes/index.js +946 -0
- package/src/marginboxes/templates.js +573 -0
- package/src/menus/code_block/index.js +1 -0
- package/src/menus/code_block/model.js +52 -0
- package/src/menus/figure/index.js +2 -0
- package/src/menus/figure/model.js +91 -0
- package/src/menus/figure/utils.js +5 -0
- package/src/menus/headerbar/index.js +2 -0
- package/src/menus/headerbar/model.js +1077 -0
- package/src/menus/headerbar/view.js +675 -0
- package/src/menus/image/index.js +1 -0
- package/src/menus/image/model.js +32 -0
- package/src/menus/index.js +9 -0
- package/src/menus/navigator/index.js +1 -0
- package/src/menus/navigator/model.js +28 -0
- package/src/menus/ordered_list/index.js +1 -0
- package/src/menus/ordered_list/model.js +19 -0
- package/src/menus/selection/index.js +2 -0
- package/src/menus/selection/model.js +134 -0
- package/src/menus/selection/view.js +154 -0
- package/src/menus/table/index.js +1 -0
- package/src/menus/table/model.js +414 -0
- package/src/menus/toolbar/index.js +2 -0
- package/src/menus/toolbar/model.js +920 -0
- package/src/menus/toolbar/view.js +354 -0
- package/src/navigator/index.js +515 -0
- package/src/no_collab_save/index.js +209 -0
- package/src/plugins/citation_dialog/index.js +1 -0
- package/src/plugins/editor/index.js +1 -0
- package/src/state_plugins/access_rights.js +47 -0
- package/src/state_plugins/citation_render.js +88 -0
- package/src/state_plugins/clipboard.js +289 -0
- package/src/state_plugins/code_block.js +201 -0
- package/src/state_plugins/collab_carets.js +152 -0
- package/src/state_plugins/comments.js +259 -0
- package/src/state_plugins/contributor_input/add_button.js +134 -0
- package/src/state_plugins/contributor_input/dropup.js +318 -0
- package/src/state_plugins/contributor_input/helpers.js +24 -0
- package/src/state_plugins/contributor_input/index.js +2 -0
- package/src/state_plugins/contributor_input/node_view.js +86 -0
- package/src/state_plugins/contributor_input/plugin.js +318 -0
- package/src/state_plugins/document_template.js +315 -0
- package/src/state_plugins/figure.js +108 -0
- package/src/state_plugins/footnote_markers.js +238 -0
- package/src/state_plugins/headerbar.js +12 -0
- package/src/state_plugins/index.js +73 -0
- package/src/state_plugins/inline_math.js +918 -0
- package/src/state_plugins/inline_reference/dropup.js +208 -0
- package/src/state_plugins/inline_reference/index.js +5 -0
- package/src/state_plugins/inline_reference/plugin.js +1429 -0
- package/src/state_plugins/jump_hidden_nodes.js +58 -0
- package/src/state_plugins/links.js +830 -0
- package/src/state_plugins/marginboxes.js +14 -0
- package/src/state_plugins/ordered_list_menu.js +84 -0
- package/src/state_plugins/placeholders.js +123 -0
- package/src/state_plugins/search.js +251 -0
- package/src/state_plugins/selection_menu.js +12 -0
- package/src/state_plugins/settings.js +223 -0
- package/src/state_plugins/table.js +127 -0
- package/src/state_plugins/tag_input/helpers.js +69 -0
- package/src/state_plugins/tag_input/index.js +2 -0
- package/src/state_plugins/tag_input/node_view.js +85 -0
- package/src/state_plugins/tag_input/plugin.js +278 -0
- package/src/state_plugins/tag_input/tag_editor.js +202 -0
- package/src/state_plugins/tag_input/tag_editor_plugins.js +74 -0
- package/src/state_plugins/toc_render.js +160 -0
- package/src/state_plugins/toolbar.js +12 -0
- package/src/state_plugins/track/find_selected_changes.js +107 -0
- package/src/state_plugins/track/helpers.js +108 -0
- package/src/state_plugins/track/index.js +6 -0
- package/src/state_plugins/track/plugin.js +140 -0
- package/src/tools/index.js +3 -0
- package/src/tools/key_bindings/index.js +21 -0
- package/src/tools/key_bindings/templates.js +68 -0
- package/src/tools/search_replace/index.js +421 -0
- package/src/tools/search_replace/templates.js +19 -0
- package/src/tools/word_count/index.js +59 -0
- package/src/tools/word_count/templates.js +34 -0
- package/src/track/accept.js +102 -0
- package/src/track/accept_all.js +103 -0
- package/src/track/accept_all_no_insertions.js +102 -0
- package/src/track/amend_transaction.js +562 -0
- package/src/track/delete.js +92 -0
- package/src/track/index.js +8 -0
- package/src/track/mod.js +116 -0
- package/src/track/reject.js +116 -0
- package/src/track/reject_all.js +121 -0
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* E2EE Snapshot Manager - Handles encrypted snapshot requests and saves
|
|
3
|
+
* for end-to-end encrypted documents.
|
|
4
|
+
*
|
|
5
|
+
* For E2EE documents, the server cannot process encrypted content, so clients
|
|
6
|
+
* are responsible for saving periodic snapshots. When the server's
|
|
7
|
+
* DOC_SAVE_INTERVAL is reached, it sends a "request_snapshot" message to
|
|
8
|
+
* one of the write-capable clients. This module handles that request by:
|
|
9
|
+
*
|
|
10
|
+
* 1. Collecting the current document state (content, comments, bibliography)
|
|
11
|
+
* 2. Encrypting each field with the document's AES-GCM key
|
|
12
|
+
* 3. Sending an "e2ee_snapshot" message to the server for persistence
|
|
13
|
+
*
|
|
14
|
+
* The server stores the encrypted snapshot as opaque data and notifies
|
|
15
|
+
* other clients via an "e2ee_snapshot_received" message.
|
|
16
|
+
*/
|
|
17
|
+
export class E2EESnapshotManager {
|
|
18
|
+
/**
|
|
19
|
+
* @param {Editor} editor - The Fidus Writer editor instance
|
|
20
|
+
*/
|
|
21
|
+
constructor(editor) {
|
|
22
|
+
this.editor = editor
|
|
23
|
+
this.pendingSave = false
|
|
24
|
+
this.key = null
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Set the encryption key for this document.
|
|
29
|
+
* Called after the user enters the password and the key is derived.
|
|
30
|
+
*
|
|
31
|
+
* @param {CryptoKey} key - An AES-GCM key (from E2EEKeyManager.deriveKey)
|
|
32
|
+
*/
|
|
33
|
+
setKey(key) {
|
|
34
|
+
this.key = key
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Clear the encryption key (e.g., when the document is closed).
|
|
39
|
+
*/
|
|
40
|
+
clearKey() {
|
|
41
|
+
this.key = null
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Check whether the snapshot manager has a key set.
|
|
46
|
+
*
|
|
47
|
+
* @returns {boolean}
|
|
48
|
+
*/
|
|
49
|
+
get hasKey() {
|
|
50
|
+
return this.key !== null
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Build an encrypted snapshot payload for the current document state.
|
|
55
|
+
*
|
|
56
|
+
* Returns the encrypted data without sending it. Used in
|
|
57
|
+
* non-collaborative mode where snapshots are sent via REST instead
|
|
58
|
+
* of WebSocket.
|
|
59
|
+
*
|
|
60
|
+
* @returns {Object|null} The encrypted snapshot payload or null if no key.
|
|
61
|
+
*/
|
|
62
|
+
async getEncryptedSnapshot() {
|
|
63
|
+
if (!this.key) {
|
|
64
|
+
return null
|
|
65
|
+
}
|
|
66
|
+
const content = this.editor.view.docView.node.toJSON()
|
|
67
|
+
const comments = this.editor.docInfo.comments || {}
|
|
68
|
+
const bibliography = this.editor.docInfo.bibliography || {}
|
|
69
|
+
const {title} = this.editor.getDoc()
|
|
70
|
+
|
|
71
|
+
const {E2EEEncryptor} = await import("./encryptor")
|
|
72
|
+
|
|
73
|
+
const encryptedContent = await E2EEEncryptor.encryptObject(
|
|
74
|
+
content,
|
|
75
|
+
this.key
|
|
76
|
+
)
|
|
77
|
+
const encryptedComments = await E2EEEncryptor.encryptObject(
|
|
78
|
+
comments,
|
|
79
|
+
this.key
|
|
80
|
+
)
|
|
81
|
+
const encryptedBibliography = await E2EEEncryptor.encryptObject(
|
|
82
|
+
bibliography,
|
|
83
|
+
this.key
|
|
84
|
+
)
|
|
85
|
+
const encryptedTitle = await E2EEEncryptor.encrypt(title, this.key)
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
content: encryptedContent,
|
|
89
|
+
comments: encryptedComments,
|
|
90
|
+
bibliography: encryptedBibliography,
|
|
91
|
+
title: encryptedTitle,
|
|
92
|
+
e2ee_salt: this.editor.e2ee.encryptionSalt,
|
|
93
|
+
e2ee_iterations: this.editor.e2ee.encryptionIterations,
|
|
94
|
+
v: this.editor.docInfo.version
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Handle a "request_snapshot" message from the server.
|
|
100
|
+
*
|
|
101
|
+
* The server sends this message when it needs a client to save
|
|
102
|
+
* an encrypted snapshot (typically after DOC_SAVE_INTERVAL diffs).
|
|
103
|
+
* Only write-capable clients should respond.
|
|
104
|
+
*
|
|
105
|
+
* @param {Object} request - The request_snapshot message
|
|
106
|
+
* @param {number} request.v - The server's current document version
|
|
107
|
+
*/
|
|
108
|
+
async handleRequestSnapshot(_request) {
|
|
109
|
+
if (this.pendingSave) {
|
|
110
|
+
return
|
|
111
|
+
}
|
|
112
|
+
if (!this.key) {
|
|
113
|
+
return
|
|
114
|
+
}
|
|
115
|
+
if (this.editor.docInfo.access_rights !== "write") {
|
|
116
|
+
return
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
this.pendingSave = true
|
|
120
|
+
|
|
121
|
+
const docInfo = this.editor.docInfo
|
|
122
|
+
|
|
123
|
+
// Get the current document content as JSON
|
|
124
|
+
const content = this.editor.view.docView.node.toJSON()
|
|
125
|
+
const comments = docInfo.comments || {}
|
|
126
|
+
const bibliography = docInfo.bibliography || {}
|
|
127
|
+
|
|
128
|
+
// Extract the current title from the editor
|
|
129
|
+
const {title} = this.editor.getDoc()
|
|
130
|
+
|
|
131
|
+
// Dynamically import to avoid circular dependencies
|
|
132
|
+
const {E2EEEncryptor} = await import("./encryptor")
|
|
133
|
+
|
|
134
|
+
// Encrypt all document data
|
|
135
|
+
const encryptedContent = await E2EEEncryptor.encryptObject(
|
|
136
|
+
content,
|
|
137
|
+
this.key
|
|
138
|
+
)
|
|
139
|
+
const encryptedComments = await E2EEEncryptor.encryptObject(
|
|
140
|
+
comments,
|
|
141
|
+
this.key
|
|
142
|
+
)
|
|
143
|
+
const encryptedBibliography = await E2EEEncryptor.encryptObject(
|
|
144
|
+
bibliography,
|
|
145
|
+
this.key
|
|
146
|
+
)
|
|
147
|
+
const encryptedTitle = await E2EEEncryptor.encrypt(title, this.key)
|
|
148
|
+
|
|
149
|
+
// Send snapshot to server
|
|
150
|
+
this.editor.ws.send(() => ({
|
|
151
|
+
type: "e2ee_snapshot",
|
|
152
|
+
v: docInfo.version,
|
|
153
|
+
content: encryptedContent,
|
|
154
|
+
comments: encryptedComments,
|
|
155
|
+
bibliography: encryptedBibliography,
|
|
156
|
+
e2ee_salt: this.editor.e2ee.encryptionSalt,
|
|
157
|
+
title: encryptedTitle
|
|
158
|
+
}))
|
|
159
|
+
this.pendingSave = false
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Handle an "e2ee_snapshot_received" message from the server.
|
|
164
|
+
*
|
|
165
|
+
* The server sends this to all clients (except the one that sent
|
|
166
|
+
* the snapshot) to notify them that a new snapshot has been saved.
|
|
167
|
+
* This is informational — clients don't need to take any action
|
|
168
|
+
* since they already have the latest state from the diffs they've
|
|
169
|
+
* been receiving.
|
|
170
|
+
*
|
|
171
|
+
* @param {Object} message - The e2ee_snapshot_received message
|
|
172
|
+
* @param {number} message.v - The version of the saved snapshot
|
|
173
|
+
*/
|
|
174
|
+
async handleSnapshotReceived(message) {
|
|
175
|
+
// Informational — no action needed for regular snapshots.
|
|
176
|
+
// If the server included new KDF params, the password was changed
|
|
177
|
+
// by another client. Update local state so that if we re-fetch
|
|
178
|
+
// we use the new salt.
|
|
179
|
+
if (message.e2ee_salt) {
|
|
180
|
+
this.editor.e2ee.encryptionSalt = message.e2ee_salt
|
|
181
|
+
this.editor.e2ee.encryptionIterations = message.e2ee_iterations
|
|
182
|
+
this.editor.e2ee.key = null
|
|
183
|
+
this.clearKey()
|
|
184
|
+
// Clear cached password and key from sessionStorage so the user
|
|
185
|
+
// is prompted for the new password on next access.
|
|
186
|
+
const {E2EEKeyManager} = await import("./key-manager")
|
|
187
|
+
E2EEKeyManager.clearKeyFromSession(this.editor.docInfo.id)
|
|
188
|
+
E2EEKeyManager.clearPasswordFromSession(this.editor.docInfo.id)
|
|
189
|
+
// Notify the user that the password has changed.
|
|
190
|
+
const {showSystemMessage} = await import("fwtoolkit")
|
|
191
|
+
showSystemMessage(
|
|
192
|
+
gettext(
|
|
193
|
+
"The document password was changed by another user. You will need to enter the new password to continue editing."
|
|
194
|
+
)
|
|
195
|
+
)
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Send an initial snapshot for a newly created E2EE document.
|
|
201
|
+
*
|
|
202
|
+
* When a new E2EE document is created, the initial content (from
|
|
203
|
+
* the template) needs to be encrypted and saved as the first snapshot.
|
|
204
|
+
* This method handles that initial save.
|
|
205
|
+
*
|
|
206
|
+
* @param {Object} content - The document content (ProseMirror JSON)
|
|
207
|
+
* @param {Object} comments - The comments object (usually empty {})
|
|
208
|
+
* @param {Object} bibliography - The bibliography object (usually {})
|
|
209
|
+
* @param {number} version - The document version (usually 0)
|
|
210
|
+
*/
|
|
211
|
+
async sendInitialSnapshot(content, comments, bibliography, version) {
|
|
212
|
+
if (!this.key) {
|
|
213
|
+
return
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const {E2EEEncryptor} = await import("./encryptor")
|
|
217
|
+
|
|
218
|
+
const encryptedContent = await E2EEEncryptor.encryptObject(
|
|
219
|
+
content,
|
|
220
|
+
this.key
|
|
221
|
+
)
|
|
222
|
+
const encryptedComments = await E2EEEncryptor.encryptObject(
|
|
223
|
+
comments,
|
|
224
|
+
this.key
|
|
225
|
+
)
|
|
226
|
+
const encryptedBibliography = await E2EEEncryptor.encryptObject(
|
|
227
|
+
bibliography,
|
|
228
|
+
this.key
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
// Extract the current title from the editor
|
|
232
|
+
const {title} = this.editor.getDoc()
|
|
233
|
+
const encryptedTitle = await E2EEEncryptor.encrypt(title, this.key)
|
|
234
|
+
|
|
235
|
+
this.editor.ws.send(() => ({
|
|
236
|
+
type: "e2ee_snapshot",
|
|
237
|
+
v: version,
|
|
238
|
+
content: encryptedContent,
|
|
239
|
+
comments: encryptedComments,
|
|
240
|
+
bibliography: encryptedBibliography,
|
|
241
|
+
e2ee_salt: this.editor.e2ee.encryptionSalt,
|
|
242
|
+
title: encryptedTitle
|
|
243
|
+
}))
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Re-encrypt the document with a new key (for password changes).
|
|
248
|
+
*
|
|
249
|
+
* When the user changes the document password, a new key is derived
|
|
250
|
+
* and the entire document must be re-encrypted. This method handles
|
|
251
|
+
* that by collecting the current document state, encrypting it with
|
|
252
|
+
* the new key, and sending a snapshot.
|
|
253
|
+
*
|
|
254
|
+
* @param {CryptoKey} newKey - The new AES-GCM key derived from the new password
|
|
255
|
+
* @param {string} newSaltBase64 - The new salt (Base64-encoded) to send to the server
|
|
256
|
+
* @param {number} newIterations - The new iteration count
|
|
257
|
+
*/
|
|
258
|
+
async reEncryptWithNewKey(newKey, newSaltBase64, newIterations) {
|
|
259
|
+
if (this.pendingSave) {
|
|
260
|
+
return
|
|
261
|
+
}
|
|
262
|
+
this.pendingSave = true
|
|
263
|
+
|
|
264
|
+
const docInfo = this.editor.docInfo
|
|
265
|
+
const content = this.editor.view.docView.node.toJSON()
|
|
266
|
+
const comments = docInfo.comments || {}
|
|
267
|
+
const bibliography = docInfo.bibliography || {}
|
|
268
|
+
|
|
269
|
+
// Extract the current title from the editor
|
|
270
|
+
const {title} = this.editor.getDoc()
|
|
271
|
+
|
|
272
|
+
const {E2EEEncryptor} = await import("./encryptor")
|
|
273
|
+
|
|
274
|
+
// Encrypt with the new key
|
|
275
|
+
const encryptedContent = await E2EEEncryptor.encryptObject(
|
|
276
|
+
content,
|
|
277
|
+
newKey
|
|
278
|
+
)
|
|
279
|
+
const encryptedComments = await E2EEEncryptor.encryptObject(
|
|
280
|
+
comments,
|
|
281
|
+
newKey
|
|
282
|
+
)
|
|
283
|
+
const encryptedBibliography = await E2EEEncryptor.encryptObject(
|
|
284
|
+
bibliography,
|
|
285
|
+
newKey
|
|
286
|
+
)
|
|
287
|
+
const encryptedTitle = await E2EEEncryptor.encrypt(title, newKey)
|
|
288
|
+
|
|
289
|
+
// Update the key
|
|
290
|
+
this.key = newKey
|
|
291
|
+
|
|
292
|
+
// Send the re-encrypted snapshot along with the new KDF parameters
|
|
293
|
+
this.editor.ws.send(() => ({
|
|
294
|
+
type: "e2ee_snapshot",
|
|
295
|
+
v: docInfo.version,
|
|
296
|
+
content: encryptedContent,
|
|
297
|
+
comments: encryptedComments,
|
|
298
|
+
bibliography: encryptedBibliography,
|
|
299
|
+
e2ee_salt: newSaltBase64,
|
|
300
|
+
e2ee_iterations: newIterations,
|
|
301
|
+
title: encryptedTitle
|
|
302
|
+
}))
|
|
303
|
+
this.pendingSave = false
|
|
304
|
+
}
|
|
305
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import {SaveCopy as GenericSaveCopy} from "@fiduswriter/document/exporter/native"
|
|
2
|
+
import {addProgress, gettext, shortFileTitle} from "fwtoolkit"
|
|
3
|
+
import {E2EEEncryptor} from "../../e2ee/encryptor"
|
|
4
|
+
import {E2EEKeyManager} from "../../e2ee/key-manager"
|
|
5
|
+
import {NativeImporter} from "../../importer/native"
|
|
6
|
+
|
|
7
|
+
export class SaveCopy extends GenericSaveCopy {
|
|
8
|
+
constructor(
|
|
9
|
+
doc,
|
|
10
|
+
bibDB,
|
|
11
|
+
imageDB,
|
|
12
|
+
newUser,
|
|
13
|
+
importId = null,
|
|
14
|
+
e2eeOptions = null
|
|
15
|
+
) {
|
|
16
|
+
const title = shortFileTitle(doc.title, doc.path || "")
|
|
17
|
+
const task = addProgress(
|
|
18
|
+
"info",
|
|
19
|
+
`${title}: ${gettext("Creating copy...")}`,
|
|
20
|
+
{autoClose: false}
|
|
21
|
+
)
|
|
22
|
+
const progressCallback = (message, percentage) =>
|
|
23
|
+
task.update(percentage, message)
|
|
24
|
+
const e2ee = {
|
|
25
|
+
decryptObject: E2EEEncryptor.decryptObject.bind(E2EEEncryptor),
|
|
26
|
+
encryptObject: E2EEEncryptor.encryptObject.bind(E2EEEncryptor),
|
|
27
|
+
encrypt: E2EEEncryptor.encrypt.bind(E2EEEncryptor),
|
|
28
|
+
encryptImage: E2EEEncryptor.encryptImage.bind(E2EEEncryptor),
|
|
29
|
+
generateSalt: E2EEKeyManager.generateSalt.bind(E2EEKeyManager),
|
|
30
|
+
deriveKey: E2EEKeyManager.deriveKey.bind(E2EEKeyManager)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const importDocument = (doc, bibDB, imageDB, httpIncludes, options) =>
|
|
34
|
+
new NativeImporter(
|
|
35
|
+
doc,
|
|
36
|
+
bibDB,
|
|
37
|
+
imageDB,
|
|
38
|
+
httpIncludes,
|
|
39
|
+
options.user,
|
|
40
|
+
options.importId,
|
|
41
|
+
options.requestedPath,
|
|
42
|
+
null,
|
|
43
|
+
options.e2eeOptions
|
|
44
|
+
).init()
|
|
45
|
+
|
|
46
|
+
super(doc, bibDB, imageDB, newUser, {
|
|
47
|
+
importId,
|
|
48
|
+
e2eeOptions,
|
|
49
|
+
e2ee,
|
|
50
|
+
importDocument,
|
|
51
|
+
progressCallback
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {ExportFidusFile as GenericExportFidusFile} from "@fiduswriter/document/exporter/native"
|
|
2
|
+
import {addProgress, gettext, shortFileTitle} from "fwtoolkit"
|
|
3
|
+
import {DocumentTemplateExporter} from "../../document_template/exporter"
|
|
4
|
+
|
|
5
|
+
export class ExportFidusFile extends GenericExportFidusFile {
|
|
6
|
+
constructor(doc, bibDB, imageDB, includeTemplate = true, token = false) {
|
|
7
|
+
const title = shortFileTitle(doc.title, doc.path || "")
|
|
8
|
+
const task = addProgress(
|
|
9
|
+
"info",
|
|
10
|
+
`${title}: ${gettext("Exporting Fidus file...")}`,
|
|
11
|
+
{autoClose: false}
|
|
12
|
+
)
|
|
13
|
+
const progressCallback = (message, percentage) =>
|
|
14
|
+
task.update(percentage, message)
|
|
15
|
+
const getTemplateFiles = (docId, token) => {
|
|
16
|
+
const templateExporter = new DocumentTemplateExporter(
|
|
17
|
+
docId,
|
|
18
|
+
"/api/document/get_template_for_doc/",
|
|
19
|
+
false,
|
|
20
|
+
token
|
|
21
|
+
)
|
|
22
|
+
return templateExporter.init().then(() => ({
|
|
23
|
+
textFiles: templateExporter.textFiles,
|
|
24
|
+
httpFiles: templateExporter.httpFiles
|
|
25
|
+
}))
|
|
26
|
+
}
|
|
27
|
+
super(
|
|
28
|
+
doc,
|
|
29
|
+
bibDB,
|
|
30
|
+
imageDB,
|
|
31
|
+
includeTemplate,
|
|
32
|
+
token,
|
|
33
|
+
getTemplateFiles,
|
|
34
|
+
progressCallback
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {SaveRevision as GenericSaveRevision} from "@fiduswriter/document/exporter/native"
|
|
2
|
+
import {createSlug} from "@fiduswriter/document/exporter/tools/file"
|
|
3
|
+
import {addAlert, addProgress, gettext, post, shortFileTitle} from "fwtoolkit"
|
|
4
|
+
import {DocumentTemplateExporter} from "../../document_template/exporter"
|
|
5
|
+
|
|
6
|
+
export class SaveRevision extends GenericSaveRevision {
|
|
7
|
+
constructor(doc, imageDB, bibDB, note, app) {
|
|
8
|
+
const title = shortFileTitle(doc.title, doc.path || "")
|
|
9
|
+
const task = addProgress(
|
|
10
|
+
"info",
|
|
11
|
+
`${title}: ${gettext("Saving revision...")}`,
|
|
12
|
+
{autoClose: false}
|
|
13
|
+
)
|
|
14
|
+
const progressCallback = (message, percentage) =>
|
|
15
|
+
task.update(percentage, message)
|
|
16
|
+
|
|
17
|
+
const onError = error => {
|
|
18
|
+
task.close()
|
|
19
|
+
addAlert("error", gettext("Revision file could not be generated."))
|
|
20
|
+
if (app.isOffline()) {
|
|
21
|
+
addAlert(
|
|
22
|
+
"info",
|
|
23
|
+
gettext(
|
|
24
|
+
"You are currently offline. Please try again when you are back online."
|
|
25
|
+
)
|
|
26
|
+
)
|
|
27
|
+
} else {
|
|
28
|
+
throw error
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const getTemplateFiles = (docId, token) => {
|
|
33
|
+
const templateExporter = new DocumentTemplateExporter(
|
|
34
|
+
docId,
|
|
35
|
+
"/api/document/get_template_for_doc/",
|
|
36
|
+
false,
|
|
37
|
+
token
|
|
38
|
+
)
|
|
39
|
+
return templateExporter.init().then(() => ({
|
|
40
|
+
textFiles: templateExporter.textFiles,
|
|
41
|
+
httpFiles: templateExporter.httpFiles
|
|
42
|
+
}))
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const uploadRevision = (blob, doc) => {
|
|
46
|
+
return post(
|
|
47
|
+
"/api/document/upload/",
|
|
48
|
+
{
|
|
49
|
+
note,
|
|
50
|
+
document_id: doc.id
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
file: {
|
|
54
|
+
file: blob,
|
|
55
|
+
filename: `${createSlug(
|
|
56
|
+
shortFileTitle(doc.title, doc.path)
|
|
57
|
+
)}.fidus`
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
.then(
|
|
62
|
+
() => {},
|
|
63
|
+
() => {
|
|
64
|
+
if (app.isOffline()) {
|
|
65
|
+
addAlert(
|
|
66
|
+
"info",
|
|
67
|
+
gettext(
|
|
68
|
+
"You are currently offline. Please try again when you are back online."
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
throw new Error(gettext("Revision could not be saved."))
|
|
73
|
+
}
|
|
74
|
+
)
|
|
75
|
+
.catch(error => {
|
|
76
|
+
throw error
|
|
77
|
+
})
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
super(doc, imageDB, bibDB, note, uploadRevision, {
|
|
81
|
+
getTemplateFiles,
|
|
82
|
+
onError,
|
|
83
|
+
progressCallback
|
|
84
|
+
})
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {ZipFidus} from "@fiduswriter/document/exporter/native"
|