solid-ui 3.1.3-6 → 3.1.3-8

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 (552) hide show
  1. package/dist/_virtual/~icons/app/solid-emblem.cjs.js +3 -0
  2. package/dist/_virtual/~icons/app/solid-emblem.cjs.js.map +1 -0
  3. package/dist/_virtual/~icons/app/solid-emblem.esm.js +11 -0
  4. package/dist/_virtual/~icons/app/solid-emblem.esm.js.map +1 -0
  5. package/dist/_virtual/~icons/lucide/chevron-down.cjs.js +1 -1
  6. package/dist/_virtual/~icons/lucide/chevron-down.esm.js +1 -0
  7. package/dist/_virtual/~icons/lucide/circle-user.cjs.js +1 -1
  8. package/dist/_virtual/~icons/lucide/circle-user.esm.js +1 -0
  9. package/dist/_virtual/~icons/lucide/log-in.cjs.js +1 -1
  10. package/dist/_virtual/~icons/lucide/log-in.esm.js +1 -0
  11. package/dist/_virtual/~icons/lucide/log-out.cjs.js +1 -1
  12. package/dist/_virtual/~icons/lucide/log-out.esm.js +1 -0
  13. package/dist/_virtual/~icons/lucide/user.cjs.js +1 -1
  14. package/dist/_virtual/~icons/lucide/user.esm.js +1 -0
  15. package/dist/_virtual/~icons/lucide/x.cjs.js +1 -1
  16. package/dist/_virtual/~icons/lucide/x.esm.js +1 -0
  17. package/dist/_virtual/~icons/svg-spinners/180-ring.cjs.js +1 -1
  18. package/dist/_virtual/~icons/svg-spinners/180-ring.esm.js +1 -0
  19. package/dist/acl/access-controller.cjs.js +1 -1
  20. package/dist/acl/access-controller.cjs.js.map +1 -1
  21. package/dist/acl/access-controller.esm.js.map +1 -1
  22. package/dist/acl/access-groups.cjs.js.map +1 -1
  23. package/dist/acl/access-groups.esm.js.map +1 -1
  24. package/dist/acl/acl-control.cjs.js +1 -1
  25. package/dist/acl/acl-control.cjs.js.map +1 -1
  26. package/dist/acl/acl-control.esm.js +1 -1
  27. package/dist/acl/acl-control.esm.js.map +1 -1
  28. package/dist/acl/acl.cjs.js.map +1 -1
  29. package/dist/acl/acl.esm.js.map +1 -1
  30. package/dist/acl/add-agent-buttons.cjs.js.map +1 -1
  31. package/dist/acl/add-agent-buttons.esm.js.map +1 -1
  32. package/dist/breakpoints.css +1 -0
  33. package/dist/breakpoints.css.d.ts +1 -0
  34. package/dist/chat/bookmarks.cjs.js +1 -1
  35. package/dist/chat/bookmarks.cjs.js.map +1 -1
  36. package/dist/chat/bookmarks.esm.js +1 -1
  37. package/dist/chat/bookmarks.esm.js.map +1 -1
  38. package/dist/chat/chatLogic.cjs.js.map +1 -1
  39. package/dist/chat/chatLogic.esm.js.map +1 -1
  40. package/dist/chat/dateFolder.cjs.js +1 -1
  41. package/dist/chat/dateFolder.cjs.js.map +1 -1
  42. package/dist/chat/dateFolder.esm.js +1 -1
  43. package/dist/chat/dateFolder.esm.js.map +1 -1
  44. package/dist/chat/infinite.cjs.js +1 -1
  45. package/dist/chat/infinite.cjs.js.map +1 -1
  46. package/dist/chat/infinite.esm.js +1 -1
  47. package/dist/chat/infinite.esm.js.map +1 -1
  48. package/dist/chat/keys.cjs.js +1 -1
  49. package/dist/chat/keys.cjs.js.map +1 -1
  50. package/dist/chat/keys.esm.js +1 -1
  51. package/dist/chat/keys.esm.js.map +1 -1
  52. package/dist/chat/message.cjs.js +1 -1
  53. package/dist/chat/message.cjs.js.map +1 -1
  54. package/dist/chat/message.esm.js +24 -24
  55. package/dist/chat/message.esm.js.map +1 -1
  56. package/dist/chat/messageTools.cjs.js.map +1 -1
  57. package/dist/chat/messageTools.esm.js.map +1 -1
  58. package/dist/chat/signature.cjs.js +1 -1
  59. package/dist/chat/signature.cjs.js.map +1 -1
  60. package/dist/chat/signature.esm.js +1 -1
  61. package/dist/chunks/{DialogProvider-DphduSXG.js → DialogProvider-Bt65G0Tk.js} +4 -4
  62. package/dist/chunks/DialogProvider-Bt65G0Tk.js.map +1 -0
  63. package/dist/chunks/{account-CFhrB0LO.js → account-jSZP2tZ5.js} +76 -60
  64. package/dist/chunks/account-jSZP2tZ5.js.map +1 -0
  65. package/dist/chunks/{auth-Cpf3HYqF.js → auth-CZOEEeJ8.js} +23 -23
  66. package/dist/chunks/{auth-Cpf3HYqF.js.map → auth-CZOEEeJ8.js.map} +1 -1
  67. package/dist/chunks/{avatar-D281qln0.js → avatar-BugsRJZg.js} +5 -5
  68. package/dist/chunks/avatar-BugsRJZg.js.map +1 -0
  69. package/dist/chunks/{button-DbKYu6-r.js → button-0s0lZdxm.js} +2 -2
  70. package/dist/chunks/{button-DbKYu6-r.js.map → button-0s0lZdxm.js.map} +1 -1
  71. package/dist/chunks/chunk.K442ELDU-TtQSV9g1.js +1516 -0
  72. package/dist/chunks/chunk.K442ELDU-TtQSV9g1.js.map +1 -0
  73. package/dist/chunks/combobox-Cxi8xUMn.js +473 -0
  74. package/dist/chunks/combobox-Cxi8xUMn.js.map +1 -0
  75. package/dist/chunks/{combobox-option-Ck0mu4Gc.js → combobox-option-DiR3VpyT.js} +2 -2
  76. package/dist/chunks/{combobox-option-Ck0mu4Gc.js.map → combobox-option-DiR3VpyT.js.map} +1 -1
  77. package/dist/chunks/{components-BlEGdx4i.js → components-C1LEhsaK.js} +5 -9
  78. package/dist/chunks/components-C1LEhsaK.js.map +1 -0
  79. package/dist/chunks/{context-DJ_8r7Oc.js → context-uE5jJlS0.js} +2 -2
  80. package/dist/chunks/{context-DJ_8r7Oc.js.map → context-uE5jJlS0.js.map} +1 -1
  81. package/dist/chunks/decorators-BiCkPd_3.js.map +1 -1
  82. package/dist/chunks/{dialog-DlBtmOm6.js → dialog-BAzrHJ8w.js} +6 -6
  83. package/dist/chunks/dialog-BAzrHJ8w.js.map +1 -0
  84. package/dist/chunks/{dialog-content-CMeH_BD7.js → dialog-content-fdJrkCyB.js} +2 -2
  85. package/dist/chunks/{dialog-content-CMeH_BD7.js.map → dialog-content-fdJrkCyB.js.map} +1 -1
  86. package/dist/chunks/{dialog-footer-D0zzIMlx.js → dialog-footer-Bs_p2Nn9.js} +2 -2
  87. package/dist/chunks/{dialog-footer-D0zzIMlx.js.map → dialog-footer-Bs_p2Nn9.js.map} +1 -1
  88. package/dist/chunks/{dialog-header-DeC1iiLD.js → dialog-header-CWIAAoDo.js} +2 -2
  89. package/dist/chunks/{dialog-header-DeC1iiLD.js.map → dialog-header-CWIAAoDo.js.map} +1 -1
  90. package/dist/chunks/{dialogs-root-BcUcRuAt.js → dialogs-root-Cv932Aqm.js} +3 -3
  91. package/dist/chunks/{dialogs-root-BcUcRuAt.js.map → dialogs-root-Cv932Aqm.js.map} +1 -1
  92. package/dist/chunks/{footer-Bxe4WPgl.js → footer-kVa_uMeQ.js} +3 -3
  93. package/dist/chunks/{footer-Bxe4WPgl.js.map → footer-kVa_uMeQ.js.map} +1 -1
  94. package/dist/chunks/{guard-Da3znlJI.js → guard-Cml6dHTv.js} +4 -4
  95. package/dist/chunks/{guard-Da3znlJI.js.map → guard-Cml6dHTv.js.map} +1 -1
  96. package/dist/chunks/{headerFooterHelpers-5LYv-0Rt.js → headerFooterHelpers-BiZ6X10e.js} +15 -15
  97. package/dist/chunks/{headerFooterHelpers-5LYv-0Rt.js.map → headerFooterHelpers-BiZ6X10e.js.map} +1 -1
  98. package/dist/chunks/{input-Bkzi4zSV.js → input-BF224Jid.js} +2 -2
  99. package/dist/chunks/{input-Bkzi4zSV.js.map → input-BF224Jid.js.map} +1 -1
  100. package/dist/chunks/{jsonld-DZG2v1pE.js → jsonld-Cd-ZhJmZ.js} +54 -54
  101. package/dist/chunks/{jsonld-DZG2v1pE.js.map → jsonld-Cd-ZhJmZ.js.map} +1 -1
  102. package/dist/chunks/lit-C4H1jI4q.js.map +1 -1
  103. package/dist/chunks/{login-button-C603hM0G.js → login-button-pe1-DVNZ.js} +5 -5
  104. package/dist/chunks/{login-button-C603hM0G.js.map → login-button-pe1-DVNZ.js.map} +1 -1
  105. package/dist/chunks/{logout-button-Cxzpq-C3.js → logout-button-C5dtQiBB.js} +5 -5
  106. package/dist/chunks/{logout-button-Cxzpq-C3.js.map → logout-button-C5dtQiBB.js.map} +1 -1
  107. package/dist/chunks/{menu-aQiqq1ET.js → menu-DNcuV-1J.js} +183 -1693
  108. package/dist/chunks/menu-DNcuV-1J.js.map +1 -0
  109. package/dist/chunks/{menu-item-DBy4o-M4.js → menu-item-CWg-eS4V.js} +8 -6
  110. package/dist/chunks/menu-item-CWg-eS4V.js.map +1 -0
  111. package/dist/chunks/photo-capture-tiBsdSbA.js.map +1 -1
  112. package/dist/chunks/{provider-DZmdgerD.js → provider-DRxSExO6.js} +5 -5
  113. package/dist/chunks/{provider-DZmdgerD.js.map → provider-DRxSExO6.js.map} +1 -1
  114. package/dist/chunks/{select-wczAzbZF.js → select-D8dW53pr.js} +2 -2
  115. package/dist/chunks/{select-wczAzbZF.js.map → select-D8dW53pr.js.map} +1 -1
  116. package/dist/chunks/{select-option-hd_d1RNj.js → select-option-B-6ULCpQ.js} +2 -2
  117. package/dist/chunks/{select-option-hd_d1RNj.js.map → select-option-B-6ULCpQ.js.map} +1 -1
  118. package/dist/chunks/{signup-button-CsRaOUI4.js → signup-button-QvYELqb6.js} +5 -5
  119. package/dist/chunks/{signup-button-CsRaOUI4.js.map → signup-button-QvYELqb6.js.map} +1 -1
  120. package/dist/chunks/solid-emblem-BDzhMTjL.js +185 -0
  121. package/dist/chunks/solid-emblem-BDzhMTjL.js.map +1 -0
  122. package/dist/chunks/{solid-logic.esm-7q6hmfIF.js → solid-logic.esm-BhVcNu8u.js} +2517 -2521
  123. package/dist/chunks/solid-logic.esm-BhVcNu8u.js.map +1 -0
  124. package/dist/chunks/{src-BOU-JwWx.js → src-DYvSns7X.js} +2378 -2354
  125. package/dist/chunks/src-DYvSns7X.js.map +1 -0
  126. package/dist/components/account/Account.cjs.js +7 -2
  127. package/dist/components/account/Account.cjs.js.map +1 -1
  128. package/dist/components/account/Account.d.ts +8 -1
  129. package/dist/components/account/Account.d.ts.map +1 -1
  130. package/dist/components/account/Account.esm.js +64 -48
  131. package/dist/components/account/Account.esm.js.map +1 -1
  132. package/dist/components/account/Account.stories.d.ts +3 -8
  133. package/dist/components/account/Account.stories.d.ts.map +1 -1
  134. package/dist/components/account/Account.styles.cjs.js +1 -1
  135. package/dist/components/account/Account.styles.cjs.js.map +1 -1
  136. package/dist/components/account/Account.styles.esm.js +1 -1
  137. package/dist/components/account/Account.styles.esm.js.map +1 -1
  138. package/dist/components/account/index.cjs.js +1 -1
  139. package/dist/components/account/index.cjs.js.map +1 -1
  140. package/dist/components/account/index.d.ts +2 -2
  141. package/dist/components/account/index.d.ts.map +1 -1
  142. package/dist/components/account/index.esm.js +1 -1
  143. package/dist/components/account/index.esm.js.map +1 -1
  144. package/dist/components/account.js +1 -1
  145. package/dist/components/avatar/Avatar.cjs.js +1 -1
  146. package/dist/components/avatar/Avatar.cjs.js.map +1 -1
  147. package/dist/components/avatar/Avatar.esm.js +1 -1
  148. package/dist/components/avatar/Avatar.styles.cjs.js +1 -1
  149. package/dist/components/avatar/Avatar.styles.cjs.js.map +1 -1
  150. package/dist/components/avatar/Avatar.styles.esm.js +1 -1
  151. package/dist/components/avatar/Avatar.styles.esm.js.map +1 -1
  152. package/dist/components/avatar/index.cjs.js +1 -1
  153. package/dist/components/avatar/index.esm.js +1 -1
  154. package/dist/components/avatar.js +1 -1
  155. package/dist/components/button/Button.cjs.js +1 -1
  156. package/dist/components/button/Button.cjs.js.map +1 -1
  157. package/dist/components/button/Button.esm.js +1 -1
  158. package/dist/components/button/Button.esm.js.map +1 -1
  159. package/dist/components/button/index.cjs.js +1 -1
  160. package/dist/components/button/index.esm.js +3 -3
  161. package/dist/components/button.js +1 -1
  162. package/dist/components/combobox/Combobox.cjs.js +57 -25
  163. package/dist/components/combobox/Combobox.cjs.js.map +1 -1
  164. package/dist/components/combobox/Combobox.d.ts +22 -3
  165. package/dist/components/combobox/Combobox.d.ts.map +1 -1
  166. package/dist/components/combobox/Combobox.esm.js +220 -101
  167. package/dist/components/combobox/Combobox.esm.js.map +1 -1
  168. package/dist/components/combobox/Combobox.styles.cjs.js +1 -1
  169. package/dist/components/combobox/Combobox.styles.cjs.js.map +1 -1
  170. package/dist/components/combobox/Combobox.styles.esm.js +1 -1
  171. package/dist/components/combobox/Combobox.styles.esm.js.map +1 -1
  172. package/dist/components/combobox/index.cjs.js +1 -1
  173. package/dist/components/combobox/index.esm.js +1 -1
  174. package/dist/components/combobox-option/ComboboxOption.cjs.js +1 -1
  175. package/dist/components/combobox-option/ComboboxOption.cjs.js.map +1 -1
  176. package/dist/components/combobox-option/ComboboxOption.esm.js +1 -1
  177. package/dist/components/combobox-option/index.cjs.js +1 -1
  178. package/dist/components/combobox-option/index.esm.js +1 -1
  179. package/dist/components/combobox-option.js +1 -1
  180. package/dist/components/combobox.js +1 -1
  181. package/dist/components/dialog/Dialog.cjs.js +2 -2
  182. package/dist/components/dialog/Dialog.cjs.js.map +1 -1
  183. package/dist/components/dialog/Dialog.d.ts.map +1 -1
  184. package/dist/components/dialog/Dialog.esm.js +2 -2
  185. package/dist/components/dialog/Dialog.esm.js.map +1 -1
  186. package/dist/components/dialog/index.cjs.js +1 -1
  187. package/dist/components/dialog/index.esm.js +1 -1
  188. package/dist/components/dialog-content/DialogContent.cjs.js +1 -1
  189. package/dist/components/dialog-content/DialogContent.cjs.js.map +1 -1
  190. package/dist/components/dialog-content/DialogContent.esm.js +1 -1
  191. package/dist/components/dialog-content/DialogContent.esm.js.map +1 -1
  192. package/dist/components/dialog-content/index.cjs.js +1 -1
  193. package/dist/components/dialog-content/index.esm.js +1 -1
  194. package/dist/components/dialog-content.js +1 -1
  195. package/dist/components/dialog-footer/DialogFooter.cjs.js +1 -1
  196. package/dist/components/dialog-footer/DialogFooter.cjs.js.map +1 -1
  197. package/dist/components/dialog-footer/DialogFooter.esm.js +1 -1
  198. package/dist/components/dialog-footer/DialogFooter.esm.js.map +1 -1
  199. package/dist/components/dialog-footer/index.cjs.js +1 -1
  200. package/dist/components/dialog-footer/index.esm.js +1 -1
  201. package/dist/components/dialog-footer.js +1 -1
  202. package/dist/components/dialog-header/DialogHeader.cjs.js +1 -1
  203. package/dist/components/dialog-header/DialogHeader.cjs.js.map +1 -1
  204. package/dist/components/dialog-header/DialogHeader.esm.js +1 -1
  205. package/dist/components/dialog-header/DialogHeader.esm.js.map +1 -1
  206. package/dist/components/dialog-header/index.cjs.js +1 -1
  207. package/dist/components/dialog-header/index.esm.js +1 -1
  208. package/dist/components/dialog-header.js +1 -1
  209. package/dist/components/dialog-provider/DialogProvider.cjs.js +1 -1
  210. package/dist/components/dialog-provider/DialogProvider.cjs.js.map +1 -1
  211. package/dist/components/dialog-provider/DialogProvider.esm.js +2 -2
  212. package/dist/components/dialog-provider/DialogProvider.esm.js.map +1 -1
  213. package/dist/components/dialog-provider/index.cjs.js +1 -1
  214. package/dist/components/dialog-provider/index.esm.js +1 -1
  215. package/dist/components/dialog-provider.js +1 -1
  216. package/dist/components/dialog.js +1 -1
  217. package/dist/components/dialogs-root/DialogsRoot.cjs.js +1 -1
  218. package/dist/components/dialogs-root/DialogsRoot.cjs.js.map +1 -1
  219. package/dist/components/dialogs-root/DialogsRoot.esm.js +1 -1
  220. package/dist/components/dialogs-root/index.cjs.js +1 -1
  221. package/dist/components/dialogs-root/index.esm.js +1 -1
  222. package/dist/components/dialogs-root.js +1 -1
  223. package/dist/components/footer.js +1 -1
  224. package/dist/components/guard/Guard.cjs.js +1 -1
  225. package/dist/components/guard/Guard.cjs.js.map +1 -1
  226. package/dist/components/guard/Guard.esm.js +1 -1
  227. package/dist/components/guard/index.cjs.js +1 -1
  228. package/dist/components/guard/index.esm.js +1 -1
  229. package/dist/components/guard.js +1 -1
  230. package/dist/components/index.cjs.js +1 -1
  231. package/dist/components/index.esm.js +2 -2
  232. package/dist/components/input/Input.cjs.js +1 -1
  233. package/dist/components/input/Input.cjs.js.map +1 -1
  234. package/dist/components/input/Input.esm.js +1 -1
  235. package/dist/components/input/index.cjs.js +1 -1
  236. package/dist/components/input/index.esm.js +1 -1
  237. package/dist/components/input.js +1 -1
  238. package/dist/components/login-button/LoginButton.cjs.js +1 -1
  239. package/dist/components/login-button/LoginButton.cjs.js.map +1 -1
  240. package/dist/components/login-button/LoginButton.esm.js +1 -1
  241. package/dist/components/login-button/index.cjs.js +1 -1
  242. package/dist/components/login-button/index.esm.js +1 -1
  243. package/dist/components/login-button.js +1 -1
  244. package/dist/components/login-modal/LoginModal.cjs.js +1 -1
  245. package/dist/components/login-modal/LoginModal.cjs.js.map +1 -1
  246. package/dist/components/login-modal/LoginModal.esm.js +1 -1
  247. package/dist/components/login-modal/index.cjs.js +1 -1
  248. package/dist/components/login-modal/index.esm.js +1 -1
  249. package/dist/components/login-modal.js +1 -1
  250. package/dist/components/logout-button/LogoutButton.cjs.js +1 -1
  251. package/dist/components/logout-button/LogoutButton.cjs.js.map +1 -1
  252. package/dist/components/logout-button/LogoutButton.esm.js +1 -1
  253. package/dist/components/logout-button/index.cjs.js +1 -1
  254. package/dist/components/logout-button/index.esm.js +1 -1
  255. package/dist/components/logout-button.js +1 -1
  256. package/dist/components/menu/Menu.cjs.js +1 -1
  257. package/dist/components/menu/Menu.cjs.js.map +1 -1
  258. package/dist/components/menu/Menu.esm.js +1 -1
  259. package/dist/components/menu/Menu.esm.js.map +1 -1
  260. package/dist/components/menu/index.cjs.js +1 -1
  261. package/dist/components/menu/index.esm.js +1 -1
  262. package/dist/components/menu-item/MenuItem.cjs.js +6 -4
  263. package/dist/components/menu-item/MenuItem.cjs.js.map +1 -1
  264. package/dist/components/menu-item/MenuItem.d.ts.map +1 -1
  265. package/dist/components/menu-item/MenuItem.esm.js +6 -4
  266. package/dist/components/menu-item/MenuItem.esm.js.map +1 -1
  267. package/dist/components/menu-item/MenuItem.styles.cjs.js +1 -1
  268. package/dist/components/menu-item/MenuItem.styles.cjs.js.map +1 -1
  269. package/dist/components/menu-item/MenuItem.styles.esm.js +1 -1
  270. package/dist/components/menu-item/MenuItem.styles.esm.js.map +1 -1
  271. package/dist/components/menu-item/index.cjs.js +1 -1
  272. package/dist/components/menu-item/index.esm.js +1 -1
  273. package/dist/components/menu-item.js +1 -1
  274. package/dist/components/menu.js +1 -1
  275. package/dist/components/provider/Provider.cjs.js +1 -1
  276. package/dist/components/provider/Provider.cjs.js.map +1 -1
  277. package/dist/components/provider/Provider.esm.js +1 -1
  278. package/dist/components/provider/index.cjs.js +1 -1
  279. package/dist/components/provider/index.esm.js +1 -1
  280. package/dist/components/provider.js +1 -1
  281. package/dist/components/select/Select.cjs.js +1 -1
  282. package/dist/components/select/Select.cjs.js.map +1 -1
  283. package/dist/components/select/Select.esm.js +1 -1
  284. package/dist/components/select/Select.esm.js.map +1 -1
  285. package/dist/components/select/index.cjs.js +1 -1
  286. package/dist/components/select/index.esm.js +1 -1
  287. package/dist/components/select-option/SelectOption.cjs.js +1 -1
  288. package/dist/components/select-option/SelectOption.cjs.js.map +1 -1
  289. package/dist/components/select-option/SelectOption.esm.js +1 -1
  290. package/dist/components/select-option/index.cjs.js +1 -1
  291. package/dist/components/select-option/index.esm.js +1 -1
  292. package/dist/components/select-option.js +1 -1
  293. package/dist/components/select.js +1 -1
  294. package/dist/components/signup-button/SignupButton.cjs.js +1 -1
  295. package/dist/components/signup-button/SignupButton.cjs.js.map +1 -1
  296. package/dist/components/signup-button/SignupButton.esm.js +1 -1
  297. package/dist/components/signup-button/index.cjs.js +1 -1
  298. package/dist/components/signup-button/index.esm.js +1 -1
  299. package/dist/components/signup-button.js +1 -1
  300. package/dist/components/solid-emblem/SolidEmblem.cjs.js +2 -0
  301. package/dist/components/solid-emblem/SolidEmblem.cjs.js.map +1 -0
  302. package/dist/components/solid-emblem/SolidEmblem.d.ts +6 -0
  303. package/dist/components/solid-emblem/SolidEmblem.d.ts.map +1 -0
  304. package/dist/components/solid-emblem/SolidEmblem.esm.js +178 -0
  305. package/dist/components/solid-emblem/SolidEmblem.esm.js.map +1 -0
  306. package/dist/components/solid-emblem/SolidEmblem.styles.cjs.js +2 -0
  307. package/dist/components/solid-emblem/SolidEmblem.styles.cjs.js.map +1 -0
  308. package/dist/components/solid-emblem/SolidEmblem.styles.esm.js +7 -0
  309. package/dist/components/solid-emblem/SolidEmblem.styles.esm.js.map +1 -0
  310. package/dist/components/solid-emblem/index.cjs.js +2 -0
  311. package/dist/components/solid-emblem/index.cjs.js.map +1 -0
  312. package/dist/components/solid-emblem/index.d.ts +4 -0
  313. package/dist/components/solid-emblem/index.d.ts.map +1 -0
  314. package/dist/components/solid-emblem/index.esm.js +7 -0
  315. package/dist/components/solid-emblem/index.esm.js.map +1 -0
  316. package/dist/components/solid-emblem.js +2 -0
  317. package/dist/components.js +23 -23
  318. package/dist/create/create.cjs.js.map +1 -1
  319. package/dist/create/create.esm.js.map +1 -1
  320. package/dist/create/index.cjs.js.map +1 -1
  321. package/dist/footer/index.cjs.js +1 -1
  322. package/dist/footer/index.esm.js +1 -1
  323. package/dist/header/index.cjs.js +1 -1
  324. package/dist/header/index.cjs.js.map +1 -1
  325. package/dist/header/index.esm.js +1 -1
  326. package/dist/header/index.esm.js.map +1 -1
  327. package/dist/index.js +6 -7
  328. package/dist/lib/auth/SolidAuth.cjs.js.map +1 -1
  329. package/dist/lib/auth/SolidAuth.esm.js.map +1 -1
  330. package/dist/lib/auth/context.cjs.js.map +1 -1
  331. package/dist/lib/auth/index.cjs.js +1 -1
  332. package/dist/lib/auth/index.esm.js +5 -4
  333. package/dist/lib/components/ids.cjs.js.map +1 -1
  334. package/dist/lib/components/ids.esm.js.map +1 -1
  335. package/dist/lib/components/index.cjs.js +1 -1
  336. package/dist/lib/components/index.esm.js +6 -5
  337. package/dist/lib/components/traits/DialogTrait.cjs.js.map +1 -1
  338. package/dist/lib/components/traits/DialogTrait.esm.js.map +1 -1
  339. package/dist/lib/components/traits/InputTrait.cjs.js +1 -1
  340. package/dist/lib/components/traits/InputTrait.cjs.js.map +1 -1
  341. package/dist/lib/components/traits/InputTrait.d.ts +1 -0
  342. package/dist/lib/components/traits/InputTrait.d.ts.map +1 -1
  343. package/dist/lib/components/traits/InputTrait.esm.js +3 -2
  344. package/dist/lib/components/traits/InputTrait.esm.js.map +1 -1
  345. package/dist/lib/components/traits/index.cjs.js +1 -1
  346. package/dist/lib/components/traits/index.esm.js +3 -2
  347. package/dist/lib/components/web-component/WebComponent.cjs.js +1 -1
  348. package/dist/lib/components/web-component/WebComponent.cjs.js.map +1 -1
  349. package/dist/lib/components/web-component/WebComponent.d.ts.map +1 -1
  350. package/dist/lib/components/web-component/WebComponent.esm.js +1 -6
  351. package/dist/lib/components/web-component/WebComponent.esm.js.map +1 -1
  352. package/dist/lib/components/web-component/WebComponent.styles.cjs.js.map +1 -1
  353. package/dist/lib/components/web-component/WebComponent.styles.esm.js.map +1 -1
  354. package/dist/lib/components/web-component/index.cjs.js +1 -1
  355. package/dist/lib/components/web-component/index.esm.js +2 -1
  356. package/dist/lib/dialogs/context.cjs.js.map +1 -1
  357. package/dist/lib/dialogs/index.cjs.js +1 -1
  358. package/dist/lib/dialogs/index.esm.js +6 -5
  359. package/dist/lib/forms/rdfHelper.d.ts +4 -0
  360. package/dist/lib/forms/rdfHelper.d.ts.map +1 -0
  361. package/dist/lib/log.cjs.js +1 -1
  362. package/dist/lib/log.cjs.js.map +1 -1
  363. package/dist/lib/log.esm.js +1 -1
  364. package/dist/lib/log.esm.js.map +1 -1
  365. package/dist/lib/messageArea.cjs.js.map +1 -1
  366. package/dist/lib/messageArea.esm.js.map +1 -1
  367. package/dist/lib/ns.cjs.js.map +1 -1
  368. package/dist/lib/pad.cjs.js +1 -1
  369. package/dist/lib/pad.cjs.js.map +1 -1
  370. package/dist/lib/pad.esm.js +1 -1
  371. package/dist/lib/pad.esm.js.map +1 -1
  372. package/dist/lib/participation.cjs.js.map +1 -1
  373. package/dist/lib/participation.esm.js.map +1 -1
  374. package/dist/lib/preferences.cjs.js +1 -1
  375. package/dist/lib/preferences.cjs.js.map +1 -1
  376. package/dist/lib/preferences.esm.js +1 -1
  377. package/dist/lib/preferences.esm.js.map +1 -1
  378. package/dist/lib/table.cjs.js.map +1 -1
  379. package/dist/lib/table.esm.js.map +1 -1
  380. package/dist/lib/tabs.cjs.js +1 -1
  381. package/dist/lib/tabs.cjs.js.map +1 -1
  382. package/dist/lib/tabs.esm.js +1 -1
  383. package/dist/lib/tabs.esm.js.map +1 -1
  384. package/dist/loader.js +6 -7
  385. package/dist/login/login.cjs.js +1 -1
  386. package/dist/login/login.cjs.js.map +1 -1
  387. package/dist/login/login.esm.js +1 -1
  388. package/dist/login/login.esm.js.map +1 -1
  389. package/dist/matrix/index.cjs.js.map +1 -1
  390. package/dist/matrix/matrix.cjs.js.map +1 -1
  391. package/dist/matrix/matrix.esm.js.map +1 -1
  392. package/dist/media/media-capture.cjs.js.map +1 -1
  393. package/dist/media/media-capture.esm.js.map +1 -1
  394. package/dist/signup/signup.cjs.js.map +1 -1
  395. package/dist/signup/signup.esm.js.map +1 -1
  396. package/dist/solid-ui.js +321 -1380
  397. package/dist/solid-ui.min.js +321 -1380
  398. package/dist/solid-ui.min.js.map +1 -1
  399. package/dist/theme.css +1 -1
  400. package/dist/utils/headerFooterHelpers.cjs.js.map +1 -1
  401. package/dist/utils/headerFooterHelpers.esm.js.map +1 -1
  402. package/dist/utils/index.cjs.js +2 -2
  403. package/dist/utils/index.cjs.js.map +1 -1
  404. package/dist/utils/index.esm.js +1 -1
  405. package/dist/utils/index.esm.js.map +1 -1
  406. package/dist/utils/keyHelpers/accessData.cjs.js +1 -1
  407. package/dist/utils/keyHelpers/accessData.cjs.js.map +1 -1
  408. package/dist/utils/keyHelpers/accessData.esm.js +1 -1
  409. package/dist/utils/keyHelpers/accessData.esm.js.map +1 -1
  410. package/dist/utils/keyHelpers/acl.cjs.js.map +1 -1
  411. package/dist/utils/keyHelpers/acl.esm.js.map +1 -1
  412. package/dist/utils/keyHelpers/otherHelpers.cjs.js.map +1 -1
  413. package/dist/utils/keyHelpers/otherHelpers.esm.js.map +1 -1
  414. package/dist/utils/label.cjs.js.map +1 -1
  415. package/dist/utils/label.esm.js.map +1 -1
  416. package/dist/v2/components/layout/footer/index.cjs.js +1 -1
  417. package/dist/v2/components/layout/footer/index.esm.js +1 -0
  418. package/dist/v2/components/media/photoCapture/PhotoCapture.cjs.js.map +1 -1
  419. package/dist/v2/components/media/photoCapture/PhotoCapture.esm.js.map +1 -1
  420. package/dist/v2/components/media/photoCapture/index.cjs.js +1 -1
  421. package/dist/v2/components/media/photoCapture/index.esm.js +1 -0
  422. package/dist/widgets/buttons/iconLinks.cjs.js.map +1 -1
  423. package/dist/widgets/buttons/iconLinks.esm.js.map +1 -1
  424. package/dist/widgets/buttons.cjs.js.map +1 -1
  425. package/dist/widgets/buttons.esm.js.map +1 -1
  426. package/dist/widgets/dragAndDrop.cjs.js.map +1 -1
  427. package/dist/widgets/dragAndDrop.esm.js.map +1 -1
  428. package/dist/widgets/error.cjs.js.map +1 -1
  429. package/dist/widgets/error.esm.js.map +1 -1
  430. package/dist/widgets/forms/autocomplete/autocompleteField.cjs.js.map +1 -1
  431. package/dist/widgets/forms/autocomplete/autocompleteField.esm.js.map +1 -1
  432. package/dist/widgets/forms/autocomplete/autocompletePicker.cjs.js.map +1 -1
  433. package/dist/widgets/forms/autocomplete/autocompletePicker.esm.js.map +1 -1
  434. package/dist/widgets/forms/autocomplete/language.cjs.js +1 -1
  435. package/dist/widgets/forms/autocomplete/language.cjs.js.map +1 -1
  436. package/dist/widgets/forms/autocomplete/language.esm.js +1 -1
  437. package/dist/widgets/forms/autocomplete/language.esm.js.map +1 -1
  438. package/dist/widgets/forms/autocomplete/publicData.cjs.js +1 -1
  439. package/dist/widgets/forms/autocomplete/publicData.cjs.js.map +1 -1
  440. package/dist/widgets/forms/autocomplete/publicData.esm.js +1 -1
  441. package/dist/widgets/forms/autocomplete/publicData.esm.js.map +1 -1
  442. package/dist/widgets/forms/basic.cjs.js.map +1 -1
  443. package/dist/widgets/forms/basic.esm.js.map +1 -1
  444. package/dist/widgets/forms/fieldFunction.cjs.js.map +1 -1
  445. package/dist/widgets/forms/fieldParams.cjs.js.map +1 -1
  446. package/dist/widgets/forms/fieldParams.esm.js.map +1 -1
  447. package/dist/widgets/forms/formStyle.cjs.js.map +1 -1
  448. package/dist/widgets/forms/formStyle.esm.js.map +1 -1
  449. package/dist/widgets/forms.cjs.js +1 -1
  450. package/dist/widgets/forms.cjs.js.map +1 -1
  451. package/dist/widgets/forms.esm.js +1 -1
  452. package/dist/widgets/forms.esm.js.map +1 -1
  453. package/dist/widgets/index.cjs.js +1 -1
  454. package/dist/widgets/index.esm.js +65 -65
  455. package/dist/widgets/multiSelect.cjs.js.map +1 -1
  456. package/dist/widgets/multiSelect.esm.js.map +1 -1
  457. package/dist/widgets/peoplePicker.cjs.js.map +1 -1
  458. package/dist/widgets/peoplePicker.esm.js.map +1 -1
  459. package/dist/widgets/widgetHelpers.cjs.js.map +1 -1
  460. package/dist/widgets/widgetHelpers.esm.js.map +1 -1
  461. package/package.json +14 -11
  462. package/dist/chunks/DialogProvider-DphduSXG.js.map +0 -1
  463. package/dist/chunks/account-CFhrB0LO.js.map +0 -1
  464. package/dist/chunks/avatar-D281qln0.js.map +0 -1
  465. package/dist/chunks/combobox-Dtgc8qqO.js +0 -354
  466. package/dist/chunks/combobox-Dtgc8qqO.js.map +0 -1
  467. package/dist/chunks/components-BlEGdx4i.js.map +0 -1
  468. package/dist/chunks/dialog-DlBtmOm6.js.map +0 -1
  469. package/dist/chunks/header-Bqd2CEK3.js +0 -1486
  470. package/dist/chunks/header-Bqd2CEK3.js.map +0 -1
  471. package/dist/chunks/iconBase-DJ0zbNSL.js +0 -31
  472. package/dist/chunks/iconBase-DJ0zbNSL.js.map +0 -1
  473. package/dist/chunks/menu-aQiqq1ET.js.map +0 -1
  474. package/dist/chunks/menu-item-DBy4o-M4.js.map +0 -1
  475. package/dist/chunks/solid-logic.esm-7q6hmfIF.js.map +0 -1
  476. package/dist/chunks/src-BOU-JwWx.js.map +0 -1
  477. package/dist/components/header/index.cjs.js +0 -1
  478. package/dist/components/header/index.d.ts +0 -2
  479. package/dist/components/header/index.d.ts.map +0 -1
  480. package/dist/components/header/index.esm.js +0 -3
  481. package/dist/components/header.js +0 -2
  482. package/dist/lib/features.cjs.js +0 -2
  483. package/dist/lib/features.cjs.js.map +0 -1
  484. package/dist/lib/features.d.ts +0 -8
  485. package/dist/lib/features.d.ts.map +0 -1
  486. package/dist/lib/features.esm.js +0 -6
  487. package/dist/lib/features.esm.js.map +0 -1
  488. package/dist/solid-ui.js.map +0 -1
  489. package/dist/v2/components/actions/button/Button.d.ts +0 -97
  490. package/dist/v2/components/actions/button/Button.d.ts.map +0 -1
  491. package/dist/v2/components/actions/button/Button.test.d.ts +0 -1
  492. package/dist/v2/components/actions/button/Button.test.d.ts.map +0 -1
  493. package/dist/v2/components/actions/button/index.d.ts +0 -8
  494. package/dist/v2/components/actions/button/index.d.ts.map +0 -1
  495. package/dist/v2/components/auth/loginButton/LoginButton.cjs.js +0 -414
  496. package/dist/v2/components/auth/loginButton/LoginButton.cjs.js.map +0 -1
  497. package/dist/v2/components/auth/loginButton/LoginButton.esm.js +0 -519
  498. package/dist/v2/components/auth/loginButton/LoginButton.esm.js.map +0 -1
  499. package/dist/v2/components/auth/loginButton/downArrow.cjs.js +0 -9
  500. package/dist/v2/components/auth/loginButton/downArrow.cjs.js.map +0 -1
  501. package/dist/v2/components/auth/loginButton/downArrow.esm.js +0 -14
  502. package/dist/v2/components/auth/loginButton/downArrow.esm.js.map +0 -1
  503. package/dist/v2/components/auth/loginButton/index.cjs.js +0 -2
  504. package/dist/v2/components/auth/loginButton/index.cjs.js.map +0 -1
  505. package/dist/v2/components/auth/loginButton/index.esm.js +0 -7
  506. package/dist/v2/components/auth/loginButton/index.esm.js.map +0 -1
  507. package/dist/v2/components/auth/signupButton/SignupButton.cjs.js +0 -59
  508. package/dist/v2/components/auth/signupButton/SignupButton.cjs.js.map +0 -1
  509. package/dist/v2/components/auth/signupButton/SignupButton.esm.js +0 -98
  510. package/dist/v2/components/auth/signupButton/SignupButton.esm.js.map +0 -1
  511. package/dist/v2/components/auth/signupButton/index.cjs.js +0 -2
  512. package/dist/v2/components/auth/signupButton/index.cjs.js.map +0 -1
  513. package/dist/v2/components/auth/signupButton/index.esm.js +0 -7
  514. package/dist/v2/components/auth/signupButton/index.esm.js.map +0 -1
  515. package/dist/v2/components/forms/combobox/Combobox.d.ts +0 -82
  516. package/dist/v2/components/forms/combobox/Combobox.d.ts.map +0 -1
  517. package/dist/v2/components/forms/combobox/Combobox.test.d.ts +0 -1
  518. package/dist/v2/components/forms/combobox/Combobox.test.d.ts.map +0 -1
  519. package/dist/v2/components/forms/combobox/comboboxTypes.d.ts +0 -6
  520. package/dist/v2/components/forms/combobox/comboboxTypes.d.ts.map +0 -1
  521. package/dist/v2/components/forms/combobox/index.d.ts +0 -3
  522. package/dist/v2/components/forms/combobox/index.d.ts.map +0 -1
  523. package/dist/v2/components/forms/select/Select.d.ts +0 -68
  524. package/dist/v2/components/forms/select/Select.d.ts.map +0 -1
  525. package/dist/v2/components/forms/select/Select.test.d.ts +0 -1
  526. package/dist/v2/components/forms/select/Select.test.d.ts.map +0 -1
  527. package/dist/v2/components/forms/select/index.d.ts +0 -3
  528. package/dist/v2/components/forms/select/index.d.ts.map +0 -1
  529. package/dist/v2/components/forms/shared/downArrow.d.ts +0 -2
  530. package/dist/v2/components/forms/shared/downArrow.d.ts.map +0 -1
  531. package/dist/v2/components/forms/shared/keyboard.d.ts +0 -7
  532. package/dist/v2/components/forms/shared/keyboard.d.ts.map +0 -1
  533. package/dist/v2/components/forms/shared/listboxStyles.d.ts +0 -2
  534. package/dist/v2/components/forms/shared/listboxStyles.d.ts.map +0 -1
  535. package/dist/v2/components/forms/shared/listboxTemplate.d.ts +0 -11
  536. package/dist/v2/components/forms/shared/listboxTemplate.d.ts.map +0 -1
  537. package/dist/v2/components/forms/shared/optionTypes.d.ts +0 -6
  538. package/dist/v2/components/forms/shared/optionTypes.d.ts.map +0 -1
  539. package/dist/v2/components/layout/header/Header.cjs.js +0 -625
  540. package/dist/v2/components/layout/header/Header.cjs.js.map +0 -1
  541. package/dist/v2/components/layout/header/Header.d.ts +0 -160
  542. package/dist/v2/components/layout/header/Header.d.ts.map +0 -1
  543. package/dist/v2/components/layout/header/Header.esm.js +0 -873
  544. package/dist/v2/components/layout/header/Header.esm.js.map +0 -1
  545. package/dist/v2/components/layout/header/header.test.d.ts +0 -1
  546. package/dist/v2/components/layout/header/header.test.d.ts.map +0 -1
  547. package/dist/v2/components/layout/header/index.cjs.js +0 -2
  548. package/dist/v2/components/layout/header/index.cjs.js.map +0 -1
  549. package/dist/v2/components/layout/header/index.d.ts +0 -4
  550. package/dist/v2/components/layout/header/index.d.ts.map +0 -1
  551. package/dist/v2/components/layout/header/index.esm.js +0 -7
  552. package/dist/v2/components/layout/header/index.esm.js.map +0 -1
@@ -0,0 +1,3 @@
1
+ var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 322"><g fill="none"><path fill="#fff" d="m87.973 282.353-60.732-105.33a31.6 31.6 0 0 1 0-31.538L87.973 40.233c5.646-9.784 16.08-15.795 27.321-15.795H236.68c11.266 0 21.727 6.011 27.321 15.795l60.758 105.304a31.6 31.6 0 0 1 0 31.537l-60.732 105.33c-5.646 9.784-16.08 15.795-27.321 15.795H115.372a31.85 31.85 0 0 1-27.4-15.846"/><path fill="#7c4dff" d="m93.151 275.197-57.115-99.06c-5.308-9.185-5.308-20.504 0-29.663l57.115-99.086a29.74 29.74 0 0 1 25.734-14.857h114.23c10.59 0 20.426 5.646 25.734 14.857l57.167 99.034c5.308 9.185 5.308 20.504 0 29.663l-57.141 99.138a29.74 29.74 0 0 1-25.734 14.858H118.937a29.79 29.79 0 0 1-25.786-14.884"/><path fill="#f7f7f7" d="M118.469 142.233h117.534a2.65 2.65 0 0 0 2.654-2.654v-22.04c0-14.65-11.891-26.54-26.54-26.54h-70.568c-20.53-.026-37.157 16.6-37.157 37.13-.026 7.833 6.27 14.104 14.077 14.104m11.527 97.368h70.229c21.207 0 38.432-17.225 38.432-38.432 0-7.078-5.724-12.828-12.828-12.828H106.942a2.537 2.537 0 0 0-2.55 2.55v23.054c-.026 14.181 11.475 25.656 25.604 25.656"/><path fill="#f7f7f7" d="m109.596 139.319 87.663 87.662c5.802 5.803 15.196 5.803 20.998 0l15.196-15.196c5.803-5.802 5.803-15.196 0-20.998l-87.637-87.663c-5.802-5.802-15.196-5.802-20.998 0l-15.196 15.196c-5.855 5.803-5.855 15.222-.026 20.999"/><path fill="#444" d="m198.69 228.464-51.495-40.123h11.397zm-54.33-126.797 40.565 40.566h13.765z" opacity=".3"/></g><script/></svg>
2
+ `}};customElements.get(`icon-app-solid-emblem`)||customElements.define(`icon-app-solid-emblem`,e),exports.default=e;
3
+ //# sourceMappingURL=solid-emblem.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-emblem.cjs.js","names":[],"sources":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ //#region ~icons/app/solid-emblem
2
+ var e = class extends HTMLElement {
3
+ constructor() {
4
+ super(), this.attachShadow({ mode: "open" }).innerHTML = "<style>:host { display: inline-flex; }</style><svg width=\"100%\" height=\"100%\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 352 322\"><g fill=\"none\"><path fill=\"#fff\" d=\"m87.973 282.353-60.732-105.33a31.6 31.6 0 0 1 0-31.538L87.973 40.233c5.646-9.784 16.08-15.795 27.321-15.795H236.68c11.266 0 21.727 6.011 27.321 15.795l60.758 105.304a31.6 31.6 0 0 1 0 31.537l-60.732 105.33c-5.646 9.784-16.08 15.795-27.321 15.795H115.372a31.85 31.85 0 0 1-27.4-15.846\"/><path fill=\"#7c4dff\" d=\"m93.151 275.197-57.115-99.06c-5.308-9.185-5.308-20.504 0-29.663l57.115-99.086a29.74 29.74 0 0 1 25.734-14.857h114.23c10.59 0 20.426 5.646 25.734 14.857l57.167 99.034c5.308 9.185 5.308 20.504 0 29.663l-57.141 99.138a29.74 29.74 0 0 1-25.734 14.858H118.937a29.79 29.79 0 0 1-25.786-14.884\"/><path fill=\"#f7f7f7\" d=\"M118.469 142.233h117.534a2.65 2.65 0 0 0 2.654-2.654v-22.04c0-14.65-11.891-26.54-26.54-26.54h-70.568c-20.53-.026-37.157 16.6-37.157 37.13-.026 7.833 6.27 14.104 14.077 14.104m11.527 97.368h70.229c21.207 0 38.432-17.225 38.432-38.432 0-7.078-5.724-12.828-12.828-12.828H106.942a2.537 2.537 0 0 0-2.55 2.55v23.054c-.026 14.181 11.475 25.656 25.604 25.656\"/><path fill=\"#f7f7f7\" d=\"m109.596 139.319 87.663 87.662c5.802 5.803 15.196 5.803 20.998 0l15.196-15.196c5.803-5.802 5.803-15.196 0-20.998l-87.637-87.663c-5.802-5.802-15.196-5.802-20.998 0l-15.196 15.196c-5.855 5.803-5.855 15.222-.026 20.999\"/><path fill=\"#444\" d=\"m198.69 228.464-51.495-40.123h11.397zm-54.33-126.797 40.565 40.566h13.765z\" opacity=\".3\"/></g><script/></svg>\n";
5
+ }
6
+ };
7
+ customElements.get("icon-app-solid-emblem") || customElements.define("icon-app-solid-emblem", e);
8
+ //#endregion
9
+ export { e as default };
10
+
11
+ //# sourceMappingURL=solid-emblem.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"solid-emblem.esm.js","names":[],"sources":[],"mappings":""}
@@ -1,2 +1,2 @@
1
- var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></svg>`}};customElements.get(`icon-lucide-chevron-down`)||customElements.define(`icon-lucide-chevron-down`,e);
1
+ var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m6 9l6 6l6-6"/></svg>`}};customElements.get(`icon-lucide-chevron-down`)||customElements.define(`icon-lucide-chevron-down`,e),exports.default=e;
2
2
  //# sourceMappingURL=chevron-down.cjs.js.map
@@ -6,5 +6,6 @@ var e = class extends HTMLElement {
6
6
  };
7
7
  customElements.get("icon-lucide-chevron-down") || customElements.define("icon-lucide-chevron-down", e);
8
8
  //#endregion
9
+ export { e as default };
9
10
 
10
11
  //# sourceMappingURL=chevron-down.esm.js.map
@@ -1,2 +1,2 @@
1
- var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="10" r="3"/><path d="M7 20.662V19a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v1.662"/></g></svg>`}};customElements.get(`icon-lucide-circle-user`)||customElements.define(`icon-lucide-circle-user`,e);
1
+ var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><circle cx="12" cy="12" r="10"/><circle cx="12" cy="10" r="3"/><path d="M7 20.662V19a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v1.662"/></g></svg>`}};customElements.get(`icon-lucide-circle-user`)||customElements.define(`icon-lucide-circle-user`,e),exports.default=e;
2
2
  //# sourceMappingURL=circle-user.cjs.js.map
@@ -6,5 +6,6 @@ var e = class extends HTMLElement {
6
6
  };
7
7
  customElements.get("icon-lucide-circle-user") || customElements.define("icon-lucide-circle-user", e);
8
8
  //#endregion
9
+ export { e as default };
9
10
 
10
11
  //# sourceMappingURL=circle-user.esm.js.map
@@ -1,2 +1,2 @@
1
- var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m10 17l5-5l-5-5m5 5H3m12-9h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"/></svg>`}};customElements.get(`icon-lucide-log-in`)||customElements.define(`icon-lucide-log-in`,e);
1
+ var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m10 17l5-5l-5-5m5 5H3m12-9h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4"/></svg>`}};customElements.get(`icon-lucide-log-in`)||customElements.define(`icon-lucide-log-in`,e),exports.default=e;
2
2
  //# sourceMappingURL=log-in.cjs.js.map
@@ -6,5 +6,6 @@ var e = class extends HTMLElement {
6
6
  };
7
7
  customElements.get("icon-lucide-log-in") || customElements.define("icon-lucide-log-in", e);
8
8
  //#endregion
9
+ export { e as default };
9
10
 
10
11
  //# sourceMappingURL=log-in.esm.js.map
@@ -1,2 +1,2 @@
1
- var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m16 17l5-5l-5-5m5 5H9m0 9H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/></svg>`}};customElements.get(`icon-lucide-log-out`)||customElements.define(`icon-lucide-log-out`,e);
1
+ var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m16 17l5-5l-5-5m5 5H9m0 9H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"/></svg>`}};customElements.get(`icon-lucide-log-out`)||customElements.define(`icon-lucide-log-out`,e),exports.default=e;
2
2
  //# sourceMappingURL=log-out.cjs.js.map
@@ -6,5 +6,6 @@ var e = class extends HTMLElement {
6
6
  };
7
7
  customElements.get("icon-lucide-log-out") || customElements.define("icon-lucide-log-out", e);
8
8
  //#endregion
9
+ export { e as default };
9
10
 
10
11
  //# sourceMappingURL=log-out.esm.js.map
@@ -1,2 +1,2 @@
1
- var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></g></svg>`}};customElements.get(`icon-lucide-user`)||customElements.define(`icon-lucide-user`,e);
1
+ var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"><path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/></g></svg>`}};customElements.get(`icon-lucide-user`)||customElements.define(`icon-lucide-user`,e),exports.default=e;
2
2
  //# sourceMappingURL=user.cjs.js.map
@@ -6,5 +6,6 @@ var e = class extends HTMLElement {
6
6
  };
7
7
  customElements.get("icon-lucide-user") || customElements.define("icon-lucide-user", e);
8
8
  //#endregion
9
+ export { e as default };
9
10
 
10
11
  //# sourceMappingURL=user.esm.js.map
@@ -1,2 +1,2 @@
1
- var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M18 6L6 18M6 6l12 12"/></svg>`}};customElements.get(`icon-lucide-x`)||customElements.define(`icon-lucide-x`,e);
1
+ var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M18 6L6 18M6 6l12 12"/></svg>`}};customElements.get(`icon-lucide-x`)||customElements.define(`icon-lucide-x`,e),exports.default=e;
2
2
  //# sourceMappingURL=x.cjs.js.map
@@ -6,5 +6,6 @@ var e = class extends HTMLElement {
6
6
  };
7
7
  customElements.get("icon-lucide-x") || customElements.define("icon-lucide-x", e);
8
8
  //#endregion
9
+ export { e as default };
9
10
 
10
11
  //# sourceMappingURL=x.esm.js.map
@@ -1,2 +1,2 @@
1
- var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><path fill="currentColor" d="M12,4a8,8,0,0,1,7.89,6.7A1.53,1.53,0,0,0,21.38,12h0a1.5,1.5,0,0,0,1.48-1.75,11,11,0,0,0-21.72,0A1.5,1.5,0,0,0,2.62,12h0a1.53,1.53,0,0,0,1.49-1.3A8,8,0,0,1,12,4Z"><animateTransform attributeName="transform" dur="0.75s" repeatCount="indefinite" type="rotate" values="0 12 12;360 12 12"/></path></svg>`}};customElements.get(`icon-svg-spinners-180-ring`)||customElements.define(`icon-svg-spinners-180-ring`,e);
1
+ var e=class extends HTMLElement{constructor(){super(),this.attachShadow({mode:`open`}).innerHTML=`<style>:host { display: inline-flex; }</style><svg viewBox="0 0 24 24" width="100%" height="100%" ><path fill="currentColor" d="M12,4a8,8,0,0,1,7.89,6.7A1.53,1.53,0,0,0,21.38,12h0a1.5,1.5,0,0,0,1.48-1.75,11,11,0,0,0-21.72,0A1.5,1.5,0,0,0,2.62,12h0a1.53,1.53,0,0,0,1.49-1.3A8,8,0,0,1,12,4Z"><animateTransform attributeName="transform" dur="0.75s" repeatCount="indefinite" type="rotate" values="0 12 12;360 12 12"/></path></svg>`}};customElements.get(`icon-svg-spinners-180-ring`)||customElements.define(`icon-svg-spinners-180-ring`,e),exports.default=e;
2
2
  //# sourceMappingURL=180-ring.cjs.js.map
@@ -6,5 +6,6 @@ var e = class extends HTMLElement {
6
6
  };
7
7
  customElements.get("icon-svg-spinners-180-ring") || customElements.define("icon-svg-spinners-180-ring", e);
8
8
  //#endregion
9
+ export { e as default };
9
10
 
10
11
  //# sourceMappingURL=180-ring.esm.js.map
@@ -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");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;
2
2
  //# sourceMappingURL=access-controller.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"access-controller.cjs.js","names":[],"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":[],"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 +1 @@
1
- {"version":3,"file":"access-controller.esm.js","names":[],"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.esm.js","names":[],"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 +1 @@
1
- {"version":3,"file":"access-groups.cjs.js","names":[],"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":[],"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 +1 @@
1
- {"version":3,"file":"access-groups.esm.js","names":[],"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.esm.js","names":[],"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,2 +1,2 @@
1
- const e=require("../lib/ns.cjs.js"),t=require("../utils/label.cjs.js");require("../utils/index.cjs.js");const n=require("../lib/debug.cjs.js"),r=require("./acl.cjs.js"),i=require("../lib/style.cjs.js"),a=require("./access-controller.cjs.js");var o=window,s=Symbol(`prevent double triggering of drop event`);function c(e){if(n.log(`preventBrowserDropEvents called.`),o!==void 0){if(o[s])return;o[s]=!0}e.addEventListener(`drop`,u,!1),e.addEventListener(`dragenter`,l,!1),e.addEventListener(`dragover`,l,!1)}function l(e){e.stopPropagation(),e.preventDefault()}function u(e){e.dataTransfer.files.length>0&&(o.confirm(`Are you sure you want to drop this file here? (Cancel opens it in a new tab)`)||(e.stopPropagation(),e.preventDefault(),n.log(`@@@@ document-level DROP suppressed: `+e.dataTransfer.dropEffect)))}function d(e){let t=e.uri;t.slice(-1)===`/`&&(t=t.slice(0,-1));let n=t.lastIndexOf(`/`);return n>=0&&(t=t.slice(n+1)),t||`/`}function f(e,n,r,a){let o=n.dom,s=e.doc(),c=o.createElement(`div`);c.setAttribute(`style`,i.style.aclControlBoxContainer);let l=c.appendChild(o.createElement(`h1`));l.textContent=`Sharing for ${r} ${t.label(e)}`,l.setAttribute(`style`,i.style.aclControlBoxHeader);let u=c.appendChild(o.createElement(`div`));u.setAttribute(`style`,i.style.aclControlBoxStatus);try{p(s,a,e,r,n,o,u).then(e=>c.appendChild(e.render()))}catch(e){u.innerText=e}return c}async function p(e,t,i,o,s,c,l){return new Promise((u,d)=>r.getACLorDefault(e,async(e,f,p,_,v,y)=>{if(!e)return d(Error(`Error reading ${f?``:` default `}ACL. status ${p}: ${_}`));let b=m(p),x=h(p,_,t)||g(p);if(!x&&b)try{return u(S(await r.getProspectiveHolder(b)))}catch(e){n.warn(e)}return u(S());function S(e){return new a.AccessController(i,o,s,l,x,p,_,v,y,e,t,c)}}))}function m(e){let t=e.uri.split(`#`)[0],n=t.slice(0,-1).lastIndexOf(`/`),r=t.indexOf(`//`);return r>=0&&n<r+2||n<0?null:t.slice(0,n+1)}function h(t,n,r){return r.holds(t,e.default.rdf(`type`),e.default.space(`Storage`),n)}function g(e){return e.uri===e.site().uri}exports.ACLControlBox5=f,exports.preventBrowserDropEvents=c,exports.shortNameForFolder=d;
1
+ const e=require("../lib/ns.cjs.js"),t=require("../utils/label.cjs.js");require("../utils/index.cjs.js");const n=require("../lib/debug.cjs.js"),r=require("./acl.cjs.js"),i=require("../lib/style.cjs.js"),a=require("./access-controller.cjs.js");var o=window,s=Symbol(`prevent double triggering of drop event`);function c(e){if(n.log(`preventBrowserDropEvents called.`),o!==void 0){if(o[s])return;o[s]=!0}e.addEventListener(`drop`,u,!1),e.addEventListener(`dragenter`,l,!1),e.addEventListener(`dragover`,l,!1)}function l(e){e.stopPropagation(),e.preventDefault()}function u(e){e.dataTransfer.files.length>0&&(o.confirm(`Are you sure you want to drop this file here? (Cancel opens it in a new tab)`)||(e.stopPropagation(),e.preventDefault(),n.log(`@@@@ document-level DROP suppressed: `+e.dataTransfer.dropEffect)))}function d(e){let t=e.uri;t.slice(-1)===`/`&&(t=t.slice(0,-1));let n=t.lastIndexOf(`/`);return n>=0&&(t=t.slice(n+1)),t||`/`}function f(e,n,r,a){let o=n.dom,s=e.doc(),c=o.createElement(`div`);c.setAttribute(`style`,i.style.aclControlBoxContainer);let l=c.appendChild(o.createElement(`h1`));l.textContent=`Sharing for ${r} ${t.label(e)}`,l.setAttribute(`style`,i.style.aclControlBoxHeader);let u=c.appendChild(o.createElement(`div`));u.setAttribute(`style`,i.style.aclControlBoxStatus);try{p(s,a,e,r,n,o,u).then(e=>c.appendChild(e.render()))}catch(e){u.innerText=e}return c}async function p(e,t,i,o,s,c,l){return new Promise((u,d)=>r.getACLorDefault(e,async(e,f,p,_,v,y)=>{if(!e)return d(Error(`Error reading ${f?``:` default `}ACL. status ${p}: ${_}`));let b=m(p),x=h(p,_,t)||g(p);if(!x&&b)try{return u(S(await r.getProspectiveHolder(b)))}catch(e){n.warn(e)}return u(S());function S(e){return new a.AccessController(i,o,s,l,x,p,_,v,y,e,t,c)}}))}function m(e){let t=e.uri.split(`#`)[0],n=t.slice(0,-1).lastIndexOf(`/`),r=t.indexOf(`//`);return r>=0&&n<r+2||n<0?null:t.slice(0,n+1)}function h(t,n,r){return r.holds(t,e.default.rdf(`type`),e.default.space(`Storage`),n)}function g(e){return e.uri===e.site().uri}exports.ACLControlBox5=f,exports.handleDrop=u,exports.preventBrowserDropEvents=c,exports.preventDrag=l,exports.shortNameForFolder=d;
2
2
  //# sourceMappingURL=acl-control.cjs.js.map