solid-ui 2.6.1-e5ad2945 → 2.6.1-e78cbe5

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 (369) hide show
  1. package/LICENSE.md +3 -1
  2. package/README.md +85 -26
  3. package/dist/acl/access-controller.js +238 -0
  4. package/dist/acl/access-controller.js.map +1 -0
  5. package/{lib → dist}/acl/access-groups.d.ts +2 -2
  6. package/{lib → dist}/acl/access-groups.d.ts.map +1 -1
  7. package/dist/acl/access-groups.js +323 -0
  8. package/dist/acl/access-groups.js.map +1 -0
  9. package/dist/acl/acl-control.js +173 -0
  10. package/dist/acl/acl-control.js.map +1 -0
  11. package/dist/acl/acl.js +495 -0
  12. package/dist/acl/acl.js.map +1 -0
  13. package/dist/acl/add-agent-buttons.js +217 -0
  14. package/dist/acl/add-agent-buttons.js.map +1 -0
  15. package/dist/acl/index.js +32 -0
  16. package/dist/acl/index.js.map +1 -0
  17. package/dist/acl/types.js +6 -0
  18. package/dist/acl/types.js.map +1 -0
  19. package/dist/chat/keys.js +106 -0
  20. package/dist/chat/keys.js.map +1 -0
  21. package/dist/chat/signature.js +63 -0
  22. package/dist/chat/signature.js.map +1 -0
  23. package/dist/create/create.js +249 -0
  24. package/dist/create/create.js.map +1 -0
  25. package/dist/create/index.js +5 -0
  26. package/dist/create/index.js.map +1 -0
  27. package/dist/create/types.js +2 -0
  28. package/dist/create/types.js.map +1 -0
  29. package/dist/debug.d.ts.map +1 -0
  30. package/dist/debug.js +13 -0
  31. package/dist/debug.js.map +1 -0
  32. package/dist/footer/index.js +67 -0
  33. package/dist/footer/index.js.map +1 -0
  34. package/dist/header/empty-profile.js +11 -0
  35. package/dist/header/empty-profile.js.map +1 -0
  36. package/dist/header/index.js +260 -0
  37. package/dist/header/index.js.map +1 -0
  38. package/dist/iconBase.js +37 -0
  39. package/dist/iconBase.js.map +1 -0
  40. package/dist/icons/solid_logo.js.map +1 -0
  41. package/{lib → dist}/index.d.ts +7 -9
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +102 -0
  44. package/dist/index.js.map +1 -0
  45. package/{lib → dist}/log.d.ts.map +1 -1
  46. package/dist/log.js +182 -0
  47. package/dist/log.js.map +1 -0
  48. package/dist/login/login.js +858 -0
  49. package/dist/login/login.js.map +1 -0
  50. package/dist/matrix/index.js +5 -0
  51. package/dist/matrix/index.js.map +1 -0
  52. package/dist/matrix/matrix.js +217 -0
  53. package/dist/matrix/matrix.js.map +1 -0
  54. package/dist/matrix/types.js +2 -0
  55. package/dist/matrix/types.js.map +1 -0
  56. package/dist/media/index.js +6 -0
  57. package/dist/media/index.js.map +1 -0
  58. package/dist/media/media-capture.js +161 -0
  59. package/dist/media/media-capture.js.map +1 -0
  60. package/dist/pad.js +775 -0
  61. package/dist/pad.js.map +1 -0
  62. package/{lib → dist}/participation.d.ts.map +1 -1
  63. package/dist/participation.js +184 -0
  64. package/dist/participation.js.map +1 -0
  65. package/dist/solid-ui.esm.js +25531 -0
  66. package/dist/solid-ui.esm.js.map +1 -0
  67. package/dist/solid-ui.esm.min.js +43 -0
  68. package/dist/solid-ui.esm.min.js.map +1 -0
  69. package/dist/solid-ui.js +23479 -68931
  70. package/dist/solid-ui.js.map +1 -1
  71. package/dist/solid-ui.min.js +40 -2
  72. package/dist/solid-ui.min.js.map +1 -1
  73. package/dist/tabs.js +388 -0
  74. package/dist/tabs.js.map +1 -0
  75. package/{lib → dist}/utils/headerFooterHelpers.d.ts.map +1 -1
  76. package/dist/utils/headerFooterHelpers.js +114 -0
  77. package/dist/utils/headerFooterHelpers.js.map +1 -0
  78. package/dist/utils/keyHelpers/accessData.js +64 -0
  79. package/dist/utils/keyHelpers/accessData.js.map +1 -0
  80. package/dist/utils/keyHelpers/acl.js +74 -0
  81. package/dist/utils/keyHelpers/acl.js.map +1 -0
  82. package/dist/utils/keyHelpers/otherHelpers.js +13 -0
  83. package/dist/utils/keyHelpers/otherHelpers.js.map +1 -0
  84. package/dist/utils/label.js +111 -0
  85. package/dist/utils/label.js.map +1 -0
  86. package/dist/versionInfo.js +31 -0
  87. package/dist/versionInfo.js.map +1 -0
  88. package/dist/widgets/buttons/iconLinks.js +44 -0
  89. package/dist/widgets/buttons/iconLinks.js.map +1 -0
  90. package/dist/widgets/buttons.js +1280 -0
  91. package/dist/widgets/buttons.js.map +1 -0
  92. package/dist/widgets/error.d.ts +14 -0
  93. package/dist/widgets/error.d.ts.map +1 -0
  94. package/dist/widgets/error.js +35 -0
  95. package/dist/widgets/error.js.map +1 -0
  96. package/dist/widgets/forms/autocomplete/autocompleteBar.js +123 -0
  97. package/dist/widgets/forms/autocomplete/autocompleteBar.js.map +1 -0
  98. package/dist/widgets/forms/autocomplete/autocompleteField.js +199 -0
  99. package/dist/widgets/forms/autocomplete/autocompleteField.js.map +1 -0
  100. package/dist/widgets/forms/autocomplete/autocompletePicker.js +256 -0
  101. package/dist/widgets/forms/autocomplete/autocompletePicker.js.map +1 -0
  102. package/dist/widgets/forms/autocomplete/language.js +104 -0
  103. package/dist/widgets/forms/autocomplete/language.js.map +1 -0
  104. package/dist/widgets/forms/autocomplete/publicData.js +460 -0
  105. package/dist/widgets/forms/autocomplete/publicData.js.map +1 -0
  106. package/dist/widgets/forms/basic.js +241 -0
  107. package/dist/widgets/forms/basic.js.map +1 -0
  108. package/dist/widgets/forms/comment.js +46 -0
  109. package/dist/widgets/forms/comment.js.map +1 -0
  110. package/dist/widgets/forms/fieldFunction.js +44 -0
  111. package/dist/widgets/forms/fieldFunction.js.map +1 -0
  112. package/dist/widgets/forms/fieldParams.js +89 -0
  113. package/dist/widgets/forms/fieldParams.js.map +1 -0
  114. package/{lib → dist}/widgets/forms/formStyle.d.ts.map +1 -1
  115. package/dist/widgets/forms/formStyle.js +36 -0
  116. package/dist/widgets/forms/formStyle.js.map +1 -0
  117. package/{lib → dist}/widgets/widgetHelpers.d.ts.map +1 -1
  118. package/{lib → dist}/widgets/widgetHelpers.js +14 -25
  119. package/dist/widgets/widgetHelpers.js.map +1 -0
  120. package/package.json +48 -52
  121. package/dist/789.solid-ui.min.js +0 -1
  122. package/dist/841.solid-ui.min.js +0 -3
  123. package/dist/841.solid-ui.min.js.LICENSE.txt +0 -58
  124. package/dist/841.solid-ui.min.js.map +0 -1
  125. package/dist/_2b19.solid-ui.js +0 -14
  126. package/dist/_2b19.solid-ui.js.map +0 -1
  127. package/dist/index.html +0 -1
  128. package/dist/solid-ui.min.js.LICENSE.txt +0 -57
  129. package/dist/vendors-node_modules_jsonld_lib_jsonld_js.solid-ui.js +0 -12247
  130. package/dist/vendors-node_modules_jsonld_lib_jsonld_js.solid-ui.js.map +0 -1
  131. package/lib/acl/access-controller.js +0 -391
  132. package/lib/acl/access-controller.js.map +0 -1
  133. package/lib/acl/access-groups.js +0 -507
  134. package/lib/acl/access-groups.js.map +0 -1
  135. package/lib/acl/acl-control.js +0 -237
  136. package/lib/acl/acl-control.js.map +0 -1
  137. package/lib/acl/acl.js +0 -517
  138. package/lib/acl/acl.js.map +0 -1
  139. package/lib/acl/add-agent-buttons.js +0 -434
  140. package/lib/acl/add-agent-buttons.js.map +0 -1
  141. package/lib/acl/index.js +0 -39
  142. package/lib/acl/index.js.map +0 -1
  143. package/lib/acl/types.js +0 -6
  144. package/lib/acl/types.js.map +0 -1
  145. package/lib/chat/bookmarks.js +0 -303
  146. package/lib/chat/bookmarks.js.map +0 -1
  147. package/lib/chat/chatLogic.js +0 -420
  148. package/lib/chat/chatLogic.js.map +0 -1
  149. package/lib/chat/dateFolder.js +0 -328
  150. package/lib/chat/dateFolder.js.map +0 -1
  151. package/lib/chat/infinite.js +0 -994
  152. package/lib/chat/infinite.js.map +0 -1
  153. package/lib/chat/keys.js +0 -232
  154. package/lib/chat/keys.js.map +0 -1
  155. package/lib/chat/message.js +0 -715
  156. package/lib/chat/message.js.map +0 -1
  157. package/lib/chat/messageTools.js +0 -538
  158. package/lib/chat/messageTools.js.map +0 -1
  159. package/lib/chat/signature.js +0 -109
  160. package/lib/chat/signature.js.map +0 -1
  161. package/lib/chat/thread.js +0 -535
  162. package/lib/chat/thread.js.map +0 -1
  163. package/lib/create/create.js +0 -242
  164. package/lib/create/create.js.map +0 -1
  165. package/lib/create/index.js +0 -11
  166. package/lib/create/index.js.map +0 -1
  167. package/lib/create/types.js +0 -6
  168. package/lib/create/types.js.map +0 -1
  169. package/lib/debug.d.ts.map +0 -1
  170. package/lib/debug.js +0 -30
  171. package/lib/debug.js.map +0 -1
  172. package/lib/folders.js +0 -132
  173. package/lib/folders.js.map +0 -1
  174. package/lib/footer/index.js +0 -123
  175. package/lib/footer/index.js.map +0 -1
  176. package/lib/header/empty-profile.js +0 -8
  177. package/lib/header/empty-profile.js.map +0 -1
  178. package/lib/header/index.js +0 -375
  179. package/lib/header/index.js.map +0 -1
  180. package/lib/iconBase.js +0 -44
  181. package/lib/iconBase.js.map +0 -1
  182. package/lib/icons/solid_logo.js.map +0 -1
  183. package/lib/index.d.ts.map +0 -1
  184. package/lib/index.js +0 -223
  185. package/lib/index.js.map +0 -1
  186. package/lib/log.js +0 -213
  187. package/lib/log.js.map +0 -1
  188. package/lib/login/login.js +0 -1241
  189. package/lib/login/login.js.map +0 -1
  190. package/lib/matrix/index.js +0 -11
  191. package/lib/matrix/index.js.map +0 -1
  192. package/lib/matrix/matrix.js +0 -216
  193. package/lib/matrix/matrix.js.map +0 -1
  194. package/lib/matrix/types.js +0 -6
  195. package/lib/matrix/types.js.map +0 -1
  196. package/lib/media/index.js +0 -12
  197. package/lib/media/index.js.map +0 -1
  198. package/lib/media/media-capture.js +0 -194
  199. package/lib/media/media-capture.js.map +0 -1
  200. package/lib/messageArea.js +0 -319
  201. package/lib/messageArea.js.map +0 -1
  202. package/lib/noun_Camera_1618446_000000.js +0 -8
  203. package/lib/noun_Camera_1618446_000000.js.map +0 -1
  204. package/lib/ns.js +0 -17
  205. package/lib/ns.js.map +0 -1
  206. package/lib/pad.js +0 -805
  207. package/lib/pad.js.map +0 -1
  208. package/lib/participation.js +0 -219
  209. package/lib/participation.js.map +0 -1
  210. package/lib/preferences.js +0 -215
  211. package/lib/preferences.js.map +0 -1
  212. package/lib/signup/config-default.js +0 -43
  213. package/lib/signup/config-default.js.map +0 -1
  214. package/lib/signup/signup.js +0 -74
  215. package/lib/signup/signup.js.map +0 -1
  216. package/lib/stories/decorators.js +0 -10
  217. package/lib/stories/decorators.js.map +0 -1
  218. package/lib/style.js +0 -158
  219. package/lib/style.js.map +0 -1
  220. package/lib/styleConstants.js +0 -35
  221. package/lib/styleConstants.js.map +0 -1
  222. package/lib/style_multiSelect.js +0 -62
  223. package/lib/style_multiSelect.js.map +0 -1
  224. package/lib/table.js +0 -1573
  225. package/lib/table.js.map +0 -1
  226. package/lib/tabs.js +0 -448
  227. package/lib/tabs.js.map +0 -1
  228. package/lib/typings.d.js +0 -2
  229. package/lib/typings.d.js.map +0 -1
  230. package/lib/utils/headerFooterHelpers.js +0 -165
  231. package/lib/utils/headerFooterHelpers.js.map +0 -1
  232. package/lib/utils/index.js +0 -527
  233. package/lib/utils/index.js.map +0 -1
  234. package/lib/utils/keyHelpers/accessData.js +0 -131
  235. package/lib/utils/keyHelpers/accessData.js.map +0 -1
  236. package/lib/utils/keyHelpers/acl.js +0 -90
  237. package/lib/utils/keyHelpers/acl.js.map +0 -1
  238. package/lib/utils/keyHelpers/otherHelpers.js +0 -21
  239. package/lib/utils/keyHelpers/otherHelpers.js.map +0 -1
  240. package/lib/utils/label.js +0 -103
  241. package/lib/utils/label.js.map +0 -1
  242. package/lib/versionInfo.d.ts +0 -32
  243. package/lib/versionInfo.d.ts.map +0 -1
  244. package/lib/versionInfo.js +0 -37
  245. package/lib/versionInfo.js.map +0 -1
  246. package/lib/widgets/buttons/iconLinks.js +0 -53
  247. package/lib/widgets/buttons/iconLinks.js.map +0 -1
  248. package/lib/widgets/buttons.js +0 -1306
  249. package/lib/widgets/buttons.js.map +0 -1
  250. package/lib/widgets/dragAndDrop.js +0 -194
  251. package/lib/widgets/dragAndDrop.js.map +0 -1
  252. package/lib/widgets/error.d.ts +0 -2
  253. package/lib/widgets/error.d.ts.map +0 -1
  254. package/lib/widgets/error.js +0 -46
  255. package/lib/widgets/error.js.map +0 -1
  256. package/lib/widgets/forms/autocomplete/autocompleteBar.js +0 -271
  257. package/lib/widgets/forms/autocomplete/autocompleteBar.js.map +0 -1
  258. package/lib/widgets/forms/autocomplete/autocompleteField.js +0 -258
  259. package/lib/widgets/forms/autocomplete/autocompleteField.js.map +0 -1
  260. package/lib/widgets/forms/autocomplete/autocompletePicker.js +0 -436
  261. package/lib/widgets/forms/autocomplete/autocompletePicker.js.map +0 -1
  262. package/lib/widgets/forms/autocomplete/language.js +0 -189
  263. package/lib/widgets/forms/autocomplete/language.js.map +0 -1
  264. package/lib/widgets/forms/autocomplete/publicData.js +0 -636
  265. package/lib/widgets/forms/autocomplete/publicData.js.map +0 -1
  266. package/lib/widgets/forms/basic.js +0 -254
  267. package/lib/widgets/forms/basic.js.map +0 -1
  268. package/lib/widgets/forms/comment.js +0 -54
  269. package/lib/widgets/forms/comment.js.map +0 -1
  270. package/lib/widgets/forms/fieldFunction.js +0 -52
  271. package/lib/widgets/forms/fieldFunction.js.map +0 -1
  272. package/lib/widgets/forms/fieldParams.js +0 -77
  273. package/lib/widgets/forms/fieldParams.js.map +0 -1
  274. package/lib/widgets/forms/formStyle.js +0 -44
  275. package/lib/widgets/forms/formStyle.js.map +0 -1
  276. package/lib/widgets/forms.js +0 -2045
  277. package/lib/widgets/forms.js.map +0 -1
  278. package/lib/widgets/index.js +0 -110
  279. package/lib/widgets/index.js.map +0 -1
  280. package/lib/widgets/multiSelect.js +0 -658
  281. package/lib/widgets/multiSelect.js.map +0 -1
  282. package/lib/widgets/peoplePicker.js +0 -467
  283. package/lib/widgets/peoplePicker.js.map +0 -1
  284. package/lib/widgets/widgetHelpers.js.map +0 -1
  285. /package/{lib → dist}/acl/access-controller.d.ts +0 -0
  286. /package/{lib → dist}/acl/access-controller.d.ts.map +0 -0
  287. /package/{lib → dist}/acl/acl-control.d.ts +0 -0
  288. /package/{lib → dist}/acl/acl-control.d.ts.map +0 -0
  289. /package/{lib → dist}/acl/acl.d.ts +0 -0
  290. /package/{lib → dist}/acl/acl.d.ts.map +0 -0
  291. /package/{lib → dist}/acl/add-agent-buttons.d.ts +0 -0
  292. /package/{lib → dist}/acl/add-agent-buttons.d.ts.map +0 -0
  293. /package/{lib → dist}/acl/index.d.ts +0 -0
  294. /package/{lib → dist}/acl/index.d.ts.map +0 -0
  295. /package/{lib → dist}/acl/types.d.ts +0 -0
  296. /package/{lib → dist}/acl/types.d.ts.map +0 -0
  297. /package/{lib → dist}/chat/keys.d.ts +0 -0
  298. /package/{lib → dist}/chat/keys.d.ts.map +0 -0
  299. /package/{lib → dist}/chat/signature.d.ts +0 -0
  300. /package/{lib → dist}/chat/signature.d.ts.map +0 -0
  301. /package/{lib → dist}/create/create.d.ts +0 -0
  302. /package/{lib → dist}/create/create.d.ts.map +0 -0
  303. /package/{lib → dist}/create/index.d.ts +0 -0
  304. /package/{lib → dist}/create/index.d.ts.map +0 -0
  305. /package/{lib → dist}/create/types.d.ts +0 -0
  306. /package/{lib → dist}/create/types.d.ts.map +0 -0
  307. /package/{lib → dist}/debug.d.ts +0 -0
  308. /package/{lib → dist}/footer/index.d.ts +0 -0
  309. /package/{lib → dist}/footer/index.d.ts.map +0 -0
  310. /package/{lib → dist}/header/empty-profile.d.ts +0 -0
  311. /package/{lib → dist}/header/empty-profile.d.ts.map +0 -0
  312. /package/{lib → dist}/header/index.d.ts +0 -0
  313. /package/{lib → dist}/header/index.d.ts.map +0 -0
  314. /package/{lib → dist}/iconBase.d.ts +0 -0
  315. /package/{lib → dist}/iconBase.d.ts.map +0 -0
  316. /package/{lib → dist}/icons/solid_logo.d.ts +0 -0
  317. /package/{lib → dist}/icons/solid_logo.d.ts.map +0 -0
  318. /package/{lib → dist}/icons/solid_logo.js +0 -0
  319. /package/{lib → dist}/log.d.ts +0 -0
  320. /package/{lib → dist}/login/login.d.ts +0 -0
  321. /package/{lib → dist}/login/login.d.ts.map +0 -0
  322. /package/{lib → dist}/matrix/index.d.ts +0 -0
  323. /package/{lib → dist}/matrix/index.d.ts.map +0 -0
  324. /package/{lib → dist}/matrix/matrix.d.ts +0 -0
  325. /package/{lib → dist}/matrix/matrix.d.ts.map +0 -0
  326. /package/{lib → dist}/matrix/types.d.ts +0 -0
  327. /package/{lib → dist}/matrix/types.d.ts.map +0 -0
  328. /package/{lib → dist}/media/index.d.ts +0 -0
  329. /package/{lib → dist}/media/index.d.ts.map +0 -0
  330. /package/{lib → dist}/media/media-capture.d.ts +0 -0
  331. /package/{lib → dist}/media/media-capture.d.ts.map +0 -0
  332. /package/{lib → dist}/pad.d.ts +0 -0
  333. /package/{lib → dist}/pad.d.ts.map +0 -0
  334. /package/{lib → dist}/participation.d.ts +0 -0
  335. /package/{lib → dist}/tabs.d.ts +0 -0
  336. /package/{lib → dist}/tabs.d.ts.map +0 -0
  337. /package/{lib → dist}/utils/headerFooterHelpers.d.ts +0 -0
  338. /package/{lib → dist}/utils/keyHelpers/accessData.d.ts +0 -0
  339. /package/{lib → dist}/utils/keyHelpers/accessData.d.ts.map +0 -0
  340. /package/{lib → dist}/utils/keyHelpers/acl.d.ts +0 -0
  341. /package/{lib → dist}/utils/keyHelpers/acl.d.ts.map +0 -0
  342. /package/{lib → dist}/utils/keyHelpers/otherHelpers.d.ts +0 -0
  343. /package/{lib → dist}/utils/keyHelpers/otherHelpers.d.ts.map +0 -0
  344. /package/{lib → dist}/utils/label.d.ts +0 -0
  345. /package/{lib → dist}/utils/label.d.ts.map +0 -0
  346. /package/{lib → dist}/widgets/buttons/iconLinks.d.ts +0 -0
  347. /package/{lib → dist}/widgets/buttons/iconLinks.d.ts.map +0 -0
  348. /package/{lib → dist}/widgets/buttons.d.ts +0 -0
  349. /package/{lib → dist}/widgets/buttons.d.ts.map +0 -0
  350. /package/{lib → dist}/widgets/forms/autocomplete/autocompleteBar.d.ts +0 -0
  351. /package/{lib → dist}/widgets/forms/autocomplete/autocompleteBar.d.ts.map +0 -0
  352. /package/{lib → dist}/widgets/forms/autocomplete/autocompleteField.d.ts +0 -0
  353. /package/{lib → dist}/widgets/forms/autocomplete/autocompleteField.d.ts.map +0 -0
  354. /package/{lib → dist}/widgets/forms/autocomplete/autocompletePicker.d.ts +0 -0
  355. /package/{lib → dist}/widgets/forms/autocomplete/autocompletePicker.d.ts.map +0 -0
  356. /package/{lib → dist}/widgets/forms/autocomplete/language.d.ts +0 -0
  357. /package/{lib → dist}/widgets/forms/autocomplete/language.d.ts.map +0 -0
  358. /package/{lib → dist}/widgets/forms/autocomplete/publicData.d.ts +0 -0
  359. /package/{lib → dist}/widgets/forms/autocomplete/publicData.d.ts.map +0 -0
  360. /package/{lib → dist}/widgets/forms/basic.d.ts +0 -0
  361. /package/{lib → dist}/widgets/forms/basic.d.ts.map +0 -0
  362. /package/{lib → dist}/widgets/forms/comment.d.ts +0 -0
  363. /package/{lib → dist}/widgets/forms/comment.d.ts.map +0 -0
  364. /package/{lib → dist}/widgets/forms/fieldFunction.d.ts +0 -0
  365. /package/{lib → dist}/widgets/forms/fieldFunction.d.ts.map +0 -0
  366. /package/{lib → dist}/widgets/forms/fieldParams.d.ts +0 -0
  367. /package/{lib → dist}/widgets/forms/fieldParams.d.ts.map +0 -0
  368. /package/{lib → dist}/widgets/forms/formStyle.d.ts +0 -0
  369. /package/{lib → dist}/widgets/widgetHelpers.d.ts +0 -0
@@ -1,2045 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof = require("@babel/runtime/helpers/typeof");
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.appendForm = appendForm;
9
- Object.defineProperty(exports, "basicField", {
10
- enumerable: true,
11
- get: function get() {
12
- return _basic.basicField;
13
- }
14
- });
15
- exports.buildCheckboxForm = buildCheckboxForm;
16
- exports.editFormButton = editFormButton;
17
- Object.defineProperty(exports, "field", {
18
- enumerable: true,
19
- get: function get() {
20
- return _fieldFunction.field;
21
- }
22
- });
23
- Object.defineProperty(exports, "fieldFunction", {
24
- enumerable: true,
25
- get: function get() {
26
- return _fieldFunction.fieldFunction;
27
- }
28
- });
29
- Object.defineProperty(exports, "fieldLabel", {
30
- enumerable: true,
31
- get: function get() {
32
- return _basic.fieldLabel;
33
- }
34
- });
35
- Object.defineProperty(exports, "fieldParams", {
36
- enumerable: true,
37
- get: function get() {
38
- return _fieldParams.fieldParams;
39
- }
40
- });
41
- Object.defineProperty(exports, "fieldStore", {
42
- enumerable: true,
43
- get: function get() {
44
- return _basic.fieldStore;
45
- }
46
- });
47
- exports.findClosest = findClosest;
48
- exports.formsFor = formsFor;
49
- exports.makeDescription = makeDescription;
50
- exports.makeSelectForCategory = makeSelectForCategory;
51
- exports.makeSelectForChoice = makeSelectForChoice;
52
- exports.makeSelectForClassifierOptions = makeSelectForClassifierOptions;
53
- exports.makeSelectForNestedCategory = makeSelectForNestedCategory;
54
- exports.makeSelectForOptions = makeSelectForOptions;
55
- Object.defineProperty(exports, "mostSpecificClassURI", {
56
- enumerable: true,
57
- get: function get() {
58
- return _fieldFunction.mostSpecificClassURI;
59
- }
60
- });
61
- exports.newButton = newButton;
62
- exports.newThing = newThing;
63
- exports.promptForNew = promptForNew;
64
- exports.propertiesForClass = propertiesForClass;
65
- Object.defineProperty(exports, "renderNameValuePair", {
66
- enumerable: true,
67
- get: function get() {
68
- return _basic.renderNameValuePair;
69
- }
70
- });
71
- exports.sortByLabel = sortByLabel;
72
- exports.sortBySequence = sortBySequence;
73
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
74
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
75
- var buttons = _interopRequireWildcard(require("./buttons"));
76
- var _fieldParams = require("./forms/fieldParams");
77
- var _fieldFunction = require("./forms/fieldFunction");
78
- var _formStyle = require("./forms/formStyle");
79
- var debug = _interopRequireWildcard(require("../debug"));
80
- var _error = require("./error");
81
- var _basic = require("./forms/basic");
82
- var _autocompleteField = require("./forms/autocomplete/autocompleteField");
83
- var style = _interopRequireWildcard(require("../style"));
84
- var _styleConstants = _interopRequireDefault(require("../styleConstants"));
85
- var _iconBase = require("../iconBase");
86
- var log = _interopRequireWildcard(require("../log"));
87
- var ns = _interopRequireWildcard(require("../ns"));
88
- var $rdf = _interopRequireWildcard(require("rdflib"));
89
- var _solidLogic = require("solid-logic");
90
- var utils = _interopRequireWildcard(require("../utils"));
91
- var _multiSelect = require("./multiSelect");
92
- var widgets = _interopRequireWildcard(require("../widgets"));
93
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t3 in e) "default" !== _t3 && {}.hasOwnProperty.call(e, _t3) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t3)) && (i.get || i.set) ? o(f, _t3, i) : f[_t3] = e[_t3]); return f; })(e, t); }
94
- function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
95
- function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
96
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } /* F O R M S
97
- *
98
- * A Vanilla Dom implementation of the form language
99
- */ /* global alert */ // Note default export
100
- var checkMarkCharacter = "\u2713";
101
- var cancelCharacter = "\u2715";
102
- var dashCharacter = '-';
103
- var kb = _solidLogic.store;
104
- _fieldFunction.field[ns.ui('AutocompleteField').uri] = _autocompleteField.autocompleteField;
105
-
106
- // ///////////////////////////////////////////////////////////////////////
107
-
108
- /* Form Field implementations
109
- **
110
- */
111
- /** Group of different fields
112
- **
113
- ** One type of form field is an ordered Group of other fields.
114
- ** A Form is actually just the same as a group.
115
- **
116
- ** @param {Document} dom The HTML Document object aka Document Object Model
117
- ** @param {Element?} container If present, the created widget will be appended to this
118
- ** @param {Map} already A hash table of (form, subject) kept to prevent recursive forms looping
119
- ** @param {Node} subject The thing about which the form displays/edits data
120
- ** @param {Node} form The form or field to be rendered
121
- ** @param {Node} dataDoc The web document in which the data is
122
- ** @param {function(ok, errorMessage)} callbackFunction Called when data is changed?
123
- **
124
- ** @returns {Element} The HTML widget created
125
- */
126
- function refreshOpionsSubfieldinGroup(dom, already, subject, dataDoc, callbackFunction, groupDiv, subfields) {
127
- var eles = groupDiv.children;
128
- for (var j = 0; j < subfields.length; j++) {
129
- // This is really messy.
130
- var _field = subfields[j];
131
- var t = (0, _fieldFunction.mostSpecificClassURI)(_field); // Field type
132
- if (t === ns.ui('Options').uri) {
133
- var optionsRender = (0, _fieldFunction.fieldFunction)(dom, _field);
134
- var newOne = optionsRender(dom, null, already, subject, _field, dataDoc, callbackFunction);
135
- debug.log('Refreshing Options field by replacing it.'); // better to support actual refresh
136
- groupDiv.insertBefore(newOne, eles[j]);
137
- groupDiv.removeChild(eles[j + 1]); // Remove the old one
138
- }
139
- }
140
- }
141
- _fieldFunction.field[ns.ui('Form').uri] = _fieldFunction.field[ns.ui('Group').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
142
- var box = dom.createElement('div');
143
- var ui = ns.ui;
144
- if (container) container.appendChild(box);
145
-
146
- // Prevent loops
147
- if (!form) return;
148
- var key = subject.toNT() + '|' + form.toNT();
149
- if (already[key]) {
150
- // been there done that
151
- box.appendChild(dom.createTextNode('Group: see above ' + key));
152
- // TODO fix dependency cycle to solid-panes by calling outlineManager
153
- // const plist = [$rdf.st(subject, ns.owl('sameAs'), subject)] // @@ need prev subject
154
- // dom.outlineManager.appendPropertyTRs(box, plist)
155
- // dom.appendChild(plist)
156
- return box;
157
- }
158
- var already2 = {};
159
- for (var x in already) already2[x] = 1;
160
- already2[key] = 1;
161
- var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
162
- var weight0 = kb.any(form, ui('weight'), null, formDoc); // Say 0-3
163
- var weight = weight0 ? Number(weight0.value) : 1;
164
- if (weight > 3 || weight < 0) return box.appendChild((0, _error.errorMessageBlock)(dom, "Form Group weight ".concat(weight, " should be 0-3")));
165
- box.setAttribute('style', style.formGroupStyle[weight]); // Indent a group
166
- box.style.display = 'flex';
167
- box.style.flexDirection = 'column';
168
- box["class"] = 'form-weight-' + weight;
169
- var parts = kb.any(form, ui('parts'), null, formDoc);
170
- var subfields;
171
- if (parts) {
172
- subfields = parts.elements;
173
- } else {
174
- parts = kb.each(form, ui('part'), null, formDoc); // Warning: unordered
175
- subfields = sortBySequence(parts);
176
- }
177
- if (!parts) {
178
- return box.appendChild((0, _error.errorMessageBlock)(dom, 'No parts to form! '));
179
- }
180
- for (var i = 0; i < subfields.length; i++) {
181
- var _field2 = subfields[i];
182
- var subFieldFunction = (0, _fieldFunction.fieldFunction)(dom, _field2); //
183
-
184
- var itemChanged = function itemChanged(ok, body) {
185
- if (ok && body && body.widget && body.widget === 'select') {
186
- refreshOpionsSubfieldinGroup(dom, already, subject, dataDoc, callbackFunction, box, subfields);
187
- }
188
- callbackFunction(ok, {
189
- widget: 'group',
190
- change: body
191
- });
192
- };
193
- box.appendChild(subFieldFunction(dom, null, already2, subject, _field2, dataDoc, itemChanged));
194
- }
195
- return box;
196
- };
197
-
198
- /** Options field: Select one or more cases
199
- **
200
- ** @param {Document} dom The HTML Document object aka Document Object Model
201
- ** @param {Element?} container If present, the created widget will be appended to this
202
- ** @param {Map} already A hash table of (form, subject) kept to prevent recursive forms looping
203
- ** @param {Node} subject The thing about which the form displays/edits data
204
- ** @param {Node} form The form or field to be rendered
205
- ** @param {Node} dataDoc The web document in which the data is
206
- ** @param {function(ok, errorMessage)} callbackFunction Called when data is changed?
207
- **
208
- ** @returns {Element} The HTML widget created
209
- */
210
-
211
- _fieldFunction.field[ns.ui('Options').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
212
- var kb = _solidLogic.store;
213
- var box = dom.createElement('div');
214
- var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
215
-
216
- var ui = ns.ui;
217
- if (container) container.appendChild(box);
218
- var dependingOn = kb.any(form, ui('dependingOn'));
219
- if (!dependingOn) {
220
- dependingOn = ns.rdf('type');
221
- } // @@ default to type (do we want defaults?)
222
- var cases = kb.each(form, ui('case'), null, formDoc);
223
- if (!cases) {
224
- box.appendChild((0, _error.errorMessageBlock)(dom, 'No cases to Options form. '));
225
- }
226
- var values;
227
- if (dependingOn.sameTerm(ns.rdf('type'))) {
228
- values = Object.keys(kb.findTypeURIs(subject)).map(function (uri) {
229
- return $rdf.sym(uri);
230
- }); // Use RDF-S inference
231
- } else {
232
- values = kb.each(subject, dependingOn);
233
- }
234
- for (var i = 0; i < cases.length; i++) {
235
- var c = cases[i];
236
- var tests = kb.each(c, ui('for'), null, formDoc); // There can be multiple 'for'
237
- var match = false;
238
- for (var j = 0; j < tests.length; j++) {
239
- var _iterator = _createForOfIteratorHelper(values),
240
- _step;
241
- try {
242
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
243
- var value = _step.value;
244
- var test = tests[j];
245
- if (value.sameTerm(tests) || value.termType === test.termType && value.value === test.value) {
246
- match = true;
247
- }
248
- }
249
- } catch (err) {
250
- _iterator.e(err);
251
- } finally {
252
- _iterator.f();
253
- }
254
- }
255
- if (match) {
256
- var _field3 = kb.the(c, ui('use'));
257
- if (!_field3) {
258
- box.appendChild((0, _error.errorMessageBlock)(dom, 'No "use" part for case in form ' + form));
259
- return box;
260
- } else {
261
- appendForm(dom, box, already, subject, _field3, dataDoc, callbackFunction);
262
- }
263
- break;
264
- }
265
- }
266
- // @@ Add box.refresh() to sync fields with values
267
- return box;
268
- };
269
-
270
- /** Multiple field: zero or more similar subFields
271
- **
272
- ** @param {Document} dom The HTML Document object aka Document Object Model
273
- ** @param {Element?} container If present, the created widget will be appended to this
274
- ** @param {Map} already A hash table of (form, subject) kept to prevent recursive forms looping
275
- ** @param {Node} subject The thing about which the form displays/edits data
276
- ** @param {Node} form The form or field to be rendered
277
- ** @param {Node} dataDoc The web document in which the data is
278
- ** @param {function(ok, errorMessage)} callbackFunction Called when data is changed?
279
- **
280
- ** @returns {Element} The HTML widget created
281
- **
282
- ** Form properties:
283
- ** @param {Boolean} reverse Make e reverse arc in the data OPS not SPO
284
- ** @param {NamedNode} property The property to be written in the data
285
- ** @param {Boolean} ordered Is the list an ordered one where the user defined the order
286
- */
287
- _fieldFunction.field[ns.ui('Multiple').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
288
- /** Diagnostic function
289
- */
290
- function debugString(values) {
291
- return values.map(function (x) {
292
- return x.toString().slice(-7);
293
- }).join(', ');
294
- }
295
-
296
- /** Add an item to the local quadstore not the UI or the web
297
- *
298
- * @param {Node} object The RDF object to be represented by this item.
299
- */
300
- function addItem() {
301
- return _addItem.apply(this, arguments);
302
- }
303
- /** Make a dom representation for an item
304
- * @param {Event} anyEvent if used as an event handler
305
- * @param {Node} object The RDF object to be represented by this item.
306
- */
307
- function _addItem() {
308
- _addItem = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
309
- var object, toBeInserted, msg, _t;
310
- return _regenerator["default"].wrap(function (_context6) {
311
- while (1) switch (_context6.prev = _context6.next) {
312
- case 0:
313
- object = newThing(dataDoc); // by default just add new nodes
314
- if (!ordered) {
315
- _context6.next = 2;
316
- break;
317
- }
318
- createListIfNecessary(); // Sets list and unsavedList
319
- list.elements.push(object);
320
- _context6.next = 1;
321
- return saveListThenRefresh();
322
- case 1:
323
- _context6.next = 7;
324
- break;
325
- case 2:
326
- toBeInserted = reverse ? [$rdf.st(object, property, subject, dataDoc)] : [$rdf.st(subject, property, object, dataDoc)];
327
- _context6.prev = 3;
328
- _context6.next = 4;
329
- return kb.updater.update([], toBeInserted);
330
- case 4:
331
- _context6.next = 6;
332
- break;
333
- case 5:
334
- _context6.prev = 5;
335
- _t = _context6["catch"](3);
336
- msg = 'Error adding to unordered multiple: ' + _t;
337
- box.appendChild((0, _error.errorMessageBlock)(dom, msg));
338
- debug.error(msg);
339
- case 6:
340
- refresh();
341
- case 7:
342
- case "end":
343
- return _context6.stop();
344
- }
345
- }, _callee6, null, [[3, 5]]);
346
- }));
347
- return _addItem.apply(this, arguments);
348
- }
349
- function renderItem(object) {
350
- function deleteThisItem() {
351
- return _deleteThisItem.apply(this, arguments);
352
- }
353
- /** Move the object up or down in the ordered list
354
- * @param {Event} anyEvent if used as an event handler
355
- * @param {Boolean} upwards Move this up (true) or down (false).
356
- */
357
- function _deleteThisItem() {
358
- _deleteThisItem = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
359
- var i, del;
360
- return _regenerator["default"].wrap(function (_context3) {
361
- while (1) switch (_context3.prev = _context3.next) {
362
- case 0:
363
- if (!ordered) {
364
- _context3.next = 5;
365
- break;
366
- }
367
- debug.log('pre delete: ' + debugString(list.elements));
368
- i = 0;
369
- case 1:
370
- if (!(i < list.elements.length)) {
371
- _context3.next = 4;
372
- break;
373
- }
374
- if (!list.elements[i].sameTerm(object)) {
375
- _context3.next = 3;
376
- break;
377
- }
378
- list.elements.splice(i, 1);
379
- _context3.next = 2;
380
- return saveListThenRefresh();
381
- case 2:
382
- return _context3.abrupt("return");
383
- case 3:
384
- i++;
385
- _context3.next = 1;
386
- break;
387
- case 4:
388
- _context3.next = 6;
389
- break;
390
- case 5:
391
- // unordered
392
- if (kb.holds(subject, property, object, dataDoc)) {
393
- del = [$rdf.st(subject, property, object, dataDoc)];
394
- kb.updater.update(del, [], function (uri, ok, message) {
395
- if (ok) {
396
- body.removeChild(subField);
397
- } else {
398
- body.appendChild((0, _error.errorMessageBlock)(dom, 'Multiple: delete failed: ' + message));
399
- }
400
- });
401
- }
402
- case 6:
403
- case "end":
404
- return _context3.stop();
405
- }
406
- }, _callee3);
407
- }));
408
- return _deleteThisItem.apply(this, arguments);
409
- }
410
- function moveThisItem(_x, _x2) {
411
- return _moveThisItem.apply(this, arguments);
412
- }
413
- /* A subField has been filled in
414
- *
415
- * One possibility is to not actually make the link to the thing until
416
- * this callback happens to avoid widow links
417
- */
418
- function _moveThisItem() {
419
- _moveThisItem = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4(event, upwards) {
420
- var i;
421
- return _regenerator["default"].wrap(function (_context4) {
422
- while (1) switch (_context4.prev = _context4.next) {
423
- case 0:
424
- // @@ possibly, allow shift+click to do move to top or bottom?
425
- debug.log('pre move: ' + debugString(list.elements));
426
- i = 0;
427
- case 1:
428
- if (!(i < list.elements.length)) {
429
- _context4.next = 3;
430
- break;
431
- }
432
- if (!list.elements[i].sameTerm(object)) {
433
- _context4.next = 2;
434
- break;
435
- }
436
- return _context4.abrupt("continue", 3);
437
- case 2:
438
- i++;
439
- _context4.next = 1;
440
- break;
441
- case 3:
442
- if (i === list.elements.length) {
443
- alert('list move: not found element for ' + object);
444
- }
445
- if (!upwards) {
446
- _context4.next = 5;
447
- break;
448
- }
449
- if (!(i === 0)) {
450
- _context4.next = 4;
451
- break;
452
- }
453
- alert('@@ boop - already at top -temp message'); // @@ make boop sound
454
- return _context4.abrupt("return");
455
- case 4:
456
- list.elements.splice(i - 1, 2, list.elements[i], list.elements[i - 1]);
457
- _context4.next = 7;
458
- break;
459
- case 5:
460
- if (!(i === list.elements.length - 1)) {
461
- _context4.next = 6;
462
- break;
463
- }
464
- alert('@@ boop - already at bottom -temp message'); // @@ make boop sound
465
- return _context4.abrupt("return");
466
- case 6:
467
- list.elements.splice(i, 2, list.elements[i + 1], list.elements[i]);
468
- case 7:
469
- _context4.next = 8;
470
- return saveListThenRefresh();
471
- case 8:
472
- case "end":
473
- return _context4.stop();
474
- }
475
- }, _callee4);
476
- }));
477
- return _moveThisItem.apply(this, arguments);
478
- }
479
- function itemDone(ok, message) {
480
- debug.log("Item done callback for item ".concat(object.toString()));
481
- if (!ok) {
482
- // when does this happen? errors typically deal with upstream
483
- debug.error(' Item done callback: Error: ' + message);
484
- }
485
- callbackFunction(ok, message);
486
- }
487
- log.debug('Multiple: render object: ' + object);
488
- var fn = (0, _fieldFunction.fieldFunction)(dom, element);
489
- var subField = fn(dom, null, already, object, element, dataDoc, itemDone); // subfields was: body. moving to not passing that
490
- subField.subject = object; // Keep a back pointer between the DOM array and the RDF objects
491
-
492
- // delete button and move buttons
493
- if (kb.updater.editable(dataDoc.uri)) {
494
- buttons.deleteButtonWithCheck(dom, subField, multipleUIlabel, deleteThisItem);
495
- if (ordered) {
496
- // Add controsl in a frame
497
- var frame = dom.createElement('div');
498
- frame.style.display = 'grid';
499
- frame.style.gridTemplateColumns = 'auto 3em';
500
- frame.style.gridTemplateRows = '50% 50%';
501
- var moveUpButton = buttons.button(dom, _iconBase.icons.iconBase + 'noun_1369237.svg', 'Move Up', /*#__PURE__*/function () {
502
- var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(event) {
503
- return _regenerator["default"].wrap(function (_context) {
504
- while (1) switch (_context.prev = _context.next) {
505
- case 0:
506
- return _context.abrupt("return", moveThisItem(event, true));
507
- case 1:
508
- case "end":
509
- return _context.stop();
510
- }
511
- }, _callee);
512
- }));
513
- return function (_x3) {
514
- return _ref.apply(this, arguments);
515
- };
516
- }());
517
- var moveDownButton = buttons.button(dom, _iconBase.icons.iconBase + 'noun_1369241.svg', 'Move Down', /*#__PURE__*/function () {
518
- var _ref2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(event) {
519
- return _regenerator["default"].wrap(function (_context2) {
520
- while (1) switch (_context2.prev = _context2.next) {
521
- case 0:
522
- return _context2.abrupt("return", moveThisItem(event, false));
523
- case 1:
524
- case "end":
525
- return _context2.stop();
526
- }
527
- }, _callee2);
528
- }));
529
- return function (_x4) {
530
- return _ref2.apply(this, arguments);
531
- };
532
- }());
533
- var _shim = dom.createElement('div');
534
- _shim.appendChild(subField); // Subfield has its own layout
535
- frame.appendChild(_shim);
536
- frame.appendChild(moveUpButton);
537
- frame.appendChild(moveDownButton);
538
- moveUpButton.style.gridColumn = 2;
539
- moveDownButton.style.gridColumn = 2;
540
- moveUpButton.style.gridRow = 1;
541
- moveDownButton.style.padding = '0em'; // don't take too much space
542
- moveUpButton.style.padding = '0em';
543
- moveDownButton.style.gridRow = 2;
544
- _shim.style.gridColumn = 1;
545
- _shim.style.gridRowStart = 'span 2'; // Cover both rows
546
- // shim.style.gridRowEnd = 2 // Cover both rows
547
- return frame;
548
- }
549
- }
550
- return subField; // unused
551
- } // renderItem
552
-
553
- /// ///////// Body of Multiple form field implementation
554
-
555
- var plusIconURI = _iconBase.icons.iconBase + 'noun_19460_green.svg'; // white plus in green circle
556
-
557
- var kb = _solidLogic.store;
558
- var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
559
-
560
- var box = dom.createElement('div');
561
- var shim = box; // no shim
562
- // We don't indent multiple as it is a sort of a prefix of the next field and has contents of one.
563
- // box.setAttribute('style', 'padding-left: 2em; border: 0.05em solid green;') // Indent a multiple
564
- var ui = ns.ui;
565
- if (container) container.appendChild(box);
566
- var orderedNode = kb.any(form, ui('ordered'));
567
- var ordered = orderedNode ? $rdf.Node.toJS(orderedNode) : false;
568
- var property = kb.any(form, ui('property'));
569
- var reverse = kb.anyJS(form, ui('reverse'), null, formDoc);
570
- if (!property) {
571
- box.appendChild((0, _error.errorMessageBlock)(dom, 'No property to multiple: ' + form)); // used for arcs in the data
572
- return shim;
573
- }
574
- var multipleUIlabel = kb.any(form, ui('label'));
575
- if (!multipleUIlabel) multipleUIlabel = utils.label(property);
576
- var min = kb.any(form, ui('min')); // This is the minimum number -- default 0
577
- min = min ? 0 + min.value : 0;
578
- var element = kb.any(form, ui('part')); // This is the form to use for each one
579
- if (!element) {
580
- box.appendChild((0, _error.errorMessageBlock)(dom, 'No part to multiple: ' + form));
581
- return shim;
582
- }
583
- var body = box.appendChild(dom.createElement('div'));
584
- body.style.display = 'flex';
585
- body.style.flexDirection = 'column';
586
- var list; // The RDF collection which keeps the ordered version or null
587
- var values; // Initial values - always an array. Even when no list yet.
588
- values = reverse ? kb.any(null, property, subject, dataDoc) : kb.any(subject, property, null, dataDoc);
589
- if (ordered) {
590
- list = reverse ? kb.any(null, property, subject, dataDoc) : kb.any(subject, property, null, dataDoc);
591
- if (list) {
592
- values = list.elements;
593
- } else {
594
- values = [];
595
- }
596
- } else {
597
- values = reverse ? kb.each(null, property, subject, dataDoc) : kb.each(subject, property, null, dataDoc);
598
- list = null;
599
- }
600
- // Add control on the bottom for adding more items
601
- if (kb.updater.editable(dataDoc.uri)) {
602
- var tail = box.appendChild(dom.createElement('div'));
603
- tail.style.padding = '0.5em';
604
- var img = tail.appendChild(dom.createElement('img'));
605
- img.setAttribute('src', plusIconURI); // plus sign
606
- img.setAttribute('style', 'margin: 0.2em; width: 1.5em; height:1.5em');
607
- img.title = 'Click to add another ' + multipleUIlabel;
608
- var prompt = dom.createElement('span');
609
- prompt.textContent = (values.length === 0 ? 'Add another ' : 'Add ') + multipleUIlabel;
610
- tail.addEventListener('click', /*#__PURE__*/function () {
611
- var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5(_eventNotUsed) {
612
- return _regenerator["default"].wrap(function (_context5) {
613
- while (1) switch (_context5.prev = _context5.next) {
614
- case 0:
615
- _context5.next = 1;
616
- return addItem();
617
- case 1:
618
- case "end":
619
- return _context5.stop();
620
- }
621
- }, _callee5);
622
- }));
623
- return function (_x5) {
624
- return _ref3.apply(this, arguments);
625
- };
626
- }(), true);
627
- tail.appendChild(prompt);
628
- }
629
- function createListIfNecessary() {
630
- if (!list) {
631
- list = new $rdf.Collection();
632
- if (reverse) {
633
- kb.add(list, property, subject, dataDoc);
634
- } else {
635
- kb.add(subject, property, list, dataDoc);
636
- }
637
- }
638
- }
639
- function saveListThenRefresh() {
640
- return _saveListThenRefresh.apply(this, arguments);
641
- }
642
- function _saveListThenRefresh() {
643
- _saveListThenRefresh = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
644
- var _t2;
645
- return _regenerator["default"].wrap(function (_context7) {
646
- while (1) switch (_context7.prev = _context7.next) {
647
- case 0:
648
- debug.log('save list: ' + debugString(list.elements)); // 20191214
649
-
650
- createListIfNecessary();
651
- _context7.prev = 1;
652
- _context7.next = 2;
653
- return kb.fetcher.putBack(dataDoc);
654
- case 2:
655
- _context7.next = 4;
656
- break;
657
- case 3:
658
- _context7.prev = 3;
659
- _t2 = _context7["catch"](1);
660
- box.appendChild((0, _error.errorMessageBlock)(dom, 'Error trying to put back a list: ' + _t2));
661
- return _context7.abrupt("return");
662
- case 4:
663
- refresh();
664
- case 5:
665
- case "end":
666
- return _context7.stop();
667
- }
668
- }, _callee7, null, [[1, 3]]);
669
- }));
670
- return _saveListThenRefresh.apply(this, arguments);
671
- }
672
- function refresh() {
673
- var vals;
674
- if (ordered) {
675
- var li = reverse ? kb.the(null, property, subject, dataDoc) : kb.the(subject, property, null, dataDoc);
676
- vals = li ? li.elements : [];
677
- } else {
678
- vals = reverse ? kb.each(null, property, subject, dataDoc) : kb.each(subject, property, null, dataDoc);
679
- vals.sort(); // achieve consistency on each refresh
680
- }
681
- utils.syncTableToArrayReOrdered(body, vals, renderItem);
682
- }
683
- body.refresh = refresh; // Allow live update
684
- refresh();
685
- function asyncStuff() {
686
- return _asyncStuff.apply(this, arguments);
687
- }
688
- function _asyncStuff() {
689
- _asyncStuff = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
690
- var extra, j;
691
- return _regenerator["default"].wrap(function (_context8) {
692
- while (1) switch (_context8.prev = _context8.next) {
693
- case 0:
694
- extra = min - values.length;
695
- if (!(extra > 0)) {
696
- _context8.next = 4;
697
- break;
698
- }
699
- j = 0;
700
- case 1:
701
- if (!(j < extra)) {
702
- _context8.next = 3;
703
- break;
704
- }
705
- debug.log('Adding extra: min ' + min);
706
- _context8.next = 2;
707
- return addItem();
708
- case 2:
709
- j++;
710
- _context8.next = 1;
711
- break;
712
- case 3:
713
- _context8.next = 4;
714
- return saveListThenRefresh();
715
- case 4:
716
- case "end":
717
- return _context8.stop();
718
- }
719
- }, _callee8);
720
- }));
721
- return _asyncStuff.apply(this, arguments);
722
- }
723
- asyncStuff().then(function () {
724
- debug.log(' Multiple render: async stuff ok');
725
- }, function (err) {
726
- debug.error(' Multiple render: async stuff fails. #### ', err);
727
- }); // async
728
-
729
- return shim;
730
- }; // Multiple
731
-
732
- /* Text field
733
- **
734
- */
735
- // For possible date popups see e.g. http://www.dynamicdrive.com/dynamicindex7/jasoncalendar.htm
736
- // or use HTML5: http://www.w3.org/TR/2011/WD-html-markup-20110113/input.date.html
737
- //
738
-
739
- _fieldFunction.field[ns.ui('PhoneField').uri] = _basic.basicField;
740
- _fieldFunction.field[ns.ui('EmailField').uri] = _basic.basicField;
741
- _fieldFunction.field[ns.ui('ColorField').uri] = _basic.basicField;
742
- _fieldFunction.field[ns.ui('DateField').uri] = _basic.basicField;
743
- _fieldFunction.field[ns.ui('DateTimeField').uri] = _basic.basicField;
744
- _fieldFunction.field[ns.ui('TimeField').uri] = _basic.basicField;
745
- _fieldFunction.field[ns.ui('NumericField').uri] = _basic.basicField;
746
- _fieldFunction.field[ns.ui('IntegerField').uri] = _basic.basicField;
747
- _fieldFunction.field[ns.ui('DecimalField').uri] = _basic.basicField;
748
- _fieldFunction.field[ns.ui('FloatField').uri] = _basic.basicField;
749
- _fieldFunction.field[ns.ui('TextField').uri] = _basic.basicField;
750
- _fieldFunction.field[ns.ui('SingleLineTextField').uri] = _basic.basicField;
751
- _fieldFunction.field[ns.ui('NamedNodeURIField').uri] = _basic.basicField;
752
-
753
- /* Multiline Text field
754
- **
755
- */
756
-
757
- _fieldFunction.field[ns.ui('MultiLineTextField').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
758
- var ui = ns.ui;
759
- var kb = _solidLogic.store;
760
- var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
761
-
762
- var property = kb.any(form, ui('property'));
763
- if (!property) {
764
- return (0, _error.errorMessageBlock)(dom, 'No property to text field: ' + form);
765
- }
766
- var box = dom.createElement('div');
767
- box.style.display = 'flex';
768
- box.style.flexDirection = 'row';
769
- var left = box.appendChild(dom.createElement('div'));
770
- left.style.width = _styleConstants["default"].formFieldNameBoxWidth;
771
- var right = box.appendChild(dom.createElement('div'));
772
- left.appendChild((0, _basic.fieldLabel)(dom, property, form));
773
- dataDoc = (0, _basic.fieldStore)(subject, property, dataDoc);
774
- var text = kb.anyJS(subject, property, null, dataDoc) || '';
775
- var editable = kb.updater.editable(dataDoc.uri);
776
- var suppressEmptyUneditable = form && kb.anyJS(form, ns.ui('suppressEmptyUneditable'), null, formDoc);
777
- if (!editable && suppressEmptyUneditable && text === '') {
778
- box.style.display = 'none';
779
- }
780
- var field = makeDescription(dom, kb, subject, property, dataDoc, callbackFunction);
781
- right.appendChild(field);
782
- if (container) container.appendChild(box);
783
- return box;
784
- };
785
-
786
- /* Boolean field and Tri-state version (true/false/null)
787
- **
788
- ** @@ todo: remove tristate param
789
- */
790
- function booleanField(dom, container, already, subject, form, dataDoc, callbackFunction, tristate) {
791
- var ui = ns.ui;
792
- var kb = _solidLogic.store;
793
- var property = kb.any(form, ui('property'));
794
- if (!property) {
795
- var errorBlock = (0, _error.errorMessageBlock)(dom, 'No property to boolean field: ' + form);
796
- if (container) container.appendChild(errorBlock);
797
- return errorBlock;
798
- }
799
- var lab = kb.any(form, ui('label'));
800
- if (!lab) lab = utils.label(property, true); // Init capital
801
- dataDoc = (0, _basic.fieldStore)(subject, property, dataDoc);
802
- var state = kb.any(subject, property);
803
- if (state === undefined) {
804
- state = false;
805
- } // @@ sure we want that -- or three-state?
806
- var ins = $rdf.st(subject, property, true, dataDoc);
807
- var del = $rdf.st(subject, property, false, dataDoc);
808
- var box = buildCheckboxForm(dom, kb, lab, del, ins, form, dataDoc, tristate);
809
- if (container) container.appendChild(box);
810
- return box;
811
- }
812
- _fieldFunction.field[ns.ui('BooleanField').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
813
- return booleanField(dom, container, already, subject, form, dataDoc, callbackFunction, false);
814
- };
815
- _fieldFunction.field[ns.ui('TristateField').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
816
- return booleanField(dom, container, already, subject, form, dataDoc, callbackFunction, true);
817
- };
818
-
819
- /* Classifier field
820
- **
821
- ** Nested categories
822
- **
823
- ** @@ To do: If a classification changes, then change any dependent Options fields.
824
- */
825
-
826
- _fieldFunction.field[ns.ui('Classifier').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
827
- var kb = _solidLogic.store;
828
- var ui = ns.ui;
829
- var category = kb.any(form, ui('category'));
830
- if (!category) {
831
- return (0, _error.errorMessageBlock)(dom, 'No category for classifier: ' + form);
832
- }
833
- log.debug('Classifier: dataDoc=' + dataDoc);
834
- var checkOptions = function checkOptions(ok, body) {
835
- if (!ok) return callbackFunction(ok, body);
836
- return callbackFunction(ok, body);
837
- };
838
- var box = makeSelectForNestedCategory(dom, kb, subject, category, dataDoc, checkOptions);
839
- if (container) container.appendChild(box);
840
- return box;
841
- };
842
-
843
- /** Choice field
844
- **
845
- ** Not nested. Generates a link to something from a given class.
846
- ** Optional subform for the thing selected.
847
- ** Generates a subForm based on a ui:use form
848
- ** Will look like:
849
- ** <div id=dropDownDiv>
850
- ** <div id=labelOfDropDown>
851
- ** <div id=selectDiv>
852
- ** <select id=dropDownSelect>
853
- ** <option> ....
854
- ** <subForm>
855
- ** Alternative implementatons could be:
856
- ** -- pop-up menu (as here)
857
- ** -- radio buttons
858
- ** -- auto-complete typing
859
- **
860
- ** TODO: according to ontology ui:choice can also have ns.ui('default') - this is not implemented yet
861
- */
862
-
863
- _fieldFunction.field[ns.ui('Choice').uri] = function (dom, container, already, subject, form, dataDoc, callbackFunction) {
864
- var ui = ns.ui;
865
- var kb = _solidLogic.store;
866
- var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
867
-
868
- var p;
869
- var box = dom.createElement('div');
870
- box.setAttribute('class', 'choiceBox');
871
- // Set flexDirection column?
872
- if (container) container.appendChild(box);
873
- var lhs = dom.createElement('div');
874
- lhs.setAttribute('class', 'formFieldName choiceBox-label');
875
- box.appendChild(lhs);
876
- var rhs = dom.createElement('div');
877
- rhs.setAttribute('class', 'formFieldValue choiceBox-selectBox');
878
- box.appendChild(rhs);
879
- var property = kb.any(form, ui('property'));
880
- if (!property) {
881
- return box.appendChild((0, _error.errorMessageBlock)(dom, 'No property for Choice: ' + form));
882
- }
883
- lhs.appendChild((0, _basic.fieldLabel)(dom, property, form));
884
- var uiFrom = kb.any(form, ui('from'));
885
- if (!uiFrom) {
886
- return (0, _error.errorMessageBlock)(dom, "No 'from' for Choice: " + form);
887
- }
888
- var subForm = kb.any(form, ui('use')); // Optional
889
- // const follow = kb.anyJS(form, ui('follow'), null, formDoc) // data doc moves to new subject?
890
-
891
- var opts = {
892
- form: form,
893
- subForm: subForm,
894
- disambiguate: false
895
- };
896
- function getSelectorOptions(dataSource) {
897
- var possible = [];
898
- var possibleProperties;
899
- possible = kb.each(undefined, ns.rdf('type'), uiFrom, formDoc);
900
- for (var x in findMembersNT(kb, uiFrom, dataSource)) {
901
- possible.push(kb.fromNT(x));
902
- } // Use rdfs
903
-
904
- if (uiFrom.sameTerm(ns.rdfs('Class'))) {
905
- for (p in buttons.allClassURIs()) possible.push(kb.sym(p));
906
- // log.debug("%%% Choice field: possible.length 2 = "+possible.length)
907
- } else if (uiFrom.sameTerm(ns.rdf('Property'))) {
908
- possibleProperties = buttons.propertyTriage(kb);
909
- for (p in possibleProperties.op) possible.push(kb.fromNT(p));
910
- for (p in possibleProperties.dp) possible.push(kb.fromNT(p));
911
- opts.disambiguate = true; // This is a big class, and the labels won't be enough.
912
- } else if (uiFrom.sameTerm(ns.owl('ObjectProperty'))) {
913
- possibleProperties = buttons.propertyTriage(kb);
914
- for (p in possibleProperties.op) possible.push(kb.fromNT(p));
915
- opts.disambiguate = true;
916
- } else if (uiFrom.sameTerm(ns.owl('DatatypeProperty'))) {
917
- possibleProperties = buttons.propertyTriage(kb);
918
- for (p in possibleProperties.dp) possible.push(kb.fromNT(p));
919
- opts.disambiguate = true;
920
- }
921
- return possible;
922
- // return sortByLabel(possible)
923
- }
924
-
925
- // TODO: this checks for any occurrence, regardless of true or false setting
926
- if (kb.any(form, ui('canMintNew'))) {
927
- opts.mint = '* Create new *'; // @@ could be better
928
- }
929
- var multiSelect = kb.any(form, ui('multiselect')); // Optional
930
- if (multiSelect) opts.multiSelect = true;
931
-
932
- // by default searches the dataDoc graph or optionally the full store
933
- var dataSource = kb.each(form, ui('search-full-store')).length ? null : dataDoc; // optional
934
-
935
- var selector;
936
- rhs.refresh = function () {
937
- // from ui:property
938
- var selectedOptions = kb.each(subject, property, null, dataDoc).map(function (object) {
939
- return object.value;
940
- });
941
- // from ui:from + ui:property
942
- var possibleOptions = getSelectorOptions(dataSource);
943
- possibleOptions.push(selectedOptions);
944
- possibleOptions = sortByLabel(possibleOptions);
945
- selector = makeSelectForChoice(dom, rhs, kb, subject, property, possibleOptions, selectedOptions, uiFrom, opts, dataDoc, callbackFunction);
946
- rhs.innerHTML = '';
947
- rhs.appendChild(selector);
948
- if (multiSelect) {
949
- var multiSelectDiv = new _multiSelect.IconicMultiSelect({
950
- placeholder: selector.selected,
951
- select: selector,
952
- container: rhs,
953
- textField: 'textField',
954
- valueField: 'valueField'
955
- });
956
- multiSelectDiv.init();
957
- multiSelectDiv.subscribe(function (event) {
958
- if (event.action === 'REMOVE_OPTION') {
959
- selectedOptions = selectedOptions.filter(function (value) {
960
- return value !== event.value;
961
- });
962
- }
963
- if (event.action === 'CLEAR_ALL_OPTIONS') {
964
- selectedOptions = [];
965
- }
966
- if (event.action === 'ADD_OPTION') {
967
- var stringValue = event.value + '';
968
- if (stringValue.includes('Create new')) {
969
- var newObject = newThing(dataDoc);
970
- var is = [];
971
- is.push($rdf.st(subject, property, kb.sym(newObject), dataDoc));
972
- if (uiFrom) is.push($rdf.st(newObject, ns.rdf('type'), kb.sym(uiFrom), dataDoc));
973
- if (subForm) {
974
- addSubFormChoice(dom, rhs, {}, $rdf.sym(newObject), subForm, dataDoc, function (ok, body) {
975
- if (ok) {
976
- kb.updater.update([], is, function (uri, success, errorBody) {
977
- if (!success) rhs.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
978
- });
979
- selectedOptions.push(newObject);
980
- if (callbackFunction) callbackFunction(ok, {
981
- widget: 'select',
982
- event: 'new'
983
- });
984
- } else {
985
- rhs.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
986
- }
987
- });
988
- }
989
- } else selectedOptions.push(event.value);
990
- }
991
- selector.update(selectedOptions);
992
- });
993
- }
994
- };
995
- rhs.refresh();
996
- if (selector && selector.refresh) selector.refresh();
997
- return box;
998
- };
999
- function addSubFormChoice(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction) {
1000
- (0, _fieldFunction.fieldFunction)(dom, subForm)(dom, selectDiv, already, subject, subForm, dataDoc, callbackFunction);
1001
- }
1002
-
1003
- // Documentation - non-interactive fields
1004
- //
1005
-
1006
- _fieldFunction.field[ns.ui('Comment').uri] = _fieldFunction.field[ns.ui('Heading').uri] = function (dom, container, already, subject, form, dataDoc, _callbackFunction) {
1007
- var ui = ns.ui;
1008
- var kb = _solidLogic.store;
1009
- var contents = kb.any(form, ui('contents'));
1010
- if (!contents) contents = 'Error: No contents in comment field.';
1011
- var formDoc = form.doc ? form.doc() : null; // @@ if blank no way to know
1012
-
1013
- var uri = (0, _fieldFunction.mostSpecificClassURI)(form);
1014
- var params = _fieldParams.fieldParams[uri] || {};
1015
- var box = dom.createElement('div');
1016
- if (container) container.appendChild(box);
1017
- var p = box.appendChild(dom.createElement(params.element));
1018
- p.textContent = contents;
1019
- (0, _formStyle.setFieldStyle)(p, form);
1020
-
1021
- // Some headings and prompts are only useful to guide user input
1022
- var suppressIfUneditable = kb.anyJS(form, ns.ui('suppressIfUneditable'), null, formDoc);
1023
- var editable = kb.updater.editable(dataDoc.uri);
1024
- if (suppressIfUneditable && !editable) {
1025
- box.style.display = 'none';
1026
- }
1027
- return box;
1028
- };
1029
-
1030
- // A button for editing a form (in place, at the moment)
1031
- //
1032
- // When editing forms, make it yellow, when editing thr form form, pink
1033
- // Help people understand how many levels down they are.
1034
- //
1035
- function editFormButton(dom, container, form, dataDoc, callbackFunction) {
1036
- var b = dom.createElement('button');
1037
- b.setAttribute('type', 'button');
1038
- b.innerHTML = 'Edit ' + utils.label(ns.ui('Form'));
1039
- b.addEventListener('click', function (_e) {
1040
- var ff = appendForm(dom, container, {}, form, ns.ui('FormForm'), dataDoc, callbackFunction);
1041
- ff.setAttribute('style', ns.ui('FormForm').sameTerm(form) ? 'background-color: #fee;' : 'background-color: #ffffe7;');
1042
- b.parentNode.removeChild(b);
1043
- }, true);
1044
- return b;
1045
- }
1046
- function appendForm(dom, container, already, subject, form, dataDoc, itemDone) {
1047
- return (0, _fieldFunction.fieldFunction)(dom, form)(dom, container, already, subject, form, dataDoc, itemDone);
1048
- }
1049
-
1050
- /** Find list of properties for class
1051
- //
1052
- // Three possible sources: Those mentioned in schemas, which exludes many
1053
- // those which occur in the data we already have, and those predicates we
1054
- // have come across anywhere and which are not explicitly excluded from
1055
- // being used with this class.
1056
- */
1057
-
1058
- function propertiesForClass(kb, c) {
1059
- var explicit = kb.each(undefined, ns.rdf('range'), c);
1060
- [ns.rdfs('comment'), ns.dc('title'),
1061
- // Generic things
1062
- ns.foaf('name'), ns.foaf('homepage')].forEach(function (x) {
1063
- explicit.push(x);
1064
- });
1065
- var members = kb.each(undefined, ns.rdf('type'), c);
1066
- if (members.length > 60) members = members.slice(0, 60); // Array supports slice?
1067
- var used = {};
1068
- for (var i = 0; i < (members.length > 60 ? 60 : members.length); i++) {
1069
- kb.statementsMatching(members[i], undefined, undefined).forEach(function (st) {
1070
- used[st.predicate.uri] = true;
1071
- });
1072
- }
1073
- explicit.forEach(function (p) {
1074
- used[p.uri] = true;
1075
- });
1076
- var result = [];
1077
- for (var uri in used) {
1078
- result.push(kb.sym(uri));
1079
- }
1080
- return result;
1081
- }
1082
-
1083
- /** Find the closest class
1084
- * @param kb The quad store
1085
- * @param cla - the URI of the class
1086
- * @param prop
1087
- */
1088
- function findClosest(kb, cla, prop) {
1089
- var agenda = [kb.sym(cla)]; // ordered - this is breadth first search
1090
- while (agenda.length > 0) {
1091
- var c = agenda.shift(); // first
1092
- var lists = kb.each(c, prop);
1093
- log.debug('Lists for ' + c + ', ' + prop + ': ' + lists.length);
1094
- if (lists.length !== 0) return lists;
1095
- var supers = kb.each(c, ns.rdfs('subClassOf'));
1096
- for (var i = 0; i < supers.length; i++) {
1097
- agenda.push(supers[i]);
1098
- log.debug('findClosest: add super: ' + supers[i]);
1099
- }
1100
- }
1101
- return [];
1102
- }
1103
-
1104
- // Which forms apply to a given existing subject?
1105
-
1106
- function formsFor(subject) {
1107
- var kb = _solidLogic.store;
1108
- log.debug('formsFor: subject=' + subject);
1109
- var t = kb.findTypeURIs(subject);
1110
- var t1;
1111
- for (t1 in t) {
1112
- log.debug(' type: ' + t1);
1113
- }
1114
- var bottom = kb.bottomTypeURIs(t); // most specific
1115
- var candidates = [];
1116
- for (var b in bottom) {
1117
- // Find the most specific
1118
- log.debug('candidatesFor: trying bottom type =' + b);
1119
- candidates = candidates.concat(findClosest(kb, b, ns.ui('creationForm')));
1120
- candidates = candidates.concat(findClosest(kb, b, ns.ui('annotationForm')));
1121
- }
1122
- return candidates;
1123
- }
1124
- function sortBySequence(list) {
1125
- var subfields = list.map(function (p) {
1126
- var k = kb.any(p, ns.ui('sequence'));
1127
- return [k || 9999, p];
1128
- });
1129
- subfields.sort(function (a, b) {
1130
- return a[0] - b[0];
1131
- });
1132
- return subfields.map(function (pair) {
1133
- return pair[1];
1134
- });
1135
- }
1136
- function sortByLabel(list) {
1137
- var subfields = list.map(function (p) {
1138
- return [utils.label(p).toLowerCase(), p];
1139
- });
1140
- subfields.sort();
1141
- return subfields.map(function (pair) {
1142
- return pair[1];
1143
- });
1144
- }
1145
-
1146
- /** Button to add a new whatever using a form
1147
- //
1148
- // @param form - optional form , else will look for one
1149
- // @param dataDoc - optional dataDoc else will prompt for one (unimplemented)
1150
- */
1151
- function newButton(dom, kb, subject, predicate, theClass, form, dataDoc, callbackFunction) {
1152
- var b = dom.createElement('button');
1153
- b.setAttribute('type', 'button');
1154
- b.innerHTML = 'New ' + utils.label(theClass);
1155
- b.addEventListener('click', function (_e) {
1156
- b.parentNode.appendChild(promptForNew(dom, kb, subject, predicate, theClass, form, dataDoc, callbackFunction));
1157
- }, false);
1158
- return b;
1159
- }
1160
-
1161
- /** Prompt for new object of a given class
1162
- //
1163
- // @param dom - the document DOM for the user interface
1164
- // @param kb - the graph which is the knowledge base we are working with
1165
- // @param subject - a term, Thing this should be linked to when made. Optional.
1166
- // @param predicate - a term, the relationship for the subject link. Optional.
1167
- // @param theClass - an RDFS class containng the object about which the new information is.
1168
- // @param form - the form to be used when a new one. null means please find one.
1169
- // @param dataDoc - The web document being edited
1170
- // @param callbackFunction - takes (boolean ok, string errorBody)
1171
- // @returns a dom object with the form DOM
1172
- */
1173
- function promptForNew(dom, kb, subject, predicate, theClass, form, dataDoc, callbackFunction) {
1174
- var box = dom.createElement('form');
1175
- if (!form) {
1176
- var lists = findClosest(kb, theClass.uri, ns.ui('creationForm'));
1177
- if (lists.length === 0) {
1178
- var p = box.appendChild(dom.createElement('p'));
1179
- p.textContent = 'I am sorry, you need to provide information about a ' + utils.label(theClass) + " but I don't know enough information about those to ask you.";
1180
- var b = box.appendChild(dom.createElement('button'));
1181
- b.setAttribute('type', 'button');
1182
- b.setAttribute('style', 'float: right;');
1183
- b.innerHTML = 'Goto ' + utils.label(theClass);
1184
- b.addEventListener('click',
1185
- // TODO fix dependency cycle to solid-panes by calling outlineManager
1186
- function (_e) {
1187
- dom.outlineManager.GotoSubject(theClass, true, undefined, true, undefined);
1188
- }, false);
1189
- return box;
1190
- }
1191
- log.debug('lists[0] is ' + lists[0]);
1192
- form = lists[0]; // Pick any one
1193
- }
1194
- log.debug('form is ' + form);
1195
- box.setAttribute('style', "border: 0.05em solid ".concat(_styleConstants["default"].formBorderColor, "; color: ").concat(_styleConstants["default"].formBorderColor)); // @@color?
1196
- box.innerHTML = '<h3>New ' + utils.label(theClass) + '</h3>';
1197
- var formFunction = (0, _fieldFunction.fieldFunction)(dom, form);
1198
- var object = newThing(dataDoc);
1199
- var gotButton = false;
1200
- var itemDone = function itemDone(ok, body) {
1201
- if (!ok) return callbackFunction(ok, body);
1202
- var insertMe = [];
1203
- if (subject && !kb.holds(subject, predicate, object, dataDoc)) {
1204
- insertMe.push($rdf.st(subject, predicate, object, dataDoc));
1205
- }
1206
- if (subject && !kb.holds(object, ns.rdf('type'), theClass, dataDoc)) {
1207
- insertMe.push($rdf.st(object, ns.rdf('type'), theClass, dataDoc));
1208
- }
1209
- if (insertMe.length) {
1210
- kb.updater.update([], insertMe, linkDone);
1211
- } else {
1212
- callbackFunction(true, body);
1213
- }
1214
- if (!gotButton) {
1215
- gotButton = box.appendChild(buttons.linkButton(dom, object));
1216
- }
1217
- };
1218
- function linkDone(uri, ok, body) {
1219
- return callbackFunction(ok, body);
1220
- }
1221
- log.info('paneUtils Object is ' + object);
1222
- var f = formFunction(dom, box, {}, object, form, dataDoc, itemDone);
1223
- var rb = buttons.removeButton(dom, f);
1224
- rb.setAttribute('style', 'float: right;');
1225
- box.AJAR_subject = object;
1226
- return box;
1227
- }
1228
- function makeDescription(dom, kb, subject, predicate, dataDoc, callbackFunction) {
1229
- var group = dom.createElement('div');
1230
- var desc = kb.anyJS(subject, predicate, null, dataDoc) || '';
1231
- var field = dom.createElement('textarea');
1232
- group.appendChild(field);
1233
- field.rows = desc ? desc.split('\n').length + 2 : 2;
1234
- field.cols = 80;
1235
- field.setAttribute('style', style.multilineTextInputStyle);
1236
- if (desc !== null) {
1237
- field.value = desc;
1238
- } else {
1239
- // Unless you can make the predicate label disappear with the first click then this is over-cute
1240
- // field.value = utils.label(predicate); // Was"enter a description here" @@ possibly: add prompt which disappears
1241
- field.select(); // Select it ready for user input -- doesn't work
1242
- }
1243
- group.refresh = function () {
1244
- var v = kb.any(subject, predicate, null, dataDoc);
1245
- if (v && v.value !== field.value) {
1246
- field.value = v.value; // don't touch widget if no change
1247
- // @@ this is the place to color the field from the user who chanaged it
1248
- }
1249
- };
1250
- function saveChange(_e) {
1251
- submit.disabled = true;
1252
- submit.setAttribute('style', 'visibility: hidden; float: right;'); // Keep UI clean
1253
- field.disabled = true;
1254
- field.style.color = _styleConstants["default"].textInputColorPending;
1255
- var ds = kb.statementsMatching(subject, predicate, null, dataDoc);
1256
- var is = $rdf.st(subject, predicate, field.value, dataDoc);
1257
- kb.updater.update(ds, is, function (uri, ok, body) {
1258
- if (ok) {
1259
- field.style.color = _styleConstants["default"].textInputColor;
1260
- field.disabled = false;
1261
- } else {
1262
- group.appendChild((0, _error.errorMessageBlock)(dom, 'Error (while saving change to ' + dataDoc.uri + '): ' + body));
1263
- }
1264
- if (callbackFunction) {
1265
- callbackFunction(ok, body);
1266
- }
1267
- });
1268
- }
1269
- var editable = kb.updater.editable(dataDoc.uri);
1270
- var submit;
1271
- if (editable) {
1272
- submit = widgets.continueButton(dom, saveChange);
1273
- submit.disabled = true; // until the filled has been modified
1274
- submit.style.visibility = 'hidden';
1275
- submit.style["float"] = 'right';
1276
- group.appendChild(submit);
1277
- field.addEventListener('keyup', function (_e) {
1278
- // Green means has been changed, not saved yet
1279
- field.style.color = 'green'; // setAttribute('style', style + 'color: green;')
1280
- if (submit) {
1281
- submit.disabled = false;
1282
- submit.style.visibility = ''; // Remove visibility: hidden
1283
- }
1284
- }, true);
1285
- field.addEventListener('change', saveChange, true);
1286
- } else {
1287
- field.disabled = true; // @@ change color too
1288
- field.style.backgroundColor = _styleConstants["default"].textInputBackgroundColorUneditable;
1289
- }
1290
- return group;
1291
- }
1292
-
1293
- /** Make SELECT element to select options
1294
- //
1295
- // @param subject - a term, the subject of the statement(s) being edited.
1296
- // @param predicate - a term, the predicate of the statement(s) being edited
1297
- // @param possible - a list of terms, the possible value the object can take
1298
- // @param options.multiple - Boolean - Whether more than one at a time is allowed
1299
- // @param options.nullLabel - a string to be displayed as the
1300
- // option for none selected (for non multiple)
1301
- // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1302
- // @param options.subForm - If mint, then the form to be used for minting the new thing
1303
- // @param dataDoc - The web document being edited
1304
- // @param callbackFunction - takes (boolean ok, string errorBody)
1305
- */
1306
- function makeSelectForClassifierOptions(dom, kb, subject, predicate, possible, options, dataDoc, callbackFunction) {
1307
- log.debug('Select list length now ' + possible.length);
1308
- var n = 0;
1309
- var uris = {}; // Count them
1310
- var editable = kb.updater.editable(dataDoc.uri);
1311
- for (var i = 0; i < possible.length; i++) {
1312
- var sub = possible[i]; // @@ Maybe; make this so it works with blank nodes too
1313
- if (!sub.uri) debug.warn("makeSelectForClassifierOptions: option does not have an uri: ".concat(sub, ", with predicate: ").concat(predicate));
1314
- if (!sub.uri || sub.uri in uris) continue;
1315
- uris[sub.uri] = true;
1316
- n++;
1317
- } // uris is now the set of possible options
1318
- if (n === 0 && !options.mint) {
1319
- return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1320
- }
1321
- log.debug('makeSelectForClassifierOptions: dataDoc=' + dataDoc);
1322
- var actual;
1323
- var getActual = function getActual() {
1324
- actual = {};
1325
- if (predicate.sameTerm(ns.rdf('type'))) {
1326
- actual = kb.findTypeURIs(subject);
1327
- } else {
1328
- kb.each(subject, predicate, null, dataDoc).forEach(function (x) {
1329
- actual[x.uri] = true;
1330
- });
1331
- }
1332
- return actual;
1333
- };
1334
- actual = getActual();
1335
- var onChange = function onChange(_e) {
1336
- select.disabled = true; // until data written back - gives user feedback too
1337
- var ds = [];
1338
- var is = [];
1339
- var removeValue = function removeValue(t) {
1340
- if (kb.holds(subject, predicate, t, dataDoc)) {
1341
- ds.push($rdf.st(subject, predicate, t, dataDoc));
1342
- }
1343
- };
1344
- var newObject;
1345
- for (var _i = 0; _i < select.options.length; _i++) {
1346
- var opt = select.options[_i];
1347
- if (opt.selected && opt.AJAR_mint) {
1348
- if (options.mintClass) {
1349
- var thisForm = promptForNew(dom, kb, subject, predicate, options.mintClass, null, dataDoc, function (ok, body) {
1350
- if (!ok) {
1351
- callbackFunction(ok, body, {
1352
- change: 'new'
1353
- }); // @@ if ok, need some form of refresh of the select for the new thing
1354
- }
1355
- });
1356
- select.parentNode.appendChild(thisForm);
1357
- newObject = thisForm.AJAR_subject;
1358
- } else {
1359
- newObject = newThing(dataDoc);
1360
- }
1361
- is.push($rdf.st(subject, predicate, newObject, dataDoc));
1362
- if (options.mintStatementsFun) {
1363
- is = is.concat(options.mintStatementsFun(newObject));
1364
- }
1365
- }
1366
- if (!opt.AJAR_uri) continue; // a prompt or mint
1367
- if (opt.selected && !(opt.AJAR_uri in actual)) {
1368
- // new class
1369
- is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc));
1370
- }
1371
- if (!opt.selected && opt.AJAR_uri in actual) {
1372
- // old class
1373
- removeValue(kb.sym(opt.AJAR_uri));
1374
- }
1375
- if (opt.selected) select.currentURI = opt.AJAR_uri;
1376
- }
1377
- var sel = select.subSelect; // All subclasses must also go
1378
- while (sel && sel.currentURI) {
1379
- removeValue(kb.sym(sel.currentURI));
1380
- sel = sel.subSelect;
1381
- }
1382
- sel = select.superSelect; // All superclasses are redundant
1383
- while (sel && sel.currentURI) {
1384
- removeValue(kb.sym(sel.currentURI));
1385
- sel = sel.superSelect;
1386
- }
1387
- function doneNew(ok, _body) {
1388
- callbackFunction(ok, {
1389
- widget: 'select',
1390
- event: 'new'
1391
- });
1392
- }
1393
- log.info('makeSelectForClassifierOptions: data doc = ' + dataDoc);
1394
- kb.updater.update(ds, is, function (uri, ok, body) {
1395
- actual = getActual(); // refresh
1396
- if (ok) {
1397
- select.disabled = false; // data written back
1398
- if (newObject) {
1399
- var fn = (0, _fieldFunction.fieldFunction)(dom, options.subForm);
1400
- fn(dom, select.parentNode, {}, newObject, options.subForm, dataDoc, doneNew);
1401
- }
1402
- } else {
1403
- return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
1404
- }
1405
- if (callbackFunction) callbackFunction(ok, {
1406
- widget: 'select',
1407
- event: 'change'
1408
- });
1409
- });
1410
- };
1411
- var select = dom.createElement('select');
1412
- select.setAttribute('style', style.formSelectStyle);
1413
- if (options.multiple) select.setAttribute('multiple', 'true');
1414
- select.currentURI = null;
1415
- select.refresh = function () {
1416
- actual = getActual(); // refresh
1417
- for (var _i2 = 0; _i2 < select.children.length; _i2++) {
1418
- var option = select.children[_i2];
1419
- if (option.AJAR_uri) {
1420
- option.selected = option.AJAR_uri in actual;
1421
- }
1422
- }
1423
- select.disabled = false; // unlocked any conflict we had got into
1424
- };
1425
- for (var uri in uris) {
1426
- var c = kb.sym(uri);
1427
- var option = dom.createElement('option');
1428
- if (options.disambiguate) {
1429
- option.appendChild(dom.createTextNode(utils.labelWithOntology(c, true))); // Init. cap
1430
- } else {
1431
- option.appendChild(dom.createTextNode(utils.label(c, true))); // Init.
1432
- }
1433
- var backgroundColor = kb.any(c, kb.sym('http://www.w3.org/ns/ui#backgroundColor'));
1434
- if (backgroundColor) {
1435
- option.setAttribute('style', 'background-color: ' + backgroundColor.value + '; ');
1436
- }
1437
- option.AJAR_uri = uri;
1438
- if (uri in actual) {
1439
- option.setAttribute('selected', 'true');
1440
- select.currentURI = uri;
1441
- // dump("Already in class: "+ uri+"\n")
1442
- }
1443
- select.appendChild(option);
1444
- }
1445
- if (editable && options.mint) {
1446
- var mint = dom.createElement('option');
1447
- mint.appendChild(dom.createTextNode(options.mint));
1448
- mint.AJAR_mint = true; // Flag it
1449
- select.insertBefore(mint, select.firstChild);
1450
- }
1451
- if (select.currentURI == null && !options.multiple) {
1452
- var prompt = dom.createElement('option');
1453
- prompt.appendChild(dom.createTextNode(options.nullLabel));
1454
- select.insertBefore(prompt, select.firstChild);
1455
- prompt.selected = true;
1456
- }
1457
- if (editable) {
1458
- select.addEventListener('change', onChange, false);
1459
- }
1460
- return select;
1461
- } // makeSelectForClassifierOptions
1462
-
1463
- /** Make SELECT element to select options
1464
- //
1465
- // @param subject - a term, the subject of the statement(s) being edited.
1466
- // @param predicate - a term, the predicate of the statement(s) being edited
1467
- // @param possible - a list of terms, the possible value the object can take
1468
- // @param options.nullLabel - a string to be displayed as the
1469
- // option for none selected (for non multiple)
1470
- // @param options.subForm - If mint, then the form to be used for minting the new thing
1471
- // @param dataDoc - The web document being edited
1472
- // @param callbackFunction - takes (boolean ok, string errorBody)
1473
- */
1474
- function makeSelectForOptions(dom, kb, subject, predicate, possible, options, dataDoc, callbackFunction) {
1475
- log.debug('Select list length now ' + possible.length);
1476
- var n = 0;
1477
- var uris = {}; // Count them
1478
- var editable = kb.updater.editable(dataDoc.uri);
1479
- for (var i = 0; i < possible.length; i++) {
1480
- var sub = possible[i]; // @@ Maybe; make this so it works with blank nodes too
1481
- if (!sub.uri) debug.warn("makeSelectForOptions: option does not have an uri: ".concat(sub, ", with predicate: ").concat(predicate));
1482
- if (!sub.uri || sub.uri in uris) continue;
1483
- uris[sub.uri] = true;
1484
- n++;
1485
- } // uris is now the set of possible options
1486
- if (n === 0) {
1487
- return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1488
- }
1489
- log.debug('makeSelectForOptions: dataDoc=' + dataDoc);
1490
- var actual;
1491
- var getActual = function getActual() {
1492
- actual = {};
1493
- if (predicate.sameTerm(ns.rdf('type'))) {
1494
- actual = kb.findTypeURIs(subject);
1495
- } else {
1496
- kb.each(subject, predicate, null, dataDoc).forEach(function (x) {
1497
- if (x.uri) {
1498
- actual[x.uri] = true;
1499
- }
1500
- });
1501
- }
1502
- return actual;
1503
- };
1504
- actual = getActual();
1505
- var onChange = function onChange(_e) {
1506
- select.disabled = true; // until data written back - gives user feedback too
1507
- var ds = [];
1508
- var is = [];
1509
- var removeValue = function removeValue(t) {
1510
- if (kb.holds(subject, predicate, t, dataDoc)) {
1511
- ds.push($rdf.st(subject, predicate, t, dataDoc));
1512
- }
1513
- };
1514
- for (var _i3 = 0; _i3 < select.options.length; _i3++) {
1515
- var opt = select.options[_i3];
1516
- if (!opt.AJAR_uri) continue; // a prompt or mint
1517
- if (opt.selected && !(opt.AJAR_uri in actual)) {
1518
- // new class
1519
- is.push($rdf.st(subject, predicate, kb.sym(opt.AJAR_uri), dataDoc));
1520
- }
1521
- if (!opt.selected && opt.AJAR_uri in actual) {
1522
- // old class
1523
- removeValue(kb.sym(opt.AJAR_uri));
1524
- }
1525
- if (opt.selected) select.currentURI = opt.AJAR_uri;
1526
- }
1527
- var sel = select.subSelect; // All subclasses must also go
1528
- while (sel && sel.currentURI) {
1529
- removeValue(kb.sym(sel.currentURI));
1530
- sel = sel.subSelect;
1531
- }
1532
- sel = select.superSelect; // All superclasses are redundant
1533
- while (sel && sel.currentURI) {
1534
- removeValue(kb.sym(sel.currentURI));
1535
- sel = sel.superSelect;
1536
- }
1537
- log.info('selectForOptions: data doc = ' + dataDoc);
1538
- kb.updater.update(ds, is, function (uri, ok, body) {
1539
- actual = getActual(); // refresh
1540
- if (ok) {
1541
- select.disabled = false; // data written back
1542
- } else {
1543
- return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
1544
- }
1545
- if (callbackFunction) callbackFunction(ok, {
1546
- widget: 'select',
1547
- event: 'change'
1548
- });
1549
- });
1550
- };
1551
- var select = dom.createElement('select');
1552
- select.setAttribute('style', style.formSelectStyle);
1553
- select.currentURI = null;
1554
- select.refresh = function () {
1555
- actual = getActual(); // refresh
1556
- for (var _i4 = 0; _i4 < select.children.length; _i4++) {
1557
- var option = select.children[_i4];
1558
- if (option.AJAR_uri) {
1559
- option.selected = option.AJAR_uri in actual;
1560
- }
1561
- }
1562
- select.disabled = false; // unlocked any conflict we had got into
1563
- };
1564
- for (var uri in uris) {
1565
- var c = kb.sym(uri);
1566
- var option = dom.createElement('option');
1567
- if (options.disambiguate) {
1568
- option.appendChild(dom.createTextNode(utils.labelWithOntology(c, true))); // Init. cap
1569
- } else {
1570
- option.appendChild(dom.createTextNode(utils.label(c, true))); // Init.
1571
- }
1572
- var backgroundColor = kb.any(c, kb.sym('http://www.w3.org/ns/ui#backgroundColor'));
1573
- if (backgroundColor) {
1574
- option.setAttribute('style', 'background-color: ' + backgroundColor.value + '; ');
1575
- }
1576
- option.AJAR_uri = uri;
1577
- if (uri in actual) {
1578
- option.setAttribute('selected', 'true');
1579
- select.currentURI = uri;
1580
- // dump("Already in class: "+ uri+"\n")
1581
- }
1582
- select.appendChild(option);
1583
- }
1584
- if (!select.currentURI) {
1585
- var prompt = dom.createElement('option');
1586
- prompt.appendChild(dom.createTextNode(options.nullLabel));
1587
- select.insertBefore(prompt, select.firstChild);
1588
- prompt.selected = true;
1589
- }
1590
- if (editable) {
1591
- select.addEventListener('change', onChange, false);
1592
- }
1593
- return select;
1594
- } // makeSelectForOptions
1595
-
1596
- // Make SELECT element to select subclasses
1597
- //
1598
- // If there is any disjoint union it will so a mutually exclusive dropdown
1599
- // Failing that it will do a multiple selection of subclasses.
1600
- // Callback takes (boolean ok, string errorBody)
1601
-
1602
- function makeSelectForCategory(dom, kb, subject, category, dataDoc, callbackFunction) {
1603
- var du = kb.any(category, ns.owl('disjointUnionOf'));
1604
- var subs;
1605
- var multiple = false;
1606
- if (!du) {
1607
- subs = kb.each(undefined, ns.rdfs('subClassOf'), category);
1608
- multiple = true;
1609
- } else {
1610
- subs = du.elements;
1611
- }
1612
- log.debug('Select list length ' + subs.length);
1613
- if (subs.length === 0) {
1614
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with no subclasses of category: ' + category);
1615
- }
1616
- if (subs.length === 1) {
1617
- return (0, _error.errorMessageBlock)(dom, "Can't do " + (multiple ? 'multiple ' : '') + 'selector with only 1 subclass of category: ' + category + ':' + subs[1]);
1618
- }
1619
- return makeSelectForClassifierOptions(dom, kb, subject, ns.rdf('type'), subs, {
1620
- multiple: multiple,
1621
- nullLabel: '* Select type *'
1622
- }, dataDoc, callbackFunction);
1623
- }
1624
-
1625
- /** Make SELECT element to select subclasses recurively
1626
- //
1627
- // It will so a mutually exclusive dropdown, with another if there are nested
1628
- // disjoint unions.
1629
- //
1630
- // @param callbackFunction takes (boolean ok, string errorBody)
1631
- */
1632
- function makeSelectForNestedCategory(dom, kb, subject, category, dataDoc, callbackFunction) {
1633
- function update() {
1634
- if (child) {
1635
- container.removeChild(child);
1636
- child = null;
1637
- }
1638
- if (select.currentURI && kb.any(kb.sym(select.currentURI), ns.owl('disjointUnionOf'))) {
1639
- child = makeSelectForNestedCategory(dom, kb, subject, kb.sym(select.currentURI), dataDoc, callbackFunction);
1640
- select.subSelect = child.firstChild;
1641
- select.subSelect.superSelect = select;
1642
- container.appendChild(child);
1643
- }
1644
- }
1645
- var container = dom.createElement('span'); // Container
1646
- var child = null;
1647
- function onChange(ok, body) {
1648
- if (ok) update();
1649
- callbackFunction(ok, body);
1650
- }
1651
- var select = makeSelectForCategory(dom, kb, subject, category, dataDoc, onChange);
1652
- container.appendChild(select);
1653
- update();
1654
- return container;
1655
- }
1656
-
1657
- /* Build a checkbox from a given statement(s)
1658
- **
1659
- ** If the source document is editable, make the checkbox editable
1660
- **
1661
- ** ins and sel are either statements *or arrays of statements* which should be
1662
- ** made if the checkbox is checed and unchecked respectively.
1663
- ** tristate: Allow ins, or del, or neither
1664
- */
1665
- function buildCheckboxForm(dom, kb, lab, del, ins, form, dataDoc, tristate) {
1666
- var box = dom.createElement('div');
1667
- var rhs = (0, _basic.renderNameValuePair)(dom, kb, box, form, lab);
1668
- var editable = kb.updater.editable(dataDoc.uri);
1669
- var input = dom.createElement('button');
1670
- var colorCarrier = input;
1671
- input.style = style.checkboxInputStyle;
1672
- rhs.appendChild(input);
1673
- function fix(x) {
1674
- if (!x) return []; // no statements
1675
- if (x.object) {
1676
- if (!x.why) {
1677
- x.why = dataDoc; // be back-compaitible with old code
1678
- }
1679
- return [x]; // one statements
1680
- }
1681
- if (x instanceof Array) return x;
1682
- throw new Error('buildCheckboxForm: bad param ' + x);
1683
- }
1684
- ins = fix(ins);
1685
- del = fix(del);
1686
- function holdsAll(a) {
1687
- var missing = a.filter(function (st) {
1688
- return !kb.holds(st.subject, st.predicate, st.object, st.why);
1689
- });
1690
- return missing.length === 0;
1691
- }
1692
- function refresh() {
1693
- var state = holdsAll(ins);
1694
- var displayState = state;
1695
- if (del.length) {
1696
- var negation = holdsAll(del);
1697
- if (state && negation) {
1698
- box.appendChild(widgets.errorMessageBlock(dom, 'Inconsistent data in dataDoc!\n' + ins + ' and\n' + del));
1699
- return box;
1700
- }
1701
- if (!state && !negation) {
1702
- state = null;
1703
- var defa = kb.any(form, ns.ui('default'));
1704
- displayState = defa ? defa.value === '1' : tristate ? null : false;
1705
- }
1706
- }
1707
- input.state = state;
1708
- input.textContent = {
1709
- "true": checkMarkCharacter,
1710
- "false": tristate ? cancelCharacter : ' ',
1711
- // Just use blank when not tristate
1712
- "null": dashCharacter
1713
- }[displayState];
1714
- }
1715
- refresh();
1716
- if (!editable) return box;
1717
- var boxHandler = function boxHandler(_e) {
1718
- colorCarrier.style.color = '#bbb'; // grey -- not saved yet
1719
- var toDelete = input.state === true ? ins : input.state === false ? del : [];
1720
- input.newState = input.state === null ? true : input.state === true ? false : tristate ? null : true;
1721
- var toInsert = input.newState === true ? ins : input.newState === false ? del : [];
1722
- debug.log(" Deleting ".concat(toDelete));
1723
- debug.log(" Inserting ".concat(toInsert));
1724
- kb.updater.update(toDelete, toInsert, function (uri, success, errorBody) {
1725
- if (!success) {
1726
- if (toDelete.why) {
1727
- var hmmm = kb.holds(toDelete.subject, toDelete.predicate, toDelete.object, toDelete.why);
1728
- if (hmmm) {
1729
- debug.log(' @@@@@ weird if 409 - does hold statement');
1730
- }
1731
- }
1732
- colorCarrier.style.color = '#000';
1733
- colorCarrier.style.backgroundColor = '#fee';
1734
- box.appendChild((0, _error.errorMessageBlock)(dom, "Checkbox: Error updating dataDoc from ".concat(input.state, " to ").concat(input.newState, ":\n\n").concat(errorBody)));
1735
- } else {
1736
- colorCarrier.style.color = '#000';
1737
- input.state = input.newState;
1738
- input.textContent = {
1739
- "true": checkMarkCharacter,
1740
- "false": cancelCharacter,
1741
- "null": dashCharacter
1742
- }[input.state]; // @@
1743
- }
1744
- });
1745
- };
1746
- input.addEventListener('click', boxHandler, false);
1747
- return box;
1748
- }
1749
- /*
1750
- export function fieldLabel (dom, property, form) {
1751
- let lab = kb.any(form, ns.ui('label'))
1752
- if (!lab) lab = utils.label(property, true) // Init capital
1753
- if (property === undefined) {
1754
- return dom.createTextNode('@@Internal error: undefined property')
1755
- }
1756
- const anchor = dom.createElement('a')
1757
- if (property.uri) anchor.setAttribute('href', property.uri)
1758
- anchor.setAttribute('style', style.fieldLabelStyle) // Not too blue and no underline
1759
- anchor.textContent = lab
1760
- return anchor
1761
- }
1762
-
1763
- export function fieldStore (subject, predicate, def) {
1764
- const sts = kb.statementsMatching(subject, predicate)
1765
- if (sts.length === 0) return def // can used default as no data yet
1766
- if (
1767
- sts.length > 0 &&
1768
- sts[0].why.uri &&
1769
- kb.updater.editable(sts[0].why.uri)
1770
- ) {
1771
- return kb.sym(sts[0].why.uri)
1772
- }
1773
- return def
1774
- }
1775
- */
1776
- /** Mint local ID using timestamp
1777
- * @param {NamedNode} doc - the document in which the ID is to be generated
1778
- */
1779
- function newThing(doc) {
1780
- var now = new Date();
1781
- return $rdf.sym(doc.uri + '#' + 'id' + ('' + now.getTime()));
1782
- }
1783
-
1784
- /** Make SELECT element to select options
1785
- //
1786
- // @param subject - a term, the subject of the statement(s) being edited.
1787
- // @param predicate - a term, the predicate of the statement(s) being edited
1788
- // @param possible - a list of terms, the possible value the object can take
1789
- // @param options.mint - User may create thing if this sent to the prompt string eg "New foo"
1790
- // @param options.subForm - If mint, then the form to be used for minting the new thing
1791
- // @param dataDoc - The web document being edited
1792
- // @param callbackFunction - takes (boolean ok, string errorBody)
1793
- */
1794
- function makeSelectForChoice(dom, container, kb, subject, predicate, inputPossibleOptions, selectedOptions, uiFrom, options, dataDoc, callbackFunction) {
1795
- var optionsFromClassUIfrom = {}; // Count them
1796
- var editable = kb.updater.editable(dataDoc.uri);
1797
- for (var i = 0; i < inputPossibleOptions.length; i++) {
1798
- var sub = inputPossibleOptions[i]; // @@ Maybe; make this so it works with blank nodes too
1799
- // if (!sub.uri) debug.warn(`makeSelectForChoice: option does not have an uri: ${sub}, with predicate: ${predicate}`)
1800
- if (!sub.uri || sub.uri in optionsFromClassUIfrom) continue;
1801
- optionsFromClassUIfrom[sub.uri] = true;
1802
- }
1803
- var isEmpty = Object.keys(optionsFromClassUIfrom).length === 0;
1804
- if (isEmpty && !options.mint) {
1805
- return (0, _error.errorMessageBlock)(dom, "Can't do selector with no options, subject= " + subject + ' property = ' + predicate + '.');
1806
- }
1807
- log.debug('makeSelectForChoice: dataDoc=' + dataDoc);
1808
- function createDefaultSelectOptionText() {
1809
- var firstSelectOptionText = '--- choice ---';
1810
- if (predicate && !(predicate.termType === 'BlankNode')) {
1811
- firstSelectOptionText = '* Select for property: ' + utils.label(predicate) + ' *';
1812
- }
1813
- if (subject && !(subject.termType === 'BlankNode')) {
1814
- firstSelectOptionText = '* Select for ' + utils.label(subject, true) + ' *';
1815
- }
1816
- return firstSelectOptionText;
1817
- }
1818
- function createDefaultSelectOption() {
1819
- var option = dom.createElement('option');
1820
- option.appendChild(dom.createTextNode(createDefaultSelectOptionText()));
1821
- option.disabled = true;
1822
- option.value = true;
1823
- option.hidden = true;
1824
- option.selected = true;
1825
- return option;
1826
- }
1827
- var onChange = function onChange(_e) {
1828
- container.removeChild(container.lastChild);
1829
- select.refresh();
1830
- };
1831
- var select = dom.createElement('select');
1832
- select.setAttribute('style', style.formSelectStyle);
1833
- select.setAttribute('id', 'formSelect');
1834
- select.currentURI = null;
1835
- for (var uri in optionsFromClassUIfrom) {
1836
- select.appendChild(createOption(uri));
1837
- }
1838
- if (editable && options.mint) {
1839
- var mint = dom.createElement('option');
1840
- mint.appendChild(dom.createTextNode(options.mint));
1841
- mint.AJAR_mint = true; // Flag it
1842
- select.insertBefore(mint, select.firstChild);
1843
- }
1844
- if (select.children.length === 0) select.insertBefore(createDefaultSelectOption(), select.firstChild);
1845
- select.update = function (newSelectedOptions) {
1846
- selectedOptions = newSelectedOptions;
1847
- var ds = [];
1848
- var is = [];
1849
- var removeValue = function removeValue(t) {
1850
- if (kb.holds(subject, predicate, t, dataDoc)) {
1851
- ds.push($rdf.st(subject, predicate, t, dataDoc));
1852
- }
1853
- };
1854
- var addValue = function addValue(t) {
1855
- if (!kb.holds(subject, predicate, t, dataDoc)) {
1856
- is.push($rdf.st(subject, predicate, t, dataDoc));
1857
- // console.log("----value added " + t)
1858
- }
1859
- if (uiFrom && !kb.holds(t, ns.rdf('type'), kb.sym(uiFrom), dataDoc)) {
1860
- is.push($rdf.st(t, ns.rdf('type'), kb.sym(uiFrom), dataDoc));
1861
- // console.log("----added type to value " + uiFrom)
1862
- }
1863
- };
1864
- var existingValues = kb.each(subject, predicate, null, dataDoc).map(function (object) {
1865
- return object.value;
1866
- });
1867
- var _iterator2 = _createForOfIteratorHelper(existingValues),
1868
- _step2;
1869
- try {
1870
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
1871
- var value = _step2.value;
1872
- if (!containsObject(value, selectedOptions)) removeValue($rdf.sym(value));
1873
- }
1874
- } catch (err) {
1875
- _iterator2.e(err);
1876
- } finally {
1877
- _iterator2.f();
1878
- }
1879
- var _iterator3 = _createForOfIteratorHelper(selectedOptions),
1880
- _step3;
1881
- try {
1882
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
1883
- var _value = _step3.value;
1884
- if (!(_value in existingValues)) addValue($rdf.sym(_value));
1885
- }
1886
- } catch (err) {
1887
- _iterator3.e(err);
1888
- } finally {
1889
- _iterator3.f();
1890
- }
1891
- kb.updater.update(ds, is, function (uri, ok, body) {
1892
- if (!ok) return select.parentNode.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in select: ' + body));
1893
- select.refresh();
1894
- if (callbackFunction) callbackFunction(ok, {
1895
- widget: 'select',
1896
- event: 'change'
1897
- });
1898
- });
1899
- };
1900
- select.refresh = function () {
1901
- select.disabled = true; // unlocked any conflict we had got into
1902
- var is = [];
1903
- var newObject;
1904
- for (var _i5 = 0; _i5 < select.options.length; _i5++) {
1905
- var opt = select.options[_i5];
1906
- if (opt.selected && opt.AJAR_mint) {
1907
- // not sure if this 'if' is used because I cannot find mintClass
1908
- if (options.mintClass) {
1909
- var thisForm = promptForNew(dom, kb, subject, predicate, uiFrom, options.subForm, dataDoc, function (ok, body) {
1910
- if (!ok) {
1911
- callbackFunction(ok, body, {
1912
- change: 'new'
1913
- }); // @@ if ok, need some form of refresh of the select for the new thing
1914
- }
1915
- });
1916
- select.parentNode.appendChild(thisForm);
1917
- newObject = thisForm.AJAR_subject;
1918
- } else {
1919
- newObject = newThing(dataDoc);
1920
- }
1921
- is.push($rdf.st(subject, predicate, kb.sym(newObject), dataDoc));
1922
- if (uiFrom) is.push($rdf.st(newObject, ns.rdf('type'), kb.sym(uiFrom), dataDoc));
1923
-
1924
- // not sure if this 'if' is used because I cannot find mintStatementsFun
1925
- if (options.mintStatementsFun) {
1926
- is = is.concat(options.mintStatementsFun(newObject));
1927
- }
1928
- select.currentURI = newObject;
1929
- }
1930
- if (!opt.AJAR_uri) continue; // a prompt or mint
1931
- if (opt.selected && containsObject(opt.AJAR_uri, selectedOptions)) {
1932
- select.currentURI = opt.AJAR_uri;
1933
- }
1934
- if (!containsObject(opt.AJAR_uri, selectedOptions)) opt.removeAttribute('selected');
1935
- if (containsObject(opt.AJAR_uri, selectedOptions)) opt.setAttribute('selected', 'true');
1936
- }
1937
- log.info('selectForOptions: data doc = ' + dataDoc);
1938
- if (select.currentURI && options.subForm && !options.multiSelect) {
1939
- addSubFormChoice(dom, container, {}, $rdf.sym(select.currentURI), options.subForm, dataDoc, function (ok, body) {
1940
- if (ok) {
1941
- kb.updater.update([], is, function (uri, success, errorBody) {
1942
- if (!success) container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating select: ' + errorBody));
1943
- });
1944
- if (callbackFunction) callbackFunction(ok, {
1945
- widget: 'select',
1946
- event: 'new'
1947
- });
1948
- } else {
1949
- container.appendChild((0, _error.errorMessageBlock)(dom, 'Error updating data in field of select: ' + body));
1950
- }
1951
- });
1952
- }
1953
- select.disabled = false;
1954
- };
1955
- function createOption(uri) {
1956
- var option = dom.createElement('option');
1957
- var c = kb.sym(uri);
1958
- var label;
1959
- if (options.disambiguate) {
1960
- label = utils.labelWithOntology(c, true); // Init. cap
1961
- } else {
1962
- label = utils.label(c, true);
1963
- }
1964
- option.appendChild(dom.createTextNode(label)); // Init.
1965
- option.setAttribute('value', uri);
1966
- var backgroundColor = kb.any(c, kb.sym('http://www.w3.org/ns/ui#backgroundColor'));
1967
- if (backgroundColor) {
1968
- option.setAttribute('style', 'background-color: ' + backgroundColor.value + '; ');
1969
- }
1970
- option.AJAR_uri = uri;
1971
- if (containsObject(c.value, selectedOptions)) {
1972
- option.setAttribute('selected', 'true');
1973
- }
1974
- return option;
1975
- }
1976
- if (editable) {
1977
- select.addEventListener('change', onChange, false);
1978
- }
1979
- return select;
1980
- } // makeSelectForChoice
1981
-
1982
- function containsObject(obj, list) {
1983
- var i;
1984
- for (i = 0; i < list.length; i++) {
1985
- if (list[i] === obj) {
1986
- return true;
1987
- }
1988
- }
1989
- return false;
1990
- }
1991
-
1992
- // This functions replaces the findMembersNT (thisClass) from rdflib until we fix: https://github.com/linkeddata/rdflib.js/issues/565
1993
- /**
1994
- * For anything which has thisClass (or any subclass) as its type,
1995
- * or is the object of something which has thisClass (or any subclass) as its range,
1996
- * or subject of something which has thisClass (or any subclass) as its domain
1997
- * We don't bother doing subproperty (yet?) as it doesn't seem to be used
1998
- * much.
1999
- * Get all the Classes of which we can RDFS-infer the subject is a member
2000
- * @return a hash of URIs
2001
- */
2002
- function findMembersNT(store, thisClass, quad) {
2003
- var len2;
2004
- var len4;
2005
- var m;
2006
- var pred;
2007
- var ref1;
2008
- var ref2;
2009
- var ref3;
2010
- var ref4;
2011
- var ref5;
2012
- var st;
2013
- var u;
2014
- var seeds = {};
2015
- seeds[thisClass.toNT()] = true;
2016
- var members = {};
2017
- var ref = store.transitiveClosure(seeds, store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#subClassOf'), true);
2018
- for (var t in ref) {
2019
- ref1 = store.statementsMatching(null, store.rdfFactory.namedNode('http://www.w3.org/1999/02/22-rdf-syntax-ns#type'), store.fromNT(t), quad);
2020
- for (var i = 0, len = ref1.length; i < len; i++) {
2021
- st = ref1[i];
2022
- members[st.subject.toNT()] = st;
2023
- }
2024
- ref2 = store.each(null, store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#domain'), store.fromNT(t), quad);
2025
- for (var l = 0, len1 = ref2.length; l < len1; l++) {
2026
- pred = ref2[l];
2027
- ref3 = store.statementsMatching(null, pred, null, quad);
2028
- for (m = 0, len2 = ref3.length; m < len2; m++) {
2029
- st = ref3[m];
2030
- members[st.subject.toNT()] = st;
2031
- }
2032
- }
2033
- ref4 = store.each(null, store.rdfFactory.namedNode('http://www.w3.org/2000/01/rdf-schema#range'), store.fromNT(t), quad);
2034
- for (var q = 0, len3 = ref4.length; q < len3; q++) {
2035
- pred = ref4[q];
2036
- ref5 = store.statementsMatching(null, pred, null, quad);
2037
- for (u = 0, len4 = ref5.length; u < len4; u++) {
2038
- st = ref5[u];
2039
- members[st.object.toNT()] = st;
2040
- }
2041
- }
2042
- }
2043
- return members;
2044
- }
2045
- //# sourceMappingURL=forms.js.map