solid-ui 2.6.1-e5ad2945 → 2.6.1-fceee6b

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 (366) hide show
  1. package/LICENSE.md +3 -1
  2. package/README.md +84 -25
  3. package/dist/acl/access-controller.js +293 -0
  4. package/dist/acl/access-controller.js.map +1 -0
  5. package/dist/acl/access-groups.js +372 -0
  6. package/dist/acl/access-groups.js.map +1 -0
  7. package/dist/acl/acl-control.js +217 -0
  8. package/dist/acl/acl-control.js.map +1 -0
  9. package/dist/acl/acl.js +550 -0
  10. package/dist/acl/acl.js.map +1 -0
  11. package/dist/acl/add-agent-buttons.js +260 -0
  12. package/dist/acl/add-agent-buttons.js.map +1 -0
  13. package/dist/acl/index.js +35 -0
  14. package/dist/acl/index.js.map +1 -0
  15. package/dist/acl/types.js +7 -0
  16. package/dist/acl/types.js.map +1 -0
  17. package/{lib → dist}/chat/keys.d.ts +1 -1
  18. package/{lib → dist}/chat/keys.d.ts.map +1 -1
  19. package/dist/chat/keys.js +148 -0
  20. package/dist/chat/keys.js.map +1 -0
  21. package/dist/chat/signature.js +71 -0
  22. package/dist/chat/signature.js.map +1 -0
  23. package/dist/create/create.js +288 -0
  24. package/dist/create/create.js.map +1 -0
  25. package/dist/create/index.js +8 -0
  26. package/dist/create/index.js.map +1 -0
  27. package/dist/create/types.js +3 -0
  28. package/dist/create/types.js.map +1 -0
  29. package/dist/debug.js +23 -0
  30. package/dist/debug.js.map +1 -0
  31. package/dist/footer/index.js +72 -0
  32. package/dist/footer/index.js.map +1 -0
  33. package/dist/header/empty-profile.js +14 -0
  34. package/dist/header/empty-profile.js.map +1 -0
  35. package/dist/header/index.js +305 -0
  36. package/dist/header/index.js.map +1 -0
  37. package/dist/iconBase.js +40 -0
  38. package/dist/iconBase.js.map +1 -0
  39. package/dist/icons/solid_logo.js.map +1 -0
  40. package/{lib → dist}/index.d.ts +4 -4
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +170 -0
  43. package/dist/index.js.map +1 -0
  44. package/{lib → dist}/log.js +85 -99
  45. package/dist/log.js.map +1 -0
  46. package/dist/login/login.js +910 -0
  47. package/dist/login/login.js.map +1 -0
  48. package/dist/matrix/index.js +8 -0
  49. package/dist/matrix/index.js.map +1 -0
  50. package/dist/matrix/matrix.js +253 -0
  51. package/dist/matrix/matrix.js.map +1 -0
  52. package/dist/matrix/types.js +3 -0
  53. package/dist/matrix/types.js.map +1 -0
  54. package/dist/media/index.js +9 -0
  55. package/dist/media/index.js.map +1 -0
  56. package/dist/media/media-capture.js +198 -0
  57. package/dist/media/media-capture.js.map +1 -0
  58. package/dist/pad.js +795 -0
  59. package/dist/pad.js.map +1 -0
  60. package/dist/participation.js +228 -0
  61. package/dist/participation.js.map +1 -0
  62. package/dist/solid-ui.esm.js +25549 -0
  63. package/dist/solid-ui.esm.js.map +1 -0
  64. package/dist/solid-ui.esm.min.js +43 -0
  65. package/dist/solid-ui.esm.min.js.map +1 -0
  66. package/dist/solid-ui.js +23493 -68924
  67. package/dist/solid-ui.js.map +1 -1
  68. package/dist/solid-ui.min.js +40 -2
  69. package/dist/solid-ui.min.js.map +1 -1
  70. package/dist/tabs.js +398 -0
  71. package/dist/tabs.js.map +1 -0
  72. package/dist/utils/headerFooterHelpers.js +122 -0
  73. package/dist/utils/headerFooterHelpers.js.map +1 -0
  74. package/{lib → dist}/utils/keyHelpers/accessData.d.ts +3 -3
  75. package/{lib → dist}/utils/keyHelpers/accessData.d.ts.map +1 -1
  76. package/dist/utils/keyHelpers/accessData.js +108 -0
  77. package/dist/utils/keyHelpers/accessData.js.map +1 -0
  78. package/dist/utils/keyHelpers/acl.js +112 -0
  79. package/dist/utils/keyHelpers/acl.js.map +1 -0
  80. package/{lib → dist}/utils/keyHelpers/otherHelpers.d.ts +1 -1
  81. package/{lib → dist}/utils/keyHelpers/otherHelpers.d.ts.map +1 -1
  82. package/dist/utils/keyHelpers/otherHelpers.js +19 -0
  83. package/dist/utils/keyHelpers/otherHelpers.js.map +1 -0
  84. package/dist/utils/label.js +150 -0
  85. package/dist/utils/label.js.map +1 -0
  86. package/dist/versionInfo.js +33 -0
  87. package/dist/versionInfo.js.map +1 -0
  88. package/dist/widgets/buttons/iconLinks.js +49 -0
  89. package/dist/widgets/buttons/iconLinks.js.map +1 -0
  90. package/dist/widgets/buttons.js +1355 -0
  91. package/dist/widgets/buttons.js.map +1 -0
  92. package/dist/widgets/error.js +42 -0
  93. package/dist/widgets/error.js.map +1 -0
  94. package/dist/widgets/forms/autocomplete/autocompleteBar.js +162 -0
  95. package/dist/widgets/forms/autocomplete/autocompleteBar.js.map +1 -0
  96. package/dist/widgets/forms/autocomplete/autocompleteField.js +235 -0
  97. package/dist/widgets/forms/autocomplete/autocompleteField.js.map +1 -0
  98. package/dist/widgets/forms/autocomplete/autocompletePicker.js +296 -0
  99. package/dist/widgets/forms/autocomplete/autocompletePicker.js.map +1 -0
  100. package/dist/widgets/forms/autocomplete/language.js +147 -0
  101. package/dist/widgets/forms/autocomplete/language.js.map +1 -0
  102. package/{lib → dist}/widgets/forms/autocomplete/publicData.d.ts +3 -3
  103. package/dist/widgets/forms/autocomplete/publicData.d.ts.map +1 -0
  104. package/dist/widgets/forms/autocomplete/publicData.js +507 -0
  105. package/dist/widgets/forms/autocomplete/publicData.js.map +1 -0
  106. package/dist/widgets/forms/basic.js +250 -0
  107. package/dist/widgets/forms/basic.js.map +1 -0
  108. package/dist/widgets/forms/comment.js +52 -0
  109. package/dist/widgets/forms/comment.js.map +1 -0
  110. package/dist/widgets/forms/fieldFunction.js +49 -0
  111. package/dist/widgets/forms/fieldFunction.js.map +1 -0
  112. package/dist/widgets/forms/fieldParams.js +95 -0
  113. package/dist/widgets/forms/fieldParams.js.map +1 -0
  114. package/dist/widgets/forms/formStyle.js +43 -0
  115. package/dist/widgets/forms/formStyle.js.map +1 -0
  116. package/{lib → dist}/widgets/widgetHelpers.d.ts.map +1 -1
  117. package/{lib → dist}/widgets/widgetHelpers.js +19 -24
  118. package/dist/widgets/widgetHelpers.js.map +1 -0
  119. package/package.json +44 -47
  120. package/dist/789.solid-ui.min.js +0 -1
  121. package/dist/841.solid-ui.min.js +0 -3
  122. package/dist/841.solid-ui.min.js.LICENSE.txt +0 -58
  123. package/dist/841.solid-ui.min.js.map +0 -1
  124. package/dist/_2b19.solid-ui.js +0 -14
  125. package/dist/_2b19.solid-ui.js.map +0 -1
  126. package/dist/index.html +0 -1
  127. package/dist/solid-ui.min.js.LICENSE.txt +0 -57
  128. package/dist/vendors-node_modules_jsonld_lib_jsonld_js.solid-ui.js +0 -12247
  129. package/dist/vendors-node_modules_jsonld_lib_jsonld_js.solid-ui.js.map +0 -1
  130. package/lib/acl/access-controller.js +0 -391
  131. package/lib/acl/access-controller.js.map +0 -1
  132. package/lib/acl/access-groups.js +0 -507
  133. package/lib/acl/access-groups.js.map +0 -1
  134. package/lib/acl/acl-control.js +0 -237
  135. package/lib/acl/acl-control.js.map +0 -1
  136. package/lib/acl/acl.js +0 -517
  137. package/lib/acl/acl.js.map +0 -1
  138. package/lib/acl/add-agent-buttons.js +0 -434
  139. package/lib/acl/add-agent-buttons.js.map +0 -1
  140. package/lib/acl/index.js +0 -39
  141. package/lib/acl/index.js.map +0 -1
  142. package/lib/acl/types.js +0 -6
  143. package/lib/acl/types.js.map +0 -1
  144. package/lib/chat/bookmarks.js +0 -303
  145. package/lib/chat/bookmarks.js.map +0 -1
  146. package/lib/chat/chatLogic.js +0 -420
  147. package/lib/chat/chatLogic.js.map +0 -1
  148. package/lib/chat/dateFolder.js +0 -328
  149. package/lib/chat/dateFolder.js.map +0 -1
  150. package/lib/chat/infinite.js +0 -994
  151. package/lib/chat/infinite.js.map +0 -1
  152. package/lib/chat/keys.js +0 -232
  153. package/lib/chat/keys.js.map +0 -1
  154. package/lib/chat/message.js +0 -715
  155. package/lib/chat/message.js.map +0 -1
  156. package/lib/chat/messageTools.js +0 -538
  157. package/lib/chat/messageTools.js.map +0 -1
  158. package/lib/chat/signature.js +0 -109
  159. package/lib/chat/signature.js.map +0 -1
  160. package/lib/chat/thread.js +0 -535
  161. package/lib/chat/thread.js.map +0 -1
  162. package/lib/create/create.js +0 -242
  163. package/lib/create/create.js.map +0 -1
  164. package/lib/create/index.js +0 -11
  165. package/lib/create/index.js.map +0 -1
  166. package/lib/create/types.js +0 -6
  167. package/lib/create/types.js.map +0 -1
  168. package/lib/debug.js +0 -30
  169. package/lib/debug.js.map +0 -1
  170. package/lib/folders.js +0 -132
  171. package/lib/folders.js.map +0 -1
  172. package/lib/footer/index.js +0 -123
  173. package/lib/footer/index.js.map +0 -1
  174. package/lib/header/empty-profile.js +0 -8
  175. package/lib/header/empty-profile.js.map +0 -1
  176. package/lib/header/index.js +0 -375
  177. package/lib/header/index.js.map +0 -1
  178. package/lib/iconBase.js +0 -44
  179. package/lib/iconBase.js.map +0 -1
  180. package/lib/icons/solid_logo.js.map +0 -1
  181. package/lib/index.d.ts.map +0 -1
  182. package/lib/index.js +0 -223
  183. package/lib/index.js.map +0 -1
  184. package/lib/log.js.map +0 -1
  185. package/lib/login/login.js +0 -1241
  186. package/lib/login/login.js.map +0 -1
  187. package/lib/matrix/index.js +0 -11
  188. package/lib/matrix/index.js.map +0 -1
  189. package/lib/matrix/matrix.js +0 -216
  190. package/lib/matrix/matrix.js.map +0 -1
  191. package/lib/matrix/types.js +0 -6
  192. package/lib/matrix/types.js.map +0 -1
  193. package/lib/media/index.js +0 -12
  194. package/lib/media/index.js.map +0 -1
  195. package/lib/media/media-capture.js +0 -194
  196. package/lib/media/media-capture.js.map +0 -1
  197. package/lib/messageArea.js +0 -319
  198. package/lib/messageArea.js.map +0 -1
  199. package/lib/noun_Camera_1618446_000000.js +0 -8
  200. package/lib/noun_Camera_1618446_000000.js.map +0 -1
  201. package/lib/ns.js +0 -17
  202. package/lib/ns.js.map +0 -1
  203. package/lib/pad.js +0 -805
  204. package/lib/pad.js.map +0 -1
  205. package/lib/participation.js +0 -219
  206. package/lib/participation.js.map +0 -1
  207. package/lib/preferences.js +0 -215
  208. package/lib/preferences.js.map +0 -1
  209. package/lib/signup/config-default.js +0 -43
  210. package/lib/signup/config-default.js.map +0 -1
  211. package/lib/signup/signup.js +0 -74
  212. package/lib/signup/signup.js.map +0 -1
  213. package/lib/stories/decorators.js +0 -10
  214. package/lib/stories/decorators.js.map +0 -1
  215. package/lib/style.js +0 -158
  216. package/lib/style.js.map +0 -1
  217. package/lib/styleConstants.js +0 -35
  218. package/lib/styleConstants.js.map +0 -1
  219. package/lib/style_multiSelect.js +0 -62
  220. package/lib/style_multiSelect.js.map +0 -1
  221. package/lib/table.js +0 -1573
  222. package/lib/table.js.map +0 -1
  223. package/lib/tabs.js +0 -448
  224. package/lib/tabs.js.map +0 -1
  225. package/lib/typings.d.js +0 -2
  226. package/lib/typings.d.js.map +0 -1
  227. package/lib/utils/headerFooterHelpers.js +0 -165
  228. package/lib/utils/headerFooterHelpers.js.map +0 -1
  229. package/lib/utils/index.js +0 -527
  230. package/lib/utils/index.js.map +0 -1
  231. package/lib/utils/keyHelpers/accessData.js +0 -131
  232. package/lib/utils/keyHelpers/accessData.js.map +0 -1
  233. package/lib/utils/keyHelpers/acl.js +0 -90
  234. package/lib/utils/keyHelpers/acl.js.map +0 -1
  235. package/lib/utils/keyHelpers/otherHelpers.js +0 -21
  236. package/lib/utils/keyHelpers/otherHelpers.js.map +0 -1
  237. package/lib/utils/label.js +0 -103
  238. package/lib/utils/label.js.map +0 -1
  239. package/lib/versionInfo.d.ts +0 -32
  240. package/lib/versionInfo.d.ts.map +0 -1
  241. package/lib/versionInfo.js +0 -37
  242. package/lib/versionInfo.js.map +0 -1
  243. package/lib/widgets/buttons/iconLinks.js +0 -53
  244. package/lib/widgets/buttons/iconLinks.js.map +0 -1
  245. package/lib/widgets/buttons.js +0 -1306
  246. package/lib/widgets/buttons.js.map +0 -1
  247. package/lib/widgets/dragAndDrop.js +0 -194
  248. package/lib/widgets/dragAndDrop.js.map +0 -1
  249. package/lib/widgets/error.js +0 -46
  250. package/lib/widgets/error.js.map +0 -1
  251. package/lib/widgets/forms/autocomplete/autocompleteBar.js +0 -271
  252. package/lib/widgets/forms/autocomplete/autocompleteBar.js.map +0 -1
  253. package/lib/widgets/forms/autocomplete/autocompleteField.js +0 -258
  254. package/lib/widgets/forms/autocomplete/autocompleteField.js.map +0 -1
  255. package/lib/widgets/forms/autocomplete/autocompletePicker.js +0 -436
  256. package/lib/widgets/forms/autocomplete/autocompletePicker.js.map +0 -1
  257. package/lib/widgets/forms/autocomplete/language.js +0 -189
  258. package/lib/widgets/forms/autocomplete/language.js.map +0 -1
  259. package/lib/widgets/forms/autocomplete/publicData.d.ts.map +0 -1
  260. package/lib/widgets/forms/autocomplete/publicData.js +0 -636
  261. package/lib/widgets/forms/autocomplete/publicData.js.map +0 -1
  262. package/lib/widgets/forms/basic.js +0 -254
  263. package/lib/widgets/forms/basic.js.map +0 -1
  264. package/lib/widgets/forms/comment.js +0 -54
  265. package/lib/widgets/forms/comment.js.map +0 -1
  266. package/lib/widgets/forms/fieldFunction.js +0 -52
  267. package/lib/widgets/forms/fieldFunction.js.map +0 -1
  268. package/lib/widgets/forms/fieldParams.js +0 -77
  269. package/lib/widgets/forms/fieldParams.js.map +0 -1
  270. package/lib/widgets/forms/formStyle.js +0 -44
  271. package/lib/widgets/forms/formStyle.js.map +0 -1
  272. package/lib/widgets/forms.js +0 -2045
  273. package/lib/widgets/forms.js.map +0 -1
  274. package/lib/widgets/index.js +0 -110
  275. package/lib/widgets/index.js.map +0 -1
  276. package/lib/widgets/multiSelect.js +0 -658
  277. package/lib/widgets/multiSelect.js.map +0 -1
  278. package/lib/widgets/peoplePicker.js +0 -467
  279. package/lib/widgets/peoplePicker.js.map +0 -1
  280. package/lib/widgets/widgetHelpers.js.map +0 -1
  281. /package/{lib → dist}/acl/access-controller.d.ts +0 -0
  282. /package/{lib → dist}/acl/access-controller.d.ts.map +0 -0
  283. /package/{lib → dist}/acl/access-groups.d.ts +0 -0
  284. /package/{lib → dist}/acl/access-groups.d.ts.map +0 -0
  285. /package/{lib → dist}/acl/acl-control.d.ts +0 -0
  286. /package/{lib → dist}/acl/acl-control.d.ts.map +0 -0
  287. /package/{lib → dist}/acl/acl.d.ts +0 -0
  288. /package/{lib → dist}/acl/acl.d.ts.map +0 -0
  289. /package/{lib → dist}/acl/add-agent-buttons.d.ts +0 -0
  290. /package/{lib → dist}/acl/add-agent-buttons.d.ts.map +0 -0
  291. /package/{lib → dist}/acl/index.d.ts +0 -0
  292. /package/{lib → dist}/acl/index.d.ts.map +0 -0
  293. /package/{lib → dist}/acl/types.d.ts +0 -0
  294. /package/{lib → dist}/acl/types.d.ts.map +0 -0
  295. /package/{lib → dist}/chat/signature.d.ts +0 -0
  296. /package/{lib → dist}/chat/signature.d.ts.map +0 -0
  297. /package/{lib → dist}/create/create.d.ts +0 -0
  298. /package/{lib → dist}/create/create.d.ts.map +0 -0
  299. /package/{lib → dist}/create/index.d.ts +0 -0
  300. /package/{lib → dist}/create/index.d.ts.map +0 -0
  301. /package/{lib → dist}/create/types.d.ts +0 -0
  302. /package/{lib → dist}/create/types.d.ts.map +0 -0
  303. /package/{lib → dist}/debug.d.ts +0 -0
  304. /package/{lib → dist}/debug.d.ts.map +0 -0
  305. /package/{lib → dist}/footer/index.d.ts +0 -0
  306. /package/{lib → dist}/footer/index.d.ts.map +0 -0
  307. /package/{lib → dist}/header/empty-profile.d.ts +0 -0
  308. /package/{lib → dist}/header/empty-profile.d.ts.map +0 -0
  309. /package/{lib → dist}/header/index.d.ts +0 -0
  310. /package/{lib → dist}/header/index.d.ts.map +0 -0
  311. /package/{lib → dist}/iconBase.d.ts +0 -0
  312. /package/{lib → dist}/iconBase.d.ts.map +0 -0
  313. /package/{lib → dist}/icons/solid_logo.d.ts +0 -0
  314. /package/{lib → dist}/icons/solid_logo.d.ts.map +0 -0
  315. /package/{lib → dist}/icons/solid_logo.js +0 -0
  316. /package/{lib → dist}/log.d.ts +0 -0
  317. /package/{lib → dist}/log.d.ts.map +0 -0
  318. /package/{lib → dist}/login/login.d.ts +0 -0
  319. /package/{lib → dist}/login/login.d.ts.map +0 -0
  320. /package/{lib → dist}/matrix/index.d.ts +0 -0
  321. /package/{lib → dist}/matrix/index.d.ts.map +0 -0
  322. /package/{lib → dist}/matrix/matrix.d.ts +0 -0
  323. /package/{lib → dist}/matrix/matrix.d.ts.map +0 -0
  324. /package/{lib → dist}/matrix/types.d.ts +0 -0
  325. /package/{lib → dist}/matrix/types.d.ts.map +0 -0
  326. /package/{lib → dist}/media/index.d.ts +0 -0
  327. /package/{lib → dist}/media/index.d.ts.map +0 -0
  328. /package/{lib → dist}/media/media-capture.d.ts +0 -0
  329. /package/{lib → dist}/media/media-capture.d.ts.map +0 -0
  330. /package/{lib → dist}/pad.d.ts +0 -0
  331. /package/{lib → dist}/pad.d.ts.map +0 -0
  332. /package/{lib → dist}/participation.d.ts +0 -0
  333. /package/{lib → dist}/participation.d.ts.map +0 -0
  334. /package/{lib → dist}/tabs.d.ts +0 -0
  335. /package/{lib → dist}/tabs.d.ts.map +0 -0
  336. /package/{lib → dist}/utils/headerFooterHelpers.d.ts +0 -0
  337. /package/{lib → dist}/utils/headerFooterHelpers.d.ts.map +0 -0
  338. /package/{lib → dist}/utils/keyHelpers/acl.d.ts +0 -0
  339. /package/{lib → dist}/utils/keyHelpers/acl.d.ts.map +0 -0
  340. /package/{lib → dist}/utils/label.d.ts +0 -0
  341. /package/{lib → dist}/utils/label.d.ts.map +0 -0
  342. /package/{lib → dist}/widgets/buttons/iconLinks.d.ts +0 -0
  343. /package/{lib → dist}/widgets/buttons/iconLinks.d.ts.map +0 -0
  344. /package/{lib → dist}/widgets/buttons.d.ts +0 -0
  345. /package/{lib → dist}/widgets/buttons.d.ts.map +0 -0
  346. /package/{lib → dist}/widgets/error.d.ts +0 -0
  347. /package/{lib → dist}/widgets/error.d.ts.map +0 -0
  348. /package/{lib → dist}/widgets/forms/autocomplete/autocompleteBar.d.ts +0 -0
  349. /package/{lib → dist}/widgets/forms/autocomplete/autocompleteBar.d.ts.map +0 -0
  350. /package/{lib → dist}/widgets/forms/autocomplete/autocompleteField.d.ts +0 -0
  351. /package/{lib → dist}/widgets/forms/autocomplete/autocompleteField.d.ts.map +0 -0
  352. /package/{lib → dist}/widgets/forms/autocomplete/autocompletePicker.d.ts +0 -0
  353. /package/{lib → dist}/widgets/forms/autocomplete/autocompletePicker.d.ts.map +0 -0
  354. /package/{lib → dist}/widgets/forms/autocomplete/language.d.ts +0 -0
  355. /package/{lib → dist}/widgets/forms/autocomplete/language.d.ts.map +0 -0
  356. /package/{lib → dist}/widgets/forms/basic.d.ts +0 -0
  357. /package/{lib → dist}/widgets/forms/basic.d.ts.map +0 -0
  358. /package/{lib → dist}/widgets/forms/comment.d.ts +0 -0
  359. /package/{lib → dist}/widgets/forms/comment.d.ts.map +0 -0
  360. /package/{lib → dist}/widgets/forms/fieldFunction.d.ts +0 -0
  361. /package/{lib → dist}/widgets/forms/fieldFunction.d.ts.map +0 -0
  362. /package/{lib → dist}/widgets/forms/fieldParams.d.ts +0 -0
  363. /package/{lib → dist}/widgets/forms/fieldParams.d.ts.map +0 -0
  364. /package/{lib → dist}/widgets/forms/formStyle.d.ts +0 -0
  365. /package/{lib → dist}/widgets/forms/formStyle.d.ts.map +0 -0
  366. /package/{lib → dist}/widgets/widgetHelpers.d.ts +0 -0
package/dist/pad.js ADDED
@@ -0,0 +1,795 @@
1
+ "use strict";
2
+ /** **************
3
+ * Notepad Widget
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.recordParticipation = exports.manageParticipation = exports.participationObject = exports.renderParticipants = void 0;
10
+ exports.lightColorHash = lightColorHash;
11
+ exports.notepad = notepad;
12
+ exports.getChunks = getChunks;
13
+ exports.xmlEncode = xmlEncode;
14
+ exports.notepadToHTML = notepadToHTML;
15
+ /** @module pad
16
+ */
17
+ const ns_1 = __importDefault(require("./ns"));
18
+ const rdflib_1 = require("rdflib");
19
+ const widgets_1 = require("./widgets");
20
+ const utils_1 = require("./utils");
21
+ const debug_1 = require("./debug");
22
+ const solid_logic_1 = require("solid-logic");
23
+ const style_1 = require("./style");
24
+ var participation_1 = require("./participation");
25
+ Object.defineProperty(exports, "renderParticipants", { enumerable: true, get: function () { return participation_1.renderParticipants; } });
26
+ Object.defineProperty(exports, "participationObject", { enumerable: true, get: function () { return participation_1.participationObject; } });
27
+ Object.defineProperty(exports, "manageParticipation", { enumerable: true, get: function () { return participation_1.manageParticipation; } });
28
+ Object.defineProperty(exports, "recordParticipation", { enumerable: true, get: function () { return participation_1.recordParticipation; } });
29
+ const store = solid_logic_1.solidLogicSingleton.store;
30
+ const PAD = (0, rdflib_1.Namespace)('http://www.w3.org/ns/pim/pad#');
31
+ /**
32
+ * @ignore
33
+ */
34
+ class NotepadElement extends HTMLElement {
35
+ subject;
36
+ }
37
+ /**
38
+ * @ignore
39
+ */
40
+ class NotepadPart extends HTMLElement {
41
+ subject;
42
+ value;
43
+ state;
44
+ lastSent;
45
+ }
46
+ /** Figure out a random color from my webid
47
+ *
48
+ * @param {NamedNode} author - The author of text being displayed
49
+ * @returns {String} The CSS color generated, constrained to be light for a background color
50
+ */
51
+ function lightColorHash(author) {
52
+ const hash = function (x) {
53
+ return x.split('').reduce(function (a, b) {
54
+ a = (a << 5) - a + b.charCodeAt(0);
55
+ return a & a;
56
+ }, 0);
57
+ };
58
+ return author && author.uri
59
+ ? '#' + ((hash(author.uri) & 0xffffff) | 0xc0c0c0).toString(16)
60
+ : '#ffffff'; // c0c0c0 forces pale
61
+ } // no id -> white
62
+ /** notepad
63
+ *
64
+ * @param {HTMLDocument} dom - the web page of the browser
65
+ * @param {NamedNode} padDoc - the document in which the participation should be shown
66
+ * @param {NamedNode} subject - the thing in which participation is happening
67
+ * @param {NamedNode} me - person who is logged into the pod
68
+ * @param {notepadOptions} options - the options that can be passed in consist of statusArea, exists
69
+ */
70
+ function notepad(dom, padDoc, subject, me, options) {
71
+ options = options || {};
72
+ const exists = options.exists;
73
+ const table = dom.createElement('table');
74
+ const kb = store;
75
+ if (me && !me.uri)
76
+ throw new Error('UI.pad.notepad: Invalid userid');
77
+ const updater = store.updater;
78
+ const PAD = (0, rdflib_1.Namespace)('http://www.w3.org/ns/pim/pad#');
79
+ table.setAttribute('style', style_1.style.notepadStyle);
80
+ let upstreamStatus = null;
81
+ let downstreamStatus = null;
82
+ if (options.statusArea) {
83
+ const t = options.statusArea.appendChild(dom.createElement('table'));
84
+ const tr = t.appendChild(dom.createElement('tr'));
85
+ upstreamStatus = tr.appendChild(dom.createElement('td'));
86
+ downstreamStatus = tr.appendChild(dom.createElement('td'));
87
+ if (upstreamStatus) {
88
+ upstreamStatus.setAttribute('style', style_1.style.upstreamStatus);
89
+ }
90
+ if (downstreamStatus) {
91
+ downstreamStatus.setAttribute('style', style_1.style.downstreamStatus);
92
+ }
93
+ }
94
+ /* @@ TODO want to look into this, it seems upstream should be a boolean and default to false ?
95
+ *
96
+ */
97
+ const complain = function (message, upstream = false) {
98
+ (0, debug_1.log)(message);
99
+ if (options.statusArea) {
100
+ ;
101
+ (upstream ? upstreamStatus : downstreamStatus).appendChild((0, widgets_1.errorMessageBlock)(dom, message, 'pink'));
102
+ }
103
+ };
104
+ // @@ TODO need to refactor so that we don't have to type cast
105
+ const clearStatus = function (_upsteam) {
106
+ if (options.statusArea) {
107
+ options.statusArea.innerHTML = '';
108
+ }
109
+ };
110
+ const setPartStyle = function (part, colors, pending) {
111
+ const chunk = part.subject;
112
+ colors = colors || '';
113
+ const baseStyle = style_1.style.baseStyle;
114
+ const headingCore = style_1.style.headingCore;
115
+ const headingStyle = style_1.style.headingStyle;
116
+ const author = kb.any(chunk, ns_1.default.dc('author'));
117
+ if (!colors && author) {
118
+ // Hash the user webid for now -- later allow user selection!
119
+ const bgcolor = lightColorHash(author);
120
+ colors =
121
+ 'color: ' +
122
+ (pending ? '#888' : 'black') +
123
+ '; background-color: ' +
124
+ bgcolor +
125
+ ';';
126
+ }
127
+ // @@ TODO Need to research when this can be an object with the indent stored in value
128
+ // and when the indent is stored as a Number itself, not in an object.
129
+ let indent = kb.any(chunk, PAD('indent'));
130
+ indent = indent ? indent.value : 0;
131
+ const localStyle = indent >= 0
132
+ ? baseStyle + 'text-indent: ' + indent * 3 + 'em;'
133
+ : headingCore + headingStyle[-1 - indent];
134
+ // ? baseStyle + 'padding-left: ' + (indent * 3) + 'em;'
135
+ part.setAttribute('style', localStyle + colors);
136
+ };
137
+ const removePart = function (part) {
138
+ const chunk = part.subject;
139
+ if (!chunk)
140
+ throw new Error('No chunk for line to be deleted!'); // just in case
141
+ const prev = kb.any(undefined, PAD('next'), chunk);
142
+ const next = kb.any(chunk, PAD('next'));
143
+ if (prev.sameTerm(subject) && next.sameTerm(subject)) {
144
+ // Last one
145
+ (0, debug_1.log)('You can\'t delete the only line.');
146
+ return;
147
+ }
148
+ const del = kb
149
+ .statementsMatching(chunk, undefined, undefined, padDoc)
150
+ .concat(kb.statementsMatching(undefined, undefined, chunk, padDoc));
151
+ const ins = [(0, rdflib_1.st)(prev, PAD('next'), next, padDoc)];
152
+ // @@ TODO what should we do if chunk is not a NamedNode should we
153
+ // assume then it is a string?
154
+ if (chunk instanceof rdflib_1.NamedNode) {
155
+ const label = chunk.uri.slice(-4);
156
+ (0, debug_1.log)('Deleting line ' + label);
157
+ }
158
+ if (!updater) {
159
+ throw new Error('have no updater');
160
+ }
161
+ // @@ TODO below you can see that before is redefined and not a boolean
162
+ updater.update(del, ins, function (uri, ok, errorMessage, response) {
163
+ if (ok) {
164
+ const row = part.parentNode;
165
+ if (row) {
166
+ const before = row.previousSibling;
167
+ if (row.parentNode) {
168
+ row.parentNode.removeChild(row);
169
+ }
170
+ // console.log(' deleted line ' + label + ' ok ' + part.value)
171
+ if (before && before.firstChild) {
172
+ // @@ TODO IMPORTANT FOCUS ISN'T A PROPERTY ON A CHILDNODE
173
+ before.firstChild.focus();
174
+ }
175
+ }
176
+ }
177
+ else if (response && response.status === 409) {
178
+ // Conflict
179
+ setPartStyle(part, 'color: black; background-color: #ffd;'); // yellow
180
+ part.state = 0; // Needs downstream refresh
181
+ (0, utils_1.beep)(0.5, 512); // Ooops clash with other person
182
+ setTimeout(function () {
183
+ // Ideally, beep! @@
184
+ reloadAndSync(); // Throw away our changes and
185
+ // updater.requestDownstreamAction(padDoc, reloadAndSync)
186
+ }, 1000);
187
+ }
188
+ else {
189
+ (0, debug_1.log)(' removePart FAILED ' + chunk + ': ' + errorMessage);
190
+ (0, debug_1.log)(' removePart was deleteing :\'' + del);
191
+ setPartStyle(part, 'color: black; background-color: #fdd;'); // failed
192
+ const res = response ? response.status : ' [no response field] ';
193
+ complain('Error ' + res + ' saving changes: ' + errorMessage.true); // upstream,
194
+ // updater.requestDownstreamAction(padDoc, reloadAndSync);
195
+ }
196
+ });
197
+ }; // removePart
198
+ const changeIndent = function (part, chunk, delta) {
199
+ const del = kb.statementsMatching(chunk, PAD('indent'));
200
+ const current = del.length ? Number(del[0].object.value) : 0;
201
+ if (current + delta < -3)
202
+ return; // limit negative indent
203
+ const newIndent = current + delta;
204
+ const ins = (0, rdflib_1.st)(chunk, PAD('indent'), newIndent, padDoc);
205
+ if (!updater) {
206
+ throw new Error('no updater');
207
+ }
208
+ updater.update(del, ins, function (uri, ok, errorBody) {
209
+ if (!ok) {
210
+ (0, debug_1.log)('Indent change FAILED \'' +
211
+ newIndent +
212
+ '\' for ' +
213
+ padDoc +
214
+ ': ' +
215
+ errorBody);
216
+ setPartStyle(part, 'color: black; background-color: #fdd;'); // failed
217
+ updater.requestDownstreamAction(padDoc, reloadAndSync);
218
+ }
219
+ else {
220
+ setPartStyle(part); // Implement the indent
221
+ }
222
+ });
223
+ };
224
+ const addListeners = function (part, chunk) {
225
+ part.addEventListener('keydown', function (event) {
226
+ if (!updater) {
227
+ throw new Error('no updater');
228
+ }
229
+ let queueProperty, queue;
230
+ // up 38; down 40; left 37; right 39 tab 9; shift 16; escape 27
231
+ switch (event.keyCode) {
232
+ case 13: // Return
233
+ {
234
+ const before = event.shiftKey;
235
+ (0, debug_1.log)('enter'); // Shift-return inserts before -- only way to add to top of pad.
236
+ if (before) {
237
+ queue = kb.any(undefined, PAD('next'), chunk);
238
+ queueProperty = 'newlinesAfter';
239
+ }
240
+ else {
241
+ queue = kb.any(chunk, PAD('next'));
242
+ queueProperty = 'newlinesBefore';
243
+ }
244
+ queue[queueProperty] = queue[queueProperty] || 0;
245
+ queue[queueProperty] += 1;
246
+ if (queue[queueProperty] > 1) {
247
+ (0, debug_1.log)(' queueing newline queue = ' + queue[queueProperty]);
248
+ return;
249
+ }
250
+ (0, debug_1.log)(' go ahead line before ' + queue[queueProperty]);
251
+ newChunk(part, before); // was document.activeElement
252
+ break;
253
+ }
254
+ case 8: // Delete
255
+ if (part.value.length === 0) {
256
+ (0, debug_1.log)('Delete key line ' + chunk.uri.slice(-4) + ' state ' + part.state);
257
+ switch (part.state) {
258
+ case 1: // contents being sent
259
+ case 2: // contents need to be sent again
260
+ part.state = 4; // delete me
261
+ return;
262
+ case 3: // already being deleted
263
+ case 4: // already deleted state
264
+ return;
265
+ case undefined:
266
+ case 0:
267
+ part.state = 3; // being deleted
268
+ removePart(part);
269
+ event.preventDefault();
270
+ break; // continue
271
+ default:
272
+ throw new Error('pad: Unexpected state ' + part);
273
+ }
274
+ }
275
+ break;
276
+ case 9: // Tab
277
+ {
278
+ const delta = event.shiftKey ? -1 : 1;
279
+ changeIndent(part, chunk, delta);
280
+ event.preventDefault(); // default is to highlight next field
281
+ break;
282
+ }
283
+ case 27: // ESC
284
+ (0, debug_1.log)('escape');
285
+ updater.requestDownstreamAction(padDoc, reloadAndSync);
286
+ event.preventDefault();
287
+ break;
288
+ case 38: // Up
289
+ if (part.parentNode.previousSibling) {
290
+ part.parentNode.previousSibling.firstChild.focus();
291
+ event.preventDefault();
292
+ }
293
+ break;
294
+ case 40: // Down
295
+ if (part.parentNode.nextSibling) {
296
+ part.parentNode.nextSibling.firstChild.focus();
297
+ event.preventDefault();
298
+ }
299
+ break;
300
+ default:
301
+ }
302
+ });
303
+ const updateStore = function (part) {
304
+ const chunk = part.subject;
305
+ setPartStyle(part, undefined, true);
306
+ const old = kb.any(chunk, ns_1.default.sioc('content')).value;
307
+ const del = [(0, rdflib_1.st)(chunk, ns_1.default.sioc('content'), old, padDoc)];
308
+ let ins;
309
+ if (part.value) {
310
+ ins = [(0, rdflib_1.st)(chunk, ns_1.default.sioc('content'), part.value, padDoc)];
311
+ }
312
+ const newOne = part.value;
313
+ // DEBUGGING ONLY
314
+ if (part.lastSent) {
315
+ if (old !== part.lastSent) {
316
+ throw new Error('Out of order, last sent expected \'' +
317
+ old +
318
+ '\' but found \'' +
319
+ part.lastSent +
320
+ '\'');
321
+ }
322
+ }
323
+ part.lastSent = newOne;
324
+ /* console.log(
325
+ ' Patch proposed to ' +
326
+ chunk.uri.slice(-4) +
327
+ " '" +
328
+ old +
329
+ "' -> '" +
330
+ newOne +
331
+ "' "
332
+ ) */
333
+ if (!updater) {
334
+ throw new Error('no updater');
335
+ }
336
+ updater.update(del, ins, function (uri, ok, errorBody, xhr) {
337
+ if (!ok) {
338
+ // alert("clash " + errorBody);
339
+ (0, debug_1.log)(' patch FAILED ' +
340
+ xhr.status +
341
+ ' for \'' +
342
+ old +
343
+ '\' -> \'' +
344
+ newOne +
345
+ '\': ' +
346
+ errorBody);
347
+ if (xhr.status === 409) {
348
+ // Conflict - @@ we assume someone else
349
+ setPartStyle(part, 'color: black; background-color: #fdd;');
350
+ part.state = 0; // Needs downstream refresh
351
+ (0, utils_1.beep)(0.5, 512); // Ooops clash with other person
352
+ setTimeout(function () {
353
+ updater.requestDownstreamAction(padDoc, reloadAndSync);
354
+ }, 1000);
355
+ }
356
+ else {
357
+ setPartStyle(part, 'color: black; background-color: #fdd;'); // failed pink
358
+ part.state = 0;
359
+ complain(' Error ' + xhr.status + ' sending data: ' + errorBody, true);
360
+ (0, utils_1.beep)(1.0, 128); // Other
361
+ // @@@ Do soemthing more serious with other errors eg auth, etc
362
+ }
363
+ }
364
+ else {
365
+ clearStatus(true); // upstream
366
+ setPartStyle(part); // synced
367
+ (0, debug_1.log)(' Patch ok \'' + old + '\' -> \'' + newOne + '\' ');
368
+ if (part.state === 4) {
369
+ // delete me
370
+ part.state = 3;
371
+ removePart(part);
372
+ }
373
+ else if (part.state === 3) {
374
+ // being deleted
375
+ // pass
376
+ }
377
+ else if (part.state === 2) {
378
+ part.state = 1; // pending: lock
379
+ updateStore(part);
380
+ }
381
+ else {
382
+ part.state = 0; // clear lock
383
+ }
384
+ }
385
+ });
386
+ };
387
+ part.addEventListener('input', function inputChangeListener(_event) {
388
+ // debug.log("input changed "+part.value);
389
+ setPartStyle(part, undefined, true); // grey out - not synced
390
+ (0, debug_1.log)('Input event state ' + part.state + ' value \'' + part.value + '\'');
391
+ switch (part.state) {
392
+ case 3: // being deleted
393
+ return;
394
+ case 4: // needs to be deleted
395
+ return;
396
+ case 2: // needs content updating, we know
397
+ return;
398
+ case 1:
399
+ part.state = 2; // lag we need another patch
400
+ return;
401
+ case 0:
402
+ case undefined:
403
+ part.state = 1; // being upadted
404
+ updateStore(part);
405
+ }
406
+ }); // listener
407
+ }; // addlisteners
408
+ // @@ TODO Need to research before as it appears to be used as an Element and a boolean
409
+ const newPartAfter = function (tr1, chunk, before) {
410
+ // @@ take chunk and add listeners
411
+ let text = kb.any(chunk, ns_1.default.sioc('content'));
412
+ text = text ? text.value : '';
413
+ const tr = dom.createElement('tr');
414
+ if (before) {
415
+ table.insertBefore(tr, tr1);
416
+ }
417
+ else {
418
+ // after
419
+ if (tr1 && tr1.nextSibling) {
420
+ table.insertBefore(tr, tr1.nextSibling);
421
+ }
422
+ else {
423
+ table.appendChild(tr);
424
+ }
425
+ }
426
+ const part = tr.appendChild(dom.createElement('input'));
427
+ part.subject = chunk;
428
+ part.setAttribute('type', 'text');
429
+ part.value = text;
430
+ if (me) {
431
+ setPartStyle(part, '');
432
+ addListeners(part, chunk);
433
+ }
434
+ else {
435
+ setPartStyle(part, 'color: #222; background-color: #fff');
436
+ (0, debug_1.log)('Note can\'t add listeners - not logged in');
437
+ }
438
+ return part;
439
+ };
440
+ /* @@ TODO we need to look at indent, it can be a Number or an Object this doesn't seem correct.
441
+ */
442
+ const newChunk = function (ele, before) {
443
+ // element of chunk being split
444
+ const kb = store;
445
+ let indent = 0;
446
+ let queueProperty = null;
447
+ let here, prev, next, queue, tr1;
448
+ if (ele) {
449
+ if (ele.tagName.toLowerCase() !== 'input') {
450
+ (0, debug_1.log)('return pressed when current document is: ' + ele.tagName);
451
+ }
452
+ here = ele.subject;
453
+ indent = kb.any(here, PAD('indent'));
454
+ indent = indent ? Number(indent.value) : 0;
455
+ if (before) {
456
+ prev = kb.any(undefined, PAD('next'), here);
457
+ next = here;
458
+ queue = prev;
459
+ queueProperty = 'newlinesAfter';
460
+ }
461
+ else {
462
+ prev = here;
463
+ next = kb.any(here, PAD('next'));
464
+ queue = next;
465
+ queueProperty = 'newlinesBefore';
466
+ }
467
+ tr1 = ele.parentNode;
468
+ }
469
+ else {
470
+ prev = subject;
471
+ next = subject;
472
+ tr1 = undefined;
473
+ }
474
+ const chunk = (0, widgets_1.newThing)(padDoc);
475
+ const label = chunk.uri.slice(-4);
476
+ const del = [(0, rdflib_1.st)(prev, PAD('next'), next, padDoc)];
477
+ const ins = [
478
+ (0, rdflib_1.st)(prev, PAD('next'), chunk, padDoc),
479
+ (0, rdflib_1.st)(chunk, PAD('next'), next, padDoc),
480
+ (0, rdflib_1.st)(chunk, ns_1.default.dc('author'), me, padDoc),
481
+ (0, rdflib_1.st)(chunk, ns_1.default.sioc('content'), '', padDoc)
482
+ ];
483
+ if (indent > 0) {
484
+ // Do not inherit
485
+ ins.push((0, rdflib_1.st)(chunk, PAD('indent'), indent, padDoc));
486
+ }
487
+ (0, debug_1.log)(' Fresh chunk ' + label + ' proposed');
488
+ if (!updater) {
489
+ throw new Error('no updater');
490
+ }
491
+ updater.update(del, ins, function (uri, ok, errorBody, _xhr) {
492
+ if (!ok) {
493
+ // alert("Error writing new line " + label + ": " + errorBody);
494
+ (0, debug_1.log)(' ERROR writing new line ' + label + ': ' + errorBody);
495
+ }
496
+ else {
497
+ const newPart = newPartAfter(tr1, chunk, before);
498
+ setPartStyle(newPart);
499
+ newPart.focus(); // Note this is delayed
500
+ if (queueProperty) {
501
+ (0, debug_1.log)(' Fresh chunk ' +
502
+ label +
503
+ ' updated, queue = ' +
504
+ queue[queueProperty]);
505
+ queue[queueProperty] -= 1;
506
+ if (queue[queueProperty] > 0) {
507
+ (0, debug_1.log)(' Implementing queued newlines = ' + next.newLinesBefore);
508
+ newChunk(newPart, before);
509
+ }
510
+ }
511
+ }
512
+ });
513
+ };
514
+ const consistencyCheck = function () {
515
+ const found = {};
516
+ let failed = 0;
517
+ function complain2(msg) {
518
+ complain(msg);
519
+ failed++;
520
+ }
521
+ if (!kb.the(subject, PAD('next'))) {
522
+ complain2('No initial next pointer');
523
+ return false; // can't do linked list
524
+ }
525
+ // var chunk = kb.the(subject, PAD('next'))
526
+ let prev = subject;
527
+ let chunk;
528
+ for (;;) {
529
+ chunk = kb.the(prev, PAD('next'));
530
+ if (!chunk) {
531
+ complain2('No next pointer from ' + prev);
532
+ }
533
+ if (chunk.sameTerm(subject)) {
534
+ break;
535
+ }
536
+ prev = chunk;
537
+ const label = chunk.uri.split('#')[1];
538
+ if (found[chunk.uri]) {
539
+ complain2('Loop!');
540
+ return false;
541
+ }
542
+ found[chunk.uri] = true;
543
+ let k = kb.each(chunk, PAD('next')).length;
544
+ if (k !== 1) {
545
+ complain2('Should be 1 not ' + k + ' next pointer for ' + label);
546
+ }
547
+ k = kb.each(chunk, PAD('indent')).length;
548
+ if (k > 1) {
549
+ complain2('Should be 0 or 1 not ' + k + ' indent for ' + label);
550
+ }
551
+ k = kb.each(chunk, ns_1.default.sioc('content')).length;
552
+ if (k !== 1) {
553
+ complain2('Should be 1 not ' + k + ' contents for ' + label);
554
+ }
555
+ k = kb.each(chunk, ns_1.default.dc('author')).length;
556
+ if (k !== 1) {
557
+ complain2('Should be 1 not ' + k + ' author for ' + label);
558
+ }
559
+ const sts = kb.statementsMatching(undefined, ns_1.default.sioc('contents'));
560
+ sts.forEach(function (st) {
561
+ if (!found[st.subject.value]) {
562
+ complain2('Loose chunk! ' + st.subject.value);
563
+ }
564
+ });
565
+ }
566
+ return !failed;
567
+ };
568
+ // Ensure that the display matches the current state of the
569
+ // @@ TODO really need to refactor this so that we don't need to cast types
570
+ const sync = function () {
571
+ // var first = kb.the(subject, PAD('next'))
572
+ if (kb.each(subject, PAD('next')).length !== 1) {
573
+ const msg = 'Pad: Inconsistent data - NEXT pointers: ' +
574
+ kb.each(subject, PAD('next')).length;
575
+ (0, debug_1.log)(msg);
576
+ if (options.statusArea) {
577
+ options.statusArea.textContent += msg;
578
+ }
579
+ return;
580
+ }
581
+ let row;
582
+ // First see which of the logical chunks have existing physical manifestations
583
+ const manif = [];
584
+ // Find which lines correspond to existing chunks
585
+ for (let chunk = kb.the(subject, PAD('next')); !chunk.sameTerm(subject); chunk = kb.the(chunk, PAD('next'))) {
586
+ for (let i = 0; i < table.children.length; i++) {
587
+ const tr = table.children[i];
588
+ if (tr.firstChild) {
589
+ if (tr.firstChild.subject.sameTerm(chunk)) {
590
+ manif[chunk.uri] = tr.firstChild;
591
+ }
592
+ }
593
+ }
594
+ }
595
+ // Remove any deleted lines
596
+ for (let i = table.children.length - 1; i >= 0; i--) {
597
+ row = table.children[i];
598
+ if (!manif[row.firstChild.subject.uri]) {
599
+ table.removeChild(row);
600
+ }
601
+ }
602
+ // Insert any new lines and update old ones
603
+ row = table.firstChild; // might be null
604
+ for (let chunk = kb.the(subject, PAD('next')); !chunk.sameTerm(subject); chunk = kb.the(chunk, PAD('next'))) {
605
+ const text = kb.any(chunk, ns_1.default.sioc('content')).value;
606
+ // superstitious -- don't mess with unchanged input fields
607
+ // which may be selected by the user
608
+ if (row && manif[chunk.uri]) {
609
+ const part = row.firstChild;
610
+ if (text !== part.value) {
611
+ part.value = text;
612
+ }
613
+ setPartStyle(part);
614
+ part.state = 0; // Clear the state machine
615
+ delete part.lastSent; // DEBUG ONLY
616
+ row = row.nextSibling;
617
+ }
618
+ else {
619
+ newPartAfter(row, chunk, true); // actually before
620
+ }
621
+ }
622
+ };
623
+ // Refresh the DOM tree
624
+ const refreshTree = function (root) {
625
+ if (root.refresh) {
626
+ root.refresh();
627
+ return;
628
+ }
629
+ for (let i = 0; i < root.children.length; i++) {
630
+ refreshTree(root.children[i]);
631
+ }
632
+ };
633
+ let reloading = false;
634
+ const checkAndSync = function () {
635
+ (0, debug_1.log)(' reloaded OK');
636
+ clearStatus();
637
+ if (!consistencyCheck()) {
638
+ complain('CONSISTENCY CHECK FAILED');
639
+ }
640
+ else {
641
+ refreshTree(table);
642
+ }
643
+ };
644
+ const reloadAndSync = function () {
645
+ if (reloading) {
646
+ (0, debug_1.log)(' Already reloading - stop');
647
+ return; // once only needed
648
+ }
649
+ reloading = true;
650
+ let retryTimeout = 1000; // ms
651
+ const tryReload = function () {
652
+ (0, debug_1.log)('try reload - timeout = ' + retryTimeout);
653
+ if (!updater) {
654
+ throw new Error('no updater');
655
+ }
656
+ updater.reload(updater.store, padDoc, function (ok, message, xhr) {
657
+ reloading = false;
658
+ if (ok) {
659
+ checkAndSync();
660
+ }
661
+ else {
662
+ if (xhr.status === 0) {
663
+ complain('Network error refreshing the pad. Retrying in ' +
664
+ retryTimeout / 1000);
665
+ reloading = true;
666
+ retryTimeout = retryTimeout * 2;
667
+ setTimeout(tryReload, retryTimeout);
668
+ }
669
+ else {
670
+ complain('Error ' +
671
+ xhr.status +
672
+ 'refreshing the pad:' +
673
+ message +
674
+ '. Stopped. ' +
675
+ padDoc);
676
+ }
677
+ }
678
+ });
679
+ };
680
+ tryReload();
681
+ };
682
+ table.refresh = sync; // Catch downward propagating refresh events
683
+ table.reloadAndSync = reloadAndSync;
684
+ if (!me)
685
+ (0, debug_1.log)('Warning: must be logged in for pad to be edited');
686
+ if (exists) {
687
+ (0, debug_1.log)('Existing pad.');
688
+ if (consistencyCheck()) {
689
+ sync();
690
+ if (kb.holds(subject, PAD('next'), subject)) {
691
+ // Empty list untenable
692
+ newChunk(); // require at least one line
693
+ }
694
+ }
695
+ else {
696
+ (0, debug_1.log)((table.textContent = 'Inconsistent data. Abort'));
697
+ }
698
+ }
699
+ else {
700
+ // Make new pad
701
+ (0, debug_1.log)('No pad exists - making new one.');
702
+ const insertables = [
703
+ (0, rdflib_1.st)(subject, ns_1.default.rdf('type'), PAD('Notepad'), padDoc),
704
+ (0, rdflib_1.st)(subject, ns_1.default.dc('author'), me, padDoc),
705
+ (0, rdflib_1.st)(subject, ns_1.default.dc('created'), new Date(), padDoc),
706
+ (0, rdflib_1.st)(subject, PAD('next'), subject, padDoc)
707
+ ];
708
+ if (!updater) {
709
+ throw new Error('no updater');
710
+ }
711
+ updater.update([], insertables, function (uri, ok, errorBody) {
712
+ if (!ok) {
713
+ complain(errorBody || '');
714
+ }
715
+ else {
716
+ (0, debug_1.log)('Initial pad created');
717
+ newChunk(); // Add a first chunck
718
+ // getResults();
719
+ }
720
+ });
721
+ }
722
+ return table;
723
+ }
724
+ /**
725
+ * Get the chunks of the notepad
726
+ * They are stored in a RDF linked list
727
+ */
728
+ // @ignore exporting this only for the unit test
729
+ function getChunks(subject, kb) {
730
+ const chunks = [];
731
+ for (let chunk = kb.the(subject, PAD('next')); !chunk.sameTerm(subject); chunk = kb.the(chunk, PAD('next'))) {
732
+ chunks.push(chunk);
733
+ }
734
+ return chunks;
735
+ }
736
+ /**
737
+ * Encode content to be put in XML or HTML elements
738
+ */
739
+ // @ignore exporting this only for the unit test
740
+ function xmlEncode(str) {
741
+ return str.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;');
742
+ }
743
+ /**
744
+ * Convert a notepad to HTML
745
+ * @param { } pad - the notepad
746
+ * @param {store} pad - the data store
747
+ */
748
+ function notepadToHTML(pad, kb) {
749
+ const chunks = getChunks(pad, kb);
750
+ let html = '<html>\n <head>\n';
751
+ const title = kb.anyValue(pad, ns_1.default.dct('title'));
752
+ if (title) {
753
+ html += ` <title>${xmlEncode(title)}</title>\n`;
754
+ }
755
+ html += ' </head>\n <body>\n';
756
+ let level = 0;
757
+ function increaseLevel(indent) {
758
+ for (; level < indent; level++) {
759
+ html += '<ul>\n';
760
+ }
761
+ }
762
+ function decreaseLevel(indent) {
763
+ for (; level > indent; level--) {
764
+ html += '</ul>\n';
765
+ }
766
+ }
767
+ chunks.forEach(chunk => {
768
+ const indent = kb.anyJS(chunk, PAD('indent'));
769
+ const rawContent = kb.anyJS(chunk, ns_1.default.sioc('content'));
770
+ if (!rawContent)
771
+ return; // seed chunk is dummy
772
+ const content = xmlEncode(rawContent);
773
+ if (indent < 0) { // negative indent levels represent heading levels
774
+ decreaseLevel(0);
775
+ const h = indent >= -3 ? 4 + indent : 1; // -1 -> h4, -2 -> h3
776
+ html += `\n<h${h}>${content}</h${h}>\n`;
777
+ }
778
+ else { // >= 0
779
+ if (indent > 0) { // Lists
780
+ decreaseLevel(indent);
781
+ increaseLevel(indent);
782
+ html += `<li>${content}</li>\n`;
783
+ }
784
+ else { // indent 0
785
+ decreaseLevel(indent);
786
+ html += `<p>${content}</p>\n`;
787
+ }
788
+ }
789
+ }); // foreach chunk
790
+ // At the end decreaseLevel any open ULs
791
+ decreaseLevel(0);
792
+ html += ' </body>\n</html>\n';
793
+ return html;
794
+ }
795
+ //# sourceMappingURL=pad.js.map