@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.
Files changed (525) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +22 -0
  3. package/dist/bibliography/tools.js +53 -0
  4. package/dist/bibliography/tools.js.map +1 -0
  5. package/dist/citations/index.js +339 -0
  6. package/dist/citations/index.js.map +1 -0
  7. package/dist/citations/render.js +47 -0
  8. package/dist/citations/render.js.map +1 -0
  9. package/dist/clipboard/copy/index.js +2 -0
  10. package/dist/clipboard/copy/index.js.map +1 -0
  11. package/dist/clipboard/copy/schema.js +54 -0
  12. package/dist/clipboard/copy/schema.js.map +1 -0
  13. package/dist/clipboard/copy/serializers.js +132 -0
  14. package/dist/clipboard/copy/serializers.js.map +1 -0
  15. package/dist/clipboard/paste/fidus_writer.js +45 -0
  16. package/dist/clipboard/paste/fidus_writer.js.map +1 -0
  17. package/dist/clipboard/paste/general.js +76 -0
  18. package/dist/clipboard/paste/general.js.map +1 -0
  19. package/dist/clipboard/paste/google_docs.js +24 -0
  20. package/dist/clipboard/paste/google_docs.js.map +1 -0
  21. package/dist/clipboard/paste/html.js +68 -0
  22. package/dist/clipboard/paste/html.js.map +1 -0
  23. package/dist/clipboard/paste/index.js +3 -0
  24. package/dist/clipboard/paste/index.js.map +1 -0
  25. package/dist/clipboard/paste/libreoffice_writer.js +27 -0
  26. package/dist/clipboard/paste/libreoffice_writer.js.map +1 -0
  27. package/dist/clipboard/paste/microsoft_word.js +79 -0
  28. package/dist/clipboard/paste/microsoft_word.js.map +1 -0
  29. package/dist/clipboard/paste/text.js +41 -0
  30. package/dist/clipboard/paste/text.js.map +1 -0
  31. package/dist/collab/chat.js +154 -0
  32. package/dist/collab/chat.js.map +1 -0
  33. package/dist/collab/colors.js +62 -0
  34. package/dist/collab/colors.js.map +1 -0
  35. package/dist/collab/doc.js +1090 -0
  36. package/dist/collab/doc.js.map +1 -0
  37. package/dist/collab/index.js +75 -0
  38. package/dist/collab/index.js.map +1 -0
  39. package/dist/collab/merge/changeset.js +90 -0
  40. package/dist/collab/merge/changeset.js.map +1 -0
  41. package/dist/collab/merge/editor.js +708 -0
  42. package/dist/collab/merge/editor.js.map +1 -0
  43. package/dist/collab/merge/footnotes.js +149 -0
  44. package/dist/collab/merge/footnotes.js.map +1 -0
  45. package/dist/collab/merge/index.js +270 -0
  46. package/dist/collab/merge/index.js.map +1 -0
  47. package/dist/collab/merge/recreate_transform.js +259 -0
  48. package/dist/collab/merge/recreate_transform.js.map +1 -0
  49. package/dist/collab/merge/schema.js +117 -0
  50. package/dist/collab/merge/schema.js.map +1 -0
  51. package/dist/collab/merge/state_plugins/action.js +138 -0
  52. package/dist/collab/merge/state_plugins/action.js.map +1 -0
  53. package/dist/collab/merge/state_plugins/clipboard.js +32 -0
  54. package/dist/collab/merge/state_plugins/clipboard.js.map +1 -0
  55. package/dist/collab/merge/state_plugins/diff.js +541 -0
  56. package/dist/collab/merge/state_plugins/diff.js.map +1 -0
  57. package/dist/collab/merge/state_plugins/index.js +3 -0
  58. package/dist/collab/merge/state_plugins/index.js.map +1 -0
  59. package/dist/collab/merge/tools.js +175 -0
  60. package/dist/collab/merge/tools.js.map +1 -0
  61. package/dist/collab/templates.js +10 -0
  62. package/dist/collab/templates.js.map +1 -0
  63. package/dist/comments/comment.js +17 -0
  64. package/dist/comments/comment.js.map +1 -0
  65. package/dist/comments/editors/answer.js +43 -0
  66. package/dist/comments/editors/answer.js.map +1 -0
  67. package/dist/comments/editors/comment.js +278 -0
  68. package/dist/comments/editors/comment.js.map +1 -0
  69. package/dist/comments/editors/index.js +4 -0
  70. package/dist/comments/editors/index.js.map +1 -0
  71. package/dist/comments/editors/notify.js +13 -0
  72. package/dist/comments/editors/notify.js.map +1 -0
  73. package/dist/comments/editors/schema.js +60 -0
  74. package/dist/comments/editors/schema.js.map +1 -0
  75. package/dist/comments/index.js +11 -0
  76. package/dist/comments/index.js.map +1 -0
  77. package/dist/comments/interactions.js +379 -0
  78. package/dist/comments/interactions.js.map +1 -0
  79. package/dist/comments/store.js +438 -0
  80. package/dist/comments/store.js.map +1 -0
  81. package/dist/contacts/add_dialog.js +88 -0
  82. package/dist/contacts/add_dialog.js.map +1 -0
  83. package/dist/contacts/templates.js +23 -0
  84. package/dist/contacts/templates.js.map +1 -0
  85. package/dist/copyright_dialog/index.js +148 -0
  86. package/dist/copyright_dialog/index.js.map +1 -0
  87. package/dist/copyright_dialog/templates.js +48 -0
  88. package/dist/copyright_dialog/templates.js.map +1 -0
  89. package/dist/databases/bibliography.js +162 -0
  90. package/dist/databases/bibliography.js.map +1 -0
  91. package/dist/databases/images.js +260 -0
  92. package/dist/databases/images.js.map +1 -0
  93. package/dist/databases/index.js +55 -0
  94. package/dist/databases/index.js.map +1 -0
  95. package/dist/dialogs/citation.js +321 -0
  96. package/dist/dialogs/citation.js.map +1 -0
  97. package/dist/dialogs/code_block.js +192 -0
  98. package/dist/dialogs/code_block.js.map +1 -0
  99. package/dist/dialogs/contributor.js +132 -0
  100. package/dist/dialogs/contributor.js.map +1 -0
  101. package/dist/dialogs/figure.js +378 -0
  102. package/dist/dialogs/figure.js.map +1 -0
  103. package/dist/dialogs/index.js +11 -0
  104. package/dist/dialogs/index.js.map +1 -0
  105. package/dist/dialogs/language.js +47 -0
  106. package/dist/dialogs/language.js.map +1 -0
  107. package/dist/dialogs/link.js +243 -0
  108. package/dist/dialogs/link.js.map +1 -0
  109. package/dist/dialogs/math.js +121 -0
  110. package/dist/dialogs/math.js.map +1 -0
  111. package/dist/dialogs/ordered_list.js +67 -0
  112. package/dist/dialogs/ordered_list.js.map +1 -0
  113. package/dist/dialogs/revision.js +36 -0
  114. package/dist/dialogs/revision.js.map +1 -0
  115. package/dist/dialogs/subsup.js +109 -0
  116. package/dist/dialogs/subsup.js.map +1 -0
  117. package/dist/dialogs/table.js +217 -0
  118. package/dist/dialogs/table.js.map +1 -0
  119. package/dist/dialogs/templates.js +366 -0
  120. package/dist/dialogs/templates.js.map +1 -0
  121. package/dist/document_template/exporter.js +83 -0
  122. package/dist/document_template/exporter.js.map +1 -0
  123. package/dist/document_template/index.js +327 -0
  124. package/dist/document_template/index.js.map +1 -0
  125. package/dist/documents/access_rights/index.js +532 -0
  126. package/dist/documents/access_rights/index.js.map +1 -0
  127. package/dist/documents/access_rights/templates.js +150 -0
  128. package/dist/documents/access_rights/templates.js.map +1 -0
  129. package/dist/e2ee/encryptor.js +201 -0
  130. package/dist/e2ee/encryptor.js.map +1 -0
  131. package/dist/e2ee/key-manager.js +171 -0
  132. package/dist/e2ee/key-manager.js.map +1 -0
  133. package/dist/e2ee/passphrase-crypto.js +365 -0
  134. package/dist/e2ee/passphrase-crypto.js.map +1 -0
  135. package/dist/e2ee/passphrase-dialog.js +548 -0
  136. package/dist/e2ee/passphrase-dialog.js.map +1 -0
  137. package/dist/e2ee/passphrase-manager.js +350 -0
  138. package/dist/e2ee/passphrase-manager.js.map +1 -0
  139. package/dist/e2ee/password-dialog.js +552 -0
  140. package/dist/e2ee/password-dialog.js.map +1 -0
  141. package/dist/e2ee/snapshot-manager.js +238 -0
  142. package/dist/e2ee/snapshot-manager.js.map +1 -0
  143. package/dist/exporter/native/copy.js +29 -0
  144. package/dist/exporter/native/copy.js.map +1 -0
  145. package/dist/exporter/native/file.js +19 -0
  146. package/dist/exporter/native/file.js.map +1 -0
  147. package/dist/exporter/native/index.js +4 -0
  148. package/dist/exporter/native/index.js.map +1 -0
  149. package/dist/exporter/native/revision.js +54 -0
  150. package/dist/exporter/native/revision.js.map +1 -0
  151. package/dist/exporter/native/zip.js +2 -0
  152. package/dist/exporter/native/zip.js.map +1 -0
  153. package/dist/footnotes/editor.js +180 -0
  154. package/dist/footnotes/editor.js.map +1 -0
  155. package/dist/footnotes/index.js +15 -0
  156. package/dist/footnotes/index.js.map +1 -0
  157. package/dist/footnotes/layout.js +125 -0
  158. package/dist/footnotes/layout.js.map +1 -0
  159. package/dist/footnotes/state_plugins/access_rights.js +25 -0
  160. package/dist/footnotes/state_plugins/access_rights.js.map +1 -0
  161. package/dist/footnotes/state_plugins/index.js +2 -0
  162. package/dist/footnotes/state_plugins/index.js.map +1 -0
  163. package/dist/images/edit_dialog/edit_dialog/index.js +186 -0
  164. package/dist/images/edit_dialog/edit_dialog/index.js.map +1 -0
  165. package/dist/images/edit_dialog/edit_dialog/model.js +152 -0
  166. package/dist/images/edit_dialog/edit_dialog/model.js.map +1 -0
  167. package/dist/images/edit_dialog/edit_dialog/templates.js +33 -0
  168. package/dist/images/edit_dialog/edit_dialog/templates.js.map +1 -0
  169. package/dist/images/edit_dialog/model.js +6 -0
  170. package/dist/images/edit_dialog/model.js.map +1 -0
  171. package/dist/images/selection_dialog/index.js +149 -0
  172. package/dist/images/selection_dialog/index.js.map +1 -0
  173. package/dist/index.js +1002 -0
  174. package/dist/index.js.map +1 -0
  175. package/dist/keymap.js +73 -0
  176. package/dist/keymap.js.map +1 -0
  177. package/dist/marginboxes/index.js +674 -0
  178. package/dist/marginboxes/index.js.map +1 -0
  179. package/dist/marginboxes/templates.js +447 -0
  180. package/dist/marginboxes/templates.js.map +1 -0
  181. package/dist/menus/code_block/index.js +2 -0
  182. package/dist/menus/code_block/index.js.map +1 -0
  183. package/dist/menus/code_block/model.js +49 -0
  184. package/dist/menus/code_block/model.js.map +1 -0
  185. package/dist/menus/figure/index.js +3 -0
  186. package/dist/menus/figure/index.js.map +1 -0
  187. package/dist/menus/figure/model.js +80 -0
  188. package/dist/menus/figure/model.js.map +1 -0
  189. package/dist/menus/figure/utils.js +6 -0
  190. package/dist/menus/figure/utils.js.map +1 -0
  191. package/dist/menus/headerbar/index.js +3 -0
  192. package/dist/menus/headerbar/index.js.map +1 -0
  193. package/dist/menus/headerbar/model.js +743 -0
  194. package/dist/menus/headerbar/model.js.map +1 -0
  195. package/dist/menus/headerbar/view.js +579 -0
  196. package/dist/menus/headerbar/view.js.map +1 -0
  197. package/dist/menus/image/index.js +2 -0
  198. package/dist/menus/image/index.js.map +1 -0
  199. package/dist/menus/image/model.js +32 -0
  200. package/dist/menus/image/model.js.map +1 -0
  201. package/dist/menus/index.js +10 -0
  202. package/dist/menus/index.js.map +1 -0
  203. package/dist/menus/navigator/index.js +2 -0
  204. package/dist/menus/navigator/index.js.map +1 -0
  205. package/dist/menus/navigator/model.js +29 -0
  206. package/dist/menus/navigator/model.js.map +1 -0
  207. package/dist/menus/ordered_list/index.js +2 -0
  208. package/dist/menus/ordered_list/index.js.map +1 -0
  209. package/dist/menus/ordered_list/model.js +17 -0
  210. package/dist/menus/ordered_list/model.js.map +1 -0
  211. package/dist/menus/selection/index.js +3 -0
  212. package/dist/menus/selection/index.js.map +1 -0
  213. package/dist/menus/selection/model.js +108 -0
  214. package/dist/menus/selection/model.js.map +1 -0
  215. package/dist/menus/selection/view.js +125 -0
  216. package/dist/menus/selection/view.js.map +1 -0
  217. package/dist/menus/table/index.js +2 -0
  218. package/dist/menus/table/index.js.map +1 -0
  219. package/dist/menus/table/model.js +319 -0
  220. package/dist/menus/table/model.js.map +1 -0
  221. package/dist/menus/toolbar/index.js +3 -0
  222. package/dist/menus/toolbar/index.js.map +1 -0
  223. package/dist/menus/toolbar/model.js +747 -0
  224. package/dist/menus/toolbar/model.js.map +1 -0
  225. package/dist/menus/toolbar/view.js +314 -0
  226. package/dist/menus/toolbar/view.js.map +1 -0
  227. package/dist/navigator/index.js +435 -0
  228. package/dist/navigator/index.js.map +1 -0
  229. package/dist/no_collab_save/index.js +169 -0
  230. package/dist/no_collab_save/index.js.map +1 -0
  231. package/dist/plugins/citation_dialog/index.js +2 -0
  232. package/dist/plugins/citation_dialog/index.js.map +1 -0
  233. package/dist/plugins/editor/index.js +2 -0
  234. package/dist/plugins/editor/index.js.map +1 -0
  235. package/dist/state_plugins/access_rights.js +30 -0
  236. package/dist/state_plugins/access_rights.js.map +1 -0
  237. package/dist/state_plugins/citation_render.js +78 -0
  238. package/dist/state_plugins/citation_render.js.map +1 -0
  239. package/dist/state_plugins/clipboard.js +217 -0
  240. package/dist/state_plugins/clipboard.js.map +1 -0
  241. package/dist/state_plugins/code_block.js +165 -0
  242. package/dist/state_plugins/code_block.js.map +1 -0
  243. package/dist/state_plugins/collab_carets.js +115 -0
  244. package/dist/state_plugins/collab_carets.js.map +1 -0
  245. package/dist/state_plugins/comments.js +197 -0
  246. package/dist/state_plugins/comments.js.map +1 -0
  247. package/dist/state_plugins/contributor_input/add_button.js +101 -0
  248. package/dist/state_plugins/contributor_input/add_button.js.map +1 -0
  249. package/dist/state_plugins/contributor_input/dropup.js +273 -0
  250. package/dist/state_plugins/contributor_input/dropup.js.map +1 -0
  251. package/dist/state_plugins/contributor_input/helpers.js +23 -0
  252. package/dist/state_plugins/contributor_input/helpers.js.map +1 -0
  253. package/dist/state_plugins/contributor_input/index.js +3 -0
  254. package/dist/state_plugins/contributor_input/index.js.map +1 -0
  255. package/dist/state_plugins/contributor_input/node_view.js +76 -0
  256. package/dist/state_plugins/contributor_input/node_view.js.map +1 -0
  257. package/dist/state_plugins/contributor_input/plugin.js +236 -0
  258. package/dist/state_plugins/contributor_input/plugin.js.map +1 -0
  259. package/dist/state_plugins/document_template.js +213 -0
  260. package/dist/state_plugins/document_template.js.map +1 -0
  261. package/dist/state_plugins/figure.js +90 -0
  262. package/dist/state_plugins/figure.js.map +1 -0
  263. package/dist/state_plugins/footnote_markers.js +187 -0
  264. package/dist/state_plugins/footnote_markers.js.map +1 -0
  265. package/dist/state_plugins/headerbar.js +10 -0
  266. package/dist/state_plugins/headerbar.js.map +1 -0
  267. package/dist/state_plugins/index.js +27 -0
  268. package/dist/state_plugins/index.js.map +1 -0
  269. package/dist/state_plugins/inline_math.js +719 -0
  270. package/dist/state_plugins/inline_math.js.map +1 -0
  271. package/dist/state_plugins/inline_reference/dropup.js +182 -0
  272. package/dist/state_plugins/inline_reference/dropup.js.map +1 -0
  273. package/dist/state_plugins/inline_reference/index.js +2 -0
  274. package/dist/state_plugins/inline_reference/index.js.map +1 -0
  275. package/dist/state_plugins/inline_reference/plugin.js +1134 -0
  276. package/dist/state_plugins/inline_reference/plugin.js.map +1 -0
  277. package/dist/state_plugins/jump_hidden_nodes.js +47 -0
  278. package/dist/state_plugins/jump_hidden_nodes.js.map +1 -0
  279. package/dist/state_plugins/links.js +622 -0
  280. package/dist/state_plugins/links.js.map +1 -0
  281. package/dist/state_plugins/marginboxes.js +13 -0
  282. package/dist/state_plugins/marginboxes.js.map +1 -0
  283. package/dist/state_plugins/ordered_list_menu.js +72 -0
  284. package/dist/state_plugins/ordered_list_menu.js.map +1 -0
  285. package/dist/state_plugins/placeholders.js +98 -0
  286. package/dist/state_plugins/placeholders.js.map +1 -0
  287. package/dist/state_plugins/search.js +212 -0
  288. package/dist/state_plugins/search.js.map +1 -0
  289. package/dist/state_plugins/selection_menu.js +10 -0
  290. package/dist/state_plugins/selection_menu.js.map +1 -0
  291. package/dist/state_plugins/settings.js +191 -0
  292. package/dist/state_plugins/settings.js.map +1 -0
  293. package/dist/state_plugins/table.js +104 -0
  294. package/dist/state_plugins/table.js.map +1 -0
  295. package/dist/state_plugins/tag_input/helpers.js +55 -0
  296. package/dist/state_plugins/tag_input/helpers.js.map +1 -0
  297. package/dist/state_plugins/tag_input/index.js +3 -0
  298. package/dist/state_plugins/tag_input/index.js.map +1 -0
  299. package/dist/state_plugins/tag_input/node_view.js +77 -0
  300. package/dist/state_plugins/tag_input/node_view.js.map +1 -0
  301. package/dist/state_plugins/tag_input/plugin.js +199 -0
  302. package/dist/state_plugins/tag_input/plugin.js.map +1 -0
  303. package/dist/state_plugins/tag_input/tag_editor.js +159 -0
  304. package/dist/state_plugins/tag_input/tag_editor.js.map +1 -0
  305. package/dist/state_plugins/tag_input/tag_editor_plugins.js +61 -0
  306. package/dist/state_plugins/tag_input/tag_editor_plugins.js.map +1 -0
  307. package/dist/state_plugins/toc_render.js +142 -0
  308. package/dist/state_plugins/toc_render.js.map +1 -0
  309. package/dist/state_plugins/toolbar.js +10 -0
  310. package/dist/state_plugins/toolbar.js.map +1 -0
  311. package/dist/state_plugins/track/find_selected_changes.js +82 -0
  312. package/dist/state_plugins/track/find_selected_changes.js.map +1 -0
  313. package/dist/state_plugins/track/helpers.js +67 -0
  314. package/dist/state_plugins/track/helpers.js.map +1 -0
  315. package/dist/state_plugins/track/index.js +3 -0
  316. package/dist/state_plugins/track/index.js.map +1 -0
  317. package/dist/state_plugins/track/plugin.js +114 -0
  318. package/dist/state_plugins/track/plugin.js.map +1 -0
  319. package/dist/tools/index.js +4 -0
  320. package/dist/tools/index.js.map +1 -0
  321. package/dist/tools/key_bindings/index.js +20 -0
  322. package/dist/tools/key_bindings/index.js.map +1 -0
  323. package/dist/tools/key_bindings/templates.js +68 -0
  324. package/dist/tools/key_bindings/templates.js.map +1 -0
  325. package/dist/tools/search_replace/index.js +275 -0
  326. package/dist/tools/search_replace/index.js.map +1 -0
  327. package/dist/tools/search_replace/templates.js +18 -0
  328. package/dist/tools/search_replace/templates.js.map +1 -0
  329. package/dist/tools/word_count/index.js +40 -0
  330. package/dist/tools/word_count/index.js.map +1 -0
  331. package/dist/tools/word_count/templates.js +27 -0
  332. package/dist/tools/word_count/templates.js.map +1 -0
  333. package/dist/track/accept.js +66 -0
  334. package/dist/track/accept.js.map +1 -0
  335. package/dist/track/accept_all.js +51 -0
  336. package/dist/track/accept_all.js.map +1 -0
  337. package/dist/track/accept_all_no_insertions.js +63 -0
  338. package/dist/track/accept_all_no_insertions.js.map +1 -0
  339. package/dist/track/amend_transaction.js +390 -0
  340. package/dist/track/amend_transaction.js.map +1 -0
  341. package/dist/track/delete.js +62 -0
  342. package/dist/track/delete.js.map +1 -0
  343. package/dist/track/index.js +6 -0
  344. package/dist/track/index.js.map +1 -0
  345. package/dist/track/mod.js +86 -0
  346. package/dist/track/mod.js.map +1 -0
  347. package/dist/track/reject.js +67 -0
  348. package/dist/track/reject.js.map +1 -0
  349. package/dist/track/reject_all.js +56 -0
  350. package/dist/track/reject_all.js.map +1 -0
  351. package/package.json +80 -0
  352. package/src/bibliography/tools.js +58 -0
  353. package/src/citations/index.js +443 -0
  354. package/src/citations/render.js +68 -0
  355. package/src/clipboard/copy/index.js +1 -0
  356. package/src/clipboard/copy/schema.js +62 -0
  357. package/src/clipboard/copy/serializers.js +179 -0
  358. package/src/clipboard/paste/fidus_writer.js +55 -0
  359. package/src/clipboard/paste/general.js +80 -0
  360. package/src/clipboard/paste/google_docs.js +26 -0
  361. package/src/clipboard/paste/html.js +76 -0
  362. package/src/clipboard/paste/index.js +2 -0
  363. package/src/clipboard/paste/libreoffice_writer.js +32 -0
  364. package/src/clipboard/paste/microsoft_word.js +87 -0
  365. package/src/clipboard/paste/text.js +58 -0
  366. package/src/collab/chat.js +195 -0
  367. package/src/collab/colors.js +67 -0
  368. package/src/collab/doc.js +1436 -0
  369. package/src/collab/index.js +81 -0
  370. package/src/collab/merge/changeset.js +103 -0
  371. package/src/collab/merge/editor.js +1065 -0
  372. package/src/collab/merge/footnotes.js +175 -0
  373. package/src/collab/merge/index.js +401 -0
  374. package/src/collab/merge/recreate_transform.js +326 -0
  375. package/src/collab/merge/schema.js +135 -0
  376. package/src/collab/merge/state_plugins/action.js +171 -0
  377. package/src/collab/merge/state_plugins/clipboard.js +32 -0
  378. package/src/collab/merge/state_plugins/diff.js +780 -0
  379. package/src/collab/merge/state_plugins/index.js +2 -0
  380. package/src/collab/merge/tools.js +217 -0
  381. package/src/collab/templates.js +10 -0
  382. package/src/comments/comment.js +29 -0
  383. package/src/comments/editors/answer.js +55 -0
  384. package/src/comments/editors/comment.js +318 -0
  385. package/src/comments/editors/index.js +4 -0
  386. package/src/comments/editors/notify.js +13 -0
  387. package/src/comments/editors/schema.js +65 -0
  388. package/src/comments/index.js +11 -0
  389. package/src/comments/interactions.js +465 -0
  390. package/src/comments/store.js +513 -0
  391. package/src/contacts/add_dialog.js +110 -0
  392. package/src/contacts/templates.js +28 -0
  393. package/src/copyright_dialog/index.js +179 -0
  394. package/src/copyright_dialog/templates.js +56 -0
  395. package/src/databases/bibliography.js +179 -0
  396. package/src/databases/images.js +320 -0
  397. package/src/databases/index.js +69 -0
  398. package/src/dialogs/citation.js +428 -0
  399. package/src/dialogs/code_block.js +242 -0
  400. package/src/dialogs/contributor.js +173 -0
  401. package/src/dialogs/figure.js +479 -0
  402. package/src/dialogs/index.js +10 -0
  403. package/src/dialogs/language.js +58 -0
  404. package/src/dialogs/link.js +358 -0
  405. package/src/dialogs/math.js +148 -0
  406. package/src/dialogs/ordered_list.js +84 -0
  407. package/src/dialogs/revision.js +43 -0
  408. package/src/dialogs/subsup.js +116 -0
  409. package/src/dialogs/table.js +258 -0
  410. package/src/dialogs/templates.js +426 -0
  411. package/src/document_template/exporter.js +97 -0
  412. package/src/document_template/index.js +483 -0
  413. package/src/documents/access_rights/index.js +693 -0
  414. package/src/documents/access_rights/templates.js +178 -0
  415. package/src/e2ee/encryptor.js +228 -0
  416. package/src/e2ee/key-manager.js +202 -0
  417. package/src/e2ee/passphrase-crypto.js +606 -0
  418. package/src/e2ee/passphrase-dialog.js +655 -0
  419. package/src/e2ee/passphrase-manager.js +502 -0
  420. package/src/e2ee/password-dialog.js +652 -0
  421. package/src/e2ee/snapshot-manager.js +305 -0
  422. package/src/exporter/native/copy.js +54 -0
  423. package/src/exporter/native/file.js +37 -0
  424. package/src/exporter/native/index.js +3 -0
  425. package/src/exporter/native/revision.js +86 -0
  426. package/src/exporter/native/zip.js +1 -0
  427. package/src/footnotes/editor.js +227 -0
  428. package/src/footnotes/index.js +16 -0
  429. package/src/footnotes/layout.js +190 -0
  430. package/src/footnotes/state_plugins/access_rights.js +39 -0
  431. package/src/footnotes/state_plugins/index.js +1 -0
  432. package/src/images/edit_dialog/edit_dialog/index.js +222 -0
  433. package/src/images/edit_dialog/edit_dialog/model.js +183 -0
  434. package/src/images/edit_dialog/edit_dialog/templates.js +41 -0
  435. package/src/images/edit_dialog/model.js +5 -0
  436. package/src/images/selection_dialog/index.js +176 -0
  437. package/src/index.js +1252 -0
  438. package/src/keymap.js +102 -0
  439. package/src/marginboxes/index.js +946 -0
  440. package/src/marginboxes/templates.js +573 -0
  441. package/src/menus/code_block/index.js +1 -0
  442. package/src/menus/code_block/model.js +52 -0
  443. package/src/menus/figure/index.js +2 -0
  444. package/src/menus/figure/model.js +91 -0
  445. package/src/menus/figure/utils.js +5 -0
  446. package/src/menus/headerbar/index.js +2 -0
  447. package/src/menus/headerbar/model.js +1077 -0
  448. package/src/menus/headerbar/view.js +675 -0
  449. package/src/menus/image/index.js +1 -0
  450. package/src/menus/image/model.js +32 -0
  451. package/src/menus/index.js +9 -0
  452. package/src/menus/navigator/index.js +1 -0
  453. package/src/menus/navigator/model.js +28 -0
  454. package/src/menus/ordered_list/index.js +1 -0
  455. package/src/menus/ordered_list/model.js +19 -0
  456. package/src/menus/selection/index.js +2 -0
  457. package/src/menus/selection/model.js +134 -0
  458. package/src/menus/selection/view.js +154 -0
  459. package/src/menus/table/index.js +1 -0
  460. package/src/menus/table/model.js +414 -0
  461. package/src/menus/toolbar/index.js +2 -0
  462. package/src/menus/toolbar/model.js +920 -0
  463. package/src/menus/toolbar/view.js +354 -0
  464. package/src/navigator/index.js +515 -0
  465. package/src/no_collab_save/index.js +209 -0
  466. package/src/plugins/citation_dialog/index.js +1 -0
  467. package/src/plugins/editor/index.js +1 -0
  468. package/src/state_plugins/access_rights.js +47 -0
  469. package/src/state_plugins/citation_render.js +88 -0
  470. package/src/state_plugins/clipboard.js +289 -0
  471. package/src/state_plugins/code_block.js +201 -0
  472. package/src/state_plugins/collab_carets.js +152 -0
  473. package/src/state_plugins/comments.js +259 -0
  474. package/src/state_plugins/contributor_input/add_button.js +134 -0
  475. package/src/state_plugins/contributor_input/dropup.js +318 -0
  476. package/src/state_plugins/contributor_input/helpers.js +24 -0
  477. package/src/state_plugins/contributor_input/index.js +2 -0
  478. package/src/state_plugins/contributor_input/node_view.js +86 -0
  479. package/src/state_plugins/contributor_input/plugin.js +318 -0
  480. package/src/state_plugins/document_template.js +315 -0
  481. package/src/state_plugins/figure.js +108 -0
  482. package/src/state_plugins/footnote_markers.js +238 -0
  483. package/src/state_plugins/headerbar.js +12 -0
  484. package/src/state_plugins/index.js +73 -0
  485. package/src/state_plugins/inline_math.js +918 -0
  486. package/src/state_plugins/inline_reference/dropup.js +208 -0
  487. package/src/state_plugins/inline_reference/index.js +5 -0
  488. package/src/state_plugins/inline_reference/plugin.js +1429 -0
  489. package/src/state_plugins/jump_hidden_nodes.js +58 -0
  490. package/src/state_plugins/links.js +830 -0
  491. package/src/state_plugins/marginboxes.js +14 -0
  492. package/src/state_plugins/ordered_list_menu.js +84 -0
  493. package/src/state_plugins/placeholders.js +123 -0
  494. package/src/state_plugins/search.js +251 -0
  495. package/src/state_plugins/selection_menu.js +12 -0
  496. package/src/state_plugins/settings.js +223 -0
  497. package/src/state_plugins/table.js +127 -0
  498. package/src/state_plugins/tag_input/helpers.js +69 -0
  499. package/src/state_plugins/tag_input/index.js +2 -0
  500. package/src/state_plugins/tag_input/node_view.js +85 -0
  501. package/src/state_plugins/tag_input/plugin.js +278 -0
  502. package/src/state_plugins/tag_input/tag_editor.js +202 -0
  503. package/src/state_plugins/tag_input/tag_editor_plugins.js +74 -0
  504. package/src/state_plugins/toc_render.js +160 -0
  505. package/src/state_plugins/toolbar.js +12 -0
  506. package/src/state_plugins/track/find_selected_changes.js +107 -0
  507. package/src/state_plugins/track/helpers.js +108 -0
  508. package/src/state_plugins/track/index.js +6 -0
  509. package/src/state_plugins/track/plugin.js +140 -0
  510. package/src/tools/index.js +3 -0
  511. package/src/tools/key_bindings/index.js +21 -0
  512. package/src/tools/key_bindings/templates.js +68 -0
  513. package/src/tools/search_replace/index.js +421 -0
  514. package/src/tools/search_replace/templates.js +19 -0
  515. package/src/tools/word_count/index.js +59 -0
  516. package/src/tools/word_count/templates.js +34 -0
  517. package/src/track/accept.js +102 -0
  518. package/src/track/accept_all.js +103 -0
  519. package/src/track/accept_all_no_insertions.js +102 -0
  520. package/src/track/amend_transaction.js +562 -0
  521. package/src/track/delete.js +92 -0
  522. package/src/track/index.js +8 -0
  523. package/src/track/mod.js +116 -0
  524. package/src/track/reject.js +116 -0
  525. package/src/track/reject_all.js +121 -0
@@ -0,0 +1,552 @@
1
+ /**
2
+ * E2EE Password Dialog - UI for entering, creating, and changing
3
+ * document passwords for end-to-end encrypted documents.
4
+ *
5
+ * Provides three dialog types:
6
+ * 1. Enter password - when opening an encrypted document
7
+ * 2. Create password - when creating a new encrypted document
8
+ * 3. Change password - when changing the password of an existing encrypted document
9
+ *
10
+ * Password requirements:
11
+ * - Minimum 5 characters
12
+ * While the requirements are not satisfactory for security,
13
+ * the user is shown a degree of weakness and is therefore encouraged to use a stronger password.
14
+ */
15
+ import { Dialog, escapeText } from "fwtoolkit";
16
+ /**
17
+ * Validate a password against the minimum requirements.
18
+ *
19
+ * @param {string} password - The password to validate
20
+ * @returns {{valid: boolean, message: string}} Validation result
21
+ */
22
+ export function validatePassword(password) {
23
+ if (!password || password.length < 5) {
24
+ return {
25
+ valid: false,
26
+ message: gettext("Password must be at least 5 characters long.")
27
+ };
28
+ }
29
+ return { valid: true, message: "" };
30
+ }
31
+ /**
32
+ * Calculate a rough password strength score (0-4).
33
+ *
34
+ * Based on length, character variety, and common patterns.
35
+ * This is a simple heuristic — not a substitute for a proper
36
+ * password strength estimator like zxcvbn, but sufficient for
37
+ * a basic strength meter.
38
+ *
39
+ * @param {string} password - The password to evaluate
40
+ * @returns {number} Strength score from 0 (very weak) to 4 (very strong)
41
+ */
42
+ export function passwordStrength(password) {
43
+ if (!password) {
44
+ return 0;
45
+ }
46
+ let score = 0;
47
+ // Length contributions
48
+ if (password.length >= 12) {
49
+ score++;
50
+ }
51
+ if (password.length >= 16) {
52
+ score++;
53
+ }
54
+ if (password.length >= 20) {
55
+ score++;
56
+ }
57
+ // Character variety contributions
58
+ const hasLower = /[a-z]/.test(password);
59
+ const hasUpper = /[A-Z]/.test(password);
60
+ const hasDigit = /[0-9]/.test(password);
61
+ const hasSpecial = /[^a-zA-Z0-9]/.test(password);
62
+ const varietyCount = [hasLower, hasUpper, hasDigit, hasSpecial].filter(Boolean).length;
63
+ if (varietyCount >= 3) {
64
+ score++;
65
+ }
66
+ // Penalize very common patterns
67
+ const commonPatterns = [
68
+ /^123456/,
69
+ /^123123/,
70
+ /^password/i,
71
+ /^qwerty/i,
72
+ /^abc123/i,
73
+ /(.)\1{3,}/ // Repeated characters (4+ in a row)
74
+ ];
75
+ for (const pattern of commonPatterns) {
76
+ if (pattern.test(password)) {
77
+ score = Math.max(0, score - 2);
78
+ break;
79
+ }
80
+ }
81
+ return Math.min(4, Math.max(0, score));
82
+ }
83
+ /**
84
+ * Get a CSS class and label for a password strength score.
85
+ *
86
+ * @param {number} score - Strength score from passwordStrength()
87
+ * @returns {{cssClass: string, label: string}}
88
+ */
89
+ export function strengthInfo(score) {
90
+ const levels = [
91
+ { cssClass: "very-weak", label: gettext("Very weak") },
92
+ { cssClass: "weak", label: gettext("Weak") },
93
+ { cssClass: "fair", label: gettext("Fair") },
94
+ { cssClass: "strong", label: gettext("Strong") },
95
+ { cssClass: "very-strong", label: gettext("Very strong") }
96
+ ];
97
+ return levels[score] || levels[0];
98
+ }
99
+ /**
100
+ * Show a dialog for entering the password to decrypt an E2EE document.
101
+ *
102
+ * This dialog is shown when a user opens an encrypted document.
103
+ * The user must enter the password to derive the decryption key.
104
+ *
105
+ * If the URL contains a fragment (e.g., #PASSWORD from a share link),
106
+ * the password field is pre-filled and the dialog can be auto-submitted.
107
+ *
108
+ * @param {Function} onPassword - Callback called with the entered password string
109
+ * @param {string} [urlFragment] - Password from URL fragment (share link), if available
110
+ * @returns {Promise<void>}
111
+ */
112
+ export function enterPasswordDialog(onPassword, urlFragment = "", onCancel = null) {
113
+ return new Promise(resolve => {
114
+ const dialogId = "e2ee-enter-password";
115
+ // If password was provided via URL fragment, use it directly
116
+ if (urlFragment && urlFragment.length > 0) {
117
+ onPassword(urlFragment);
118
+ resolve();
119
+ return;
120
+ }
121
+ const body = `
122
+ <div class="e2ee-password-dialog">
123
+ <p>${gettext("This document is end-to-end encrypted. Enter the password to decrypt it.")}</p>
124
+ <div class="e2ee-password-field">
125
+ <label for="e2ee-password-input">${gettext("Password")}</label>
126
+ <input type="password" id="e2ee-password-input" class="e2ee-password-input"
127
+ autocomplete="off" data-1p-ignore data-lp-ignore data-lpignore="true" data-bwignore data-form-type="other" autofocus />
128
+ <button type="button" class="e2ee-toggle-visibility" title="${gettext("Show password")}">
129
+ <i class="fa-solid fa-eye"></i>
130
+ </button>
131
+ </div>
132
+ <div class="e2ee-password-error" id="e2ee-password-error"></div>
133
+ </div>
134
+ `;
135
+ // Declare dialogInstance before buttons so the click handler
136
+ // can call dialogInstance.close().
137
+ let dialogInstance;
138
+ const buttons = [
139
+ {
140
+ text: gettext("Decrypt"),
141
+ classes: "fw-button fw-dark",
142
+ click: () => {
143
+ const input = document.getElementById("e2ee-password-input");
144
+ const password = input ? input.value : "";
145
+ if (password.length === 0) {
146
+ const errorEl = document.getElementById("e2ee-password-error");
147
+ if (errorEl) {
148
+ errorEl.textContent = gettext("Please enter the password.");
149
+ }
150
+ return;
151
+ }
152
+ dialogInstance.close();
153
+ onPassword(password);
154
+ resolve();
155
+ }
156
+ },
157
+ {
158
+ text: gettext("Cancel"),
159
+ classes: "fw-button fw-light",
160
+ click: () => {
161
+ dialogInstance.close();
162
+ if (typeof onCancel === "function") {
163
+ onCancel();
164
+ }
165
+ resolve();
166
+ }
167
+ }
168
+ ];
169
+ const dialog = {
170
+ title: gettext("Encrypted Document"),
171
+ id: dialogId,
172
+ body: body,
173
+ buttons: buttons,
174
+ canClose: true
175
+ };
176
+ // Use the Fidus Writer dialog system
177
+ dialogInstance = new Dialog(dialog);
178
+ dialogInstance.open();
179
+ // Set up toggle visibility button
180
+ setTimeout(() => {
181
+ const toggleBtn = document.querySelector(`#${dialogId} .e2ee-toggle-visibility`);
182
+ const input = document.getElementById("e2ee-password-input");
183
+ if (toggleBtn && input) {
184
+ toggleBtn.addEventListener("click", () => {
185
+ if (input.type === "password") {
186
+ input.type = "text";
187
+ toggleBtn.innerHTML =
188
+ '<i class="fa-solid fa-eye-slash"></i>';
189
+ toggleBtn.title = gettext("Hide password");
190
+ }
191
+ else {
192
+ input.type = "password";
193
+ toggleBtn.innerHTML = '<i class="fa-solid fa-eye"></i>';
194
+ toggleBtn.title = gettext("Show password");
195
+ }
196
+ });
197
+ }
198
+ // Submit on Enter key
199
+ if (input) {
200
+ input.addEventListener("keypress", event => {
201
+ if (event.key === "Enter") {
202
+ event.preventDefault();
203
+ buttons[0].click();
204
+ }
205
+ });
206
+ input.focus();
207
+ }
208
+ }, 100);
209
+ });
210
+ }
211
+ /**
212
+ * Show a dialog for creating a password for a new E2EE document.
213
+ *
214
+ * This dialog is shown when a user creates a new encrypted document.
215
+ * The user must enter and confirm a password. The password must meet
216
+ * the minimum requirements (12+ characters, at least one letter and
217
+ * one number).
218
+ *
219
+ * @param {Function} onPassword - Callback called with the entered password string
220
+ * @returns {Promise<void>}
221
+ */
222
+ export function createPasswordDialog(onPassword) {
223
+ return new Promise(resolve => {
224
+ const dialogId = "e2ee-create-password";
225
+ const body = `
226
+ <div class="e2ee-password-dialog">
227
+ <p>${gettext("Set a password to encrypt this document. You will need this password to open the document in the future.")}</p>
228
+ <p class="e2ee-password-hint">${gettext('Tip: Use a passphrase with multiple words, e.g. "correct-horse-battery-staple". This is both secure and easy to remember.')}</p>
229
+ <div class="e2ee-password-field">
230
+ <label for="e2ee-new-password-input">${gettext("Password")}</label>
231
+ <input type="password" id="e2ee-new-password-input" class="e2ee-password-input"
232
+ autocomplete="off" data-1p-ignore data-lp-ignore data-lpignore="true" data-bwignore data-form-type="other" autofocus />
233
+ <button type="button" class="e2ee-toggle-visibility" title="${gettext("Show password")}">
234
+ <i class="fa-solid fa-eye"></i>
235
+ </button>
236
+ </div>
237
+ <div class="e2ee-strength-meter">
238
+ <div class="e2ee-strength-bar" id="e2ee-strength-bar"></div>
239
+ <span class="e2ee-strength-label" id="e2ee-strength-label"></span>
240
+ </div>
241
+ <div class="e2ee-password-field">
242
+ <label for="e2ee-confirm-password-input">${gettext("Confirm password")}</label>
243
+ <input type="password" id="e2ee-confirm-password-input" class="e2ee-password-input"
244
+ autocomplete="off" data-1p-ignore data-lp-ignore data-lpignore="true" data-bwignore data-form-type="other" />
245
+ </div>
246
+ <div class="e2ee-password-error" id="e2ee-password-error"></div>
247
+ </div>
248
+ `;
249
+ const buttons = [
250
+ {
251
+ text: gettext("Create Encrypted Document"),
252
+ classes: "fw-button fw-dark",
253
+ click: () => {
254
+ const input = document.getElementById("e2ee-new-password-input");
255
+ const confirmInput = document.getElementById("e2ee-confirm-password-input");
256
+ const errorEl = document.getElementById("e2ee-password-error");
257
+ const password = input ? input.value : "";
258
+ const confirmPassword = confirmInput
259
+ ? confirmInput.value
260
+ : "";
261
+ // Validate password
262
+ const validation = validatePassword(password);
263
+ if (!validation.valid) {
264
+ if (errorEl) {
265
+ errorEl.textContent = validation.message;
266
+ }
267
+ return;
268
+ }
269
+ // Check confirmation
270
+ if (password !== confirmPassword) {
271
+ if (errorEl) {
272
+ errorEl.textContent = gettext("Passwords do not match.");
273
+ }
274
+ return;
275
+ }
276
+ dialogInstance.close();
277
+ onPassword(password);
278
+ resolve();
279
+ }
280
+ }
281
+ ];
282
+ const dialog = {
283
+ title: gettext("Set Document Password"),
284
+ id: dialogId,
285
+ body: body,
286
+ buttons: buttons,
287
+ canClose: true
288
+ };
289
+ const dialogInstance = new Dialog(dialog);
290
+ dialogInstance.open();
291
+ setTimeout(() => {
292
+ // Set up toggle visibility buttons
293
+ const toggleBtns = document.querySelectorAll(`#${dialogId} .e2ee-toggle-visibility`);
294
+ toggleBtns.forEach(btn => {
295
+ btn.addEventListener("click", () => {
296
+ const input = btn.parentElement.querySelector("input");
297
+ if (input) {
298
+ if (input.type === "password") {
299
+ input.type = "text";
300
+ btn.innerHTML =
301
+ '<i class="fa-solid fa-eye-slash"></i>';
302
+ }
303
+ else {
304
+ input.type = "password";
305
+ btn.innerHTML = '<i class="fa-solid fa-eye"></i>';
306
+ }
307
+ }
308
+ });
309
+ });
310
+ // Set up strength meter
311
+ const passwordInput = document.getElementById("e2ee-new-password-input");
312
+ if (passwordInput) {
313
+ passwordInput.addEventListener("input", () => {
314
+ const score = passwordStrength(passwordInput.value);
315
+ const info = strengthInfo(score);
316
+ const bar = document.getElementById("e2ee-strength-bar");
317
+ const label = document.getElementById("e2ee-strength-label");
318
+ if (bar) {
319
+ bar.className = `e2ee-strength-bar ${info.cssClass}`;
320
+ bar.style.width = `${(score + 1) * 25}%`;
321
+ }
322
+ if (label) {
323
+ label.textContent = info.label;
324
+ label.className = `e2ee-strength-label ${info.cssClass}`;
325
+ }
326
+ });
327
+ // Initialize strength meter
328
+ passwordInput.dispatchEvent(new Event("input"));
329
+ passwordInput.focus();
330
+ }
331
+ // Submit on Enter key in confirm field
332
+ const confirmInput = document.getElementById("e2ee-confirm-password-input");
333
+ if (confirmInput) {
334
+ confirmInput.addEventListener("keypress", event => {
335
+ if (event.key === "Enter") {
336
+ event.preventDefault();
337
+ buttons[0].click();
338
+ }
339
+ });
340
+ }
341
+ }, 100);
342
+ });
343
+ }
344
+ /**
345
+ * Show a dialog for changing the password of an existing E2EE document.
346
+ *
347
+ * The user must enter their current password (to verify identity),
348
+ * then enter and confirm a new password.
349
+ *
350
+ * @param {Function} onPasswordChange - Callback called with
351
+ * {currentPassword: string, newPassword: string}
352
+ * @param {Object} [options] - Optional settings
353
+ * @param {string} [options.currentPassword] - Prefill current password field
354
+ * @param {string} [options.suggestedNewPassword] - Prefill new password field
355
+ * @param {boolean} [options.hideCurrentPassword] - Hide the current password field
356
+ * @param {boolean} [options.showNewPasswordPlaintext] - Show new password as plain text
357
+ * @param {string} [options.infoText] - Additional explanatory HTML paragraph
358
+ * @returns {Promise<void>}
359
+ */
360
+ export function changePasswordDialog(onPasswordChange, options = {}) {
361
+ return new Promise(resolve => {
362
+ const dialogId = "e2ee-change-password";
363
+ const currentPassword = options.currentPassword || "";
364
+ const suggestedNewPassword = options.suggestedNewPassword || "";
365
+ const hasPrefilledNew = suggestedNewPassword.length > 0;
366
+ const hideCurrentPassword = options.hideCurrentPassword || false;
367
+ const showNewPasswordPlaintext = options.showNewPasswordPlaintext || false;
368
+ const infoText = options.infoText || "";
369
+ const currentPasswordField = hideCurrentPassword
370
+ ? `<input type="hidden" id="e2ee-current-password-input" value="${escapeText(currentPassword)}" />`
371
+ : `<div class="e2ee-password-field">
372
+ <label for="e2ee-current-password-input">${gettext("Current password")}</label>
373
+ <input type="password" id="e2ee-current-password-input" class="e2ee-password-input"
374
+ value="${escapeText(currentPassword)}"
375
+ autocomplete="off" data-1p-ignore data-lp-ignore data-lpignore="true" data-bwignore data-form-type="other" autofocus />
376
+ </div>
377
+ <hr />`;
378
+ const newPasswordInputType = showNewPasswordPlaintext
379
+ ? "text"
380
+ : "password";
381
+ const body = `
382
+ <div class="e2ee-password-dialog">
383
+ <p>${gettext("Change the document password. After changing, you must share the new password with all collaborators.")}</p>
384
+ ${infoText ? `<p class="e2ee-password-hint">${infoText}</p>` : ""}
385
+ ${currentPasswordField}
386
+ <div class="e2ee-password-field">
387
+ <label for="e2ee-new-password-input">${gettext("New password")}</label>
388
+ <input type="${newPasswordInputType}" id="e2ee-new-password-input" class="e2ee-password-input"
389
+ value="${escapeText(suggestedNewPassword)}"
390
+ autocomplete="off" data-1p-ignore data-lp-ignore data-lpignore="true" data-bwignore data-form-type="other" ${hideCurrentPassword ? "autofocus" : ""} />
391
+ ${showNewPasswordPlaintext
392
+ ? ""
393
+ : `<button type="button" class="e2ee-toggle-visibility" title="${gettext("Show password")}">
394
+ <i class="fa-solid fa-eye"></i>
395
+ </button>`}
396
+ </div>
397
+ <div class="e2ee-strength-meter" style="display: ${showNewPasswordPlaintext && hasPrefilledNew ? "none" : ""}">
398
+ <div class="e2ee-strength-bar" id="e2ee-strength-bar"></div>
399
+ <span class="e2ee-strength-label" id="e2ee-strength-label"></span>
400
+ </div>
401
+ <div class="e2ee-password-field" id="e2ee-confirm-field" style="display: ${hasPrefilledNew ? "none" : ""}">
402
+ <label for="e2ee-confirm-password-input">${gettext("Confirm new password")}</label>
403
+ <input type="password" id="e2ee-confirm-password-input" class="e2ee-password-input"
404
+ autocomplete="off" data-1p-ignore data-lp-ignore data-lpignore="true" data-bwignore data-form-type="other" />
405
+ </div>
406
+ <div class="e2ee-password-error" id="e2ee-password-error"></div>
407
+ </div>
408
+ `;
409
+ let newPasswordChanged = !hasPrefilledNew;
410
+ const buttons = [
411
+ {
412
+ text: gettext("Change Password"),
413
+ classes: "fw-button fw-dark",
414
+ click: () => {
415
+ const currentInput = document.getElementById("e2ee-current-password-input");
416
+ const newInput = document.getElementById("e2ee-new-password-input");
417
+ const confirmInput = document.getElementById("e2ee-confirm-password-input");
418
+ const errorEl = document.getElementById("e2ee-password-error");
419
+ const currentPasswordValue = currentInput
420
+ ? currentInput.value
421
+ : "";
422
+ const newPassword = newInput ? newInput.value : "";
423
+ const confirmPassword = confirmInput
424
+ ? confirmInput.value
425
+ : "";
426
+ // Validate current password
427
+ if (currentPasswordValue.length === 0) {
428
+ if (errorEl) {
429
+ errorEl.textContent = gettext("Please enter the current password.");
430
+ }
431
+ return;
432
+ }
433
+ // Validate new password
434
+ const validation = validatePassword(newPassword);
435
+ if (!validation.valid) {
436
+ if (errorEl) {
437
+ errorEl.textContent = validation.message;
438
+ }
439
+ return;
440
+ }
441
+ // Check confirmation only if user changed the prefilled value
442
+ if (newPasswordChanged && newPassword !== confirmPassword) {
443
+ if (errorEl) {
444
+ errorEl.textContent = gettext("Passwords do not match.");
445
+ }
446
+ return;
447
+ }
448
+ // Check that new password is different
449
+ if (currentPasswordValue === newPassword) {
450
+ if (errorEl) {
451
+ errorEl.textContent = gettext("New password must be different from the current password.");
452
+ }
453
+ return;
454
+ }
455
+ dialogInstance.close();
456
+ onPasswordChange({
457
+ currentPassword: currentPasswordValue,
458
+ newPassword
459
+ });
460
+ resolve();
461
+ }
462
+ }
463
+ ];
464
+ const dialog = {
465
+ title: gettext("Change Document Password"),
466
+ id: dialogId,
467
+ body: body,
468
+ buttons: buttons,
469
+ canClose: true
470
+ };
471
+ const dialogInstance = new Dialog(dialog);
472
+ dialogInstance.open();
473
+ setTimeout(() => {
474
+ // Set up toggle visibility buttons (only if new password is not plaintext)
475
+ if (!showNewPasswordPlaintext) {
476
+ const toggleBtns = document.querySelectorAll(`#${dialogId} .e2ee-toggle-visibility`);
477
+ toggleBtns.forEach(btn => {
478
+ btn.addEventListener("click", () => {
479
+ const input = btn.parentElement.querySelector("input");
480
+ if (input) {
481
+ if (input.type === "password") {
482
+ input.type = "text";
483
+ btn.innerHTML =
484
+ '<i class="fa-solid fa-eye-slash"></i>';
485
+ }
486
+ else {
487
+ input.type = "password";
488
+ btn.innerHTML =
489
+ '<i class="fa-solid fa-eye"></i>';
490
+ }
491
+ }
492
+ });
493
+ });
494
+ }
495
+ // Set up strength meter
496
+ const passwordInput = document.getElementById("e2ee-new-password-input");
497
+ if (passwordInput &&
498
+ !(showNewPasswordPlaintext && hasPrefilledNew)) {
499
+ passwordInput.addEventListener("input", () => {
500
+ const score = passwordStrength(passwordInput.value);
501
+ const info = strengthInfo(score);
502
+ const bar = document.getElementById("e2ee-strength-bar");
503
+ const label = document.getElementById("e2ee-strength-label");
504
+ if (bar) {
505
+ bar.className = `e2ee-strength-bar ${info.cssClass}`;
506
+ bar.style.width = `${(score + 1) * 25}%`;
507
+ }
508
+ if (label) {
509
+ label.textContent = info.label;
510
+ label.className = `e2ee-strength-label ${info.cssClass}`;
511
+ }
512
+ });
513
+ passwordInput.dispatchEvent(new Event("input"));
514
+ }
515
+ // Track changes to new password field
516
+ if (passwordInput && hasPrefilledNew) {
517
+ passwordInput.addEventListener("input", () => {
518
+ if (passwordInput.value !== suggestedNewPassword) {
519
+ newPasswordChanged = true;
520
+ const confirmField = document.getElementById("e2ee-confirm-field");
521
+ if (confirmField) {
522
+ confirmField.style.display = "";
523
+ }
524
+ // Show strength meter again if user edits the prefilled value
525
+ const strengthMeter = document.querySelector(`#${dialogId} .e2ee-strength-meter`);
526
+ if (strengthMeter) {
527
+ strengthMeter.style.display = "";
528
+ }
529
+ }
530
+ });
531
+ }
532
+ // Submit on Enter key
533
+ const confirmInput = document.getElementById("e2ee-confirm-password-input");
534
+ if (confirmInput) {
535
+ confirmInput.addEventListener("keypress", event => {
536
+ if (event.key === "Enter") {
537
+ event.preventDefault();
538
+ buttons[0].click();
539
+ }
540
+ });
541
+ }
542
+ const currentInput = document.getElementById("e2ee-current-password-input");
543
+ if (currentInput && !hideCurrentPassword) {
544
+ currentInput.focus();
545
+ }
546
+ else if (passwordInput) {
547
+ passwordInput.focus();
548
+ }
549
+ }, 100);
550
+ });
551
+ }
552
+ //# sourceMappingURL=password-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password-dialog.js","sourceRoot":"","sources":["../../src/e2ee/password-dialog.js"],"names":[],"mappings":"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"}