solid-panes 5.0.0-0 → 5.0.0-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/dist/RDFXMLPane.d.ts.map +1 -1
  2. package/dist/RDFXMLPane2.cjs.js +1 -2
  3. package/dist/RDFXMLPane2.cjs.js.map +1 -1
  4. package/dist/RDFXMLPane2.esm.js +15 -42
  5. package/dist/RDFXMLPane2.esm.js.map +1 -1
  6. package/dist/_virtual/~icons/lucide/folder.cjs.js +2 -0
  7. package/dist/_virtual/~icons/lucide/folder.cjs.js.map +1 -0
  8. package/dist/_virtual/~icons/lucide/{trash-2.esm.js → folder.esm.js} +4 -4
  9. package/dist/_virtual/~icons/lucide/folder.esm.js.map +1 -0
  10. package/dist/_virtual/~icons/lucide/user-round-cog.cjs.js +2 -0
  11. package/dist/_virtual/~icons/lucide/user-round-cog.cjs.js.map +1 -0
  12. package/dist/_virtual/~icons/lucide/user-round-cog.esm.js +11 -0
  13. package/dist/_virtual/~icons/lucide/user-round-cog.esm.js.map +1 -0
  14. package/dist/components/editor-card/EditorCard.cjs.js +6 -0
  15. package/dist/components/editor-card/EditorCard.cjs.js.map +1 -0
  16. package/dist/components/editor-card/EditorCard.d.ts +16 -0
  17. package/dist/components/editor-card/EditorCard.d.ts.map +1 -0
  18. package/dist/components/editor-card/EditorCard.esm.js +268 -0
  19. package/dist/components/editor-card/EditorCard.esm.js.map +1 -0
  20. package/dist/components/editor-card/EditorCard.styles.cjs.js +2 -0
  21. package/dist/components/editor-card/EditorCard.styles.cjs.js.map +1 -0
  22. package/dist/components/editor-card/EditorCard.styles.esm.js +7 -0
  23. package/dist/components/editor-card/EditorCard.styles.esm.js.map +1 -0
  24. package/dist/components/editor-card/index.cjs.js +1 -0
  25. package/dist/components/editor-card/index.d.ts +4 -0
  26. package/dist/components/editor-card/index.d.ts.map +1 -0
  27. package/dist/components/editor-card/index.esm.js +1 -0
  28. package/dist/components/file-explorer-header/FileExplorerHeader.cjs.js +2 -2
  29. package/dist/components/file-explorer-header/FileExplorerHeader.cjs.js.map +1 -1
  30. package/dist/components/file-explorer-header/FileExplorerHeader.d.ts +1 -2
  31. package/dist/components/file-explorer-header/FileExplorerHeader.d.ts.map +1 -1
  32. package/dist/components/file-explorer-header/FileExplorerHeader.esm.js +16 -16
  33. package/dist/components/file-explorer-header/FileExplorerHeader.esm.js.map +1 -1
  34. package/dist/components/file-explorer-header/FileExplorerHeader.styles.cjs.js +1 -1
  35. package/dist/components/file-explorer-header/FileExplorerHeader.styles.cjs.js.map +1 -1
  36. package/dist/components/file-explorer-header/FileExplorerHeader.styles.esm.js +1 -1
  37. package/dist/components/file-explorer-header/FileExplorerHeader.styles.esm.js.map +1 -1
  38. package/dist/components/file-explorer-header/FileExplorerHeaderControls.cjs.js +24 -14
  39. package/dist/components/file-explorer-header/FileExplorerHeaderControls.cjs.js.map +1 -1
  40. package/dist/components/file-explorer-header/FileExplorerHeaderControls.d.ts +7 -1
  41. package/dist/components/file-explorer-header/FileExplorerHeaderControls.d.ts.map +1 -1
  42. package/dist/components/file-explorer-header/FileExplorerHeaderControls.esm.js +94 -66
  43. package/dist/components/file-explorer-header/FileExplorerHeaderControls.esm.js.map +1 -1
  44. package/dist/components/file-explorer-header/FileExplorerHeaderControls.styles.cjs.js +1 -1
  45. package/dist/components/file-explorer-header/FileExplorerHeaderControls.styles.cjs.js.map +1 -1
  46. package/dist/components/file-explorer-header/FileExplorerHeaderControls.styles.esm.js +1 -1
  47. package/dist/components/file-explorer-header/FileExplorerHeaderControls.styles.esm.js.map +1 -1
  48. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.cjs.js +22 -7
  49. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.cjs.js.map +1 -1
  50. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.d.ts +3 -2
  51. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.d.ts.map +1 -1
  52. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.esm.js +90 -65
  53. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.esm.js.map +1 -1
  54. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.styles.cjs.js +1 -1
  55. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.styles.cjs.js.map +1 -1
  56. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.styles.esm.js +1 -1
  57. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.styles.esm.js.map +1 -1
  58. package/dist/components/file-explorer-header/FileExplorerProvider.cjs.js +4 -4
  59. package/dist/components/file-explorer-header/FileExplorerProvider.cjs.js.map +1 -1
  60. package/dist/components/file-explorer-header/FileExplorerProvider.d.ts +1 -1
  61. package/dist/components/file-explorer-header/FileExplorerProvider.d.ts.map +1 -1
  62. package/dist/components/file-explorer-header/FileExplorerProvider.esm.js +17 -16
  63. package/dist/components/file-explorer-header/FileExplorerProvider.esm.js.map +1 -1
  64. package/dist/components/file-explorer-header/index.cjs.js +1 -0
  65. package/dist/components/file-explorer-header/index.d.ts +3 -0
  66. package/dist/components/file-explorer-header/index.d.ts.map +1 -0
  67. package/dist/components/file-explorer-header/index.esm.js +2 -0
  68. package/dist/components/file-explorer-header/types.d.ts +8 -0
  69. package/dist/components/file-explorer-header/types.d.ts.map +1 -1
  70. package/dist/components/header/Header.cjs.js +1 -1
  71. package/dist/components/header/Header.esm.js +4 -4
  72. package/dist/components/header/Header.styles.cjs.js +1 -1
  73. package/dist/components/header/Header.styles.cjs.js.map +1 -1
  74. package/dist/components/header/Header.styles.esm.js +1 -1
  75. package/dist/components/header/Header.styles.esm.js.map +1 -1
  76. package/dist/components/navbar/Navbar.cjs.js +2 -2
  77. package/dist/components/navbar/Navbar.esm.js +5 -5
  78. package/dist/components/resource-actions-menu/ResourceActionsMenu.cjs.js +23 -9
  79. package/dist/components/resource-actions-menu/ResourceActionsMenu.cjs.js.map +1 -1
  80. package/dist/components/resource-actions-menu/ResourceActionsMenu.d.ts +7 -4
  81. package/dist/components/resource-actions-menu/ResourceActionsMenu.d.ts.map +1 -1
  82. package/dist/components/resource-actions-menu/ResourceActionsMenu.esm.js +146 -84
  83. package/dist/components/resource-actions-menu/ResourceActionsMenu.esm.js.map +1 -1
  84. package/dist/components/resource-actions-menu/ResourceActionsMenu.styles.cjs.js +2 -0
  85. package/dist/components/resource-actions-menu/ResourceActionsMenu.styles.cjs.js.map +1 -0
  86. package/dist/components/resource-actions-menu/ResourceActionsMenu.styles.esm.js +7 -0
  87. package/dist/components/resource-actions-menu/ResourceActionsMenu.styles.esm.js.map +1 -0
  88. package/dist/dataContentPane2.cjs.js +1 -1
  89. package/dist/dataContentPane2.esm.js +1 -1
  90. package/dist/defaultPane2.cjs.js +1 -1
  91. package/dist/defaultPane2.cjs.js.map +1 -1
  92. package/dist/defaultPane2.esm.js +2 -2
  93. package/dist/defaultPane2.esm.js.map +1 -1
  94. package/dist/home/homePane.cjs.js +1 -1
  95. package/dist/home/homePane.cjs.js.map +1 -1
  96. package/dist/home/homePane.esm.js +1 -1
  97. package/dist/home/homePane.esm.js.map +1 -1
  98. package/dist/humanReadablePane.d.ts +1 -1
  99. package/dist/humanReadablePane.d.ts.map +1 -1
  100. package/dist/humanReadablePane2.cjs.js +1 -1
  101. package/dist/humanReadablePane2.cjs.js.map +1 -1
  102. package/dist/humanReadablePane2.esm.js +2 -2
  103. package/dist/humanReadablePane2.esm.js.map +1 -1
  104. package/dist/imagePane2.cjs.js +1 -1
  105. package/dist/imagePane2.cjs.js.map +1 -1
  106. package/dist/imagePane2.esm.js +1 -1
  107. package/dist/imagePane2.esm.js.map +1 -1
  108. package/dist/internal/internalPane2.cjs.js +1 -1
  109. package/dist/internal/internalPane2.cjs.js.map +1 -1
  110. package/dist/internal/internalPane2.esm.js +2 -2
  111. package/dist/internal/internalPane2.esm.js.map +1 -1
  112. package/dist/n3Pane.d.ts.map +1 -1
  113. package/dist/n3Pane2.cjs.js +1 -2
  114. package/dist/n3Pane2.cjs.js.map +1 -1
  115. package/dist/n3Pane2.esm.js +10 -34
  116. package/dist/n3Pane2.esm.js.map +1 -1
  117. package/dist/outline/manager2.cjs.js +1 -1
  118. package/dist/outline/manager2.cjs.js.map +1 -1
  119. package/dist/outline/manager2.esm.js +8 -11
  120. package/dist/outline/manager2.esm.js.map +1 -1
  121. package/dist/outline/queryByExample.cjs.js +1 -1
  122. package/dist/outline/queryByExample.cjs.js.map +1 -1
  123. package/dist/outline/queryByExample.esm.js +4 -4
  124. package/dist/outline/queryByExample.esm.js.map +1 -1
  125. package/dist/outline/userInput.cjs.js +1 -1
  126. package/dist/outline/userInput.cjs.js.map +1 -1
  127. package/dist/outline/userInput.esm.js +2 -2
  128. package/dist/outline/userInput.esm.js.map +1 -1
  129. package/dist/pad/padPane2.cjs.js +1 -1
  130. package/dist/pad/padPane2.cjs.js.map +1 -1
  131. package/dist/pad/padPane2.esm.js +3 -3
  132. package/dist/pad/padPane2.esm.js.map +1 -1
  133. package/dist/playlist/playlistPane.cjs.js +1 -1
  134. package/dist/playlist/playlistPane.cjs.js.map +1 -1
  135. package/dist/playlist/playlistPane.esm.js +1 -1
  136. package/dist/playlist/playlistPane.esm.js.map +1 -1
  137. package/dist/sharing/sharingPane.cjs.js +1 -1
  138. package/dist/sharing/sharingPane.cjs.js.map +1 -1
  139. package/dist/sharing/sharingPane.esm.js +1 -1
  140. package/dist/sharing/sharingPane.esm.js.map +1 -1
  141. package/dist/social/socialPane2.cjs.js +2 -2
  142. package/dist/social/socialPane2.cjs.js.map +1 -1
  143. package/dist/social/socialPane2.esm.js +3 -3
  144. package/dist/social/socialPane2.esm.js.map +1 -1
  145. package/dist/social/triage.cjs.js +1 -1
  146. package/dist/social/triage.cjs.js.map +1 -1
  147. package/dist/social/triage.esm.js +1 -1
  148. package/dist/social/triage.esm.js.map +1 -1
  149. package/dist/transaction/period.cjs.js +1 -1
  150. package/dist/transaction/period.cjs.js.map +1 -1
  151. package/dist/transaction/period.esm.js +1 -1
  152. package/dist/transaction/period.esm.js.map +1 -1
  153. package/dist/utils/podUtils.cjs.js +1 -1
  154. package/dist/utils/podUtils.cjs.js.map +1 -1
  155. package/dist/utils/podUtils.d.ts +6 -1
  156. package/dist/utils/podUtils.d.ts.map +1 -1
  157. package/dist/utils/podUtils.esm.js +93 -22
  158. package/dist/utils/podUtils.esm.js.map +1 -1
  159. package/dist/versionInfo.cjs.js +1 -1
  160. package/dist/versionInfo.cjs.js.map +1 -1
  161. package/dist/versionInfo.esm.js +3 -3
  162. package/dist/versionInfo.esm.js.map +1 -1
  163. package/package.json +5 -5
  164. package/dist/_virtual/~icons/lucide/trash-2.cjs.js +0 -2
  165. package/dist/_virtual/~icons/lucide/trash-2.cjs.js.map +0 -1
  166. package/dist/_virtual/~icons/lucide/trash-2.esm.js.map +0 -1
  167. package/dist/components/file-explorer-header/helper.cjs.js +0 -2
  168. package/dist/components/file-explorer-header/helper.cjs.js.map +0 -1
  169. package/dist/components/file-explorer-header/helper.d.ts +0 -15
  170. package/dist/components/file-explorer-header/helper.d.ts.map +0 -1
  171. package/dist/components/file-explorer-header/helper.esm.js +0 -64
  172. package/dist/components/file-explorer-header/helper.esm.js.map +0 -1
  173. package/dist/components/resource-actions-menu/DeleteResourceDialog.cjs.js +0 -16
  174. package/dist/components/resource-actions-menu/DeleteResourceDialog.cjs.js.map +0 -1
  175. package/dist/components/resource-actions-menu/DeleteResourceDialog.esm.js +0 -215
  176. package/dist/components/resource-actions-menu/DeleteResourceDialog.esm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"socialPane2.esm.js","names":[],"sources":["../../src/social/socialPane.ts"],"sourcesContent":["/* Social Pane\n **\n ** This outline pane provides social network functions\n ** Using for example the FOAF ontology.\n ** Goal: A *distributed* version of facebook, advogato, etc etc\n ** - Similarly easy user interface, but data storage distributed\n ** - Read and write both user-private (address book) and public data clearly\n ** -- todo: use common code to get username and load profile and set 'me'\n */\n\nimport './socialPane.css'\nimport { icons, utils, ns, log, widgets } from 'solid-ui'\nimport { authn } from 'solid-logic'\nimport { LiveStore, NamedNode, Statement } from 'rdflib'\nimport { DataBrowserContext } from 'pane-registry'\nimport { locationIcon } from './icons'\nimport {\n createAllFriendsSection,\n createHeaderSection,\n FriendRowRenderers,\n createMutualSection,\n createRequestsSection,\n HeaderControls,\n SocialHeaderElement\n} from './socialSections'\nimport type { ViewerMode } from './socialSections'\nimport { FriendshipTriage, loadFriendshipTriage, triageFriends } from './triage'\n\nfunction applyEnvironmentAttributes (\n element: HTMLElement,\n context: DataBrowserContext\n): void {\n const layout = context.environment?.layout ?? 'desktop'\n const theme = context.environment?.theme ?? 'light'\n const inputMode = context.environment?.inputMode ?? 'pointer'\n\n element.classList.add('social-pane-host')\n element.dataset.layout = layout\n element.dataset.theme = theme\n element.dataset.inputMode = inputMode\n}\n\nexport const socialPane = {\n icon: icons.originalIconBase + 'foaf/foafTiny.gif',\n\n name: 'social',\n\n label: function (subject, context) {\n const kb = context.session.store\n const types = kb.findTypeURIs(subject)\n if (\n types[ns.foaf('Person').uri] ||\n types[ns.vcard('Individual').uri]\n ) {\n return 'Friends'\n }\n return null\n },\n global: false,\n\n render: function (s, context) {\n const dom = context.dom\n const common = function (x: NamedNode[], y: NamedNode[]) {\n // Find common members of two lists\n const both: NamedNode[] = []\n for (let i = 0; i < x.length; i++) {\n for (let j = 0; j < y.length; j++) {\n if (y[j].sameTerm(x[i])) {\n both.push(y[j])\n break\n }\n }\n }\n return both\n }\n\n const uniqueNodes = function (nodes: NamedNode[]) {\n const seen = new Set<string>()\n const unique: NamedNode[] = []\n for (const node of nodes) {\n if (!node?.value || seen.has(node.value)) continue\n seen.add(node.value)\n unique.push(node)\n }\n return unique\n }\n\n const link = function (contents: Node, uri: string | null | undefined) {\n if (!uri) return contents\n const a = dom.createElement('a')\n a.setAttribute('href', uri)\n a.appendChild(contents)\n return a\n }\n\n const text = function (str: string) {\n return dom.createTextNode(str)\n }\n\n let refreshRelationshipUi = function () {}\n\n const buildCheckboxForm = function (\n lab: string | Node,\n statement: Statement,\n state: boolean,\n options: { disabled?: boolean, disabledTitle?: string } = {}\n ) {\n const f = dom.createElement('form')\n const label = dom.createElement('label')\n const input = dom.createElement('input')\n const tx = dom.createElement('span')\n tx.className = 'question'\n if (typeof lab === 'string') {\n tx.textContent = lab\n } else {\n tx.appendChild(lab)\n }\n input.setAttribute('type', 'checkbox')\n if (options.disabled) {\n input.disabled = true\n if (options.disabledTitle) {\n input.title = options.disabledTitle\n input.setAttribute('aria-label', options.disabledTitle)\n }\n }\n label.appendChild(tx)\n label.appendChild(input)\n f.appendChild(label)\n const boxHandler = function (this: HTMLInputElement, _e: Event) {\n if (this.checked) {\n try {\n outliner.UserInput.sparqler.insert_statement(statement, function (\n uri,\n success,\n errorBody\n ) {\n tx.className = 'question'\n if (!success) {\n log.alert(\n 'Error occurs while inserting ' +\n statement +\n '\\n\\n' +\n errorBody\n )\n input.checked = false // rollback UI\n return\n }\n kb.add(\n statement.subject,\n statement.predicate,\n statement.object,\n statement.why\n )\n refreshRelationshipUi()\n })\n } catch (e) {\n log.error('Data write fails:' + e)\n log.alert('Data write fails:' + e)\n input.checked = false // rollback UI\n tx.className = 'question'\n }\n } else {\n try {\n outliner.UserInput.sparqler.delete_statement(statement, function (\n uri,\n success,\n errorBody\n ) {\n tx.className = 'question'\n if (!success) {\n log.alert(\n 'Error occurs while deleting ' +\n statement +\n '\\n\\n' +\n errorBody\n )\n input.checked = true // Rollback UI\n } else {\n kb.removeMany(\n statement.subject,\n statement.predicate,\n statement.object,\n statement.why\n )\n refreshRelationshipUi()\n }\n })\n } catch (e) {\n log.alert('Delete fails:' + e)\n input.checked = true // Rollback UI\n // return\n }\n }\n }\n input.checked = state\n input.addEventListener('click', boxHandler, false)\n return f\n }\n\n // ////////// Body of render():\n\n const outliner = context.getOutliner(dom)\n const kb = context.session.store\n const socialPane = dom.createElement('div')\n socialPane.classList.add('social-pane', 'flex-column', 'gap-xxs')\n applyEnvironmentAttributes(socialPane, context)\n const foaf = ns.foaf\n const vcard = ns.vcard\n const me = authn.currentUser()\n const meUri = me ? me.uri : null\n\n const thisIsYou = me && kb.sameThings(me, s)\n\n const knows = foaf('knows')\n // var givenName = kb.sym('http://www.w3.org/2000/10/swap/pim/contact#givenName')\n const familiar =\n kb.anyValue(s, foaf('givenname')) ||\n kb.anyValue(s, foaf('firstName')) ||\n kb.anyValue(s, foaf('nick')) ||\n kb.anyValue(s, foaf('name')) ||\n kb.anyValue(s, vcard('fn'))\n const friends = kb.each(s, knows)\n const uniqueFriends = uniqueNodes(friends as NamedNode[])\n const myFriends = me ? uniqueNodes(kb.each(me, foaf('knows')) as NamedNode[]) : []\n const mutualConnections = me && !thisIsYou\n ? uniqueNodes(common(uniqueFriends, myFriends)).filter(friend => !kb.sameThings(friend, me))\n : []\n const mutualFriendCount = me && !thisIsYou ? mutualConnections.length : null\n const viewerMode = getViewerMode(s, me)\n\n // Do I have a public profile document?\n let profile: NamedNode | null = null // This could be SPARQL { ?me foaf:primaryTopic [ a foaf:PersonalProfileDocument ] }\n let editable = false\n let incoming: boolean | NamedNode[] = false\n let outgoing: boolean | NamedNode[] = false\n\n const structure = socialPane.appendChild(dom.createElement('div'))\n structure.className = 'social-layout'\n const primary = structure.appendChild(dom.createElement('div'))\n primary.className = 'social-primary'\n\n const tabs = primary.appendChild(dom.createElement('div'))\n tabs.classList.add('social-primary__tabs', 'flex-center')\n tabs.setAttribute('role', 'tablist')\n tabs.setAttribute('aria-label', 'Social sections')\n\n const allFriendsTab = tabs.appendChild(dom.createElement('button'))\n allFriendsTab.className = 'social-primary__tab'\n allFriendsTab.type = 'button'\n allFriendsTab.id = 'social-tab-all-friends'\n allFriendsTab.textContent = 'All Friends'\n allFriendsTab.setAttribute('role', 'tab')\n allFriendsTab.setAttribute('aria-controls', 'social-panel-all-friends')\n allFriendsTab.setAttribute('aria-selected', 'true')\n allFriendsTab.tabIndex = 0\n\n const mutualTab = tabs.appendChild(dom.createElement('button'))\n mutualTab.className = 'social-primary__tab'\n mutualTab.type = 'button'\n mutualTab.id = 'social-tab-mutual'\n mutualTab.textContent = 'Mutual'\n mutualTab.setAttribute('role', 'tab')\n mutualTab.setAttribute('aria-controls', 'social-panel-mutual')\n mutualTab.setAttribute('aria-selected', 'false')\n mutualTab.tabIndex = -1\n\n if (me) {\n // The definition of FOAF personal profile document is ..\n const works = kb.each(undefined, foaf('primaryTopic'), me) // having me as primary topic\n let message = ''\n for (let i = 0; i < works.length; i++) {\n if (\n kb.whether(\n works[i],\n ns.rdf('type'),\n foaf('PersonalProfileDocument')\n )\n ) {\n const doc = works[i]\n editable = outliner.UserInput.sparqler.editable(doc.uri, kb)\n if (!editable) {\n message +=\n 'Your profile <' +\n utils.escapeForXML(doc.uri) +\n '> is not remotely editable.'\n } else {\n profile = doc\n break\n }\n }\n }\n\n /*\n if (!profile) {\n say(\n message + '\\nI couldn\\'t find your editable personal profile document.'\n )\n } else {\n say('Editing your profile ' + profile + '.')\n editable = outliner.UserInput.sparqler.editable(profile.uri, kb)\n }\n */\n\n if (thisIsYou) {\n // This is about me\n // pass... @@\n } else {\n // This is about someone else\n // My relationship with this person\n\n const cme = kb.canon(me)\n incoming = kb.whether(s, knows, cme)\n outgoing = false\n const outgoingSt = kb.statementsMatching(cme, knows, s)\n if (outgoingSt.length) {\n outgoing = true\n if (!profile) profile = outgoingSt[0].why\n }\n } // About someone else\n } // me is defined\n // End of you and s\n\n const shouldShowHeaderAddFriendAction = (mode: ViewerMode) => {\n return mode === 'authenticated' && !thisIsYou && !outgoing\n }\n\n const canEditOwnedProfile = viewerMode === 'owner' && editable\n const canManageRelationship = viewerMode === 'authenticated' && !thisIsYou && editable && Boolean(profile)\n const canModifyFriendsTab = canEditOwnedProfile\n\n let headerControls: HeaderControls = {\n canEdit: canEditOwnedProfile,\n viewerMode,\n showAddFriendAction: shouldShowHeaderAddFriendAction(viewerMode)\n }\n\n const header = createHeaderSection(context, s, headerControls, {\n friendCount: uniqueFriends.length,\n mutualFriendCount,\n onSelectFriends: function () {\n setActivePanel('all-friends')\n },\n onSelectMutual: typeof mutualFriendCount === 'number'\n ? function () {\n setActivePanel('mutual')\n }\n : undefined\n }, function () {\n return selectProfileData(context, s)\n })\n header.classList.add('social-pane__header-section', 'flex-column')\n socialPane.prepend(header)\n\n // div.appendChild(dom.createTextNode(plural(friends.length, 'acquaintance') +'. '))\n\n // ///////////////////////////////////////////// Main block\n //\n // Should: Find the intersection and difference sets\n\n const friendDetailsByUri = new Map<string, FriendDetails>()\n\n const hydrateFriendDetailsCache = function (friendNodes: NamedNode[]) {\n const nextCache = new Map<string, FriendDetails>()\n\n friendNodes.forEach(friendNode => {\n if (!friendNode?.value || friendNode.value === s.value) return\n nextCache.set(friendNode.value, toFriendDetails(kb, friendNode))\n })\n\n friendDetailsByUri.clear()\n nextCache.forEach((value, key) => {\n friendDetailsByUri.set(key, value)\n })\n }\n\n hydrateFriendDetailsCache(uniqueFriends)\n\n const renderSupportingInfo: FriendRowRenderers['renderSupportingInfo'] = function (target: NamedNode, renderDom: HTMLDocument) {\n const friend = friendDetailsByUri.get(target.value) || toFriendDetails(kb, target)\n friendDetailsByUri.set(target.value, friend)\n\n const container = renderDom.createElement('div')\n const jobAndOrganization = [friend.jobTitle, friend.organization].filter(Boolean).join(' | ')\n if (jobAndOrganization) {\n const jobLine = container.appendChild(renderDom.createElement('div'))\n jobLine.className = 'social-friend-job-org'\n jobLine.textContent = jobAndOrganization\n }\n\n if (friend.location) {\n const locationLine = container.appendChild(renderDom.createElement('div'))\n locationLine.className = 'social-friend-location'\n locationLine.innerHTML = `${locationIcon} ${friend.location}`\n }\n\n if (!container.childNodes.length) return null\n\n return container\n }\n\n const renderNameSuffix: FriendRowRenderers['renderNameSuffix'] = function (target: NamedNode, renderDom: HTMLDocument) {\n const friend = friendDetailsByUri.get(target.value) || toFriendDetails(kb, target)\n friendDetailsByUri.set(target.value, friend)\n const pronouns = friend.pronouns\n if (!pronouns) return null\n\n const suffix = renderDom.createElement('span')\n suffix.className = 'social-friend-pronouns'\n suffix.textContent = `(${pronouns})`\n return suffix\n }\n\n let mutualSection = me && !thisIsYou\n ? createMutualSection({\n dom,\n subject: s,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable: canManageRelationship,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n })\n : {\n section: dom.createElement('section'),\n content: dom.createElement('div'),\n refreshMutualFriends: function () {}\n }\n\n let mutualFriends = mutualSection.section\n let mutualContent = mutualSection.content\n if (!mutualFriends.className) {\n mutualFriends.className = 'social-pane__mutual-friends social-primary__panel'\n mutualFriends.id = 'social-panel-mutual'\n mutualFriends.setAttribute('role', 'tabpanel')\n mutualFriends.setAttribute('aria-labelledby', 'social-tab-mutual')\n mutualContent.className = 'social-main social-main--mutual'\n mutualFriends.appendChild(mutualContent)\n }\n primary.appendChild(mutualFriends)\n\n const allFriendsSection = createAllFriendsSection({\n dom,\n subject: s,\n profile: canModifyFriendsTab ? profile : null,\n editable: canModifyFriendsTab,\n renderSupportingInfo,\n renderNameSuffix\n })\n\n const allFriends = allFriendsSection.section\n const friendsList = allFriendsSection.friendsList\n primary.appendChild(allFriends)\n\n let requestsTriage: FriendshipTriage = triageFriends(kb, s)\n const requestsSection = createRequestsSection({\n dom,\n triage: requestsTriage,\n renderSupportingInfo,\n renderNameSuffix\n })\n const requestsPanel = requestsSection.section\n primary.appendChild(requestsPanel)\n\n const requestsTab = tabs.appendChild(dom.createElement('button'))\n requestsTab.className = 'social-primary__tab'\n requestsTab.type = 'button'\n requestsTab.id = 'social-tab-requests'\n requestsTab.textContent = 'Requests'\n requestsTab.setAttribute('role', 'tab')\n requestsTab.setAttribute('aria-controls', 'social-panel-requests')\n requestsTab.setAttribute('aria-selected', 'false')\n requestsTab.tabIndex = -1\n\n type SocialPanel = 'mutual' | 'all-friends' | 'requests'\n let activePanel: SocialPanel = 'all-friends'\n let showRequestsTab = viewerMode === 'owner'\n\n const setActivePanel = function (panel: SocialPanel) {\n activePanel = panel\n const showMutual = panel === 'mutual'\n const showAllFriends = panel === 'all-friends'\n const showRequests = showRequestsTab && panel === 'requests'\n mutualTab.classList.toggle('social-primary__tab--active', showMutual)\n mutualTab.setAttribute('aria-selected', String(showMutual))\n mutualTab.tabIndex = showMutual ? 0 : -1\n\n allFriendsTab.classList.toggle('social-primary__tab--active', showAllFriends)\n allFriendsTab.setAttribute('aria-selected', String(showAllFriends))\n allFriendsTab.tabIndex = showAllFriends ? 0 : -1\n\n requestsTab.classList.toggle('social-primary__tab--active', showRequests)\n requestsTab.setAttribute('aria-selected', String(showRequests))\n requestsTab.tabIndex = showRequests ? 0 : -1\n\n mutualFriends.classList.toggle('social-primary__panel--active', showMutual)\n mutualFriends.setAttribute('aria-hidden', String(!showMutual))\n\n allFriends.classList.toggle('social-primary__panel--active', showAllFriends)\n allFriends.setAttribute('aria-hidden', String(!showAllFriends))\n\n requestsPanel.classList.toggle('social-primary__panel--active', showRequests)\n requestsPanel.setAttribute('aria-hidden', String(!showRequests))\n requestsPanel.hidden = !showRequestsTab || !showRequests\n }\n const rebuildMutualSection = function () {\n if (!me || thisIsYou) return\n\n const cme = kb.canon(me)\n incoming = kb.whether(s, knows, cme)\n\n const outgoingStatements = kb.statementsMatching(cme, knows, s)\n outgoing = outgoingStatements.length > 0\n\n const nextMutualSection = createMutualSection({\n dom,\n subject: s,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable: canManageRelationship,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n })\n\n mutualFriends.replaceWith(nextMutualSection.section)\n mutualSection = nextMutualSection\n mutualFriends = nextMutualSection.section\n mutualContent = nextMutualSection.content\n }\n\n refreshRelationshipUi = function () {\n rebuildMutualSection()\n headerControls = {\n ...headerControls,\n showAddFriendAction: shouldShowHeaderAddFriendAction(headerControls.viewerMode)\n }\n ;(header as SocialHeaderElement).refreshSocialHeader?.(headerControls)\n requestsTriage = triageFriends(kb, s)\n requestsSection.refreshRequests(requestsTriage)\n setActivePanel(activePanel)\n }\n\n setActivePanel('all-friends')\n\n const applyViewerMode = function (mode: ViewerMode) {\n const showMutualTab = mode === 'authenticated' && !thisIsYou\n showRequestsTab = mode === 'owner'\n mutualTab.hidden = !showMutualTab\n requestsTab.hidden = !showRequestsTab\n if (!showRequestsTab && activePanel === 'requests') {\n setActivePanel('all-friends')\n return\n }\n setActivePanel('all-friends')\n }\n\n mutualTab.addEventListener('click', function () {\n setActivePanel('mutual')\n })\n\n allFriendsTab.addEventListener('click', function () {\n setActivePanel('all-friends')\n })\n\n requestsTab.addEventListener('click', function () {\n setActivePanel('requests')\n })\n\n const refreshFriendsList = function () {\n const refresh = (friendsList as HTMLTableElement & { refresh?: () => void }).refresh\n if (typeof refresh !== 'function') return\n\n refresh.call(friendsList)\n }\n\n const refreshMutualFriends = function () {\n mutualSection.refreshMutualFriends()\n }\n\n ;(async () => {\n try {\n for await (const streamedFriends of streamFriends(context, s)) {\n friendDetailsByUri.clear()\n streamedFriends.forEach(friend => {\n friendDetailsByUri.set(friend.url, friend)\n })\n refreshFriendsList()\n refreshMutualFriends()\n }\n } catch {\n // Keep the initial snapshot if async friend loading fails.\n }\n })()\n\n ;(async () => {\n try {\n requestsTriage = await loadFriendshipTriage(context, s)\n requestsSection.refreshRequests(requestsTriage)\n refreshFriendsList()\n refreshMutualFriends()\n } catch {\n // Keep the initial requests snapshot if additional loading fails.\n }\n })()\n\n // Older triage logic is preserved below as a reusable data helper.\n\n applyViewerMode('anonymous')\n\n authn.checkUser()\n .then(webId => {\n const confirmedViewerMode = getViewerMode(s, webId)\n applyViewerMode(confirmedViewerMode)\n const confirmedCanEditOwnedProfile = confirmedViewerMode === 'owner' && editable\n headerControls = {\n ...headerControls,\n canEdit: confirmedCanEditOwnedProfile,\n viewerMode: confirmedViewerMode,\n showAddFriendAction: shouldShowHeaderAddFriendAction(confirmedViewerMode)\n }\n ;(header as SocialHeaderElement).refreshSocialHeader?.(headerControls)\n })\n .catch(() => {\n applyViewerMode('anonymous')\n headerControls = {\n ...headerControls,\n canEdit: false,\n viewerMode: 'anonymous',\n showAddFriendAction: false\n }\n ;(header as SocialHeaderElement).refreshSocialHeader?.(headerControls)\n })\n\n return socialPane\n } // render()\n} //\n// ends\n// ***************** Social Pane Selectors **********/\n/* Should move to another file, but will leave for now */\n/* Will create a social pane folder or maybe repo later */\n\nconst FRIEND_BATCH_SIZE = 3\n\nexport interface ProfileDetails {\n url: string\n imageUrl?: string\n name?: string\n nickname?: string\n jobTitle?: string\n organization?: string\n location?: string | null\n pronouns?: string\n birthdate?: string\n}\n\nexport interface FriendDetails extends ProfileDetails {\n subjectNode: NamedNode\n}\n\n/* pronounsAsText and formatLocation were copied from HeadingSection selectors */\nexport function pronounsAsText (store: LiveStore, subject: NamedNode): string {\n let pronouns = store.anyJS(subject, ns.solid('preferredSubjectPronoun')) || ''\n if (pronouns) {\n const them = store.anyJS(subject, ns.solid('preferredObjectPronoun'))\n if (them) {\n pronouns += '/' + them\n }\n }\n return pronouns || ''\n}\n\nfunction formatLocation (countryName: string | void, locality: string | void) {\n return countryName && locality\n ? `${locality}, ${countryName}`\n : countryName || locality || null\n}\n\nfunction toFriendDetails (store: any, friendNode: NamedNode): FriendDetails {\n const name =\n store.anyValue(friendNode, ns.vcard('fn')) ||\n store.anyValue(friendNode, ns.foaf('name')) ||\n null\n const nickname =\n store.anyValue(friendNode, ns.vcard('nickname')) ||\n store.anyValue(friendNode, ns.foaf('nick')) ||\n null\n const dateOfBirth = store.anyValue(friendNode, ns.vcard('bday')) || null\n const imageSrc = widgets.findImage(friendNode)\n const jobTitle = store.anyValue(friendNode, ns.vcard('role')) || null\n const orgName = store.anyValue(friendNode, ns.vcard('organization-name')) || null\n const primaryAddressEntryNode = store.any(friendNode, ns.vcard('hasAddress')) as NamedNode | null\n const address: NamedNode | null = primaryAddressEntryNode || null\n const countryName =\n address != null\n ? store.anyValue(address, ns.vcard('country-name'))\n : null\n const locality =\n address != null\n ? store.anyValue(address, ns.vcard('locality'))\n : null\n\n const location = formatLocation(countryName, locality)\n const pronouns = pronounsAsText(store, friendNode)\n\n return {\n url: friendNode.value,\n imageUrl: imageSrc,\n name,\n nickname,\n jobTitle,\n organization: orgName,\n birthdate: dateOfBirth,\n location,\n pronouns,\n subjectNode: friendNode\n }\n}\n\nexport async function * streamFriends (\n context: DataBrowserContext,\n subject: NamedNode,\n batchSize = FRIEND_BATCH_SIZE\n): AsyncGenerator<FriendDetails[], void, void> {\n const store = context.session.store\n const fetcher = (store as any)?.fetcher\n\n if (fetcher && typeof fetcher.load === 'function') {\n try {\n await fetcher.load(subject.doc())\n } catch {\n // Continue with whatever is already in the store.\n }\n }\n\n const seen = new Set<string>()\n const friendNodes = store.each(subject, ns.foaf('knows'), null, subject.doc())\n const uniqueFriendNodes: NamedNode[] = []\n\n for (const friendNode of friendNodes) {\n const key = friendNode?.value\n if (!key || seen.has(key) || subject.value === key) continue\n seen.add(key)\n uniqueFriendNodes.push(friendNode as NamedNode)\n }\n\n const friends: FriendDetails[] = []\n\n for (const friendNode of uniqueFriendNodes) {\n if (fetcher && typeof fetcher.load === 'function') {\n try {\n await fetcher.load(friendNode.doc())\n } catch {\n // Keep partial friend data when one linked document fails to load.\n }\n }\n\n friends.push(toFriendDetails(store, friendNode))\n\n if (friends.length % batchSize === 0) {\n yield [...friends]\n }\n }\n\n if (friends.length > 0 && friends.length % batchSize !== 0) {\n yield [...friends]\n }\n}\n\nexport async function extractFriends (context: DataBrowserContext, subject: NamedNode): Promise<FriendDetails[] | null> {\n let latestFriends: FriendDetails[] | null = null\n\n for await (const friends of streamFriends(context, subject)) {\n latestFriends = friends\n }\n\n return latestFriends\n}\n\nexport function selectProfileData (context: DataBrowserContext, subject: NamedNode): ProfileDetails | null {\n const store = context.session.store\n\n const name =\n store.anyValue(subject, ns.vcard('fn')) ||\n store.anyValue(subject, ns.foaf('name')) ||\n undefined\n const nickname =\n store.anyValue(subject, ns.vcard('nickname')) ||\n store.anyValue(subject, ns.foaf('nick')) ||\n undefined\n const dateOfBirth = store.anyValue(subject, ns.vcard('bday')) || undefined\n const imageSrc = widgets.findImage(subject)\n const jobTitle = store.anyValue(subject, ns.vcard('role')) || undefined\n const orgName = store.anyValue(subject, ns.vcard('organization-name')) || undefined\n const primaryAddressEntryNode = store.any(subject, ns.vcard('hasAddress')) as NamedNode | null\n const address: NamedNode | null = primaryAddressEntryNode || null\n const countryName =\n address != null\n ? store.anyValue(address, ns.vcard('country-name'))\n : undefined\n const locality =\n address != null\n ? store.anyValue(address, ns.vcard('locality'))\n : undefined\n\n const location = formatLocation(countryName, locality)\n const pronouns = pronounsAsText(store, subject)\n return {\n url: subject.value,\n imageUrl: imageSrc,\n name,\n nickname,\n jobTitle,\n organization: orgName,\n birthdate: dateOfBirth,\n location,\n pronouns\n }\n}\n\nexport type { ViewerMode } from './socialSections'\n\nfunction getViewerMode (subject: NamedNode, currentUser: unknown = authn.currentUser()): ViewerMode {\n const currentUserUri =\n typeof currentUser === 'string'\n ? currentUser\n : typeof currentUser === 'object' && currentUser !== null\n ? ((currentUser as { value?: string, uri?: string }).value ||\n (currentUser as { value?: string, uri?: string }).uri ||\n null)\n : null\n let mode: ViewerMode = 'anonymous'\n if (currentUserUri === subject.value) mode = 'owner'\n if (currentUserUri && currentUserUri !== subject.value) mode = 'authenticated'\n return mode\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"socialPane2.esm.js","names":[],"sources":["../../src/social/socialPane.ts"],"sourcesContent":["/* Social Pane\n **\n ** This outline pane provides social network functions\n ** Using for example the FOAF ontology.\n ** Goal: A *distributed* version of facebook, advogato, etc etc\n ** - Similarly easy user interface, but data storage distributed\n ** - Read and write both user-private (address book) and public data clearly\n ** -- todo: use common code to get username and load profile and set 'me'\n */\n\nimport './socialPane.css'\nimport { icons, utils, ns, log, widgets } from 'solid-ui'\nimport { authn } from 'solid-logic'\nimport { LiveStore, NamedNode, Statement } from 'rdflib'\nimport { DataBrowserContext } from 'pane-registry'\nimport { locationIcon } from './icons'\nimport {\n createAllFriendsSection,\n createHeaderSection,\n FriendRowRenderers,\n createMutualSection,\n createRequestsSection,\n HeaderControls,\n SocialHeaderElement\n} from './socialSections'\nimport type { ViewerMode } from './socialSections'\nimport { FriendshipTriage, loadFriendshipTriage, triageFriends } from './triage'\n\nfunction applyEnvironmentAttributes (\n element: HTMLElement,\n context: DataBrowserContext\n): void {\n const layout = context.environment?.layout ?? 'desktop'\n const theme = context.environment?.theme ?? 'light'\n const inputMode = context.environment?.inputMode ?? 'pointer'\n\n element.classList.add('social-pane-host')\n element.dataset.layout = layout\n element.dataset.theme = theme\n element.dataset.inputMode = inputMode\n}\n\nexport const socialPane = {\n icon: icons.originalIconBase + 'foaf/foafTiny.gif',\n\n name: 'social',\n\n label: function (subject, context) {\n const kb = context.session.store\n const types = kb.findTypeURIs(subject)\n if (\n types[ns.foaf('Person').uri] ||\n types[ns.vcard('Individual').uri]\n ) {\n return 'Friends'\n }\n return null\n },\n global: false,\n\n render: function (s, context) {\n const dom = context.dom\n const common = function (x: NamedNode[], y: NamedNode[]) {\n // Find common members of two lists\n const both: NamedNode[] = []\n for (let i = 0; i < x.length; i++) {\n for (let j = 0; j < y.length; j++) {\n if (y[j].sameTerm(x[i])) {\n both.push(y[j])\n break\n }\n }\n }\n return both\n }\n\n const uniqueNodes = function (nodes: NamedNode[]) {\n const seen = new Set<string>()\n const unique: NamedNode[] = []\n for (const node of nodes) {\n if (!node?.value || seen.has(node.value)) continue\n seen.add(node.value)\n unique.push(node)\n }\n return unique\n }\n\n const link = function (contents: Node, uri: string | null | undefined) {\n if (!uri) return contents\n const a = dom.createElement('a')\n a.setAttribute('href', uri)\n a.appendChild(contents)\n return a\n }\n\n const text = function (str: string) {\n return dom.createTextNode(str)\n }\n\n let refreshRelationshipUi = function () {}\n\n const buildCheckboxForm = function (\n lab: string | Node,\n statement: Statement,\n state: boolean,\n options: { disabled?: boolean, disabledTitle?: string } = {}\n ) {\n const f = dom.createElement('form')\n const label = dom.createElement('label')\n const input = dom.createElement('input')\n const tx = dom.createElement('span')\n tx.className = 'question'\n if (typeof lab === 'string') {\n tx.textContent = lab\n } else {\n tx.appendChild(lab)\n }\n input.setAttribute('type', 'checkbox')\n if (options.disabled) {\n input.disabled = true\n if (options.disabledTitle) {\n input.title = options.disabledTitle\n input.setAttribute('aria-label', options.disabledTitle)\n }\n }\n label.appendChild(tx)\n label.appendChild(input)\n f.appendChild(label)\n const boxHandler = function (this: HTMLInputElement, _e: Event) {\n if (this.checked) {\n try {\n outliner.UserInput.sparqler.insert_statement(statement, function (\n uri,\n success,\n errorBody\n ) {\n tx.className = 'question'\n if (!success) {\n log.alert(\n 'Error occurs while inserting ' +\n statement +\n '\\n\\n' +\n errorBody\n )\n input.checked = false // rollback UI\n return\n }\n kb.add(\n statement.subject,\n statement.predicate,\n statement.object,\n statement.why\n )\n refreshRelationshipUi()\n })\n } catch (e) {\n log.error('Data write fails:' + e)\n log.alert('Data write fails:' + e)\n input.checked = false // rollback UI\n tx.className = 'question'\n }\n } else {\n try {\n outliner.UserInput.sparqler.delete_statement(statement, function (\n uri,\n success,\n errorBody\n ) {\n tx.className = 'question'\n if (!success) {\n log.alert(\n 'Error occurs while deleting ' +\n statement +\n '\\n\\n' +\n errorBody\n )\n input.checked = true // Rollback UI\n } else {\n kb.removeMany(\n statement.subject,\n statement.predicate,\n statement.object,\n statement.why\n )\n refreshRelationshipUi()\n }\n })\n } catch (e) {\n log.alert('Delete fails:' + e)\n input.checked = true // Rollback UI\n // return\n }\n }\n }\n input.checked = state\n input.addEventListener('click', boxHandler, false)\n return f\n }\n\n // ////////// Body of render():\n\n const outliner = context.getOutliner(dom)\n const kb = context.session.store\n const socialPane = dom.createElement('div')\n socialPane.classList.add('social-pane', 'flex-column', 'gap-xxs')\n applyEnvironmentAttributes(socialPane, context)\n const foaf = ns.foaf\n const vcard = ns.vcard\n const me = authn.currentUser()\n const meUri = me ? me.uri : null\n\n const thisIsYou = me && kb.sameThings(me, s)\n\n const knows = foaf('knows')\n // var givenName = kb.sym('http://www.w3.org/2000/10/swap/pim/contact#givenName')\n const familiar =\n kb.anyValue(s, foaf('givenname')) ||\n kb.anyValue(s, foaf('firstName')) ||\n kb.anyValue(s, foaf('nick')) ||\n kb.anyValue(s, foaf('name')) ||\n kb.anyValue(s, vcard('fn'))\n const friends = kb.each(s, knows)\n const uniqueFriends = uniqueNodes(friends as NamedNode[])\n const myFriends = me ? uniqueNodes(kb.each(me, foaf('knows')) as NamedNode[]) : []\n const mutualConnections = me && !thisIsYou\n ? uniqueNodes(common(uniqueFriends, myFriends)).filter(friend => !kb.sameThings(friend, me))\n : []\n const mutualFriendCount = me && !thisIsYou ? mutualConnections.length : null\n const viewerMode = getViewerMode(s, me)\n\n // Do I have a public profile document?\n let profile: NamedNode | null = null // This could be SPARQL { ?me foaf:primaryTopic [ a foaf:PersonalProfileDocument ] }\n let editable = false\n let incoming: boolean | NamedNode[] = false\n let outgoing: boolean | NamedNode[] = false\n\n const structure = socialPane.appendChild(dom.createElement('div'))\n structure.className = 'social-layout'\n const primary = structure.appendChild(dom.createElement('div'))\n primary.className = 'social-primary'\n\n const tabs = primary.appendChild(dom.createElement('div'))\n tabs.classList.add('social-primary__tabs', 'flex-center')\n tabs.setAttribute('role', 'tablist')\n tabs.setAttribute('aria-label', 'Social sections')\n\n const allFriendsTab = tabs.appendChild(dom.createElement('button'))\n allFriendsTab.className = 'social-primary__tab'\n allFriendsTab.type = 'button'\n allFriendsTab.id = 'social-tab-all-friends'\n allFriendsTab.textContent = 'All Friends'\n allFriendsTab.setAttribute('role', 'tab')\n allFriendsTab.setAttribute('aria-controls', 'social-panel-all-friends')\n allFriendsTab.setAttribute('aria-selected', 'true')\n allFriendsTab.tabIndex = 0\n\n const mutualTab = tabs.appendChild(dom.createElement('button'))\n mutualTab.className = 'social-primary__tab'\n mutualTab.type = 'button'\n mutualTab.id = 'social-tab-mutual'\n mutualTab.textContent = 'Mutual'\n mutualTab.setAttribute('role', 'tab')\n mutualTab.setAttribute('aria-controls', 'social-panel-mutual')\n mutualTab.setAttribute('aria-selected', 'false')\n mutualTab.tabIndex = -1\n\n if (me) {\n // The definition of FOAF personal profile document is ..\n const works = kb.each(undefined, foaf('primaryTopic'), me) // having me as primary topic\n let message = ''\n for (let i = 0; i < works.length; i++) {\n if (\n kb.whether(\n works[i],\n ns.rdf('type'),\n foaf('PersonalProfileDocument')\n )\n ) {\n const doc = works[i]\n editable = outliner.UserInput.sparqler.editable(doc.uri, kb)\n if (!editable) {\n message +=\n 'Your profile <' +\n utils.escapeForXML(doc.uri) +\n '> is not remotely editable.'\n } else {\n profile = doc\n break\n }\n }\n }\n\n /*\n if (!profile) {\n say(\n message + '\\nI couldn\\'t find your editable personal profile document.'\n )\n } else {\n say('Editing your profile ' + profile + '.')\n editable = outliner.UserInput.sparqler.editable(profile.uri, kb)\n }\n */\n\n if (thisIsYou) {\n // This is about me\n // pass... @@\n } else {\n // This is about someone else\n // My relationship with this person\n\n const cme = kb.canon(me)\n incoming = kb.whether(s, knows, cme)\n outgoing = false\n const outgoingSt = kb.statementsMatching(cme, knows, s)\n if (outgoingSt.length) {\n outgoing = true\n if (!profile) profile = outgoingSt[0].why\n }\n } // About someone else\n } // me is defined\n // End of you and s\n\n const shouldShowHeaderAddFriendAction = (mode: ViewerMode) => {\n return mode === 'authenticated' && !thisIsYou && !outgoing\n }\n\n const canEditOwnedProfile = viewerMode === 'owner' && editable\n const canManageRelationship = viewerMode === 'authenticated' && !thisIsYou && editable && Boolean(profile)\n const canModifyFriendsTab = canEditOwnedProfile\n\n let headerControls: HeaderControls = {\n canEdit: canEditOwnedProfile,\n viewerMode,\n showAddFriendAction: shouldShowHeaderAddFriendAction(viewerMode)\n }\n\n const header = createHeaderSection(context, s, headerControls, {\n friendCount: uniqueFriends.length,\n mutualFriendCount,\n onSelectFriends: function () {\n setActivePanel('all-friends')\n },\n onSelectMutual: typeof mutualFriendCount === 'number'\n ? function () {\n setActivePanel('mutual')\n }\n : undefined\n }, function () {\n return selectProfileData(context, s)\n })\n header.classList.add('social-pane__header-section', 'flex-column')\n socialPane.prepend(header)\n\n // div.appendChild(dom.createTextNode(plural(friends.length, 'acquaintance') +'. '))\n\n // ///////////////////////////////////////////// Main block\n //\n // Should: Find the intersection and difference sets\n\n const friendDetailsByUri = new Map<string, FriendDetails>()\n\n const hydrateFriendDetailsCache = function (friendNodes: NamedNode[]) {\n const nextCache = new Map<string, FriendDetails>()\n\n friendNodes.forEach(friendNode => {\n if (!friendNode?.value || friendNode.value === s.value) return\n nextCache.set(friendNode.value, toFriendDetails(kb, friendNode))\n })\n\n friendDetailsByUri.clear()\n nextCache.forEach((value, key) => {\n friendDetailsByUri.set(key, value)\n })\n }\n\n hydrateFriendDetailsCache(uniqueFriends)\n\n const renderSupportingInfo: FriendRowRenderers['renderSupportingInfo'] = function (target: NamedNode, renderDom: HTMLDocument) {\n const friend = friendDetailsByUri.get(target.value) || toFriendDetails(kb, target)\n friendDetailsByUri.set(target.value, friend)\n\n const container = renderDom.createElement('div')\n const jobAndOrganization = [friend.jobTitle, friend.organization].filter(Boolean).join(' | ')\n if (jobAndOrganization) {\n const jobLine = container.appendChild(renderDom.createElement('div'))\n jobLine.className = 'social-friend-job-org'\n jobLine.textContent = jobAndOrganization\n }\n\n if (friend.location) {\n const locationLine = container.appendChild(renderDom.createElement('div'))\n locationLine.className = 'social-friend-location'\n locationLine.innerHTML = `${locationIcon} ${friend.location}`\n }\n\n if (!container.childNodes.length) return null\n\n return container\n }\n\n const renderNameSuffix: FriendRowRenderers['renderNameSuffix'] = function (target: NamedNode, renderDom: HTMLDocument) {\n const friend = friendDetailsByUri.get(target.value) || toFriendDetails(kb, target)\n friendDetailsByUri.set(target.value, friend)\n const pronouns = friend.pronouns\n if (!pronouns) return null\n\n const suffix = renderDom.createElement('span')\n suffix.className = 'social-friend-pronouns'\n suffix.textContent = `(${pronouns})`\n return suffix\n }\n\n let mutualSection = me && !thisIsYou\n ? createMutualSection({\n dom,\n subject: s,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable: canManageRelationship,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n })\n : {\n section: dom.createElement('section'),\n content: dom.createElement('div'),\n refreshMutualFriends: function () {}\n }\n\n let mutualFriends = mutualSection.section\n let mutualContent = mutualSection.content\n if (!mutualFriends.className) {\n mutualFriends.className = 'social-pane__mutual-friends social-primary__panel'\n mutualFriends.id = 'social-panel-mutual'\n mutualFriends.setAttribute('role', 'tabpanel')\n mutualFriends.setAttribute('aria-labelledby', 'social-tab-mutual')\n mutualContent.className = 'social-main social-main--mutual'\n mutualFriends.appendChild(mutualContent)\n }\n primary.appendChild(mutualFriends)\n\n const allFriendsSection = createAllFriendsSection({\n dom,\n subject: s,\n profile: canModifyFriendsTab ? profile : null,\n editable: canModifyFriendsTab,\n renderSupportingInfo,\n renderNameSuffix\n })\n\n const allFriends = allFriendsSection.section\n const friendsList = allFriendsSection.friendsList\n primary.appendChild(allFriends)\n\n let requestsTriage: FriendshipTriage = triageFriends(kb, s)\n const requestsSection = createRequestsSection({\n dom,\n triage: requestsTriage,\n renderSupportingInfo,\n renderNameSuffix\n })\n const requestsPanel = requestsSection.section\n primary.appendChild(requestsPanel)\n\n const requestsTab = tabs.appendChild(dom.createElement('button'))\n requestsTab.className = 'social-primary__tab'\n requestsTab.type = 'button'\n requestsTab.id = 'social-tab-requests'\n requestsTab.textContent = 'Requests'\n requestsTab.setAttribute('role', 'tab')\n requestsTab.setAttribute('aria-controls', 'social-panel-requests')\n requestsTab.setAttribute('aria-selected', 'false')\n requestsTab.tabIndex = -1\n\n type SocialPanel = 'mutual' | 'all-friends' | 'requests'\n let activePanel: SocialPanel = 'all-friends'\n let showRequestsTab = viewerMode === 'owner'\n\n const setActivePanel = function (panel: SocialPanel) {\n activePanel = panel\n const showMutual = panel === 'mutual'\n const showAllFriends = panel === 'all-friends'\n const showRequests = showRequestsTab && panel === 'requests'\n mutualTab.classList.toggle('social-primary__tab--active', showMutual)\n mutualTab.setAttribute('aria-selected', String(showMutual))\n mutualTab.tabIndex = showMutual ? 0 : -1\n\n allFriendsTab.classList.toggle('social-primary__tab--active', showAllFriends)\n allFriendsTab.setAttribute('aria-selected', String(showAllFriends))\n allFriendsTab.tabIndex = showAllFriends ? 0 : -1\n\n requestsTab.classList.toggle('social-primary__tab--active', showRequests)\n requestsTab.setAttribute('aria-selected', String(showRequests))\n requestsTab.tabIndex = showRequests ? 0 : -1\n\n mutualFriends.classList.toggle('social-primary__panel--active', showMutual)\n mutualFriends.setAttribute('aria-hidden', String(!showMutual))\n\n allFriends.classList.toggle('social-primary__panel--active', showAllFriends)\n allFriends.setAttribute('aria-hidden', String(!showAllFriends))\n\n requestsPanel.classList.toggle('social-primary__panel--active', showRequests)\n requestsPanel.setAttribute('aria-hidden', String(!showRequests))\n requestsPanel.hidden = !showRequestsTab || !showRequests\n }\n const rebuildMutualSection = function () {\n if (!me || thisIsYou) return\n\n const cme = kb.canon(me)\n incoming = kb.whether(s, knows, cme)\n\n const outgoingStatements = kb.statementsMatching(cme, knows, s)\n outgoing = outgoingStatements.length > 0\n\n const nextMutualSection = createMutualSection({\n dom,\n subject: s,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable: canManageRelationship,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n })\n\n mutualFriends.replaceWith(nextMutualSection.section)\n mutualSection = nextMutualSection\n mutualFriends = nextMutualSection.section\n mutualContent = nextMutualSection.content\n }\n\n refreshRelationshipUi = function () {\n rebuildMutualSection()\n headerControls = {\n ...headerControls,\n showAddFriendAction: shouldShowHeaderAddFriendAction(headerControls.viewerMode)\n }\n ;(header as SocialHeaderElement).refreshSocialHeader?.(headerControls)\n requestsTriage = triageFriends(kb, s)\n requestsSection.refreshRequests(requestsTriage)\n setActivePanel(activePanel)\n }\n\n setActivePanel('all-friends')\n\n const applyViewerMode = function (mode: ViewerMode) {\n const showMutualTab = mode === 'authenticated' && !thisIsYou\n showRequestsTab = mode === 'owner'\n mutualTab.hidden = !showMutualTab\n requestsTab.hidden = !showRequestsTab\n if (!showRequestsTab && activePanel === 'requests') {\n setActivePanel('all-friends')\n return\n }\n setActivePanel('all-friends')\n }\n\n mutualTab.addEventListener('click', function () {\n setActivePanel('mutual')\n })\n\n allFriendsTab.addEventListener('click', function () {\n setActivePanel('all-friends')\n })\n\n requestsTab.addEventListener('click', function () {\n setActivePanel('requests')\n })\n\n const refreshFriendsList = function () {\n const refresh = (friendsList as HTMLTableElement & { refresh?: () => void }).refresh\n if (typeof refresh !== 'function') return\n\n refresh.call(friendsList)\n }\n\n const refreshMutualFriends = function () {\n mutualSection.refreshMutualFriends()\n }\n\n ;(async () => {\n try {\n for await (const streamedFriends of streamFriends(context, s)) {\n friendDetailsByUri.clear()\n streamedFriends.forEach(friend => {\n friendDetailsByUri.set(friend.url, friend)\n })\n refreshFriendsList()\n refreshMutualFriends()\n }\n } catch {\n // Keep the initial snapshot if async friend loading fails.\n }\n })()\n\n ;(async () => {\n try {\n requestsTriage = await loadFriendshipTriage(context, s)\n requestsSection.refreshRequests(requestsTriage)\n refreshFriendsList()\n refreshMutualFriends()\n } catch {\n // Keep the initial requests snapshot if additional loading fails.\n }\n })()\n\n // Older triage logic is preserved below as a reusable data helper.\n\n applyViewerMode('anonymous')\n\n authn.checkUser()\n .then(webId => {\n const confirmedViewerMode = getViewerMode(s, webId)\n applyViewerMode(confirmedViewerMode)\n const confirmedCanEditOwnedProfile = confirmedViewerMode === 'owner' && editable\n headerControls = {\n ...headerControls,\n canEdit: confirmedCanEditOwnedProfile,\n viewerMode: confirmedViewerMode,\n showAddFriendAction: shouldShowHeaderAddFriendAction(confirmedViewerMode)\n }\n ;(header as SocialHeaderElement).refreshSocialHeader?.(headerControls)\n })\n .catch(() => {\n applyViewerMode('anonymous')\n headerControls = {\n ...headerControls,\n canEdit: false,\n viewerMode: 'anonymous',\n showAddFriendAction: false\n }\n ;(header as SocialHeaderElement).refreshSocialHeader?.(headerControls)\n })\n\n return socialPane\n } // render()\n} //\n// ends\n// ***************** Social Pane Selectors **********/\n/* Should move to another file, but will leave for now */\n/* Will create a social pane folder or maybe repo later */\n\nconst FRIEND_BATCH_SIZE = 3\n\nexport interface ProfileDetails {\n url: string\n imageUrl?: string\n name?: string\n nickname?: string\n jobTitle?: string\n organization?: string\n location?: string | null\n pronouns?: string\n birthdate?: string\n}\n\nexport interface FriendDetails extends ProfileDetails {\n subjectNode: NamedNode\n}\n\n/* pronounsAsText and formatLocation were copied from HeadingSection selectors */\nexport function pronounsAsText (store: LiveStore, subject: NamedNode): string {\n let pronouns = store.anyJS(subject, ns.solid('preferredSubjectPronoun')) || ''\n if (pronouns) {\n const them = store.anyJS(subject, ns.solid('preferredObjectPronoun'))\n if (them) {\n pronouns += '/' + them\n }\n }\n return pronouns || ''\n}\n\nfunction formatLocation (countryName: string | void, locality: string | void) {\n return countryName && locality\n ? `${locality}, ${countryName}`\n : countryName || locality || null\n}\n\nfunction toFriendDetails (store: any, friendNode: NamedNode): FriendDetails {\n const name =\n store.anyValue(friendNode, ns.vcard('fn')) ||\n store.anyValue(friendNode, ns.foaf('name')) ||\n null\n const nickname =\n store.anyValue(friendNode, ns.vcard('nickname')) ||\n store.anyValue(friendNode, ns.foaf('nick')) ||\n null\n const dateOfBirth = store.anyValue(friendNode, ns.vcard('bday')) || null\n const imageSrc = widgets.findImage(friendNode)\n const jobTitle = store.anyValue(friendNode, ns.vcard('role')) || null\n const orgName = store.anyValue(friendNode, ns.vcard('organization-name')) || null\n const primaryAddressEntryNode = store.any(friendNode, ns.vcard('hasAddress')) as NamedNode | null\n const address: NamedNode | null = primaryAddressEntryNode || null\n const countryName =\n address != null\n ? store.anyValue(address, ns.vcard('country-name'))\n : null\n const locality =\n address != null\n ? store.anyValue(address, ns.vcard('locality'))\n : null\n\n const location = formatLocation(countryName, locality)\n const pronouns = pronounsAsText(store, friendNode)\n\n return {\n url: friendNode.value,\n imageUrl: imageSrc,\n name,\n nickname,\n jobTitle,\n organization: orgName,\n birthdate: dateOfBirth,\n location,\n pronouns,\n subjectNode: friendNode\n }\n}\n\nexport async function * streamFriends (\n context: DataBrowserContext,\n subject: NamedNode,\n batchSize = FRIEND_BATCH_SIZE\n): AsyncGenerator<FriendDetails[], void, void> {\n const store = context.session.store\n const fetcher = (store as any)?.fetcher\n\n if (fetcher && typeof fetcher.load === 'function') {\n try {\n await fetcher.load(subject.doc())\n } catch {\n // Continue with whatever is already in the store.\n }\n }\n\n const seen = new Set<string>()\n const friendNodes = store.each(subject, ns.foaf('knows'), null, subject.doc())\n const uniqueFriendNodes: NamedNode[] = []\n\n for (const friendNode of friendNodes) {\n const key = friendNode?.value\n if (!key || seen.has(key) || subject.value === key) continue\n seen.add(key)\n uniqueFriendNodes.push(friendNode as NamedNode)\n }\n\n const friends: FriendDetails[] = []\n\n for (const friendNode of uniqueFriendNodes) {\n if (fetcher && typeof fetcher.load === 'function') {\n try {\n await fetcher.load(friendNode.doc())\n } catch {\n // Keep partial friend data when one linked document fails to load.\n }\n }\n\n friends.push(toFriendDetails(store, friendNode))\n\n if (friends.length % batchSize === 0) {\n yield [...friends]\n }\n }\n\n if (friends.length > 0 && friends.length % batchSize !== 0) {\n yield [...friends]\n }\n}\n\nexport async function extractFriends (context: DataBrowserContext, subject: NamedNode): Promise<FriendDetails[] | null> {\n let latestFriends: FriendDetails[] | null = null\n\n for await (const friends of streamFriends(context, subject)) {\n latestFriends = friends\n }\n\n return latestFriends\n}\n\nexport function selectProfileData (context: DataBrowserContext, subject: NamedNode): ProfileDetails | null {\n const store = context.session.store\n\n const name =\n store.anyValue(subject, ns.vcard('fn')) ||\n store.anyValue(subject, ns.foaf('name')) ||\n undefined\n const nickname =\n store.anyValue(subject, ns.vcard('nickname')) ||\n store.anyValue(subject, ns.foaf('nick')) ||\n undefined\n const dateOfBirth = store.anyValue(subject, ns.vcard('bday')) || undefined\n const imageSrc = widgets.findImage(subject)\n const jobTitle = store.anyValue(subject, ns.vcard('role')) || undefined\n const orgName = store.anyValue(subject, ns.vcard('organization-name')) || undefined\n const primaryAddressEntryNode = store.any(subject, ns.vcard('hasAddress')) as NamedNode | null\n const address: NamedNode | null = primaryAddressEntryNode || null\n const countryName =\n address != null\n ? store.anyValue(address, ns.vcard('country-name'))\n : undefined\n const locality =\n address != null\n ? store.anyValue(address, ns.vcard('locality'))\n : undefined\n\n const location = formatLocation(countryName, locality)\n const pronouns = pronounsAsText(store, subject)\n return {\n url: subject.value,\n imageUrl: imageSrc,\n name,\n nickname,\n jobTitle,\n organization: orgName,\n birthdate: dateOfBirth,\n location,\n pronouns\n }\n}\n\nexport type { ViewerMode } from './socialSections'\n\nfunction getViewerMode (subject: NamedNode, currentUser: unknown = authn.currentUser()): ViewerMode {\n const currentUserUri =\n typeof currentUser === 'string'\n ? currentUser\n : typeof currentUser === 'object' && currentUser !== null\n ? ((currentUser as { value?: string, uri?: string }).value ||\n (currentUser as { value?: string, uri?: string }).uri ||\n null)\n : null\n let mode: ViewerMode = 'anonymous'\n if (currentUserUri === subject.value) mode = 'owner'\n if (currentUserUri && currentUserUri !== subject.value) mode = 'authenticated'\n return mode\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- let e=require("solid-ui");function t(e){let t=new Set,n=[];for(let r of e){let e=r?.value;!e||t.has(e)||(t.add(e),n.push(r))}return n}function n(n,r){let i=t(n.each(r,e.ns.foaf(`knows`))),a=t(n.each(void 0,e.ns.foaf(`knows`),r)),o=[],s=[],c=[];for(let e of i)a.some(t=>t.sameTerm(e))?o.push(e):s.push(e);for(let e of a)i.some(t=>t.sameTerm(e))||c.push(e);return{acquaintances:i,confirmed:o,unconfirmed:s,requests:c}}async function r(t,r){let i=t.session.store,a=i.fetcher;if(!a||typeof a.load!=`function`)return n(i,r);try{await a.load(r.doc())}catch{}let o=n(i,r),s=new Map;s.set(r.doc().value,r.doc());for(let e of[...o.acquaintances,...o.requests])s.set(e.doc().value,e.doc());let c=i.statementsMatching(void 0,e.ns.foaf(`knows`),r);for(let e of c){let t=e.why;t?.value&&s.set(t.value,t)}for(let e of s.values())try{await a.load(e)}catch{}return n(i,r)}exports.loadFriendshipTriage=r,exports.triageFriends=n;
1
+ let e=require("solid-ui");function t(e){let t=new Set,n=[];for(let r of e){let e=r?.value;e&&!t.has(e)&&(t.add(e),n.push(r))}return n}function n(n,r){let i=t(n.each(r,e.ns.foaf(`knows`))),a=t(n.each(void 0,e.ns.foaf(`knows`),r)),o=[],s=[],c=[];for(let e of i)a.some(t=>t.sameTerm(e))?o.push(e):s.push(e);for(let e of a)i.some(t=>t.sameTerm(e))||c.push(e);return{acquaintances:i,confirmed:o,unconfirmed:s,requests:c}}async function r(t,r){let i=t.session.store,a=i.fetcher;if(!a||typeof a.load!=`function`)return n(i,r);try{await a.load(r.doc())}catch{}let o=n(i,r),s=new Map;s.set(r.doc().value,r.doc());for(let e of[...o.acquaintances,...o.requests])s.set(e.doc().value,e.doc());let c=i.statementsMatching(void 0,e.ns.foaf(`knows`),r);for(let e of c){let t=e.why;t?.value&&s.set(t.value,t)}for(let e of s.values())try{await a.load(e)}catch{}return n(i,r)}exports.loadFriendshipTriage=r,exports.triageFriends=n;
2
2
  //# sourceMappingURL=triage.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"triage.cjs.js","names":[],"sources":["../../src/social/triage.ts"],"sourcesContent":["import { DataBrowserContext } from 'pane-registry'\nimport { IndexedFormula, NamedNode } from 'rdflib'\nimport { ns } from 'solid-ui'\n\ntype FriendshipStore = IndexedFormula & {\n fetcher?: {\n load?: (target: NamedNode | string) => Promise<unknown>\n }\n}\n\nexport interface FriendshipTriage {\n acquaintances: NamedNode[]\n confirmed: NamedNode[]\n unconfirmed: NamedNode[]\n requests: NamedNode[]\n}\n\nfunction uniqueNamedNodes (nodes: NamedNode[]): NamedNode[] {\n const seen = new Set<string>()\n const unique: NamedNode[] = []\n\n for (const node of nodes) {\n const key = node?.value\n if (!key || seen.has(key)) continue\n seen.add(key)\n unique.push(node)\n }\n\n return unique\n}\n\nexport function triageFriends (store: FriendshipStore, subject: NamedNode): FriendshipTriage {\n const outgoingFriends = uniqueNamedNodes(store.each(subject, ns.foaf('knows')) as NamedNode[])\n const incomingFriends = uniqueNamedNodes(\n store.each(undefined, ns.foaf('knows'), subject) as NamedNode[]\n )\n const confirmed: NamedNode[] = []\n const unconfirmed: NamedNode[] = []\n const requests: NamedNode[] = []\n\n for (const friend of outgoingFriends) {\n const isConfirmed = incomingFriends.some(incomingFriend => incomingFriend.sameTerm(friend))\n if (isConfirmed) {\n confirmed.push(friend)\n } else {\n unconfirmed.push(friend)\n }\n }\n\n for (const friend of incomingFriends) {\n const isAlreadyOutgoing = outgoingFriends.some(outgoingFriend => outgoingFriend.sameTerm(friend))\n if (!isAlreadyOutgoing) {\n requests.push(friend)\n }\n }\n\n return {\n acquaintances: outgoingFriends,\n confirmed,\n unconfirmed,\n requests\n }\n}\n\nexport async function loadFriendshipTriage (\n context: DataBrowserContext,\n subject: NamedNode\n): Promise<FriendshipTriage> {\n const store = context.session.store as FriendshipStore\n const fetcher = store.fetcher\n\n if (!fetcher || typeof fetcher.load !== 'function') {\n return triageFriends(store, subject)\n }\n\n try {\n await fetcher.load(subject.doc())\n } catch {\n // Continue with the store snapshot we already have.\n }\n\n const initialTriage = triageFriends(store, subject)\n const documentsToLoad = new Map<string, NamedNode | string>()\n\n documentsToLoad.set(subject.doc().value, subject.doc())\n\n for (const friend of [...initialTriage.acquaintances, ...initialTriage.requests]) {\n documentsToLoad.set(friend.doc().value, friend.doc())\n }\n\n const incomingStatements = store.statementsMatching(undefined, ns.foaf('knows'), subject)\n for (const statement of incomingStatements) {\n const why = statement.why as NamedNode | undefined\n if (why?.value) {\n documentsToLoad.set(why.value, why)\n }\n }\n\n for (const target of documentsToLoad.values()) {\n try {\n await fetcher.load(target)\n } catch {\n // Keep partial results when one profile document fails to load.\n }\n }\n\n return triageFriends(store, subject)\n}\n"],"mappings":"0BAiBA,SAAS,EAAkB,EAAiC,CAC1D,IAAM,EAAO,IAAI,IACX,EAAsB,CAAC,EAE7B,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAM,GAAM,MACd,CAAC,GAAO,EAAK,IAAI,CAAG,IACxB,EAAK,IAAI,CAAG,EACZ,EAAO,KAAK,CAAI,EAClB,CAEA,OAAO,CACT,CAEA,SAAgB,EAAe,EAAwB,EAAsC,CAC3F,IAAM,EAAkB,EAAiB,EAAM,KAAK,EAAS,EAAA,GAAG,KAAK,OAAO,CAAC,CAAgB,EACvF,EAAkB,EACtB,EAAM,KAAK,IAAA,GAAW,EAAA,GAAG,KAAK,OAAO,EAAG,CAAO,CACjD,EACM,EAAyB,CAAC,EAC1B,EAA2B,CAAC,EAC5B,EAAwB,CAAC,EAE/B,IAAK,IAAM,KAAU,EACC,EAAgB,KAAK,GAAkB,EAAe,SAAS,CAAM,CACrF,EACF,EAAU,KAAK,CAAM,EAErB,EAAY,KAAK,CAAM,EAI3B,IAAK,IAAM,KAAU,EACO,EAAgB,KAAK,GAAkB,EAAe,SAAS,CAAM,CAC1F,GACH,EAAS,KAAK,CAAM,EAIxB,MAAO,CACL,cAAe,EACf,YACA,cACA,UACF,CACF,CAEA,eAAsB,EACpB,EACA,EAC2B,CAC3B,IAAM,EAAQ,EAAQ,QAAQ,MACxB,EAAU,EAAM,QAEtB,GAAI,CAAC,GAAW,OAAO,EAAQ,MAAS,WACtC,OAAO,EAAc,EAAO,CAAO,EAGrC,GAAI,CACF,MAAM,EAAQ,KAAK,EAAQ,IAAI,CAAC,CAClC,MAAQ,CAER,CAEA,IAAM,EAAgB,EAAc,EAAO,CAAO,EAC5C,EAAkB,IAAI,IAE5B,EAAgB,IAAI,EAAQ,IAAI,CAAC,CAAC,MAAO,EAAQ,IAAI,CAAC,EAEtD,IAAK,IAAM,IAAU,CAAC,GAAG,EAAc,cAAe,GAAG,EAAc,QAAQ,EAC7E,EAAgB,IAAI,EAAO,IAAI,CAAC,CAAC,MAAO,EAAO,IAAI,CAAC,EAGtD,IAAM,EAAqB,EAAM,mBAAmB,IAAA,GAAW,EAAA,GAAG,KAAK,OAAO,EAAG,CAAO,EACxF,IAAK,IAAM,KAAa,EAAoB,CAC1C,IAAM,EAAM,EAAU,IAClB,GAAK,OACP,EAAgB,IAAI,EAAI,MAAO,CAAG,CAEtC,CAEA,IAAK,IAAM,KAAU,EAAgB,OAAO,EAC1C,GAAI,CACF,MAAM,EAAQ,KAAK,CAAM,CAC3B,MAAQ,CAER,CAGF,OAAO,EAAc,EAAO,CAAO,CACrC"}
1
+ {"version":3,"file":"triage.cjs.js","names":[],"sources":["../../src/social/triage.ts"],"sourcesContent":["import { DataBrowserContext } from 'pane-registry'\nimport { IndexedFormula, NamedNode } from 'rdflib'\nimport { ns } from 'solid-ui'\n\ntype FriendshipStore = IndexedFormula & {\n fetcher?: {\n load?: (target: NamedNode | string) => Promise<unknown>\n }\n}\n\nexport interface FriendshipTriage {\n acquaintances: NamedNode[]\n confirmed: NamedNode[]\n unconfirmed: NamedNode[]\n requests: NamedNode[]\n}\n\nfunction uniqueNamedNodes (nodes: NamedNode[]): NamedNode[] {\n const seen = new Set<string>()\n const unique: NamedNode[] = []\n\n for (const node of nodes) {\n const key = node?.value\n if (!key || seen.has(key)) continue\n seen.add(key)\n unique.push(node)\n }\n\n return unique\n}\n\nexport function triageFriends (store: FriendshipStore, subject: NamedNode): FriendshipTriage {\n const outgoingFriends = uniqueNamedNodes(store.each(subject, ns.foaf('knows')) as NamedNode[])\n const incomingFriends = uniqueNamedNodes(\n store.each(undefined, ns.foaf('knows'), subject) as NamedNode[]\n )\n const confirmed: NamedNode[] = []\n const unconfirmed: NamedNode[] = []\n const requests: NamedNode[] = []\n\n for (const friend of outgoingFriends) {\n const isConfirmed = incomingFriends.some(incomingFriend => incomingFriend.sameTerm(friend))\n if (isConfirmed) {\n confirmed.push(friend)\n } else {\n unconfirmed.push(friend)\n }\n }\n\n for (const friend of incomingFriends) {\n const isAlreadyOutgoing = outgoingFriends.some(outgoingFriend => outgoingFriend.sameTerm(friend))\n if (!isAlreadyOutgoing) {\n requests.push(friend)\n }\n }\n\n return {\n acquaintances: outgoingFriends,\n confirmed,\n unconfirmed,\n requests\n }\n}\n\nexport async function loadFriendshipTriage (\n context: DataBrowserContext,\n subject: NamedNode\n): Promise<FriendshipTriage> {\n const store = context.session.store as FriendshipStore\n const fetcher = store.fetcher\n\n if (!fetcher || typeof fetcher.load !== 'function') {\n return triageFriends(store, subject)\n }\n\n try {\n await fetcher.load(subject.doc())\n } catch {\n // Continue with the store snapshot we already have.\n }\n\n const initialTriage = triageFriends(store, subject)\n const documentsToLoad = new Map<string, NamedNode | string>()\n\n documentsToLoad.set(subject.doc().value, subject.doc())\n\n for (const friend of [...initialTriage.acquaintances, ...initialTriage.requests]) {\n documentsToLoad.set(friend.doc().value, friend.doc())\n }\n\n const incomingStatements = store.statementsMatching(undefined, ns.foaf('knows'), subject)\n for (const statement of incomingStatements) {\n const why = statement.why as NamedNode | undefined\n if (why?.value) {\n documentsToLoad.set(why.value, why)\n }\n }\n\n for (const target of documentsToLoad.values()) {\n try {\n await fetcher.load(target)\n } catch {\n // Keep partial results when one profile document fails to load.\n }\n }\n\n return triageFriends(store, subject)\n}\n"],"mappings":"0BAiBA,SAAS,EAAkB,EAAiC,CAC1D,IAAM,EAAO,IAAI,IACX,EAAsB,CAAC,EAE7B,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAM,GAAM,MACb,GAAO,GAAK,IAAI,CAAG,IACxB,EAAK,IAAI,CAAG,EACZ,EAAO,KAAK,CAAI,EAClB,CAEA,OAAO,CACT,CAEA,SAAgB,EAAe,EAAwB,EAAsC,CAC3F,IAAM,EAAkB,EAAiB,EAAM,KAAK,EAAS,EAAA,GAAG,KAAK,OAAO,CAAC,CAAgB,EACvF,EAAkB,EACtB,EAAM,KAAK,IAAA,GAAW,EAAA,GAAG,KAAK,OAAO,EAAG,CAAO,CACjD,EACM,EAAyB,CAAC,EAC1B,EAA2B,CAAC,EAC5B,EAAwB,CAAC,EAE/B,IAAK,IAAM,KAAU,EACC,EAAgB,KAAK,GAAkB,EAAe,SAAS,CAAM,CACrF,EACF,EAAU,KAAK,CAAM,EAErB,EAAY,KAAK,CAAM,EAI3B,IAAK,IAAM,KAAU,EACO,EAAgB,KAAK,GAAkB,EAAe,SAAS,CAAM,CAC1F,GACH,EAAS,KAAK,CAAM,EAIxB,MAAO,CACL,cAAe,EACf,YACA,cACA,UACF,CACF,CAEA,eAAsB,EACpB,EACA,EAC2B,CAC3B,IAAM,EAAQ,EAAQ,QAAQ,MACxB,EAAU,EAAM,QAEtB,GAAI,CAAC,GAAW,OAAO,EAAQ,MAAS,WACtC,OAAO,EAAc,EAAO,CAAO,EAGrC,GAAI,CACF,MAAM,EAAQ,KAAK,EAAQ,IAAI,CAAC,CAClC,MAAQ,CAER,CAEA,IAAM,EAAgB,EAAc,EAAO,CAAO,EAC5C,EAAkB,IAAI,IAE5B,EAAgB,IAAI,EAAQ,IAAI,CAAC,CAAC,MAAO,EAAQ,IAAI,CAAC,EAEtD,IAAK,IAAM,IAAU,CAAC,GAAG,EAAc,cAAe,GAAG,EAAc,QAAQ,EAC7E,EAAgB,IAAI,EAAO,IAAI,CAAC,CAAC,MAAO,EAAO,IAAI,CAAC,EAGtD,IAAM,EAAqB,EAAM,mBAAmB,IAAA,GAAW,EAAA,GAAG,KAAK,OAAO,EAAG,CAAO,EACxF,IAAK,IAAM,KAAa,EAAoB,CAC1C,IAAM,EAAM,EAAU,IAClB,GAAK,OACP,EAAgB,IAAI,EAAI,MAAO,CAAG,CAEtC,CAEA,IAAK,IAAM,KAAU,EAAgB,OAAO,EAC1C,GAAI,CACF,MAAM,EAAQ,KAAK,CAAM,CAC3B,MAAQ,CAER,CAGF,OAAO,EAAc,EAAO,CAAO,CACrC"}
@@ -4,7 +4,7 @@ function t(e) {
4
4
  let t = /* @__PURE__ */ new Set(), n = [];
5
5
  for (let r of e) {
6
6
  let e = r?.value;
7
- !e || t.has(e) || (t.add(e), n.push(r));
7
+ e && !t.has(e) && (t.add(e), n.push(r));
8
8
  }
9
9
  return n;
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"triage.esm.js","names":[],"sources":["../../src/social/triage.ts"],"sourcesContent":["import { DataBrowserContext } from 'pane-registry'\nimport { IndexedFormula, NamedNode } from 'rdflib'\nimport { ns } from 'solid-ui'\n\ntype FriendshipStore = IndexedFormula & {\n fetcher?: {\n load?: (target: NamedNode | string) => Promise<unknown>\n }\n}\n\nexport interface FriendshipTriage {\n acquaintances: NamedNode[]\n confirmed: NamedNode[]\n unconfirmed: NamedNode[]\n requests: NamedNode[]\n}\n\nfunction uniqueNamedNodes (nodes: NamedNode[]): NamedNode[] {\n const seen = new Set<string>()\n const unique: NamedNode[] = []\n\n for (const node of nodes) {\n const key = node?.value\n if (!key || seen.has(key)) continue\n seen.add(key)\n unique.push(node)\n }\n\n return unique\n}\n\nexport function triageFriends (store: FriendshipStore, subject: NamedNode): FriendshipTriage {\n const outgoingFriends = uniqueNamedNodes(store.each(subject, ns.foaf('knows')) as NamedNode[])\n const incomingFriends = uniqueNamedNodes(\n store.each(undefined, ns.foaf('knows'), subject) as NamedNode[]\n )\n const confirmed: NamedNode[] = []\n const unconfirmed: NamedNode[] = []\n const requests: NamedNode[] = []\n\n for (const friend of outgoingFriends) {\n const isConfirmed = incomingFriends.some(incomingFriend => incomingFriend.sameTerm(friend))\n if (isConfirmed) {\n confirmed.push(friend)\n } else {\n unconfirmed.push(friend)\n }\n }\n\n for (const friend of incomingFriends) {\n const isAlreadyOutgoing = outgoingFriends.some(outgoingFriend => outgoingFriend.sameTerm(friend))\n if (!isAlreadyOutgoing) {\n requests.push(friend)\n }\n }\n\n return {\n acquaintances: outgoingFriends,\n confirmed,\n unconfirmed,\n requests\n }\n}\n\nexport async function loadFriendshipTriage (\n context: DataBrowserContext,\n subject: NamedNode\n): Promise<FriendshipTriage> {\n const store = context.session.store as FriendshipStore\n const fetcher = store.fetcher\n\n if (!fetcher || typeof fetcher.load !== 'function') {\n return triageFriends(store, subject)\n }\n\n try {\n await fetcher.load(subject.doc())\n } catch {\n // Continue with the store snapshot we already have.\n }\n\n const initialTriage = triageFriends(store, subject)\n const documentsToLoad = new Map<string, NamedNode | string>()\n\n documentsToLoad.set(subject.doc().value, subject.doc())\n\n for (const friend of [...initialTriage.acquaintances, ...initialTriage.requests]) {\n documentsToLoad.set(friend.doc().value, friend.doc())\n }\n\n const incomingStatements = store.statementsMatching(undefined, ns.foaf('knows'), subject)\n for (const statement of incomingStatements) {\n const why = statement.why as NamedNode | undefined\n if (why?.value) {\n documentsToLoad.set(why.value, why)\n }\n }\n\n for (const target of documentsToLoad.values()) {\n try {\n await fetcher.load(target)\n } catch {\n // Keep partial results when one profile document fails to load.\n }\n }\n\n return triageFriends(store, subject)\n}\n"],"mappings":";;AAiBA,SAAS,EAAkB,GAAiC;CAC1D,IAAM,oBAAO,IAAI,IAAY,GACvB,IAAsB,CAAC;CAE7B,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAM,IAAM,GAAM;EACd,CAAC,KAAO,EAAK,IAAI,CAAG,MACxB,EAAK,IAAI,CAAG,GACZ,EAAO,KAAK,CAAI;CAClB;CAEA,OAAO;AACT;AAEA,SAAgB,EAAe,GAAwB,GAAsC;CAC3F,IAAM,IAAkB,EAAiB,EAAM,KAAK,GAAS,EAAG,KAAK,OAAO,CAAC,CAAgB,GACvF,IAAkB,EACtB,EAAM,KAAK,KAAA,GAAW,EAAG,KAAK,OAAO,GAAG,CAAO,CACjD,GACM,IAAyB,CAAC,GAC1B,IAA2B,CAAC,GAC5B,IAAwB,CAAC;CAE/B,KAAK,IAAM,KAAU,GAEnB,AADoB,EAAgB,MAAK,MAAkB,EAAe,SAAS,CAAM,CACrF,IACF,EAAU,KAAK,CAAM,IAErB,EAAY,KAAK,CAAM;CAI3B,KAAK,IAAM,KAAU,GAEnB,AAD0B,EAAgB,MAAK,MAAkB,EAAe,SAAS,CAAM,CAC1F,KACH,EAAS,KAAK,CAAM;CAIxB,OAAO;EACL,eAAe;EACf;EACA;EACA;CACF;AACF;AAEA,eAAsB,EACpB,GACA,GAC2B;CAC3B,IAAM,IAAQ,EAAQ,QAAQ,OACxB,IAAU,EAAM;CAEtB,IAAI,CAAC,KAAW,OAAO,EAAQ,QAAS,YACtC,OAAO,EAAc,GAAO,CAAO;CAGrC,IAAI;EACF,MAAM,EAAQ,KAAK,EAAQ,IAAI,CAAC;CAClC,QAAQ,CAER;CAEA,IAAM,IAAgB,EAAc,GAAO,CAAO,GAC5C,oBAAkB,IAAI,IAAgC;CAE5D,EAAgB,IAAI,EAAQ,IAAI,CAAC,CAAC,OAAO,EAAQ,IAAI,CAAC;CAEtD,KAAK,IAAM,KAAU,CAAC,GAAG,EAAc,eAAe,GAAG,EAAc,QAAQ,GAC7E,EAAgB,IAAI,EAAO,IAAI,CAAC,CAAC,OAAO,EAAO,IAAI,CAAC;CAGtD,IAAM,IAAqB,EAAM,mBAAmB,KAAA,GAAW,EAAG,KAAK,OAAO,GAAG,CAAO;CACxF,KAAK,IAAM,KAAa,GAAoB;EAC1C,IAAM,IAAM,EAAU;EACtB,AAAI,GAAK,SACP,EAAgB,IAAI,EAAI,OAAO,CAAG;CAEtC;CAEA,KAAK,IAAM,KAAU,EAAgB,OAAO,GAC1C,IAAI;EACF,MAAM,EAAQ,KAAK,CAAM;CAC3B,QAAQ,CAER;CAGF,OAAO,EAAc,GAAO,CAAO;AACrC"}
1
+ {"version":3,"file":"triage.esm.js","names":[],"sources":["../../src/social/triage.ts"],"sourcesContent":["import { DataBrowserContext } from 'pane-registry'\nimport { IndexedFormula, NamedNode } from 'rdflib'\nimport { ns } from 'solid-ui'\n\ntype FriendshipStore = IndexedFormula & {\n fetcher?: {\n load?: (target: NamedNode | string) => Promise<unknown>\n }\n}\n\nexport interface FriendshipTriage {\n acquaintances: NamedNode[]\n confirmed: NamedNode[]\n unconfirmed: NamedNode[]\n requests: NamedNode[]\n}\n\nfunction uniqueNamedNodes (nodes: NamedNode[]): NamedNode[] {\n const seen = new Set<string>()\n const unique: NamedNode[] = []\n\n for (const node of nodes) {\n const key = node?.value\n if (!key || seen.has(key)) continue\n seen.add(key)\n unique.push(node)\n }\n\n return unique\n}\n\nexport function triageFriends (store: FriendshipStore, subject: NamedNode): FriendshipTriage {\n const outgoingFriends = uniqueNamedNodes(store.each(subject, ns.foaf('knows')) as NamedNode[])\n const incomingFriends = uniqueNamedNodes(\n store.each(undefined, ns.foaf('knows'), subject) as NamedNode[]\n )\n const confirmed: NamedNode[] = []\n const unconfirmed: NamedNode[] = []\n const requests: NamedNode[] = []\n\n for (const friend of outgoingFriends) {\n const isConfirmed = incomingFriends.some(incomingFriend => incomingFriend.sameTerm(friend))\n if (isConfirmed) {\n confirmed.push(friend)\n } else {\n unconfirmed.push(friend)\n }\n }\n\n for (const friend of incomingFriends) {\n const isAlreadyOutgoing = outgoingFriends.some(outgoingFriend => outgoingFriend.sameTerm(friend))\n if (!isAlreadyOutgoing) {\n requests.push(friend)\n }\n }\n\n return {\n acquaintances: outgoingFriends,\n confirmed,\n unconfirmed,\n requests\n }\n}\n\nexport async function loadFriendshipTriage (\n context: DataBrowserContext,\n subject: NamedNode\n): Promise<FriendshipTriage> {\n const store = context.session.store as FriendshipStore\n const fetcher = store.fetcher\n\n if (!fetcher || typeof fetcher.load !== 'function') {\n return triageFriends(store, subject)\n }\n\n try {\n await fetcher.load(subject.doc())\n } catch {\n // Continue with the store snapshot we already have.\n }\n\n const initialTriage = triageFriends(store, subject)\n const documentsToLoad = new Map<string, NamedNode | string>()\n\n documentsToLoad.set(subject.doc().value, subject.doc())\n\n for (const friend of [...initialTriage.acquaintances, ...initialTriage.requests]) {\n documentsToLoad.set(friend.doc().value, friend.doc())\n }\n\n const incomingStatements = store.statementsMatching(undefined, ns.foaf('knows'), subject)\n for (const statement of incomingStatements) {\n const why = statement.why as NamedNode | undefined\n if (why?.value) {\n documentsToLoad.set(why.value, why)\n }\n }\n\n for (const target of documentsToLoad.values()) {\n try {\n await fetcher.load(target)\n } catch {\n // Keep partial results when one profile document fails to load.\n }\n }\n\n return triageFriends(store, subject)\n}\n"],"mappings":";;AAiBA,SAAS,EAAkB,GAAiC;CAC1D,IAAM,oBAAO,IAAI,IAAY,GACvB,IAAsB,CAAC;CAE7B,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAM,IAAM,GAAM;EACd,AAAC,KAAO,GAAK,IAAI,CAAG,MACxB,EAAK,IAAI,CAAG,GACZ,EAAO,KAAK,CAAI;CAClB;CAEA,OAAO;AACT;AAEA,SAAgB,EAAe,GAAwB,GAAsC;CAC3F,IAAM,IAAkB,EAAiB,EAAM,KAAK,GAAS,EAAG,KAAK,OAAO,CAAC,CAAgB,GACvF,IAAkB,EACtB,EAAM,KAAK,KAAA,GAAW,EAAG,KAAK,OAAO,GAAG,CAAO,CACjD,GACM,IAAyB,CAAC,GAC1B,IAA2B,CAAC,GAC5B,IAAwB,CAAC;CAE/B,KAAK,IAAM,KAAU,GAEnB,AADoB,EAAgB,MAAK,MAAkB,EAAe,SAAS,CAAM,CACrF,IACF,EAAU,KAAK,CAAM,IAErB,EAAY,KAAK,CAAM;CAI3B,KAAK,IAAM,KAAU,GAEnB,AAD0B,EAAgB,MAAK,MAAkB,EAAe,SAAS,CAAM,CAC1F,KACH,EAAS,KAAK,CAAM;CAIxB,OAAO;EACL,eAAe;EACf;EACA;EACA;CACF;AACF;AAEA,eAAsB,EACpB,GACA,GAC2B;CAC3B,IAAM,IAAQ,EAAQ,QAAQ,OACxB,IAAU,EAAM;CAEtB,IAAI,CAAC,KAAW,OAAO,EAAQ,QAAS,YACtC,OAAO,EAAc,GAAO,CAAO;CAGrC,IAAI;EACF,MAAM,EAAQ,KAAK,EAAQ,IAAI,CAAC;CAClC,QAAQ,CAER;CAEA,IAAM,IAAgB,EAAc,GAAO,CAAO,GAC5C,oBAAkB,IAAI,IAAgC;CAE5D,EAAgB,IAAI,EAAQ,IAAI,CAAC,CAAC,OAAO,EAAQ,IAAI,CAAC;CAEtD,KAAK,IAAM,KAAU,CAAC,GAAG,EAAc,eAAe,GAAG,EAAc,QAAQ,GAC7E,EAAgB,IAAI,EAAO,IAAI,CAAC,CAAC,OAAO,EAAO,IAAI,CAAC;CAGtD,IAAM,IAAqB,EAAM,mBAAmB,KAAA,GAAW,EAAG,KAAK,OAAO,GAAG,CAAO;CACxF,KAAK,IAAM,KAAa,GAAoB;EAC1C,IAAM,IAAM,EAAU;EACtB,AAAI,GAAK,SACP,EAAgB,IAAI,EAAI,OAAO,CAAG;CAEtC;CAEA,KAAK,IAAM,KAAU,EAAgB,OAAO,GAC1C,IAAI;EACF,MAAM,EAAQ,KAAK,CAAM;CAC3B,QAAQ,CAER;CAGF,OAAO,EAAc,GAAO,CAAO;AACrC"}
@@ -1,4 +1,4 @@
1
- const e=require("../_virtual/_rolldown/runtime.cjs.js");let t=require("solid-ui");t=e.__toESM(t);var n=t.ns,r={icon:t.icons.iconBase+`noun_142708.svg`,name:`period`,audience:[n.solid(`PowerUser`)],label:function(e,t){return t.session.store.findTypeURIs(e)[`http://www.w3.org/2000/10/swap/pim/qif#Period`]?`period`:null},render:function(e,n){let r=n.dom,i=n.session.store,a=t.ns,o=r.createElement(`div`);o.setAttribute(`class`,`periodPane`);let s=function(e,t){t||=`color: grey;`;let n=r.createElement(`pre`);n.setAttribute(`style`,t),o.appendChild(n),n.appendChild(r.createTextNode(e))},c=function(e){return s(`✓ `+e,`color: #010; background-color: #efe`)},l=function(e){return s(e,`color: #100; background-color: #fee`)},u=function(){let s=i.any(e,a.cal(`dtstart`));s===void 0&&l(`(Error: There is no start date known for this period <`+e.uri+`>,
1
+ const e=require("../_virtual/_rolldown/runtime.cjs.js");let t=require("solid-ui");t=e.__toESM(t);var n=t.ns,r={icon:t.icons.iconBase+`noun_142708.svg`,name:`period`,audience:[n.solid(`PowerUser`)],label:function(e,t){return t.session.store.findTypeURIs(e)[`http://www.w3.org/2000/10/swap/pim/qif#Period`]?`Period`:null},render:function(e,n){let r=n.dom,i=n.session.store,a=t.ns,o=r.createElement(`div`);o.setAttribute(`class`,`periodPane`);let s=function(e,t){t||=`color: grey;`;let n=r.createElement(`pre`);n.setAttribute(`style`,t),o.appendChild(n),n.appendChild(r.createTextNode(e))},c=function(e){return s(`✓ `+e,`color: #010; background-color: #efe`)},l=function(e){return s(e,`color: #100; background-color: #fee`)},u=function(){let s=i.any(e,a.cal(`dtstart`));s===void 0&&l(`(Error: There is no start date known for this period <`+e.uri+`>,
2
2
  -- every period needs one.)`);let u=i.any(e,a.cal(`dtend`));u===void 0&&l(`(Error: There is no end date known for this period <`+e.uri+`>,
3
3
  -- every period needs one.)`);let d={};(function(e){d[e.uri]=!0})(a.rdf(`type`));let f=function(e){return!!(e&&e>=s&&e<u)},p=function(e){let t=``+e;return t.indexOf(`.`)>=0?t.split(`.`)[0]+`.`+(t.split(`.`)[1]+`00`).slice(0,2):t+`.00`},m=function(e){return f(i.any(e,a.qu(`date`)))},h=function(e,t){let n=i.any(e,a.qu(`date`)),r=i.any(t,a.qu(`date`));if(n!==void 0&&r!==void 0){if(n.value<r.value)return-1;if(n.value>r.value)return 1}return e.uri<t.uri?-1:+(e.uri>t.uri)},g=o.appendChild(r.createElement(`h2`));g.textContent=`Period `+s.value.slice(0,10)+` - `+u.value.slice(0,10);let _=function(e,t,n){let r=e.session.paneRegistry.byName(n).render(t,e);return r.setAttribute(`style`,`border: 0.1em solid green;`),r},v=function(e,t,r,i,a){let o=t.parentNode.children;if(a)for(let e=o.length-1;e>=0;e--)o[e].expanded&&(o[e].parentNode.removeChild(o[e].expanded),o[e].expanded=!1);let s=e.createElement(`tr`),c=s.appendChild(e.createElement(`td`));c.setAttribute(`style`,`width: 98%; padding: 1em; border: 0.1em solid grey;`);let l=t.children.length;t.nextSibling?t.parentNode.insertBefore(s,t.nextSibling):t.parentNode.appendChild(s),t.expanded=s,c.setAttribute(`colspan`,``+l),c.appendChild(_(n,r,i))},y=function(e,t,n,r,i){t.expanded?(t.parentNode.removeChild(t.expanded),t.expanded=!1):v(e,t,n,r,i)},b=function(e,n){let r=e.createElement(`table`);r.setAttribute(`style`,`margin-left: 100; font-size: 9pt; width: 85%;`);let o=function(e,n){let r=e.createElement(`tr`);(function(e,n){let r=`margin-left: 8em; padding-left: 5em;`;if(n){let e=i.any(n,t.ns.ui(`backgroundColor`));e&&(r+=`background-color: `+e.value+`; `)}e.setAttribute(`style`,r)})(r,i.any(n,a.qu(`toAccount`)));let o=r.appendChild(e.createElement(`td`)),s=i.any(n,a.qu(`date`));o.textContent=s?s.value.slice(0,10):`???`,o.setAttribute(`style`,`width: 7em;`);let c=r.appendChild(e.createElement(`td`));c.setAttribute(`style`,`width: 36em;`);let l=i.any(n,a.qu(`payee`));c.textContent=l?l.value:`???`;let u=c.appendChild(e.createElement(`a`));u.textContent=` ➜`,u.setAttribute(`href`,n.uri);let d=r.appendChild(e.createElement(`td`)),f=i.any(n,a.qu(`in_USD`));return d.textContent=f?p(f.value):`???`,d.setAttribute(`style`,`width: 6em; text-align: right; `),r.addEventListener(`click`,function(t){y(e,r,n,`transaction`,!t.shiftKey)},!1),r},s=n.filter(m);s.sort(h);for(let t=0;t<s.length;t++)r.appendChild(o(e,s[t]));return r},x={"http://www.w3.org/2000/10/swap/pim/qif#Transaction":!0,"http://www.w3.org/2000/10/swap/pim/qif#Unclassified":!0,"http://www.w3.org/2000/10/swap/pim/qif#UnclassifiedOutgoing":!0,"http://www.w3.org/2000/10/swap/pim/qif#UnclassifiedIncome":!0},S=i.findMemberURIs(a.qu(`Transaction`)),C=[],w=[],T,E;for(let e in S)if(Object.prototype.hasOwnProperty.call(S,e)){E=i.sym(e);let t=i.each(E,a.rdf(`type`)),n=!1;for(let e=0;e<t.length;e++)x[t[e].uri]===void 0&&(n=!0);n||(T=i.any(E,a.qu(`in_USD`)),T===void 0&&(T=i.any(E,a.qu(`amount`))),T&&(``+T.value).indexOf(`-`)>=0?w.push(i.sym(e)):C.push(i.sym(e)))}let D,O;C.length?(D=b(r,C),O=D.children.length,o.appendChild(r.createElement(`h3`)).textContent=`Unclassified Income`+(O<4?``:` (`+O+`)`),o.appendChild(D)):c(`No unclassified income`),w.length?(D=b(r,w),O=D.children.length,o.appendChild(r.createElement(`h3`)).textContent=`Unclassified Outgoings`+(O<4?``:` (`+O+`)`),o.appendChild(D)):c(`No unclassified outgoings `);let k=function(e){let t=i.findSubClassesNT(a.qu(`Transaction`));for(let n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&n.slice(1,-1).split(`#`)[1]===e)return i.sym(n.slice(1,-1));return null},A=function(e,n){let s=k(e),c,u=[],d=0;if(!s)return l(`Error: No category correspnding to `+e),null;let f=i.each(void 0,a.rdf(`type`),s);for(let e=0;e<f.length;e++)i.any(f[e],n)||u.push(f[e]);return u.length&&(c=b(r,u),d=c.children.length,o.appendChild(r.createElement(`h3`)).textContent=t.utils.label(s)+` with no `+t.utils.label(n)+(d<4?``:` (`+d+`)`),o.appendChild(c)),d};A(`Reimbursables`,a.trip(`trip`))===0&&c(`Reimbursables all have trips`),A(`Other_Inc_Speaking`,a.trip(`trip`))===0&&c(`Speaking income all has trips`)};if(i.findTypeURIs(e)[`http://www.w3.org/2000/10/swap/pim/qif#Period`]){let t=i.each(e,a.rdfs(`seeAlso`));console.log(`Loading before render: `+t.length),i.fetcher.load(t).then(function(){u()})}return o}};exports.default=r;
4
4
  //# sourceMappingURL=period.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"period.cjs.js","names":["UI"],"sources":["../../src/transaction/period.js"],"sourcesContent":["/* Financial Period Pane\n **\n ** This outline pane allows a user to interact with a period\n ** downloaded from a bank statement, annotting it with classes and comments,\n ** trips, etc\n */\n\nimport * as UI from 'solid-ui'\nconst ns = UI.ns\n\nexport default {\n icon: UI.icons.iconBase + 'noun_142708.svg',\n\n name: 'period',\n\n audience: [ns.solid('PowerUser')],\n\n // Does the subject deserve this pane?\n label: function (subject, context) {\n const kb = context.session.store\n const t = kb.findTypeURIs(subject)\n if (t['http://www.w3.org/2000/10/swap/pim/qif#Period']) return 'period'\n return null // No under other circumstances (while testing at least!)\n },\n\n render: function (subject, context) {\n const dom = context.dom\n const kb = context.session.store\n const ns = UI.ns\n\n const div = dom.createElement('div')\n div.setAttribute('class', 'periodPane')\n\n const mention = function mention (message, style) {\n if (!style) style = 'color: grey;'\n const pre = dom.createElement('pre')\n pre.setAttribute('style', style)\n div.appendChild(pre)\n pre.appendChild(dom.createTextNode(message))\n }\n const happy = function happy (message) {\n return mention('✓ ' + message, 'color: #010; background-color: #efe')\n }\n const complain = function complain (message) {\n return mention(message, 'color: #100; background-color: #fee')\n }\n /*\n var rerender = function (div) {\n var parent = div.parentNode\n var div2 = thisPane.render(subject, dom)\n parent.replaceChild(div2, div)\n }\n*/\n const renderPeriod = function () {\n const dtstart = kb.any(subject, ns.cal('dtstart'))\n if (dtstart === undefined) {\n complain(\n '(Error: There is no start date known for this period <' +\n subject.uri +\n '>,\\n -- every period needs one.)'\n )\n }\n\n const dtend = kb.any(subject, ns.cal('dtend'))\n if (dtend === undefined) {\n complain(\n '(Error: There is no end date known for this period <' +\n subject.uri +\n '>,\\n -- every period needs one.)'\n )\n }\n\n // var store = kb.any(subject, UI.ns.qu('annotationStore')) || null\n\n const predicateURIsDone = {}\n const donePredicate = function (pred) {\n predicateURIsDone[pred.uri] = true\n }\n donePredicate(ns.rdf('type'))\n\n const inPeriod = function (date) {\n return !!(date && date >= dtstart && date < dtend)\n }\n\n const d2 = function (n) {\n const s = '' + n\n if (s.indexOf('.') >= 0) {\n return s.split('.')[0] + '.' + (s.split('.')[1] + '00').slice(0, 2)\n }\n return s + '.00'\n }\n\n const transactionInPeriod = function (x) {\n return inPeriod(kb.any(x, ns.qu('date')))\n }\n\n const oderByDate = function (x, y) {\n const dx = kb.any(x, ns.qu('date'))\n const dy = kb.any(y, ns.qu('date'))\n if (dx !== undefined && dy !== undefined) {\n if (dx.value < dy.value) return -1\n if (dx.value > dy.value) return 1\n }\n if (x.uri < y.uri) return -1 // Arbitrary but repeatable\n if (x.uri > y.uri) return 1\n return 0\n }\n /*\n var setPaneStyle = function (account) {\n var mystyle = 'padding: 0.5em 1.5em 1em 1.5em; '\n if (account) {\n var backgroundColor = kb.any(account, UI.ns.ui('backgroundColor'))\n if (backgroundColor) {\n mystyle += 'background-color: ' + backgroundColor.value + '; '\n }\n }\n div.setAttribute('style', mystyle)\n }\n // setPaneStyle();\n*/\n const h2 = div.appendChild(dom.createElement('h2'))\n h2.textContent =\n 'Period ' +\n dtstart.value.slice(0, 10) +\n ' - ' +\n dtend.value.slice(0, 10)\n\n const insertedPane = function (context, subject, paneName) {\n const p = context.session.paneRegistry.byName(paneName)\n const d = p.render(subject, context)\n d.setAttribute('style', 'border: 0.1em solid green;')\n return d\n }\n\n const expandAfterRow = function (dom, row, subject, paneName, solo) {\n const siblings = row.parentNode.children\n if (solo) {\n for (let j = siblings.length - 1; j >= 0; j--) {\n if (siblings[j].expanded) {\n siblings[j].parentNode.removeChild(siblings[j].expanded)\n siblings[j].expanded = false\n }\n }\n }\n const tr = dom.createElement('tr')\n const td = tr.appendChild(dom.createElement('td'))\n td.setAttribute(\n 'style',\n 'width: 98%; padding: 1em; border: 0.1em solid grey;'\n )\n const cols = row.children.length\n if (row.nextSibling) {\n row.parentNode.insertBefore(tr, row.nextSibling)\n } else {\n row.parentNode.appendChild(tr)\n }\n row.expanded = tr\n td.setAttribute('colspan', '' + cols)\n td.appendChild(insertedPane(context, subject, paneName))\n }\n\n const expandAfterRowOrCollapse = function (\n dom,\n row,\n subject,\n paneName,\n solo\n ) {\n if (row.expanded) {\n row.parentNode.removeChild(row.expanded)\n row.expanded = false\n } else {\n expandAfterRow(dom, row, subject, paneName, solo)\n }\n }\n\n const transactionTable = function (dom, list) {\n const table = dom.createElement('table')\n table.setAttribute(\n 'style',\n 'margin-left: 100; font-size: 9pt; width: 85%;'\n )\n const transactionRow = function (dom, x) {\n const tr = dom.createElement('tr')\n\n const setTRStyle = function (tr, account) {\n // var mystyle = \"padding: 0.5em 1.5em 1em 1.5em; \";\n let mystyle = 'margin-left: 8em; padding-left: 5em;'\n if (account) {\n const backgroundColor = kb.any(account, UI.ns.ui('backgroundColor'))\n if (backgroundColor) {\n mystyle += 'background-color: ' + backgroundColor.value + '; '\n }\n }\n tr.setAttribute('style', mystyle)\n }\n\n const account = kb.any(x, ns.qu('toAccount'))\n setTRStyle(tr, account)\n\n const c0 = tr.appendChild(dom.createElement('td'))\n const date = kb.any(x, ns.qu('date'))\n c0.textContent = date ? date.value.slice(0, 10) : '???'\n c0.setAttribute('style', 'width: 7em;')\n\n const c1 = tr.appendChild(dom.createElement('td'))\n c1.setAttribute('style', 'width: 36em;')\n const payee = kb.any(x, ns.qu('payee'))\n c1.textContent = payee ? payee.value : '???'\n const a1 = c1.appendChild(dom.createElement('a'))\n a1.textContent = ' ➜'\n a1.setAttribute('href', x.uri)\n\n const c3 = tr.appendChild(dom.createElement('td'))\n const amount = kb.any(x, ns.qu('in_USD'))\n c3.textContent = amount ? d2(amount.value) : '???'\n c3.setAttribute('style', 'width: 6em; text-align: right; ') // @@ decimal alignment?\n tr.addEventListener(\n 'click',\n function (e) {\n // solo unless shift key\n expandAfterRowOrCollapse(dom, tr, x, 'transaction', !e.shiftKey)\n },\n false\n )\n\n return tr\n }\n\n const list2 = list.filter(transactionInPeriod)\n list2.sort(oderByDate)\n\n for (let i = 0; i < list2.length; i++) {\n table.appendChild(transactionRow(dom, list2[i]))\n }\n return table\n }\n\n // List unclassified transactions\n\n const dummies = {\n 'http://www.w3.org/2000/10/swap/pim/qif#Transaction': true, // (we knew)\n 'http://www.w3.org/2000/10/swap/pim/qif#Unclassified': true, // pseudo classifications we may phase out\n 'http://www.w3.org/2000/10/swap/pim/qif#UnclassifiedOutgoing': true,\n 'http://www.w3.org/2000/10/swap/pim/qif#UnclassifiedIncome': true\n }\n const xURIs = kb.findMemberURIs(ns.qu('Transaction'))\n const unclassifiedIn = []\n const unclassifiedOut = []\n let usd, z\n for (const y in xURIs) {\n // For each thing which can be inferred to be a transaction\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(xURIs, y)) {\n z = kb.sym(y)\n const tt = kb.each(z, ns.rdf('type')) // What EXPLICIT definitions\n let classified = false\n for (let j = 0; j < tt.length; j++) {\n const t = tt[j]\n if (dummies[t.uri] === undefined) {\n classified = true\n }\n }\n if (!classified) {\n usd = kb.any(z, ns.qu('in_USD'))\n if (usd === undefined) {\n usd = kb.any(z, ns.qu('amount'))\n }\n if (usd && ('' + usd.value).indexOf('-') >= 0) {\n unclassifiedOut.push(kb.sym(y))\n } else {\n unclassifiedIn.push(kb.sym(y))\n }\n }\n }\n }\n let tab, count\n if (unclassifiedIn.length) {\n tab = transactionTable(dom, unclassifiedIn)\n count = tab.children.length\n div.appendChild(dom.createElement('h3')).textContent =\n 'Unclassified Income' + (count < 4 ? '' : ' (' + count + ')')\n div.appendChild(tab)\n } else {\n happy('No unclassified income')\n }\n if (unclassifiedOut.length) {\n tab = transactionTable(dom, unclassifiedOut)\n count = tab.children.length\n div.appendChild(dom.createElement('h3')).textContent =\n 'Unclassified Outgoings' + (count < 4 ? '' : ' (' + count + ')')\n div.appendChild(tab)\n } else {\n happy('No unclassified outgoings ')\n }\n\n // /////////////// Check some categories of transaction for having given fields\n\n const catSymbol = function (catTail) {\n const cats = kb.findSubClassesNT(ns.qu('Transaction'))\n for (const cat in cats) {\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(cats, cat)) {\n if (cat.slice(1, -1).split('#')[1] === catTail) {\n return kb.sym(cat.slice(1, -1))\n }\n }\n }\n return null\n }\n\n const checkCatHasField = function (catTail, pred) {\n const cat = catSymbol(catTail)\n let tab\n const guilty = []\n let count = 0\n if (!cat) {\n complain('Error: No category correspnding to ' + catTail)\n return null\n }\n const list = kb.each(undefined, ns.rdf('type'), cat)\n for (let i = 0; i < list.length; i++) {\n if (!kb.any(list[i], pred)) {\n guilty.push(list[i])\n }\n }\n if (guilty.length) {\n tab = transactionTable(dom, guilty)\n count = tab.children.length\n div.appendChild(dom.createElement('h3')).textContent =\n UI.utils.label(cat) +\n ' with no ' +\n UI.utils.label(pred) +\n (count < 4 ? '' : ' (' + count + ')')\n div.appendChild(tab)\n }\n return count\n }\n\n // Load dynamically as properties of period\n if (checkCatHasField('Reimbursables', ns.trip('trip')) === 0) {\n happy('Reimbursables all have trips')\n }\n if (checkCatHasField('Other_Inc_Speaking', ns.trip('trip')) === 0) {\n happy('Speaking income all has trips')\n }\n // end of render period instance\n } // renderPeriod\n\n // //////////////////////////////////////////////////////////////////////////////\n\n // var me = authn.currentUser()\n\n // Render a single Period\n\n // This works only if enough metadata about the properties can drive the RDFS\n // (or actual type statements whichtypically are NOT there on)\n const t = kb.findTypeURIs(subject)\n if (t['http://www.w3.org/2000/10/swap/pim/qif#Period']) {\n const needed = kb.each(subject, ns.rdfs('seeAlso'))\n console.log('Loading before render: ' + needed.length)\n kb.fetcher.load(needed).then(function () {\n renderPeriod()\n })\n }\n\n // if (!me) complain(\"You do not have your Web Id set. Set your Web ID to make changes.\");\n\n return div\n }\n}\n// ends\n"],"mappings":"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"}
1
+ {"version":3,"file":"period.cjs.js","names":["UI"],"sources":["../../src/transaction/period.js"],"sourcesContent":["/* Financial Period Pane\n **\n ** This outline pane allows a user to interact with a period\n ** downloaded from a bank statement, annotting it with classes and comments,\n ** trips, etc\n */\n\nimport * as UI from 'solid-ui'\nconst ns = UI.ns\n\nexport default {\n icon: UI.icons.iconBase + 'noun_142708.svg',\n\n name: 'period',\n\n audience: [ns.solid('PowerUser')],\n\n // Does the subject deserve this pane?\n label: function (subject, context) {\n const kb = context.session.store\n const t = kb.findTypeURIs(subject)\n if (t['http://www.w3.org/2000/10/swap/pim/qif#Period']) return 'Period'\n return null // No under other circumstances (while testing at least!)\n },\n\n render: function (subject, context) {\n const dom = context.dom\n const kb = context.session.store\n const ns = UI.ns\n\n const div = dom.createElement('div')\n div.setAttribute('class', 'periodPane')\n\n const mention = function mention (message, style) {\n if (!style) style = 'color: grey;'\n const pre = dom.createElement('pre')\n pre.setAttribute('style', style)\n div.appendChild(pre)\n pre.appendChild(dom.createTextNode(message))\n }\n const happy = function happy (message) {\n return mention('✓ ' + message, 'color: #010; background-color: #efe')\n }\n const complain = function complain (message) {\n return mention(message, 'color: #100; background-color: #fee')\n }\n /*\n var rerender = function (div) {\n var parent = div.parentNode\n var div2 = thisPane.render(subject, dom)\n parent.replaceChild(div2, div)\n }\n*/\n const renderPeriod = function () {\n const dtstart = kb.any(subject, ns.cal('dtstart'))\n if (dtstart === undefined) {\n complain(\n '(Error: There is no start date known for this period <' +\n subject.uri +\n '>,\\n -- every period needs one.)'\n )\n }\n\n const dtend = kb.any(subject, ns.cal('dtend'))\n if (dtend === undefined) {\n complain(\n '(Error: There is no end date known for this period <' +\n subject.uri +\n '>,\\n -- every period needs one.)'\n )\n }\n\n // var store = kb.any(subject, UI.ns.qu('annotationStore')) || null\n\n const predicateURIsDone = {}\n const donePredicate = function (pred) {\n predicateURIsDone[pred.uri] = true\n }\n donePredicate(ns.rdf('type'))\n\n const inPeriod = function (date) {\n return !!(date && date >= dtstart && date < dtend)\n }\n\n const d2 = function (n) {\n const s = '' + n\n if (s.indexOf('.') >= 0) {\n return s.split('.')[0] + '.' + (s.split('.')[1] + '00').slice(0, 2)\n }\n return s + '.00'\n }\n\n const transactionInPeriod = function (x) {\n return inPeriod(kb.any(x, ns.qu('date')))\n }\n\n const oderByDate = function (x, y) {\n const dx = kb.any(x, ns.qu('date'))\n const dy = kb.any(y, ns.qu('date'))\n if (dx !== undefined && dy !== undefined) {\n if (dx.value < dy.value) return -1\n if (dx.value > dy.value) return 1\n }\n if (x.uri < y.uri) return -1 // Arbitrary but repeatable\n if (x.uri > y.uri) return 1\n return 0\n }\n /*\n var setPaneStyle = function (account) {\n var mystyle = 'padding: 0.5em 1.5em 1em 1.5em; '\n if (account) {\n var backgroundColor = kb.any(account, UI.ns.ui('backgroundColor'))\n if (backgroundColor) {\n mystyle += 'background-color: ' + backgroundColor.value + '; '\n }\n }\n div.setAttribute('style', mystyle)\n }\n // setPaneStyle();\n*/\n const h2 = div.appendChild(dom.createElement('h2'))\n h2.textContent =\n 'Period ' +\n dtstart.value.slice(0, 10) +\n ' - ' +\n dtend.value.slice(0, 10)\n\n const insertedPane = function (context, subject, paneName) {\n const p = context.session.paneRegistry.byName(paneName)\n const d = p.render(subject, context)\n d.setAttribute('style', 'border: 0.1em solid green;')\n return d\n }\n\n const expandAfterRow = function (dom, row, subject, paneName, solo) {\n const siblings = row.parentNode.children\n if (solo) {\n for (let j = siblings.length - 1; j >= 0; j--) {\n if (siblings[j].expanded) {\n siblings[j].parentNode.removeChild(siblings[j].expanded)\n siblings[j].expanded = false\n }\n }\n }\n const tr = dom.createElement('tr')\n const td = tr.appendChild(dom.createElement('td'))\n td.setAttribute(\n 'style',\n 'width: 98%; padding: 1em; border: 0.1em solid grey;'\n )\n const cols = row.children.length\n if (row.nextSibling) {\n row.parentNode.insertBefore(tr, row.nextSibling)\n } else {\n row.parentNode.appendChild(tr)\n }\n row.expanded = tr\n td.setAttribute('colspan', '' + cols)\n td.appendChild(insertedPane(context, subject, paneName))\n }\n\n const expandAfterRowOrCollapse = function (\n dom,\n row,\n subject,\n paneName,\n solo\n ) {\n if (row.expanded) {\n row.parentNode.removeChild(row.expanded)\n row.expanded = false\n } else {\n expandAfterRow(dom, row, subject, paneName, solo)\n }\n }\n\n const transactionTable = function (dom, list) {\n const table = dom.createElement('table')\n table.setAttribute(\n 'style',\n 'margin-left: 100; font-size: 9pt; width: 85%;'\n )\n const transactionRow = function (dom, x) {\n const tr = dom.createElement('tr')\n\n const setTRStyle = function (tr, account) {\n // var mystyle = \"padding: 0.5em 1.5em 1em 1.5em; \";\n let mystyle = 'margin-left: 8em; padding-left: 5em;'\n if (account) {\n const backgroundColor = kb.any(account, UI.ns.ui('backgroundColor'))\n if (backgroundColor) {\n mystyle += 'background-color: ' + backgroundColor.value + '; '\n }\n }\n tr.setAttribute('style', mystyle)\n }\n\n const account = kb.any(x, ns.qu('toAccount'))\n setTRStyle(tr, account)\n\n const c0 = tr.appendChild(dom.createElement('td'))\n const date = kb.any(x, ns.qu('date'))\n c0.textContent = date ? date.value.slice(0, 10) : '???'\n c0.setAttribute('style', 'width: 7em;')\n\n const c1 = tr.appendChild(dom.createElement('td'))\n c1.setAttribute('style', 'width: 36em;')\n const payee = kb.any(x, ns.qu('payee'))\n c1.textContent = payee ? payee.value : '???'\n const a1 = c1.appendChild(dom.createElement('a'))\n a1.textContent = ' ➜'\n a1.setAttribute('href', x.uri)\n\n const c3 = tr.appendChild(dom.createElement('td'))\n const amount = kb.any(x, ns.qu('in_USD'))\n c3.textContent = amount ? d2(amount.value) : '???'\n c3.setAttribute('style', 'width: 6em; text-align: right; ') // @@ decimal alignment?\n tr.addEventListener(\n 'click',\n function (e) {\n // solo unless shift key\n expandAfterRowOrCollapse(dom, tr, x, 'transaction', !e.shiftKey)\n },\n false\n )\n\n return tr\n }\n\n const list2 = list.filter(transactionInPeriod)\n list2.sort(oderByDate)\n\n for (let i = 0; i < list2.length; i++) {\n table.appendChild(transactionRow(dom, list2[i]))\n }\n return table\n }\n\n // List unclassified transactions\n\n const dummies = {\n 'http://www.w3.org/2000/10/swap/pim/qif#Transaction': true, // (we knew)\n 'http://www.w3.org/2000/10/swap/pim/qif#Unclassified': true, // pseudo classifications we may phase out\n 'http://www.w3.org/2000/10/swap/pim/qif#UnclassifiedOutgoing': true,\n 'http://www.w3.org/2000/10/swap/pim/qif#UnclassifiedIncome': true\n }\n const xURIs = kb.findMemberURIs(ns.qu('Transaction'))\n const unclassifiedIn = []\n const unclassifiedOut = []\n let usd, z\n for (const y in xURIs) {\n // For each thing which can be inferred to be a transaction\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(xURIs, y)) {\n z = kb.sym(y)\n const tt = kb.each(z, ns.rdf('type')) // What EXPLICIT definitions\n let classified = false\n for (let j = 0; j < tt.length; j++) {\n const t = tt[j]\n if (dummies[t.uri] === undefined) {\n classified = true\n }\n }\n if (!classified) {\n usd = kb.any(z, ns.qu('in_USD'))\n if (usd === undefined) {\n usd = kb.any(z, ns.qu('amount'))\n }\n if (usd && ('' + usd.value).indexOf('-') >= 0) {\n unclassifiedOut.push(kb.sym(y))\n } else {\n unclassifiedIn.push(kb.sym(y))\n }\n }\n }\n }\n let tab, count\n if (unclassifiedIn.length) {\n tab = transactionTable(dom, unclassifiedIn)\n count = tab.children.length\n div.appendChild(dom.createElement('h3')).textContent =\n 'Unclassified Income' + (count < 4 ? '' : ' (' + count + ')')\n div.appendChild(tab)\n } else {\n happy('No unclassified income')\n }\n if (unclassifiedOut.length) {\n tab = transactionTable(dom, unclassifiedOut)\n count = tab.children.length\n div.appendChild(dom.createElement('h3')).textContent =\n 'Unclassified Outgoings' + (count < 4 ? '' : ' (' + count + ')')\n div.appendChild(tab)\n } else {\n happy('No unclassified outgoings ')\n }\n\n // /////////////// Check some categories of transaction for having given fields\n\n const catSymbol = function (catTail) {\n const cats = kb.findSubClassesNT(ns.qu('Transaction'))\n for (const cat in cats) {\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(cats, cat)) {\n if (cat.slice(1, -1).split('#')[1] === catTail) {\n return kb.sym(cat.slice(1, -1))\n }\n }\n }\n return null\n }\n\n const checkCatHasField = function (catTail, pred) {\n const cat = catSymbol(catTail)\n let tab\n const guilty = []\n let count = 0\n if (!cat) {\n complain('Error: No category correspnding to ' + catTail)\n return null\n }\n const list = kb.each(undefined, ns.rdf('type'), cat)\n for (let i = 0; i < list.length; i++) {\n if (!kb.any(list[i], pred)) {\n guilty.push(list[i])\n }\n }\n if (guilty.length) {\n tab = transactionTable(dom, guilty)\n count = tab.children.length\n div.appendChild(dom.createElement('h3')).textContent =\n UI.utils.label(cat) +\n ' with no ' +\n UI.utils.label(pred) +\n (count < 4 ? '' : ' (' + count + ')')\n div.appendChild(tab)\n }\n return count\n }\n\n // Load dynamically as properties of period\n if (checkCatHasField('Reimbursables', ns.trip('trip')) === 0) {\n happy('Reimbursables all have trips')\n }\n if (checkCatHasField('Other_Inc_Speaking', ns.trip('trip')) === 0) {\n happy('Speaking income all has trips')\n }\n // end of render period instance\n } // renderPeriod\n\n // //////////////////////////////////////////////////////////////////////////////\n\n // var me = authn.currentUser()\n\n // Render a single Period\n\n // This works only if enough metadata about the properties can drive the RDFS\n // (or actual type statements whichtypically are NOT there on)\n const t = kb.findTypeURIs(subject)\n if (t['http://www.w3.org/2000/10/swap/pim/qif#Period']) {\n const needed = kb.each(subject, ns.rdfs('seeAlso'))\n console.log('Loading before render: ' + needed.length)\n kb.fetcher.load(needed).then(function () {\n renderPeriod()\n })\n }\n\n // if (!me) complain(\"You do not have your Web Id set. Set your Web ID to make changes.\");\n\n return div\n }\n}\n// ends\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ var t = e.ns, n = {
5
5
  name: "period",
6
6
  audience: [t.solid("PowerUser")],
7
7
  label: function(e, t) {
8
- return t.session.store.findTypeURIs(e)["http://www.w3.org/2000/10/swap/pim/qif#Period"] ? "period" : null;
8
+ return t.session.store.findTypeURIs(e)["http://www.w3.org/2000/10/swap/pim/qif#Period"] ? "Period" : null;
9
9
  },
10
10
  render: function(t, n) {
11
11
  let r = n.dom, i = n.session.store, a = e.ns, o = r.createElement("div");
@@ -1 +1 @@
1
- {"version":3,"file":"period.esm.js","names":["ns"],"sources":["../../src/transaction/period.js"],"sourcesContent":["/* Financial Period Pane\n **\n ** This outline pane allows a user to interact with a period\n ** downloaded from a bank statement, annotting it with classes and comments,\n ** trips, etc\n */\n\nimport * as UI from 'solid-ui'\nconst ns = UI.ns\n\nexport default {\n icon: UI.icons.iconBase + 'noun_142708.svg',\n\n name: 'period',\n\n audience: [ns.solid('PowerUser')],\n\n // Does the subject deserve this pane?\n label: function (subject, context) {\n const kb = context.session.store\n const t = kb.findTypeURIs(subject)\n if (t['http://www.w3.org/2000/10/swap/pim/qif#Period']) return 'period'\n return null // No under other circumstances (while testing at least!)\n },\n\n render: function (subject, context) {\n const dom = context.dom\n const kb = context.session.store\n const ns = UI.ns\n\n const div = dom.createElement('div')\n div.setAttribute('class', 'periodPane')\n\n const mention = function mention (message, style) {\n if (!style) style = 'color: grey;'\n const pre = dom.createElement('pre')\n pre.setAttribute('style', style)\n div.appendChild(pre)\n pre.appendChild(dom.createTextNode(message))\n }\n const happy = function happy (message) {\n return mention('✓ ' + message, 'color: #010; background-color: #efe')\n }\n const complain = function complain (message) {\n return mention(message, 'color: #100; background-color: #fee')\n }\n /*\n var rerender = function (div) {\n var parent = div.parentNode\n var div2 = thisPane.render(subject, dom)\n parent.replaceChild(div2, div)\n }\n*/\n const renderPeriod = function () {\n const dtstart = kb.any(subject, ns.cal('dtstart'))\n if (dtstart === undefined) {\n complain(\n '(Error: There is no start date known for this period <' +\n subject.uri +\n '>,\\n -- every period needs one.)'\n )\n }\n\n const dtend = kb.any(subject, ns.cal('dtend'))\n if (dtend === undefined) {\n complain(\n '(Error: There is no end date known for this period <' +\n subject.uri +\n '>,\\n -- every period needs one.)'\n )\n }\n\n // var store = kb.any(subject, UI.ns.qu('annotationStore')) || null\n\n const predicateURIsDone = {}\n const donePredicate = function (pred) {\n predicateURIsDone[pred.uri] = true\n }\n donePredicate(ns.rdf('type'))\n\n const inPeriod = function (date) {\n return !!(date && date >= dtstart && date < dtend)\n }\n\n const d2 = function (n) {\n const s = '' + n\n if (s.indexOf('.') >= 0) {\n return s.split('.')[0] + '.' + (s.split('.')[1] + '00').slice(0, 2)\n }\n return s + '.00'\n }\n\n const transactionInPeriod = function (x) {\n return inPeriod(kb.any(x, ns.qu('date')))\n }\n\n const oderByDate = function (x, y) {\n const dx = kb.any(x, ns.qu('date'))\n const dy = kb.any(y, ns.qu('date'))\n if (dx !== undefined && dy !== undefined) {\n if (dx.value < dy.value) return -1\n if (dx.value > dy.value) return 1\n }\n if (x.uri < y.uri) return -1 // Arbitrary but repeatable\n if (x.uri > y.uri) return 1\n return 0\n }\n /*\n var setPaneStyle = function (account) {\n var mystyle = 'padding: 0.5em 1.5em 1em 1.5em; '\n if (account) {\n var backgroundColor = kb.any(account, UI.ns.ui('backgroundColor'))\n if (backgroundColor) {\n mystyle += 'background-color: ' + backgroundColor.value + '; '\n }\n }\n div.setAttribute('style', mystyle)\n }\n // setPaneStyle();\n*/\n const h2 = div.appendChild(dom.createElement('h2'))\n h2.textContent =\n 'Period ' +\n dtstart.value.slice(0, 10) +\n ' - ' +\n dtend.value.slice(0, 10)\n\n const insertedPane = function (context, subject, paneName) {\n const p = context.session.paneRegistry.byName(paneName)\n const d = p.render(subject, context)\n d.setAttribute('style', 'border: 0.1em solid green;')\n return d\n }\n\n const expandAfterRow = function (dom, row, subject, paneName, solo) {\n const siblings = row.parentNode.children\n if (solo) {\n for (let j = siblings.length - 1; j >= 0; j--) {\n if (siblings[j].expanded) {\n siblings[j].parentNode.removeChild(siblings[j].expanded)\n siblings[j].expanded = false\n }\n }\n }\n const tr = dom.createElement('tr')\n const td = tr.appendChild(dom.createElement('td'))\n td.setAttribute(\n 'style',\n 'width: 98%; padding: 1em; border: 0.1em solid grey;'\n )\n const cols = row.children.length\n if (row.nextSibling) {\n row.parentNode.insertBefore(tr, row.nextSibling)\n } else {\n row.parentNode.appendChild(tr)\n }\n row.expanded = tr\n td.setAttribute('colspan', '' + cols)\n td.appendChild(insertedPane(context, subject, paneName))\n }\n\n const expandAfterRowOrCollapse = function (\n dom,\n row,\n subject,\n paneName,\n solo\n ) {\n if (row.expanded) {\n row.parentNode.removeChild(row.expanded)\n row.expanded = false\n } else {\n expandAfterRow(dom, row, subject, paneName, solo)\n }\n }\n\n const transactionTable = function (dom, list) {\n const table = dom.createElement('table')\n table.setAttribute(\n 'style',\n 'margin-left: 100; font-size: 9pt; width: 85%;'\n )\n const transactionRow = function (dom, x) {\n const tr = dom.createElement('tr')\n\n const setTRStyle = function (tr, account) {\n // var mystyle = \"padding: 0.5em 1.5em 1em 1.5em; \";\n let mystyle = 'margin-left: 8em; padding-left: 5em;'\n if (account) {\n const backgroundColor = kb.any(account, UI.ns.ui('backgroundColor'))\n if (backgroundColor) {\n mystyle += 'background-color: ' + backgroundColor.value + '; '\n }\n }\n tr.setAttribute('style', mystyle)\n }\n\n const account = kb.any(x, ns.qu('toAccount'))\n setTRStyle(tr, account)\n\n const c0 = tr.appendChild(dom.createElement('td'))\n const date = kb.any(x, ns.qu('date'))\n c0.textContent = date ? date.value.slice(0, 10) : '???'\n c0.setAttribute('style', 'width: 7em;')\n\n const c1 = tr.appendChild(dom.createElement('td'))\n c1.setAttribute('style', 'width: 36em;')\n const payee = kb.any(x, ns.qu('payee'))\n c1.textContent = payee ? payee.value : '???'\n const a1 = c1.appendChild(dom.createElement('a'))\n a1.textContent = ' ➜'\n a1.setAttribute('href', x.uri)\n\n const c3 = tr.appendChild(dom.createElement('td'))\n const amount = kb.any(x, ns.qu('in_USD'))\n c3.textContent = amount ? d2(amount.value) : '???'\n c3.setAttribute('style', 'width: 6em; text-align: right; ') // @@ decimal alignment?\n tr.addEventListener(\n 'click',\n function (e) {\n // solo unless shift key\n expandAfterRowOrCollapse(dom, tr, x, 'transaction', !e.shiftKey)\n },\n false\n )\n\n return tr\n }\n\n const list2 = list.filter(transactionInPeriod)\n list2.sort(oderByDate)\n\n for (let i = 0; i < list2.length; i++) {\n table.appendChild(transactionRow(dom, list2[i]))\n }\n return table\n }\n\n // List unclassified transactions\n\n const dummies = {\n 'http://www.w3.org/2000/10/swap/pim/qif#Transaction': true, // (we knew)\n 'http://www.w3.org/2000/10/swap/pim/qif#Unclassified': true, // pseudo classifications we may phase out\n 'http://www.w3.org/2000/10/swap/pim/qif#UnclassifiedOutgoing': true,\n 'http://www.w3.org/2000/10/swap/pim/qif#UnclassifiedIncome': true\n }\n const xURIs = kb.findMemberURIs(ns.qu('Transaction'))\n const unclassifiedIn = []\n const unclassifiedOut = []\n let usd, z\n for (const y in xURIs) {\n // For each thing which can be inferred to be a transaction\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(xURIs, y)) {\n z = kb.sym(y)\n const tt = kb.each(z, ns.rdf('type')) // What EXPLICIT definitions\n let classified = false\n for (let j = 0; j < tt.length; j++) {\n const t = tt[j]\n if (dummies[t.uri] === undefined) {\n classified = true\n }\n }\n if (!classified) {\n usd = kb.any(z, ns.qu('in_USD'))\n if (usd === undefined) {\n usd = kb.any(z, ns.qu('amount'))\n }\n if (usd && ('' + usd.value).indexOf('-') >= 0) {\n unclassifiedOut.push(kb.sym(y))\n } else {\n unclassifiedIn.push(kb.sym(y))\n }\n }\n }\n }\n let tab, count\n if (unclassifiedIn.length) {\n tab = transactionTable(dom, unclassifiedIn)\n count = tab.children.length\n div.appendChild(dom.createElement('h3')).textContent =\n 'Unclassified Income' + (count < 4 ? '' : ' (' + count + ')')\n div.appendChild(tab)\n } else {\n happy('No unclassified income')\n }\n if (unclassifiedOut.length) {\n tab = transactionTable(dom, unclassifiedOut)\n count = tab.children.length\n div.appendChild(dom.createElement('h3')).textContent =\n 'Unclassified Outgoings' + (count < 4 ? '' : ' (' + count + ')')\n div.appendChild(tab)\n } else {\n happy('No unclassified outgoings ')\n }\n\n // /////////////// Check some categories of transaction for having given fields\n\n const catSymbol = function (catTail) {\n const cats = kb.findSubClassesNT(ns.qu('Transaction'))\n for (const cat in cats) {\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(cats, cat)) {\n if (cat.slice(1, -1).split('#')[1] === catTail) {\n return kb.sym(cat.slice(1, -1))\n }\n }\n }\n return null\n }\n\n const checkCatHasField = function (catTail, pred) {\n const cat = catSymbol(catTail)\n let tab\n const guilty = []\n let count = 0\n if (!cat) {\n complain('Error: No category correspnding to ' + catTail)\n return null\n }\n const list = kb.each(undefined, ns.rdf('type'), cat)\n for (let i = 0; i < list.length; i++) {\n if (!kb.any(list[i], pred)) {\n guilty.push(list[i])\n }\n }\n if (guilty.length) {\n tab = transactionTable(dom, guilty)\n count = tab.children.length\n div.appendChild(dom.createElement('h3')).textContent =\n UI.utils.label(cat) +\n ' with no ' +\n UI.utils.label(pred) +\n (count < 4 ? '' : ' (' + count + ')')\n div.appendChild(tab)\n }\n return count\n }\n\n // Load dynamically as properties of period\n if (checkCatHasField('Reimbursables', ns.trip('trip')) === 0) {\n happy('Reimbursables all have trips')\n }\n if (checkCatHasField('Other_Inc_Speaking', ns.trip('trip')) === 0) {\n happy('Speaking income all has trips')\n }\n // end of render period instance\n } // renderPeriod\n\n // //////////////////////////////////////////////////////////////////////////////\n\n // var me = authn.currentUser()\n\n // Render a single Period\n\n // This works only if enough metadata about the properties can drive the RDFS\n // (or actual type statements whichtypically are NOT there on)\n const t = kb.findTypeURIs(subject)\n if (t['http://www.w3.org/2000/10/swap/pim/qif#Period']) {\n const needed = kb.each(subject, ns.rdfs('seeAlso'))\n console.log('Loading before render: ' + needed.length)\n kb.fetcher.load(needed).then(function () {\n renderPeriod()\n })\n }\n\n // if (!me) complain(\"You do not have your Web Id set. Set your Web ID to make changes.\");\n\n return div\n }\n}\n// ends\n"],"mappings":"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"}
1
+ {"version":3,"file":"period.esm.js","names":["ns"],"sources":["../../src/transaction/period.js"],"sourcesContent":["/* Financial Period Pane\n **\n ** This outline pane allows a user to interact with a period\n ** downloaded from a bank statement, annotting it with classes and comments,\n ** trips, etc\n */\n\nimport * as UI from 'solid-ui'\nconst ns = UI.ns\n\nexport default {\n icon: UI.icons.iconBase + 'noun_142708.svg',\n\n name: 'period',\n\n audience: [ns.solid('PowerUser')],\n\n // Does the subject deserve this pane?\n label: function (subject, context) {\n const kb = context.session.store\n const t = kb.findTypeURIs(subject)\n if (t['http://www.w3.org/2000/10/swap/pim/qif#Period']) return 'Period'\n return null // No under other circumstances (while testing at least!)\n },\n\n render: function (subject, context) {\n const dom = context.dom\n const kb = context.session.store\n const ns = UI.ns\n\n const div = dom.createElement('div')\n div.setAttribute('class', 'periodPane')\n\n const mention = function mention (message, style) {\n if (!style) style = 'color: grey;'\n const pre = dom.createElement('pre')\n pre.setAttribute('style', style)\n div.appendChild(pre)\n pre.appendChild(dom.createTextNode(message))\n }\n const happy = function happy (message) {\n return mention('✓ ' + message, 'color: #010; background-color: #efe')\n }\n const complain = function complain (message) {\n return mention(message, 'color: #100; background-color: #fee')\n }\n /*\n var rerender = function (div) {\n var parent = div.parentNode\n var div2 = thisPane.render(subject, dom)\n parent.replaceChild(div2, div)\n }\n*/\n const renderPeriod = function () {\n const dtstart = kb.any(subject, ns.cal('dtstart'))\n if (dtstart === undefined) {\n complain(\n '(Error: There is no start date known for this period <' +\n subject.uri +\n '>,\\n -- every period needs one.)'\n )\n }\n\n const dtend = kb.any(subject, ns.cal('dtend'))\n if (dtend === undefined) {\n complain(\n '(Error: There is no end date known for this period <' +\n subject.uri +\n '>,\\n -- every period needs one.)'\n )\n }\n\n // var store = kb.any(subject, UI.ns.qu('annotationStore')) || null\n\n const predicateURIsDone = {}\n const donePredicate = function (pred) {\n predicateURIsDone[pred.uri] = true\n }\n donePredicate(ns.rdf('type'))\n\n const inPeriod = function (date) {\n return !!(date && date >= dtstart && date < dtend)\n }\n\n const d2 = function (n) {\n const s = '' + n\n if (s.indexOf('.') >= 0) {\n return s.split('.')[0] + '.' + (s.split('.')[1] + '00').slice(0, 2)\n }\n return s + '.00'\n }\n\n const transactionInPeriod = function (x) {\n return inPeriod(kb.any(x, ns.qu('date')))\n }\n\n const oderByDate = function (x, y) {\n const dx = kb.any(x, ns.qu('date'))\n const dy = kb.any(y, ns.qu('date'))\n if (dx !== undefined && dy !== undefined) {\n if (dx.value < dy.value) return -1\n if (dx.value > dy.value) return 1\n }\n if (x.uri < y.uri) return -1 // Arbitrary but repeatable\n if (x.uri > y.uri) return 1\n return 0\n }\n /*\n var setPaneStyle = function (account) {\n var mystyle = 'padding: 0.5em 1.5em 1em 1.5em; '\n if (account) {\n var backgroundColor = kb.any(account, UI.ns.ui('backgroundColor'))\n if (backgroundColor) {\n mystyle += 'background-color: ' + backgroundColor.value + '; '\n }\n }\n div.setAttribute('style', mystyle)\n }\n // setPaneStyle();\n*/\n const h2 = div.appendChild(dom.createElement('h2'))\n h2.textContent =\n 'Period ' +\n dtstart.value.slice(0, 10) +\n ' - ' +\n dtend.value.slice(0, 10)\n\n const insertedPane = function (context, subject, paneName) {\n const p = context.session.paneRegistry.byName(paneName)\n const d = p.render(subject, context)\n d.setAttribute('style', 'border: 0.1em solid green;')\n return d\n }\n\n const expandAfterRow = function (dom, row, subject, paneName, solo) {\n const siblings = row.parentNode.children\n if (solo) {\n for (let j = siblings.length - 1; j >= 0; j--) {\n if (siblings[j].expanded) {\n siblings[j].parentNode.removeChild(siblings[j].expanded)\n siblings[j].expanded = false\n }\n }\n }\n const tr = dom.createElement('tr')\n const td = tr.appendChild(dom.createElement('td'))\n td.setAttribute(\n 'style',\n 'width: 98%; padding: 1em; border: 0.1em solid grey;'\n )\n const cols = row.children.length\n if (row.nextSibling) {\n row.parentNode.insertBefore(tr, row.nextSibling)\n } else {\n row.parentNode.appendChild(tr)\n }\n row.expanded = tr\n td.setAttribute('colspan', '' + cols)\n td.appendChild(insertedPane(context, subject, paneName))\n }\n\n const expandAfterRowOrCollapse = function (\n dom,\n row,\n subject,\n paneName,\n solo\n ) {\n if (row.expanded) {\n row.parentNode.removeChild(row.expanded)\n row.expanded = false\n } else {\n expandAfterRow(dom, row, subject, paneName, solo)\n }\n }\n\n const transactionTable = function (dom, list) {\n const table = dom.createElement('table')\n table.setAttribute(\n 'style',\n 'margin-left: 100; font-size: 9pt; width: 85%;'\n )\n const transactionRow = function (dom, x) {\n const tr = dom.createElement('tr')\n\n const setTRStyle = function (tr, account) {\n // var mystyle = \"padding: 0.5em 1.5em 1em 1.5em; \";\n let mystyle = 'margin-left: 8em; padding-left: 5em;'\n if (account) {\n const backgroundColor = kb.any(account, UI.ns.ui('backgroundColor'))\n if (backgroundColor) {\n mystyle += 'background-color: ' + backgroundColor.value + '; '\n }\n }\n tr.setAttribute('style', mystyle)\n }\n\n const account = kb.any(x, ns.qu('toAccount'))\n setTRStyle(tr, account)\n\n const c0 = tr.appendChild(dom.createElement('td'))\n const date = kb.any(x, ns.qu('date'))\n c0.textContent = date ? date.value.slice(0, 10) : '???'\n c0.setAttribute('style', 'width: 7em;')\n\n const c1 = tr.appendChild(dom.createElement('td'))\n c1.setAttribute('style', 'width: 36em;')\n const payee = kb.any(x, ns.qu('payee'))\n c1.textContent = payee ? payee.value : '???'\n const a1 = c1.appendChild(dom.createElement('a'))\n a1.textContent = ' ➜'\n a1.setAttribute('href', x.uri)\n\n const c3 = tr.appendChild(dom.createElement('td'))\n const amount = kb.any(x, ns.qu('in_USD'))\n c3.textContent = amount ? d2(amount.value) : '???'\n c3.setAttribute('style', 'width: 6em; text-align: right; ') // @@ decimal alignment?\n tr.addEventListener(\n 'click',\n function (e) {\n // solo unless shift key\n expandAfterRowOrCollapse(dom, tr, x, 'transaction', !e.shiftKey)\n },\n false\n )\n\n return tr\n }\n\n const list2 = list.filter(transactionInPeriod)\n list2.sort(oderByDate)\n\n for (let i = 0; i < list2.length; i++) {\n table.appendChild(transactionRow(dom, list2[i]))\n }\n return table\n }\n\n // List unclassified transactions\n\n const dummies = {\n 'http://www.w3.org/2000/10/swap/pim/qif#Transaction': true, // (we knew)\n 'http://www.w3.org/2000/10/swap/pim/qif#Unclassified': true, // pseudo classifications we may phase out\n 'http://www.w3.org/2000/10/swap/pim/qif#UnclassifiedOutgoing': true,\n 'http://www.w3.org/2000/10/swap/pim/qif#UnclassifiedIncome': true\n }\n const xURIs = kb.findMemberURIs(ns.qu('Transaction'))\n const unclassifiedIn = []\n const unclassifiedOut = []\n let usd, z\n for (const y in xURIs) {\n // For each thing which can be inferred to be a transaction\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(xURIs, y)) {\n z = kb.sym(y)\n const tt = kb.each(z, ns.rdf('type')) // What EXPLICIT definitions\n let classified = false\n for (let j = 0; j < tt.length; j++) {\n const t = tt[j]\n if (dummies[t.uri] === undefined) {\n classified = true\n }\n }\n if (!classified) {\n usd = kb.any(z, ns.qu('in_USD'))\n if (usd === undefined) {\n usd = kb.any(z, ns.qu('amount'))\n }\n if (usd && ('' + usd.value).indexOf('-') >= 0) {\n unclassifiedOut.push(kb.sym(y))\n } else {\n unclassifiedIn.push(kb.sym(y))\n }\n }\n }\n }\n let tab, count\n if (unclassifiedIn.length) {\n tab = transactionTable(dom, unclassifiedIn)\n count = tab.children.length\n div.appendChild(dom.createElement('h3')).textContent =\n 'Unclassified Income' + (count < 4 ? '' : ' (' + count + ')')\n div.appendChild(tab)\n } else {\n happy('No unclassified income')\n }\n if (unclassifiedOut.length) {\n tab = transactionTable(dom, unclassifiedOut)\n count = tab.children.length\n div.appendChild(dom.createElement('h3')).textContent =\n 'Unclassified Outgoings' + (count < 4 ? '' : ' (' + count + ')')\n div.appendChild(tab)\n } else {\n happy('No unclassified outgoings ')\n }\n\n // /////////////// Check some categories of transaction for having given fields\n\n const catSymbol = function (catTail) {\n const cats = kb.findSubClassesNT(ns.qu('Transaction'))\n for (const cat in cats) {\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(cats, cat)) {\n if (cat.slice(1, -1).split('#')[1] === catTail) {\n return kb.sym(cat.slice(1, -1))\n }\n }\n }\n return null\n }\n\n const checkCatHasField = function (catTail, pred) {\n const cat = catSymbol(catTail)\n let tab\n const guilty = []\n let count = 0\n if (!cat) {\n complain('Error: No category correspnding to ' + catTail)\n return null\n }\n const list = kb.each(undefined, ns.rdf('type'), cat)\n for (let i = 0; i < list.length; i++) {\n if (!kb.any(list[i], pred)) {\n guilty.push(list[i])\n }\n }\n if (guilty.length) {\n tab = transactionTable(dom, guilty)\n count = tab.children.length\n div.appendChild(dom.createElement('h3')).textContent =\n UI.utils.label(cat) +\n ' with no ' +\n UI.utils.label(pred) +\n (count < 4 ? '' : ' (' + count + ')')\n div.appendChild(tab)\n }\n return count\n }\n\n // Load dynamically as properties of period\n if (checkCatHasField('Reimbursables', ns.trip('trip')) === 0) {\n happy('Reimbursables all have trips')\n }\n if (checkCatHasField('Other_Inc_Speaking', ns.trip('trip')) === 0) {\n happy('Speaking income all has trips')\n }\n // end of render period instance\n } // renderPeriod\n\n // //////////////////////////////////////////////////////////////////////////////\n\n // var me = authn.currentUser()\n\n // Render a single Period\n\n // This works only if enough metadata about the properties can drive the RDFS\n // (or actual type statements whichtypically are NOT there on)\n const t = kb.findTypeURIs(subject)\n if (t['http://www.w3.org/2000/10/swap/pim/qif#Period']) {\n const needed = kb.each(subject, ns.rdfs('seeAlso'))\n console.log('Loading before render: ' + needed.length)\n kb.fetcher.load(needed).then(function () {\n renderPeriod()\n })\n }\n\n // if (!me) complain(\"You do not have your Web Id set. Set your Web ID to make changes.\");\n\n return div\n }\n}\n// ends\n"],"mappings":";;AAQA,IAAMA,IAAK,EAAG,IAEd,IAAe;CACb,MAAM,EAAG,MAAM,WAAW;CAE1B,MAAM;CAEN,UAAU,CAACA,EAAG,MAAM,WAAW,CAAC;CAGhC,OAAO,SAAU,GAAS,GAAS;EAIjC,OAHW,EAAQ,QAAQ,MACd,aAAa,CACtB,CAAC,CAAC,mDAAyD,WACxD;CACT;CAEA,QAAQ,SAAU,GAAS,GAAS;EAClC,IAAM,IAAM,EAAQ,KACd,IAAK,EAAQ,QAAQ,OACrB,IAAK,EAAG,IAER,IAAM,EAAI,cAAc,KAAK;EACnC,EAAI,aAAa,SAAS,YAAY;EAEtC,IAAM,IAAU,SAAkB,GAAS,GAAO;GAChD,AAAY,MAAQ;GACpB,IAAM,IAAM,EAAI,cAAc,KAAK;GAGnC,AAFA,EAAI,aAAa,SAAS,CAAK,GAC/B,EAAI,YAAY,CAAG,GACnB,EAAI,YAAY,EAAI,eAAe,CAAO,CAAC;EAC7C,GACM,IAAQ,SAAgB,GAAS;GACrC,OAAO,EAAQ,OAAO,GAAS,qCAAqC;EACtE,GACM,IAAW,SAAmB,GAAS;GAC3C,OAAO,EAAQ,GAAS,qCAAqC;EAC/D,GAQM,IAAe,WAAY;GAC/B,IAAM,IAAU,EAAG,IAAI,GAAS,EAAG,IAAI,SAAS,CAAC;GACjD,AAAI,MAAY,KAAA,KACd,EACE,2DACE,EAAQ,MACR,kCACJ;GAGF,IAAM,IAAQ,EAAG,IAAI,GAAS,EAAG,IAAI,OAAO,CAAC;GAC7C,AAAI,MAAU,KAAA,KACZ,EACE,yDACE,EAAQ,MACR,kCACJ;GAKF,IAAM,IAAoB,CAAC;GAI3B,UAHgC,GAAM;IACpC,EAAkB,EAAK,OAAO;GAChC,EACA,CAAc,EAAG,IAAI,MAAM,CAAC;GAE5B,IAAM,IAAW,SAAU,GAAM;IAC/B,OAAO,CAAC,EAAE,KAAQ,KAAQ,KAAW,IAAO;GAC9C,GAEM,IAAK,SAAU,GAAG;IACtB,IAAM,IAAI,KAAK;IAIf,OAHI,EAAE,QAAQ,GAAG,KAAK,IACb,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,KAAA,CAAM,MAAM,GAAG,CAAC,IAE7D,IAAI;GACb,GAEM,IAAsB,SAAU,GAAG;IACvC,OAAO,EAAS,EAAG,IAAI,GAAG,EAAG,GAAG,MAAM,CAAC,CAAC;GAC1C,GAEM,IAAa,SAAU,GAAG,GAAG;IACjC,IAAM,IAAK,EAAG,IAAI,GAAG,EAAG,GAAG,MAAM,CAAC,GAC5B,IAAK,EAAG,IAAI,GAAG,EAAG,GAAG,MAAM,CAAC;IAClC,IAAI,MAAO,KAAA,KAAa,MAAO,KAAA,GAAW;KACxC,IAAI,EAAG,QAAQ,EAAG,OAAO,OAAO;KAChC,IAAI,EAAG,QAAQ,EAAG,OAAO,OAAO;IAClC;IAGA,OAFI,EAAE,MAAM,EAAE,MAAY,KAC1B,EAAI,EAAE,MAAM,EAAE;GAEhB,GAcM,IAAK,EAAI,YAAY,EAAI,cAAc,IAAI,CAAC;GAClD,EAAG,cACD,YACA,EAAQ,MAAM,MAAM,GAAG,EAAE,IACzB,QACA,EAAM,MAAM,MAAM,GAAG,EAAE;GAEzB,IAAM,IAAe,SAAU,GAAS,GAAS,GAAU;IAEzD,IAAM,IADI,EAAQ,QAAQ,aAAa,OAAO,CACpC,CAAC,CAAC,OAAO,GAAS,CAAO;IAEnC,OADA,EAAE,aAAa,SAAS,4BAA4B,GAC7C;GACT,GAEM,IAAiB,SAAU,GAAK,GAAK,GAAS,GAAU,GAAM;IAClE,IAAM,IAAW,EAAI,WAAW;IAChC,IAAI,GACG,KAAA,IAAI,IAAI,EAAS,SAAS,GAAG,KAAK,GAAG,KACxC,AAAI,EAAS,EAAE,CAAC,aACd,EAAS,EAAE,CAAC,WAAW,YAAY,EAAS,EAAE,CAAC,QAAQ,GACvD,EAAS,EAAE,CAAC,WAAW;IAI7B,IAAM,IAAK,EAAI,cAAc,IAAI,GAC3B,IAAK,EAAG,YAAY,EAAI,cAAc,IAAI,CAAC;IACjD,EAAG,aACD,SACA,qDACF;IACA,IAAM,IAAO,EAAI,SAAS;IAQ1B,AAPI,EAAI,cACN,EAAI,WAAW,aAAa,GAAI,EAAI,WAAW,IAE/C,EAAI,WAAW,YAAY,CAAE,GAE/B,EAAI,WAAW,GACf,EAAG,aAAa,WAAW,KAAK,CAAI,GACpC,EAAG,YAAY,EAAa,GAAS,GAAS,CAAQ,CAAC;GACzD,GAEM,IAA2B,SAC/B,GACA,GACA,GACA,GACA,GACA;IACA,AAAI,EAAI,YACN,EAAI,WAAW,YAAY,EAAI,QAAQ,GACvC,EAAI,WAAW,MAEf,EAAe,GAAK,GAAK,GAAS,GAAU,CAAI;GAEpD,GAEM,IAAmB,SAAU,GAAK,GAAM;IAC5C,IAAM,IAAQ,EAAI,cAAc,OAAO;IACvC,EAAM,aACJ,SACA,+CACF;IACA,IAAM,IAAiB,SAAU,GAAK,GAAG;KACvC,IAAM,IAAK,EAAI,cAAc,IAAI;KAejC,UAb6B,GAAI,GAAS;MAExC,IAAI,IAAU;MACd,IAAI,GAAS;OACX,IAAM,IAAkB,EAAG,IAAI,GAAS,EAAG,GAAG,GAAG,iBAAiB,CAAC;OACnE,AAAI,MACF,KAAW,uBAAuB,EAAgB,QAAQ;MAE9D;MACA,EAAG,aAAa,SAAS,CAAO;KAClC,EAGA,CAAW,GADK,EAAG,IAAI,GAAG,EAAG,GAAG,WAAW,CACtB,CAAC;KAEtB,IAAM,IAAK,EAAG,YAAY,EAAI,cAAc,IAAI,CAAC,GAC3C,IAAO,EAAG,IAAI,GAAG,EAAG,GAAG,MAAM,CAAC;KAEpC,AADA,EAAG,cAAc,IAAO,EAAK,MAAM,MAAM,GAAG,EAAE,IAAI,OAClD,EAAG,aAAa,SAAS,aAAa;KAEtC,IAAM,IAAK,EAAG,YAAY,EAAI,cAAc,IAAI,CAAC;KACjD,EAAG,aAAa,SAAS,cAAc;KACvC,IAAM,IAAQ,EAAG,IAAI,GAAG,EAAG,GAAG,OAAO,CAAC;KACtC,EAAG,cAAc,IAAQ,EAAM,QAAQ;KACvC,IAAM,IAAK,EAAG,YAAY,EAAI,cAAc,GAAG,CAAC;KAEhD,AADA,EAAG,cAAc,MACjB,EAAG,aAAa,QAAQ,EAAE,GAAG;KAE7B,IAAM,IAAK,EAAG,YAAY,EAAI,cAAc,IAAI,CAAC,GAC3C,IAAS,EAAG,IAAI,GAAG,EAAG,GAAG,QAAQ,CAAC;KAYxC,OAXA,EAAG,cAAc,IAAS,EAAG,EAAO,KAAK,IAAI,OAC7C,EAAG,aAAa,SAAS,iCAAiC,GAC1D,EAAG,iBACD,SACA,SAAU,GAAG;MAEX,EAAyB,GAAK,GAAI,GAAG,eAAe,CAAC,EAAE,QAAQ;KACjE,GACA,EACF,GAEO;IACT,GAEM,IAAQ,EAAK,OAAO,CAAmB;IAC7C,EAAM,KAAK,CAAU;IAErB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAChC,EAAM,YAAY,EAAe,GAAK,EAAM,EAAE,CAAC;IAEjD,OAAO;GACT,GAIM,IAAU;IACd,sDAAsD;IACtD,uDAAuD;IACvD,+DAA+D;IAC/D,6DAA6D;GAC/D,GACM,IAAQ,EAAG,eAAe,EAAG,GAAG,aAAa,CAAC,GAC9C,IAAiB,CAAC,GAClB,IAAkB,CAAC,GACrB,GAAK;GACT,KAAK,IAAM,KAAK,GAId,IAAI,OAAO,UAAU,eAAe,KAAK,GAAO,CAAC,GAAG;IAClD,IAAI,EAAG,IAAI,CAAC;IACZ,IAAM,IAAK,EAAG,KAAK,GAAG,EAAG,IAAI,MAAM,CAAC,GAChC,IAAa;IACjB,KAAK,IAAI,IAAI,GAAG,IAAI,EAAG,QAAQ,KAE7B,AAAI,EADM,EAAG,EACA,CAAC,SAAS,KAAA,MACrB,IAAa;IAGjB,AAAK,MACH,IAAM,EAAG,IAAI,GAAG,EAAG,GAAG,QAAQ,CAAC,GAC3B,MAAQ,KAAA,MACV,IAAM,EAAG,IAAI,GAAG,EAAG,GAAG,QAAQ,CAAC,IAE7B,MAAQ,KAAK,EAAI,MAAA,CAAO,QAAQ,GAAG,KAAK,IAC1C,EAAgB,KAAK,EAAG,IAAI,CAAC,CAAC,IAE9B,EAAe,KAAK,EAAG,IAAI,CAAC,CAAC;GAGnC;GAEF,IAAI,GAAK;GAUT,AATI,EAAe,UACjB,IAAM,EAAiB,GAAK,CAAc,GAC1C,IAAQ,EAAI,SAAS,QACrB,EAAI,YAAY,EAAI,cAAc,IAAI,CAAC,CAAC,CAAC,cACvC,yBAAyB,IAAQ,IAAI,KAAK,OAAO,IAAQ,MAC3D,EAAI,YAAY,CAAG,KAEnB,EAAM,wBAAwB,GAE5B,EAAgB,UAClB,IAAM,EAAiB,GAAK,CAAe,GAC3C,IAAQ,EAAI,SAAS,QACrB,EAAI,YAAY,EAAI,cAAc,IAAI,CAAC,CAAC,CAAC,cACvC,4BAA4B,IAAQ,IAAI,KAAK,OAAO,IAAQ,MAC9D,EAAI,YAAY,CAAG,KAEnB,EAAM,4BAA4B;GAKpC,IAAM,IAAY,SAAU,GAAS;IACnC,IAAM,IAAO,EAAG,iBAAiB,EAAG,GAAG,aAAa,CAAC;IACrD,KAAK,IAAM,KAAO,GAGhB,IAAI,OAAO,UAAU,eAAe,KAAK,GAAM,CAAG,KAC5C,EAAI,MAAM,GAAG,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,GACrC,OAAO,EAAG,IAAI,EAAI,MAAM,GAAG,EAAE,CAAC;IAIpC,OAAO;GACT,GAEM,IAAmB,SAAU,GAAS,GAAM;IAChD,IAAM,IAAM,EAAU,CAAO,GACzB,GACE,IAAS,CAAC,GACZ,IAAQ;IACZ,IAAI,CAAC,GAEH,OADA,EAAS,wCAAwC,CAAO,GACjD;IAET,IAAM,IAAO,EAAG,KAAK,KAAA,GAAW,EAAG,IAAI,MAAM,GAAG,CAAG;IACnD,KAAK,IAAI,IAAI,GAAG,IAAI,EAAK,QAAQ,KAC/B,AAAK,EAAG,IAAI,EAAK,IAAI,CAAI,KACvB,EAAO,KAAK,EAAK,EAAE;IAavB,OAVI,EAAO,WACT,IAAM,EAAiB,GAAK,CAAM,GAClC,IAAQ,EAAI,SAAS,QACrB,EAAI,YAAY,EAAI,cAAc,IAAI,CAAC,CAAC,CAAC,cACvC,EAAG,MAAM,MAAM,CAAG,IAClB,cACA,EAAG,MAAM,MAAM,CAAI,KAClB,IAAQ,IAAI,KAAK,OAAO,IAAQ,MACnC,EAAI,YAAY,CAAG,IAEd;GACT;GAMA,AAHI,EAAiB,iBAAiB,EAAG,KAAK,MAAM,CAAC,MAAM,KACzD,EAAM,8BAA8B,GAElC,EAAiB,sBAAsB,EAAG,KAAK,MAAM,CAAC,MAAM,KAC9D,EAAM,+BAA+B;EAGzC;EAWA,IADU,EAAG,aAAa,CACtB,CAAC,CAAC,kDAAkD;GACtD,IAAM,IAAS,EAAG,KAAK,GAAS,EAAG,KAAK,SAAS,CAAC;GAElD,AADA,QAAQ,IAAI,4BAA4B,EAAO,MAAM,GACrD,EAAG,QAAQ,KAAK,CAAM,CAAC,CAAC,KAAK,WAAY;IACvC,EAAa;GACf,CAAC;EACH;EAIA,OAAO;CACT;AACF"}
@@ -1,2 +1,2 @@
1
- const e=require("./webIdUtils.cjs.js");let t=require("solid-ui"),n=require("solid-logic"),r=require("rdflib");async function i(r){if(e.isWebIdUri(r)){try{await n.store.fetcher.load(r.doc())}catch(e){console.warn(`Unable to load profile document for WebID`,r.doc().uri,e)}let e=n.store.each(r,t.ns.space(`storage`));return(await Promise.all(e.map(async e=>await o(e)?e:null))).filter(e=>e!==null)}try{let e=await a(r);return e?[e]:[]}catch(e){return console.error(`cannot load container`,e),[]}}async function a(e){let t=new URL(e.value||e.uri),r=t.pathname;for(;r.length;){r=r.substring(0,r.lastIndexOf(`/`));let e=n.store.sym(`${t.origin}${r}/`);if(await o(e))return e}return null}async function o(e){return await s(e),n.store.holds(e,t.ns.rdf(`type`),t.ns.space(`Storage`),e.doc())}async function s(e){if(!n.store.any(e,t.ns.ldp(`contains`),void 0,e.doc()))try{let t=(await n.store.fetcher.webOperation(`GET`,e.uri,n.store.fetcher.initFetchOptions(e.uri,{headers:{accept:`text/turtle`}}))).responseText;e.uri&&t&&(0,r.parse)(t,n.store,e.uri,`text/turtle`)}catch(t){console.warn(`Unable to load container representation for`,e.uri,t)}}exports.getPodStorages=i,exports.loadContainerRepresentation=s;
1
+ const e=require("./webIdUtils.cjs.js");let t=require("solid-ui"),n=require("solid-logic"),r=require("rdflib");function i(e){let t=new Map;if(!e)return t;for(let n of e.split(`,`)){let e=n.trim().match(/^([A-Za-z]+)\s*=\s*"([^"]*)"$/);if(e){let[,n,r]=e,i=r.trim().split(/\s+/).filter(Boolean);t.set(n.toLowerCase(),new Set(i.map(e=>e.toLowerCase())))}}return t}function a(e){if(!e)return{canEdit:!1,isPublic:!1};let t=i(e),n=t.get(`user`)??new Set,r=t.get(`public`)??new Set;return{canEdit:n.has(`write`),isPublic:r.has(`read`)||r.has(`write`)}}async function o(r){if(e.isWebIdUri(r)){try{await n.store.fetcher.load(r.doc())}catch(e){console.warn(`Unable to load profile document for WebID`,r.doc().uri,e)}let e=n.store.each(r,t.ns.space(`storage`));return(await Promise.all(e.map(async e=>await c(e)?e:null))).filter(e=>e!==null)}try{let e=await s(r);return e?[e]:[]}catch(e){return console.error(`cannot load container`,e),[]}}async function s(e){let t=new URL(e.value||e.uri),r=t.pathname;for(;r.length;){r=r.substring(0,r.lastIndexOf(`/`));let e=n.store.sym(`${t.origin}${r}/`);if(await c(e))return e}return null}async function c(e){return await l(e),n.store.holds(e,t.ns.rdf(`type`),t.ns.space(`Storage`),e.doc())}async function l(e){if(!n.store.any(e,t.ns.ldp(`contains`),void 0,e.doc()))try{let t=(await n.store.fetcher.webOperation(`GET`,e.uri,n.store.fetcher.initFetchOptions(e.uri,{headers:{accept:`text/turtle`}}))).responseText;e.uri&&t&&(0,r.parse)(t,n.store,e.uri,`text/turtle`)}catch(t){console.warn(`Unable to load container representation for`,e.uri,t)}}function u(e,n){if(!e||!n)return!1;let r=e.sym(n),i=e.findTypeURIs(r);return!!(i[t.ns.ldp(`Container`).uri]||i[t.ns.ldp(`BasicContainer`).uri]||r.uri.endsWith(`/`))}function d(e,n){if(!e||!n)return 0;let r=e.sym(n),i=new Set;for(let n of e.each(r,t.ns.ldp(`contains`)))if(n.termType===`NamedNode`){let e=n,t=e.dir();if(t){let n=e.uri.slice(t.uri.length);!n.startsWith(`.`)&&!n.endsWith(`.acl`)&&!n.endsWith(`~`)&&i.add(e.uri)}}return i.size}function f(e,r,i){let o,s=!1,c=!1,l,u;if(i.headers&&i.headers.get(`content-type`)){o=i.headers.get(`content-type`)?.split(`;`)[0]??void 0;let n=a(i.headers.get(`wac-allow`));s=n.canEdit,c=n.isPublic,l=i.headers.get(`etag`)??void 0,u=e.anyValue(r,t.ns.dct(`modified`))||e.anyValue(r,t.ns.dc(`modified`))||void 0}else e.each(null,e.sym(`http://www.w3.org/2007/ont/link#requestedURI`),r).forEach(n=>{let i=e.any(n,e.sym(`http://www.w3.org/2007/ont/link#response`));if(i&&i.termType===`NamedNode`){o=e.anyValue(i,t.ns.httph(`content-type`))||void 0;let n=a(e.anyValue(i,t.ns.httph(`wac-allow`))||e.anyValue(i,t.ns.httph(`WAC-Allow`)));s=n.canEdit,c=n.isPublic,l=e.anyValue(i,t.ns.httph(`etag`))||void 0,u=e.anyValue(r,t.ns.dct(`modified`))||e.anyValue(r,t.ns.dc(`modified`))||void 0}});let d=e.any(r,n.ACL_LINK)?.value||void 0;return{contentType:o,canEdit:s,isPublic:c,aclUri:d,eTag:l,modified:u}}async function p(e,t){let n=await e.fetcher.webOperation(`HEAD`,t.uri);if(!n.ok)throw Error(`HEAD request failed with status ${n.status}`);let r=f(e,t,n);if(!r.contentType)throw Error(`No content-type available!`);return r}exports.fetchResourceMetadata=p,exports.getContainerItemCount=d,exports.getPodStorages=o,exports.getResponseMetadata=f,exports.isContainerSubject=u,exports.loadContainerRepresentation=l;
2
2
  //# sourceMappingURL=podUtils.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"podUtils.cjs.js","names":[],"sources":["../../src/utils/podUtils.ts"],"sourcesContent":["import { store } from 'solid-logic'\nimport { ns } from 'solid-ui'\nimport { NamedNode, parse } from 'rdflib'\nimport { isWebIdUri } from './webIdUtils'\n\nexport async function getPodStorages (url: NamedNode): Promise<NamedNode[]> {\n if (isWebIdUri(url)) {\n try {\n await store.fetcher.load(url.doc())\n } catch (err) {\n console.warn('Unable to load profile document for WebID', url.doc().uri, err)\n }\n const podStorages = store.each(url, ns.space('storage'))\n const results = await Promise.all(podStorages.map(async pod => await isPodStorage(pod as NamedNode) ? pod as NamedNode : null))\n return results.filter(pod => pod !== null) as NamedNode[]\n }\n try {\n const storage = await findPodStorageFromUrl(url)\n return storage ? [storage] : []\n } catch (err) {\n console.error('cannot load container', err)\n return []\n }\n}\n\nasync function findPodStorageFromUrl (url: NamedNode): Promise<NamedNode | null> {\n const podStorage = new URL(url.value || url.uri)\n let pathStorage = podStorage.pathname\n\n while (pathStorage.length) {\n pathStorage = pathStorage.substring(0, pathStorage.lastIndexOf('/'))\n const candidate = store.sym(`${podStorage.origin}${pathStorage}/`)\n if (await isPodStorage(candidate)) return candidate\n }\n\n // TODO should url.origin be added to pods list when there are no pim:Storage ???\n return null\n}\n\nasync function isPodStorage (pod: NamedNode): Promise<boolean> {\n await loadContainerRepresentation(pod)\n return store.holds(pod, ns.rdf('type'), ns.space('Storage'), pod.doc())\n}\n\nexport async function loadContainerRepresentation (subject) {\n // force reload for index.html with RDFa\n if (!store.any(subject, ns.ldp('contains'), undefined, subject.doc())) {\n try {\n const response = await store.fetcher.webOperation('GET', subject.uri, store.fetcher.initFetchOptions(subject.uri, { headers: { accept: 'text/turtle' } }))\n const containerTurtle = response.responseText\n if (subject.uri && containerTurtle) {\n parse(containerTurtle, store, subject.uri, 'text/turtle')\n }\n } catch (err) {\n console.warn('Unable to load container representation for', subject.uri, err)\n }\n }\n}\n"],"mappings":"8GAKA,eAAsB,EAAgB,EAAsC,CAC1E,GAAI,EAAA,WAAW,CAAG,EAAG,CACnB,GAAI,CACF,MAAM,EAAA,MAAM,QAAQ,KAAK,EAAI,IAAI,CAAC,CACpC,OAAS,EAAK,CACZ,QAAQ,KAAK,4CAA6C,EAAI,IAAI,CAAC,CAAC,IAAK,CAAG,CAC9E,CACA,IAAM,EAAc,EAAA,MAAM,KAAK,EAAK,EAAA,GAAG,MAAM,SAAS,CAAC,EAEvD,OAAO,MADe,QAAQ,IAAI,EAAY,IAAI,KAAM,IAAO,MAAM,EAAa,CAAgB,EAAI,EAAmB,IAAI,CAAC,EAAA,CAC/G,OAAO,GAAO,IAAQ,IAAI,CAC3C,CACA,GAAI,CACF,IAAM,EAAU,MAAM,EAAsB,CAAG,EAC/C,OAAO,EAAU,CAAC,CAAO,EAAI,CAAC,CAChC,OAAS,EAAK,CAEZ,OADA,QAAQ,MAAM,wBAAyB,CAAG,EACnC,CAAC,CACV,CACF,CAEA,eAAe,EAAuB,EAA2C,CAC/E,IAAM,EAAa,IAAI,IAAI,EAAI,OAAS,EAAI,GAAG,EAC3C,EAAc,EAAW,SAE7B,KAAO,EAAY,QAAQ,CACzB,EAAc,EAAY,UAAU,EAAG,EAAY,YAAY,GAAG,CAAC,EACnE,IAAM,EAAY,EAAA,MAAM,IAAI,GAAG,EAAW,SAAS,EAAY,EAAE,EACjE,GAAI,MAAM,EAAa,CAAS,EAAG,OAAO,CAC5C,CAGA,OAAO,IACT,CAEA,eAAe,EAAc,EAAkC,CAE7D,OADA,MAAM,EAA4B,CAAG,EAC9B,EAAA,MAAM,MAAM,EAAK,EAAA,GAAG,IAAI,MAAM,EAAG,EAAA,GAAG,MAAM,SAAS,EAAG,EAAI,IAAI,CAAC,CACxE,CAEA,eAAsB,EAA6B,EAAS,CAE1D,GAAI,CAAC,EAAA,MAAM,IAAI,EAAS,EAAA,GAAG,IAAI,UAAU,EAAG,IAAA,GAAW,EAAQ,IAAI,CAAC,EAClE,GAAI,CAEF,IAAM,GAAkB,MADD,EAAA,MAAM,QAAQ,aAAa,MAAO,EAAQ,IAAK,EAAA,MAAM,QAAQ,iBAAiB,EAAQ,IAAK,CAAE,QAAS,CAAE,OAAQ,aAAc,CAAE,CAAC,CAAC,EAAA,CACxH,aAC7B,EAAQ,KAAO,IACjB,EAAA,EAAA,MAAA,CAAM,EAAiB,EAAA,MAAO,EAAQ,IAAK,aAAa,CAE5D,OAAS,EAAK,CACZ,QAAQ,KAAK,8CAA+C,EAAQ,IAAK,CAAG,CAC9E,CAEJ"}
1
+ {"version":3,"file":"podUtils.cjs.js","names":[],"sources":["../../src/utils/podUtils.ts"],"sourcesContent":["import { store } from 'solid-logic'\nimport { ns } from 'solid-ui'\nimport { LiveStore, NamedNode, parse } from 'rdflib'\nimport { isWebIdUri } from './webIdUtils'\nimport { ACL_LINK } from 'solid-logic'\nimport { FileExplorerResourceMetadata } from 'src/components/file-explorer-header/types'\n\nfunction parseWacAllowHeader (headerValue: string | null | undefined) {\n const permissions = new Map<string, Set<string>>()\n if (!headerValue) return permissions\n\n for (const entry of headerValue.split(',')) {\n const match = entry.trim().match(/^([A-Za-z]+)\\s*=\\s*\"([^\"]*)\"$/)\n if (match) {\n const [, permissionGroup, accessModes] = match\n const modes = accessModes.trim().split(/\\s+/).filter(Boolean)\n permissions.set(permissionGroup.toLowerCase(), new Set(modes.map(mode => mode.toLowerCase())))\n }\n }\n\n return permissions\n}\n\nfunction deriveAccessFlags (wacAllow: string | null | undefined) {\n if (!wacAllow) {\n return { canEdit: false, isPublic: false }\n }\n\n const permissions = parseWacAllowHeader(wacAllow)\n const userModes = permissions.get('user') ?? new Set<string>()\n const publicModes = permissions.get('public') ?? new Set<string>()\n\n return {\n canEdit: userModes.has('write'),\n isPublic: publicModes.has('read') || publicModes.has('write')\n }\n}\n\nexport async function getPodStorages (url: NamedNode): Promise<NamedNode[]> {\n if (isWebIdUri(url)) {\n try {\n await store.fetcher.load(url.doc())\n } catch (err) {\n console.warn('Unable to load profile document for WebID', url.doc().uri, err)\n }\n const podStorages = store.each(url, ns.space('storage'))\n const results = await Promise.all(podStorages.map(async pod => await isPodStorage(pod as NamedNode) ? pod as NamedNode : null))\n return results.filter(pod => pod !== null) as NamedNode[]\n }\n try {\n const storage = await findPodStorageFromUrl(url)\n return storage ? [storage] : []\n } catch (err) {\n console.error('cannot load container', err)\n return []\n }\n}\n\nasync function findPodStorageFromUrl (url: NamedNode): Promise<NamedNode | null> {\n const podStorage = new URL(url.value || url.uri)\n let pathStorage = podStorage.pathname\n\n while (pathStorage.length) {\n pathStorage = pathStorage.substring(0, pathStorage.lastIndexOf('/'))\n const candidate = store.sym(`${podStorage.origin}${pathStorage}/`)\n if (await isPodStorage(candidate)) return candidate\n }\n\n // TODO should url.origin be added to pods list when there are no pim:Storage ???\n return null\n}\n\nasync function isPodStorage (pod: NamedNode): Promise<boolean> {\n await loadContainerRepresentation(pod)\n return store.holds(pod, ns.rdf('type'), ns.space('Storage'), pod.doc())\n}\n\nexport async function loadContainerRepresentation (subject) {\n // force reload for index.html with RDFa\n if (!store.any(subject, ns.ldp('contains'), undefined, subject.doc())) {\n try {\n const response = await store.fetcher.webOperation('GET', subject.uri, store.fetcher.initFetchOptions(subject.uri, { headers: { accept: 'text/turtle' } }))\n const containerTurtle = response.responseText\n if (subject.uri && containerTurtle) {\n parse(containerTurtle, store, subject.uri, 'text/turtle')\n }\n } catch (err) {\n console.warn('Unable to load container representation for', subject.uri, err)\n }\n }\n}\n\nexport function isContainerSubject (store: LiveStore | undefined, subjectUri: string | undefined): boolean {\n if (!store || !subjectUri) return false\n\n const subject = store.sym(subjectUri)\n const typeUris = store.findTypeURIs(subject)\n return Boolean(\n typeUris[ns.ldp('Container').uri] ||\n typeUris[ns.ldp('BasicContainer').uri] ||\n subject.uri.endsWith('/')\n )\n}\n\n// The shared rdflib store can hold duplicate ldp:contains statements for the\n// same child resource when the container and companion metadata are both loaded.\n// Count unique visible children here so the header summary matches the list UI.\nexport function getContainerItemCount (store: LiveStore | undefined, subjectUri: string | undefined): number {\n if (!store || !subjectUri) return 0\n\n const subject = store.sym(subjectUri)\n const seen = new Set<string>()\n\n for (const item of store.each(subject, ns.ldp('contains'))) {\n if (item.termType === 'NamedNode') {\n const resource = item as NamedNode\n const parent = resource.dir()\n\n if (parent) {\n const pathEnd = resource.uri.slice(parent.uri.length)\n if (\n !pathEnd.startsWith('.') &&\n !pathEnd.endsWith('.acl') &&\n !pathEnd.endsWith('~')\n ) {\n seen.add(resource.uri)\n }\n }\n }\n }\n return seen.size\n}\n\nexport function getResponseMetadata (store: LiveStore, subject: NamedNode, response: Response): FileExplorerResourceMetadata {\n let contentType: string | undefined\n let canEdit = false\n let isPublic = false\n let eTag: string | undefined\n let modified: string | undefined\n\n if (response.headers && response.headers.get('content-type')) {\n contentType = response.headers.get('content-type')?.split(';')[0] ?? undefined\n const accessFlags = deriveAccessFlags(response.headers.get('wac-allow'))\n\n canEdit = accessFlags.canEdit\n isPublic = accessFlags.isPublic\n eTag = response.headers.get('etag') ?? undefined\n modified = store.anyValue(subject as any, ns.dct('modified')) || store.anyValue(subject as any, ns.dc('modified')) || undefined\n } else {\n const reqs = store.each(\n null,\n store.sym('http://www.w3.org/2007/ont/link#requestedURI'),\n subject\n )\n reqs.forEach((req: any) => {\n const responseNode = store.any(\n req as any,\n store.sym('http://www.w3.org/2007/ont/link#response')\n )\n if (responseNode && responseNode.termType === 'NamedNode') {\n contentType = store.anyValue(responseNode as any, ns.httph('content-type')) || undefined\n const wacAllow = (store.anyValue(responseNode as any, ns.httph('wac-allow')) as string | undefined) ||\n (store.anyValue(responseNode as any, ns.httph('WAC-Allow')) as string | undefined)\n const accessFlags = deriveAccessFlags(wacAllow)\n canEdit = accessFlags.canEdit\n isPublic = accessFlags.isPublic\n eTag = store.anyValue(responseNode as any, ns.httph('etag')) || undefined\n modified = store.anyValue(subject as any, ns.dct('modified')) || store.anyValue(subject as any, ns.dc('modified')) || undefined\n }\n })\n }\n\n const aclUri = store.any(subject, ACL_LINK)?.value || undefined\n return { contentType, canEdit, isPublic, aclUri, eTag, modified }\n}\n\nexport async function fetchResourceMetadata (store: LiveStore, subject: NamedNode): Promise<FileExplorerResourceMetadata> {\n const response = await store.fetcher.webOperation('HEAD', subject.uri)\n\n if (!response.ok) {\n throw new Error(`HEAD request failed with status ${response.status}`)\n }\n\n const metadata = getResponseMetadata(store, subject, response)\n if (!metadata.contentType) {\n throw new Error('No content-type available!')\n }\n\n return metadata\n}\n"],"mappings":"8GAOA,SAAS,EAAqB,EAAwC,CACpE,IAAM,EAAc,IAAI,IACxB,GAAI,CAAC,EAAa,OAAO,EAEzB,IAAK,IAAM,KAAS,EAAY,MAAM,GAAG,EAAG,CAC1C,IAAM,EAAQ,EAAM,KAAK,CAAC,CAAC,MAAM,+BAA+B,EAChE,GAAI,EAAO,CACT,GAAM,EAAG,EAAiB,GAAe,EACnC,EAAQ,EAAY,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,OAAO,OAAO,EAC5D,EAAY,IAAI,EAAgB,YAAY,EAAG,IAAI,IAAI,EAAM,IAAI,GAAQ,EAAK,YAAY,CAAC,CAAC,CAAC,CAC/F,CACF,CAEA,OAAO,CACT,CAEA,SAAS,EAAmB,EAAqC,CAC/D,GAAI,CAAC,EACH,MAAO,CAAE,QAAS,GAAO,SAAU,EAAM,EAG3C,IAAM,EAAc,EAAoB,CAAQ,EAC1C,EAAY,EAAY,IAAI,MAAM,GAAK,IAAI,IAC3C,EAAc,EAAY,IAAI,QAAQ,GAAK,IAAI,IAErD,MAAO,CACL,QAAS,EAAU,IAAI,OAAO,EAC9B,SAAU,EAAY,IAAI,MAAM,GAAK,EAAY,IAAI,OAAO,CAC9D,CACF,CAEA,eAAsB,EAAgB,EAAsC,CAC1E,GAAI,EAAA,WAAW,CAAG,EAAG,CACnB,GAAI,CACF,MAAM,EAAA,MAAM,QAAQ,KAAK,EAAI,IAAI,CAAC,CACpC,OAAS,EAAK,CACZ,QAAQ,KAAK,4CAA6C,EAAI,IAAI,CAAC,CAAC,IAAK,CAAG,CAC9E,CACA,IAAM,EAAc,EAAA,MAAM,KAAK,EAAK,EAAA,GAAG,MAAM,SAAS,CAAC,EAEvD,OAAO,MADe,QAAQ,IAAI,EAAY,IAAI,KAAM,IAAO,MAAM,EAAa,CAAgB,EAAI,EAAmB,IAAI,CAAC,EAAA,CAC/G,OAAO,GAAO,IAAQ,IAAI,CAC3C,CACA,GAAI,CACF,IAAM,EAAU,MAAM,EAAsB,CAAG,EAC/C,OAAO,EAAU,CAAC,CAAO,EAAI,CAAC,CAChC,OAAS,EAAK,CAEZ,OADA,QAAQ,MAAM,wBAAyB,CAAG,EACnC,CAAC,CACV,CACF,CAEA,eAAe,EAAuB,EAA2C,CAC/E,IAAM,EAAa,IAAI,IAAI,EAAI,OAAS,EAAI,GAAG,EAC3C,EAAc,EAAW,SAE7B,KAAO,EAAY,QAAQ,CACzB,EAAc,EAAY,UAAU,EAAG,EAAY,YAAY,GAAG,CAAC,EACnE,IAAM,EAAY,EAAA,MAAM,IAAI,GAAG,EAAW,SAAS,EAAY,EAAE,EACjE,GAAI,MAAM,EAAa,CAAS,EAAG,OAAO,CAC5C,CAGA,OAAO,IACT,CAEA,eAAe,EAAc,EAAkC,CAE7D,OADA,MAAM,EAA4B,CAAG,EAC9B,EAAA,MAAM,MAAM,EAAK,EAAA,GAAG,IAAI,MAAM,EAAG,EAAA,GAAG,MAAM,SAAS,EAAG,EAAI,IAAI,CAAC,CACxE,CAEA,eAAsB,EAA6B,EAAS,CAE1D,GAAI,CAAC,EAAA,MAAM,IAAI,EAAS,EAAA,GAAG,IAAI,UAAU,EAAG,IAAA,GAAW,EAAQ,IAAI,CAAC,EAClE,GAAI,CAEF,IAAM,GAAkB,MADD,EAAA,MAAM,QAAQ,aAAa,MAAO,EAAQ,IAAK,EAAA,MAAM,QAAQ,iBAAiB,EAAQ,IAAK,CAAE,QAAS,CAAE,OAAQ,aAAc,CAAE,CAAC,CAAC,EAAA,CACxH,aAC7B,EAAQ,KAAO,IACjB,EAAA,EAAA,MAAA,CAAM,EAAiB,EAAA,MAAO,EAAQ,IAAK,aAAa,CAE5D,OAAS,EAAK,CACZ,QAAQ,KAAK,8CAA+C,EAAQ,IAAK,CAAG,CAC9E,CAEJ,CAEA,SAAgB,EAAoB,EAA8B,EAAyC,CACzG,GAAI,CAAC,GAAS,CAAC,EAAY,MAAO,GAElC,IAAM,EAAU,EAAM,IAAI,CAAU,EAC9B,EAAW,EAAM,aAAa,CAAO,EAC3C,MAAO,GACL,EAAS,EAAA,GAAG,IAAI,WAAW,CAAC,CAAC,MAC7B,EAAS,EAAA,GAAG,IAAI,gBAAgB,CAAC,CAAC,MAClC,EAAQ,IAAI,SAAS,GAAG,EAE5B,CAKA,SAAgB,EAAuB,EAA8B,EAAwC,CAC3G,GAAI,CAAC,GAAS,CAAC,EAAY,MAAO,GAElC,IAAM,EAAU,EAAM,IAAI,CAAU,EAC9B,EAAO,IAAI,IAEjB,IAAK,IAAM,KAAQ,EAAM,KAAK,EAAS,EAAA,GAAG,IAAI,UAAU,CAAC,EACvD,GAAI,EAAK,WAAa,YAAa,CACjC,IAAM,EAAW,EACX,EAAS,EAAS,IAAI,EAE5B,GAAI,EAAQ,CACV,IAAM,EAAU,EAAS,IAAI,MAAM,EAAO,IAAI,MAAM,EAElD,CAAC,EAAQ,WAAW,GAAG,GACvB,CAAC,EAAQ,SAAS,MAAM,GACxB,CAAC,EAAQ,SAAS,GAAG,GAErB,EAAK,IAAI,EAAS,GAAG,CAEzB,CACF,CAEF,OAAO,EAAK,IACd,CAEA,SAAgB,EAAqB,EAAkB,EAAoB,EAAkD,CAC3H,IAAI,EACA,EAAU,GACV,EAAW,GACX,EACA,EAEJ,GAAI,EAAS,SAAW,EAAS,QAAQ,IAAI,cAAc,EAAG,CAC5D,EAAc,EAAS,QAAQ,IAAI,cAAc,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,IAAM,IAAA,GACrE,IAAM,EAAc,EAAkB,EAAS,QAAQ,IAAI,WAAW,CAAC,EAEvE,EAAU,EAAY,QACtB,EAAW,EAAY,SACvB,EAAO,EAAS,QAAQ,IAAI,MAAM,GAAK,IAAA,GACvC,EAAW,EAAM,SAAS,EAAgB,EAAA,GAAG,IAAI,UAAU,CAAC,GAAK,EAAM,SAAS,EAAgB,EAAA,GAAG,GAAG,UAAU,CAAC,GAAK,IAAA,EACxH,MAME,EALmB,KACjB,KACA,EAAM,IAAI,8CAA8C,EACxD,CAEF,CAAA,CAAK,QAAS,GAAa,CACzB,IAAM,EAAe,EAAM,IACzB,EACA,EAAM,IAAI,0CAA0C,CACtD,EACA,GAAI,GAAgB,EAAa,WAAa,YAAa,CACzD,EAAc,EAAM,SAAS,EAAqB,EAAA,GAAG,MAAM,cAAc,CAAC,GAAK,IAAA,GAG/E,IAAM,EAAc,EAFF,EAAM,SAAS,EAAqB,EAAA,GAAG,MAAM,WAAW,CAAC,GACxE,EAAM,SAAS,EAAqB,EAAA,GAAG,MAAM,WAAW,CAAC,CACd,EAC9C,EAAU,EAAY,QACtB,EAAW,EAAY,SACvB,EAAO,EAAM,SAAS,EAAqB,EAAA,GAAG,MAAM,MAAM,CAAC,GAAK,IAAA,GAChE,EAAW,EAAM,SAAS,EAAgB,EAAA,GAAG,IAAI,UAAU,CAAC,GAAK,EAAM,SAAS,EAAgB,EAAA,GAAG,GAAG,UAAU,CAAC,GAAK,IAAA,EACxH,CACF,CAAC,EAGH,IAAM,EAAS,EAAM,IAAI,EAAS,EAAA,QAAQ,CAAC,EAAE,OAAS,IAAA,GACtD,MAAO,CAAE,cAAa,UAAS,WAAU,SAAQ,OAAM,UAAS,CAClE,CAEA,eAAsB,EAAuB,EAAkB,EAA2D,CACxH,IAAM,EAAW,MAAM,EAAM,QAAQ,aAAa,OAAQ,EAAQ,GAAG,EAErE,GAAI,CAAC,EAAS,GACZ,MAAU,MAAM,mCAAmC,EAAS,QAAQ,EAGtE,IAAM,EAAW,EAAoB,EAAO,EAAS,CAAQ,EAC7D,GAAI,CAAC,EAAS,YACZ,MAAU,MAAM,4BAA4B,EAG9C,OAAO,CACT"}
@@ -1,4 +1,9 @@
1
- import { NamedNode } from '../../node_modules/rdflib';
1
+ import { LiveStore, NamedNode } from '../../node_modules/rdflib';
2
+ import { FileExplorerResourceMetadata } from 'src/components/file-explorer-header/types';
2
3
  export declare function getPodStorages(url: NamedNode): Promise<NamedNode[]>;
3
4
  export declare function loadContainerRepresentation(subject: any): Promise<void>;
5
+ export declare function isContainerSubject(store: LiveStore | undefined, subjectUri: string | undefined): boolean;
6
+ export declare function getContainerItemCount(store: LiveStore | undefined, subjectUri: string | undefined): number;
7
+ export declare function getResponseMetadata(store: LiveStore, subject: NamedNode, response: Response): FileExplorerResourceMetadata;
8
+ export declare function fetchResourceMetadata(store: LiveStore, subject: NamedNode): Promise<FileExplorerResourceMetadata>;
4
9
  //# sourceMappingURL=podUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"podUtils.d.ts","sourceRoot":"","sources":["../../src/utils/podUtils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAS,MAAM,QAAQ,CAAA;AAGzC,wBAAsB,cAAc,CAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAkB1E;AAqBD,wBAAsB,2BAA2B,CAAE,OAAO,KAAA,iBAazD"}
1
+ {"version":3,"file":"podUtils.d.ts","sourceRoot":"","sources":["../../src/utils/podUtils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAS,MAAM,QAAQ,CAAA;AAGpD,OAAO,EAAE,4BAA4B,EAAE,MAAM,2CAA2C,CAAA;AAiCxF,wBAAsB,cAAc,CAAE,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAkB1E;AAqBD,wBAAsB,2BAA2B,CAAE,OAAO,KAAA,iBAazD;AAED,wBAAgB,kBAAkB,CAAE,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAUzG;AAKD,wBAAgB,qBAAqB,CAAE,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAwB3G;AAED,wBAAgB,mBAAmB,CAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,GAAG,4BAA4B,CAyC3H;AAED,wBAAsB,qBAAqB,CAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAaxH"}