@concord-consortium/cloud-file-manager 2.0.0-pre.1

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 (486) hide show
  1. package/dist/autolaunch/autolaunch.css +220 -0
  2. package/dist/autolaunch/autolaunch.html +133 -0
  3. package/dist/autolaunch/autolaunch.js +3 -0
  4. package/dist/autolaunch/autolaunch.js.LICENSE.txt +16 -0
  5. package/dist/autolaunch/autolaunch.js.map +1 -0
  6. package/dist/cjs/app-options.d.ts +118 -0
  7. package/dist/cjs/app-options.js +6 -0
  8. package/dist/cjs/app-options.js.map +1 -0
  9. package/dist/cjs/client.d.ts +165 -0
  10. package/dist/cjs/client.js +1391 -0
  11. package/dist/cjs/client.js.map +1 -0
  12. package/dist/cjs/cloud-file-manager.d.ts +16 -0
  13. package/dist/cjs/cloud-file-manager.js +79 -0
  14. package/dist/cjs/cloud-file-manager.js.map +1 -0
  15. package/dist/cjs/create-react-factory.d.ts +3 -0
  16. package/dist/cjs/create-react-factory.js +14 -0
  17. package/dist/cjs/create-react-factory.js.map +1 -0
  18. package/dist/cjs/index.d.ts +4 -0
  19. package/dist/cjs/index.js +21 -0
  20. package/dist/cjs/index.js.map +1 -0
  21. package/dist/cjs/lib/file-saver.d.ts +2 -0
  22. package/dist/cjs/lib/file-saver.js +164 -0
  23. package/dist/cjs/lib/file-saver.js.map +1 -0
  24. package/dist/cjs/providers/document-store-provider.d.ts +48 -0
  25. package/dist/cjs/providers/document-store-provider.js +541 -0
  26. package/dist/cjs/providers/document-store-provider.js.map +1 -0
  27. package/dist/cjs/providers/document-store-share-provider.d.ts +17 -0
  28. package/dist/cjs/providers/document-store-share-provider.js +126 -0
  29. package/dist/cjs/providers/document-store-share-provider.js.map +1 -0
  30. package/dist/cjs/providers/document-store-url.d.ts +32 -0
  31. package/dist/cjs/providers/document-store-url.js +75 -0
  32. package/dist/cjs/providers/document-store-url.js.map +1 -0
  33. package/dist/cjs/providers/google-drive-provider.d.ts +75 -0
  34. package/dist/cjs/providers/google-drive-provider.js +684 -0
  35. package/dist/cjs/providers/google-drive-provider.js.map +1 -0
  36. package/dist/cjs/providers/interactive-api-provider.d.ts +55 -0
  37. package/dist/cjs/providers/interactive-api-provider.js +382 -0
  38. package/dist/cjs/providers/interactive-api-provider.js.map +1 -0
  39. package/dist/cjs/providers/lara-provider.d.ts +47 -0
  40. package/dist/cjs/providers/lara-provider.js +547 -0
  41. package/dist/cjs/providers/lara-provider.js.map +1 -0
  42. package/dist/cjs/providers/legacy-google-drive-provider.d.ts +74 -0
  43. package/dist/cjs/providers/legacy-google-drive-provider.js +600 -0
  44. package/dist/cjs/providers/legacy-google-drive-provider.js.map +1 -0
  45. package/dist/cjs/providers/local-file-provider.d.ts +16 -0
  46. package/dist/cjs/providers/local-file-provider.js +65 -0
  47. package/dist/cjs/providers/local-file-provider.js.map +1 -0
  48. package/dist/cjs/providers/localstorage-provider.d.ts +20 -0
  49. package/dist/cjs/providers/localstorage-provider.js +122 -0
  50. package/dist/cjs/providers/localstorage-provider.js.map +1 -0
  51. package/dist/cjs/providers/patchable-content.d.ts +16 -0
  52. package/dist/cjs/providers/patchable-content.js +65 -0
  53. package/dist/cjs/providers/patchable-content.js.map +1 -0
  54. package/dist/cjs/providers/post-message-provider.d.ts +12 -0
  55. package/dist/cjs/providers/post-message-provider.js +39 -0
  56. package/dist/cjs/providers/post-message-provider.js.map +1 -0
  57. package/dist/cjs/providers/provider-interface.d.ts +168 -0
  58. package/dist/cjs/providers/provider-interface.js +399 -0
  59. package/dist/cjs/providers/provider-interface.js.map +1 -0
  60. package/dist/cjs/providers/readonly-provider.d.ts +22 -0
  61. package/dist/cjs/providers/readonly-provider.js +303 -0
  62. package/dist/cjs/providers/readonly-provider.js.map +1 -0
  63. package/dist/cjs/providers/s3-provider.d.ts +14 -0
  64. package/dist/cjs/providers/s3-provider.js +109 -0
  65. package/dist/cjs/providers/s3-provider.js.map +1 -0
  66. package/dist/cjs/providers/s3-share-provider.d.ts +18 -0
  67. package/dist/cjs/providers/s3-share-provider.js +124 -0
  68. package/dist/cjs/providers/s3-share-provider.js.map +1 -0
  69. package/dist/cjs/providers/share-provider-interface.d.ts +15 -0
  70. package/dist/cjs/providers/share-provider-interface.js +3 -0
  71. package/dist/cjs/providers/share-provider-interface.js.map +1 -0
  72. package/dist/cjs/providers/test-provider.d.ts +26 -0
  73. package/dist/cjs/providers/test-provider.js +73 -0
  74. package/dist/cjs/providers/test-provider.js.map +1 -0
  75. package/dist/cjs/providers/url-provider.d.ts +13 -0
  76. package/dist/cjs/providers/url-provider.js +58 -0
  77. package/dist/cjs/providers/url-provider.js.map +1 -0
  78. package/dist/cjs/ui.d.ts +51 -0
  79. package/dist/cjs/ui.js +216 -0
  80. package/dist/cjs/ui.js.map +1 -0
  81. package/dist/cjs/utils/config.d.ts +6 -0
  82. package/dist/cjs/utils/config.js +10 -0
  83. package/dist/cjs/utils/config.js.map +1 -0
  84. package/dist/cjs/utils/get-hash-param.d.ts +1 -0
  85. package/dist/cjs/utils/get-hash-param.js +24 -0
  86. package/dist/cjs/utils/get-hash-param.js.map +1 -0
  87. package/dist/cjs/utils/get-query-param.d.ts +1 -0
  88. package/dist/cjs/utils/get-query-param.js +23 -0
  89. package/dist/cjs/utils/get-query-param.js.map +1 -0
  90. package/dist/cjs/utils/is-array.d.ts +2 -0
  91. package/dist/cjs/utils/is-array.js +4 -0
  92. package/dist/cjs/utils/is-array.js.map +1 -0
  93. package/dist/cjs/utils/is-empty-object.d.ts +1 -0
  94. package/dist/cjs/utils/is-empty-object.js +7 -0
  95. package/dist/cjs/utils/is-empty-object.js.map +1 -0
  96. package/dist/cjs/utils/is-string.d.ts +2 -0
  97. package/dist/cjs/utils/is-string.js +4 -0
  98. package/dist/cjs/utils/is-string.js.map +1 -0
  99. package/dist/cjs/utils/lang/de.json +156 -0
  100. package/dist/cjs/utils/lang/el.json +156 -0
  101. package/dist/cjs/utils/lang/en-US.json +156 -0
  102. package/dist/cjs/utils/lang/es.json +156 -0
  103. package/dist/cjs/utils/lang/fa.json +156 -0
  104. package/dist/cjs/utils/lang/he.json +156 -0
  105. package/dist/cjs/utils/lang/ja.json +156 -0
  106. package/dist/cjs/utils/lang/ko.json +156 -0
  107. package/dist/cjs/utils/lang/nb.json +156 -0
  108. package/dist/cjs/utils/lang/nn.json +156 -0
  109. package/dist/cjs/utils/lang/pl.json +156 -0
  110. package/dist/cjs/utils/lang/pt-BR.json +156 -0
  111. package/dist/cjs/utils/lang/th.json +156 -0
  112. package/dist/cjs/utils/lang/tr.json +156 -0
  113. package/dist/cjs/utils/lang/zh-Hans.json +156 -0
  114. package/dist/cjs/utils/lang/zh-TW.json +156 -0
  115. package/dist/cjs/utils/report-error.d.ts +1 -0
  116. package/dist/cjs/utils/report-error.js +10 -0
  117. package/dist/cjs/utils/report-error.js.map +1 -0
  118. package/dist/cjs/utils/s3-share-provider-token-service-helper.d.ts +21 -0
  119. package/dist/cjs/utils/s3-share-provider-token-service-helper.js +97 -0
  120. package/dist/cjs/utils/s3-share-provider-token-service-helper.js.map +1 -0
  121. package/dist/cjs/utils/translate.d.ts +3 -0
  122. package/dist/cjs/utils/translate.js +108 -0
  123. package/dist/cjs/utils/translate.js.map +1 -0
  124. package/dist/cjs/utils/url-params.d.ts +2 -0
  125. package/dist/cjs/utils/url-params.js +16 -0
  126. package/dist/cjs/utils/url-params.js.map +1 -0
  127. package/dist/cjs/views/alert-dialog-view.d.ts +3 -0
  128. package/dist/cjs/views/alert-dialog-view.js +32 -0
  129. package/dist/cjs/views/alert-dialog-view.js.map +1 -0
  130. package/dist/cjs/views/app-view.d.ts +49 -0
  131. package/dist/cjs/views/app-view.js +272 -0
  132. package/dist/cjs/views/app-view.js.map +1 -0
  133. package/dist/cjs/views/authorize-mixin.d.ts +10 -0
  134. package/dist/cjs/views/authorize-mixin.js +69 -0
  135. package/dist/cjs/views/authorize-mixin.js.map +1 -0
  136. package/dist/cjs/views/blocking-modal-view.d.ts +3 -0
  137. package/dist/cjs/views/blocking-modal-view.js +32 -0
  138. package/dist/cjs/views/blocking-modal-view.js.map +1 -0
  139. package/dist/cjs/views/confirm-dialog-view.d.ts +3 -0
  140. package/dist/cjs/views/confirm-dialog-view.js +40 -0
  141. package/dist/cjs/views/confirm-dialog-view.js.map +1 -0
  142. package/dist/cjs/views/download-dialog-view.d.ts +3 -0
  143. package/dist/cjs/views/download-dialog-view.js +79 -0
  144. package/dist/cjs/views/download-dialog-view.js.map +1 -0
  145. package/dist/cjs/views/dropdown-anchors.d.ts +4 -0
  146. package/dist/cjs/views/dropdown-anchors.js +17 -0
  147. package/dist/cjs/views/dropdown-anchors.js.map +1 -0
  148. package/dist/cjs/views/dropdown-view.d.ts +3 -0
  149. package/dist/cjs/views/dropdown-view.js +152 -0
  150. package/dist/cjs/views/dropdown-view.js.map +1 -0
  151. package/dist/cjs/views/file-dialog-tab-view.d.ts +3 -0
  152. package/dist/cjs/views/file-dialog-tab-view.js +405 -0
  153. package/dist/cjs/views/file-dialog-tab-view.js.map +1 -0
  154. package/dist/cjs/views/icons/spin.d.ts +5 -0
  155. package/dist/cjs/views/icons/spin.js +46 -0
  156. package/dist/cjs/views/icons/spin.js.map +1 -0
  157. package/dist/cjs/views/import-tabbed-dialog-view.d.ts +3 -0
  158. package/dist/cjs/views/import-tabbed-dialog-view.js +78 -0
  159. package/dist/cjs/views/import-tabbed-dialog-view.js.map +1 -0
  160. package/dist/cjs/views/local-file-tab-list-view.d.ts +3 -0
  161. package/dist/cjs/views/local-file-tab-list-view.js +84 -0
  162. package/dist/cjs/views/local-file-tab-list-view.js.map +1 -0
  163. package/dist/cjs/views/local-file-tab-save-view.d.ts +3 -0
  164. package/dist/cjs/views/local-file-tab-save-view.js +157 -0
  165. package/dist/cjs/views/local-file-tab-save-view.js.map +1 -0
  166. package/dist/cjs/views/menu-bar-view.d.ts +3 -0
  167. package/dist/cjs/views/menu-bar-view.js +201 -0
  168. package/dist/cjs/views/menu-bar-view.js.map +1 -0
  169. package/dist/cjs/views/modal-dialog-view.d.ts +8 -0
  170. package/dist/cjs/views/modal-dialog-view.js +18 -0
  171. package/dist/cjs/views/modal-dialog-view.js.map +1 -0
  172. package/dist/cjs/views/modal-tabbed-dialog-view.d.ts +3 -0
  173. package/dist/cjs/views/modal-tabbed-dialog-view.js +25 -0
  174. package/dist/cjs/views/modal-tabbed-dialog-view.js.map +1 -0
  175. package/dist/cjs/views/modal-view.d.ts +36 -0
  176. package/dist/cjs/views/modal-view.js +70 -0
  177. package/dist/cjs/views/modal-view.js.map +1 -0
  178. package/dist/cjs/views/provider-tabbed-dialog-view.d.ts +3 -0
  179. package/dist/cjs/views/provider-tabbed-dialog-view.js +67 -0
  180. package/dist/cjs/views/provider-tabbed-dialog-view.js.map +1 -0
  181. package/dist/cjs/views/rename-dialog-view.d.ts +3 -0
  182. package/dist/cjs/views/rename-dialog-view.js +60 -0
  183. package/dist/cjs/views/rename-dialog-view.js.map +1 -0
  184. package/dist/cjs/views/select-interactive-state-dialog-view.d.ts +22 -0
  185. package/dist/cjs/views/select-interactive-state-dialog-view.js +93 -0
  186. package/dist/cjs/views/select-interactive-state-dialog-view.js.map +1 -0
  187. package/dist/cjs/views/select-provider-dialog-tab-view.d.ts +2 -0
  188. package/dist/cjs/views/select-provider-dialog-tab-view.js +16 -0
  189. package/dist/cjs/views/select-provider-dialog-tab-view.js.map +1 -0
  190. package/dist/cjs/views/share-dialog-status-view.d.ts +9 -0
  191. package/dist/cjs/views/share-dialog-status-view.js +24 -0
  192. package/dist/cjs/views/share-dialog-status-view.js.map +1 -0
  193. package/dist/cjs/views/share-dialog-tabs-view.d.ts +45 -0
  194. package/dist/cjs/views/share-dialog-tabs-view.js +93 -0
  195. package/dist/cjs/views/share-dialog-tabs-view.js.map +1 -0
  196. package/dist/cjs/views/share-dialog-view.d.ts +50 -0
  197. package/dist/cjs/views/share-dialog-view.js +220 -0
  198. package/dist/cjs/views/share-dialog-view.js.map +1 -0
  199. package/dist/cjs/views/share-loading-view.d.ts +2 -0
  200. package/dist/cjs/views/share-loading-view.js +16 -0
  201. package/dist/cjs/views/share-loading-view.js.map +1 -0
  202. package/dist/cjs/views/tabbed-panel-view.d.ts +3 -0
  203. package/dist/cjs/views/tabbed-panel-view.js +79 -0
  204. package/dist/cjs/views/tabbed-panel-view.js.map +1 -0
  205. package/dist/cjs/views/url-tab-view.d.ts +3 -0
  206. package/dist/cjs/views/url-tab-view.js +67 -0
  207. package/dist/cjs/views/url-tab-view.js.map +1 -0
  208. package/dist/css/app.css +6 -0
  209. package/dist/css/app.css.map +1 -0
  210. package/dist/esm/app-options.d.ts +118 -0
  211. package/dist/esm/app-options.js +2 -0
  212. package/dist/esm/app-options.js.map +1 -0
  213. package/dist/esm/client.d.ts +165 -0
  214. package/dist/esm/client.js +1384 -0
  215. package/dist/esm/client.js.map +1 -0
  216. package/dist/esm/cloud-file-manager.d.ts +16 -0
  217. package/dist/esm/cloud-file-manager.js +72 -0
  218. package/dist/esm/cloud-file-manager.js.map +1 -0
  219. package/dist/esm/create-react-factory.d.ts +3 -0
  220. package/dist/esm/create-react-factory.js +6 -0
  221. package/dist/esm/create-react-factory.js.map +1 -0
  222. package/dist/esm/index.d.ts +4 -0
  223. package/dist/esm/index.js +5 -0
  224. package/dist/esm/index.js.map +1 -0
  225. package/dist/esm/lib/file-saver.d.ts +2 -0
  226. package/dist/esm/lib/file-saver.js +164 -0
  227. package/dist/esm/lib/file-saver.js.map +1 -0
  228. package/dist/esm/providers/document-store-provider.d.ts +48 -0
  229. package/dist/esm/providers/document-store-provider.js +536 -0
  230. package/dist/esm/providers/document-store-provider.js.map +1 -0
  231. package/dist/esm/providers/document-store-share-provider.d.ts +17 -0
  232. package/dist/esm/providers/document-store-share-provider.js +121 -0
  233. package/dist/esm/providers/document-store-share-provider.js.map +1 -0
  234. package/dist/esm/providers/document-store-url.d.ts +32 -0
  235. package/dist/esm/providers/document-store-url.js +73 -0
  236. package/dist/esm/providers/document-store-url.js.map +1 -0
  237. package/dist/esm/providers/google-drive-provider.d.ts +75 -0
  238. package/dist/esm/providers/google-drive-provider.js +656 -0
  239. package/dist/esm/providers/google-drive-provider.js.map +1 -0
  240. package/dist/esm/providers/interactive-api-provider.d.ts +55 -0
  241. package/dist/esm/providers/interactive-api-provider.js +374 -0
  242. package/dist/esm/providers/interactive-api-provider.js.map +1 -0
  243. package/dist/esm/providers/lara-provider.d.ts +47 -0
  244. package/dist/esm/providers/lara-provider.js +542 -0
  245. package/dist/esm/providers/lara-provider.js.map +1 -0
  246. package/dist/esm/providers/legacy-google-drive-provider.d.ts +74 -0
  247. package/dist/esm/providers/legacy-google-drive-provider.js +595 -0
  248. package/dist/esm/providers/legacy-google-drive-provider.js.map +1 -0
  249. package/dist/esm/providers/local-file-provider.d.ts +16 -0
  250. package/dist/esm/providers/local-file-provider.js +60 -0
  251. package/dist/esm/providers/local-file-provider.js.map +1 -0
  252. package/dist/esm/providers/localstorage-provider.d.ts +20 -0
  253. package/dist/esm/providers/localstorage-provider.js +117 -0
  254. package/dist/esm/providers/localstorage-provider.js.map +1 -0
  255. package/dist/esm/providers/patchable-content.d.ts +16 -0
  256. package/dist/esm/providers/patchable-content.js +60 -0
  257. package/dist/esm/providers/patchable-content.js.map +1 -0
  258. package/dist/esm/providers/post-message-provider.d.ts +12 -0
  259. package/dist/esm/providers/post-message-provider.js +34 -0
  260. package/dist/esm/providers/post-message-provider.js.map +1 -0
  261. package/dist/esm/providers/provider-interface.d.ts +168 -0
  262. package/dist/esm/providers/provider-interface.js +389 -0
  263. package/dist/esm/providers/provider-interface.js.map +1 -0
  264. package/dist/esm/providers/readonly-provider.d.ts +22 -0
  265. package/dist/esm/providers/readonly-provider.js +298 -0
  266. package/dist/esm/providers/readonly-provider.js.map +1 -0
  267. package/dist/esm/providers/s3-provider.d.ts +14 -0
  268. package/dist/esm/providers/s3-provider.js +104 -0
  269. package/dist/esm/providers/s3-provider.js.map +1 -0
  270. package/dist/esm/providers/s3-share-provider.d.ts +18 -0
  271. package/dist/esm/providers/s3-share-provider.js +122 -0
  272. package/dist/esm/providers/s3-share-provider.js.map +1 -0
  273. package/dist/esm/providers/share-provider-interface.d.ts +15 -0
  274. package/dist/esm/providers/share-provider-interface.js +2 -0
  275. package/dist/esm/providers/share-provider-interface.js.map +1 -0
  276. package/dist/esm/providers/test-provider.d.ts +26 -0
  277. package/dist/esm/providers/test-provider.js +71 -0
  278. package/dist/esm/providers/test-provider.js.map +1 -0
  279. package/dist/esm/providers/url-provider.d.ts +13 -0
  280. package/dist/esm/providers/url-provider.js +53 -0
  281. package/dist/esm/providers/url-provider.js.map +1 -0
  282. package/dist/esm/ui.d.ts +51 -0
  283. package/dist/esm/ui.js +208 -0
  284. package/dist/esm/ui.js.map +1 -0
  285. package/dist/esm/utils/config.d.ts +6 -0
  286. package/dist/esm/utils/config.js +6 -0
  287. package/dist/esm/utils/config.js.map +1 -0
  288. package/dist/esm/utils/get-hash-param.d.ts +1 -0
  289. package/dist/esm/utils/get-hash-param.js +21 -0
  290. package/dist/esm/utils/get-hash-param.js.map +1 -0
  291. package/dist/esm/utils/get-query-param.d.ts +1 -0
  292. package/dist/esm/utils/get-query-param.js +20 -0
  293. package/dist/esm/utils/get-query-param.js.map +1 -0
  294. package/dist/esm/utils/is-array.d.ts +2 -0
  295. package/dist/esm/utils/is-array.js +2 -0
  296. package/dist/esm/utils/is-array.js.map +1 -0
  297. package/dist/esm/utils/is-empty-object.d.ts +1 -0
  298. package/dist/esm/utils/is-empty-object.js +3 -0
  299. package/dist/esm/utils/is-empty-object.js.map +1 -0
  300. package/dist/esm/utils/is-string.d.ts +2 -0
  301. package/dist/esm/utils/is-string.js +2 -0
  302. package/dist/esm/utils/is-string.js.map +1 -0
  303. package/dist/esm/utils/lang/de.json +156 -0
  304. package/dist/esm/utils/lang/el.json +156 -0
  305. package/dist/esm/utils/lang/en-US.json +156 -0
  306. package/dist/esm/utils/lang/es.json +156 -0
  307. package/dist/esm/utils/lang/fa.json +156 -0
  308. package/dist/esm/utils/lang/he.json +156 -0
  309. package/dist/esm/utils/lang/ja.json +156 -0
  310. package/dist/esm/utils/lang/ko.json +156 -0
  311. package/dist/esm/utils/lang/nb.json +156 -0
  312. package/dist/esm/utils/lang/nn.json +156 -0
  313. package/dist/esm/utils/lang/pl.json +156 -0
  314. package/dist/esm/utils/lang/pt-BR.json +156 -0
  315. package/dist/esm/utils/lang/th.json +156 -0
  316. package/dist/esm/utils/lang/tr.json +156 -0
  317. package/dist/esm/utils/lang/zh-Hans.json +156 -0
  318. package/dist/esm/utils/lang/zh-TW.json +156 -0
  319. package/dist/esm/utils/report-error.d.ts +1 -0
  320. package/dist/esm/utils/report-error.js +6 -0
  321. package/dist/esm/utils/report-error.js.map +1 -0
  322. package/dist/esm/utils/s3-share-provider-token-service-helper.d.ts +21 -0
  323. package/dist/esm/utils/s3-share-provider-token-service-helper.js +87 -0
  324. package/dist/esm/utils/s3-share-provider-token-service-helper.js.map +1 -0
  325. package/dist/esm/utils/translate.d.ts +3 -0
  326. package/dist/esm/utils/translate.js +101 -0
  327. package/dist/esm/utils/translate.js.map +1 -0
  328. package/dist/esm/utils/url-params.d.ts +2 -0
  329. package/dist/esm/utils/url-params.js +14 -0
  330. package/dist/esm/utils/url-params.js.map +1 -0
  331. package/dist/esm/views/alert-dialog-view.d.ts +3 -0
  332. package/dist/esm/views/alert-dialog-view.js +27 -0
  333. package/dist/esm/views/alert-dialog-view.js.map +1 -0
  334. package/dist/esm/views/app-view.d.ts +49 -0
  335. package/dist/esm/views/app-view.js +267 -0
  336. package/dist/esm/views/app-view.js.map +1 -0
  337. package/dist/esm/views/authorize-mixin.d.ts +10 -0
  338. package/dist/esm/views/authorize-mixin.js +67 -0
  339. package/dist/esm/views/authorize-mixin.js.map +1 -0
  340. package/dist/esm/views/blocking-modal-view.d.ts +3 -0
  341. package/dist/esm/views/blocking-modal-view.js +27 -0
  342. package/dist/esm/views/blocking-modal-view.js.map +1 -0
  343. package/dist/esm/views/confirm-dialog-view.d.ts +3 -0
  344. package/dist/esm/views/confirm-dialog-view.js +35 -0
  345. package/dist/esm/views/confirm-dialog-view.js.map +1 -0
  346. package/dist/esm/views/download-dialog-view.d.ts +3 -0
  347. package/dist/esm/views/download-dialog-view.js +74 -0
  348. package/dist/esm/views/download-dialog-view.js.map +1 -0
  349. package/dist/esm/views/dropdown-anchors.d.ts +4 -0
  350. package/dist/esm/views/dropdown-anchors.js +10 -0
  351. package/dist/esm/views/dropdown-anchors.js.map +1 -0
  352. package/dist/esm/views/dropdown-view.d.ts +3 -0
  353. package/dist/esm/views/dropdown-view.js +147 -0
  354. package/dist/esm/views/dropdown-view.js.map +1 -0
  355. package/dist/esm/views/file-dialog-tab-view.d.ts +3 -0
  356. package/dist/esm/views/file-dialog-tab-view.js +400 -0
  357. package/dist/esm/views/file-dialog-tab-view.js.map +1 -0
  358. package/dist/esm/views/icons/spin.d.ts +5 -0
  359. package/dist/esm/views/icons/spin.js +39 -0
  360. package/dist/esm/views/icons/spin.js.map +1 -0
  361. package/dist/esm/views/import-tabbed-dialog-view.d.ts +3 -0
  362. package/dist/esm/views/import-tabbed-dialog-view.js +73 -0
  363. package/dist/esm/views/import-tabbed-dialog-view.js.map +1 -0
  364. package/dist/esm/views/local-file-tab-list-view.d.ts +3 -0
  365. package/dist/esm/views/local-file-tab-list-view.js +79 -0
  366. package/dist/esm/views/local-file-tab-list-view.js.map +1 -0
  367. package/dist/esm/views/local-file-tab-save-view.d.ts +3 -0
  368. package/dist/esm/views/local-file-tab-save-view.js +152 -0
  369. package/dist/esm/views/local-file-tab-save-view.js.map +1 -0
  370. package/dist/esm/views/menu-bar-view.d.ts +3 -0
  371. package/dist/esm/views/menu-bar-view.js +196 -0
  372. package/dist/esm/views/menu-bar-view.js.map +1 -0
  373. package/dist/esm/views/modal-dialog-view.d.ts +8 -0
  374. package/dist/esm/views/modal-dialog-view.js +13 -0
  375. package/dist/esm/views/modal-dialog-view.js.map +1 -0
  376. package/dist/esm/views/modal-tabbed-dialog-view.d.ts +3 -0
  377. package/dist/esm/views/modal-tabbed-dialog-view.js +20 -0
  378. package/dist/esm/views/modal-tabbed-dialog-view.js.map +1 -0
  379. package/dist/esm/views/modal-view.d.ts +36 -0
  380. package/dist/esm/views/modal-view.js +64 -0
  381. package/dist/esm/views/modal-view.js.map +1 -0
  382. package/dist/esm/views/provider-tabbed-dialog-view.d.ts +3 -0
  383. package/dist/esm/views/provider-tabbed-dialog-view.js +62 -0
  384. package/dist/esm/views/provider-tabbed-dialog-view.js.map +1 -0
  385. package/dist/esm/views/rename-dialog-view.d.ts +3 -0
  386. package/dist/esm/views/rename-dialog-view.js +55 -0
  387. package/dist/esm/views/rename-dialog-view.js.map +1 -0
  388. package/dist/esm/views/select-interactive-state-dialog-view.d.ts +22 -0
  389. package/dist/esm/views/select-interactive-state-dialog-view.js +87 -0
  390. package/dist/esm/views/select-interactive-state-dialog-view.js.map +1 -0
  391. package/dist/esm/views/select-provider-dialog-tab-view.d.ts +2 -0
  392. package/dist/esm/views/select-provider-dialog-tab-view.js +11 -0
  393. package/dist/esm/views/select-provider-dialog-tab-view.js.map +1 -0
  394. package/dist/esm/views/share-dialog-status-view.d.ts +9 -0
  395. package/dist/esm/views/share-dialog-status-view.js +17 -0
  396. package/dist/esm/views/share-dialog-status-view.js.map +1 -0
  397. package/dist/esm/views/share-dialog-tabs-view.d.ts +45 -0
  398. package/dist/esm/views/share-dialog-tabs-view.js +83 -0
  399. package/dist/esm/views/share-dialog-tabs-view.js.map +1 -0
  400. package/dist/esm/views/share-dialog-view.d.ts +50 -0
  401. package/dist/esm/views/share-dialog-view.js +214 -0
  402. package/dist/esm/views/share-dialog-view.js.map +1 -0
  403. package/dist/esm/views/share-loading-view.d.ts +2 -0
  404. package/dist/esm/views/share-loading-view.js +9 -0
  405. package/dist/esm/views/share-loading-view.js.map +1 -0
  406. package/dist/esm/views/tabbed-panel-view.d.ts +3 -0
  407. package/dist/esm/views/tabbed-panel-view.js +74 -0
  408. package/dist/esm/views/tabbed-panel-view.js.map +1 -0
  409. package/dist/esm/views/url-tab-view.d.ts +3 -0
  410. package/dist/esm/views/url-tab-view.js +62 -0
  411. package/dist/esm/views/url-tab-view.js.map +1 -0
  412. package/dist/examples/all-providers-react-18.html +74 -0
  413. package/dist/examples/all-providers.html +61 -0
  414. package/dist/examples/auto-saving.html +50 -0
  415. package/dist/examples/client-logging-provider.html +107 -0
  416. package/dist/examples/close-file.html +63 -0
  417. package/dist/examples/deprecate-phase-one.html +60 -0
  418. package/dist/examples/deprecate-phase-three.html +60 -0
  419. package/dist/examples/deprecate-phase-two.html +60 -0
  420. package/dist/examples/enable-demo-extension.html +52 -0
  421. package/dist/examples/enable-lara-sharing.html +51 -0
  422. package/dist/examples/example-app/index.html +133 -0
  423. package/dist/examples/hide-hamburger-2.html +55 -0
  424. package/dist/examples/hide-hamburger.html +34 -0
  425. package/dist/examples/index.html +40 -0
  426. package/dist/examples/interactive-api-provider.html +27 -0
  427. package/dist/examples/language-menu.html +86 -0
  428. package/dist/examples/lara-provider.html +52 -0
  429. package/dist/examples/load-url-query-param.html +54 -0
  430. package/dist/examples/menu-madness.html +67 -0
  431. package/dist/examples/new-does-not-use-new-tab.html +47 -0
  432. package/dist/examples/no-flag-language-menu.html +86 -0
  433. package/dist/examples/no-frame.html +130 -0
  434. package/dist/examples/no-shared-google-drives.html +47 -0
  435. package/dist/examples/read-only-with-folders.html +120 -0
  436. package/dist/examples/show-close-confirm.html +47 -0
  437. package/dist/examples/splash-screen.html +70 -0
  438. package/dist/examples/view-no-frame-nowrap.html +167 -0
  439. package/dist/examples/view-no-frame.html +129 -0
  440. package/dist/favicon.ico +0 -0
  441. package/dist/fonts/CodapIvy.eot +0 -0
  442. package/dist/fonts/CodapIvy.svg +61 -0
  443. package/dist/fonts/CodapIvy.ttf +0 -0
  444. package/dist/fonts/CodapIvy.woff +0 -0
  445. package/dist/fonts/Montserrat-Bold.otf +0 -0
  446. package/dist/fonts/Montserrat-Regular.otf +0 -0
  447. package/dist/fonts/MuseoSans_500.otf +0 -0
  448. package/dist/fonts/MuseoSans_500_Italic.otf +0 -0
  449. package/dist/fonts/icon-menu.eot +0 -0
  450. package/dist/fonts/icon-menu.svg +24 -0
  451. package/dist/fonts/icon-menu.ttf +0 -0
  452. package/dist/fonts/icon-menu.woff +0 -0
  453. package/dist/img/bb-chrome/arrow-collapse.svg +8 -0
  454. package/dist/img/bb-chrome/arrow-expand.svg +8 -0
  455. package/dist/img/bb-chrome/bg-horiz.png +0 -0
  456. package/dist/img/bb-chrome/btn-nodeLink.svg +298 -0
  457. package/dist/img/bb-chrome/chevron-down.png +0 -0
  458. package/dist/img/bb-chrome/chevron-left.png +0 -0
  459. package/dist/img/bb-chrome/chevron-right.png +0 -0
  460. package/dist/img/bb-chrome/chevron-up.png +0 -0
  461. package/dist/img/bb-chrome/global-nav-bg.png +0 -0
  462. package/dist/img/bb-chrome/icon-checkmark.svg +10 -0
  463. package/dist/img/bb-chrome/slider.svg +286 -0
  464. package/dist/img/bb-chrome/spin.svg +54 -0
  465. package/dist/img/concord-logo.png +0 -0
  466. package/dist/img/debug/grid.jpg +0 -0
  467. package/dist/img/document-store-16.png +0 -0
  468. package/dist/img/earth.svg +48 -0
  469. package/dist/img/flags.png +0 -0
  470. package/dist/img/fullscreen-dark.svg +22 -0
  471. package/dist/img/fullscreen-exit-dark.svg +22 -0
  472. package/dist/img/fullscreen-exit.svg +22 -0
  473. package/dist/img/fullscreen.svg +22 -0
  474. package/dist/img/google-drive-16.png +0 -0
  475. package/dist/img/google-drive-logo.png +0 -0
  476. package/dist/img/loading.gif +0 -0
  477. package/dist/index.html +21 -0
  478. package/dist/js/app.js +3 -0
  479. package/dist/js/app.js.LICENSE.txt +287 -0
  480. package/dist/js/app.js.map +1 -0
  481. package/dist/js/globals.js +3 -0
  482. package/dist/js/globals.js.LICENSE.txt +52 -0
  483. package/dist/js/globals.js.map +1 -0
  484. package/license.md +21 -0
  485. package/package.json +127 -0
  486. package/readme.md +275 -0
@@ -0,0 +1,1384 @@
1
+ // TODO: This file was created by bulk-decaffeinate.
2
+ // Sanity-check the conversion and remove this comment.
3
+ /*
4
+ * decaffeinate suggestions:
5
+ * DS102: Remove unnecessary code created because of implicit returns
6
+ * DS207: Consider shorter variations of null checks
7
+ * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
8
+ */
9
+ import $ from 'jquery';
10
+ import _ from 'lodash';
11
+ import mime from 'mime';
12
+ import tr from './utils/translate';
13
+ import isString from './utils/is-string';
14
+ import base64Array from 'base64-js'; // https://github.com/beatgammit/base64-js
15
+ import getQueryParam from './utils/get-query-param';
16
+ import { isCustomClientProvider } from './app-options';
17
+ import { CloudFileManagerUI } from './ui';
18
+ import LocalStorageProvider from './providers/localstorage-provider';
19
+ import ReadOnlyProvider from './providers/readonly-provider';
20
+ import GoogleDriveProvider from './providers/google-drive-provider';
21
+ import InteractiveApiProvider from './providers/interactive-api-provider';
22
+ import LaraProvider from './providers/lara-provider';
23
+ import DocumentStoreProvider from './providers/document-store-provider';
24
+ import S3ShareProvider from './providers/s3-share-provider';
25
+ import S3Provider from './providers/s3-provider';
26
+ import LocalFileProvider from './providers/local-file-provider';
27
+ import PostMessageProvider from './providers/post-message-provider';
28
+ import URLProvider from './providers/url-provider';
29
+ import TestProvider from './providers/test-provider';
30
+ import { CloudContent, cloudContentFactory, CloudMetadata, ECapabilities, ProviderInterface } from './providers/provider-interface';
31
+ import { reportError } from "./utils/report-error";
32
+ import { setOnUnload } from '@concord-consortium/lara-interactive-api';
33
+ let CLOUDFILEMANAGER_EVENT_ID = 0;
34
+ const CLOUDFILEMANAGER_EVENTS = {};
35
+ class CloudFileManagerClientEvent {
36
+ constructor(type, data, callback = null, state) {
37
+ this.type = type;
38
+ if (data == null) {
39
+ data = {};
40
+ }
41
+ this.data = data;
42
+ this.callback = callback;
43
+ if (state == null) {
44
+ state = {};
45
+ }
46
+ this.state = state;
47
+ CLOUDFILEMANAGER_EVENT_ID++;
48
+ this.id = CLOUDFILEMANAGER_EVENT_ID;
49
+ }
50
+ postMessage(iframe) {
51
+ if (this.callback) {
52
+ CLOUDFILEMANAGER_EVENTS[this.id] = this;
53
+ }
54
+ // remove client from data to avoid structured clone error in postMessage
55
+ const eventData = _.clone(this.data);
56
+ delete eventData.client;
57
+ const message = { type: "cfm::event", eventId: this.id, eventType: this.type, eventData };
58
+ return iframe.postMessage(message, "*");
59
+ }
60
+ }
61
+ class CloudFileManagerClient {
62
+ constructor(options) {
63
+ this.shouldAutoSave = this.shouldAutoSave.bind(this);
64
+ this.state = { availableProviders: [] };
65
+ this._listeners = [];
66
+ this._resetState();
67
+ this._ui = new CloudFileManagerUI(this);
68
+ this.providers = {};
69
+ this.urlProvider = new URLProvider();
70
+ this.onUnload = this.onUnload.bind(this);
71
+ setOnUnload(this.onUnload);
72
+ this.connectedPromise = new Promise((resolve, reject) => {
73
+ this.connectedPromiseResolver = {
74
+ resolve: () => {
75
+ resolve();
76
+ this.connectedPromiseResolver = null;
77
+ },
78
+ reject: () => {
79
+ reject();
80
+ this.connectedPromiseResolver = null;
81
+ }
82
+ };
83
+ });
84
+ }
85
+ setAppOptions(appOptions) {
86
+ var _a, _b, _c, _d;
87
+ let providerName;
88
+ let Provider;
89
+ if (appOptions == null) {
90
+ appOptions = {};
91
+ }
92
+ this.appOptions = appOptions;
93
+ if (this.appOptions.wrapFileContent == null) {
94
+ this.appOptions.wrapFileContent = true;
95
+ }
96
+ CloudContent.wrapFileContent = this.appOptions.wrapFileContent;
97
+ if (this.appOptions.isClientContent)
98
+ cloudContentFactory.isClientContent = this.appOptions.isClientContent;
99
+ const allProviders = {};
100
+ // Determine the available providers. Note that order in the list can
101
+ // be significant in provider searches (e.g. @autoProvider).
102
+ const providerList = [
103
+ LocalStorageProvider,
104
+ ReadOnlyProvider,
105
+ GoogleDriveProvider,
106
+ LaraProvider,
107
+ InteractiveApiProvider,
108
+ DocumentStoreProvider,
109
+ LocalFileProvider,
110
+ PostMessageProvider,
111
+ S3Provider,
112
+ TestProvider
113
+ ];
114
+ for (Provider of providerList) {
115
+ if (Provider.Available()) {
116
+ allProviders[Provider.Name] = Provider;
117
+ }
118
+ }
119
+ // default to all providers if none specified
120
+ if (!this.appOptions.providers) {
121
+ this.appOptions.providers = [];
122
+ for (providerName of Object.keys(allProviders || {})) {
123
+ appOptions.providers.push(providerName);
124
+ }
125
+ }
126
+ // preset the extension if Available
127
+ CloudMetadata.Extension = this.appOptions.extension;
128
+ CloudMetadata.ReadableExtensions = this.appOptions.readableExtensions || [];
129
+ if (CloudMetadata.Extension) {
130
+ CloudMetadata.ReadableExtensions.push(CloudMetadata.Extension);
131
+ }
132
+ const readableMimetypes = this.appOptions.readableMimeTypes || [];
133
+ readableMimetypes.push(this.appOptions.mimeType);
134
+ // check the providers
135
+ const requestedProviders = this.appOptions.providers.slice();
136
+ if (getQueryParam("saveSecondaryFileViaPostMessage")) {
137
+ requestedProviders.push('postMessage');
138
+ }
139
+ const isInteractiveApiRequested = requestedProviders.includes('interactiveApi');
140
+ const availableProviders = [];
141
+ let shareProvider = null;
142
+ for (let providerSpec of requestedProviders) {
143
+ const [providerName, providerOptions] = isString(providerSpec)
144
+ ? [providerSpec, {}]
145
+ : [providerSpec.name, providerSpec];
146
+ // merge in other options as needed
147
+ if (providerOptions.mimeType == null) {
148
+ providerOptions.mimeType = this.appOptions.mimeType;
149
+ }
150
+ providerOptions.readableMimetypes = readableMimetypes;
151
+ if (!providerName) {
152
+ this.alert("Invalid provider spec - must either be string or object with name property");
153
+ }
154
+ else {
155
+ if (isCustomClientProvider(providerOptions)) {
156
+ allProviders[providerName] = providerOptions.createProvider(ProviderInterface);
157
+ }
158
+ if (allProviders[providerName]) {
159
+ Provider = allProviders[providerName];
160
+ // don't add providers that require configuration if no (or invalid) configuration provided
161
+ if (!Provider.hasValidOptions || Provider.hasValidOptions(providerOptions)) {
162
+ const provider = new Provider(providerOptions, this);
163
+ this.providers[providerName] = provider;
164
+ shareProvider = this._getShareProvider();
165
+ // also add to here in providers list so we can look it up when parsing url hash
166
+ if (provider.urlDisplayName) {
167
+ this.providers[provider.urlDisplayName] = provider;
168
+ }
169
+ availableProviders.push(provider);
170
+ // InteractiveApiProvider is a newer form of Lara provider
171
+ if (!isInteractiveApiRequested && (providerName === "lara")) {
172
+ const interactiveApiProvider = new InteractiveApiProvider(providerOptions, this);
173
+ this.providers.interactiveApi = interactiveApiProvider;
174
+ availableProviders.push(interactiveApiProvider);
175
+ }
176
+ }
177
+ }
178
+ else {
179
+ this.alert(`Unknown provider: ${providerName}`);
180
+ }
181
+ }
182
+ }
183
+ this._setState({
184
+ availableProviders,
185
+ shareProvider
186
+ });
187
+ if (!this.appOptions.ui) {
188
+ this.appOptions.ui = {};
189
+ }
190
+ if (!this.appOptions.ui.windowTitleSuffix) {
191
+ this.appOptions.ui.windowTitleSuffix = document.title;
192
+ }
193
+ if (!this.appOptions.ui.windowTitleSeparator) {
194
+ this.appOptions.ui.windowTitleSeparator = ' - ';
195
+ }
196
+ this._setWindowTitle();
197
+ this._ui.init(this.appOptions.ui);
198
+ // check for autosave
199
+ if (this.appOptions.autoSaveInterval) {
200
+ this.autoSave(this.appOptions.autoSaveInterval);
201
+ }
202
+ // initialize the cloudContentFactory with all data we want in the envelope
203
+ cloudContentFactory.setEnvelopeMetadata({
204
+ cfmVersion: '__PACKAGE_VERSION__', // replaced by version number at build time
205
+ appName: this.appOptions.appName || "",
206
+ appVersion: this.appOptions.appVersion || "",
207
+ appBuildNum: this.appOptions.appBuildNum || ""
208
+ });
209
+ this.newFileOpensInNewTab = (_b = (_a = this.appOptions.ui) === null || _a === void 0 ? void 0 : _a.newFileOpensInNewTab) !== null && _b !== void 0 ? _b : true;
210
+ this.newFileAddsNewToQuery = (_c = this.appOptions.ui) === null || _c === void 0 ? void 0 : _c.newFileAddsNewToQuery;
211
+ if ((_d = this.appOptions.ui) === null || _d === void 0 ? void 0 : _d.confirmCloseIfDirty) {
212
+ this._setupConfirmOnClose();
213
+ }
214
+ return this._startPostMessageListener();
215
+ }
216
+ _getShareProvider() {
217
+ return new S3ShareProvider(this, new S3Provider(this));
218
+ }
219
+ setProviderOptions(name, newOptions) {
220
+ for (let provider of this.state.availableProviders) {
221
+ if (provider.name === name) {
222
+ provider.options = { ...provider.options, newOptions };
223
+ break;
224
+ }
225
+ }
226
+ }
227
+ connect() {
228
+ var _a;
229
+ (_a = this.connectedPromiseResolver) === null || _a === void 0 ? void 0 : _a.resolve();
230
+ return this._event('connected', { client: this });
231
+ }
232
+ //
233
+ // Called from CloudFileManager.clientConnect to process the URL parameters
234
+ // and initiate opening any document specified by URL parameters. The CFM
235
+ // hash params are processed here after which providers are given a chance
236
+ // to process any provider-specific URL parameters. Calls ready() if no
237
+ // initial document opening occurs.
238
+ //
239
+ processUrlParams() {
240
+ // process the hash params
241
+ let providerName;
242
+ const { hashParams } = this.appOptions;
243
+ if (hashParams.sharedContentId) {
244
+ return this.openSharedContent(hashParams.sharedContentId);
245
+ }
246
+ else if (hashParams.fileParams) {
247
+ if (hashParams.fileParams.indexOf("http") === 0) {
248
+ return this.openUrlFile(hashParams.fileParams);
249
+ }
250
+ else {
251
+ let providerParams;
252
+ [providerName, providerParams] = hashParams.fileParams.split(':');
253
+ return this.openProviderFile(providerName, providerParams);
254
+ }
255
+ }
256
+ else if (hashParams.copyParams) {
257
+ return this.openCopiedFile(hashParams.copyParams);
258
+ }
259
+ else if (hashParams.newInFolderParams) {
260
+ let folder;
261
+ [providerName, folder] = hashParams.newInFolderParams.split(':');
262
+ return this.createNewInFolder(providerName, folder);
263
+ }
264
+ else if (this.haveTempFile()) {
265
+ return this.openAndClearTempFile();
266
+ }
267
+ else {
268
+ // give providers a chance to process url params
269
+ for (let provider of this.state.availableProviders) {
270
+ if (provider.handleUrlParams()) {
271
+ return;
272
+ }
273
+ }
274
+ // if no providers handled it, then just signal ready()
275
+ return this.ready();
276
+ }
277
+ }
278
+ ready() {
279
+ return this._event('ready');
280
+ }
281
+ rendered() {
282
+ return this._event('rendered', { client: this });
283
+ }
284
+ listen(listener) {
285
+ if (listener) {
286
+ return this._listeners.push(listener);
287
+ }
288
+ }
289
+ log(event, eventData) {
290
+ this._event('log', { logEvent: event, logEventData: eventData });
291
+ if (this.appOptions.log) {
292
+ return this.appOptions.log(event, eventData);
293
+ }
294
+ }
295
+ autoProvider(capability) {
296
+ for (let provider of this.state.availableProviders) {
297
+ if (provider.canAuto(capability)) {
298
+ return provider;
299
+ }
300
+ }
301
+ }
302
+ appendMenuItem(item) {
303
+ this._ui.appendMenuItem(item);
304
+ return this;
305
+ }
306
+ prependMenuItem(item) {
307
+ this._ui.prependMenuItem(item);
308
+ return this;
309
+ }
310
+ replaceMenuItem(key, item) {
311
+ this._ui.replaceMenuItem(key, item);
312
+ return this;
313
+ }
314
+ insertMenuItemBefore(key, item) {
315
+ this._ui.insertMenuItemBefore(key, item);
316
+ return this;
317
+ }
318
+ insertMenuItemAfter(key, item) {
319
+ this._ui.insertMenuItemAfter(key, item);
320
+ return this;
321
+ }
322
+ setMenuBarInfo(info) {
323
+ return this._ui.setMenuBarInfo(info);
324
+ }
325
+ newFile(callback = null) {
326
+ this._closeCurrentFile();
327
+ this._resetState();
328
+ window.location.hash = "";
329
+ return this._event('newedFile', { content: "" }, callback);
330
+ }
331
+ newFileDialog(callback = null) {
332
+ if (this.newFileOpensInNewTab) {
333
+ return window.open(this.getCurrentUrl(this.newFileAddsNewToQuery ? "#new" : null), '_blank');
334
+ }
335
+ else if (this.state.dirty) {
336
+ if (this._autoSaveInterval && this.state.metadata) {
337
+ this.save();
338
+ return this.newFile(callback);
339
+ }
340
+ else {
341
+ return this.confirm(tr('~CONFIRM.NEW_FILE'), () => this.newFile(callback));
342
+ }
343
+ }
344
+ else {
345
+ return this.newFile(callback);
346
+ }
347
+ }
348
+ openFile(metadata, callback = null) {
349
+ var _a;
350
+ if ((_a = metadata === null || metadata === void 0 ? void 0 : metadata.provider) === null || _a === void 0 ? void 0 : _a.can(ECapabilities.load, metadata)) {
351
+ this._event('willOpenFile', { op: "openFile" });
352
+ return metadata.provider.load(metadata, (err, content) => {
353
+ if (err) {
354
+ return this.alert(err, () => this.ready());
355
+ }
356
+ // should wait to close current file until client signals open is complete
357
+ this._closeCurrentFile();
358
+ content = this._filterLoadedContent(content);
359
+ this._fileOpened(content, metadata, { openedContent: content.clone() }, this._getHashParams(metadata));
360
+ if (typeof callback === 'function') {
361
+ callback(content, metadata);
362
+ }
363
+ return metadata.provider.fileOpened(content, metadata);
364
+ });
365
+ }
366
+ else {
367
+ return this.openFileDialog(callback);
368
+ }
369
+ }
370
+ openFileDialog(callback = null) {
371
+ const showDialog = () => {
372
+ return this._ui.openFileDialog((metadata) => {
373
+ return this.openFile(metadata, callback);
374
+ });
375
+ };
376
+ if (!this.state.dirty) {
377
+ return showDialog();
378
+ }
379
+ else {
380
+ return this.confirm(tr('~CONFIRM.OPEN_FILE'), showDialog);
381
+ }
382
+ }
383
+ closeFile(callback = null) {
384
+ this._closeCurrentFile();
385
+ this._resetState();
386
+ window.location.hash = "";
387
+ this._event('closedFile', { content: "" });
388
+ return (typeof callback === 'function' ? callback() : undefined);
389
+ }
390
+ closeFileDialog(callback = null) {
391
+ if (!this.state.dirty) {
392
+ return this.closeFile(callback);
393
+ }
394
+ else {
395
+ return this.confirm(tr('~CONFIRM.CLOSE_FILE'), () => this.closeFile(callback));
396
+ }
397
+ }
398
+ importData(data, callback = null) {
399
+ this._event('importedData', data);
400
+ return (typeof callback === 'function' ? callback(data) : undefined);
401
+ }
402
+ importDataDialog(callback = null) {
403
+ return this._ui.importDataDialog((data) => {
404
+ return this.importData(data, callback);
405
+ });
406
+ }
407
+ readLocalFile(file, callback = null) {
408
+ const reader = new FileReader();
409
+ reader.onload = loaded => typeof callback === 'function' ? callback({ name: file.name, content: loaded.target.result }) : undefined;
410
+ return reader.readAsText(file);
411
+ }
412
+ openLocalFile(file, callback = null) {
413
+ this._event('willOpenFile', { op: "openLocalFile" });
414
+ return this.readLocalFile(file, (data) => {
415
+ let content = cloudContentFactory.createEnvelopedCloudContent(data.content);
416
+ content = this._filterLoadedContent(content);
417
+ const metadata = new CloudMetadata({
418
+ name: data.name,
419
+ type: CloudMetadata.File
420
+ });
421
+ this._fileOpened(content, metadata, { openedContent: content.clone() });
422
+ return (typeof callback === 'function' ? callback(content, metadata) : undefined);
423
+ });
424
+ }
425
+ importLocalFile(file, callback = null) {
426
+ return this.readLocalFile(file, (data) => {
427
+ return this.importData(data, callback);
428
+ });
429
+ }
430
+ openSharedContent(id) {
431
+ const { shareProvider } = this.state;
432
+ this._event('willOpenFile', { op: "openSharedContent" });
433
+ if (shareProvider.loadSharedContent) {
434
+ shareProvider.loadSharedContent(id, (err, content, metadata) => {
435
+ if (err) {
436
+ this.alert(err, () => this.ready());
437
+ }
438
+ else {
439
+ content = this._filterLoadedContent(content);
440
+ this._fileOpened(content, metadata, { overwritable: false, openedContent: content.clone() });
441
+ }
442
+ });
443
+ }
444
+ }
445
+ // must be called as a result of user action (e.g. click) to avoid popup blockers
446
+ parseUrlAuthorizeAndOpen() {
447
+ var _a;
448
+ if (((_a = this.appOptions.hashParams) === null || _a === void 0 ? void 0 : _a.fileParams) != null) {
449
+ const [providerName, providerParams] = this.appOptions.hashParams.fileParams.split(':');
450
+ const provider = this.providers[providerName];
451
+ if (provider) {
452
+ return provider.authorize(() => {
453
+ return this.openProviderFile(providerName, providerParams);
454
+ });
455
+ }
456
+ }
457
+ }
458
+ /**
459
+ * Disassociates the current document from its provider.
460
+ *
461
+ * This is important specifically for autosaving providers. When authenticated
462
+ * state is lost we must not continue to autosave.
463
+ */
464
+ disconnectCurrentFile() {
465
+ console.warn('Closing file (rejected reauth)');
466
+ if (this.state.metadata) {
467
+ this.state.metadata.provider = null;
468
+ }
469
+ this._setState({ saving: null, saved: null });
470
+ window.location.hash = "";
471
+ this._event('ready');
472
+ }
473
+ confirmAuthorizeAndOpen(provider, providerParams) {
474
+ const rejectCallback = () => this.disconnectCurrentFile();
475
+ // trigger authorize() from confirmation dialog to avoid popup blockers
476
+ return this.confirm(tr("~CONFIRM.AUTHORIZE_OPEN"), () => {
477
+ return provider.authorize(() => {
478
+ this._event('willOpenFile', { op: "confirmAuthorizeAndOpen" });
479
+ return provider.openSaved(providerParams, (err, content, metadata) => {
480
+ if (err) {
481
+ return this.alert(err);
482
+ }
483
+ content = this._filterLoadedContent(content);
484
+ this._fileOpened(content, metadata, { openedContent: content.clone() }, this._getHashParams(metadata));
485
+ return provider.fileOpened(content, metadata);
486
+ });
487
+ });
488
+ }, rejectCallback);
489
+ }
490
+ openProviderFileWhenConnected(providerName, providerParams) {
491
+ this.connectedPromise.then(() => this.openProviderFile(providerName, providerParams));
492
+ }
493
+ openProviderFile(providerName, providerParams) {
494
+ const provider = this.providers[providerName];
495
+ if (provider) {
496
+ return provider.authorized((isAuthorized) => {
497
+ // we can open the document without authorization in some cases
498
+ if (isAuthorized || !provider.isAuthorizationRequired()) {
499
+ this._event('willOpenFile', { op: "openProviderFile" });
500
+ return provider.openSaved(providerParams, (err, content, metadata) => {
501
+ if (err) {
502
+ return this.alert(err, () => this.ready());
503
+ }
504
+ // if we just opened the file, it doesn't need to be saved until the contents are changed unless
505
+ // it requires conversion from an older version
506
+ content = this._filterLoadedContent(content);
507
+ const additionalState = { openedContent: content.clone(), dirty: content.requiresConversion() };
508
+ this._fileOpened(content, metadata, additionalState, this._getHashParams(metadata));
509
+ return provider.fileOpened(content, metadata);
510
+ });
511
+ }
512
+ else {
513
+ return this.confirmAuthorizeAndOpen(provider, providerParams);
514
+ }
515
+ }, { forceAuthorization: true }); // force authorization for Google Drive
516
+ }
517
+ else {
518
+ return this.alert(tr("~ALERT.NO_PROVIDER"), () => this.ready());
519
+ }
520
+ }
521
+ openUrlFile(url) {
522
+ return this.urlProvider.openFileFromUrl(url, (err, content, metadata) => {
523
+ this._event('willOpenFile', { op: "openUrlFile" });
524
+ if (err) {
525
+ return this.alert(err, () => this.ready());
526
+ }
527
+ content = this._filterLoadedContent(content);
528
+ return this._fileOpened(content, metadata, { openedContent: content.clone() }, this._getHashParams(metadata));
529
+ });
530
+ }
531
+ createNewInFolder(providerName, folder) {
532
+ const provider = this.providers[providerName];
533
+ if (provider && provider.can(ECapabilities.setFolder, this.state.metadata)) {
534
+ if ((this.state.metadata == null)) {
535
+ this.state.metadata = new CloudMetadata({
536
+ type: CloudMetadata.File,
537
+ provider
538
+ });
539
+ }
540
+ this.state.metadata.parent = new CloudMetadata({
541
+ type: CloudMetadata.Folder,
542
+ providerData: {
543
+ id: folder
544
+ }
545
+ });
546
+ this._ui.editInitialFilename();
547
+ }
548
+ return this._event('newedFile', { content: "" });
549
+ }
550
+ setInitialFilename(filename) {
551
+ this.state.metadata.rename(filename);
552
+ return this.save();
553
+ }
554
+ isSaveInProgress() {
555
+ return (this.state.saving != null);
556
+ }
557
+ confirmAuthorizeAndSave(stringContent, callback) {
558
+ let rejectCallback = () => { this.disconnectCurrentFile(); };
559
+ // trigger authorize() from confirmation dialog to avoid popup blockers
560
+ return this.confirm(tr("~CONFIRM.AUTHORIZE_SAVE"), () => {
561
+ return this.state.metadata.provider.authorize(() => {
562
+ return this.saveFile(stringContent, this.state.metadata, callback);
563
+ });
564
+ }, rejectCallback);
565
+ }
566
+ save(callback = null) {
567
+ return this._event('getContent', { shared: this._sharedMetadata() }, (stringContent) => {
568
+ return this.saveContent(stringContent, callback);
569
+ });
570
+ }
571
+ saveContent(stringContent, callback = null) {
572
+ var _a;
573
+ const provider = ((_a = this.state.metadata) === null || _a === void 0 ? void 0 : _a.provider) || this.autoProvider(ECapabilities.save);
574
+ if (provider != null) {
575
+ return provider.authorized((isAuthorized) => {
576
+ // we can save the document without authorization in some cases
577
+ if (isAuthorized || !provider.isAuthorizationRequired()) {
578
+ return this.saveFile(stringContent, this.state.metadata, callback);
579
+ }
580
+ else {
581
+ return this.confirmAuthorizeAndSave(stringContent, callback);
582
+ }
583
+ });
584
+ }
585
+ else {
586
+ return this.saveFileDialog(stringContent, callback);
587
+ }
588
+ }
589
+ saveFile(stringContent, metadata, callback = null) {
590
+ var _a;
591
+ const readonly = metadata && !metadata.overwritable; // only check if metadata exists
592
+ const resaveable = (_a = metadata === null || metadata === void 0 ? void 0 : metadata.provider) === null || _a === void 0 ? void 0 : _a.can(ECapabilities.resave, metadata);
593
+ // must be able to 'resave' to save silently, i.e. without save dialog
594
+ if (!readonly && resaveable) {
595
+ return this.saveFileNoDialog(stringContent, metadata, callback);
596
+ }
597
+ else {
598
+ return this.saveFileDialog(stringContent, callback);
599
+ }
600
+ }
601
+ saveFileNoDialog(stringContent, metadata, callback = null) {
602
+ var _a, _b;
603
+ this._setState({
604
+ saving: metadata
605
+ });
606
+ let currentContent = this._createOrUpdateCurrentContent(stringContent, metadata);
607
+ currentContent = ((_b = (_a = this.appOptions).contentSaveFilter) === null || _b === void 0 ? void 0 : _b.call(_a, currentContent)) || currentContent;
608
+ return metadata.provider.save(currentContent, metadata, (err, statusCode, savedContent) => {
609
+ let failures;
610
+ if (err) {
611
+ if (statusCode === 401 || statusCode === 403 || statusCode === 404) {
612
+ // disable autosave while the confirmation dialog is showing
613
+ metadata.autoSaveDisabled = true;
614
+ this._setState({ metadata, saving: null });
615
+ return this.confirmAuthorizeAndSave(stringContent, callback);
616
+ }
617
+ else {
618
+ this._setState({ saving: null });
619
+ failures = this.state.failures;
620
+ if (!failures) {
621
+ failures = 1;
622
+ }
623
+ else {
624
+ failures++;
625
+ }
626
+ if (failures === 1) {
627
+ this._setState({ failures, showingSaveAlert: true });
628
+ let error = err.toString();
629
+ if (this.isAutoSaving()) {
630
+ error = `${error}<br><br>${tr("~FILE_STATUS.CONTINUE_SAVE")}`;
631
+ }
632
+ return this.alert(error, () => {
633
+ this._setState({ showingSaveAlert: false });
634
+ });
635
+ }
636
+ else {
637
+ this._setState({ failures });
638
+ }
639
+ }
640
+ }
641
+ else {
642
+ if (this.state.showingSaveAlert) {
643
+ this.hideAlert();
644
+ }
645
+ this._setState({ failures: 0, showingSaveAlert: false });
646
+ if (this.state.metadata !== metadata) {
647
+ this._closeCurrentFile();
648
+ }
649
+ // reenable autosave on save success if this isn't a local file save
650
+ if (metadata.autoSaveDisabled != null) {
651
+ delete metadata.autoSaveDisabled;
652
+ }
653
+ this._fileChanged('savedFile', currentContent, metadata, { saved: true }, this._getHashParams(metadata));
654
+ return (typeof callback === 'function' ? callback(currentContent, metadata, savedContent) : undefined);
655
+ }
656
+ });
657
+ }
658
+ saveFileDialog(stringContent = null, callback = null) {
659
+ return this._ui.saveFileDialog((metadata) => {
660
+ return this._dialogSave(stringContent, metadata, callback);
661
+ });
662
+ }
663
+ saveFileAsDialog(stringContent = null, callback = null) {
664
+ return this._ui.saveFileAsDialog((metadata) => {
665
+ return this._dialogSave(stringContent, metadata, callback);
666
+ });
667
+ }
668
+ createCopy(stringContent = null, callback = null) {
669
+ const saveAndOpenCopy = (stringContent) => {
670
+ var _a;
671
+ return this.saveCopiedFile(stringContent, (_a = this.state.metadata) === null || _a === void 0 ? void 0 : _a.name, (err, copyParams) => {
672
+ if (err) {
673
+ return (typeof callback === 'function' ? callback(err) : undefined);
674
+ }
675
+ window.open(this.getCurrentUrl(`#copy=${copyParams}`));
676
+ return (typeof callback === 'function' ? callback(copyParams) : undefined);
677
+ });
678
+ };
679
+ if (stringContent == null) {
680
+ return this._event('getContent', {}, (stringContent) => saveAndOpenCopy(stringContent));
681
+ }
682
+ else {
683
+ return saveAndOpenCopy(stringContent);
684
+ }
685
+ }
686
+ saveCopiedFile(stringContent, name, callback) {
687
+ try {
688
+ const prefix = 'cfm-copy::';
689
+ let maxCopyNumber = 0;
690
+ for (let key of Object.keys(window.localStorage || {})) {
691
+ if (key.substr(0, prefix.length) === prefix) {
692
+ const copyNumber = parseInt(key.substr(prefix.length), 10);
693
+ maxCopyNumber = Math.max(maxCopyNumber, copyNumber);
694
+ }
695
+ }
696
+ maxCopyNumber++;
697
+ const value = JSON.stringify({
698
+ name: (name === null || name === void 0 ? void 0 : name.length) ? `Copy of ${name}` : "Copy of Untitled Document",
699
+ stringContent
700
+ });
701
+ window.localStorage.setItem(`${prefix}${maxCopyNumber}`, value);
702
+ return (typeof callback === 'function' ? callback(null, maxCopyNumber) : undefined);
703
+ }
704
+ catch (e) {
705
+ // CODAP style overrides
706
+ const divStyle = "text-align: left";
707
+ const paragraphStyle = "margin: 10px 0;";
708
+ const listStyle = "margin: 10px 10px 10px 30px; padding: 0;";
709
+ const message = `
710
+ <div style="${divStyle}">
711
+ <p style="${paragraphStyle}">The document is either too large to copy within the app, or your browser does not allow local storage.</p>
712
+
713
+ <p style="${paragraphStyle}">To copy this file you must duplicate it outside the app using these steps:</p>
714
+
715
+ <ol style="${listStyle}">
716
+ <li>Save the document.</li>
717
+ <li>Duplicate it using Google Drive or your local file system.</li>
718
+ <li>Open or import the newly duplicated document.</li>
719
+ </ol>
720
+ </div>
721
+ `;
722
+ return this.alert(message, "Copy Error");
723
+ }
724
+ }
725
+ openCopiedFile(copyParams) {
726
+ this._event('willOpenFile', { op: "openCopiedFile" });
727
+ try {
728
+ const key = `cfm-copy::${copyParams}`;
729
+ const copied = JSON.parse(window.localStorage.getItem(key));
730
+ let content = cloudContentFactory.createEnvelopedCloudContent(copied.stringContent);
731
+ content = this._filterLoadedContent(content);
732
+ const metadata = new CloudMetadata({
733
+ name: copied.name,
734
+ type: CloudMetadata.File
735
+ });
736
+ window.location.hash = "";
737
+ this._fileOpened(content, metadata, { dirty: true, openedContent: content.clone() });
738
+ return window.localStorage.removeItem(key);
739
+ }
740
+ catch (e) {
741
+ reportError("Unable to load copied file");
742
+ }
743
+ }
744
+ haveTempFile() {
745
+ try {
746
+ const key = "cfm-tempfile";
747
+ return !!(JSON.parse(window.localStorage.getItem(key)));
748
+ }
749
+ catch (e) {
750
+ return false;
751
+ }
752
+ }
753
+ saveTempFile(callback) {
754
+ return this._event('getContent', { shared: this._sharedMetadata() }, (stringContent) => {
755
+ var _a;
756
+ const currentContent = this._createOrUpdateCurrentContent(stringContent);
757
+ try {
758
+ const key = "cfm-tempfile";
759
+ const name = (_a = this.state.metadata) === null || _a === void 0 ? void 0 : _a.name;
760
+ const value = JSON.stringify({ name, stringContent });
761
+ window.localStorage.setItem(key, value);
762
+ const metadata = new CloudMetadata({
763
+ name,
764
+ type: CloudMetadata.File
765
+ });
766
+ this._fileChanged('savedFile', currentContent, metadata, { saved: true }, "");
767
+ return callback === null || callback === void 0 ? void 0 : callback(null);
768
+ }
769
+ catch (e) {
770
+ return callback === null || callback === void 0 ? void 0 : callback("Unable to temporarily save copied file");
771
+ }
772
+ });
773
+ }
774
+ openAndClearTempFile() {
775
+ this._event('willOpenFile', { op: "openAndClearTempFile" });
776
+ try {
777
+ const key = "cfm-tempfile";
778
+ const { name, stringContent } = JSON.parse(window.localStorage.getItem(key));
779
+ let content = cloudContentFactory.createEnvelopedCloudContent(stringContent);
780
+ content = this._filterLoadedContent(content);
781
+ const metadata = new CloudMetadata({
782
+ name,
783
+ type: CloudMetadata.File
784
+ });
785
+ this._fileOpened(content, metadata, { dirty: true, openedContent: content.clone() });
786
+ return window.localStorage.removeItem(key);
787
+ }
788
+ catch (e) {
789
+ reportError("Unable to load temp file");
790
+ }
791
+ }
792
+ _sharedMetadata() {
793
+ var _a;
794
+ return ((_a = this.state.currentContent) === null || _a === void 0 ? void 0 : _a.getSharedMetadata()) || {};
795
+ }
796
+ shareGetLink() {
797
+ return this._ui.shareDialog(this);
798
+ }
799
+ shareUpdate() {
800
+ return this.share(() => this.alert((tr("~SHARE_UPDATE.MESSAGE")), (tr("~SHARE_UPDATE.TITLE"))));
801
+ }
802
+ toggleShare(callback) {
803
+ if (this.isShared()) {
804
+ return this.unshare(callback);
805
+ }
806
+ else {
807
+ return this.share(callback);
808
+ }
809
+ }
810
+ isShared() {
811
+ var _a;
812
+ const currentContent = (_a = this.state) === null || _a === void 0 ? void 0 : _a.currentContent;
813
+ if (currentContent) {
814
+ const unshared = currentContent.get("isUnshared");
815
+ if (!unshared) {
816
+ const sharedDocumentId = currentContent.get("sharedDocumentId");
817
+ const sharedDocumentUrl = currentContent.get("sharedDocumentUrl");
818
+ return (sharedDocumentId || sharedDocumentUrl);
819
+ }
820
+ }
821
+ return false;
822
+ }
823
+ canEditShared() {
824
+ const accessKeys = (this.state.currentContent != null ? this.state.currentContent.get("accessKeys") : undefined) || {};
825
+ const shareEditKey = this.state.currentContent != null ? this.state.currentContent.get("shareEditKey") : undefined;
826
+ return (shareEditKey || accessKeys.readWrite) && !(this.state.currentContent != null ? this.state.currentContent.get("isUnshared") : undefined);
827
+ }
828
+ setShareState(shared, callback) {
829
+ if (this.state.shareProvider) {
830
+ const sharingMetadata = this.state.shareProvider.getSharingMetadata(shared);
831
+ return this._event('getContent', { shared: sharingMetadata }, (stringContent) => {
832
+ this._setState({ sharing: shared });
833
+ const sharedContent = cloudContentFactory.createEnvelopedCloudContent(stringContent);
834
+ sharedContent.addMetadata(sharingMetadata);
835
+ const currentContent = this._createOrUpdateCurrentContent(stringContent, this.state.metadata);
836
+ sharedContent.set('docName', currentContent.get('docName'));
837
+ // save the current name at the top level so it is displayed when the shared file is loaded
838
+ if (this.state.metadata) {
839
+ sharedContent.getClientContent().name = this.state.metadata.name;
840
+ }
841
+ if (shared) {
842
+ currentContent.remove('isUnshared');
843
+ }
844
+ else {
845
+ currentContent.set('isUnshared', true);
846
+ }
847
+ return this.state.shareProvider.share(shared, currentContent, sharedContent, this.state.metadata, (err, sharedContentId) => {
848
+ if (err) {
849
+ return this.alert(err);
850
+ }
851
+ return callback === null || callback === void 0 ? void 0 : callback(null, sharedContentId, currentContent);
852
+ });
853
+ });
854
+ }
855
+ }
856
+ share(callback) {
857
+ if (!this.state.metadata) {
858
+ // PJ, 07/10/2020: Without these lines the sharing process will fail (it looks for filename and later tries to
859
+ // update metadata object). Apparently, there's an assumption that metadata already exists. It can initialized
860
+ // in a few random places, but a new document that has never been renamed won't have this object available.
861
+ this.state.metadata = new CloudMetadata({
862
+ name: tr("~MENUBAR.UNTITLED_DOCUMENT"),
863
+ type: CloudMetadata.File
864
+ });
865
+ }
866
+ return this.setShareState(true, (err, sharedContentId, currentContent) => {
867
+ this._fileChanged('sharedFile', currentContent, this.state.metadata);
868
+ return callback === null || callback === void 0 ? void 0 : callback(null, sharedContentId);
869
+ });
870
+ }
871
+ unshare(callback) {
872
+ return this.setShareState(false, (err, sharedContentId, currentContent) => {
873
+ this._fileChanged('unsharedFile', currentContent, this.state.metadata);
874
+ return callback === null || callback === void 0 ? void 0 : callback(null);
875
+ });
876
+ }
877
+ revertToShared(callback = null) {
878
+ var _a, _b, _c;
879
+ // Look for sharedDocumentUrl or Url first:
880
+ const id = ((_a = this.state.currentContent) === null || _a === void 0 ? void 0 : _a.get("sharedDocumentUrl"))
881
+ || ((_b = this.state.currentContent) === null || _b === void 0 ? void 0 : _b.get("url"))
882
+ || ((_c = this.state.currentContent) === null || _c === void 0 ? void 0 : _c.get("sharedDocumentId"));
883
+ if (id && (this.state.shareProvider != null)) {
884
+ return this.state.shareProvider.loadSharedContent(id, (err, content, metadata) => {
885
+ let docName;
886
+ if (err) {
887
+ return this.alert(err);
888
+ }
889
+ content = this._filterLoadedContent(content);
890
+ this.state.currentContent.copyMetadataTo(content);
891
+ if (!metadata.name && (docName = content.get('docName'))) {
892
+ metadata.name = docName;
893
+ }
894
+ this._fileOpened(content, metadata, { dirty: true, openedContent: content.clone() });
895
+ return callback === null || callback === void 0 ? void 0 : callback(null);
896
+ });
897
+ }
898
+ }
899
+ revertToSharedDialog(callback = null) {
900
+ if ((this.state.currentContent != null ? this.state.currentContent.get("sharedDocumentId") : undefined) && (this.state.shareProvider != null)) {
901
+ return this.confirm(tr("~CONFIRM.REVERT_TO_SHARED_VIEW"), () => this.revertToShared(callback));
902
+ }
903
+ }
904
+ downloadDialog(callback = null) {
905
+ // should share metadata be included in downloaded local files?
906
+ return this._event('getContent', { shared: this._sharedMetadata() }, (content) => {
907
+ var _a;
908
+ const envelopedContent = cloudContentFactory.createEnvelopedCloudContent(content);
909
+ if (this.state.currentContent != null) {
910
+ this.state.currentContent.copyMetadataTo(envelopedContent);
911
+ }
912
+ return this._ui.downloadDialog((_a = this.state.metadata) === null || _a === void 0 ? void 0 : _a.name, envelopedContent, callback);
913
+ });
914
+ }
915
+ getDownloadBlob(content, includeShareInfo, mimeType) {
916
+ var _a;
917
+ let contentToSave;
918
+ if (mimeType == null) {
919
+ mimeType = 'text/plain';
920
+ }
921
+ if (typeof content === "string") {
922
+ if (mimeType.indexOf("image") >= 0) {
923
+ contentToSave = base64Array.toByteArray(content);
924
+ }
925
+ else {
926
+ contentToSave = content;
927
+ }
928
+ }
929
+ else if (includeShareInfo) {
930
+ contentToSave = JSON.stringify(content.getContent());
931
+ }
932
+ else { // not includeShareInfo
933
+ // clone the document so we can delete the share info and not affect the original
934
+ const json = content.clone().getContent();
935
+ delete json.sharedDocumentId;
936
+ delete json.sharedDocumentUrl;
937
+ delete json.shareEditKey;
938
+ delete json.isUnshared;
939
+ delete json.accessKeys;
940
+ // CODAP moves the keys into its own namespace
941
+ if (((_a = json.metadata) === null || _a === void 0 ? void 0 : _a.shared) != null) {
942
+ delete json.metadata.shared;
943
+ }
944
+ contentToSave = JSON.stringify(json);
945
+ }
946
+ return new Blob([contentToSave], { type: mimeType });
947
+ }
948
+ getDownloadUrl(content, includeShareInfo, mimeType) {
949
+ if (mimeType == null) {
950
+ mimeType = 'text/plain';
951
+ }
952
+ const wURL = window.URL || window.webkitURL;
953
+ if (wURL) {
954
+ return wURL.createObjectURL(this.getDownloadBlob(content, includeShareInfo, mimeType));
955
+ }
956
+ }
957
+ rename(metadata, newName, callback) {
958
+ var _a;
959
+ const { dirty } = this.state;
960
+ const _rename = (metadata) => {
961
+ var _a;
962
+ if (this.state.currentContent != null) {
963
+ this.state.currentContent.addMetadata({ docName: metadata.name });
964
+ }
965
+ this._fileChanged('renamedFile', this.state.currentContent, metadata, { dirty }, this._getHashParams(metadata));
966
+ const done = () => typeof callback === 'function' ? callback(newName) : undefined;
967
+ const readOnlyProvider = ((_a = metadata === null || metadata === void 0 ? void 0 : metadata.provider) === null || _a === void 0 ? void 0 : _a.name) === ReadOnlyProvider.Name;
968
+ if (!readOnlyProvider && ((metadata === null || metadata === void 0 ? void 0 : metadata.provider) || this.autoProvider(ECapabilities.save))) {
969
+ // autosave renamed file if it has already been saved or can be autosaved
970
+ this.save(done);
971
+ }
972
+ else {
973
+ done();
974
+ }
975
+ };
976
+ if (newName !== (this.state.metadata != null ? this.state.metadata.name : undefined)) {
977
+ if ((_a = metadata === null || metadata === void 0 ? void 0 : metadata.provider) === null || _a === void 0 ? void 0 : _a.can(ECapabilities.rename, metadata)) {
978
+ return this.state.metadata.provider.rename(this.state.metadata, newName, (err, metadata) => {
979
+ if (err) {
980
+ return this.alert(err);
981
+ }
982
+ return _rename(metadata);
983
+ });
984
+ }
985
+ else {
986
+ if (metadata) {
987
+ metadata.rename(newName);
988
+ }
989
+ else {
990
+ metadata = new CloudMetadata({
991
+ name: newName,
992
+ type: CloudMetadata.File
993
+ });
994
+ }
995
+ return _rename(metadata);
996
+ }
997
+ }
998
+ }
999
+ renameDialog(callback = null) {
1000
+ return this._ui.renameDialog(this.state.metadata != null ? this.state.metadata.name : undefined, (newName) => {
1001
+ return this.rename(this.state.metadata, newName, callback);
1002
+ });
1003
+ }
1004
+ revertToLastOpened(callback = null) {
1005
+ this._event('willOpenFile', { op: "revertToLastOpened" });
1006
+ if ((this.state.openedContent != null) && this.state.metadata) {
1007
+ return this._fileOpened(this.state.openedContent, this.state.metadata, { openedContent: this.state.openedContent.clone() });
1008
+ }
1009
+ }
1010
+ revertToLastOpenedDialog(callback = null) {
1011
+ if ((this.state.openedContent != null) && this.state.metadata) {
1012
+ return this.confirm(tr('~CONFIRM.REVERT_TO_LAST_OPENED'), () => this.revertToLastOpened(callback));
1013
+ }
1014
+ else {
1015
+ return (typeof callback === 'function' ? callback('No initial opened version was found for the currently active file') : undefined);
1016
+ }
1017
+ }
1018
+ saveSecondaryFileAsDialog(stringContent, extension, mimeType, callback) {
1019
+ // set the mimeType if not given with the extension
1020
+ const extensionMimeType = mime.getType(extension);
1021
+ if (extension && !mimeType && extensionMimeType) {
1022
+ mimeType = extensionMimeType;
1023
+ }
1024
+ const provider = this.autoProvider(ECapabilities['export']);
1025
+ if (provider) {
1026
+ const metadata = { provider, extension, mimeType };
1027
+ return this.saveSecondaryFile(stringContent, metadata, callback);
1028
+ }
1029
+ else {
1030
+ const data = { content: stringContent, extension, mimeType };
1031
+ return this._ui.saveSecondaryFileAsDialog(data, (metadata) => {
1032
+ // replace defaults
1033
+ if (extension) {
1034
+ metadata.filename = CloudMetadata.newExtension(metadata.filename, extension);
1035
+ }
1036
+ if (mimeType) {
1037
+ metadata.mimeType = mimeType;
1038
+ }
1039
+ return this.saveSecondaryFile(stringContent, metadata, callback);
1040
+ });
1041
+ }
1042
+ }
1043
+ // Saves a file to backend, but does not update current metadata.
1044
+ // Used e.g. when exporting .csv files from CODAP
1045
+ saveSecondaryFile(stringContent, metadata, callback = null) {
1046
+ var _a;
1047
+ if ((_a = metadata === null || metadata === void 0 ? void 0 : metadata.provider) === null || _a === void 0 ? void 0 : _a.can(ECapabilities["export"], metadata)) {
1048
+ return metadata.provider.saveAsExport(stringContent, metadata, (err, statusCode) => {
1049
+ return err ? this.alert(err) : callback === null || callback === void 0 ? void 0 : callback(stringContent, metadata);
1050
+ });
1051
+ }
1052
+ }
1053
+ dirty(isDirty = true) {
1054
+ this._setState({
1055
+ dirty: isDirty,
1056
+ saved: this.state.saved && !isDirty
1057
+ });
1058
+ if (window.self !== window.top) {
1059
+ // post to parent and not top window (not a bug even though we test for self inst top above)
1060
+ return window.parent.postMessage({ type: "cfm::setDirty", isDirty }, "*");
1061
+ }
1062
+ }
1063
+ shouldAutoSave() {
1064
+ var _a;
1065
+ const { metadata } = this.state;
1066
+ return (this.state.dirty
1067
+ && !(metadata === null || metadata === void 0 ? void 0 : metadata.autoSaveDisabled)
1068
+ && !this.isSaveInProgress()
1069
+ && ((_a = metadata === null || metadata === void 0 ? void 0 : metadata.provider) === null || _a === void 0 ? void 0 : _a.can(ECapabilities.resave, metadata)));
1070
+ }
1071
+ autoSave(interval) {
1072
+ if (this._autoSaveInterval) {
1073
+ clearInterval(this._autoSaveInterval);
1074
+ }
1075
+ // in case the caller uses milliseconds
1076
+ if (interval > 1000) {
1077
+ interval = Math.round(interval / 1000);
1078
+ }
1079
+ if (interval > 0) {
1080
+ return this._autoSaveInterval = window.setInterval(() => { if (this.shouldAutoSave()) {
1081
+ return this.save();
1082
+ } }, interval * 1000);
1083
+ }
1084
+ }
1085
+ isAutoSaving() {
1086
+ return (this._autoSaveInterval != null);
1087
+ }
1088
+ changeLanguage(newLangCode, callback) {
1089
+ var _a, _b;
1090
+ if (callback) {
1091
+ const postSave = (err) => {
1092
+ if (err) {
1093
+ this.alert(err);
1094
+ return this.confirm(tr('~CONFIRM.CHANGE_LANGUAGE'), () => callback(newLangCode));
1095
+ }
1096
+ else {
1097
+ return callback(newLangCode);
1098
+ }
1099
+ };
1100
+ if ((_b = (_a = this.state.metadata) === null || _a === void 0 ? void 0 : _a.provider) === null || _b === void 0 ? void 0 : _b.can(ECapabilities.save)) {
1101
+ return this.save((err) => postSave(err));
1102
+ }
1103
+ else {
1104
+ return this.saveTempFile(postSave);
1105
+ }
1106
+ }
1107
+ }
1108
+ showBlockingModal(modalProps) {
1109
+ return this._ui.showBlockingModal(modalProps);
1110
+ }
1111
+ hideBlockingModal() {
1112
+ return this._ui.hideBlockingModal();
1113
+ }
1114
+ getCurrentUrl(hashString) {
1115
+ return `${window.location.origin}${window.location.pathname}${window.location.search}${hashString || ""}`;
1116
+ }
1117
+ // Takes an array of strings representing url parameters to be removed from the URL.
1118
+ // Removes the specified parameters from the URL and then uses the history API's
1119
+ // pushState() method to update the URL without reloading the page.
1120
+ // Adapted from http://stackoverflow.com/a/11654436.
1121
+ removeQueryParams(params) {
1122
+ let url = window.location.href;
1123
+ const hash = url.split('#');
1124
+ for (let key of params) {
1125
+ const re = new RegExp(`([?&])${key}=.*?(&|#|$)(.*)`, "g");
1126
+ if (re.test(url)) {
1127
+ hash[0] = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
1128
+ }
1129
+ }
1130
+ url = hash[0] + ((hash[1] != null) ? `#${hash[1]}` : '');
1131
+ if (url !== window.location.href) {
1132
+ return history.pushState({ originalUrl: window.location.href }, '', url);
1133
+ }
1134
+ }
1135
+ confirm(message, callback, rejectCallback) {
1136
+ return this.confirmDialog({ message, callback, rejectCallback });
1137
+ }
1138
+ confirmDialog(params) {
1139
+ return this._ui.confirmDialog(params);
1140
+ }
1141
+ alert(message, titleOrCallback, callback) {
1142
+ if (_.isFunction(titleOrCallback)) {
1143
+ callback = titleOrCallback;
1144
+ titleOrCallback = null;
1145
+ }
1146
+ return this._ui.alertDialog(message, (titleOrCallback || tr("~CLIENT_ERROR.TITLE")), callback);
1147
+ }
1148
+ hideAlert() {
1149
+ this._ui.hideAlertDialog();
1150
+ }
1151
+ selectInteractiveStateDialog(props, callback) {
1152
+ this._event("requiresUserInteraction");
1153
+ this._ui.selectInteractiveStateDialog({ ...props, onSelect: callback });
1154
+ }
1155
+ async onUnload(options) {
1156
+ if (options.unloading) {
1157
+ return new Promise(resolve => {
1158
+ var _a;
1159
+ // only save if the provider is set - when using linked interactives the provider is not set when
1160
+ // the linked interactive changed and the version choice dialog is showing
1161
+ if ((_a = this.state.metadata) === null || _a === void 0 ? void 0 : _a.provider) {
1162
+ this.save((content, metadata, savedContent) => {
1163
+ // providers can save a different format for the content
1164
+ // for example the interactiveApi provider can save attachments in which case the savedContent
1165
+ // will be an object pointing at the attachment
1166
+ resolve(savedContent || content);
1167
+ });
1168
+ }
1169
+ else {
1170
+ // signal that nothing needs to be saved
1171
+ resolve(undefined);
1172
+ }
1173
+ });
1174
+ }
1175
+ return Promise.resolve(undefined);
1176
+ }
1177
+ _dialogSave(stringContent, metadata, callback) {
1178
+ if (stringContent != null) {
1179
+ return this.saveFileNoDialog(stringContent, metadata, callback);
1180
+ }
1181
+ else {
1182
+ return this._event('getContent', { shared: this._sharedMetadata() }, (stringContent) => {
1183
+ return this.saveFileNoDialog(stringContent, metadata, callback);
1184
+ });
1185
+ }
1186
+ }
1187
+ // The purpose of this seems to be to definitely set whether or not the content
1188
+ // can be overwritten? Will mutate metadata:
1189
+ _updateMetaDataOverwritable(metadata) {
1190
+ if (metadata != null) {
1191
+ metadata.overwritable = (metadata.overwritable != null)
1192
+ ? metadata.overwritable
1193
+ : true;
1194
+ }
1195
+ }
1196
+ _fileChanged(type, content, metadata, additionalState, hashParams = null) {
1197
+ if (additionalState == null) {
1198
+ additionalState = {};
1199
+ }
1200
+ this._updateMetaDataOverwritable(metadata);
1201
+ this._updateState(content, metadata, additionalState, hashParams);
1202
+ return this._event(type, { content: (content != null ? content.getClientContent() : undefined), shared: this._sharedMetadata() });
1203
+ }
1204
+ _fileOpened(content, metadata, additionalState, hashParams = null) {
1205
+ var _a, _b;
1206
+ if (additionalState == null) {
1207
+ additionalState = {};
1208
+ }
1209
+ const eventData = { content: (_b = (_a = content === null || content === void 0 ? void 0 : content.getClientContent) === null || _a === void 0 ? void 0 : _a.call(content)) !== null && _b !== void 0 ? _b : content };
1210
+ // update state before sending 'openedFile' events so that 'openedFile' listeners that
1211
+ // reference state have the updated state values
1212
+ this._updateState(content, metadata, additionalState, hashParams);
1213
+ // add metadata contentType to event for CODAP to load via postMessage API (for SageModeler standalone)
1214
+ const contentType = metadata.mimeType || metadata.contentType;
1215
+ eventData.metadata = { contentType, url: metadata.url, filename: metadata.filename };
1216
+ return this._event('openedFile', eventData, (iError, iSharedMetadata) => {
1217
+ if (iError) {
1218
+ return this.alert(iError, () => this.ready());
1219
+ }
1220
+ this._updateMetaDataOverwritable(metadata);
1221
+ if (!this.appOptions.wrapFileContent) {
1222
+ content.addMetadata(iSharedMetadata);
1223
+ }
1224
+ // and then update state again for the metadata and content changes
1225
+ this._updateState(content, metadata, additionalState, hashParams);
1226
+ return this.ready();
1227
+ });
1228
+ }
1229
+ _updateState(content, metadata, additionalState = {}, hashParams = null) {
1230
+ const state = {
1231
+ currentContent: content,
1232
+ metadata,
1233
+ saving: null,
1234
+ saved: false,
1235
+ dirty: !additionalState.saved && (content === null || content === void 0 ? void 0 : content.requiresConversion()),
1236
+ ...additionalState
1237
+ };
1238
+ this._setWindowTitle(metadata === null || metadata === void 0 ? void 0 : metadata.name);
1239
+ if (hashParams !== null) {
1240
+ window.location.hash = hashParams;
1241
+ }
1242
+ return this._setState(state);
1243
+ }
1244
+ _event(type, data, eventCallback = null) {
1245
+ var _a;
1246
+ if (data == null) {
1247
+ data = {};
1248
+ }
1249
+ const event = new CloudFileManagerClientEvent(type, data, eventCallback, this.state);
1250
+ for (let listener of this._listeners) {
1251
+ listener(event);
1252
+ }
1253
+ // Workaround to fix https://www.pivotaltracker.com/story/show/162392580
1254
+ // CODAP will fail on the renamedFile message because we don't send the state with
1255
+ // the postMessage events and CODAP examines the state to get the new name.
1256
+ // I tried sending the state but that causes CODAP to replace its state which breaks other things.
1257
+ // A permanent fix for this would be to send the new filename outside of the state metadata.
1258
+ const skipPostMessage = type === "renamedFile";
1259
+ if (((_a = this.appOptions) === null || _a === void 0 ? void 0 : _a.sendPostMessageClientEvents) && this.iframe && !skipPostMessage) {
1260
+ return event.postMessage(this.iframe.contentWindow);
1261
+ }
1262
+ }
1263
+ _setState(newState) {
1264
+ this.state = { ...this.state, ...newState };
1265
+ return this._event('stateChanged');
1266
+ }
1267
+ _resetState() {
1268
+ return this._setState({
1269
+ openedContent: null,
1270
+ currentContent: null,
1271
+ metadata: null,
1272
+ dirty: false,
1273
+ saving: null,
1274
+ saved: false,
1275
+ failures: 0
1276
+ });
1277
+ }
1278
+ _closeCurrentFile() {
1279
+ var _a;
1280
+ const { metadata } = this.state;
1281
+ if ((_a = metadata === null || metadata === void 0 ? void 0 : metadata.provider) === null || _a === void 0 ? void 0 : _a.can(ECapabilities.close, metadata)) {
1282
+ return metadata.provider.close(metadata);
1283
+ }
1284
+ }
1285
+ _createOrUpdateCurrentContent(stringContent, metadata = null) {
1286
+ let currentContent;
1287
+ if (this.state.currentContent != null) {
1288
+ ({ currentContent } = this.state);
1289
+ currentContent.setText(stringContent);
1290
+ }
1291
+ else {
1292
+ currentContent = cloudContentFactory.createEnvelopedCloudContent(stringContent);
1293
+ }
1294
+ if (metadata != null) {
1295
+ currentContent.addMetadata({ docName: metadata.name });
1296
+ }
1297
+ return currentContent;
1298
+ }
1299
+ _setWindowTitle(name) {
1300
+ var _a;
1301
+ if ((_a = this.appOptions) === null || _a === void 0 ? void 0 : _a.appSetsWindowTitle) {
1302
+ return;
1303
+ }
1304
+ const { ui } = this.appOptions;
1305
+ if (ui) {
1306
+ const { windowTitleSeparator, windowTitleSuffix } = ui;
1307
+ if (windowTitleSuffix) {
1308
+ const displayName = (name || "").length > 0
1309
+ ? name
1310
+ : tr("~MENUBAR.UNTITLED_DOCUMENT");
1311
+ document.title = `${displayName}${windowTitleSeparator}${windowTitleSuffix}`;
1312
+ }
1313
+ }
1314
+ }
1315
+ _getHashParams(metadata) {
1316
+ var _a, _b;
1317
+ const canOpenSaved = ((_a = metadata === null || metadata === void 0 ? void 0 : metadata.provider) === null || _a === void 0 ? void 0 : _a.canOpenSaved()) || false;
1318
+ let openSavedParams = canOpenSaved ? (_b = metadata === null || metadata === void 0 ? void 0 : metadata.provider) === null || _b === void 0 ? void 0 : _b.getOpenSavedParams(metadata) : null;
1319
+ if (canOpenSaved && (openSavedParams != null) && (typeof openSavedParams === "string")) {
1320
+ return `#file=${metadata.provider.urlDisplayName || metadata.provider.name}:${encodeURIComponent(openSavedParams)}`;
1321
+ }
1322
+ else if ((metadata === null || metadata === void 0 ? void 0 : metadata.provider) instanceof URLProvider && (window.location.hash.indexOf("#file=http") === 0)) {
1323
+ return window.location.hash; // leave it alone
1324
+ }
1325
+ else {
1326
+ return "";
1327
+ }
1328
+ }
1329
+ _startPostMessageListener() {
1330
+ return $(window).on('message', e => {
1331
+ var _a, _b;
1332
+ const oe = e.originalEvent;
1333
+ const data = oe.data || {};
1334
+ const reply = function (type, params) {
1335
+ if (params == null) {
1336
+ params = {};
1337
+ }
1338
+ const message = _.merge({}, params, { type });
1339
+ return oe.source.postMessage(message, oe.origin);
1340
+ };
1341
+ switch (data === null || data === void 0 ? void 0 : data.type) {
1342
+ case 'cfm::getCommands':
1343
+ return reply('cfm::commands', { commands: ['cfm::autosave', 'cfm::event', 'cfm::event:reply', 'cfm::setDirty', 'cfm::iframedClientConnected'] });
1344
+ case 'cfm::autosave':
1345
+ if (this.shouldAutoSave()) {
1346
+ return this.save(() => reply('cfm::autosaved', { saved: true }));
1347
+ }
1348
+ else {
1349
+ return reply('cfm::autosaved', { saved: false });
1350
+ }
1351
+ case 'cfm::event':
1352
+ return this._event(data.eventType, data.eventData, function () {
1353
+ const callbackArgs = JSON.stringify(Array.prototype.slice.call(arguments));
1354
+ return reply('cfm::event:reply', { eventId: data.eventId, callbackArgs });
1355
+ });
1356
+ case 'cfm::event:reply': {
1357
+ const event = CLOUDFILEMANAGER_EVENTS[data.eventId];
1358
+ const callbackData = JSON.parse((data === null || data === void 0 ? void 0 : data.callbackArgs) || null);
1359
+ return (_a = event === null || event === void 0 ? void 0 : event.callback) === null || _a === void 0 ? void 0 : _a.apply(this, callbackData);
1360
+ }
1361
+ case 'cfm::setDirty':
1362
+ return this.dirty(data.isDirty);
1363
+ case 'cfm::iframedClientConnected':
1364
+ (_b = this.connectedPromiseResolver) === null || _b === void 0 ? void 0 : _b.resolve();
1365
+ return this.processUrlParams();
1366
+ }
1367
+ });
1368
+ }
1369
+ _setupConfirmOnClose() {
1370
+ return $(window).on('beforeunload', e => {
1371
+ if (this.state.dirty) {
1372
+ // different browsers trigger the confirm in different ways
1373
+ e.preventDefault();
1374
+ return e.returnValue = true;
1375
+ }
1376
+ });
1377
+ }
1378
+ _filterLoadedContent(content) {
1379
+ var _a, _b;
1380
+ return ((_b = (_a = this.appOptions).contentLoadFilter) === null || _b === void 0 ? void 0 : _b.call(_a, content)) || content;
1381
+ }
1382
+ }
1383
+ export { CloudFileManagerClientEvent, CloudFileManagerClient };
1384
+ //# sourceMappingURL=client.js.map