solid-ui 5.0.2-4 → 5.0.2-6

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 (282) hide show
  1. package/dist/acl/access-controller.cjs.js +1 -1
  2. package/dist/acl/access-controller.cjs.js.map +1 -1
  3. package/dist/acl/access-controller.esm.js +37 -37
  4. package/dist/acl/access-groups.cjs.js +2 -2
  5. package/dist/acl/access-groups.cjs.js.map +1 -1
  6. package/dist/acl/access-groups.esm.js +78 -78
  7. package/dist/acl/acl-control.cjs.js +1 -1
  8. package/dist/acl/acl-control.cjs.js.map +1 -1
  9. package/dist/acl/acl-control.esm.js +19 -19
  10. package/dist/acl/add-agent-buttons.cjs.js +1 -1
  11. package/dist/acl/add-agent-buttons.cjs.js.map +1 -1
  12. package/dist/acl/add-agent-buttons.esm.js +51 -51
  13. package/dist/chat/bookmarks.cjs.js +1 -1
  14. package/dist/chat/bookmarks.cjs.js.map +1 -1
  15. package/dist/chat/bookmarks.esm.js +44 -44
  16. package/dist/chat/bookmarks.esm.js.map +1 -1
  17. package/dist/chat/chatLogic.cjs.js +2 -2
  18. package/dist/chat/chatLogic.cjs.js.map +1 -1
  19. package/dist/chat/chatLogic.esm.js +54 -54
  20. package/dist/chat/dateFolder.cjs.js +1 -1
  21. package/dist/chat/dateFolder.cjs.js.map +1 -1
  22. package/dist/chat/dateFolder.esm.js +30 -30
  23. package/dist/chat/infinite.cjs.js +1 -1
  24. package/dist/chat/infinite.cjs.js.map +1 -1
  25. package/dist/chat/infinite.esm.js +49 -49
  26. package/dist/chat/keys.cjs.js +2 -2
  27. package/dist/chat/keys.cjs.js.map +1 -1
  28. package/dist/chat/keys.esm.js +17 -17
  29. package/dist/chat/message.cjs.js +4 -4
  30. package/dist/chat/message.cjs.js.map +1 -1
  31. package/dist/chat/message.esm.js +114 -114
  32. package/dist/chat/message.esm.js.map +1 -1
  33. package/dist/chat/messageTools.cjs.js +1 -1
  34. package/dist/chat/messageTools.cjs.js.map +1 -1
  35. package/dist/chat/messageTools.esm.js +51 -51
  36. package/dist/chunks/{ResourceActionsMenu-Bllpr4M5.js → ResourceActionsMenu-KFMLta44.js} +78 -69
  37. package/dist/chunks/ResourceActionsMenu-KFMLta44.js.map +1 -0
  38. package/dist/chunks/{access-control-modal-CwmY_Dod.js → access-control-modal-BZdBv6VD.js} +165 -165
  39. package/dist/chunks/{access-control-modal-CwmY_Dod.js.map → access-control-modal-BZdBv6VD.js.map} +1 -1
  40. package/dist/chunks/{account-CoHPKKDu.js → account-DWmMJre6.js} +22 -22
  41. package/dist/chunks/{account-CoHPKKDu.js.map → account-DWmMJre6.js.map} +1 -1
  42. package/dist/chunks/{auth-CocCqS1p.js → auth-EK-iYNYZ.js} +37 -37
  43. package/dist/chunks/{auth-CocCqS1p.js.map → auth-EK-iYNYZ.js.map} +1 -1
  44. package/dist/chunks/{avatar-sNdKdWVO.js → avatar-BBgvMlqv.js} +13 -13
  45. package/dist/chunks/{avatar-sNdKdWVO.js.map → avatar-BBgvMlqv.js.map} +1 -1
  46. package/dist/chunks/{combobox-fSTp9qoT.js → combobox-DS6byaf1.js} +3 -3
  47. package/dist/chunks/{combobox-fSTp9qoT.js.map → combobox-DS6byaf1.js.map} +1 -1
  48. package/dist/chunks/{error-state-BD4_Wrkz.js → error-state-jV9dlFX2.js} +2 -2
  49. package/dist/chunks/{error-state-BD4_Wrkz.js.map → error-state-jV9dlFX2.js.map} +1 -1
  50. package/dist/chunks/{file-explorer-header-D0TebSYR.js → file-explorer-header-BJzo6xDU.js} +50 -50
  51. package/dist/chunks/{file-explorer-header-D0TebSYR.js.map → file-explorer-header-BJzo6xDU.js.map} +1 -1
  52. package/dist/chunks/{guard-BOicu9dt.js → guard-SxVT1xr4.js} +13 -13
  53. package/dist/chunks/{guard-BOicu9dt.js.map → guard-SxVT1xr4.js.map} +1 -1
  54. package/dist/chunks/{index.esm-C9oV3H3X.js → index.esm-BQrkxchZ.js} +2 -2
  55. package/dist/chunks/{index.esm-C9oV3H3X.js.map → index.esm-BQrkxchZ.js.map} +1 -1
  56. package/dist/chunks/{jsonld-D-TE94B0.js → jsonld-C6IOQ1Tg.js} +2 -2
  57. package/dist/chunks/{jsonld-D-TE94B0.js.map → jsonld-C6IOQ1Tg.js.map} +1 -1
  58. package/dist/chunks/{login-button-clTw_9tX.js → login-button-Dd0rwZJk.js} +11 -11
  59. package/dist/chunks/{login-button-clTw_9tX.js.map → login-button-Dd0rwZJk.js.map} +1 -1
  60. package/dist/chunks/{logout-button-CP-Pz70O.js → logout-button-Da34Lrnq.js} +11 -11
  61. package/dist/chunks/{logout-button-CP-Pz70O.js.map → logout-button-Da34Lrnq.js.map} +1 -1
  62. package/dist/chunks/{menu-D0k2fkiE.js → menu-BNJU654v.js} +2 -2
  63. package/dist/chunks/{menu-D0k2fkiE.js.map → menu-BNJU654v.js.map} +1 -1
  64. package/dist/chunks/{provider-Cuv3Kp6G.js → provider-B3FoP2qW.js} +11 -11
  65. package/dist/chunks/{provider-Cuv3Kp6G.js.map → provider-B3FoP2qW.js.map} +1 -1
  66. package/dist/chunks/{rdf-form-DVmTw3RG.js → rdf-form-BkKDmFPD.js} +36 -36
  67. package/dist/chunks/{rdf-form-DVmTw3RG.js.map → rdf-form-BkKDmFPD.js.map} +1 -1
  68. package/dist/chunks/{rdf-input-CRYLK-27.js → rdf-input-BPePtqfS.js} +61 -61
  69. package/dist/chunks/{rdf-input-CRYLK-27.js.map → rdf-input-BPePtqfS.js.map} +1 -1
  70. package/dist/chunks/{signup-button-CexdMWj6.js → signup-button-DOInssOu.js} +11 -11
  71. package/dist/chunks/{signup-button-CexdMWj6.js.map → signup-button-DOInssOu.js.map} +1 -1
  72. package/dist/chunks/{solidLogicSingleton.esm-BXyHD7mn.js → solidLogicSingleton.esm-Bvt7E7Vl.js} +50 -29
  73. package/dist/chunks/solidLogicSingleton.esm-Bvt7E7Vl.js.map +1 -0
  74. package/dist/chunks/square-arrow-out-up-right-DaALlpHo.js +9 -0
  75. package/dist/chunks/square-arrow-out-up-right-DaALlpHo.js.map +1 -0
  76. package/dist/chunks/{src-DQgHAH3d.js → src-Cv9Lm1V-.js} +3009 -2980
  77. package/dist/chunks/src-Cv9Lm1V-.js.map +1 -0
  78. package/dist/chunks/{style-CXaw5EYi.js → style-Dlw9-wPn.js} +3 -3
  79. package/dist/chunks/{style-CXaw5EYi.js.map → style-Dlw9-wPn.js.map} +1 -1
  80. package/dist/chunks/{widgets-BBEQu0CS.js → widgets-C92ihtlF.js} +733 -737
  81. package/dist/chunks/widgets-C92ihtlF.js.map +1 -0
  82. package/dist/components/access-control-modal/AccessControlAddAccess.cjs.js +1 -1
  83. package/dist/components/access-control-modal/AccessControlAddAccess.esm.js +5 -5
  84. package/dist/components/access-control-modal/AccessControlGeneralAccess.cjs.js +2 -2
  85. package/dist/components/access-control-modal/AccessControlGeneralAccess.cjs.js.map +1 -1
  86. package/dist/components/access-control-modal/AccessControlGeneralAccess.esm.js +12 -12
  87. package/dist/components/access-control-modal/AccessControlModal.cjs.js +2 -2
  88. package/dist/components/access-control-modal/AccessControlModal.cjs.js.map +1 -1
  89. package/dist/components/access-control-modal/AccessControlModal.esm.js +35 -35
  90. package/dist/components/access-control-modal/AccessControlModal.esm.js.map +1 -1
  91. package/dist/components/access-control-modal/AccessControlSharedAccess.cjs.js +1 -1
  92. package/dist/components/access-control-modal/AccessControlSharedAccess.esm.js +2 -2
  93. package/dist/components/access-control-modal/accessTargetResolver.cjs.js +1 -1
  94. package/dist/components/access-control-modal/accessTargetResolver.cjs.js.map +1 -1
  95. package/dist/components/access-control-modal/accessTargetResolver.esm.js +21 -21
  96. package/dist/components/access-control-modal.js +1 -1
  97. package/dist/components/account/Account.cjs.js +1 -1
  98. package/dist/components/account/Account.esm.js +3 -3
  99. package/dist/components/account.js +1 -1
  100. package/dist/components/all.cjs.js +1 -1
  101. package/dist/components/all.esm.js +16 -16
  102. package/dist/components/avatar.js +1 -1
  103. package/dist/components/combobox/Combobox.cjs.js +1 -1
  104. package/dist/components/combobox/Combobox.esm.js +1 -1
  105. package/dist/components/combobox.js +1 -1
  106. package/dist/components/dialog/Dialog.cjs.js +2 -2
  107. package/dist/components/dialog/Dialog.cjs.js.map +1 -1
  108. package/dist/components/dialog/Dialog.esm.js +9 -9
  109. package/dist/components/dialog/Dialog.esm.js.map +1 -1
  110. package/dist/components/dialog-provider/DialogProvider.cjs.js +1 -1
  111. package/dist/components/dialog-provider/DialogProvider.cjs.js.map +1 -1
  112. package/dist/components/dialog-provider/DialogProvider.esm.js +6 -6
  113. package/dist/components/dialogs-root/DialogsRoot.cjs.js +2 -2
  114. package/dist/components/dialogs-root/DialogsRoot.cjs.js.map +1 -1
  115. package/dist/components/dialogs-root/DialogsRoot.esm.js +7 -7
  116. package/dist/components/error-state/ErrorState.cjs.js +1 -1
  117. package/dist/components/error-state/ErrorState.esm.js +1 -1
  118. package/dist/components/error-state.js +1 -1
  119. package/dist/components/file-explorer-header/FileExplorerHeaderControls.cjs.js +2 -2
  120. package/dist/components/file-explorer-header/FileExplorerHeaderControls.cjs.js.map +1 -1
  121. package/dist/components/file-explorer-header/FileExplorerHeaderControls.esm.js +10 -10
  122. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.cjs.js +1 -1
  123. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.esm.js +5 -5
  124. package/dist/components/file-explorer-header.js +1 -1
  125. package/dist/components/guard.js +1 -1
  126. package/dist/components/login-button/LoginButton.cjs.js +1 -1
  127. package/dist/components/login-button/LoginButton.esm.js +1 -1
  128. package/dist/components/login-button.js +1 -1
  129. package/dist/components/login-modal/LoginModal.cjs.js +1 -1
  130. package/dist/components/login-modal/LoginModal.esm.js +2 -2
  131. package/dist/components/login-modal.js +1 -1
  132. package/dist/components/logout-button/LogoutButton.cjs.js +1 -1
  133. package/dist/components/logout-button/LogoutButton.esm.js +1 -1
  134. package/dist/components/logout-button.js +1 -1
  135. package/dist/components/menu/Menu.cjs.js +1 -1
  136. package/dist/components/menu/Menu.cjs.js.map +1 -1
  137. package/dist/components/menu/Menu.esm.js +1 -1
  138. package/dist/components/menu/Menu.esm.js.map +1 -1
  139. package/dist/components/menu.js +1 -1
  140. package/dist/components/provider.js +1 -1
  141. package/dist/components/rdf-form/RDFForm.cjs.js +3 -3
  142. package/dist/components/rdf-form/RDFForm.cjs.js.map +1 -1
  143. package/dist/components/rdf-form/RDFForm.esm.js +13 -13
  144. package/dist/components/rdf-form/RDFForm.esm.js.map +1 -1
  145. package/dist/components/rdf-form.js +1 -1
  146. package/dist/components/rdf-input/RDFInput.cjs.js +2 -2
  147. package/dist/components/rdf-input/RDFInput.cjs.js.map +1 -1
  148. package/dist/components/rdf-input/RDFInput.esm.js +4 -4
  149. package/dist/components/rdf-input/RDFInput.esm.js.map +1 -1
  150. package/dist/components/rdf-input.js +1 -1
  151. package/dist/components/resource-actions-menu/ResourceActionsMenu.cjs.js +9 -3
  152. package/dist/components/resource-actions-menu/ResourceActionsMenu.cjs.js.map +1 -1
  153. package/dist/components/resource-actions-menu/ResourceActionsMenu.d.ts +1 -0
  154. package/dist/components/resource-actions-menu/ResourceActionsMenu.d.ts.map +1 -1
  155. package/dist/components/resource-actions-menu/ResourceActionsMenu.esm.js +18 -9
  156. package/dist/components/resource-actions-menu/ResourceActionsMenu.esm.js.map +1 -1
  157. package/dist/components/resource-actions-menu.js +1 -1
  158. package/dist/components/select/Select.cjs.js +1 -1
  159. package/dist/components/select/Select.cjs.js.map +1 -1
  160. package/dist/components/select/Select.esm.js +1 -1
  161. package/dist/components/signup-button/SignupButton.cjs.js +1 -1
  162. package/dist/components/signup-button/SignupButton.esm.js +1 -1
  163. package/dist/components/signup-button.js +1 -1
  164. package/dist/components.js +21 -21
  165. package/dist/create/create.cjs.js +1 -1
  166. package/dist/create/create.cjs.js.map +1 -1
  167. package/dist/create/create.esm.js +23 -23
  168. package/dist/header/index.cjs.js +1 -1
  169. package/dist/header/index.cjs.js.map +1 -1
  170. package/dist/header/index.esm.js +53 -53
  171. package/dist/index.cjs.js +1 -1
  172. package/dist/index.cjs.js.map +1 -1
  173. package/dist/index.esm.js +23 -22
  174. package/dist/index.esm.js.map +1 -1
  175. package/dist/index.js +11 -11
  176. package/dist/lib/auth/SolidAuth.cjs.js +1 -1
  177. package/dist/lib/auth/SolidAuth.cjs.js.map +1 -1
  178. package/dist/lib/auth/SolidAuth.esm.js +8 -8
  179. package/dist/lib/auth/SolidAuth.esm.js.map +1 -1
  180. package/dist/lib/code-editor/CodeEditor.cjs.js +1 -1
  181. package/dist/lib/code-editor/CodeEditor.cjs.js.map +1 -1
  182. package/dist/lib/code-editor/CodeEditor.d.ts.map +1 -1
  183. package/dist/lib/code-editor/CodeEditor.esm.js +34 -30
  184. package/dist/lib/code-editor/CodeEditor.esm.js.map +1 -1
  185. package/dist/lib/components/dialog-component/DialogComponent.cjs.js +1 -1
  186. package/dist/lib/components/dialog-component/DialogComponent.cjs.js.map +1 -1
  187. package/dist/lib/components/dialog-component/DialogComponent.esm.js +4 -4
  188. package/dist/lib/components/index.cjs.js +1 -1
  189. package/dist/lib/components/index.esm.js +3 -3
  190. package/dist/lib/dialogs/helpers.cjs.js +1 -1
  191. package/dist/lib/dialogs/helpers.cjs.js.map +1 -1
  192. package/dist/lib/dialogs/helpers.esm.js +4 -4
  193. package/dist/lib/file-explorer/index.cjs.js +1 -1
  194. package/dist/lib/file-explorer/index.d.ts +1 -0
  195. package/dist/lib/file-explorer/index.d.ts.map +1 -1
  196. package/dist/lib/file-explorer/index.esm.js +2 -1
  197. package/dist/lib/file-explorer/pane-menu-items.cjs.js +2 -0
  198. package/dist/lib/file-explorer/pane-menu-items.cjs.js.map +1 -0
  199. package/dist/lib/file-explorer/pane-menu-items.d.ts +22 -0
  200. package/dist/lib/file-explorer/pane-menu-items.d.ts.map +1 -0
  201. package/dist/lib/file-explorer/pane-menu-items.esm.js +20 -0
  202. package/dist/lib/file-explorer/pane-menu-items.esm.js.map +1 -0
  203. package/dist/lib/file-explorer/relevant-panes.cjs.js +1 -1
  204. package/dist/lib/file-explorer/relevant-panes.cjs.js.map +1 -1
  205. package/dist/lib/file-explorer/relevant-panes.esm.js +8 -8
  206. package/dist/lib/messageArea.cjs.js +1 -1
  207. package/dist/lib/messageArea.cjs.js.map +1 -1
  208. package/dist/lib/messageArea.esm.js +27 -27
  209. package/dist/lib/pad.cjs.js +1 -1
  210. package/dist/lib/pad.cjs.js.map +1 -1
  211. package/dist/lib/pad.esm.js +15 -15
  212. package/dist/lib/participation.cjs.js +1 -1
  213. package/dist/lib/participation.cjs.js.map +1 -1
  214. package/dist/lib/participation.esm.js +59 -59
  215. package/dist/lib/preferences.cjs.js +1 -1
  216. package/dist/lib/preferences.cjs.js.map +1 -1
  217. package/dist/lib/preferences.esm.js +28 -28
  218. package/dist/lib/table.cjs.js +3 -3
  219. package/dist/lib/table.cjs.js.map +1 -1
  220. package/dist/lib/table.esm.js +123 -123
  221. package/dist/lib/table.esm.js.map +1 -1
  222. package/dist/lib/tabs.cjs.js +1 -1
  223. package/dist/lib/tabs.cjs.js.map +1 -1
  224. package/dist/lib/tabs.esm.js +16 -16
  225. package/dist/loader.js +11 -11
  226. package/dist/login/login.cjs.js +6 -6
  227. package/dist/login/login.cjs.js.map +1 -1
  228. package/dist/login/login.esm.js +142 -142
  229. package/dist/media/media-capture.cjs.js +1 -1
  230. package/dist/media/media-capture.cjs.js.map +1 -1
  231. package/dist/media/media-capture.esm.js +6 -6
  232. package/dist/solid-ui.js +34 -28
  233. package/dist/solid-ui.min.js +34 -28
  234. package/dist/solid-ui.min.js.map +1 -1
  235. package/dist/utils/index.cjs.js +1 -1
  236. package/dist/utils/index.cjs.js.map +1 -1
  237. package/dist/utils/index.esm.js +4 -4
  238. package/dist/utils/keyHelpers/accessData.cjs.js +1 -1
  239. package/dist/utils/keyHelpers/accessData.cjs.js.map +1 -1
  240. package/dist/utils/keyHelpers/accessData.esm.js +15 -15
  241. package/dist/utils/label.cjs.js +1 -1
  242. package/dist/utils/label.cjs.js.map +1 -1
  243. package/dist/utils/label.esm.js +4 -4
  244. package/dist/widgets/buttons.cjs.js +12 -12
  245. package/dist/widgets/buttons.cjs.js.map +1 -1
  246. package/dist/widgets/buttons.esm.js +179 -179
  247. package/dist/widgets/error.cjs.js +1 -1
  248. package/dist/widgets/error.cjs.js.map +1 -1
  249. package/dist/widgets/error.esm.js +5 -5
  250. package/dist/widgets/forms/autocomplete/autocompleteBar.cjs.js +1 -1
  251. package/dist/widgets/forms/autocomplete/autocompleteBar.cjs.js.map +1 -1
  252. package/dist/widgets/forms/autocomplete/autocompleteBar.esm.js +17 -17
  253. package/dist/widgets/forms/autocomplete/autocompleteField.cjs.js +1 -1
  254. package/dist/widgets/forms/autocomplete/autocompleteField.cjs.js.map +1 -1
  255. package/dist/widgets/forms/autocomplete/autocompleteField.esm.js +23 -23
  256. package/dist/widgets/forms/autocomplete/autocompletePicker.cjs.js +1 -1
  257. package/dist/widgets/forms/autocomplete/autocompletePicker.cjs.js.map +1 -1
  258. package/dist/widgets/forms/autocomplete/autocompletePicker.esm.js +26 -26
  259. package/dist/widgets/forms/autocomplete/language.cjs.js +1 -1
  260. package/dist/widgets/forms/autocomplete/language.cjs.js.map +1 -1
  261. package/dist/widgets/forms/autocomplete/language.esm.js +9 -9
  262. package/dist/widgets/forms/autocomplete/publicData.cjs.js +5 -5
  263. package/dist/widgets/forms/autocomplete/publicData.cjs.js.map +1 -1
  264. package/dist/widgets/forms/autocomplete/publicData.esm.js +67 -67
  265. package/dist/widgets/forms/basic.cjs.js +1 -1
  266. package/dist/widgets/forms/basic.cjs.js.map +1 -1
  267. package/dist/widgets/forms/basic.esm.js +11 -11
  268. package/dist/widgets/forms.cjs.js +4 -4
  269. package/dist/widgets/forms.cjs.js.map +1 -1
  270. package/dist/widgets/forms.esm.js +561 -561
  271. package/dist/widgets/forms.esm.js.map +1 -1
  272. package/dist/widgets/index.cjs.js +1 -1
  273. package/dist/widgets/index.cjs.js.map +1 -1
  274. package/dist/widgets/index.esm.js +82 -82
  275. package/dist/widgets/peoplePicker.cjs.js +2 -2
  276. package/dist/widgets/peoplePicker.cjs.js.map +1 -1
  277. package/dist/widgets/peoplePicker.esm.js +82 -82
  278. package/package.json +3 -3
  279. package/dist/chunks/ResourceActionsMenu-Bllpr4M5.js.map +0 -1
  280. package/dist/chunks/solidLogicSingleton.esm-BXyHD7mn.js.map +0 -1
  281. package/dist/chunks/src-DQgHAH3d.js.map +0 -1
  282. package/dist/chunks/widgets-BBEQu0CS.js.map +0 -1
@@ -1,2 +1,2 @@
1
- const e=require("../utils/label.cjs.js");require("../utils/index.cjs.js");const t=require("../lib/debug.cjs.js"),n=require("./acl.cjs.js"),r=require("../lib/style.cjs.js"),i=require("./access-groups.cjs.js"),a=require("./acl-control.cjs.js");let o=require("rdflib");var s=class{subject;noun;context;statusElement;targetIsProtected;targetDoc;targetACLDoc;defaultHolder;defaultACLDoc;prospectiveDefaultHolder;store;dom;mainCombo;defaultsCombo;isContainer;defaultsDiffer;rootElement;isUsingDefaults;constructor(e,t,a,o,s,c,l,u,d,f,p,m){if(this.subject=e,this.noun=t,this.context=a,this.statusElement=o,this.targetIsProtected=s,this.targetDoc=c,this.targetACLDoc=l,this.defaultHolder=u,this.defaultACLDoc=d,this.prospectiveDefaultHolder=f,this.store=p,this.dom=m,this.rootElement=m.createElement(`div`),this.rootElement.setAttribute(`style`,r.style.aclGroupContent),this.isContainer=c.uri.slice(-1)===`/`,u&&d){this.isUsingDefaults=!0;let e=n.adoptACLDefault(this.targetDoc,l,u,d);this.mainCombo=new i.AccessGroups(c,l,this,e,{defaults:this.isContainer}),this.defaultsCombo=null,this.defaultsDiffer=!1}else this.isUsingDefaults=!1,this.mainCombo=new i.AccessGroups(c,l,this,p),this.defaultsCombo=new i.AccessGroups(c,l,this,p,{defaults:this.isContainer}),this.defaultsDiffer=!n.sameACL(this.mainCombo.aclMap,this.defaultsCombo.aclMap)}get isEditable(){return!this.isUsingDefaults}render(){if(this.rootElement.innerHTML=``,this.isUsingDefaults){if(this.renderStatus(`The sharing for this ${this.noun} is the default for folder `),this.defaultHolder){let e=this.statusElement.appendChild(this.dom.createElement(`a`));e.href=this.defaultHolder.uri,e.innerText=a.shortNameForFolder(this.defaultHolder)}}else!this.defaultsDiffer&&this.isContainer?this.renderStatus(`This is also the default for things in this folder.`):this.renderStatus(``);return this.rootElement.appendChild(this.mainCombo.render()),this.defaultsCombo&&this.defaultsDiffer?(this.rootElement.appendChild(this.renderRemoveDefaultsController()),this.rootElement.appendChild(this.defaultsCombo.render())):this.isEditable&&this.isContainer&&this.rootElement.appendChild(this.renderAddDefaultsController()),!this.targetIsProtected&&this.isUsingDefaults?this.rootElement.appendChild(this.renderAddAclsController()):this.targetIsProtected||this.rootElement.appendChild(this.renderRemoveAclsController()),this.rootElement}renderRemoveAclsController(){let t=this.dom.createElement(`button`);return t.innerText=`Remove custom sharing settings for this ${this.noun} -- just use default${this.prospectiveDefaultHolder?` for ${e.label(this.prospectiveDefaultHolder)}`:``}`,t.setAttribute(`style`,r.style.bigButton),t.addEventListener(`click`,()=>this.removeAcls().then(()=>this.render()).catch(e=>this.renderStatus(e))),t}renderAddAclsController(){let e=this.dom.createElement(`button`);return e.innerText=`Set specific sharing for this ${this.noun}`,e.setAttribute(`style`,r.style.bigButton),e.addEventListener(`click`,()=>this.addAcls().then(()=>this.render()).catch(e=>this.renderStatus(e))),e}renderAddDefaultsController(){let e=this.dom.createElement(`div`);e.setAttribute(`style`,r.style.defaultsController);let t=e.appendChild(this.dom.createElement(`div`));t.innerText=`Sharing for things within the folder currently tracks sharing for the folder.`,t.setAttribute(`style`,r.style.defaultsControllerNotice);let n=e.appendChild(this.dom.createElement(`button`));return n.innerText=`Set the sharing of folder contents separately from the sharing for the folder`,n.setAttribute(`style`,r.style.bigButton),n.addEventListener(`click`,()=>this.addDefaults().then(()=>this.render())),e}renderRemoveDefaultsController(){let e=this.dom.createElement(`div`);e.setAttribute(`style`,r.style.defaultsController);let t=e.appendChild(this.dom.createElement(`div`));t.innerText=`Access to things within this folder:`,t.setAttribute(`style`,r.style.defaultsControllerNotice);let n=e.appendChild(this.dom.createElement(`button`));return n.innerText=`Set default for folder contents to just track the sharing for the folder`,n.setAttribute(`style`,r.style.bigButton),n.addEventListener(`click`,()=>this.removeDefaults().then(()=>this.render()).catch(e=>this.renderStatus(e))),e}renderTemporaryStatus(e){this.statusElement.setAttribute(`style`,r.style.aclControlBoxStatusRevealed),this.statusElement.innerText=e,this.statusElement.setAttribute(`style`,r.style.temporaryStatusInit),setTimeout(()=>{this.statusElement.setAttribute(`style`,r.style.temporaryStatusEnd)}),setTimeout(()=>{this.statusElement.innerText=``},5e3)}renderStatus(e){e||this.statusElement.setAttribute(`style`,r.style.aclControlBoxStatusRevealed),this.statusElement.innerText=e}async addAcls(){if(!this.defaultHolder||!this.defaultACLDoc){let e=`Unable to find defaults to copy`;return t.error(e),Promise.reject(e)}n.adoptACLDefault(this.targetDoc,this.targetACLDoc,this.defaultHolder,this.defaultACLDoc).statements.forEach(e=>this.store.add(e.subject,e.predicate,e.object,this.targetACLDoc));try{return await this.store.fetcher.putBack(this.targetACLDoc),this.isUsingDefaults=!1,Promise.resolve()}catch(e){let n=` Error writing back access control file! ${e}`;return t.error(n),Promise.reject(n)}}async addDefaults(){this.defaultsCombo=new i.AccessGroups(this.targetDoc,this.targetACLDoc,this,this.store,{defaults:!0}),this.defaultsDiffer=!0}async removeAcls(){try{await this.store.fetcher.delete(this.targetACLDoc.uri,{}),this.isUsingDefaults=!0;try{this.prospectiveDefaultHolder=await n.getProspectiveHolder(this.targetDoc.uri)}catch(e){t.warn(e)}}catch(e){let n=`Error deleting access control file: ${this.targetACLDoc}: ${e}`;return t.error(n),Promise.reject(n)}}async removeDefaults(){let e=this.defaultsCombo;try{this.defaultsCombo=null,this.defaultsDiffer=!1,await this.save()}catch(n){return this.defaultsCombo=e,this.defaultsDiffer=!0,t.error(n),Promise.reject(n)}}save(){let e=(0,o.graph)();this.isContainer?this.defaultsCombo&&this.defaultsDiffer?(n.makeACLGraphbyCombo(e,this.targetDoc,this.mainCombo.byCombo,this.targetACLDoc,!0),n.makeACLGraphbyCombo(e,this.targetDoc,this.defaultsCombo.byCombo,this.targetACLDoc,!1,!0)):n.makeACLGraphbyCombo(e,this.targetDoc,this.mainCombo.byCombo,this.targetACLDoc,!0,!0):n.makeACLGraphbyCombo(e,this.targetDoc,this.mainCombo.byCombo,this.targetACLDoc,!0),e.fetcher=(0,o.fetcher)(e,{fetch:this.store.fetcher._fetch});let r=e.updater||new o.UpdateManager(e);return new Promise((i,a)=>{r.put(this.targetACLDoc,e.statementsMatching(void 0,void 0,void 0,this.targetACLDoc),`text/turtle`,(r,o,s)=>{if(!o)return a(Error(`ACL file save failed: ${s}`));this.store.fetcher.unload(this.targetACLDoc),this.store.add(e.statements),this.store.fetcher.requested[this.targetACLDoc.uri]=`done`,this.mainCombo.store=this.store,this.defaultsCombo&&(this.defaultsCombo.store=this.store),this.defaultsDiffer=!!this.defaultsCombo&&!n.sameACL(this.mainCombo.aclMap,this.defaultsCombo.aclMap),t.log(`ACL modification: success!`),i()})})}};exports.AccessController=s;
1
+ const e=require("../utils/label.cjs.js"),t=require("./acl.cjs.js"),n=require("./access-groups.cjs.js"),r=require("./acl-control.cjs.js");require("../utils/index.cjs.js");const i=require("../lib/debug.cjs.js"),a=require("../lib/style.cjs.js");let o=require("rdflib");var s=class{subject;noun;context;statusElement;targetIsProtected;targetDoc;targetACLDoc;defaultHolder;defaultACLDoc;prospectiveDefaultHolder;store;dom;mainCombo;defaultsCombo;isContainer;defaultsDiffer;rootElement;isUsingDefaults;constructor(e,r,i,o,s,c,l,u,d,f,p,m){if(this.subject=e,this.noun=r,this.context=i,this.statusElement=o,this.targetIsProtected=s,this.targetDoc=c,this.targetACLDoc=l,this.defaultHolder=u,this.defaultACLDoc=d,this.prospectiveDefaultHolder=f,this.store=p,this.dom=m,this.rootElement=m.createElement(`div`),this.rootElement.setAttribute(`style`,a.style.aclGroupContent),this.isContainer=c.uri.slice(-1)===`/`,u&&d){this.isUsingDefaults=!0;let e=t.adoptACLDefault(this.targetDoc,l,u,d);this.mainCombo=new n.AccessGroups(c,l,this,e,{defaults:this.isContainer}),this.defaultsCombo=null,this.defaultsDiffer=!1}else this.isUsingDefaults=!1,this.mainCombo=new n.AccessGroups(c,l,this,p),this.defaultsCombo=new n.AccessGroups(c,l,this,p,{defaults:this.isContainer}),this.defaultsDiffer=!t.sameACL(this.mainCombo.aclMap,this.defaultsCombo.aclMap)}get isEditable(){return!this.isUsingDefaults}render(){if(this.rootElement.innerHTML=``,this.isUsingDefaults){if(this.renderStatus(`The sharing for this ${this.noun} is the default for folder `),this.defaultHolder){let e=this.statusElement.appendChild(this.dom.createElement(`a`));e.href=this.defaultHolder.uri,e.innerText=r.shortNameForFolder(this.defaultHolder)}}else!this.defaultsDiffer&&this.isContainer?this.renderStatus(`This is also the default for things in this folder.`):this.renderStatus(``);return this.rootElement.appendChild(this.mainCombo.render()),this.defaultsCombo&&this.defaultsDiffer?(this.rootElement.appendChild(this.renderRemoveDefaultsController()),this.rootElement.appendChild(this.defaultsCombo.render())):this.isEditable&&this.isContainer&&this.rootElement.appendChild(this.renderAddDefaultsController()),!this.targetIsProtected&&this.isUsingDefaults?this.rootElement.appendChild(this.renderAddAclsController()):this.targetIsProtected||this.rootElement.appendChild(this.renderRemoveAclsController()),this.rootElement}renderRemoveAclsController(){let t=this.dom.createElement(`button`);return t.innerText=`Remove custom sharing settings for this ${this.noun} -- just use default${this.prospectiveDefaultHolder?` for ${e.label(this.prospectiveDefaultHolder)}`:``}`,t.setAttribute(`style`,a.style.bigButton),t.addEventListener(`click`,()=>this.removeAcls().then(()=>this.render()).catch(e=>this.renderStatus(e))),t}renderAddAclsController(){let e=this.dom.createElement(`button`);return e.innerText=`Set specific sharing for this ${this.noun}`,e.setAttribute(`style`,a.style.bigButton),e.addEventListener(`click`,()=>this.addAcls().then(()=>this.render()).catch(e=>this.renderStatus(e))),e}renderAddDefaultsController(){let e=this.dom.createElement(`div`);e.setAttribute(`style`,a.style.defaultsController);let t=e.appendChild(this.dom.createElement(`div`));t.innerText=`Sharing for things within the folder currently tracks sharing for the folder.`,t.setAttribute(`style`,a.style.defaultsControllerNotice);let n=e.appendChild(this.dom.createElement(`button`));return n.innerText=`Set the sharing of folder contents separately from the sharing for the folder`,n.setAttribute(`style`,a.style.bigButton),n.addEventListener(`click`,()=>this.addDefaults().then(()=>this.render())),e}renderRemoveDefaultsController(){let e=this.dom.createElement(`div`);e.setAttribute(`style`,a.style.defaultsController);let t=e.appendChild(this.dom.createElement(`div`));t.innerText=`Access to things within this folder:`,t.setAttribute(`style`,a.style.defaultsControllerNotice);let n=e.appendChild(this.dom.createElement(`button`));return n.innerText=`Set default for folder contents to just track the sharing for the folder`,n.setAttribute(`style`,a.style.bigButton),n.addEventListener(`click`,()=>this.removeDefaults().then(()=>this.render()).catch(e=>this.renderStatus(e))),e}renderTemporaryStatus(e){this.statusElement.setAttribute(`style`,a.style.aclControlBoxStatusRevealed),this.statusElement.innerText=e,this.statusElement.setAttribute(`style`,a.style.temporaryStatusInit),setTimeout(()=>{this.statusElement.setAttribute(`style`,a.style.temporaryStatusEnd)}),setTimeout(()=>{this.statusElement.innerText=``},5e3)}renderStatus(e){e||this.statusElement.setAttribute(`style`,a.style.aclControlBoxStatusRevealed),this.statusElement.innerText=e}async addAcls(){if(!this.defaultHolder||!this.defaultACLDoc){let e=`Unable to find defaults to copy`;return i.error(e),Promise.reject(e)}t.adoptACLDefault(this.targetDoc,this.targetACLDoc,this.defaultHolder,this.defaultACLDoc).statements.forEach(e=>this.store.add(e.subject,e.predicate,e.object,this.targetACLDoc));try{return await this.store.fetcher.putBack(this.targetACLDoc),this.isUsingDefaults=!1,Promise.resolve()}catch(e){let t=` Error writing back access control file! ${e}`;return i.error(t),Promise.reject(t)}}async addDefaults(){this.defaultsCombo=new n.AccessGroups(this.targetDoc,this.targetACLDoc,this,this.store,{defaults:!0}),this.defaultsDiffer=!0}async removeAcls(){try{await this.store.fetcher.delete(this.targetACLDoc.uri,{}),this.isUsingDefaults=!0;try{this.prospectiveDefaultHolder=await t.getProspectiveHolder(this.targetDoc.uri)}catch(e){i.warn(e)}}catch(e){let t=`Error deleting access control file: ${this.targetACLDoc}: ${e}`;return i.error(t),Promise.reject(t)}}async removeDefaults(){let e=this.defaultsCombo;try{this.defaultsCombo=null,this.defaultsDiffer=!1,await this.save()}catch(t){return this.defaultsCombo=e,this.defaultsDiffer=!0,i.error(t),Promise.reject(t)}}save(){let e=(0,o.graph)();this.isContainer?this.defaultsCombo&&this.defaultsDiffer?(t.makeACLGraphbyCombo(e,this.targetDoc,this.mainCombo.byCombo,this.targetACLDoc,!0),t.makeACLGraphbyCombo(e,this.targetDoc,this.defaultsCombo.byCombo,this.targetACLDoc,!1,!0)):t.makeACLGraphbyCombo(e,this.targetDoc,this.mainCombo.byCombo,this.targetACLDoc,!0,!0):t.makeACLGraphbyCombo(e,this.targetDoc,this.mainCombo.byCombo,this.targetACLDoc,!0),e.fetcher=(0,o.fetcher)(e,{fetch:this.store.fetcher._fetch});let n=e.updater||new o.UpdateManager(e);return new Promise((r,a)=>{n.put(this.targetACLDoc,e.statementsMatching(void 0,void 0,void 0,this.targetACLDoc),`text/turtle`,(n,o,s)=>{if(!o)return a(Error(`ACL file save failed: ${s}`));this.store.fetcher.unload(this.targetACLDoc),this.store.add(e.statements),this.store.fetcher.requested[this.targetACLDoc.uri]=`done`,this.mainCombo.store=this.store,this.defaultsCombo&&(this.defaultsCombo.store=this.store),this.defaultsDiffer=!!this.defaultsCombo&&!t.sameACL(this.mainCombo.aclMap,this.defaultsCombo.aclMap),i.log(`ACL modification: success!`),r()})})}};exports.AccessController=s;
2
2
  //# sourceMappingURL=access-controller.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"access-controller.cjs.js","names":["style","adoptACLDefault","AccessGroups","sameACL","shortNameForFolder","error","getProspectiveHolder","graph","fetcher","UpdateManager","require_label","require_debug","require_acl","require_style","require_access_groups","require_acl_control","rdflib","AccessController","subject","noun","context","statusElement","targetIsProtected","targetDoc","targetACLDoc","defaultHolder","defaultACLDoc","prospectiveDefaultHolder","store","dom","aclDefaultStore","defaultHolderLink","useDefaultButton","error","addAclButton","containerElement","noticeElement","button","message","st","error$2","error$3","fallbackCombo","error$1","newAClGraph","updater","ok","reject","resolve"],"sources":["../../src/acl/access-controller.ts"],"sourcesContent":["/**\n * Contains the [[AccessController]] class\n * @packageDocumentation\n */\n\nimport { adoptACLDefault, getProspectiveHolder, makeACLGraphbyCombo, sameACL } from './acl'\nimport { fetcher, graph, NamedNode, UpdateManager } from 'rdflib'\nimport { AccessGroups } from './access-groups'\nimport { DataBrowserContext } from 'pane-registry'\nimport { shortNameForFolder } from './acl-control'\nimport * as utils from '../utils'\nimport * as debug from '../lib/debug'\nimport { style } from '../lib/style'\n\n/**\n * Rendered HTML component used in the databrowser's Sharing pane.\n */\nexport class AccessController {\n public mainCombo: AccessGroups\n public defaultsCombo: AccessGroups | null\n private readonly isContainer: boolean\n private defaultsDiffer: boolean\n private readonly rootElement: HTMLDivElement\n private isUsingDefaults: boolean\n\n constructor (\n public subject: NamedNode,\n public noun: string,\n public context: DataBrowserContext,\n private statusElement: HTMLElement,\n public targetIsProtected: boolean,\n private targetDoc: NamedNode,\n private targetACLDoc: NamedNode,\n private defaultHolder: NamedNode | null,\n private defaultACLDoc: NamedNode | null,\n private prospectiveDefaultHolder: NamedNode | undefined,\n public store,\n public dom: HTMLDocument\n ) {\n this.rootElement = dom.createElement('div')\n this.rootElement.setAttribute('style', style.aclGroupContent)\n this.isContainer = targetDoc.uri.slice(-1) === '/' // Give default for all directories\n if (defaultHolder && defaultACLDoc) {\n this.isUsingDefaults = true\n const aclDefaultStore = adoptACLDefault(this.targetDoc, targetACLDoc, defaultHolder, defaultACLDoc)\n this.mainCombo = new AccessGroups(targetDoc, targetACLDoc, this, aclDefaultStore, { defaults: this.isContainer })\n this.defaultsCombo = null\n this.defaultsDiffer = false\n } else {\n this.isUsingDefaults = false\n this.mainCombo = new AccessGroups(targetDoc, targetACLDoc, this, store)\n this.defaultsCombo = new AccessGroups(targetDoc, targetACLDoc, this, store, { defaults: this.isContainer })\n this.defaultsDiffer = !sameACL(this.mainCombo.aclMap, this.defaultsCombo.aclMap)\n }\n }\n\n public get isEditable (): boolean {\n return !this.isUsingDefaults\n }\n\n public render (): HTMLElement {\n this.rootElement.innerHTML = ''\n if (this.isUsingDefaults) {\n this.renderStatus(`The sharing for this ${this.noun} is the default for folder `)\n if (this.defaultHolder) {\n const defaultHolderLink = this.statusElement.appendChild(this.dom.createElement('a'))\n defaultHolderLink.href = this.defaultHolder.uri\n defaultHolderLink.innerText = shortNameForFolder(this.defaultHolder)\n }\n } else if (!this.defaultsDiffer && this.isContainer) {\n this.renderStatus('This is also the default for things in this folder.')\n } else {\n this.renderStatus('')\n }\n this.rootElement.appendChild(this.mainCombo.render())\n if (this.defaultsCombo && this.defaultsDiffer) {\n this.rootElement.appendChild(this.renderRemoveDefaultsController())\n this.rootElement.appendChild(this.defaultsCombo.render())\n } else if (this.isEditable && this.isContainer) {\n this.rootElement.appendChild(this.renderAddDefaultsController())\n }\n if (!this.targetIsProtected && this.isUsingDefaults) {\n this.rootElement.appendChild(this.renderAddAclsController())\n } else if (!this.targetIsProtected) {\n this.rootElement.appendChild(this.renderRemoveAclsController())\n }\n return this.rootElement\n }\n\n private renderRemoveAclsController (): HTMLElement {\n const useDefaultButton = this.dom.createElement('button')\n useDefaultButton.innerText = `Remove custom sharing settings for this ${this.noun} -- just use default${this.prospectiveDefaultHolder ? ` for ${utils.label(this.prospectiveDefaultHolder)}` : ''}`\n useDefaultButton.setAttribute('style', style.bigButton)\n useDefaultButton.addEventListener('click', () => this.removeAcls()\n .then(() => this.render())\n .catch(error => this.renderStatus(error)))\n return useDefaultButton\n }\n\n private renderAddAclsController (): HTMLElement {\n const addAclButton = this.dom.createElement('button')\n addAclButton.innerText = `Set specific sharing for this ${this.noun}`\n addAclButton.setAttribute('style', style.bigButton)\n addAclButton.addEventListener('click', () => this.addAcls()\n .then(() => this.render())\n .catch(error => this.renderStatus(error)))\n return addAclButton\n }\n\n private renderAddDefaultsController (): HTMLElement {\n const containerElement = this.dom.createElement('div')\n containerElement.setAttribute('style', style.defaultsController)\n\n const noticeElement = containerElement.appendChild(this.dom.createElement('div'))\n noticeElement.innerText = 'Sharing for things within the folder currently tracks sharing for the folder.'\n noticeElement.setAttribute('style', style.defaultsControllerNotice)\n\n const button = containerElement.appendChild(this.dom.createElement('button'))\n button.innerText = 'Set the sharing of folder contents separately from the sharing for the folder'\n button.setAttribute('style', style.bigButton)\n button.addEventListener('click', () => this.addDefaults()\n .then(() => this.render()))\n return containerElement\n }\n\n private renderRemoveDefaultsController (): HTMLElement {\n const containerElement = this.dom.createElement('div')\n containerElement.setAttribute('style', style.defaultsController)\n\n const noticeElement = containerElement.appendChild(this.dom.createElement('div'))\n noticeElement.innerText = 'Access to things within this folder:'\n noticeElement.setAttribute('style', style.defaultsControllerNotice)\n\n const button = containerElement.appendChild(this.dom.createElement('button'))\n button.innerText = 'Set default for folder contents to just track the sharing for the folder'\n button.setAttribute('style', style.bigButton)\n button.addEventListener('click', () => this.removeDefaults()\n .then(() => this.render())\n .catch(error => this.renderStatus(error)))\n return containerElement\n }\n\n public renderTemporaryStatus (message: string): void {\n // @@ TODO Introduce better system for error notification to user https://github.com/solidos/mashlib/issues/87\n this.statusElement.setAttribute('style', style.aclControlBoxStatusRevealed)\n this.statusElement.innerText = message\n this.statusElement.setAttribute('style', style.temporaryStatusInit)\n setTimeout(() => {\n this.statusElement.setAttribute('style', style.temporaryStatusEnd)\n })\n setTimeout(() => {\n this.statusElement.innerText = ''\n }, 5000)\n }\n\n public renderStatus (message: string): void {\n // @@ TODO Introduce better system for error notification to user https://github.com/solidos/mashlib/issues/87\n if (!message) {\n this.statusElement.setAttribute('style', style.aclControlBoxStatusRevealed)\n }\n this.statusElement.innerText = message\n }\n\n private async addAcls (): Promise<void> {\n if (!this.defaultHolder || !this.defaultACLDoc) {\n const message = 'Unable to find defaults to copy'\n debug.error(message)\n return Promise.reject(message)\n }\n const aclGraph = adoptACLDefault(this.targetDoc, this.targetACLDoc, this.defaultHolder, this.defaultACLDoc)\n aclGraph.statements.forEach(st => this.store.add(st.subject, st.predicate, st.object, this.targetACLDoc))\n try {\n await this.store.fetcher.putBack(this.targetACLDoc)\n this.isUsingDefaults = false\n return Promise.resolve()\n } catch (error) {\n const message = ` Error writing back access control file! ${error}`\n debug.error(message)\n return Promise.reject(message)\n }\n }\n\n private async addDefaults (): Promise<void> {\n this.defaultsCombo = new AccessGroups(this.targetDoc, this.targetACLDoc, this, this.store, { defaults: true })\n this.defaultsDiffer = true\n }\n\n private async removeAcls (): Promise<void> {\n try {\n await this.store.fetcher.delete(this.targetACLDoc.uri, {})\n this.isUsingDefaults = true\n try {\n this.prospectiveDefaultHolder = await getProspectiveHolder(this.targetDoc.uri)\n } catch (error) {\n // No need to show this error in status, but good to warn about it in console\n debug.warn(error)\n }\n } catch (error) {\n const message = `Error deleting access control file: ${this.targetACLDoc}: ${error}`\n debug.error(message)\n return Promise.reject(message)\n }\n }\n\n private async removeDefaults (): Promise<void> {\n const fallbackCombo = this.defaultsCombo\n try {\n this.defaultsCombo = null\n this.defaultsDiffer = false\n await this.save()\n } catch (error) {\n this.defaultsCombo = fallbackCombo\n this.defaultsDiffer = true\n debug.error(error)\n return Promise.reject(error)\n }\n }\n\n public save (): Promise<void> {\n // build graph\n const newAClGraph = graph()\n if (!this.isContainer) {\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, true)\n } else if (this.defaultsCombo && this.defaultsDiffer) {\n // Pair of controls\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, true)\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.defaultsCombo.byCombo, this.targetACLDoc, false, true)\n } else {\n // Linked controls\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, true, true)\n }\n\n // add authenticated fetcher\n newAClGraph.fetcher = fetcher(newAClGraph, { fetch: this.store.fetcher._fetch })\n const updater = newAClGraph.updater || new UpdateManager(newAClGraph)\n\n // save ACL resource\n return new Promise((resolve, reject) => {\n updater.put(\n this.targetACLDoc,\n newAClGraph.statementsMatching(undefined, undefined, undefined, this.targetACLDoc),\n 'text/turtle',\n (uri, ok, message) => {\n if (!ok) {\n return reject(new Error(`ACL file save failed: ${message}`))\n }\n this.store.fetcher.unload(this.targetACLDoc)\n this.store.add(newAClGraph.statements)\n this.store.fetcher.requested[this.targetACLDoc.uri] = 'done' // missing: save headers\n this.mainCombo.store = this.store\n if (this.defaultsCombo) {\n this.defaultsCombo.store = this.store\n }\n this.defaultsDiffer = !!this.defaultsCombo && !sameACL(this.mainCombo.aclMap, this.defaultsCombo.aclMap)\n debug.log('ACL modification: success!')\n resolve()\n }\n )\n })\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"access-controller.cjs.js","names":["style","adoptACLDefault","AccessGroups","sameACL","shortNameForFolder","error","getProspectiveHolder","graph","fetcher","UpdateManager","require_label","require_acl","require_access_groups","require_acl_control","require_debug","require_style","rdflib","AccessController","subject","noun","context","statusElement","targetIsProtected","targetDoc","targetACLDoc","defaultHolder","defaultACLDoc","prospectiveDefaultHolder","store","dom","aclDefaultStore","defaultHolderLink","useDefaultButton","error","addAclButton","containerElement","noticeElement","button","message","st","error$2","error$3","fallbackCombo","error$1","newAClGraph","updater","ok","reject","resolve"],"sources":["../../src/acl/access-controller.ts"],"sourcesContent":["/**\n * Contains the [[AccessController]] class\n * @packageDocumentation\n */\n\nimport { adoptACLDefault, getProspectiveHolder, makeACLGraphbyCombo, sameACL } from './acl'\nimport { fetcher, graph, NamedNode, UpdateManager } from 'rdflib'\nimport { AccessGroups } from './access-groups'\nimport { DataBrowserContext } from 'pane-registry'\nimport { shortNameForFolder } from './acl-control'\nimport * as utils from '../utils'\nimport * as debug from '../lib/debug'\nimport { style } from '../lib/style'\n\n/**\n * Rendered HTML component used in the databrowser's Sharing pane.\n */\nexport class AccessController {\n public mainCombo: AccessGroups\n public defaultsCombo: AccessGroups | null\n private readonly isContainer: boolean\n private defaultsDiffer: boolean\n private readonly rootElement: HTMLDivElement\n private isUsingDefaults: boolean\n\n constructor (\n public subject: NamedNode,\n public noun: string,\n public context: DataBrowserContext,\n private statusElement: HTMLElement,\n public targetIsProtected: boolean,\n private targetDoc: NamedNode,\n private targetACLDoc: NamedNode,\n private defaultHolder: NamedNode | null,\n private defaultACLDoc: NamedNode | null,\n private prospectiveDefaultHolder: NamedNode | undefined,\n public store,\n public dom: HTMLDocument\n ) {\n this.rootElement = dom.createElement('div')\n this.rootElement.setAttribute('style', style.aclGroupContent)\n this.isContainer = targetDoc.uri.slice(-1) === '/' // Give default for all directories\n if (defaultHolder && defaultACLDoc) {\n this.isUsingDefaults = true\n const aclDefaultStore = adoptACLDefault(this.targetDoc, targetACLDoc, defaultHolder, defaultACLDoc)\n this.mainCombo = new AccessGroups(targetDoc, targetACLDoc, this, aclDefaultStore, { defaults: this.isContainer })\n this.defaultsCombo = null\n this.defaultsDiffer = false\n } else {\n this.isUsingDefaults = false\n this.mainCombo = new AccessGroups(targetDoc, targetACLDoc, this, store)\n this.defaultsCombo = new AccessGroups(targetDoc, targetACLDoc, this, store, { defaults: this.isContainer })\n this.defaultsDiffer = !sameACL(this.mainCombo.aclMap, this.defaultsCombo.aclMap)\n }\n }\n\n public get isEditable (): boolean {\n return !this.isUsingDefaults\n }\n\n public render (): HTMLElement {\n this.rootElement.innerHTML = ''\n if (this.isUsingDefaults) {\n this.renderStatus(`The sharing for this ${this.noun} is the default for folder `)\n if (this.defaultHolder) {\n const defaultHolderLink = this.statusElement.appendChild(this.dom.createElement('a'))\n defaultHolderLink.href = this.defaultHolder.uri\n defaultHolderLink.innerText = shortNameForFolder(this.defaultHolder)\n }\n } else if (!this.defaultsDiffer && this.isContainer) {\n this.renderStatus('This is also the default for things in this folder.')\n } else {\n this.renderStatus('')\n }\n this.rootElement.appendChild(this.mainCombo.render())\n if (this.defaultsCombo && this.defaultsDiffer) {\n this.rootElement.appendChild(this.renderRemoveDefaultsController())\n this.rootElement.appendChild(this.defaultsCombo.render())\n } else if (this.isEditable && this.isContainer) {\n this.rootElement.appendChild(this.renderAddDefaultsController())\n }\n if (!this.targetIsProtected && this.isUsingDefaults) {\n this.rootElement.appendChild(this.renderAddAclsController())\n } else if (!this.targetIsProtected) {\n this.rootElement.appendChild(this.renderRemoveAclsController())\n }\n return this.rootElement\n }\n\n private renderRemoveAclsController (): HTMLElement {\n const useDefaultButton = this.dom.createElement('button')\n useDefaultButton.innerText = `Remove custom sharing settings for this ${this.noun} -- just use default${this.prospectiveDefaultHolder ? ` for ${utils.label(this.prospectiveDefaultHolder)}` : ''}`\n useDefaultButton.setAttribute('style', style.bigButton)\n useDefaultButton.addEventListener('click', () => this.removeAcls()\n .then(() => this.render())\n .catch(error => this.renderStatus(error)))\n return useDefaultButton\n }\n\n private renderAddAclsController (): HTMLElement {\n const addAclButton = this.dom.createElement('button')\n addAclButton.innerText = `Set specific sharing for this ${this.noun}`\n addAclButton.setAttribute('style', style.bigButton)\n addAclButton.addEventListener('click', () => this.addAcls()\n .then(() => this.render())\n .catch(error => this.renderStatus(error)))\n return addAclButton\n }\n\n private renderAddDefaultsController (): HTMLElement {\n const containerElement = this.dom.createElement('div')\n containerElement.setAttribute('style', style.defaultsController)\n\n const noticeElement = containerElement.appendChild(this.dom.createElement('div'))\n noticeElement.innerText = 'Sharing for things within the folder currently tracks sharing for the folder.'\n noticeElement.setAttribute('style', style.defaultsControllerNotice)\n\n const button = containerElement.appendChild(this.dom.createElement('button'))\n button.innerText = 'Set the sharing of folder contents separately from the sharing for the folder'\n button.setAttribute('style', style.bigButton)\n button.addEventListener('click', () => this.addDefaults()\n .then(() => this.render()))\n return containerElement\n }\n\n private renderRemoveDefaultsController (): HTMLElement {\n const containerElement = this.dom.createElement('div')\n containerElement.setAttribute('style', style.defaultsController)\n\n const noticeElement = containerElement.appendChild(this.dom.createElement('div'))\n noticeElement.innerText = 'Access to things within this folder:'\n noticeElement.setAttribute('style', style.defaultsControllerNotice)\n\n const button = containerElement.appendChild(this.dom.createElement('button'))\n button.innerText = 'Set default for folder contents to just track the sharing for the folder'\n button.setAttribute('style', style.bigButton)\n button.addEventListener('click', () => this.removeDefaults()\n .then(() => this.render())\n .catch(error => this.renderStatus(error)))\n return containerElement\n }\n\n public renderTemporaryStatus (message: string): void {\n // @@ TODO Introduce better system for error notification to user https://github.com/solidos/mashlib/issues/87\n this.statusElement.setAttribute('style', style.aclControlBoxStatusRevealed)\n this.statusElement.innerText = message\n this.statusElement.setAttribute('style', style.temporaryStatusInit)\n setTimeout(() => {\n this.statusElement.setAttribute('style', style.temporaryStatusEnd)\n })\n setTimeout(() => {\n this.statusElement.innerText = ''\n }, 5000)\n }\n\n public renderStatus (message: string): void {\n // @@ TODO Introduce better system for error notification to user https://github.com/solidos/mashlib/issues/87\n if (!message) {\n this.statusElement.setAttribute('style', style.aclControlBoxStatusRevealed)\n }\n this.statusElement.innerText = message\n }\n\n private async addAcls (): Promise<void> {\n if (!this.defaultHolder || !this.defaultACLDoc) {\n const message = 'Unable to find defaults to copy'\n debug.error(message)\n return Promise.reject(message)\n }\n const aclGraph = adoptACLDefault(this.targetDoc, this.targetACLDoc, this.defaultHolder, this.defaultACLDoc)\n aclGraph.statements.forEach(st => this.store.add(st.subject, st.predicate, st.object, this.targetACLDoc))\n try {\n await this.store.fetcher.putBack(this.targetACLDoc)\n this.isUsingDefaults = false\n return Promise.resolve()\n } catch (error) {\n const message = ` Error writing back access control file! ${error}`\n debug.error(message)\n return Promise.reject(message)\n }\n }\n\n private async addDefaults (): Promise<void> {\n this.defaultsCombo = new AccessGroups(this.targetDoc, this.targetACLDoc, this, this.store, { defaults: true })\n this.defaultsDiffer = true\n }\n\n private async removeAcls (): Promise<void> {\n try {\n await this.store.fetcher.delete(this.targetACLDoc.uri, {})\n this.isUsingDefaults = true\n try {\n this.prospectiveDefaultHolder = await getProspectiveHolder(this.targetDoc.uri)\n } catch (error) {\n // No need to show this error in status, but good to warn about it in console\n debug.warn(error)\n }\n } catch (error) {\n const message = `Error deleting access control file: ${this.targetACLDoc}: ${error}`\n debug.error(message)\n return Promise.reject(message)\n }\n }\n\n private async removeDefaults (): Promise<void> {\n const fallbackCombo = this.defaultsCombo\n try {\n this.defaultsCombo = null\n this.defaultsDiffer = false\n await this.save()\n } catch (error) {\n this.defaultsCombo = fallbackCombo\n this.defaultsDiffer = true\n debug.error(error)\n return Promise.reject(error)\n }\n }\n\n public save (): Promise<void> {\n // build graph\n const newAClGraph = graph()\n if (!this.isContainer) {\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, true)\n } else if (this.defaultsCombo && this.defaultsDiffer) {\n // Pair of controls\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, true)\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.defaultsCombo.byCombo, this.targetACLDoc, false, true)\n } else {\n // Linked controls\n makeACLGraphbyCombo(newAClGraph, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, true, true)\n }\n\n // add authenticated fetcher\n newAClGraph.fetcher = fetcher(newAClGraph, { fetch: this.store.fetcher._fetch })\n const updater = newAClGraph.updater || new UpdateManager(newAClGraph)\n\n // save ACL resource\n return new Promise((resolve, reject) => {\n updater.put(\n this.targetACLDoc,\n newAClGraph.statementsMatching(undefined, undefined, undefined, this.targetACLDoc),\n 'text/turtle',\n (uri, ok, message) => {\n if (!ok) {\n return reject(new Error(`ACL file save failed: ${message}`))\n }\n this.store.fetcher.unload(this.targetACLDoc)\n this.store.add(newAClGraph.statements)\n this.store.fetcher.requested[this.targetACLDoc.uri] = 'done' // missing: save headers\n this.mainCombo.store = this.store\n if (this.defaultsCombo) {\n this.defaultsCombo.store = this.store\n }\n this.defaultsDiffer = !!this.defaultsCombo && !sameACL(this.mainCombo.aclMap, this.defaultsCombo.aclMap)\n debug.log('ACL modification: success!')\n resolve()\n }\n )\n })\n }\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  import { label as e } from "../utils/label.esm.js";
2
+ import { adoptACLDefault as t, getProspectiveHolder as n, makeACLGraphbyCombo as r, sameACL as i } from "./acl.esm.js";
3
+ import { AccessGroups as a } from "./access-groups.esm.js";
4
+ import { shortNameForFolder as o } from "./acl-control.esm.js";
2
5
  import "../utils/index.esm.js";
3
- import { error as t, log as n, warn as r } from "../lib/debug.esm.js";
4
- import { adoptACLDefault as i, getProspectiveHolder as a, makeACLGraphbyCombo as o, sameACL as s } from "./acl.esm.js";
5
- import { style as c } from "../lib/style.esm.js";
6
- import { AccessGroups as l } from "./access-groups.esm.js";
7
- import { shortNameForFolder as u } from "./acl-control.esm.js";
6
+ import { error as s, log as c, warn as l } from "../lib/debug.esm.js";
7
+ import { style as u } from "../lib/style.esm.js";
8
8
  import { UpdateManager as d, fetcher as f, graph as p } from "rdflib";
9
9
  // src/acl/access-controller.ts
10
10
  var m = class {
@@ -26,12 +26,12 @@ var m = class {
26
26
  defaultsDiffer;
27
27
  rootElement;
28
28
  isUsingDefaults;
29
- constructor(e, t, n, r, a, o, u, d, f, p, m, h) {
30
- if (this.subject = e, this.noun = t, this.context = n, this.statusElement = r, this.targetIsProtected = a, this.targetDoc = o, this.targetACLDoc = u, this.defaultHolder = d, this.defaultACLDoc = f, this.prospectiveDefaultHolder = p, this.store = m, this.dom = h, this.rootElement = h.createElement("div"), this.rootElement.setAttribute("style", c.aclGroupContent), this.isContainer = o.uri.slice(-1) === "/", d && f) {
29
+ constructor(e, n, r, o, s, c, l, d, f, p, m, h) {
30
+ if (this.subject = e, this.noun = n, this.context = r, this.statusElement = o, this.targetIsProtected = s, this.targetDoc = c, this.targetACLDoc = l, this.defaultHolder = d, this.defaultACLDoc = f, this.prospectiveDefaultHolder = p, this.store = m, this.dom = h, this.rootElement = h.createElement("div"), this.rootElement.setAttribute("style", u.aclGroupContent), this.isContainer = c.uri.slice(-1) === "/", d && f) {
31
31
  this.isUsingDefaults = !0;
32
- let e = i(this.targetDoc, u, d, f);
33
- this.mainCombo = new l(o, u, this, e, { defaults: this.isContainer }), this.defaultsCombo = null, this.defaultsDiffer = !1;
34
- } else this.isUsingDefaults = !1, this.mainCombo = new l(o, u, this, m), this.defaultsCombo = new l(o, u, this, m, { defaults: this.isContainer }), this.defaultsDiffer = !s(this.mainCombo.aclMap, this.defaultsCombo.aclMap);
32
+ let e = t(this.targetDoc, l, d, f);
33
+ this.mainCombo = new a(c, l, this, e, { defaults: this.isContainer }), this.defaultsCombo = null, this.defaultsDiffer = !1;
34
+ } else this.isUsingDefaults = !1, this.mainCombo = new a(c, l, this, m), this.defaultsCombo = new a(c, l, this, m, { defaults: this.isContainer }), this.defaultsDiffer = !i(this.mainCombo.aclMap, this.defaultsCombo.aclMap);
35
35
  }
36
36
  get isEditable() {
37
37
  return !this.isUsingDefaults;
@@ -40,90 +40,90 @@ var m = class {
40
40
  if (this.rootElement.innerHTML = "", this.isUsingDefaults) {
41
41
  if (this.renderStatus(`The sharing for this ${this.noun} is the default for folder `), this.defaultHolder) {
42
42
  let e = this.statusElement.appendChild(this.dom.createElement("a"));
43
- e.href = this.defaultHolder.uri, e.innerText = u(this.defaultHolder);
43
+ e.href = this.defaultHolder.uri, e.innerText = o(this.defaultHolder);
44
44
  }
45
45
  } else !this.defaultsDiffer && this.isContainer ? this.renderStatus("This is also the default for things in this folder.") : this.renderStatus("");
46
46
  return this.rootElement.appendChild(this.mainCombo.render()), this.defaultsCombo && this.defaultsDiffer ? (this.rootElement.appendChild(this.renderRemoveDefaultsController()), this.rootElement.appendChild(this.defaultsCombo.render())) : this.isEditable && this.isContainer && this.rootElement.appendChild(this.renderAddDefaultsController()), !this.targetIsProtected && this.isUsingDefaults ? this.rootElement.appendChild(this.renderAddAclsController()) : this.targetIsProtected || this.rootElement.appendChild(this.renderRemoveAclsController()), this.rootElement;
47
47
  }
48
48
  renderRemoveAclsController() {
49
49
  let t = this.dom.createElement("button");
50
- return t.innerText = `Remove custom sharing settings for this ${this.noun} -- just use default${this.prospectiveDefaultHolder ? ` for ${e(this.prospectiveDefaultHolder)}` : ""}`, t.setAttribute("style", c.bigButton), t.addEventListener("click", () => this.removeAcls().then(() => this.render()).catch((e) => this.renderStatus(e))), t;
50
+ return t.innerText = `Remove custom sharing settings for this ${this.noun} -- just use default${this.prospectiveDefaultHolder ? ` for ${e(this.prospectiveDefaultHolder)}` : ""}`, t.setAttribute("style", u.bigButton), t.addEventListener("click", () => this.removeAcls().then(() => this.render()).catch((e) => this.renderStatus(e))), t;
51
51
  }
52
52
  renderAddAclsController() {
53
53
  let e = this.dom.createElement("button");
54
- return e.innerText = `Set specific sharing for this ${this.noun}`, e.setAttribute("style", c.bigButton), e.addEventListener("click", () => this.addAcls().then(() => this.render()).catch((e) => this.renderStatus(e))), e;
54
+ return e.innerText = `Set specific sharing for this ${this.noun}`, e.setAttribute("style", u.bigButton), e.addEventListener("click", () => this.addAcls().then(() => this.render()).catch((e) => this.renderStatus(e))), e;
55
55
  }
56
56
  renderAddDefaultsController() {
57
57
  let e = this.dom.createElement("div");
58
- e.setAttribute("style", c.defaultsController);
58
+ e.setAttribute("style", u.defaultsController);
59
59
  let t = e.appendChild(this.dom.createElement("div"));
60
- t.innerText = "Sharing for things within the folder currently tracks sharing for the folder.", t.setAttribute("style", c.defaultsControllerNotice);
60
+ t.innerText = "Sharing for things within the folder currently tracks sharing for the folder.", t.setAttribute("style", u.defaultsControllerNotice);
61
61
  let n = e.appendChild(this.dom.createElement("button"));
62
- return n.innerText = "Set the sharing of folder contents separately from the sharing for the folder", n.setAttribute("style", c.bigButton), n.addEventListener("click", () => this.addDefaults().then(() => this.render())), e;
62
+ return n.innerText = "Set the sharing of folder contents separately from the sharing for the folder", n.setAttribute("style", u.bigButton), n.addEventListener("click", () => this.addDefaults().then(() => this.render())), e;
63
63
  }
64
64
  renderRemoveDefaultsController() {
65
65
  let e = this.dom.createElement("div");
66
- e.setAttribute("style", c.defaultsController);
66
+ e.setAttribute("style", u.defaultsController);
67
67
  let t = e.appendChild(this.dom.createElement("div"));
68
- t.innerText = "Access to things within this folder:", t.setAttribute("style", c.defaultsControllerNotice);
68
+ t.innerText = "Access to things within this folder:", t.setAttribute("style", u.defaultsControllerNotice);
69
69
  let n = e.appendChild(this.dom.createElement("button"));
70
- return n.innerText = "Set default for folder contents to just track the sharing for the folder", n.setAttribute("style", c.bigButton), n.addEventListener("click", () => this.removeDefaults().then(() => this.render()).catch((e) => this.renderStatus(e))), e;
70
+ return n.innerText = "Set default for folder contents to just track the sharing for the folder", n.setAttribute("style", u.bigButton), n.addEventListener("click", () => this.removeDefaults().then(() => this.render()).catch((e) => this.renderStatus(e))), e;
71
71
  }
72
72
  renderTemporaryStatus(e) {
73
- this.statusElement.setAttribute("style", c.aclControlBoxStatusRevealed), this.statusElement.innerText = e, this.statusElement.setAttribute("style", c.temporaryStatusInit), setTimeout(() => {
74
- this.statusElement.setAttribute("style", c.temporaryStatusEnd);
73
+ this.statusElement.setAttribute("style", u.aclControlBoxStatusRevealed), this.statusElement.innerText = e, this.statusElement.setAttribute("style", u.temporaryStatusInit), setTimeout(() => {
74
+ this.statusElement.setAttribute("style", u.temporaryStatusEnd);
75
75
  }), setTimeout(() => {
76
76
  this.statusElement.innerText = "";
77
77
  }, 5e3);
78
78
  }
79
79
  renderStatus(e) {
80
- e || this.statusElement.setAttribute("style", c.aclControlBoxStatusRevealed), this.statusElement.innerText = e;
80
+ e || this.statusElement.setAttribute("style", u.aclControlBoxStatusRevealed), this.statusElement.innerText = e;
81
81
  }
82
82
  async addAcls() {
83
83
  if (!this.defaultHolder || !this.defaultACLDoc) {
84
84
  let e = "Unable to find defaults to copy";
85
- return t(e), Promise.reject(e);
85
+ return s(e), Promise.reject(e);
86
86
  }
87
- i(this.targetDoc, this.targetACLDoc, this.defaultHolder, this.defaultACLDoc).statements.forEach((e) => this.store.add(e.subject, e.predicate, e.object, this.targetACLDoc));
87
+ t(this.targetDoc, this.targetACLDoc, this.defaultHolder, this.defaultACLDoc).statements.forEach((e) => this.store.add(e.subject, e.predicate, e.object, this.targetACLDoc));
88
88
  try {
89
89
  return await this.store.fetcher.putBack(this.targetACLDoc), this.isUsingDefaults = !1, Promise.resolve();
90
90
  } catch (e) {
91
- let n = ` Error writing back access control file! ${e}`;
92
- return t(n), Promise.reject(n);
91
+ let t = ` Error writing back access control file! ${e}`;
92
+ return s(t), Promise.reject(t);
93
93
  }
94
94
  }
95
95
  async addDefaults() {
96
- this.defaultsCombo = new l(this.targetDoc, this.targetACLDoc, this, this.store, { defaults: !0 }), this.defaultsDiffer = !0;
96
+ this.defaultsCombo = new a(this.targetDoc, this.targetACLDoc, this, this.store, { defaults: !0 }), this.defaultsDiffer = !0;
97
97
  }
98
98
  async removeAcls() {
99
99
  try {
100
100
  await this.store.fetcher.delete(this.targetACLDoc.uri, {}), this.isUsingDefaults = !0;
101
101
  try {
102
- this.prospectiveDefaultHolder = await a(this.targetDoc.uri);
102
+ this.prospectiveDefaultHolder = await n(this.targetDoc.uri);
103
103
  } catch (e) {
104
- r(e);
104
+ l(e);
105
105
  }
106
106
  } catch (e) {
107
- let n = `Error deleting access control file: ${this.targetACLDoc}: ${e}`;
108
- return t(n), Promise.reject(n);
107
+ let t = `Error deleting access control file: ${this.targetACLDoc}: ${e}`;
108
+ return s(t), Promise.reject(t);
109
109
  }
110
110
  }
111
111
  async removeDefaults() {
112
112
  let e = this.defaultsCombo;
113
113
  try {
114
114
  this.defaultsCombo = null, this.defaultsDiffer = !1, await this.save();
115
- } catch (n) {
116
- return this.defaultsCombo = e, this.defaultsDiffer = !0, t(n), Promise.reject(n);
115
+ } catch (t) {
116
+ return this.defaultsCombo = e, this.defaultsDiffer = !0, s(t), Promise.reject(t);
117
117
  }
118
118
  }
119
119
  save() {
120
120
  let e = p();
121
- this.isContainer ? this.defaultsCombo && this.defaultsDiffer ? (o(e, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, !0), o(e, this.targetDoc, this.defaultsCombo.byCombo, this.targetACLDoc, !1, !0)) : o(e, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, !0, !0) : o(e, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, !0), e.fetcher = f(e, { fetch: this.store.fetcher._fetch });
121
+ this.isContainer ? this.defaultsCombo && this.defaultsDiffer ? (r(e, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, !0), r(e, this.targetDoc, this.defaultsCombo.byCombo, this.targetACLDoc, !1, !0)) : r(e, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, !0, !0) : r(e, this.targetDoc, this.mainCombo.byCombo, this.targetACLDoc, !0), e.fetcher = f(e, { fetch: this.store.fetcher._fetch });
122
122
  let t = e.updater || new d(e);
123
- return new Promise((r, i) => {
123
+ return new Promise((n, r) => {
124
124
  t.put(this.targetACLDoc, e.statementsMatching(void 0, void 0, void 0, this.targetACLDoc), "text/turtle", (t, a, o) => {
125
- if (!a) return i(/* @__PURE__ */ Error(`ACL file save failed: ${o}`));
126
- this.store.fetcher.unload(this.targetACLDoc), this.store.add(e.statements), this.store.fetcher.requested[this.targetACLDoc.uri] = "done", this.mainCombo.store = this.store, this.defaultsCombo && (this.defaultsCombo.store = this.store), this.defaultsDiffer = !!this.defaultsCombo && !s(this.mainCombo.aclMap, this.defaultsCombo.aclMap), n("ACL modification: success!"), r();
125
+ if (!a) return r(/* @__PURE__ */ Error(`ACL file save failed: ${o}`));
126
+ this.store.fetcher.unload(this.targetACLDoc), this.store.add(e.statements), this.store.fetcher.requested[this.targetACLDoc.uri] = "done", this.mainCombo.store = this.store, this.defaultsCombo && (this.defaultsCombo.store = this.store), this.defaultsDiffer = !!this.defaultsCombo && !i(this.mainCombo.aclMap, this.defaultsCombo.aclMap), c("ACL modification: success!"), n();
127
127
  });
128
128
  });
129
129
  }
@@ -1,3 +1,3 @@
1
- const e=require("../lib/ns.cjs.js"),t=require("../lib/debug.cjs.js"),n=require("./acl.cjs.js"),r=require("../lib/style.cjs.js"),i=require("../widgets/dragAndDrop.cjs.js"),a=require("../widgets/buttons.cjs.js");require("../widgets/index.cjs.js");const o=require("./add-agent-buttons.cjs.js");let s=require("rdflib");var c=e.default.acl,l={13:`Owners`,9:`Owners (write locked)`,5:`Editors`,3:`Posters`,2:`Submitters`,1:`Viewers`},u={13:!0,5:!0,3:!0,2:!0,1:!0},d={13:`can read, write, and control sharing.`,9:`can read and control sharing, currently write-locked.`,5:`can read and change information`,3:`can add new information, and read but not change existing information`,2:`can add new information but not read any`,1:`can read but not change information`},f=class{doc;aclDoc;controller;_options;defaults;byCombo;aclMap;addAgentButton;rootElement;_store;constructor(e,t,i,a,s={}){this.doc=e,this.aclDoc=t,this.controller=i,this._options=s,this.defaults=this._options.defaults||!1,this._store=a,this.aclMap=n.readACL(e,t,a,this.defaults),this.byCombo=n.ACLbyCombination(this.aclMap),this.addAgentButton=new o.AddAgentButtons(this),this.rootElement=this.controller.dom.createElement(`div`),this.rootElement.setAttribute(`style`,r.style.accessGroupList)}get store(){return this._store}set store(e){this._store=e,this.aclMap=n.readACL(this.doc,this.aclDoc,e,this.defaults),this.byCombo=n.ACLbyCombination(this.aclMap)}render(){return this.rootElement.innerHTML=``,this.renderGroups().forEach(e=>this.rootElement.appendChild(e)),this.controller.isEditable&&this.rootElement.appendChild(this.addAgentButton.render()),this.rootElement}renderGroups(){let e=[];for(let t=15;t>0;t--){let n=p(t);(this.controller.isEditable&&u[t]||this.byCombo[n])&&e.push(this.renderGroup(t,n))}return e}renderGroup(e,t){let n=this.controller.dom.createElement(`div`);return n.setAttribute(`style`,r.style.accessGroupListItem),i.makeDropTarget(n,e=>this.handleDroppedUris(e,t).then(()=>this.controller.render()).catch(e=>this.controller.renderStatus(e))),this.renderGroupElements(e,t).forEach(e=>n.appendChild(e)),n}renderGroupElements(e,t){let n=this.controller.dom.createElement(`div`);if(n.setAttribute(`style`,r.style.group),this.controller.isEditable)switch(e){case 1:n.setAttribute(`style`,r.style.group1);break;case 2:n.setAttribute(`style`,r.style.group2);break;case 3:n.setAttribute(`style`,r.style.group3);break;case 5:n.setAttribute(`style`,r.style.group5);break;case 9:n.setAttribute(`style`,r.style.group9);break;case 13:n.setAttribute(`style`,r.style.group13);break;default:n.setAttribute(`style`,r.style.group)}n.innerText=l[e]||m(e);let i=this.controller.dom.createElement(`div`);if(i.setAttribute(`style`,r.style.group),this.controller.isEditable)switch(e){case 1:i.setAttribute(`style`,r.style.group1);break;case 2:i.setAttribute(`style`,r.style.group2);break;case 3:i.setAttribute(`style`,r.style.group3);break;case 5:i.setAttribute(`style`,r.style.group5);break;case 9:i.setAttribute(`style`,r.style.group9);break;case 13:i.setAttribute(`style`,r.style.group13);break;default:i.setAttribute(`style`,r.style.group)}let a=i.appendChild(this.controller.dom.createElement(`table`));(this.byCombo[t]||[]).map(([e,n])=>this.renderAgent(a,t,e,n)).forEach(e=>a.appendChild(e));let o=this.controller.dom.createElement(`div`);if(o.setAttribute(`style`,r.style.group),this.controller.isEditable)switch(e){case 1:o.setAttribute(`style`,r.style.group1);break;case 2:o.setAttribute(`style`,r.style.group2);break;case 3:o.setAttribute(`style`,r.style.group3);break;case 5:o.setAttribute(`style`,r.style.group5);break;case 9:o.setAttribute(`style`,r.style.group9);break;case 13:o.setAttribute(`style`,r.style.group13);break;default:o.setAttribute(`style`,r.style.group)}return o.innerText=d[e]||`Unusual combination`,[n,i,o]}renderAgent(e,t,n,r){let i=a.personTR(this.controller.dom,c(n),(0,s.sym)(r),this.controller.isEditable?{deleteFunction:()=>this.deleteAgent(t,n,r).then(()=>e.removeChild(i)).catch(e=>this.controller.renderStatus(e))}:{});return i}async deleteAgent(e,t,n){let r=this.byCombo[e]||[],i=r.find(([e,r])=>e===t&&r===n);i&&r.splice(r.indexOf(i),1),await this.controller.save()}async addNewURI(e){await this.handleDroppedUri(e,p(1)),await this.controller.save()}async handleDroppedUris(e,t){try{await Promise.all(e.map(e=>this.handleDroppedUri(e,t))),await this.controller.save()}catch(e){return Promise.reject(e)}}async handleDroppedUri(e,n,r=!1){let i=h(e,this.store),a=(0,s.sym)(e);if(!i&&!r){t.log(` Not obvious: looking up dropped thing ${a}`);try{await this._store?.fetcher?.load(a.doc())}catch(e){let n=`Ignore error looking up dropped thing: ${e}`;return t.error(n),Promise.reject(Error(n))}return this.handleDroppedUri(e,n,!0)}if(!i){let n=Object.keys(this.store.findTypeURIs(a)),r=n.length>0?`Detected RDF types: ${n.join(`, `)}`:`No RDF type was detected for this URI.`,i=`Error: Failed to add access target: ${e} is not a recognized ACL target type. Expected one of: vcard:WebID, vcard:Group, foaf:Person, foaf:Agent, solid:AppProvider, solid:AppProviderClass, or recognized ACL classes. Hint: try dropping a WebID profile URI, a vcard:Group URI, or a web app origin.`+r;return t.error(i),Promise.reject(Error(i))}this.setACLCombo(n,e,i,this.controller.subject)}setACLCombo(e,n,r,i){e in this.byCombo||(this.byCombo[e]=[]),this.removeAgentFromCombos(n),this.byCombo[e].push([r.pred,r.obj.uri]),t.log(`ACL: setting access to ${i} by ${r.pred}: ${r.obj}`)}removeAgentFromCombos(e){for(let t=0;t<16;t++){let n=this.byCombo[p(t)];if(n)for(let t=0;t<n.length;t++)for(;t<n.length&&n[t][1]===e;)n.splice(t,1)}}};function p(e){let t=[`Read`,`Append`,`Write`,`Control`],n=[];for(let r=0;r<4;r++)e&1<<r&&n.push(`http://www.w3.org/ns/auth/acl#`+t[r]);return n.sort(),n.join(`
2
- `)}function m(e){let t=``,n=[`Read`,`Append`,`Write`,`Control`];for(let r=0;r<4;r++)e&1<<r&&(t+=n[r]);return t}function h(n,r){let i=(0,s.sym)(n),a=r.findTypeURIs(i);for(let e in a)t.log(` drop object type includes: `+e);if(n.startsWith(`http`)&&n.split(`/`).length===3)return{pred:`origin`,obj:i};if(n.startsWith(`http`)&&n.split(`/`).length===4&&n.endsWith(`/`))return t.log(`Assuming final slash on dragged origin URI was unintended!`),{pred:`origin`,obj:(0,s.sym)(n.slice(0,-1))};if(e.default.vcard(`WebID`).uri in a)return{pred:`agent`,obj:i};if(e.default.vcard(`Group`).uri in a)return{pred:`agentGroup`,obj:i};if(i.sameTerm(e.default.foaf(`Agent`))||i.sameTerm(e.default.acl(`AuthenticatedAgent`))||i.sameTerm(e.default.rdf(`Resource`))||i.sameTerm(e.default.owl(`Thing`)))return{pred:`agentClass`,obj:i};if(e.default.vcard(`Individual`).uri in a||e.default.foaf(`Person`).uri in a||e.default.foaf(`Agent`).uri in a){let t=r.any(i,e.default.foaf(`preferredURI`));return t?{pred:`agent`,obj:(0,s.sym)(t)}:{pred:`agent`,obj:i}}return e.default.solid(`AppProvider`).uri in a?{pred:`origin`,obj:i}:e.default.solid(`AppProviderClass`).uri in a?{pred:`originClass`,obj:i}:(t.log(` Triage fails for `+n),null)}exports.AccessGroups=f;
1
+ const e=require("./acl.cjs.js");require("../widgets/index.cjs.js");const t=require("../lib/ns.cjs.js"),n=require("./add-agent-buttons.cjs.js"),r=require("../widgets/dragAndDrop.cjs.js"),i=require("../widgets/buttons.cjs.js"),a=require("../lib/debug.cjs.js"),o=require("../lib/style.cjs.js");let s=require("rdflib");var c=t.default.acl,l={13:`Owners`,9:`Owners (write locked)`,5:`Editors`,3:`Posters`,2:`Submitters`,1:`Viewers`},u={13:!0,5:!0,3:!0,2:!0,1:!0},d={13:`can read, write, and control sharing.`,9:`can read and control sharing, currently write-locked.`,5:`can read and change information`,3:`can add new information, and read but not change existing information`,2:`can add new information but not read any`,1:`can read but not change information`},f=class{doc;aclDoc;controller;_options;defaults;byCombo;aclMap;addAgentButton;rootElement;_store;constructor(t,r,i,a,s={}){this.doc=t,this.aclDoc=r,this.controller=i,this._options=s,this.defaults=this._options.defaults||!1,this._store=a,this.aclMap=e.readACL(t,r,a,this.defaults),this.byCombo=e.ACLbyCombination(this.aclMap),this.addAgentButton=new n.AddAgentButtons(this),this.rootElement=this.controller.dom.createElement(`div`),this.rootElement.setAttribute(`style`,o.style.accessGroupList)}get store(){return this._store}set store(t){this._store=t,this.aclMap=e.readACL(this.doc,this.aclDoc,t,this.defaults),this.byCombo=e.ACLbyCombination(this.aclMap)}render(){return this.rootElement.innerHTML=``,this.renderGroups().forEach(e=>this.rootElement.appendChild(e)),this.controller.isEditable&&this.rootElement.appendChild(this.addAgentButton.render()),this.rootElement}renderGroups(){let e=[];for(let t=15;t>0;t--){let n=p(t);(this.controller.isEditable&&u[t]||this.byCombo[n])&&e.push(this.renderGroup(t,n))}return e}renderGroup(e,t){let n=this.controller.dom.createElement(`div`);return n.setAttribute(`style`,o.style.accessGroupListItem),r.makeDropTarget(n,e=>this.handleDroppedUris(e,t).then(()=>this.controller.render()).catch(e=>this.controller.renderStatus(e))),this.renderGroupElements(e,t).forEach(e=>n.appendChild(e)),n}renderGroupElements(e,t){let n=this.controller.dom.createElement(`div`);if(n.setAttribute(`style`,o.style.group),this.controller.isEditable)switch(e){case 1:n.setAttribute(`style`,o.style.group1);break;case 2:n.setAttribute(`style`,o.style.group2);break;case 3:n.setAttribute(`style`,o.style.group3);break;case 5:n.setAttribute(`style`,o.style.group5);break;case 9:n.setAttribute(`style`,o.style.group9);break;case 13:n.setAttribute(`style`,o.style.group13);break;default:n.setAttribute(`style`,o.style.group)}n.innerText=l[e]||m(e);let r=this.controller.dom.createElement(`div`);if(r.setAttribute(`style`,o.style.group),this.controller.isEditable)switch(e){case 1:r.setAttribute(`style`,o.style.group1);break;case 2:r.setAttribute(`style`,o.style.group2);break;case 3:r.setAttribute(`style`,o.style.group3);break;case 5:r.setAttribute(`style`,o.style.group5);break;case 9:r.setAttribute(`style`,o.style.group9);break;case 13:r.setAttribute(`style`,o.style.group13);break;default:r.setAttribute(`style`,o.style.group)}let i=r.appendChild(this.controller.dom.createElement(`table`));(this.byCombo[t]||[]).map(([e,n])=>this.renderAgent(i,t,e,n)).forEach(e=>i.appendChild(e));let a=this.controller.dom.createElement(`div`);if(a.setAttribute(`style`,o.style.group),this.controller.isEditable)switch(e){case 1:a.setAttribute(`style`,o.style.group1);break;case 2:a.setAttribute(`style`,o.style.group2);break;case 3:a.setAttribute(`style`,o.style.group3);break;case 5:a.setAttribute(`style`,o.style.group5);break;case 9:a.setAttribute(`style`,o.style.group9);break;case 13:a.setAttribute(`style`,o.style.group13);break;default:a.setAttribute(`style`,o.style.group)}return a.innerText=d[e]||`Unusual combination`,[n,r,a]}renderAgent(e,t,n,r){let a=i.personTR(this.controller.dom,c(n),(0,s.sym)(r),this.controller.isEditable?{deleteFunction:()=>this.deleteAgent(t,n,r).then(()=>e.removeChild(a)).catch(e=>this.controller.renderStatus(e))}:{});return a}async deleteAgent(e,t,n){let r=this.byCombo[e]||[],i=r.find(([e,r])=>e===t&&r===n);i&&r.splice(r.indexOf(i),1),await this.controller.save()}async addNewURI(e){await this.handleDroppedUri(e,p(1)),await this.controller.save()}async handleDroppedUris(e,t){try{await Promise.all(e.map(e=>this.handleDroppedUri(e,t))),await this.controller.save()}catch(e){return Promise.reject(e)}}async handleDroppedUri(e,t,n=!1){let r=h(e,this.store),i=(0,s.sym)(e);if(!r&&!n){a.log(` Not obvious: looking up dropped thing ${i}`);try{await this._store?.fetcher?.load(i.doc())}catch(e){let t=`Ignore error looking up dropped thing: ${e}`;return a.error(t),Promise.reject(Error(t))}return this.handleDroppedUri(e,t,!0)}if(!r){let t=Object.keys(this.store.findTypeURIs(i)),n=t.length>0?`Detected RDF types: ${t.join(`, `)}`:`No RDF type was detected for this URI.`,r=`Error: Failed to add access target: ${e} is not a recognized ACL target type. Expected one of: vcard:WebID, vcard:Group, foaf:Person, foaf:Agent, solid:AppProvider, solid:AppProviderClass, or recognized ACL classes. Hint: try dropping a WebID profile URI, a vcard:Group URI, or a web app origin.`+n;return a.error(r),Promise.reject(Error(r))}this.setACLCombo(t,e,r,this.controller.subject)}setACLCombo(e,t,n,r){e in this.byCombo||(this.byCombo[e]=[]),this.removeAgentFromCombos(t),this.byCombo[e].push([n.pred,n.obj.uri]),a.log(`ACL: setting access to ${r} by ${n.pred}: ${n.obj}`)}removeAgentFromCombos(e){for(let t=0;t<16;t++){let n=this.byCombo[p(t)];if(n)for(let t=0;t<n.length;t++)for(;t<n.length&&n[t][1]===e;)n.splice(t,1)}}};function p(e){let t=[`Read`,`Append`,`Write`,`Control`],n=[];for(let r=0;r<4;r++)e&1<<r&&n.push(`http://www.w3.org/ns/auth/acl#`+t[r]);return n.sort(),n.join(`
2
+ `)}function m(e){let t=``,n=[`Read`,`Append`,`Write`,`Control`];for(let r=0;r<4;r++)e&1<<r&&(t+=n[r]);return t}function h(e,n){let r=(0,s.sym)(e),i=n.findTypeURIs(r);for(let e in i)a.log(` drop object type includes: `+e);if(e.startsWith(`http`)&&e.split(`/`).length===3)return{pred:`origin`,obj:r};if(e.startsWith(`http`)&&e.split(`/`).length===4&&e.endsWith(`/`))return a.log(`Assuming final slash on dragged origin URI was unintended!`),{pred:`origin`,obj:(0,s.sym)(e.slice(0,-1))};if(t.default.vcard(`WebID`).uri in i)return{pred:`agent`,obj:r};if(t.default.vcard(`Group`).uri in i)return{pred:`agentGroup`,obj:r};if(r.sameTerm(t.default.foaf(`Agent`))||r.sameTerm(t.default.acl(`AuthenticatedAgent`))||r.sameTerm(t.default.rdf(`Resource`))||r.sameTerm(t.default.owl(`Thing`)))return{pred:`agentClass`,obj:r};if(t.default.vcard(`Individual`).uri in i||t.default.foaf(`Person`).uri in i||t.default.foaf(`Agent`).uri in i){let e=n.any(r,t.default.foaf(`preferredURI`));return e?{pred:`agent`,obj:(0,s.sym)(e)}:{pred:`agent`,obj:r}}return t.default.solid(`AppProvider`).uri in i?{pred:`origin`,obj:r}:t.default.solid(`AppProviderClass`).uri in i?{pred:`originClass`,obj:r}:(a.log(` Triage fails for `+e),null)}exports.AccessGroups=f;
3
3
  //# sourceMappingURL=access-groups.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"access-groups.cjs.js","names":["ns","readACL","ACLbyCombination","AddAgentButtons","style","sym","error","require_ns","require_debug","require_acl","require_style","require_dragAndDrop","require_buttons","require_add_agent_buttons","rdflib","ACL","COLLOQUIAL","RECOMMENDED","EXPLANATION","AccessGroups","doc","aclDoc","controller","_options","store","group","groupElements","comboIndex","combo","kToCombo","groupRow","uris","error","column","groupNameColumn","ktToList","groupAgentsColumn","groupAgentsTable","pred","obj","agentElement","groupDescriptionElement","personRow","combos","comboToRemove","comboPred","comboObj","uri","agent","findAgent","thing","secondAttempt","error$1","message","detectedTypes","typeDetails","error$2","res","subject","k","i","y","list","types","kb","ty","pref"],"sources":["../../src/acl/access-groups.ts"],"sourcesContent":["/**\n * Contains the [[AccessGroups]]\n * and [[AccessGroupsOptions]] classes\n * @packageDocumentation\n */\n\nimport { NamedNode, sym, Store } from 'rdflib'\nimport { ACLbyCombination, readACL } from './acl'\nimport * as widgets from '../widgets'\nimport ns from '../lib/ns'\nimport { AccessController } from './access-controller'\nimport { AgentMapMap, ComboList, PartialAgentTriple } from './types'\nimport { AddAgentButtons } from './add-agent-buttons'\nimport * as debug from '../lib/debug'\nimport { style } from '../lib/style'\n\nconst ACL = ns.acl\n\nconst COLLOQUIAL = {\n 13: 'Owners',\n 9: 'Owners (write locked)',\n 5: 'Editors',\n 3: 'Posters',\n 2: 'Submitters',\n 1: 'Viewers'\n}\n\nconst RECOMMENDED = {\n 13: true,\n 5: true,\n 3: true,\n 2: true,\n 1: true\n}\n\nconst EXPLANATION = {\n 13: 'can read, write, and control sharing.',\n 9: 'can read and control sharing, currently write-locked.',\n 5: 'can read and change information',\n 3: 'can add new information, and read but not change existing information',\n 2: 'can add new information but not read any',\n 1: 'can read but not change information'\n}\n\n/**\n * Type for the options parameter of [[AccessGroups]]\n */\nexport interface AccessGroupsOptions {\n defaults?: boolean\n}\n\n/**\n * Renders the table of Owners, Editors, Posters, Submitters, Viewers\n * for https://github.com/solidos/userguide/blob/main/views/sharing/userguide.md\n */\nexport class AccessGroups {\n private readonly defaults: boolean\n public byCombo: ComboList\n public aclMap: AgentMapMap\n private readonly addAgentButton: AddAgentButtons\n private readonly rootElement: HTMLElement\n private _store: Store // @@ was LiveStore but does not need to be connected to web\n\n constructor (\n private doc: NamedNode,\n private aclDoc: NamedNode,\n public controller: AccessController,\n store: Store, // @@ was LiveStore\n private _options: AccessGroupsOptions = {}\n ) {\n this.defaults = this._options.defaults || false\n this._store = store\n this.aclMap = readACL(doc, aclDoc, store, this.defaults)\n this.byCombo = ACLbyCombination(this.aclMap)\n this.addAgentButton = new AddAgentButtons(this)\n this.rootElement = this.controller.dom.createElement('div')\n this.rootElement.setAttribute('style', style.accessGroupList)\n }\n\n public get store () {\n return this._store\n }\n\n public set store (store) {\n this._store = store\n this.aclMap = readACL(this.doc, this.aclDoc, store, this.defaults)\n this.byCombo = ACLbyCombination(this.aclMap)\n }\n\n public render (): HTMLElement {\n this.rootElement.innerHTML = ''\n this.renderGroups().forEach(group => this.rootElement.appendChild(group))\n if (this.controller.isEditable) {\n this.rootElement.appendChild(this.addAgentButton.render())\n }\n return this.rootElement\n }\n\n private renderGroups (): HTMLElement[] {\n const groupElements: HTMLElement[] = []\n for (let comboIndex = 15; comboIndex > 0; comboIndex--) {\n const combo = kToCombo(comboIndex)\n if ((this.controller.isEditable && RECOMMENDED[comboIndex]) || this.byCombo[combo]) {\n groupElements.push(this.renderGroup(comboIndex, combo))\n }\n }\n return groupElements\n }\n\n private renderGroup (comboIndex: number, combo: string): HTMLElement {\n const groupRow = this.controller.dom.createElement('div')\n groupRow.setAttribute('style', style.accessGroupListItem)\n widgets.makeDropTarget(groupRow, (uris) => this.handleDroppedUris(uris, combo)\n .then(() => this.controller.render())\n .catch(error => this.controller.renderStatus(error)))\n const groupColumns = this.renderGroupElements(comboIndex, combo)\n groupColumns.forEach(column => groupRow.appendChild(column))\n return groupRow\n }\n\n private renderGroupElements (comboIndex, combo): HTMLElement[] {\n const groupNameColumn = this.controller.dom.createElement('div')\n groupNameColumn.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupNameColumn.setAttribute('style', style.group1)\n break\n case 2:\n groupNameColumn.setAttribute('style', style.group2)\n break\n case 3:\n groupNameColumn.setAttribute('style', style.group3)\n break\n case 5:\n groupNameColumn.setAttribute('style', style.group5)\n break\n case 9:\n groupNameColumn.setAttribute('style', style.group9)\n break\n case 13:\n groupNameColumn.setAttribute('style', style.group13)\n break\n default:\n groupNameColumn.setAttribute('style', style.group)\n }\n }\n groupNameColumn.innerText = COLLOQUIAL[comboIndex] || ktToList(comboIndex)\n\n const groupAgentsColumn = this.controller.dom.createElement('div')\n groupAgentsColumn.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupAgentsColumn.setAttribute('style', style.group1)\n break\n case 2:\n groupAgentsColumn.setAttribute('style', style.group2)\n break\n case 3:\n groupAgentsColumn.setAttribute('style', style.group3)\n break\n case 5:\n groupAgentsColumn.setAttribute('style', style.group5)\n break\n case 9:\n groupAgentsColumn.setAttribute('style', style.group9)\n break\n case 13:\n groupAgentsColumn.setAttribute('style', style.group13)\n break\n default:\n groupAgentsColumn.setAttribute('style', style.group)\n }\n }\n const groupAgentsTable = groupAgentsColumn.appendChild(this.controller.dom.createElement('table'))\n const combos = this.byCombo[combo] || []\n combos\n .map(([pred, obj]) => this.renderAgent(groupAgentsTable, combo, pred, obj))\n .forEach(agentElement => groupAgentsTable.appendChild(agentElement))\n\n const groupDescriptionElement = this.controller.dom.createElement('div')\n groupDescriptionElement.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupDescriptionElement.setAttribute('style', style.group1)\n break\n case 2:\n groupDescriptionElement.setAttribute('style', style.group2)\n break\n case 3:\n groupDescriptionElement.setAttribute('style', style.group3)\n break\n case 5:\n groupDescriptionElement.setAttribute('style', style.group5)\n break\n case 9:\n groupDescriptionElement.setAttribute('style', style.group9)\n break\n case 13:\n groupDescriptionElement.setAttribute('style', style.group13)\n break\n default:\n groupDescriptionElement.setAttribute('style', style.group)\n }\n }\n groupDescriptionElement.innerText = EXPLANATION[comboIndex] || 'Unusual combination'\n\n return [groupNameColumn, groupAgentsColumn, groupDescriptionElement]\n }\n\n private renderAgent (groupAgentsTable, combo, pred, obj): HTMLElement {\n const personRow = widgets.personTR(this.controller.dom, ACL(pred), sym(obj), this.controller.isEditable\n ? {\n deleteFunction: () => this.deleteAgent(combo, pred, obj)\n .then(() => groupAgentsTable.removeChild(personRow))\n .catch(error => this.controller.renderStatus(error))\n }\n : {})\n return personRow\n }\n\n private async deleteAgent (combo, pred, obj): Promise<void> {\n const combos = this.byCombo[combo] || []\n const comboToRemove = combos.find(([comboPred, comboObj]) => comboPred === pred && comboObj === obj)\n if (comboToRemove) {\n combos.splice(combos.indexOf(comboToRemove), 1)\n }\n await this.controller.save()\n }\n\n public async addNewURI (uri: string): Promise<void> {\n await this.handleDroppedUri(uri, kToCombo(1))\n await this.controller.save()\n }\n\n private async handleDroppedUris (uris: string[], combo: string): Promise<void> {\n try {\n await Promise.all(uris.map(uri => this.handleDroppedUri(uri, combo)))\n await this.controller.save()\n } catch (error) {\n return Promise.reject(error)\n }\n }\n\n private async handleDroppedUri (uri: string, combo: string, secondAttempt: boolean = false): Promise<void> {\n const agent = findAgent(uri, this.store) // eg 'agent', 'origin', agentClass'\n const thing = sym(uri)\n if (!agent && !secondAttempt) {\n debug.log(` Not obvious: looking up dropped thing ${thing}`)\n try {\n await this._store?.fetcher?.load(thing.doc())\n } catch (error) {\n const message = `Ignore error looking up dropped thing: ${error}`\n debug.error(message)\n return Promise.reject(new Error(message))\n }\n return this.handleDroppedUri(uri, combo, true)\n } else if (!agent) {\n const detectedTypes = Object.keys(this.store.findTypeURIs(thing))\n const typeDetails = detectedTypes.length > 0\n ? `Detected RDF types: ${detectedTypes.join(', ')}`\n : 'No RDF type was detected for this URI.'\n const error =\n `Error: Failed to add access target: ${uri} is not a recognized ACL target type.` +\n ' Expected one of: vcard:WebID, vcard:Group, foaf:Person, foaf:Agent, solid:AppProvider, solid:AppProviderClass, or recognized ACL classes.' +\n ' Hint: try dropping a WebID profile URI, a vcard:Group URI, or a web app origin.' +\n typeDetails\n debug.error(error)\n return Promise.reject(new Error(error))\n }\n this.setACLCombo(combo, uri, agent, this.controller.subject)\n }\n\n private setACLCombo (combo: string, uri: string, res: PartialAgentTriple, subject: NamedNode): void {\n if (!(combo in this.byCombo)) {\n this.byCombo[combo] = []\n }\n this.removeAgentFromCombos(uri) // Combos are mutually distinct\n this.byCombo[combo].push([res.pred, res.obj.uri])\n debug.log(`ACL: setting access to ${subject} by ${res.pred}: ${res.obj}`)\n }\n\n private removeAgentFromCombos (uri: string): void {\n for (let k = 0; k < 16; k++) {\n const combos = this.byCombo[kToCombo(k)]\n if (combos) {\n for (let i = 0; i < combos.length; i++) {\n while (i < combos.length && combos[i][1] === uri) {\n combos.splice(i, 1)\n }\n }\n }\n }\n }\n}\n\nfunction kToCombo (k: number): string {\n const y = ['Read', 'Append', 'Write', 'Control']\n const combo: string[] = []\n for (let i = 0; i < 4; i++) {\n if (k & (1 << i)) {\n combo.push('http://www.w3.org/ns/auth/acl#' + y[i])\n }\n }\n combo.sort()\n return combo.join('\\n')\n}\n\nfunction ktToList (k: number): string {\n let list = ''\n const y = ['Read', 'Append', 'Write', 'Control']\n for (let i = 0; i < 4; i++) {\n if (k & (1 << i)) {\n list += y[i]\n }\n }\n return list\n}\n\nfunction findAgent (uri, kb): PartialAgentTriple | null {\n const obj = sym(uri)\n const types = kb.findTypeURIs(obj)\n for (const ty in types) {\n debug.log(' drop object type includes: ' + ty)\n }\n // An Origin URI is one like https://fred.github.io eith no trailing slash\n if (uri.startsWith('http') && uri.split('/').length === 3) {\n // there is no third slash\n return { pred: 'origin', obj } // The only way to know an origin alas\n }\n // @@ This is an almighty kludge needed because drag and drop adds extra slashes to origins\n if (\n uri.startsWith('http') &&\n uri.split('/').length === 4 &&\n uri.endsWith('/')\n ) {\n // there IS third slash\n debug.log('Assuming final slash on dragged origin URI was unintended!')\n return { pred: 'origin', obj: sym(uri.slice(0, -1)) } // Fix a URI where the drag and drop system has added a spurious slash\n }\n\n if (ns.vcard('WebID').uri in types) return { pred: 'agent', obj }\n\n if (ns.vcard('Group').uri in types) {\n return { pred: 'agentGroup', obj } // @@ note vcard membership not RDFs\n }\n if (\n obj.sameTerm(ns.foaf('Agent')) ||\n obj.sameTerm(ns.acl('AuthenticatedAgent')) || // AuthenticatedAgent\n obj.sameTerm(ns.rdf('Resource')) ||\n obj.sameTerm(ns.owl('Thing'))\n ) {\n return { pred: 'agentClass', obj }\n }\n if (\n ns.vcard('Individual').uri in types ||\n ns.foaf('Person').uri in types ||\n ns.foaf('Agent').uri in types\n ) {\n const pref = kb.any(obj, ns.foaf('preferredURI'))\n if (pref) return { pred: 'agent', obj: sym(pref) }\n return { pred: 'agent', obj }\n }\n if (ns.solid('AppProvider').uri in types) {\n return { pred: 'origin', obj }\n }\n if (ns.solid('AppProviderClass').uri in types) {\n return { pred: 'originClass', obj }\n }\n debug.log(' Triage fails for ' + uri)\n return null\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"access-groups.cjs.js","names":["ns","readACL","ACLbyCombination","AddAgentButtons","style","sym","error","require_acl","require_ns","require_add_agent_buttons","require_dragAndDrop","require_buttons","require_debug","require_style","rdflib","ACL","COLLOQUIAL","RECOMMENDED","EXPLANATION","AccessGroups","doc","aclDoc","controller","_options","store","group","groupElements","comboIndex","combo","kToCombo","groupRow","uris","error","column","groupNameColumn","ktToList","groupAgentsColumn","groupAgentsTable","pred","obj","agentElement","groupDescriptionElement","personRow","combos","comboToRemove","comboPred","comboObj","uri","agent","findAgent","thing","secondAttempt","error$1","message","detectedTypes","typeDetails","error$2","res","subject","k","i","y","list","types","kb","ty","pref"],"sources":["../../src/acl/access-groups.ts"],"sourcesContent":["/**\n * Contains the [[AccessGroups]]\n * and [[AccessGroupsOptions]] classes\n * @packageDocumentation\n */\n\nimport { NamedNode, sym, Store } from 'rdflib'\nimport { ACLbyCombination, readACL } from './acl'\nimport * as widgets from '../widgets'\nimport ns from '../lib/ns'\nimport { AccessController } from './access-controller'\nimport { AgentMapMap, ComboList, PartialAgentTriple } from './types'\nimport { AddAgentButtons } from './add-agent-buttons'\nimport * as debug from '../lib/debug'\nimport { style } from '../lib/style'\n\nconst ACL = ns.acl\n\nconst COLLOQUIAL = {\n 13: 'Owners',\n 9: 'Owners (write locked)',\n 5: 'Editors',\n 3: 'Posters',\n 2: 'Submitters',\n 1: 'Viewers'\n}\n\nconst RECOMMENDED = {\n 13: true,\n 5: true,\n 3: true,\n 2: true,\n 1: true\n}\n\nconst EXPLANATION = {\n 13: 'can read, write, and control sharing.',\n 9: 'can read and control sharing, currently write-locked.',\n 5: 'can read and change information',\n 3: 'can add new information, and read but not change existing information',\n 2: 'can add new information but not read any',\n 1: 'can read but not change information'\n}\n\n/**\n * Type for the options parameter of [[AccessGroups]]\n */\nexport interface AccessGroupsOptions {\n defaults?: boolean\n}\n\n/**\n * Renders the table of Owners, Editors, Posters, Submitters, Viewers\n * for https://github.com/solidos/userguide/blob/main/views/sharing/userguide.md\n */\nexport class AccessGroups {\n private readonly defaults: boolean\n public byCombo: ComboList\n public aclMap: AgentMapMap\n private readonly addAgentButton: AddAgentButtons\n private readonly rootElement: HTMLElement\n private _store: Store // @@ was LiveStore but does not need to be connected to web\n\n constructor (\n private doc: NamedNode,\n private aclDoc: NamedNode,\n public controller: AccessController,\n store: Store, // @@ was LiveStore\n private _options: AccessGroupsOptions = {}\n ) {\n this.defaults = this._options.defaults || false\n this._store = store\n this.aclMap = readACL(doc, aclDoc, store, this.defaults)\n this.byCombo = ACLbyCombination(this.aclMap)\n this.addAgentButton = new AddAgentButtons(this)\n this.rootElement = this.controller.dom.createElement('div')\n this.rootElement.setAttribute('style', style.accessGroupList)\n }\n\n public get store () {\n return this._store\n }\n\n public set store (store) {\n this._store = store\n this.aclMap = readACL(this.doc, this.aclDoc, store, this.defaults)\n this.byCombo = ACLbyCombination(this.aclMap)\n }\n\n public render (): HTMLElement {\n this.rootElement.innerHTML = ''\n this.renderGroups().forEach(group => this.rootElement.appendChild(group))\n if (this.controller.isEditable) {\n this.rootElement.appendChild(this.addAgentButton.render())\n }\n return this.rootElement\n }\n\n private renderGroups (): HTMLElement[] {\n const groupElements: HTMLElement[] = []\n for (let comboIndex = 15; comboIndex > 0; comboIndex--) {\n const combo = kToCombo(comboIndex)\n if ((this.controller.isEditable && RECOMMENDED[comboIndex]) || this.byCombo[combo]) {\n groupElements.push(this.renderGroup(comboIndex, combo))\n }\n }\n return groupElements\n }\n\n private renderGroup (comboIndex: number, combo: string): HTMLElement {\n const groupRow = this.controller.dom.createElement('div')\n groupRow.setAttribute('style', style.accessGroupListItem)\n widgets.makeDropTarget(groupRow, (uris) => this.handleDroppedUris(uris, combo)\n .then(() => this.controller.render())\n .catch(error => this.controller.renderStatus(error)))\n const groupColumns = this.renderGroupElements(comboIndex, combo)\n groupColumns.forEach(column => groupRow.appendChild(column))\n return groupRow\n }\n\n private renderGroupElements (comboIndex, combo): HTMLElement[] {\n const groupNameColumn = this.controller.dom.createElement('div')\n groupNameColumn.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupNameColumn.setAttribute('style', style.group1)\n break\n case 2:\n groupNameColumn.setAttribute('style', style.group2)\n break\n case 3:\n groupNameColumn.setAttribute('style', style.group3)\n break\n case 5:\n groupNameColumn.setAttribute('style', style.group5)\n break\n case 9:\n groupNameColumn.setAttribute('style', style.group9)\n break\n case 13:\n groupNameColumn.setAttribute('style', style.group13)\n break\n default:\n groupNameColumn.setAttribute('style', style.group)\n }\n }\n groupNameColumn.innerText = COLLOQUIAL[comboIndex] || ktToList(comboIndex)\n\n const groupAgentsColumn = this.controller.dom.createElement('div')\n groupAgentsColumn.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupAgentsColumn.setAttribute('style', style.group1)\n break\n case 2:\n groupAgentsColumn.setAttribute('style', style.group2)\n break\n case 3:\n groupAgentsColumn.setAttribute('style', style.group3)\n break\n case 5:\n groupAgentsColumn.setAttribute('style', style.group5)\n break\n case 9:\n groupAgentsColumn.setAttribute('style', style.group9)\n break\n case 13:\n groupAgentsColumn.setAttribute('style', style.group13)\n break\n default:\n groupAgentsColumn.setAttribute('style', style.group)\n }\n }\n const groupAgentsTable = groupAgentsColumn.appendChild(this.controller.dom.createElement('table'))\n const combos = this.byCombo[combo] || []\n combos\n .map(([pred, obj]) => this.renderAgent(groupAgentsTable, combo, pred, obj))\n .forEach(agentElement => groupAgentsTable.appendChild(agentElement))\n\n const groupDescriptionElement = this.controller.dom.createElement('div')\n groupDescriptionElement.setAttribute('style', style.group)\n if (this.controller.isEditable) {\n switch (comboIndex) {\n case 1:\n groupDescriptionElement.setAttribute('style', style.group1)\n break\n case 2:\n groupDescriptionElement.setAttribute('style', style.group2)\n break\n case 3:\n groupDescriptionElement.setAttribute('style', style.group3)\n break\n case 5:\n groupDescriptionElement.setAttribute('style', style.group5)\n break\n case 9:\n groupDescriptionElement.setAttribute('style', style.group9)\n break\n case 13:\n groupDescriptionElement.setAttribute('style', style.group13)\n break\n default:\n groupDescriptionElement.setAttribute('style', style.group)\n }\n }\n groupDescriptionElement.innerText = EXPLANATION[comboIndex] || 'Unusual combination'\n\n return [groupNameColumn, groupAgentsColumn, groupDescriptionElement]\n }\n\n private renderAgent (groupAgentsTable, combo, pred, obj): HTMLElement {\n const personRow = widgets.personTR(this.controller.dom, ACL(pred), sym(obj), this.controller.isEditable\n ? {\n deleteFunction: () => this.deleteAgent(combo, pred, obj)\n .then(() => groupAgentsTable.removeChild(personRow))\n .catch(error => this.controller.renderStatus(error))\n }\n : {})\n return personRow\n }\n\n private async deleteAgent (combo, pred, obj): Promise<void> {\n const combos = this.byCombo[combo] || []\n const comboToRemove = combos.find(([comboPred, comboObj]) => comboPred === pred && comboObj === obj)\n if (comboToRemove) {\n combos.splice(combos.indexOf(comboToRemove), 1)\n }\n await this.controller.save()\n }\n\n public async addNewURI (uri: string): Promise<void> {\n await this.handleDroppedUri(uri, kToCombo(1))\n await this.controller.save()\n }\n\n private async handleDroppedUris (uris: string[], combo: string): Promise<void> {\n try {\n await Promise.all(uris.map(uri => this.handleDroppedUri(uri, combo)))\n await this.controller.save()\n } catch (error) {\n return Promise.reject(error)\n }\n }\n\n private async handleDroppedUri (uri: string, combo: string, secondAttempt: boolean = false): Promise<void> {\n const agent = findAgent(uri, this.store) // eg 'agent', 'origin', agentClass'\n const thing = sym(uri)\n if (!agent && !secondAttempt) {\n debug.log(` Not obvious: looking up dropped thing ${thing}`)\n try {\n await this._store?.fetcher?.load(thing.doc())\n } catch (error) {\n const message = `Ignore error looking up dropped thing: ${error}`\n debug.error(message)\n return Promise.reject(new Error(message))\n }\n return this.handleDroppedUri(uri, combo, true)\n } else if (!agent) {\n const detectedTypes = Object.keys(this.store.findTypeURIs(thing))\n const typeDetails = detectedTypes.length > 0\n ? `Detected RDF types: ${detectedTypes.join(', ')}`\n : 'No RDF type was detected for this URI.'\n const error =\n `Error: Failed to add access target: ${uri} is not a recognized ACL target type.` +\n ' Expected one of: vcard:WebID, vcard:Group, foaf:Person, foaf:Agent, solid:AppProvider, solid:AppProviderClass, or recognized ACL classes.' +\n ' Hint: try dropping a WebID profile URI, a vcard:Group URI, or a web app origin.' +\n typeDetails\n debug.error(error)\n return Promise.reject(new Error(error))\n }\n this.setACLCombo(combo, uri, agent, this.controller.subject)\n }\n\n private setACLCombo (combo: string, uri: string, res: PartialAgentTriple, subject: NamedNode): void {\n if (!(combo in this.byCombo)) {\n this.byCombo[combo] = []\n }\n this.removeAgentFromCombos(uri) // Combos are mutually distinct\n this.byCombo[combo].push([res.pred, res.obj.uri])\n debug.log(`ACL: setting access to ${subject} by ${res.pred}: ${res.obj}`)\n }\n\n private removeAgentFromCombos (uri: string): void {\n for (let k = 0; k < 16; k++) {\n const combos = this.byCombo[kToCombo(k)]\n if (combos) {\n for (let i = 0; i < combos.length; i++) {\n while (i < combos.length && combos[i][1] === uri) {\n combos.splice(i, 1)\n }\n }\n }\n }\n }\n}\n\nfunction kToCombo (k: number): string {\n const y = ['Read', 'Append', 'Write', 'Control']\n const combo: string[] = []\n for (let i = 0; i < 4; i++) {\n if (k & (1 << i)) {\n combo.push('http://www.w3.org/ns/auth/acl#' + y[i])\n }\n }\n combo.sort()\n return combo.join('\\n')\n}\n\nfunction ktToList (k: number): string {\n let list = ''\n const y = ['Read', 'Append', 'Write', 'Control']\n for (let i = 0; i < 4; i++) {\n if (k & (1 << i)) {\n list += y[i]\n }\n }\n return list\n}\n\nfunction findAgent (uri, kb): PartialAgentTriple | null {\n const obj = sym(uri)\n const types = kb.findTypeURIs(obj)\n for (const ty in types) {\n debug.log(' drop object type includes: ' + ty)\n }\n // An Origin URI is one like https://fred.github.io eith no trailing slash\n if (uri.startsWith('http') && uri.split('/').length === 3) {\n // there is no third slash\n return { pred: 'origin', obj } // The only way to know an origin alas\n }\n // @@ This is an almighty kludge needed because drag and drop adds extra slashes to origins\n if (\n uri.startsWith('http') &&\n uri.split('/').length === 4 &&\n uri.endsWith('/')\n ) {\n // there IS third slash\n debug.log('Assuming final slash on dragged origin URI was unintended!')\n return { pred: 'origin', obj: sym(uri.slice(0, -1)) } // Fix a URI where the drag and drop system has added a spurious slash\n }\n\n if (ns.vcard('WebID').uri in types) return { pred: 'agent', obj }\n\n if (ns.vcard('Group').uri in types) {\n return { pred: 'agentGroup', obj } // @@ note vcard membership not RDFs\n }\n if (\n obj.sameTerm(ns.foaf('Agent')) ||\n obj.sameTerm(ns.acl('AuthenticatedAgent')) || // AuthenticatedAgent\n obj.sameTerm(ns.rdf('Resource')) ||\n obj.sameTerm(ns.owl('Thing'))\n ) {\n return { pred: 'agentClass', obj }\n }\n if (\n ns.vcard('Individual').uri in types ||\n ns.foaf('Person').uri in types ||\n ns.foaf('Agent').uri in types\n ) {\n const pref = kb.any(obj, ns.foaf('preferredURI'))\n if (pref) return { pred: 'agent', obj: sym(pref) }\n return { pred: 'agent', obj }\n }\n if (ns.solid('AppProvider').uri in types) {\n return { pred: 'origin', obj }\n }\n if (ns.solid('AppProviderClass').uri in types) {\n return { pred: 'originClass', obj }\n }\n debug.log(' Triage fails for ' + uri)\n return null\n}\n"],"mappings":"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"}