solid-panes 4.4.2-4 → 4.4.2-5

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 (170) hide show
  1. package/README.md +0 -30
  2. package/dist/_virtual/_rolldown/runtime.cjs.js +1 -1
  3. package/dist/_virtual/~icons/lucide/folder-open.cjs.js +2 -0
  4. package/dist/_virtual/~icons/lucide/folder-open.cjs.js.map +1 -0
  5. package/dist/_virtual/~icons/lucide/folder-open.esm.js +11 -0
  6. package/dist/_virtual/~icons/lucide/folder-open.esm.js.map +1 -0
  7. package/dist/_virtual/~icons/lucide/layout-dashboard.cjs.js +2 -0
  8. package/dist/_virtual/~icons/lucide/layout-dashboard.cjs.js.map +1 -0
  9. package/dist/_virtual/~icons/lucide/layout-dashboard.esm.js +11 -0
  10. package/dist/_virtual/~icons/lucide/layout-dashboard.esm.js.map +1 -0
  11. package/dist/_virtual/~icons/lucide/settings-2.cjs.js +2 -0
  12. package/dist/_virtual/~icons/lucide/settings-2.cjs.js.map +1 -0
  13. package/dist/_virtual/~icons/lucide/settings-2.esm.js +11 -0
  14. package/dist/_virtual/~icons/lucide/settings-2.esm.js.map +1 -0
  15. package/dist/_virtual/~icons/lucide/users.cjs.js +2 -0
  16. package/dist/_virtual/~icons/lucide/users.cjs.js.map +1 -0
  17. package/dist/_virtual/~icons/lucide/users.esm.js +11 -0
  18. package/dist/_virtual/~icons/lucide/users.esm.js.map +1 -0
  19. package/dist/components/header/Header.cjs.js +1 -1
  20. package/dist/components/header/Header.cjs.js.map +1 -1
  21. package/dist/components/navbar/Navbar.cjs.js +15 -0
  22. package/dist/components/navbar/Navbar.cjs.js.map +1 -0
  23. package/dist/components/navbar/Navbar.d.ts +14 -0
  24. package/dist/components/navbar/Navbar.d.ts.map +1 -0
  25. package/dist/components/navbar/Navbar.esm.js +232 -0
  26. package/dist/components/navbar/Navbar.esm.js.map +1 -0
  27. package/dist/components/navbar/Navbar.styles.cjs.js +2 -0
  28. package/dist/components/navbar/Navbar.styles.cjs.js.map +1 -0
  29. package/dist/components/navbar/Navbar.styles.esm.js +7 -0
  30. package/dist/components/navbar/Navbar.styles.esm.js.map +1 -0
  31. package/dist/components/navbar/index.cjs.js +1 -0
  32. package/dist/components/navbar/index.d.ts +4 -0
  33. package/dist/components/navbar/index.d.ts.map +1 -0
  34. package/dist/components/navbar/index.esm.js +1 -0
  35. package/dist/dashboard/basicPreferences.cjs.js +1 -1
  36. package/dist/dashboard/basicPreferences.cjs.js.map +1 -1
  37. package/dist/dashboard/dashboardPane.cjs.js +1 -1
  38. package/dist/dashboard/dashboardPane.cjs.js.map +1 -1
  39. package/dist/dashboard/homepage.cjs.js +1 -1
  40. package/dist/dashboard/homepage.cjs.js.map +1 -1
  41. package/dist/dashboard/homepage.esm.js +2 -2
  42. package/dist/dashboard/homepage.esm.js.map +1 -1
  43. package/dist/form/pane.cjs.js +1 -1
  44. package/dist/form/pane.cjs.js.map +1 -1
  45. package/dist/form/pane.esm.js +2 -1
  46. package/dist/form/pane.esm.js.map +1 -1
  47. package/dist/home/homePane.cjs.js +1 -1
  48. package/dist/home/homePane.cjs.js.map +1 -1
  49. package/dist/humanReadablePane2.cjs.js.map +1 -1
  50. package/dist/humanReadablePane2.esm.js.map +1 -1
  51. package/dist/index.cjs.js +1 -1
  52. package/dist/index.cjs.js.map +1 -1
  53. package/dist/index.esm.js +12 -7
  54. package/dist/index.esm.js.map +1 -1
  55. package/dist/internal/internalPane2.cjs.js +1 -1
  56. package/dist/internal/internalPane2.cjs.js.map +1 -1
  57. package/dist/mainPage/header.cjs.js +1 -1
  58. package/dist/mainPage/header.cjs.js.map +1 -1
  59. package/dist/mainPage/header.d.ts.map +1 -1
  60. package/dist/mainPage/header.esm.js +64 -17
  61. package/dist/mainPage/header.esm.js.map +1 -1
  62. package/dist/mainPage/index.cjs.js +1 -1
  63. package/dist/mainPage/index.cjs.js.map +1 -1
  64. package/dist/mainPage/index.d.ts +1 -9
  65. package/dist/mainPage/index.d.ts.map +1 -1
  66. package/dist/mainPage/index.esm.js +19 -21
  67. package/dist/mainPage/index.esm.js.map +1 -1
  68. package/dist/mainPage/navbar.cjs.js +2 -0
  69. package/dist/mainPage/navbar.cjs.js.map +1 -0
  70. package/dist/mainPage/navbar.d.ts +3 -0
  71. package/dist/mainPage/navbar.d.ts.map +1 -0
  72. package/dist/mainPage/navbar.esm.js +66 -0
  73. package/dist/mainPage/navbar.esm.js.map +1 -0
  74. package/dist/outline/context.d.ts +1 -1
  75. package/dist/outline/manager2.cjs.js +2 -2
  76. package/dist/outline/manager2.cjs.js.map +1 -1
  77. package/dist/outline/manager2.esm.js +330 -453
  78. package/dist/outline/manager2.esm.js.map +1 -1
  79. package/dist/outline/propertyViews.cjs.js +1 -1
  80. package/dist/outline/propertyViews.cjs.js.map +1 -1
  81. package/dist/outline/queryByExample.esm.js +1 -0
  82. package/dist/outline/queryByExample.esm.js.map +1 -1
  83. package/dist/outline/userInput.cjs.js +3 -3
  84. package/dist/outline/userInput.cjs.js.map +1 -1
  85. package/dist/outline/userInput.esm.js +4 -6
  86. package/dist/outline/userInput.esm.js.map +1 -1
  87. package/dist/pad/padPane2.cjs.js +1 -1
  88. package/dist/pad/padPane2.cjs.js.map +1 -1
  89. package/dist/pad/padPane2.esm.js +2 -1
  90. package/dist/pad/padPane2.esm.js.map +1 -1
  91. package/dist/schedule/schedulePane2.cjs.js +1 -1
  92. package/dist/schedule/schedulePane2.cjs.js.map +1 -1
  93. package/dist/schedule/schedulePane2.esm.js +2 -1
  94. package/dist/schedule/schedulePane2.esm.js.map +1 -1
  95. package/dist/sharing/sharingPane.cjs.js +1 -1
  96. package/dist/sharing/sharingPane.cjs.js.map +1 -1
  97. package/dist/social/editProfileDetails.cjs.js +1 -1
  98. package/dist/social/editProfileDetails.cjs.js.map +1 -1
  99. package/dist/social/socialPane2.cjs.js +1 -1
  100. package/dist/social/socialPane2.cjs.js.map +1 -1
  101. package/dist/social/socialPane2.esm.js +1 -1
  102. package/dist/social/socialSections.cjs.js +1 -1
  103. package/dist/social/socialSections.cjs.js.map +1 -1
  104. package/dist/social/triage.cjs.js +1 -1
  105. package/dist/social/triage.cjs.js.map +1 -1
  106. package/dist/tabbed/tabbedPane.cjs.js +1 -1
  107. package/dist/tabbed/tabbedPane.cjs.js.map +1 -1
  108. package/dist/transaction/pane.cjs.js.map +1 -1
  109. package/dist/transaction/pane.esm.js.map +1 -1
  110. package/dist/transaction/period.cjs.js.map +1 -1
  111. package/dist/transaction/period.esm.js.map +1 -1
  112. package/dist/trustedApplications/trustedApplications.dom.cjs.js +1 -1
  113. package/dist/trustedApplications/trustedApplications.dom.cjs.js.map +1 -1
  114. package/dist/trustedApplications/trustedApplications.utils.cjs.js +1 -1
  115. package/dist/trustedApplications/trustedApplications.utils.cjs.js.map +1 -1
  116. package/dist/trustedApplications/trustedApplications.view.cjs.js +1 -1
  117. package/dist/trustedApplications/trustedApplications.view.cjs.js.map +1 -1
  118. package/dist/utils/paneUtils.cjs.js +2 -0
  119. package/dist/utils/paneUtils.cjs.js.map +1 -0
  120. package/dist/utils/paneUtils.d.ts +19 -0
  121. package/dist/utils/paneUtils.d.ts.map +1 -0
  122. package/dist/utils/paneUtils.esm.js +52 -0
  123. package/dist/utils/paneUtils.esm.js.map +1 -0
  124. package/dist/utils/podUtils.cjs.js +2 -0
  125. package/dist/utils/podUtils.cjs.js.map +1 -0
  126. package/dist/utils/podUtils.d.ts +4 -0
  127. package/dist/utils/podUtils.d.ts.map +1 -0
  128. package/dist/utils/podUtils.esm.js +46 -0
  129. package/dist/utils/podUtils.esm.js.map +1 -0
  130. package/dist/utils/webIdUtils.cjs.js +2 -0
  131. package/dist/utils/webIdUtils.cjs.js.map +1 -0
  132. package/dist/utils/webIdUtils.d.ts +6 -0
  133. package/dist/utils/webIdUtils.d.ts.map +1 -0
  134. package/dist/utils/webIdUtils.esm.js +48 -0
  135. package/dist/utils/webIdUtils.esm.js.map +1 -0
  136. package/dist/versionInfo.cjs.js +1 -1
  137. package/dist/versionInfo.cjs.js.map +1 -1
  138. package/dist/versionInfo.esm.js +3 -3
  139. package/dist/versionInfo.esm.js.map +1 -1
  140. package/package.json +10 -13
  141. package/dist/icons/dashboard.cjs.js +0 -2
  142. package/dist/icons/dashboard.cjs.js.map +0 -1
  143. package/dist/icons/dashboard.esm.js +0 -6
  144. package/dist/icons/dashboard.esm.js.map +0 -1
  145. package/dist/icons/iconHelper.cjs.js +0 -2
  146. package/dist/icons/iconHelper.cjs.js.map +0 -1
  147. package/dist/icons/iconHelper.esm.js +0 -17
  148. package/dist/icons/iconHelper.esm.js.map +0 -1
  149. package/dist/icons/menu.cjs.js +0 -9
  150. package/dist/icons/menu.cjs.js.map +0 -1
  151. package/dist/icons/menu.esm.js +0 -6
  152. package/dist/icons/menu.esm.js.map +0 -1
  153. package/dist/mainPage/footer.cjs.js +0 -2
  154. package/dist/mainPage/footer.cjs.js.map +0 -1
  155. package/dist/mainPage/footer.d.ts +0 -13
  156. package/dist/mainPage/footer.d.ts.map +0 -1
  157. package/dist/mainPage/footer.esm.js +0 -18
  158. package/dist/mainPage/footer.esm.js.map +0 -1
  159. package/dist/mainPage/menu.d.ts +0 -6
  160. package/dist/mainPage/menu.d.ts.map +0 -1
  161. package/dist/mainPage/menu2.cjs.js +0 -2
  162. package/dist/mainPage/menu2.cjs.js.map +0 -1
  163. package/dist/mainPage/menu2.esm.js +0 -184
  164. package/dist/mainPage/menu2.esm.js.map +0 -1
  165. package/dist/profileUtils/ownerProfile.cjs.js +0 -2
  166. package/dist/profileUtils/ownerProfile.cjs.js.map +0 -1
  167. package/dist/profileUtils/ownerProfile.d.ts +0 -5
  168. package/dist/profileUtils/ownerProfile.d.ts.map +0 -1
  169. package/dist/profileUtils/ownerProfile.esm.js +0 -50
  170. package/dist/profileUtils/ownerProfile.esm.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"socialSections.cjs.js","names":[],"sources":["../../src/social/socialSections.ts"],"sourcesContent":["import { DataBrowserContext } from 'pane-registry'\nimport { createAddMeToYourFriendsButton } from 'profile-pane'\nimport { Statement, NamedNode } from 'rdflib'\nimport { ns, utils, widgets } from 'solid-ui'\nimport { appendProfileLinks } from './editProfileDetails'\nimport { locationIcon, personInCircleIcon as personInCircleIconSvg } from './icons'\nimport { FriendshipTriage } from './triage'\n\nexport type ViewerMode = 'owner' | 'authenticated' | 'anonymous'\n\nexport type HeaderControls = {\n canEdit: boolean,\n viewerMode: ViewerMode,\n showAddFriendAction?: boolean\n}\n\nexport type SocialHeaderElement = HTMLElement & {\n refreshSocialHeader?: (controls: HeaderControls) => void\n}\n\nexport type HeaderStats = {\n friendCount: number,\n mutualFriendCount: number | null,\n onSelectFriends?: () => void,\n onSelectMutual?: () => void\n}\n\nexport type HeaderProfileData = {\n imageUrl?: string,\n name?: string,\n jobTitle?: string,\n organization?: string,\n location?: string | null\n} | null\n\nexport type FriendRowRenderers = {\n renderSupportingInfo: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null,\n renderNameSuffix: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null\n}\n\nexport function createHeaderSection (\n context: DataBrowserContext,\n subject: NamedNode,\n controls: HeaderControls,\n stats: HeaderStats,\n getProfileData: () => HeaderProfileData\n): SocialHeaderElement {\n const dom = context.dom\n const kb = context.session.store\n const header = dom.createElement('header') as SocialHeaderElement\n header.className = 'social-pane__header'\n let headerControls = controls\n\n const renderHeader = function () {\n header.replaceChildren()\n const profileData = getProfileData()\n\n const headerContent = dom.createElement('div')\n headerContent.className = 'social-pane__header-content'\n\n const headerActions = dom.createElement('div')\n headerActions.className = 'social-pane__header-actions profile__actions profile__heading-actions'\n\n if (headerControls.canEdit) {\n // Hidden for now because the social pane header edit control does not match the new design.\n // Revisit later if we decide to restore profile-link editing here.\n } else if (headerControls.viewerMode === 'authenticated' && headerControls.showAddFriendAction) {\n headerActions.classList.add('social-pane__header-actions--friend')\n const addToFriendsButton = createAddMeToYourFriendsButton(subject, context)\n addToFriendsButton.classList.add('flex-center')\n headerActions.appendChild(addToFriendsButton)\n }\n\n header.appendChild(headerContent)\n\n const headerMedia = dom.createElement('div')\n headerMedia.className = 'social-pane__header-media'\n headerContent.appendChild(headerMedia)\n\n if (profileData) {\n headerMedia.appendChild(createImage(dom, profileData.imageUrl, profileData.name))\n }\n\n const headerDetails = dom.createElement('div')\n headerDetails.className = 'social-pane__header-details'\n headerContent.appendChild(headerDetails)\n\n if (headerActions.childNodes.length > 0) {\n headerContent.appendChild(headerActions)\n }\n\n const headerSummary = dom.createElement('div')\n headerSummary.classList.add('social-pane__header-summary', 'flex-column')\n headerDetails.appendChild(headerSummary)\n\n const name = profileData?.name || utils.label(subject)\n const h1 = dom.createElement('h1')\n h1.classList.add('social-pane__header-name')\n h1.appendChild(dom.createTextNode(name))\n headerSummary.appendChild(h1)\n\n const jobAndOrganization = [profileData?.jobTitle, profileData?.organization].filter(Boolean).join(' | ')\n if (jobAndOrganization) {\n const jobLine = dom.createElement('div')\n jobLine.className = 'social-pane__header-job-org'\n jobLine.textContent = jobAndOrganization\n headerSummary.appendChild(jobLine)\n }\n\n if (profileData?.location) {\n const locationLine = dom.createElement('div')\n locationLine.className = 'social-pane__header-location'\n\n const locationIconSpan = dom.createElement('span')\n locationIconSpan.classList.add('social-pane__header-location-icon', 'inline-flex-row')\n locationIconSpan.innerHTML = locationIcon\n locationLine.appendChild(locationIconSpan)\n locationLine.appendChild(dom.createTextNode(profileData.location))\n\n headerSummary.appendChild(locationLine)\n }\n\n const statsRow = dom.createElement('div')\n statsRow.className = 'social-pane__header-stats'\n\n const friendCount = dom.createElement('button')\n friendCount.className = 'social-pane__header-stat'\n friendCount.type = 'button'\n const friendCountLabel = dom.createElement('span')\n friendCountLabel.className = 'social-pane__header-stat-label'\n friendCountLabel.textContent = `${stats.friendCount} friend${stats.friendCount === 1 ? '' : 's'}`\n friendCount.appendChild(friendCountLabel)\n if (stats.onSelectFriends) {\n friendCount.addEventListener('click', stats.onSelectFriends)\n }\n statsRow.appendChild(friendCount)\n\n if (typeof stats.mutualFriendCount === 'number') {\n const mutualCount = dom.createElement('button')\n mutualCount.className = 'social-pane__header-stat'\n mutualCount.type = 'button'\n const mutualCountLabel = dom.createElement('span')\n mutualCountLabel.className = 'social-pane__header-stat-label'\n mutualCountLabel.textContent = `${stats.mutualFriendCount} mutual friend${stats.mutualFriendCount === 1 ? '' : 's'}`\n mutualCount.appendChild(mutualCountLabel)\n if (stats.onSelectMutual) {\n mutualCount.addEventListener('click', stats.onSelectMutual)\n }\n statsRow.appendChild(mutualCount)\n }\n\n headerSummary.appendChild(statsRow)\n appendProfileLinks(headerMedia, dom, kb, subject)\n }\n\n header.refreshSocialHeader = function (nextControls: HeaderControls) {\n headerControls = nextControls\n renderHeader()\n }\n\n renderHeader()\n\n return header\n}\n\nfunction createImage (dom: HTMLDocument, src: string | null | undefined, alt = ''): HTMLElement {\n if (src) {\n const img = dom.createElement('img')\n img.className = 'social-pane__header-hero'\n img.src = src\n img.alt = alt\n img.width = 180\n img.height = 180\n img.loading = 'eager'\n return img\n }\n\n const fallback = dom.createElement('div')\n fallback.className = 'social-pane__header-hero-alt flex-center'\n fallback.setAttribute('role', 'img')\n fallback.setAttribute('aria-label', alt)\n fallback.tabIndex = 0\n\n const icon = dom.createElement('span')\n icon.classList.add('social-pane__header-hero-icon', 'inline-flex-row')\n icon.innerHTML = personInCircleIconSvg\n fallback.appendChild(icon)\n\n return fallback\n}\n\nexport function createMutualSection (options: {\n dom: HTMLDocument,\n subject: NamedNode,\n familiar: string,\n me: NamedNode,\n meUri: string | null,\n incoming: boolean | NamedNode[] | undefined,\n outgoing: boolean | NamedNode[] | undefined,\n editable: boolean,\n profile: NamedNode | null,\n knows: NamedNode,\n mutualConnections: NamedNode[],\n link: (contents: Node, uri: string | null | undefined) => Node,\n text: (value: string) => Text,\n buildCheckboxForm: (\n label: string | Node,\n statement: Statement,\n state: boolean,\n options?: { disabled?: boolean, disabledTitle?: string }\n ) => HTMLElement,\n renderSupportingInfo: FriendRowRenderers['renderSupportingInfo'],\n renderNameSuffix: FriendRowRenderers['renderNameSuffix']\n}): { section: HTMLElement, content: HTMLElement, refreshMutualFriends: () => void } {\n const {\n dom,\n subject,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n } = options\n\n let refreshMutualFriends = function () {}\n\n const mutualSection = dom.createElement('section')\n mutualSection.className = 'social-pane__mutual-friends social-primary__panel'\n mutualSection.id = 'social-panel-mutual'\n mutualSection.setAttribute('role', 'tabpanel')\n mutualSection.setAttribute('aria-labelledby', 'social-tab-mutual')\n\n const mutualContent = mutualSection.appendChild(dom.createElement('div'))\n mutualContent.classList.add('social-main', 'social-main--mutual', 'flex-column')\n\n const relationshipSummary = dom.createElement('div')\n relationshipSummary.classList.add('social-mutual-summary', 'flex-column')\n mutualContent.appendChild(relationshipSummary)\n\n const createRelationshipLine = function () {\n const line = relationshipSummary.appendChild(dom.createElement('div'))\n line.classList.add('social-mutual-summary-line')\n return line\n }\n\n const youAndThem = function () {\n const line = createRelationshipLine()\n line.appendChild(link(text('You'), meUri))\n line.appendChild(text(' and '))\n line.appendChild(link(text(familiar), subject.uri))\n return line\n }\n\n if (!incoming) {\n if (!outgoing) {\n const line = youAndThem()\n line.appendChild(text(' have not said you know each other.'))\n } else {\n const line = createRelationshipLine()\n line.appendChild(link(text('You'), meUri))\n line.appendChild(text(' know '))\n line.appendChild(link(text(familiar), subject.uri))\n line.appendChild(text(' (unconfirmed).'))\n }\n } else if (!outgoing) {\n relationshipSummary.classList.add('social-mutual-summary--confirm')\n\n const incomingLine = relationshipSummary.appendChild(dom.createElement('div'))\n incomingLine.classList.add('social-mutual-summary-line')\n incomingLine.appendChild(link(text(familiar), subject.uri))\n incomingLine.appendChild(text(' knows '))\n incomingLine.appendChild(link(text('you'), meUri))\n incomingLine.appendChild(text(' (unconfirmed).'))\n } else {\n const line = youAndThem()\n line.appendChild(text(' say you know each other.'))\n }\n\n const shouldShowCheckboxPreview = Boolean(incoming) && !outgoing\n if (shouldShowCheckboxPreview) {\n const confirmLabel = dom.createElement('span')\n confirmLabel.className = 'social-mutual-confirm-prompt'\n confirmLabel.appendChild(text('Confirm you know '))\n confirmLabel.appendChild(link(text(familiar), subject.uri))\n\n const relationshipForm = buildCheckboxForm(\n confirmLabel,\n new Statement(me, knows, subject, profile ?? undefined),\n Boolean(outgoing),\n {\n disabled: !editable,\n disabledTitle: !editable ? 'Your profile is not editable' : undefined\n }\n )\n relationshipForm.classList.add('social-mutual-checkbox-form')\n\n mutualContent.appendChild(relationshipForm)\n }\n\n if (mutualConnections.length) {\n const mutualFriendsTable = mutualContent.appendChild(dom.createElement('table'))\n mutualFriendsTable.className = 'social-main social-friends-list social-friends-grid'\n\n const createMutualRow = function (target: NamedNode) {\n return widgets.personTR(dom, ns.foaf('knows'), target, {\n renderSupportingInfo,\n renderNameSuffix\n })\n }\n\n refreshMutualFriends = function () {\n const sortedMutualConnections = [...mutualConnections].sort((left, right) => {\n const leftLabel = utils.label(left) || left.value\n const rightLabel = utils.label(right) || right.value\n return leftLabel.localeCompare(rightLabel)\n })\n\n utils.syncTableToArray(\n mutualFriendsTable,\n sortedMutualConnections,\n createMutualRow,\n function (row, thing) {\n const replacement = createMutualRow(thing)\n return replacement\n }\n )\n }\n\n refreshMutualFriends()\n }\n\n return { section: mutualSection, content: mutualContent, refreshMutualFriends }\n}\n\nexport function createAllFriendsSection (options: {\n dom: HTMLDocument,\n subject: NamedNode,\n profile: NamedNode | null,\n editable: boolean,\n renderSupportingInfo: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null,\n renderNameSuffix: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null\n}): { section: HTMLElement, mainTable: HTMLTableElement, friendsList: HTMLElement } {\n const { dom, subject, profile, editable, renderSupportingInfo, renderNameSuffix } = options\n\n const allFriends = dom.createElement('section')\n allFriends.className = 'social-pane__all-friends social-primary__panel'\n allFriends.id = 'social-panel-all-friends'\n allFriends.setAttribute('role', 'tabpanel')\n allFriends.setAttribute('aria-labelledby', 'social-tab-all-friends')\n\n const mainTable = allFriends.appendChild(dom.createElement('table'))\n mainTable.className = 'social-main'\n\n const friendsList = widgets.attachmentList(dom, subject, mainTable, {\n doc: profile,\n modify: !!editable,\n predicate: ns.foaf('knows'),\n noun: 'friend',\n // Social pane already owns the async refresh cycle for friend data in\n // socialPane.ts. Leave attachmentList's generic follow-up rerender disabled\n // here or each fetched friend profile will trigger an extra whole-table refresh\n // on top of the pane's own batched updates.\n refreshOnDocumentLoad: false,\n renderSupportingInfo,\n renderNameSuffix\n })\n friendsList.classList.add('social-friends-list')\n friendsList.style.marginTop = '0'\n\n const friendsListRow = friendsList.querySelector('tr')\n const friendsListPromptCell = friendsListRow?.children?.[0]\n const friendsListRightCell = friendsListRow?.children?.[1]\n const friendsHeaderActions = dom.createElement('div')\n friendsHeaderActions.classList.add('social-friends-header-actions')\n\n if (friendsListPromptCell instanceof HTMLTableCellElement) {\n friendsListPromptCell.classList.add('social-friends-header-dropzone-cell')\n const friendsHeaderDropzone = dom.createElement('table')\n friendsHeaderDropzone.className = 'social-friends-header-dropzone'\n friendsHeaderDropzone.setAttribute('role', 'presentation')\n const friendsHeaderDropzoneBody = friendsHeaderDropzone.appendChild(dom.createElement('tbody'))\n const friendsHeaderDropzoneRow = friendsHeaderDropzoneBody.appendChild(dom.createElement('tr'))\n friendsHeaderDropzoneRow.appendChild(friendsListPromptCell)\n friendsHeaderActions.appendChild(friendsHeaderDropzone)\n } else if (friendsListPromptCell instanceof HTMLElement) {\n while (friendsListPromptCell.firstChild) {\n friendsHeaderActions.appendChild(friendsListPromptCell.firstChild)\n }\n friendsListPromptCell.remove()\n }\n\n const friendDropButtons = friendsHeaderActions.querySelectorAll('button')\n if (editable && friendDropButtons.length > 0) {\n friendDropButtons.forEach((button) => {\n button.setAttribute('title', 'Drop friend here')\n button.setAttribute('aria-label', 'Drop friend here')\n const buttonImages = button.querySelectorAll('img')\n buttonImages.forEach((image) => {\n image.setAttribute('title', 'Drop friend here')\n image.setAttribute('alt', 'Drop friend here')\n })\n })\n\n const friendsActionsRow = dom.createElement('div')\n friendsActionsRow.className = 'social-friends-header-actions social-friends-header-actions--standalone'\n friendsActionsRow.appendChild(friendsHeaderActions)\n const dropHint = dom.createElement('span')\n dropHint.className = 'social-friends-header-hint'\n dropHint.textContent = 'Drag a WebId on the target to add a friend.'\n friendsActionsRow.appendChild(dropHint)\n allFriends.prepend(friendsActionsRow)\n }\n\n if (friendsListRightCell instanceof HTMLTableCellElement) {\n friendsListRightCell.colSpan = 2\n }\n\n const friendsItemsTable = friendsList.querySelector('td table')\n if (friendsItemsTable instanceof HTMLTableElement) {\n friendsItemsTable.classList.add('social-friends-grid')\n }\n\n return { section: allFriends, mainTable, friendsList }\n}\n\nexport function createRequestsSection (options: {\n dom: HTMLDocument,\n triage: FriendshipTriage,\n renderSupportingInfo: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null,\n renderNameSuffix: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null\n}): { section: HTMLElement, refreshRequests: (triage: FriendshipTriage) => void } {\n const { dom, triage, renderSupportingInfo, renderNameSuffix } = options\n\n const requestsSection = dom.createElement('section')\n requestsSection.className = 'social-pane__requests social-primary__panel'\n requestsSection.id = 'social-panel-requests'\n requestsSection.setAttribute('role', 'tabpanel')\n requestsSection.setAttribute('aria-labelledby', 'social-tab-requests')\n\n const requestsContent = requestsSection.appendChild(dom.createElement('div'))\n requestsContent.classList.add('social-main', 'social-main--requests', 'flex-column')\n\n const note = requestsContent.appendChild(dom.createElement('p'))\n note.className = 'social-requests__note'\n note.textContent = 'Best effort preview: this view only reflects profile documents that are currently loaded. A dedicated inbox would still be needed for complete request discovery.'\n\n const createRequestGroup = function (title: string, description: string, emptyText: string) {\n const group = requestsContent.appendChild(dom.createElement('section'))\n group.classList.add('social-requests__group', 'flex-column')\n\n const header = group.appendChild(dom.createElement('div'))\n header.className = 'social-requests__group-header'\n\n const heading = header.appendChild(dom.createElement('h2'))\n heading.className = 'social-requests__group-title'\n heading.textContent = title\n\n const blurb = header.appendChild(dom.createElement('p'))\n blurb.className = 'social-requests__group-description'\n blurb.textContent = description\n\n const empty = group.appendChild(dom.createElement('p'))\n empty.className = 'social-requests__empty'\n empty.textContent = emptyText\n\n const table = group.appendChild(dom.createElement('table'))\n table.className = 'social-main social-friends-list social-friends-grid social-requests__table'\n\n return { empty, table }\n }\n\n const incomingGroup = createRequestGroup(\n 'Incoming requests',\n 'People who say they know this profile, but have not been confirmed yet.',\n 'No incoming requests are visible from the currently loaded data.'\n )\n const pendingGroup = createRequestGroup(\n 'Awaiting confirmation',\n 'People this profile knows who have not linked back yet.',\n 'Nothing is waiting for confirmation right now.'\n )\n\n const createPersonRow = function (target: NamedNode) {\n return widgets.personTR(dom, ns.foaf('knows'), target, {\n renderSupportingInfo,\n renderNameSuffix\n })\n }\n\n const sortNodes = function (nodes: NamedNode[]) {\n return [...nodes].sort((left, right) => {\n const leftLabel = utils.label(left) || left.value\n const rightLabel = utils.label(right) || right.value\n return leftLabel.localeCompare(rightLabel)\n })\n }\n\n const syncRequestGroup = function (\n group: { empty: HTMLElement, table: HTMLTableElement },\n nodes: NamedNode[]\n ) {\n const sortedNodes = sortNodes(nodes)\n group.empty.hidden = sortedNodes.length > 0\n group.table.hidden = sortedNodes.length === 0\n\n utils.syncTableToArray(\n group.table,\n sortedNodes,\n createPersonRow,\n function (_row, thing) {\n return createPersonRow(thing)\n }\n )\n }\n\n const refreshRequests = function (nextTriage: FriendshipTriage) {\n syncRequestGroup(incomingGroup, nextTriage.requests)\n syncRequestGroup(pendingGroup, nextTriage.unconfirmed)\n }\n\n refreshRequests(triage)\n\n return { section: requestsSection, refreshRequests }\n}\n"],"mappings":"iJAwCA,SAAgB,EACd,EACA,EACA,EACA,EACA,EACqB,CACrB,IAAM,EAAM,EAAQ,IACT,EAAQ,QAAQ,MAD3B,IAEM,EAAS,EAAI,cAAc,QAAQ,EACzC,EAAO,UAAY,sBACnB,IAAI,EAAiB,EAEf,EAAe,UAAY,CAC/B,EAAO,gBAAgB,EACvB,IAAM,EAAc,EAAe,EAE7B,EAAgB,EAAI,cAAc,KAAK,EAC7C,EAAc,UAAY,8BAE1B,IAAM,EAAgB,EAAI,cAAc,KAAK,EAG7C,GAFA,EAAc,UAAY,wEAEtB,GAAe,SAGR,EAAe,aAAe,iBAAmB,EAAe,oBAAqB,CAC9F,EAAc,UAAU,IAAI,qCAAqC,EACjE,IAAM,GAAA,EAAA,EAAA,+BAAA,CAAoD,EAAS,CAAO,EAC1E,EAAmB,UAAU,IAAI,aAAa,EAC9C,EAAc,YAAY,CAAkB,CAC9C,CAEA,EAAO,YAAY,CAAa,EAEhC,IAAM,EAAc,EAAI,cAAc,KAAK,EAC3C,EAAY,UAAY,4BACxB,EAAc,YAAY,CAAW,EAEjC,GACF,EAAY,YAAY,EAAY,EAAK,EAAY,SAAU,EAAY,IAAI,CAAC,EAGlF,IAAM,EAAgB,EAAI,cAAc,KAAK,EAC7C,EAAc,UAAY,8BAC1B,EAAc,YAAY,CAAa,EAEnC,EAAc,WAAW,OAAS,GACpC,EAAc,YAAY,CAAa,EAGzC,IAAM,EAAgB,EAAI,cAAc,KAAK,EAC7C,EAAc,UAAU,IAAI,8BAA+B,aAAa,EACxE,EAAc,YAAY,CAAa,EAEvC,IAAM,EAAO,GAAa,MAAQ,EAAA,MAAM,MAAM,CAAO,EAC/C,EAAK,EAAI,cAAc,IAAI,EACjC,EAAG,UAAU,IAAI,0BAA0B,EAC3C,EAAG,YAAY,EAAI,eAAe,CAAI,CAAC,EACvC,EAAc,YAAY,CAAE,EAE5B,IAAM,EAAqB,CAAC,GAAa,SAAU,GAAa,YAAY,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK,EACxG,GAAI,EAAoB,CACtB,IAAM,EAAU,EAAI,cAAc,KAAK,EACvC,EAAQ,UAAY,8BACpB,EAAQ,YAAc,EACtB,EAAc,YAAY,CAAO,CACnC,CAEA,GAAI,GAAa,SAAU,CACzB,IAAM,EAAe,EAAI,cAAc,KAAK,EAC5C,EAAa,UAAY,+BAEzB,IAAM,EAAmB,EAAI,cAAc,MAAM,EACjD,EAAiB,UAAU,IAAI,oCAAqC,iBAAiB,EACrF,EAAiB,UAAY,EAAA,aAC7B,EAAa,YAAY,CAAgB,EACzC,EAAa,YAAY,EAAI,eAAe,EAAY,QAAQ,CAAC,EAEjE,EAAc,YAAY,CAAY,CACxC,CAEA,IAAM,EAAW,EAAI,cAAc,KAAK,EACxC,EAAS,UAAY,4BAErB,IAAM,EAAc,EAAI,cAAc,QAAQ,EAC9C,EAAY,UAAY,2BACxB,EAAY,KAAO,SACnB,IAAM,EAAmB,EAAI,cAAc,MAAM,EASjD,GARA,EAAiB,UAAY,iCAC7B,EAAiB,YAAc,GAAG,EAAM,YAAY,SAAS,EAAM,cAAgB,EAAI,GAAK,MAC5F,EAAY,YAAY,CAAgB,EACpC,EAAM,iBACR,EAAY,iBAAiB,QAAS,EAAM,eAAe,EAE7D,EAAS,YAAY,CAAW,EAE5B,OAAO,EAAM,mBAAsB,SAAU,CAC/C,IAAM,EAAc,EAAI,cAAc,QAAQ,EAC9C,EAAY,UAAY,2BACxB,EAAY,KAAO,SACnB,IAAM,EAAmB,EAAI,cAAc,MAAM,EACjD,EAAiB,UAAY,iCAC7B,EAAiB,YAAc,GAAG,EAAM,kBAAkB,gBAAgB,EAAM,oBAAsB,EAAI,GAAK,MAC/G,EAAY,YAAY,CAAgB,EACpC,EAAM,gBACR,EAAY,iBAAiB,QAAS,EAAM,cAAc,EAE5D,EAAS,YAAY,CAAW,CAClC,CAEA,EAAc,YAAY,CAAQ,CAEpC,EASA,MAPA,GAAO,oBAAsB,SAAU,EAA8B,CACnE,EAAiB,EACjB,EAAa,CACf,EAEA,EAAa,EAEN,CACT,CAEA,SAAS,EAAa,EAAmB,EAAgC,EAAM,GAAiB,CAC9F,GAAI,EAAK,CACP,IAAM,EAAM,EAAI,cAAc,KAAK,EAOnC,MANA,GAAI,UAAY,2BAChB,EAAI,IAAM,EACV,EAAI,IAAM,EACV,EAAI,MAAQ,IACZ,EAAI,OAAS,IACb,EAAI,QAAU,QACP,CACT,CAEA,IAAM,EAAW,EAAI,cAAc,KAAK,EACxC,EAAS,UAAY,2CACrB,EAAS,aAAa,OAAQ,KAAK,EACnC,EAAS,aAAa,aAAc,CAAG,EACvC,EAAS,SAAW,EAEpB,IAAM,EAAO,EAAI,cAAc,MAAM,EAKrC,OAJA,EAAK,UAAU,IAAI,gCAAiC,iBAAiB,EACrE,EAAK,UAAY,EAAA,mBACjB,EAAS,YAAY,CAAI,EAElB,CACT,CAEA,SAAgB,EAAqB,EAsBgD,CACnF,GAAM,CACJ,MACA,UACA,WACA,KACA,QACA,WACA,WACA,WACA,UACA,QACA,oBACA,OACA,OACA,oBACA,uBACA,oBACE,EAEA,EAAuB,UAAY,CAAC,EAElC,EAAgB,EAAI,cAAc,SAAS,EACjD,EAAc,UAAY,oDAC1B,EAAc,GAAK,sBACnB,EAAc,aAAa,OAAQ,UAAU,EAC7C,EAAc,aAAa,kBAAmB,mBAAmB,EAEjE,IAAM,EAAgB,EAAc,YAAY,EAAI,cAAc,KAAK,CAAC,EACxE,EAAc,UAAU,IAAI,cAAe,sBAAuB,aAAa,EAE/E,IAAM,EAAsB,EAAI,cAAc,KAAK,EACnD,EAAoB,UAAU,IAAI,wBAAyB,aAAa,EACxE,EAAc,YAAY,CAAmB,EAE7C,IAAM,EAAyB,UAAY,CACzC,IAAM,EAAO,EAAoB,YAAY,EAAI,cAAc,KAAK,CAAC,EAErE,OADA,EAAK,UAAU,IAAI,4BAA4B,EACxC,CACT,EAEM,EAAa,UAAY,CAC7B,IAAM,EAAO,EAAuB,EAIpC,OAHA,EAAK,YAAY,EAAK,EAAK,KAAK,EAAG,CAAK,CAAC,EACzC,EAAK,YAAY,EAAK,OAAO,CAAC,EAC9B,EAAK,YAAY,EAAK,EAAK,CAAQ,EAAG,EAAQ,GAAG,CAAC,EAC3C,CACT,EAEA,GAAI,CAAC,EACH,GAAI,CAAC,EAEH,EAAA,CAAA,CAAK,YAAY,EAAK,qCAAqC,CAAC,MACvD,CACL,IAAM,EAAO,EAAuB,EACpC,EAAK,YAAY,EAAK,EAAK,KAAK,EAAG,CAAK,CAAC,EACzC,EAAK,YAAY,EAAK,QAAQ,CAAC,EAC/B,EAAK,YAAY,EAAK,EAAK,CAAQ,EAAG,EAAQ,GAAG,CAAC,EAClD,EAAK,YAAY,EAAK,iBAAiB,CAAC,CAC1C,MACK,GAAK,EAWV,EAAA,CAAA,CAAK,YAAY,EAAK,2BAA2B,CAAC,MAX9B,CACpB,EAAoB,UAAU,IAAI,gCAAgC,EAElE,IAAM,EAAe,EAAoB,YAAY,EAAI,cAAc,KAAK,CAAC,EAC7E,EAAa,UAAU,IAAI,4BAA4B,EACvD,EAAa,YAAY,EAAK,EAAK,CAAQ,EAAG,EAAQ,GAAG,CAAC,EAC1D,EAAa,YAAY,EAAK,SAAS,CAAC,EACxC,EAAa,YAAY,EAAK,EAAK,KAAK,EAAG,CAAK,CAAC,EACjD,EAAa,YAAY,EAAK,iBAAiB,CAAC,CAClD,CAMA,GAD0C,GAAa,CAAC,EACzB,CAC7B,IAAM,EAAe,EAAI,cAAc,MAAM,EAC7C,EAAa,UAAY,+BACzB,EAAa,YAAY,EAAK,mBAAmB,CAAC,EAClD,EAAa,YAAY,EAAK,EAAK,CAAQ,EAAG,EAAQ,GAAG,CAAC,EAE1D,IAAM,EAAmB,EACvB,EACA,IAAI,EAAA,UAAU,EAAI,EAAO,EAAS,GAAW,IAAA,EAAS,EACtD,EAAQ,EACR,CACE,SAAU,CAAC,EACX,cAAgB,EAA4C,IAAA,GAAjC,8BAC7B,CACF,EACA,EAAiB,UAAU,IAAI,6BAA6B,EAE5D,EAAc,YAAY,CAAgB,CAC5C,CAEA,GAAI,EAAkB,OAAQ,CAC5B,IAAM,EAAqB,EAAc,YAAY,EAAI,cAAc,OAAO,CAAC,EAC/E,EAAmB,UAAY,sDAE/B,IAAM,EAAkB,SAAU,EAAmB,CACnD,OAAO,EAAA,QAAQ,SAAS,EAAK,EAAA,GAAG,KAAK,OAAO,EAAG,EAAQ,CACrD,uBACA,kBACF,CAAC,CACH,EAEA,EAAuB,UAAY,CACjC,IAAM,EAA0B,CAAC,GAAG,CAAiB,CAAC,CAAC,MAAM,EAAM,IAAU,CAC3E,IAAM,EAAY,EAAA,MAAM,MAAM,CAAI,GAAK,EAAK,MACtC,EAAa,EAAA,MAAM,MAAM,CAAK,GAAK,EAAM,MAC/C,OAAO,EAAU,cAAc,CAAU,CAC3C,CAAC,EAED,EAAA,MAAM,iBACJ,EACA,EACA,EACA,SAAU,EAAK,EAAO,CAEpB,OADoB,EAAgB,CAC7B,CACT,CACF,CACF,EAEA,EAAqB,CACvB,CAEA,MAAO,CAAE,QAAS,EAAe,QAAS,EAAe,sBAAqB,CAChF,CAEA,SAAgB,EAAyB,EAO2C,CAClF,GAAM,CAAE,MAAK,UAAS,UAAS,WAAU,uBAAsB,oBAAqB,EAE9E,EAAa,EAAI,cAAc,SAAS,EAC9C,EAAW,UAAY,iDACvB,EAAW,GAAK,2BAChB,EAAW,aAAa,OAAQ,UAAU,EAC1C,EAAW,aAAa,kBAAmB,wBAAwB,EAEnE,IAAM,EAAY,EAAW,YAAY,EAAI,cAAc,OAAO,CAAC,EACnE,EAAU,UAAY,cAEtB,IAAM,EAAc,EAAA,QAAQ,eAAe,EAAK,EAAS,EAAW,CAClE,IAAK,EACL,OAAQ,CAAC,CAAC,EACV,UAAW,EAAA,GAAG,KAAK,OAAO,EAC1B,KAAM,SAKN,sBAAuB,GACvB,uBACA,kBACF,CAAC,EACD,EAAY,UAAU,IAAI,qBAAqB,EAC/C,EAAY,MAAM,UAAY,IAE9B,IAAM,EAAiB,EAAY,cAAc,IAAI,EAC/C,EAAwB,GAAgB,WAAW,GACnD,EAAuB,GAAgB,WAAW,GAClD,EAAuB,EAAI,cAAc,KAAK,EAGpD,GAFA,EAAqB,UAAU,IAAI,+BAA+B,EAE9D,aAAiC,qBAAsB,CACzD,EAAsB,UAAU,IAAI,qCAAqC,EACzE,IAAM,EAAwB,EAAI,cAAc,OAAO,EACvD,EAAsB,UAAY,iCAClC,EAAsB,aAAa,OAAQ,cAAc,EAGzD,EAFwD,YAAY,EAAI,cAAc,OAAO,CAC5D,CAAA,CAA0B,YAAY,EAAI,cAAc,IAAI,CAC7F,CAAA,CAAyB,YAAY,CAAqB,EAC1D,EAAqB,YAAY,CAAqB,CACxD,MAAO,GAAI,aAAiC,YAAa,CACvD,KAAO,EAAsB,YAC3B,EAAqB,YAAY,EAAsB,UAAU,EAEnE,EAAsB,OAAO,CAC/B,CAEA,IAAM,EAAoB,EAAqB,iBAAiB,QAAQ,EACxE,GAAI,GAAY,EAAkB,OAAS,EAAG,CAC5C,EAAkB,QAAS,GAAW,CACpC,EAAO,aAAa,QAAS,kBAAkB,EAC/C,EAAO,aAAa,aAAc,kBAAkB,EAEpD,EAD4B,iBAAiB,KAC7C,CAAA,CAAa,QAAS,GAAU,CAC9B,EAAM,aAAa,QAAS,kBAAkB,EAC9C,EAAM,aAAa,MAAO,kBAAkB,CAC9C,CAAC,CACH,CAAC,EAED,IAAM,EAAoB,EAAI,cAAc,KAAK,EACjD,EAAkB,UAAY,0EAC9B,EAAkB,YAAY,CAAoB,EAClD,IAAM,EAAW,EAAI,cAAc,MAAM,EACzC,EAAS,UAAY,6BACrB,EAAS,YAAc,8CACvB,EAAkB,YAAY,CAAQ,EACtC,EAAW,QAAQ,CAAiB,CACtC,CAEI,aAAgC,uBAClC,EAAqB,QAAU,GAGjC,IAAM,EAAoB,EAAY,cAAc,UAAU,EAK9D,OAJI,aAA6B,kBAC/B,EAAkB,UAAU,IAAI,qBAAqB,EAGhD,CAAE,QAAS,EAAY,YAAW,aAAY,CACvD,CAEA,SAAgB,EAAuB,EAK2C,CAChF,GAAM,CAAE,MAAK,SAAQ,uBAAsB,oBAAqB,EAE1D,EAAkB,EAAI,cAAc,SAAS,EACnD,EAAgB,UAAY,8CAC5B,EAAgB,GAAK,wBACrB,EAAgB,aAAa,OAAQ,UAAU,EAC/C,EAAgB,aAAa,kBAAmB,qBAAqB,EAErE,IAAM,EAAkB,EAAgB,YAAY,EAAI,cAAc,KAAK,CAAC,EAC5E,EAAgB,UAAU,IAAI,cAAe,wBAAyB,aAAa,EAEnF,IAAM,EAAO,EAAgB,YAAY,EAAI,cAAc,GAAG,CAAC,EAC/D,EAAK,UAAY,wBACjB,EAAK,YAAc,oKAEnB,IAAM,EAAqB,SAAU,EAAe,EAAqB,EAAmB,CAC1F,IAAM,EAAQ,EAAgB,YAAY,EAAI,cAAc,SAAS,CAAC,EACtE,EAAM,UAAU,IAAI,yBAA0B,aAAa,EAE3D,IAAM,EAAS,EAAM,YAAY,EAAI,cAAc,KAAK,CAAC,EACzD,EAAO,UAAY,gCAEnB,IAAM,EAAU,EAAO,YAAY,EAAI,cAAc,IAAI,CAAC,EAC1D,EAAQ,UAAY,+BACpB,EAAQ,YAAc,EAEtB,IAAM,EAAQ,EAAO,YAAY,EAAI,cAAc,GAAG,CAAC,EACvD,EAAM,UAAY,qCAClB,EAAM,YAAc,EAEpB,IAAM,EAAQ,EAAM,YAAY,EAAI,cAAc,GAAG,CAAC,EACtD,EAAM,UAAY,yBAClB,EAAM,YAAc,EAEpB,IAAM,EAAQ,EAAM,YAAY,EAAI,cAAc,OAAO,CAAC,EAG1D,MAFA,GAAM,UAAY,6EAEX,CAAE,QAAO,OAAM,CACxB,EAEM,EAAgB,EACpB,oBACA,0EACA,kEACF,EACM,EAAe,EACnB,wBACA,0DACA,gDACF,EAEM,EAAkB,SAAU,EAAmB,CACnD,OAAO,EAAA,QAAQ,SAAS,EAAK,EAAA,GAAG,KAAK,OAAO,EAAG,EAAQ,CACrD,uBACA,kBACF,CAAC,CACH,EAEM,EAAY,SAAU,EAAoB,CAC9C,MAAO,CAAC,GAAG,CAAK,CAAC,CAAC,MAAM,EAAM,IAAU,CACtC,IAAM,EAAY,EAAA,MAAM,MAAM,CAAI,GAAK,EAAK,MACtC,EAAa,EAAA,MAAM,MAAM,CAAK,GAAK,EAAM,MAC/C,OAAO,EAAU,cAAc,CAAU,CAC3C,CAAC,CACH,EAEM,EAAmB,SACvB,EACA,EACA,CACA,IAAM,EAAc,EAAU,CAAK,EACnC,EAAM,MAAM,OAAS,EAAY,OAAS,EAC1C,EAAM,MAAM,OAAS,EAAY,SAAW,EAE5C,EAAA,MAAM,iBACJ,EAAM,MACN,EACA,EACA,SAAU,EAAM,EAAO,CACrB,OAAO,EAAgB,CAAK,CAC9B,CACF,CACF,EAEM,EAAkB,SAAU,EAA8B,CAC9D,EAAiB,EAAe,EAAW,QAAQ,EACnD,EAAiB,EAAc,EAAW,WAAW,CACvD,EAIA,OAFA,EAAgB,CAAM,EAEf,CAAE,QAAS,EAAiB,iBAAgB,CACrD"}
1
+ {"version":3,"file":"socialSections.cjs.js","names":[],"sources":["../../src/social/socialSections.ts"],"sourcesContent":["import { DataBrowserContext } from 'pane-registry'\nimport { createAddMeToYourFriendsButton } from 'profile-pane'\nimport { Statement, NamedNode } from 'rdflib'\nimport { ns, utils, widgets } from 'solid-ui'\nimport { appendProfileLinks } from './editProfileDetails'\nimport { locationIcon, personInCircleIcon as personInCircleIconSvg } from './icons'\nimport { FriendshipTriage } from './triage'\n\nexport type ViewerMode = 'owner' | 'authenticated' | 'anonymous'\n\nexport type HeaderControls = {\n canEdit: boolean,\n viewerMode: ViewerMode,\n showAddFriendAction?: boolean\n}\n\nexport type SocialHeaderElement = HTMLElement & {\n refreshSocialHeader?: (controls: HeaderControls) => void\n}\n\nexport type HeaderStats = {\n friendCount: number,\n mutualFriendCount: number | null,\n onSelectFriends?: () => void,\n onSelectMutual?: () => void\n}\n\nexport type HeaderProfileData = {\n imageUrl?: string,\n name?: string,\n jobTitle?: string,\n organization?: string,\n location?: string | null\n} | null\n\nexport type FriendRowRenderers = {\n renderSupportingInfo: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null,\n renderNameSuffix: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null\n}\n\nexport function createHeaderSection (\n context: DataBrowserContext,\n subject: NamedNode,\n controls: HeaderControls,\n stats: HeaderStats,\n getProfileData: () => HeaderProfileData\n): SocialHeaderElement {\n const dom = context.dom\n const kb = context.session.store\n const header = dom.createElement('header') as SocialHeaderElement\n header.className = 'social-pane__header'\n let headerControls = controls\n\n const renderHeader = function () {\n header.replaceChildren()\n const profileData = getProfileData()\n\n const headerContent = dom.createElement('div')\n headerContent.className = 'social-pane__header-content'\n\n const headerActions = dom.createElement('div')\n headerActions.className = 'social-pane__header-actions profile__actions profile__heading-actions'\n\n if (headerControls.canEdit) {\n // Hidden for now because the social pane header edit control does not match the new design.\n // Revisit later if we decide to restore profile-link editing here.\n } else if (headerControls.viewerMode === 'authenticated' && headerControls.showAddFriendAction) {\n headerActions.classList.add('social-pane__header-actions--friend')\n const addToFriendsButton = createAddMeToYourFriendsButton(subject, context)\n addToFriendsButton.classList.add('flex-center')\n headerActions.appendChild(addToFriendsButton)\n }\n\n header.appendChild(headerContent)\n\n const headerMedia = dom.createElement('div')\n headerMedia.className = 'social-pane__header-media'\n headerContent.appendChild(headerMedia)\n\n if (profileData) {\n headerMedia.appendChild(createImage(dom, profileData.imageUrl, profileData.name))\n }\n\n const headerDetails = dom.createElement('div')\n headerDetails.className = 'social-pane__header-details'\n headerContent.appendChild(headerDetails)\n\n if (headerActions.childNodes.length > 0) {\n headerContent.appendChild(headerActions)\n }\n\n const headerSummary = dom.createElement('div')\n headerSummary.classList.add('social-pane__header-summary', 'flex-column')\n headerDetails.appendChild(headerSummary)\n\n const name = profileData?.name || utils.label(subject)\n const h1 = dom.createElement('h1')\n h1.classList.add('social-pane__header-name')\n h1.appendChild(dom.createTextNode(name))\n headerSummary.appendChild(h1)\n\n const jobAndOrganization = [profileData?.jobTitle, profileData?.organization].filter(Boolean).join(' | ')\n if (jobAndOrganization) {\n const jobLine = dom.createElement('div')\n jobLine.className = 'social-pane__header-job-org'\n jobLine.textContent = jobAndOrganization\n headerSummary.appendChild(jobLine)\n }\n\n if (profileData?.location) {\n const locationLine = dom.createElement('div')\n locationLine.className = 'social-pane__header-location'\n\n const locationIconSpan = dom.createElement('span')\n locationIconSpan.classList.add('social-pane__header-location-icon', 'inline-flex-row')\n locationIconSpan.innerHTML = locationIcon\n locationLine.appendChild(locationIconSpan)\n locationLine.appendChild(dom.createTextNode(profileData.location))\n\n headerSummary.appendChild(locationLine)\n }\n\n const statsRow = dom.createElement('div')\n statsRow.className = 'social-pane__header-stats'\n\n const friendCount = dom.createElement('button')\n friendCount.className = 'social-pane__header-stat'\n friendCount.type = 'button'\n const friendCountLabel = dom.createElement('span')\n friendCountLabel.className = 'social-pane__header-stat-label'\n friendCountLabel.textContent = `${stats.friendCount} friend${stats.friendCount === 1 ? '' : 's'}`\n friendCount.appendChild(friendCountLabel)\n if (stats.onSelectFriends) {\n friendCount.addEventListener('click', stats.onSelectFriends)\n }\n statsRow.appendChild(friendCount)\n\n if (typeof stats.mutualFriendCount === 'number') {\n const mutualCount = dom.createElement('button')\n mutualCount.className = 'social-pane__header-stat'\n mutualCount.type = 'button'\n const mutualCountLabel = dom.createElement('span')\n mutualCountLabel.className = 'social-pane__header-stat-label'\n mutualCountLabel.textContent = `${stats.mutualFriendCount} mutual friend${stats.mutualFriendCount === 1 ? '' : 's'}`\n mutualCount.appendChild(mutualCountLabel)\n if (stats.onSelectMutual) {\n mutualCount.addEventListener('click', stats.onSelectMutual)\n }\n statsRow.appendChild(mutualCount)\n }\n\n headerSummary.appendChild(statsRow)\n appendProfileLinks(headerMedia, dom, kb, subject)\n }\n\n header.refreshSocialHeader = function (nextControls: HeaderControls) {\n headerControls = nextControls\n renderHeader()\n }\n\n renderHeader()\n\n return header\n}\n\nfunction createImage (dom: HTMLDocument, src: string | null | undefined, alt = ''): HTMLElement {\n if (src) {\n const img = dom.createElement('img')\n img.className = 'social-pane__header-hero'\n img.src = src\n img.alt = alt\n img.width = 180\n img.height = 180\n img.loading = 'eager'\n return img\n }\n\n const fallback = dom.createElement('div')\n fallback.className = 'social-pane__header-hero-alt flex-center'\n fallback.setAttribute('role', 'img')\n fallback.setAttribute('aria-label', alt)\n fallback.tabIndex = 0\n\n const icon = dom.createElement('span')\n icon.classList.add('social-pane__header-hero-icon', 'inline-flex-row')\n icon.innerHTML = personInCircleIconSvg\n fallback.appendChild(icon)\n\n return fallback\n}\n\nexport function createMutualSection (options: {\n dom: HTMLDocument,\n subject: NamedNode,\n familiar: string,\n me: NamedNode,\n meUri: string | null,\n incoming: boolean | NamedNode[] | undefined,\n outgoing: boolean | NamedNode[] | undefined,\n editable: boolean,\n profile: NamedNode | null,\n knows: NamedNode,\n mutualConnections: NamedNode[],\n link: (contents: Node, uri: string | null | undefined) => Node,\n text: (value: string) => Text,\n buildCheckboxForm: (\n label: string | Node,\n statement: Statement,\n state: boolean,\n options?: { disabled?: boolean, disabledTitle?: string }\n ) => HTMLElement,\n renderSupportingInfo: FriendRowRenderers['renderSupportingInfo'],\n renderNameSuffix: FriendRowRenderers['renderNameSuffix']\n}): { section: HTMLElement, content: HTMLElement, refreshMutualFriends: () => void } {\n const {\n dom,\n subject,\n familiar,\n me,\n meUri,\n incoming,\n outgoing,\n editable,\n profile,\n knows,\n mutualConnections,\n link,\n text,\n buildCheckboxForm,\n renderSupportingInfo,\n renderNameSuffix\n } = options\n\n let refreshMutualFriends = function () {}\n\n const mutualSection = dom.createElement('section')\n mutualSection.className = 'social-pane__mutual-friends social-primary__panel'\n mutualSection.id = 'social-panel-mutual'\n mutualSection.setAttribute('role', 'tabpanel')\n mutualSection.setAttribute('aria-labelledby', 'social-tab-mutual')\n\n const mutualContent = mutualSection.appendChild(dom.createElement('div'))\n mutualContent.classList.add('social-main', 'social-main--mutual', 'flex-column')\n\n const relationshipSummary = dom.createElement('div')\n relationshipSummary.classList.add('social-mutual-summary', 'flex-column')\n mutualContent.appendChild(relationshipSummary)\n\n const createRelationshipLine = function () {\n const line = relationshipSummary.appendChild(dom.createElement('div'))\n line.classList.add('social-mutual-summary-line')\n return line\n }\n\n const youAndThem = function () {\n const line = createRelationshipLine()\n line.appendChild(link(text('You'), meUri))\n line.appendChild(text(' and '))\n line.appendChild(link(text(familiar), subject.uri))\n return line\n }\n\n if (!incoming) {\n if (!outgoing) {\n const line = youAndThem()\n line.appendChild(text(' have not said you know each other.'))\n } else {\n const line = createRelationshipLine()\n line.appendChild(link(text('You'), meUri))\n line.appendChild(text(' know '))\n line.appendChild(link(text(familiar), subject.uri))\n line.appendChild(text(' (unconfirmed).'))\n }\n } else if (!outgoing) {\n relationshipSummary.classList.add('social-mutual-summary--confirm')\n\n const incomingLine = relationshipSummary.appendChild(dom.createElement('div'))\n incomingLine.classList.add('social-mutual-summary-line')\n incomingLine.appendChild(link(text(familiar), subject.uri))\n incomingLine.appendChild(text(' knows '))\n incomingLine.appendChild(link(text('you'), meUri))\n incomingLine.appendChild(text(' (unconfirmed).'))\n } else {\n const line = youAndThem()\n line.appendChild(text(' say you know each other.'))\n }\n\n const shouldShowCheckboxPreview = Boolean(incoming) && !outgoing\n if (shouldShowCheckboxPreview) {\n const confirmLabel = dom.createElement('span')\n confirmLabel.className = 'social-mutual-confirm-prompt'\n confirmLabel.appendChild(text('Confirm you know '))\n confirmLabel.appendChild(link(text(familiar), subject.uri))\n\n const relationshipForm = buildCheckboxForm(\n confirmLabel,\n new Statement(me, knows, subject, profile ?? undefined),\n Boolean(outgoing),\n {\n disabled: !editable,\n disabledTitle: !editable ? 'Your profile is not editable' : undefined\n }\n )\n relationshipForm.classList.add('social-mutual-checkbox-form')\n\n mutualContent.appendChild(relationshipForm)\n }\n\n if (mutualConnections.length) {\n const mutualFriendsTable = mutualContent.appendChild(dom.createElement('table'))\n mutualFriendsTable.className = 'social-main social-friends-list social-friends-grid'\n\n const createMutualRow = function (target: NamedNode) {\n return widgets.personTR(dom, ns.foaf('knows'), target, {\n renderSupportingInfo,\n renderNameSuffix\n })\n }\n\n refreshMutualFriends = function () {\n const sortedMutualConnections = [...mutualConnections].sort((left, right) => {\n const leftLabel = utils.label(left) || left.value\n const rightLabel = utils.label(right) || right.value\n return leftLabel.localeCompare(rightLabel)\n })\n\n utils.syncTableToArray(\n mutualFriendsTable,\n sortedMutualConnections,\n createMutualRow,\n function (row, thing) {\n const replacement = createMutualRow(thing)\n return replacement\n }\n )\n }\n\n refreshMutualFriends()\n }\n\n return { section: mutualSection, content: mutualContent, refreshMutualFriends }\n}\n\nexport function createAllFriendsSection (options: {\n dom: HTMLDocument,\n subject: NamedNode,\n profile: NamedNode | null,\n editable: boolean,\n renderSupportingInfo: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null,\n renderNameSuffix: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null\n}): { section: HTMLElement, mainTable: HTMLTableElement, friendsList: HTMLElement } {\n const { dom, subject, profile, editable, renderSupportingInfo, renderNameSuffix } = options\n\n const allFriends = dom.createElement('section')\n allFriends.className = 'social-pane__all-friends social-primary__panel'\n allFriends.id = 'social-panel-all-friends'\n allFriends.setAttribute('role', 'tabpanel')\n allFriends.setAttribute('aria-labelledby', 'social-tab-all-friends')\n\n const mainTable = allFriends.appendChild(dom.createElement('table'))\n mainTable.className = 'social-main'\n\n const friendsList = widgets.attachmentList(dom, subject, mainTable, {\n doc: profile,\n modify: !!editable,\n predicate: ns.foaf('knows'),\n noun: 'friend',\n // Social pane already owns the async refresh cycle for friend data in\n // socialPane.ts. Leave attachmentList's generic follow-up rerender disabled\n // here or each fetched friend profile will trigger an extra whole-table refresh\n // on top of the pane's own batched updates.\n refreshOnDocumentLoad: false,\n renderSupportingInfo,\n renderNameSuffix\n })\n friendsList.classList.add('social-friends-list')\n friendsList.style.marginTop = '0'\n\n const friendsListRow = friendsList.querySelector('tr')\n const friendsListPromptCell = friendsListRow?.children?.[0]\n const friendsListRightCell = friendsListRow?.children?.[1]\n const friendsHeaderActions = dom.createElement('div')\n friendsHeaderActions.classList.add('social-friends-header-actions')\n\n if (friendsListPromptCell instanceof HTMLTableCellElement) {\n friendsListPromptCell.classList.add('social-friends-header-dropzone-cell')\n const friendsHeaderDropzone = dom.createElement('table')\n friendsHeaderDropzone.className = 'social-friends-header-dropzone'\n friendsHeaderDropzone.setAttribute('role', 'presentation')\n const friendsHeaderDropzoneBody = friendsHeaderDropzone.appendChild(dom.createElement('tbody'))\n const friendsHeaderDropzoneRow = friendsHeaderDropzoneBody.appendChild(dom.createElement('tr'))\n friendsHeaderDropzoneRow.appendChild(friendsListPromptCell)\n friendsHeaderActions.appendChild(friendsHeaderDropzone)\n } else if (friendsListPromptCell instanceof HTMLElement) {\n while (friendsListPromptCell.firstChild) {\n friendsHeaderActions.appendChild(friendsListPromptCell.firstChild)\n }\n friendsListPromptCell.remove()\n }\n\n const friendDropButtons = friendsHeaderActions.querySelectorAll('button')\n if (editable && friendDropButtons.length > 0) {\n friendDropButtons.forEach((button) => {\n button.setAttribute('title', 'Drop friend here')\n button.setAttribute('aria-label', 'Drop friend here')\n const buttonImages = button.querySelectorAll('img')\n buttonImages.forEach((image) => {\n image.setAttribute('title', 'Drop friend here')\n image.setAttribute('alt', 'Drop friend here')\n })\n })\n\n const friendsActionsRow = dom.createElement('div')\n friendsActionsRow.className = 'social-friends-header-actions social-friends-header-actions--standalone'\n friendsActionsRow.appendChild(friendsHeaderActions)\n const dropHint = dom.createElement('span')\n dropHint.className = 'social-friends-header-hint'\n dropHint.textContent = 'Drag a WebId on the target to add a friend.'\n friendsActionsRow.appendChild(dropHint)\n allFriends.prepend(friendsActionsRow)\n }\n\n if (friendsListRightCell instanceof HTMLTableCellElement) {\n friendsListRightCell.colSpan = 2\n }\n\n const friendsItemsTable = friendsList.querySelector('td table')\n if (friendsItemsTable instanceof HTMLTableElement) {\n friendsItemsTable.classList.add('social-friends-grid')\n }\n\n return { section: allFriends, mainTable, friendsList }\n}\n\nexport function createRequestsSection (options: {\n dom: HTMLDocument,\n triage: FriendshipTriage,\n renderSupportingInfo: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null,\n renderNameSuffix: (target: NamedNode, renderDom: HTMLDocument) => HTMLElement | null\n}): { section: HTMLElement, refreshRequests: (triage: FriendshipTriage) => void } {\n const { dom, triage, renderSupportingInfo, renderNameSuffix } = options\n\n const requestsSection = dom.createElement('section')\n requestsSection.className = 'social-pane__requests social-primary__panel'\n requestsSection.id = 'social-panel-requests'\n requestsSection.setAttribute('role', 'tabpanel')\n requestsSection.setAttribute('aria-labelledby', 'social-tab-requests')\n\n const requestsContent = requestsSection.appendChild(dom.createElement('div'))\n requestsContent.classList.add('social-main', 'social-main--requests', 'flex-column')\n\n const note = requestsContent.appendChild(dom.createElement('p'))\n note.className = 'social-requests__note'\n note.textContent = 'Best effort preview: this view only reflects profile documents that are currently loaded. A dedicated inbox would still be needed for complete request discovery.'\n\n const createRequestGroup = function (title: string, description: string, emptyText: string) {\n const group = requestsContent.appendChild(dom.createElement('section'))\n group.classList.add('social-requests__group', 'flex-column')\n\n const header = group.appendChild(dom.createElement('div'))\n header.className = 'social-requests__group-header'\n\n const heading = header.appendChild(dom.createElement('h2'))\n heading.className = 'social-requests__group-title'\n heading.textContent = title\n\n const blurb = header.appendChild(dom.createElement('p'))\n blurb.className = 'social-requests__group-description'\n blurb.textContent = description\n\n const empty = group.appendChild(dom.createElement('p'))\n empty.className = 'social-requests__empty'\n empty.textContent = emptyText\n\n const table = group.appendChild(dom.createElement('table'))\n table.className = 'social-main social-friends-list social-friends-grid social-requests__table'\n\n return { empty, table }\n }\n\n const incomingGroup = createRequestGroup(\n 'Incoming requests',\n 'People who say they know this profile, but have not been confirmed yet.',\n 'No incoming requests are visible from the currently loaded data.'\n )\n const pendingGroup = createRequestGroup(\n 'Awaiting confirmation',\n 'People this profile knows who have not linked back yet.',\n 'Nothing is waiting for confirmation right now.'\n )\n\n const createPersonRow = function (target: NamedNode) {\n return widgets.personTR(dom, ns.foaf('knows'), target, {\n renderSupportingInfo,\n renderNameSuffix\n })\n }\n\n const sortNodes = function (nodes: NamedNode[]) {\n return [...nodes].sort((left, right) => {\n const leftLabel = utils.label(left) || left.value\n const rightLabel = utils.label(right) || right.value\n return leftLabel.localeCompare(rightLabel)\n })\n }\n\n const syncRequestGroup = function (\n group: { empty: HTMLElement, table: HTMLTableElement },\n nodes: NamedNode[]\n ) {\n const sortedNodes = sortNodes(nodes)\n group.empty.hidden = sortedNodes.length > 0\n group.table.hidden = sortedNodes.length === 0\n\n utils.syncTableToArray(\n group.table,\n sortedNodes,\n createPersonRow,\n function (_row, thing) {\n return createPersonRow(thing)\n }\n )\n }\n\n const refreshRequests = function (nextTriage: FriendshipTriage) {\n syncRequestGroup(incomingGroup, nextTriage.requests)\n syncRequestGroup(pendingGroup, nextTriage.unconfirmed)\n }\n\n refreshRequests(triage)\n\n return { section: requestsSection, refreshRequests }\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
+ require("../_virtual/_rolldown/runtime.cjs.js");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":"0EAiBA,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,2 +1,2 @@
1
- let e=require("solid-ui");var t={icon:e.icons.iconBase+`noun_688606.svg`,name:`tabbed`,audience:[e.ns.solid(`PowerUser`)],label:(t,n)=>{let r=n.session.store.findTypeURIs(t);return e.ns.meeting(`Cluster`).uri in r?`Tabbed`:null},render:(t,n)=>{let r=n.dom,i=n.session.store,a=r.createElement(`div`);return(async()=>{if(!i.fetcher)throw Error(`Store has no fetcher`);await i.fetcher.load(t),a.appendChild(e.tabs.tabWidget({dom:r,subject:t,predicate:i.any(t,e.ns.meeting(`predicate`))||e.ns.meeting(`toolList`),ordered:!0,orientation:i.anyValue(t,e.ns.meeting(`orientation`))||`0`,renderMain:(e,t)=>{e.innerHTML=``;let r=e.appendChild(n.dom.createElement(`table`));n.getOutliner(n.dom).GotoSubject(t,!0,null,!1,void 0,r)},renderTab:(r,a)=>{let o=i.the(t,e.ns.meeting(`predicate`));r.appendChild(e.widgets.personTR(n.dom,o,a,{}))},backgroundColor:i.anyValue(t,e.ns.ui(`backgroundColor`))||`#ddddcc`}))})(),a}};exports.default=t;
1
+ require("../_virtual/_rolldown/runtime.cjs.js");let e=require("solid-ui");var t={icon:e.icons.iconBase+`noun_688606.svg`,name:`tabbed`,audience:[e.ns.solid(`PowerUser`)],label:(t,n)=>{let r=n.session.store.findTypeURIs(t);return e.ns.meeting(`Cluster`).uri in r?`Tabbed`:null},render:(t,n)=>{let r=n.dom,i=n.session.store,a=r.createElement(`div`);return(async()=>{if(!i.fetcher)throw Error(`Store has no fetcher`);await i.fetcher.load(t),a.appendChild(e.tabs.tabWidget({dom:r,subject:t,predicate:i.any(t,e.ns.meeting(`predicate`))||e.ns.meeting(`toolList`),ordered:!0,orientation:i.anyValue(t,e.ns.meeting(`orientation`))||`0`,renderMain:(e,t)=>{e.innerHTML=``;let r=e.appendChild(n.dom.createElement(`table`));n.getOutliner(n.dom).GotoSubject(t,!0,null,!1,void 0,r)},renderTab:(r,a)=>{let o=i.the(t,e.ns.meeting(`predicate`));r.appendChild(e.widgets.personTR(n.dom,o,a,{}))},backgroundColor:i.anyValue(t,e.ns.ui(`backgroundColor`))||`#ddddcc`}))})(),a}};exports.default=t;
2
2
  //# sourceMappingURL=tabbedPane.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tabbedPane.cjs.js","names":[],"sources":["../../src/tabbed/tabbedPane.ts"],"sourcesContent":["/* Tabbed view of anything\n **\n ** data-driven\n **\n */\nimport { Store } from 'rdflib'\nimport { PaneDefinition } from 'pane-registry'\nimport { icons, ns, tabs, widgets } from 'solid-ui'\n\nconst TabbedPane: PaneDefinition = {\n icon: icons.iconBase + 'noun_688606.svg',\n\n name: 'tabbed',\n\n audience: [ns.solid('PowerUser')],\n\n // Does the subject deserve this pane?\n label: (subject, context) => {\n // @ts-ignore\n const kb = context.session.store as Store\n const typeURIs = kb.findTypeURIs(subject)\n if (ns.meeting('Cluster').uri in typeURIs) {\n return 'Tabbed'\n }\n return null\n },\n\n render: (subject, context) => {\n const dom = context.dom\n // @ts-ignore\n const store = context.session.store as Store\n const div = dom.createElement('div')\n\n ;(async () => {\n if (!store.fetcher) {\n throw new Error('Store has no fetcher')\n }\n await store.fetcher.load(subject)\n\n div.appendChild(tabs.tabWidget({\n dom,\n subject,\n predicate: store.any(subject, ns.meeting('predicate')) || ns.meeting('toolList'),\n ordered: true,\n orientation: ((store as Store).anyValue(subject, ns.meeting('orientation')) || '0') as ('0' | '1' | '2' | '3'),\n renderMain: (containerDiv, item) => {\n containerDiv.innerHTML = ''\n const table = containerDiv.appendChild(context.dom.createElement('table'))\n ;(context.getOutliner(context.dom) as any).GotoSubject(item, true, null, false, undefined, table)\n },\n renderTab: (containerDiv, item) => {\n const predicate = store.the(subject, ns.meeting('predicate'))\n containerDiv.appendChild(widgets.personTR(context.dom, predicate, item, {}))\n },\n backgroundColor: store.anyValue(subject, ns.ui('backgroundColor')) || '#ddddcc'\n }))\n })()\n return div\n }\n}\n\nexport default TabbedPane\n"],"mappings":"0BASA,IAAM,EAA6B,CACjC,KAAM,EAAA,MAAM,SAAW,kBAEvB,KAAM,SAEN,SAAU,CAAC,EAAA,GAAG,MAAM,WAAW,CAAC,EAGhC,OAAQ,EAAS,IAAY,CAG3B,IAAM,EADK,EAAQ,QAAQ,MACP,aAAa,CAAO,EAIxC,OAHI,EAAA,GAAG,QAAQ,SAAS,CAAC,CAAC,OAAO,EACxB,SAEF,IACT,EAEA,QAAS,EAAS,IAAY,CAC5B,IAAM,EAAM,EAAQ,IAEd,EAAQ,EAAQ,QAAQ,MACxB,EAAM,EAAI,cAAc,KAAK,EA0BnC,OAxBE,SAAY,CACZ,GAAI,CAAC,EAAM,QACT,MAAU,MAAM,sBAAsB,EAExC,MAAM,EAAM,QAAQ,KAAK,CAAO,EAEhC,EAAI,YAAY,EAAA,KAAK,UAAU,CAC7B,MACA,UACA,UAAW,EAAM,IAAI,EAAS,EAAA,GAAG,QAAQ,WAAW,CAAC,GAAK,EAAA,GAAG,QAAQ,UAAU,EAC/E,QAAS,GACT,YAAe,EAAgB,SAAS,EAAS,EAAA,GAAG,QAAQ,aAAa,CAAC,GAAK,IAC/E,YAAa,EAAc,IAAS,CAClC,EAAa,UAAY,GACzB,IAAM,EAAQ,EAAa,YAAY,EAAQ,IAAI,cAAc,OAAO,CAAC,EACxE,EAAS,YAAY,EAAQ,GAAG,CAAC,CAAS,YAAY,EAAM,GAAM,KAAM,GAAO,IAAA,GAAW,CAAK,CAClG,EACA,WAAY,EAAc,IAAS,CACjC,IAAM,EAAY,EAAM,IAAI,EAAS,EAAA,GAAG,QAAQ,WAAW,CAAC,EAC5D,EAAa,YAAY,EAAA,QAAQ,SAAS,EAAQ,IAAK,EAAW,EAAM,CAAC,CAAC,CAAC,CAC7E,EACA,gBAAiB,EAAM,SAAS,EAAS,EAAA,GAAG,GAAG,iBAAiB,CAAC,GAAK,SACxE,CAAC,CAAC,CACJ,EAAA,CAAG,EACI,CACT,CACF"}
1
+ {"version":3,"file":"tabbedPane.cjs.js","names":[],"sources":["../../src/tabbed/tabbedPane.ts"],"sourcesContent":["/* Tabbed view of anything\n **\n ** data-driven\n **\n */\nimport { Store } from 'rdflib'\nimport { PaneDefinition } from 'pane-registry'\nimport { icons, ns, tabs, widgets } from 'solid-ui'\n\nconst TabbedPane: PaneDefinition = {\n icon: icons.iconBase + 'noun_688606.svg',\n\n name: 'tabbed',\n\n audience: [ns.solid('PowerUser')],\n\n // Does the subject deserve this pane?\n label: (subject, context) => {\n // @ts-ignore\n const kb = context.session.store as Store\n const typeURIs = kb.findTypeURIs(subject)\n if (ns.meeting('Cluster').uri in typeURIs) {\n return 'Tabbed'\n }\n return null\n },\n\n render: (subject, context) => {\n const dom = context.dom\n // @ts-ignore\n const store = context.session.store as Store\n const div = dom.createElement('div')\n\n ;(async () => {\n if (!store.fetcher) {\n throw new Error('Store has no fetcher')\n }\n await store.fetcher.load(subject)\n\n div.appendChild(tabs.tabWidget({\n dom,\n subject,\n predicate: store.any(subject, ns.meeting('predicate')) || ns.meeting('toolList'),\n ordered: true,\n orientation: ((store as Store).anyValue(subject, ns.meeting('orientation')) || '0') as ('0' | '1' | '2' | '3'),\n renderMain: (containerDiv, item) => {\n containerDiv.innerHTML = ''\n const table = containerDiv.appendChild(context.dom.createElement('table'))\n ;(context.getOutliner(context.dom) as any).GotoSubject(item, true, null, false, undefined, table)\n },\n renderTab: (containerDiv, item) => {\n const predicate = store.the(subject, ns.meeting('predicate'))\n containerDiv.appendChild(widgets.personTR(context.dom, predicate, item, {}))\n },\n backgroundColor: store.anyValue(subject, ns.ui('backgroundColor')) || '#ddddcc'\n }))\n })()\n return div\n }\n}\n\nexport default TabbedPane\n"],"mappings":"0EASA,IAAM,EAA6B,CACjC,KAAM,EAAA,MAAM,SAAW,kBAEvB,KAAM,SAEN,SAAU,CAAC,EAAA,GAAG,MAAM,WAAW,CAAC,EAGhC,OAAQ,EAAS,IAAY,CAG3B,IAAM,EADK,EAAQ,QAAQ,MACP,aAAa,CAAO,EAIxC,OAHI,EAAA,GAAG,QAAQ,SAAS,CAAC,CAAC,OAAO,EACxB,SAEF,IACT,EAEA,QAAS,EAAS,IAAY,CAC5B,IAAM,EAAM,EAAQ,IAEd,EAAQ,EAAQ,QAAQ,MACxB,EAAM,EAAI,cAAc,KAAK,EA0BnC,OAxBE,SAAY,CACZ,GAAI,CAAC,EAAM,QACT,MAAU,MAAM,sBAAsB,EAExC,MAAM,EAAM,QAAQ,KAAK,CAAO,EAEhC,EAAI,YAAY,EAAA,KAAK,UAAU,CAC7B,MACA,UACA,UAAW,EAAM,IAAI,EAAS,EAAA,GAAG,QAAQ,WAAW,CAAC,GAAK,EAAA,GAAG,QAAQ,UAAU,EAC/E,QAAS,GACT,YAAe,EAAgB,SAAS,EAAS,EAAA,GAAG,QAAQ,aAAa,CAAC,GAAK,IAC/E,YAAa,EAAc,IAAS,CAClC,EAAa,UAAY,GACzB,IAAM,EAAQ,EAAa,YAAY,EAAQ,IAAI,cAAc,OAAO,CAAC,EACxE,EAAS,YAAY,EAAQ,GAAG,CAAC,CAAS,YAAY,EAAM,GAAM,KAAM,GAAO,IAAA,GAAW,CAAK,CAClG,EACA,WAAY,EAAc,IAAS,CACjC,IAAM,EAAY,EAAM,IAAI,EAAS,EAAA,GAAG,QAAQ,WAAW,CAAC,EAC5D,EAAa,YAAY,EAAA,QAAQ,SAAS,EAAQ,IAAK,EAAW,EAAM,CAAC,CAAC,CAAC,CAC7E,EACA,gBAAiB,EAAM,SAAS,EAAS,EAAA,GAAG,GAAG,iBAAiB,CAAC,GAAK,SACxE,CAAC,CAAC,CACJ,EAAA,CAAG,EACI,CACT,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"pane.cjs.js","names":["UI","$rdf"],"sources":["../../src/transaction/pane.js"],"sourcesContent":["/* Financial Transaction Pane\n **\n ** This outline pane allows a user to interact with a transaction\n ** downloaded from a bank statement, annotting it with classes and comments,\n ** trips, etc\n */\n\nimport * as UI from 'solid-ui'\nimport * as $rdf from 'rdflib'\nconst ns = UI.ns\n\nexport default {\n // icon: (module.__dirname || __dirname) + '22-pixel-068010-3d-transparent-glass-icon-alphanumeric-dollar-sign.png',\n icon: UI.icons.iconBase + 'noun_106746.svg',\n\n name: 'transaction',\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#Transaction']) return '$$'\n if (kb.any(subject, UI.ns.qu('amount'))) return '$$$' // In case schema not picked up\n\n // if (t['http://www.w3.org/2000/10/swap/pim/qif#Period']) return \"period $\"\n\n if (t['http://www.w3.org/ns/pim/trip#Trip']) return 'Trip $'\n\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 fetcher = kb.fetcher\n const Q = $rdf.Namespace('http://www.w3.org/2000/10/swap/pim/qif#')\n const TRIP = $rdf.Namespace('http://www.w3.org/ns/pim/trip#')\n\n const div = dom.createElement('div')\n div.setAttribute('class', 'transactionPane')\n\n const mention = function mention (message, style) {\n if (style === undefined) 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 complain = function complain (message) {\n return mention(message, 'color: #100; background-color: #fee')\n }\n\n /*\n var thisPane = this\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 // //////////////////////////////////////////////////////////////////////////////\n\n const plist = kb.statementsMatching(subject)\n const qlist = kb.statementsMatching(undefined, undefined, subject)\n\n const t = kb.findTypeURIs(subject)\n\n // var me = authn.currentUser()\n const predicateURIsDone = {}\n const donePredicate = function (pred) {\n predicateURIsDone[pred.uri] = true\n }\n\n const setPaneStyle = function (account) {\n let mystyle = 'padding: 0.5em 1.5em 1em 1.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 div.setAttribute('style', mystyle)\n }\n // setPaneStyle()\n\n // Functions for displaying lists of transactions\n // Click on the transaction line to expand it into a pane\n // Shift-click to expand without collapsing others\n\n const d2 = function (n) {\n if (n === undefined) return ''\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 numericCell = function numericCell (amount, suppressZero) {\n const td = dom.createElement('td')\n if (!(0.0 + amount === 0.0 && suppressZero)) {\n td.textContent = d2(amount)\n }\n td.setAttribute('style', 'width: 6em; text-align: right; ')\n return td\n }\n\n const headerCell = function headerCell (str) {\n const td = dom.createElement('th')\n td.textContent = str\n td.setAttribute('style', 'text-align: right; ')\n return td\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 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, filter) {\n const table = dom.createElement('table')\n table.setAttribute(\n 'style',\n 'padding-left: 0.5em; padding-right: 0.5em; 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 =\n '\\'padding-left: 0.5em; padding-right: 0.5em; padding-top: 0.1em;'\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 = filter ? list.filter(filter) : list.slice() // don't sort a paramater passed in place\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 // Render a single transaction\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 if (\n t['http://www.w3.org/2000/10/swap/pim/qif#Transaction'] ||\n kb.any(subject, ns.qu('toAccount'))\n ) {\n // var trip = kb.any(subject, WF('trip'))\n donePredicate(ns.rdf('type'))\n\n const account = kb.any(subject, UI.ns.qu('toAccount'))\n setPaneStyle(account)\n if (!account) {\n complain(\n '(Error: There is no bank account known for this transaction <' +\n subject.uri +\n '>,\\n -- every transaction needs one.)'\n )\n }\n\n let store = null\n const statement = kb.any(subject, UI.ns.qu('accordingTo'))\n if (statement === undefined) {\n complain(\n '(Error: There is no back link to the original data source foir this transaction <' +\n subject.uri +\n '>,\\nso I can\\'t tell how to annotate it.)'\n )\n } else {\n store =\n statement !== undefined\n ? kb.any(statement, UI.ns.qu('annotationStore'))\n : null\n if (store === undefined) {\n complain(\n '(There is no annotation document for this statement\\n<' +\n statement.uri +\n '>,\\nso you cannot classify this transaction.)'\n )\n }\n }\n\n const nav = dom.createElement('div')\n nav.setAttribute('style', 'float:right')\n div.appendChild(nav)\n\n const navLink = function (pred, label) {\n donePredicate(pred)\n const obj = kb.any(subject, pred)\n if (!obj) return\n const a = dom.createElement('a')\n a.setAttribute('href', obj.uri)\n a.setAttribute('style', 'float:right')\n nav.appendChild(a).textContent = label || UI.utils.label(obj)\n nav.appendChild(dom.createElement('br'))\n }\n\n navLink(UI.ns.qu('toAccount'))\n navLink(UI.ns.qu('accordingTo'), 'Statement')\n navLink(TRIP('trip'))\n\n // Basic data:\n const table = dom.createElement('table')\n div.appendChild(table)\n const preds = ['date', 'payee', 'amount', 'in_USD', 'currency'].map(Q)\n const inner = preds\n .map(function (p) {\n donePredicate(p)\n const value = kb.any(subject, p)\n const s = value ? UI.utils.labelForXML(value) : ''\n return (\n '<tr><td style=\"text-align: right; padding-right: 0.6em\">' +\n UI.utils.labelForXML(p) +\n '</td><td style=\"font-weight: bold;\">' +\n s +\n '</td></tr>'\n )\n })\n .join('\\n')\n table.innerHTML = inner\n\n const complainIfBad = function (ok, body) {\n if (ok) {\n // setModifiedDate(store, kb, store)\n // rerender(div) // deletes the new trip form\n } else complain('Sorry, failed to save your change:\\n' + body)\n }\n\n // What trips do we know about?\n\n // Classify:\n if (store) {\n kb.fetcher.nowOrWhenFetched(store.uri, subject, function (ok, body) {\n if (!ok) complain('Cannot load store ' + store + ' ' + body)\n\n const calendarYear = kb.any(store, ns.qu('calendarYear'))\n\n const renderCatgorySelectors = function () {\n div.insertBefore(\n UI.widgets.makeSelectForNestedCategory(\n dom,\n kb,\n subject,\n UI.ns.qu('Classified'),\n store,\n complainIfBad\n ),\n table.nextSibling\n )\n }\n\n if (kb.any(undefined, ns.rdfs('subClassOf'), ns.qu.Classified)) {\n renderCatgorySelectors()\n } else if (calendarYear) {\n fetcher\n .load(calendarYear)\n .then(function (_xhrs) {\n fetcher\n .load(kb.each(calendarYear, ns.rdfs('seeAlso')))\n .then(function () {\n renderCatgorySelectors()\n })\n .catch(function (e) {\n console.log('Error loading background data: ' + e)\n })\n })\n .catch(function (e) {\n console.log('Error loading calendarYear: ' + e)\n })\n } else {\n console.log('Can\\'t get categories, because no calendarYear')\n }\n div.appendChild(\n UI.widgets.makeDescription(\n dom,\n kb,\n subject,\n UI.ns.rdfs('comment'),\n store,\n complainIfBad\n )\n )\n\n let trips = kb\n .statementsMatching(undefined, TRIP('trip'), undefined, store)\n .map(function (st) {\n return st.object\n }) // @@ Use rdfs\n const trips2 = kb.each(undefined, UI.ns.rdf('type'), TRIP('Trip'))\n trips = trips.concat(trips2).sort() // @@ Unique\n\n const sortedBy = function (kb, list, pred, reverse) {\n const l2 = list.map(function (x) {\n let key = kb.any(x, pred)\n key = key ? key.value : '9999-12-31'\n return [key, x]\n })\n l2.sort()\n if (reverse) l2.reverse()\n return l2.map(function (pair) {\n return pair[1]\n })\n }\n\n trips = sortedBy(kb, trips, UI.ns.cal('dtstart'), true) // Reverse chron\n\n if (trips.length > 1) {\n div.appendChild(\n UI.widgets.makeSelectForOptions(\n dom,\n kb,\n subject,\n TRIP('trip'),\n trips,\n {\n multiple: false,\n nullLabel: '-- what trip? --',\n mint: 'New Trip *',\n mintClass: TRIP('Trip'),\n mintStatementsFun: function (trip) {\n const is = []\n is.push(\n $rdf.st(trip, UI.ns.rdf('type'), TRIP('Trip'), trip.doc())\n )\n return is\n }\n },\n store,\n complainIfBad\n )\n )\n }\n\n div.appendChild(dom.createElement('br'))\n\n // Add in simple comments about the transaction\n\n const outliner = context.getOutliner(dom)\n\n donePredicate(ns.rdfs('comment')) // Done above\n\n UI.widgets.attachmentList(dom, subject, div)\n donePredicate(ns.wf('attachment'))\n\n div\n .appendChild(dom.createElement('tr'))\n .setAttribute('style', 'height: 1em') // spacer\n\n // Remaining properties\n outliner.appendPropertyTRs(div, plist, false, function (\n pred,\n _inverse\n ) {\n return !(pred.uri in predicateURIsDone)\n })\n outliner.appendPropertyTRs(div, qlist, true, function (\n pred,\n _inverse\n ) {\n return !(pred.uri in predicateURIsDone)\n })\n }) // fetch\n }\n // end of render tranasaction instance\n\n // ////////////////////////////////////////////////////////////////////\n //\n // Render the transactions in a Trip\n //\n } else if (t['http://www.w3.org/ns/pim/trip#Trip']) {\n /*\n var query = new $rdf.Query(UI.utils.label(subject))\n var vars = [ 'date', 'transaction', 'comment', 'type', 'in_USD']\n var v = {}\n vars.map(function(x){query.vars.push(v[x]=$rdf.variable(x))}) // Only used by UI\n query.pat.add(v['transaction'], TRIP('trip'), subject)\n\n var opt = kb.formula()\n opt.add(v['transaction'], ns.rdf('type'), v['type']); // Issue: this will get stored supertypes too\n query.pat.optional.push(opt)\n\n query.pat.add(v['transaction'], UI.ns.qu('date'), v['date'])\n\n var opt = kb.formula()\n opt.add(v['transaction'], ns.rdfs('comment'), v['comment'])\n query.pat.optional.push(opt)\n\n //opt = kb.formula()\n query.pat.add(v['transaction'], UI.ns.qu('in_USD'), v['in_USD'])\n\n //query.pat.optional.push(opt)\n\n var tableDiv = UI.widgets.renderTableViewPane(dom, {'query': query, 'onDone': calculations} )\n div.appendChild(tableDiv)\n\n*/\n const calculations = function () {\n const total = {}\n const yearTotal = {}\n const yearCategoryTotal = {}\n const trans = kb.each(undefined, TRIP('trip'), subject)\n const bankStatements = trans.map(function (t) {\n return t.doc()\n })\n kb.fetcher\n .load(bankStatements)\n .then(function () {\n trans.forEach(function (t) {\n const date = kb.the(t, ns.qu('date'))\n const year = date ? ('' + date.value).slice(0, 4) : '????'\n let ty = kb.the(t, ns.rdf('type')) // @@ find most specific type\n // complain(\" -- one trans: \"+t.uri + ' -> '+kb.any(t, UI.ns.qu('in_USD')))\n if (!ty) ty = UI.ns.qu('ErrorNoType')\n if (ty && ty.uri) {\n const tyuri = ty.uri\n if (!yearTotal[year]) yearTotal[year] = 0.0\n if (!yearCategoryTotal[year]) yearCategoryTotal[year] = {}\n if (!total[tyuri]) total[tyuri] = 0.0\n if (!yearCategoryTotal[year][tyuri]) {\n yearCategoryTotal[year][tyuri] = 0.0\n }\n\n const lit = kb.any(t, UI.ns.qu('in_USD'))\n if (!lit) {\n complain('@@ No amount in USD: ' + lit + ' for ' + t)\n }\n if (lit) {\n const amount = parseFloat(lit.value)\n total[tyuri] += amount\n yearCategoryTotal[year][tyuri] += amount\n yearTotal[year] += amount\n }\n }\n })\n\n const types = []\n let grandTotal = 0.0\n const years = []\n let i\n\n for (const y in yearCategoryTotal) {\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(yearCategoryTotal, y)) {\n years.push(y)\n }\n }\n years.sort()\n const ny = years.length\n let cell\n\n const table = div.appendChild(dom.createElement('table'))\n table.setAttribute(\n 'style',\n 'font-size: 120%; margin-left:auto; margin-right:1em; margin-top: 1em; border: 0.05em solid gray; padding: 1em;'\n )\n\n if (ny > 1) {\n const header = table.appendChild(dom.createElement('tr'))\n header.appendChild(headerCell(''))\n for (i = 0; i < ny; i++) {\n header.appendChild(headerCell(years[i]))\n }\n header.appendChild(headerCell('total'))\n }\n\n for (const uri in total) {\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(total, uri)) {\n types.push(uri)\n grandTotal += total[uri]\n }\n }\n types.sort()\n let row, label, z\n for (let j = 0; j < types.length; j++) {\n const cat = kb.sym(types[j])\n row = table.appendChild(dom.createElement('tr'))\n label = row.appendChild(dom.createElement('td'))\n label.textContent = UI.utils.label(cat)\n if (ny > 1) {\n for (i = 0; i < ny; i++) {\n z = yearCategoryTotal[years[i]][types[j]]\n cell = row.appendChild(numericCell(z, true))\n }\n }\n row.appendChild(numericCell(total[types[j]], true))\n }\n\n // Trailing totals\n if (types.length > 1) {\n row = table.appendChild(dom.createElement('tr'))\n row.appendChild(headerCell('total'))\n if (ny > 1) {\n for (i = 0; i < ny; i++) {\n z = yearTotal[years[i]]\n cell = row.appendChild(numericCell(z ? d2(z) : ''))\n }\n }\n cell = row.appendChild(numericCell(grandTotal))\n cell.setAttribute(\n 'style',\n 'font-weight: bold; text-align: right;'\n )\n }\n\n const tab = transactionTable(dom, trans)\n tab.setAttribute(\n 'style',\n 'margin-left:auto; margin-right:1em; margin-top: 1em; border: padding: 1em;'\n )\n div.appendChild(tab)\n\n UI.widgets.attachmentList(dom, subject, div)\n })\n .catch(function (e) {\n complain('Error loading transactions: ' + e)\n })\n }\n calculations()\n } // if\n\n return div\n }\n}\n\n// ends\n"],"mappings":"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"}
1
+ {"version":3,"file":"pane.cjs.js","names":["UI","$rdf"],"sources":["../../src/transaction/pane.js"],"sourcesContent":["/* Financial Transaction Pane\n **\n ** This outline pane allows a user to interact with a transaction\n ** downloaded from a bank statement, annotting it with classes and comments,\n ** trips, etc\n */\n\nimport * as UI from 'solid-ui'\nimport * as $rdf from 'rdflib'\nconst ns = UI.ns\n\nexport default {\n // icon: (module.__dirname || __dirname) + '22-pixel-068010-3d-transparent-glass-icon-alphanumeric-dollar-sign.png',\n icon: UI.icons.iconBase + 'noun_106746.svg',\n\n name: 'transaction',\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#Transaction']) return '$$'\n if (kb.any(subject, UI.ns.qu('amount'))) return '$$$' // In case schema not picked up\n\n // if (t['http://www.w3.org/2000/10/swap/pim/qif#Period']) return \"period $\"\n\n if (t['http://www.w3.org/ns/pim/trip#Trip']) return 'Trip $'\n\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 fetcher = kb.fetcher\n const Q = $rdf.Namespace('http://www.w3.org/2000/10/swap/pim/qif#')\n const TRIP = $rdf.Namespace('http://www.w3.org/ns/pim/trip#')\n\n const div = dom.createElement('div')\n div.setAttribute('class', 'transactionPane')\n\n const mention = function mention (message, style) {\n if (style === undefined) 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 complain = function complain (message) {\n return mention(message, 'color: #100; background-color: #fee')\n }\n\n /*\n var thisPane = this\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 // //////////////////////////////////////////////////////////////////////////////\n\n const plist = kb.statementsMatching(subject)\n const qlist = kb.statementsMatching(undefined, undefined, subject)\n\n const t = kb.findTypeURIs(subject)\n\n // var me = authn.currentUser()\n const predicateURIsDone = {}\n const donePredicate = function (pred) {\n predicateURIsDone[pred.uri] = true\n }\n\n const setPaneStyle = function (account) {\n let mystyle = 'padding: 0.5em 1.5em 1em 1.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 div.setAttribute('style', mystyle)\n }\n // setPaneStyle()\n\n // Functions for displaying lists of transactions\n // Click on the transaction line to expand it into a pane\n // Shift-click to expand without collapsing others\n\n const d2 = function (n) {\n if (n === undefined) return ''\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 numericCell = function numericCell (amount, suppressZero) {\n const td = dom.createElement('td')\n if (!(0.0 + amount === 0.0 && suppressZero)) {\n td.textContent = d2(amount)\n }\n td.setAttribute('style', 'width: 6em; text-align: right; ')\n return td\n }\n\n const headerCell = function headerCell (str) {\n const td = dom.createElement('th')\n td.textContent = str\n td.setAttribute('style', 'text-align: right; ')\n return td\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 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, filter) {\n const table = dom.createElement('table')\n table.setAttribute(\n 'style',\n 'padding-left: 0.5em; padding-right: 0.5em; 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 =\n '\\'padding-left: 0.5em; padding-right: 0.5em; padding-top: 0.1em;'\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 = filter ? list.filter(filter) : list.slice() // don't sort a paramater passed in place\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 // Render a single transaction\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 if (\n t['http://www.w3.org/2000/10/swap/pim/qif#Transaction'] ||\n kb.any(subject, ns.qu('toAccount'))\n ) {\n // var trip = kb.any(subject, WF('trip'))\n donePredicate(ns.rdf('type'))\n\n const account = kb.any(subject, UI.ns.qu('toAccount'))\n setPaneStyle(account)\n if (!account) {\n complain(\n '(Error: There is no bank account known for this transaction <' +\n subject.uri +\n '>,\\n -- every transaction needs one.)'\n )\n }\n\n let store = null\n const statement = kb.any(subject, UI.ns.qu('accordingTo'))\n if (statement === undefined) {\n complain(\n '(Error: There is no back link to the original data source foir this transaction <' +\n subject.uri +\n '>,\\nso I can\\'t tell how to annotate it.)'\n )\n } else {\n store =\n statement !== undefined\n ? kb.any(statement, UI.ns.qu('annotationStore'))\n : null\n if (store === undefined) {\n complain(\n '(There is no annotation document for this statement\\n<' +\n statement.uri +\n '>,\\nso you cannot classify this transaction.)'\n )\n }\n }\n\n const nav = dom.createElement('div')\n nav.setAttribute('style', 'float:right')\n div.appendChild(nav)\n\n const navLink = function (pred, label) {\n donePredicate(pred)\n const obj = kb.any(subject, pred)\n if (!obj) return\n const a = dom.createElement('a')\n a.setAttribute('href', obj.uri)\n a.setAttribute('style', 'float:right')\n nav.appendChild(a).textContent = label || UI.utils.label(obj)\n nav.appendChild(dom.createElement('br'))\n }\n\n navLink(UI.ns.qu('toAccount'))\n navLink(UI.ns.qu('accordingTo'), 'Statement')\n navLink(TRIP('trip'))\n\n // Basic data:\n const table = dom.createElement('table')\n div.appendChild(table)\n const preds = ['date', 'payee', 'amount', 'in_USD', 'currency'].map(Q)\n const inner = preds\n .map(function (p) {\n donePredicate(p)\n const value = kb.any(subject, p)\n const s = value ? UI.utils.labelForXML(value) : ''\n return (\n '<tr><td style=\"text-align: right; padding-right: 0.6em\">' +\n UI.utils.labelForXML(p) +\n '</td><td style=\"font-weight: bold;\">' +\n s +\n '</td></tr>'\n )\n })\n .join('\\n')\n table.innerHTML = inner\n\n const complainIfBad = function (ok, body) {\n if (ok) {\n // setModifiedDate(store, kb, store)\n // rerender(div) // deletes the new trip form\n } else complain('Sorry, failed to save your change:\\n' + body)\n }\n\n // What trips do we know about?\n\n // Classify:\n if (store) {\n kb.fetcher.nowOrWhenFetched(store.uri, subject, function (ok, body) {\n if (!ok) complain('Cannot load store ' + store + ' ' + body)\n\n const calendarYear = kb.any(store, ns.qu('calendarYear'))\n\n const renderCatgorySelectors = function () {\n div.insertBefore(\n UI.widgets.makeSelectForNestedCategory(\n dom,\n kb,\n subject,\n UI.ns.qu('Classified'),\n store,\n complainIfBad\n ),\n table.nextSibling\n )\n }\n\n if (kb.any(undefined, ns.rdfs('subClassOf'), ns.qu.Classified)) {\n renderCatgorySelectors()\n } else if (calendarYear) {\n fetcher\n .load(calendarYear)\n .then(function (_xhrs) {\n fetcher\n .load(kb.each(calendarYear, ns.rdfs('seeAlso')))\n .then(function () {\n renderCatgorySelectors()\n })\n .catch(function (e) {\n console.log('Error loading background data: ' + e)\n })\n })\n .catch(function (e) {\n console.log('Error loading calendarYear: ' + e)\n })\n } else {\n console.log('Can\\'t get categories, because no calendarYear')\n }\n div.appendChild(\n UI.widgets.makeDescription(\n dom,\n kb,\n subject,\n UI.ns.rdfs('comment'),\n store,\n complainIfBad\n )\n )\n\n let trips = kb\n .statementsMatching(undefined, TRIP('trip'), undefined, store)\n .map(function (st) {\n return st.object\n }) // @@ Use rdfs\n const trips2 = kb.each(undefined, UI.ns.rdf('type'), TRIP('Trip'))\n trips = trips.concat(trips2).sort() // @@ Unique\n\n const sortedBy = function (kb, list, pred, reverse) {\n const l2 = list.map(function (x) {\n let key = kb.any(x, pred)\n key = key ? key.value : '9999-12-31'\n return [key, x]\n })\n l2.sort()\n if (reverse) l2.reverse()\n return l2.map(function (pair) {\n return pair[1]\n })\n }\n\n trips = sortedBy(kb, trips, UI.ns.cal('dtstart'), true) // Reverse chron\n\n if (trips.length > 1) {\n div.appendChild(\n UI.widgets.makeSelectForOptions(\n dom,\n kb,\n subject,\n TRIP('trip'),\n trips,\n {\n multiple: false,\n nullLabel: '-- what trip? --',\n mint: 'New Trip *',\n mintClass: TRIP('Trip'),\n mintStatementsFun: function (trip) {\n const is = []\n is.push(\n $rdf.st(trip, UI.ns.rdf('type'), TRIP('Trip'), trip.doc())\n )\n return is\n }\n },\n store,\n complainIfBad\n )\n )\n }\n\n div.appendChild(dom.createElement('br'))\n\n // Add in simple comments about the transaction\n\n const outliner = context.getOutliner(dom)\n\n donePredicate(ns.rdfs('comment')) // Done above\n\n UI.widgets.attachmentList(dom, subject, div)\n donePredicate(ns.wf('attachment'))\n\n div\n .appendChild(dom.createElement('tr'))\n .setAttribute('style', 'height: 1em') // spacer\n\n // Remaining properties\n outliner.appendPropertyTRs(div, plist, false, function (\n pred,\n _inverse\n ) {\n return !(pred.uri in predicateURIsDone)\n })\n outliner.appendPropertyTRs(div, qlist, true, function (\n pred,\n _inverse\n ) {\n return !(pred.uri in predicateURIsDone)\n })\n }) // fetch\n }\n // end of render tranasaction instance\n\n // ////////////////////////////////////////////////////////////////////\n //\n // Render the transactions in a Trip\n //\n } else if (t['http://www.w3.org/ns/pim/trip#Trip']) {\n /*\n var query = new $rdf.Query(UI.utils.label(subject))\n var vars = [ 'date', 'transaction', 'comment', 'type', 'in_USD']\n var v = {}\n vars.map(function(x){query.vars.push(v[x]=$rdf.variable(x))}) // Only used by UI\n query.pat.add(v['transaction'], TRIP('trip'), subject)\n\n var opt = kb.formula()\n opt.add(v['transaction'], ns.rdf('type'), v['type']); // Issue: this will get stored supertypes too\n query.pat.optional.push(opt)\n\n query.pat.add(v['transaction'], UI.ns.qu('date'), v['date'])\n\n var opt = kb.formula()\n opt.add(v['transaction'], ns.rdfs('comment'), v['comment'])\n query.pat.optional.push(opt)\n\n //opt = kb.formula()\n query.pat.add(v['transaction'], UI.ns.qu('in_USD'), v['in_USD'])\n\n //query.pat.optional.push(opt)\n\n var tableDiv = UI.widgets.renderTableViewPane(dom, {'query': query, 'onDone': calculations} )\n div.appendChild(tableDiv)\n\n*/\n const calculations = function () {\n const total = {}\n const yearTotal = {}\n const yearCategoryTotal = {}\n const trans = kb.each(undefined, TRIP('trip'), subject)\n const bankStatements = trans.map(function (t) {\n return t.doc()\n })\n kb.fetcher\n .load(bankStatements)\n .then(function () {\n trans.forEach(function (t) {\n const date = kb.the(t, ns.qu('date'))\n const year = date ? ('' + date.value).slice(0, 4) : '????'\n let ty = kb.the(t, ns.rdf('type')) // @@ find most specific type\n // complain(\" -- one trans: \"+t.uri + ' -> '+kb.any(t, UI.ns.qu('in_USD')))\n if (!ty) ty = UI.ns.qu('ErrorNoType')\n if (ty && ty.uri) {\n const tyuri = ty.uri\n if (!yearTotal[year]) yearTotal[year] = 0.0\n if (!yearCategoryTotal[year]) yearCategoryTotal[year] = {}\n if (!total[tyuri]) total[tyuri] = 0.0\n if (!yearCategoryTotal[year][tyuri]) {\n yearCategoryTotal[year][tyuri] = 0.0\n }\n\n const lit = kb.any(t, UI.ns.qu('in_USD'))\n if (!lit) {\n complain('@@ No amount in USD: ' + lit + ' for ' + t)\n }\n if (lit) {\n const amount = parseFloat(lit.value)\n total[tyuri] += amount\n yearCategoryTotal[year][tyuri] += amount\n yearTotal[year] += amount\n }\n }\n })\n\n const types = []\n let grandTotal = 0.0\n const years = []\n let i\n\n for (const y in yearCategoryTotal) {\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(yearCategoryTotal, y)) {\n years.push(y)\n }\n }\n years.sort()\n const ny = years.length\n let cell\n\n const table = div.appendChild(dom.createElement('table'))\n table.setAttribute(\n 'style',\n 'font-size: 120%; margin-left:auto; margin-right:1em; margin-top: 1em; border: 0.05em solid gray; padding: 1em;'\n )\n\n if (ny > 1) {\n const header = table.appendChild(dom.createElement('tr'))\n header.appendChild(headerCell(''))\n for (i = 0; i < ny; i++) {\n header.appendChild(headerCell(years[i]))\n }\n header.appendChild(headerCell('total'))\n }\n\n for (const uri in total) {\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(total, uri)) {\n types.push(uri)\n grandTotal += total[uri]\n }\n }\n types.sort()\n let row, label, z\n for (let j = 0; j < types.length; j++) {\n const cat = kb.sym(types[j])\n row = table.appendChild(dom.createElement('tr'))\n label = row.appendChild(dom.createElement('td'))\n label.textContent = UI.utils.label(cat)\n if (ny > 1) {\n for (i = 0; i < ny; i++) {\n z = yearCategoryTotal[years[i]][types[j]]\n cell = row.appendChild(numericCell(z, true))\n }\n }\n row.appendChild(numericCell(total[types[j]], true))\n }\n\n // Trailing totals\n if (types.length > 1) {\n row = table.appendChild(dom.createElement('tr'))\n row.appendChild(headerCell('total'))\n if (ny > 1) {\n for (i = 0; i < ny; i++) {\n z = yearTotal[years[i]]\n cell = row.appendChild(numericCell(z ? d2(z) : ''))\n }\n }\n cell = row.appendChild(numericCell(grandTotal))\n cell.setAttribute(\n 'style',\n 'font-weight: bold; text-align: right;'\n )\n }\n\n const tab = transactionTable(dom, trans)\n tab.setAttribute(\n 'style',\n 'margin-left:auto; margin-right:1em; margin-top: 1em; border: padding: 1em;'\n )\n div.appendChild(tab)\n\n UI.widgets.attachmentList(dom, subject, div)\n })\n .catch(function (e) {\n complain('Error loading transactions: ' + e)\n })\n }\n calculations()\n } // if\n\n return div\n }\n}\n\n// ends\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pane.esm.js","names":["ns"],"sources":["../../src/transaction/pane.js"],"sourcesContent":["/* Financial Transaction Pane\n **\n ** This outline pane allows a user to interact with a transaction\n ** downloaded from a bank statement, annotting it with classes and comments,\n ** trips, etc\n */\n\nimport * as UI from 'solid-ui'\nimport * as $rdf from 'rdflib'\nconst ns = UI.ns\n\nexport default {\n // icon: (module.__dirname || __dirname) + '22-pixel-068010-3d-transparent-glass-icon-alphanumeric-dollar-sign.png',\n icon: UI.icons.iconBase + 'noun_106746.svg',\n\n name: 'transaction',\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#Transaction']) return '$$'\n if (kb.any(subject, UI.ns.qu('amount'))) return '$$$' // In case schema not picked up\n\n // if (t['http://www.w3.org/2000/10/swap/pim/qif#Period']) return \"period $\"\n\n if (t['http://www.w3.org/ns/pim/trip#Trip']) return 'Trip $'\n\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 fetcher = kb.fetcher\n const Q = $rdf.Namespace('http://www.w3.org/2000/10/swap/pim/qif#')\n const TRIP = $rdf.Namespace('http://www.w3.org/ns/pim/trip#')\n\n const div = dom.createElement('div')\n div.setAttribute('class', 'transactionPane')\n\n const mention = function mention (message, style) {\n if (style === undefined) 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 complain = function complain (message) {\n return mention(message, 'color: #100; background-color: #fee')\n }\n\n /*\n var thisPane = this\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 // //////////////////////////////////////////////////////////////////////////////\n\n const plist = kb.statementsMatching(subject)\n const qlist = kb.statementsMatching(undefined, undefined, subject)\n\n const t = kb.findTypeURIs(subject)\n\n // var me = authn.currentUser()\n const predicateURIsDone = {}\n const donePredicate = function (pred) {\n predicateURIsDone[pred.uri] = true\n }\n\n const setPaneStyle = function (account) {\n let mystyle = 'padding: 0.5em 1.5em 1em 1.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 div.setAttribute('style', mystyle)\n }\n // setPaneStyle()\n\n // Functions for displaying lists of transactions\n // Click on the transaction line to expand it into a pane\n // Shift-click to expand without collapsing others\n\n const d2 = function (n) {\n if (n === undefined) return ''\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 numericCell = function numericCell (amount, suppressZero) {\n const td = dom.createElement('td')\n if (!(0.0 + amount === 0.0 && suppressZero)) {\n td.textContent = d2(amount)\n }\n td.setAttribute('style', 'width: 6em; text-align: right; ')\n return td\n }\n\n const headerCell = function headerCell (str) {\n const td = dom.createElement('th')\n td.textContent = str\n td.setAttribute('style', 'text-align: right; ')\n return td\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 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, filter) {\n const table = dom.createElement('table')\n table.setAttribute(\n 'style',\n 'padding-left: 0.5em; padding-right: 0.5em; 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 =\n '\\'padding-left: 0.5em; padding-right: 0.5em; padding-top: 0.1em;'\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 = filter ? list.filter(filter) : list.slice() // don't sort a paramater passed in place\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 // Render a single transaction\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 if (\n t['http://www.w3.org/2000/10/swap/pim/qif#Transaction'] ||\n kb.any(subject, ns.qu('toAccount'))\n ) {\n // var trip = kb.any(subject, WF('trip'))\n donePredicate(ns.rdf('type'))\n\n const account = kb.any(subject, UI.ns.qu('toAccount'))\n setPaneStyle(account)\n if (!account) {\n complain(\n '(Error: There is no bank account known for this transaction <' +\n subject.uri +\n '>,\\n -- every transaction needs one.)'\n )\n }\n\n let store = null\n const statement = kb.any(subject, UI.ns.qu('accordingTo'))\n if (statement === undefined) {\n complain(\n '(Error: There is no back link to the original data source foir this transaction <' +\n subject.uri +\n '>,\\nso I can\\'t tell how to annotate it.)'\n )\n } else {\n store =\n statement !== undefined\n ? kb.any(statement, UI.ns.qu('annotationStore'))\n : null\n if (store === undefined) {\n complain(\n '(There is no annotation document for this statement\\n<' +\n statement.uri +\n '>,\\nso you cannot classify this transaction.)'\n )\n }\n }\n\n const nav = dom.createElement('div')\n nav.setAttribute('style', 'float:right')\n div.appendChild(nav)\n\n const navLink = function (pred, label) {\n donePredicate(pred)\n const obj = kb.any(subject, pred)\n if (!obj) return\n const a = dom.createElement('a')\n a.setAttribute('href', obj.uri)\n a.setAttribute('style', 'float:right')\n nav.appendChild(a).textContent = label || UI.utils.label(obj)\n nav.appendChild(dom.createElement('br'))\n }\n\n navLink(UI.ns.qu('toAccount'))\n navLink(UI.ns.qu('accordingTo'), 'Statement')\n navLink(TRIP('trip'))\n\n // Basic data:\n const table = dom.createElement('table')\n div.appendChild(table)\n const preds = ['date', 'payee', 'amount', 'in_USD', 'currency'].map(Q)\n const inner = preds\n .map(function (p) {\n donePredicate(p)\n const value = kb.any(subject, p)\n const s = value ? UI.utils.labelForXML(value) : ''\n return (\n '<tr><td style=\"text-align: right; padding-right: 0.6em\">' +\n UI.utils.labelForXML(p) +\n '</td><td style=\"font-weight: bold;\">' +\n s +\n '</td></tr>'\n )\n })\n .join('\\n')\n table.innerHTML = inner\n\n const complainIfBad = function (ok, body) {\n if (ok) {\n // setModifiedDate(store, kb, store)\n // rerender(div) // deletes the new trip form\n } else complain('Sorry, failed to save your change:\\n' + body)\n }\n\n // What trips do we know about?\n\n // Classify:\n if (store) {\n kb.fetcher.nowOrWhenFetched(store.uri, subject, function (ok, body) {\n if (!ok) complain('Cannot load store ' + store + ' ' + body)\n\n const calendarYear = kb.any(store, ns.qu('calendarYear'))\n\n const renderCatgorySelectors = function () {\n div.insertBefore(\n UI.widgets.makeSelectForNestedCategory(\n dom,\n kb,\n subject,\n UI.ns.qu('Classified'),\n store,\n complainIfBad\n ),\n table.nextSibling\n )\n }\n\n if (kb.any(undefined, ns.rdfs('subClassOf'), ns.qu.Classified)) {\n renderCatgorySelectors()\n } else if (calendarYear) {\n fetcher\n .load(calendarYear)\n .then(function (_xhrs) {\n fetcher\n .load(kb.each(calendarYear, ns.rdfs('seeAlso')))\n .then(function () {\n renderCatgorySelectors()\n })\n .catch(function (e) {\n console.log('Error loading background data: ' + e)\n })\n })\n .catch(function (e) {\n console.log('Error loading calendarYear: ' + e)\n })\n } else {\n console.log('Can\\'t get categories, because no calendarYear')\n }\n div.appendChild(\n UI.widgets.makeDescription(\n dom,\n kb,\n subject,\n UI.ns.rdfs('comment'),\n store,\n complainIfBad\n )\n )\n\n let trips = kb\n .statementsMatching(undefined, TRIP('trip'), undefined, store)\n .map(function (st) {\n return st.object\n }) // @@ Use rdfs\n const trips2 = kb.each(undefined, UI.ns.rdf('type'), TRIP('Trip'))\n trips = trips.concat(trips2).sort() // @@ Unique\n\n const sortedBy = function (kb, list, pred, reverse) {\n const l2 = list.map(function (x) {\n let key = kb.any(x, pred)\n key = key ? key.value : '9999-12-31'\n return [key, x]\n })\n l2.sort()\n if (reverse) l2.reverse()\n return l2.map(function (pair) {\n return pair[1]\n })\n }\n\n trips = sortedBy(kb, trips, UI.ns.cal('dtstart'), true) // Reverse chron\n\n if (trips.length > 1) {\n div.appendChild(\n UI.widgets.makeSelectForOptions(\n dom,\n kb,\n subject,\n TRIP('trip'),\n trips,\n {\n multiple: false,\n nullLabel: '-- what trip? --',\n mint: 'New Trip *',\n mintClass: TRIP('Trip'),\n mintStatementsFun: function (trip) {\n const is = []\n is.push(\n $rdf.st(trip, UI.ns.rdf('type'), TRIP('Trip'), trip.doc())\n )\n return is\n }\n },\n store,\n complainIfBad\n )\n )\n }\n\n div.appendChild(dom.createElement('br'))\n\n // Add in simple comments about the transaction\n\n const outliner = context.getOutliner(dom)\n\n donePredicate(ns.rdfs('comment')) // Done above\n\n UI.widgets.attachmentList(dom, subject, div)\n donePredicate(ns.wf('attachment'))\n\n div\n .appendChild(dom.createElement('tr'))\n .setAttribute('style', 'height: 1em') // spacer\n\n // Remaining properties\n outliner.appendPropertyTRs(div, plist, false, function (\n pred,\n _inverse\n ) {\n return !(pred.uri in predicateURIsDone)\n })\n outliner.appendPropertyTRs(div, qlist, true, function (\n pred,\n _inverse\n ) {\n return !(pred.uri in predicateURIsDone)\n })\n }) // fetch\n }\n // end of render tranasaction instance\n\n // ////////////////////////////////////////////////////////////////////\n //\n // Render the transactions in a Trip\n //\n } else if (t['http://www.w3.org/ns/pim/trip#Trip']) {\n /*\n var query = new $rdf.Query(UI.utils.label(subject))\n var vars = [ 'date', 'transaction', 'comment', 'type', 'in_USD']\n var v = {}\n vars.map(function(x){query.vars.push(v[x]=$rdf.variable(x))}) // Only used by UI\n query.pat.add(v['transaction'], TRIP('trip'), subject)\n\n var opt = kb.formula()\n opt.add(v['transaction'], ns.rdf('type'), v['type']); // Issue: this will get stored supertypes too\n query.pat.optional.push(opt)\n\n query.pat.add(v['transaction'], UI.ns.qu('date'), v['date'])\n\n var opt = kb.formula()\n opt.add(v['transaction'], ns.rdfs('comment'), v['comment'])\n query.pat.optional.push(opt)\n\n //opt = kb.formula()\n query.pat.add(v['transaction'], UI.ns.qu('in_USD'), v['in_USD'])\n\n //query.pat.optional.push(opt)\n\n var tableDiv = UI.widgets.renderTableViewPane(dom, {'query': query, 'onDone': calculations} )\n div.appendChild(tableDiv)\n\n*/\n const calculations = function () {\n const total = {}\n const yearTotal = {}\n const yearCategoryTotal = {}\n const trans = kb.each(undefined, TRIP('trip'), subject)\n const bankStatements = trans.map(function (t) {\n return t.doc()\n })\n kb.fetcher\n .load(bankStatements)\n .then(function () {\n trans.forEach(function (t) {\n const date = kb.the(t, ns.qu('date'))\n const year = date ? ('' + date.value).slice(0, 4) : '????'\n let ty = kb.the(t, ns.rdf('type')) // @@ find most specific type\n // complain(\" -- one trans: \"+t.uri + ' -> '+kb.any(t, UI.ns.qu('in_USD')))\n if (!ty) ty = UI.ns.qu('ErrorNoType')\n if (ty && ty.uri) {\n const tyuri = ty.uri\n if (!yearTotal[year]) yearTotal[year] = 0.0\n if (!yearCategoryTotal[year]) yearCategoryTotal[year] = {}\n if (!total[tyuri]) total[tyuri] = 0.0\n if (!yearCategoryTotal[year][tyuri]) {\n yearCategoryTotal[year][tyuri] = 0.0\n }\n\n const lit = kb.any(t, UI.ns.qu('in_USD'))\n if (!lit) {\n complain('@@ No amount in USD: ' + lit + ' for ' + t)\n }\n if (lit) {\n const amount = parseFloat(lit.value)\n total[tyuri] += amount\n yearCategoryTotal[year][tyuri] += amount\n yearTotal[year] += amount\n }\n }\n })\n\n const types = []\n let grandTotal = 0.0\n const years = []\n let i\n\n for (const y in yearCategoryTotal) {\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(yearCategoryTotal, y)) {\n years.push(y)\n }\n }\n years.sort()\n const ny = years.length\n let cell\n\n const table = div.appendChild(dom.createElement('table'))\n table.setAttribute(\n 'style',\n 'font-size: 120%; margin-left:auto; margin-right:1em; margin-top: 1em; border: 0.05em solid gray; padding: 1em;'\n )\n\n if (ny > 1) {\n const header = table.appendChild(dom.createElement('tr'))\n header.appendChild(headerCell(''))\n for (i = 0; i < ny; i++) {\n header.appendChild(headerCell(years[i]))\n }\n header.appendChild(headerCell('total'))\n }\n\n for (const uri in total) {\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(total, uri)) {\n types.push(uri)\n grandTotal += total[uri]\n }\n }\n types.sort()\n let row, label, z\n for (let j = 0; j < types.length; j++) {\n const cat = kb.sym(types[j])\n row = table.appendChild(dom.createElement('tr'))\n label = row.appendChild(dom.createElement('td'))\n label.textContent = UI.utils.label(cat)\n if (ny > 1) {\n for (i = 0; i < ny; i++) {\n z = yearCategoryTotal[years[i]][types[j]]\n cell = row.appendChild(numericCell(z, true))\n }\n }\n row.appendChild(numericCell(total[types[j]], true))\n }\n\n // Trailing totals\n if (types.length > 1) {\n row = table.appendChild(dom.createElement('tr'))\n row.appendChild(headerCell('total'))\n if (ny > 1) {\n for (i = 0; i < ny; i++) {\n z = yearTotal[years[i]]\n cell = row.appendChild(numericCell(z ? d2(z) : ''))\n }\n }\n cell = row.appendChild(numericCell(grandTotal))\n cell.setAttribute(\n 'style',\n 'font-weight: bold; text-align: right;'\n )\n }\n\n const tab = transactionTable(dom, trans)\n tab.setAttribute(\n 'style',\n 'margin-left:auto; margin-right:1em; margin-top: 1em; border: padding: 1em;'\n )\n div.appendChild(tab)\n\n UI.widgets.attachmentList(dom, subject, div)\n })\n .catch(function (e) {\n complain('Error loading transactions: ' + e)\n })\n }\n calculations()\n } // if\n\n return div\n }\n}\n\n// ends\n"],"mappings":"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"}
1
+ {"version":3,"file":"pane.esm.js","names":["ns"],"sources":["../../src/transaction/pane.js"],"sourcesContent":["/* Financial Transaction Pane\n **\n ** This outline pane allows a user to interact with a transaction\n ** downloaded from a bank statement, annotting it with classes and comments,\n ** trips, etc\n */\n\nimport * as UI from 'solid-ui'\nimport * as $rdf from 'rdflib'\nconst ns = UI.ns\n\nexport default {\n // icon: (module.__dirname || __dirname) + '22-pixel-068010-3d-transparent-glass-icon-alphanumeric-dollar-sign.png',\n icon: UI.icons.iconBase + 'noun_106746.svg',\n\n name: 'transaction',\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#Transaction']) return '$$'\n if (kb.any(subject, UI.ns.qu('amount'))) return '$$$' // In case schema not picked up\n\n // if (t['http://www.w3.org/2000/10/swap/pim/qif#Period']) return \"period $\"\n\n if (t['http://www.w3.org/ns/pim/trip#Trip']) return 'Trip $'\n\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 fetcher = kb.fetcher\n const Q = $rdf.Namespace('http://www.w3.org/2000/10/swap/pim/qif#')\n const TRIP = $rdf.Namespace('http://www.w3.org/ns/pim/trip#')\n\n const div = dom.createElement('div')\n div.setAttribute('class', 'transactionPane')\n\n const mention = function mention (message, style) {\n if (style === undefined) 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 complain = function complain (message) {\n return mention(message, 'color: #100; background-color: #fee')\n }\n\n /*\n var thisPane = this\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 // //////////////////////////////////////////////////////////////////////////////\n\n const plist = kb.statementsMatching(subject)\n const qlist = kb.statementsMatching(undefined, undefined, subject)\n\n const t = kb.findTypeURIs(subject)\n\n // var me = authn.currentUser()\n const predicateURIsDone = {}\n const donePredicate = function (pred) {\n predicateURIsDone[pred.uri] = true\n }\n\n const setPaneStyle = function (account) {\n let mystyle = 'padding: 0.5em 1.5em 1em 1.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 div.setAttribute('style', mystyle)\n }\n // setPaneStyle()\n\n // Functions for displaying lists of transactions\n // Click on the transaction line to expand it into a pane\n // Shift-click to expand without collapsing others\n\n const d2 = function (n) {\n if (n === undefined) return ''\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 numericCell = function numericCell (amount, suppressZero) {\n const td = dom.createElement('td')\n if (!(0.0 + amount === 0.0 && suppressZero)) {\n td.textContent = d2(amount)\n }\n td.setAttribute('style', 'width: 6em; text-align: right; ')\n return td\n }\n\n const headerCell = function headerCell (str) {\n const td = dom.createElement('th')\n td.textContent = str\n td.setAttribute('style', 'text-align: right; ')\n return td\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 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, filter) {\n const table = dom.createElement('table')\n table.setAttribute(\n 'style',\n 'padding-left: 0.5em; padding-right: 0.5em; 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 =\n '\\'padding-left: 0.5em; padding-right: 0.5em; padding-top: 0.1em;'\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 = filter ? list.filter(filter) : list.slice() // don't sort a paramater passed in place\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 // Render a single transaction\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 if (\n t['http://www.w3.org/2000/10/swap/pim/qif#Transaction'] ||\n kb.any(subject, ns.qu('toAccount'))\n ) {\n // var trip = kb.any(subject, WF('trip'))\n donePredicate(ns.rdf('type'))\n\n const account = kb.any(subject, UI.ns.qu('toAccount'))\n setPaneStyle(account)\n if (!account) {\n complain(\n '(Error: There is no bank account known for this transaction <' +\n subject.uri +\n '>,\\n -- every transaction needs one.)'\n )\n }\n\n let store = null\n const statement = kb.any(subject, UI.ns.qu('accordingTo'))\n if (statement === undefined) {\n complain(\n '(Error: There is no back link to the original data source foir this transaction <' +\n subject.uri +\n '>,\\nso I can\\'t tell how to annotate it.)'\n )\n } else {\n store =\n statement !== undefined\n ? kb.any(statement, UI.ns.qu('annotationStore'))\n : null\n if (store === undefined) {\n complain(\n '(There is no annotation document for this statement\\n<' +\n statement.uri +\n '>,\\nso you cannot classify this transaction.)'\n )\n }\n }\n\n const nav = dom.createElement('div')\n nav.setAttribute('style', 'float:right')\n div.appendChild(nav)\n\n const navLink = function (pred, label) {\n donePredicate(pred)\n const obj = kb.any(subject, pred)\n if (!obj) return\n const a = dom.createElement('a')\n a.setAttribute('href', obj.uri)\n a.setAttribute('style', 'float:right')\n nav.appendChild(a).textContent = label || UI.utils.label(obj)\n nav.appendChild(dom.createElement('br'))\n }\n\n navLink(UI.ns.qu('toAccount'))\n navLink(UI.ns.qu('accordingTo'), 'Statement')\n navLink(TRIP('trip'))\n\n // Basic data:\n const table = dom.createElement('table')\n div.appendChild(table)\n const preds = ['date', 'payee', 'amount', 'in_USD', 'currency'].map(Q)\n const inner = preds\n .map(function (p) {\n donePredicate(p)\n const value = kb.any(subject, p)\n const s = value ? UI.utils.labelForXML(value) : ''\n return (\n '<tr><td style=\"text-align: right; padding-right: 0.6em\">' +\n UI.utils.labelForXML(p) +\n '</td><td style=\"font-weight: bold;\">' +\n s +\n '</td></tr>'\n )\n })\n .join('\\n')\n table.innerHTML = inner\n\n const complainIfBad = function (ok, body) {\n if (ok) {\n // setModifiedDate(store, kb, store)\n // rerender(div) // deletes the new trip form\n } else complain('Sorry, failed to save your change:\\n' + body)\n }\n\n // What trips do we know about?\n\n // Classify:\n if (store) {\n kb.fetcher.nowOrWhenFetched(store.uri, subject, function (ok, body) {\n if (!ok) complain('Cannot load store ' + store + ' ' + body)\n\n const calendarYear = kb.any(store, ns.qu('calendarYear'))\n\n const renderCatgorySelectors = function () {\n div.insertBefore(\n UI.widgets.makeSelectForNestedCategory(\n dom,\n kb,\n subject,\n UI.ns.qu('Classified'),\n store,\n complainIfBad\n ),\n table.nextSibling\n )\n }\n\n if (kb.any(undefined, ns.rdfs('subClassOf'), ns.qu.Classified)) {\n renderCatgorySelectors()\n } else if (calendarYear) {\n fetcher\n .load(calendarYear)\n .then(function (_xhrs) {\n fetcher\n .load(kb.each(calendarYear, ns.rdfs('seeAlso')))\n .then(function () {\n renderCatgorySelectors()\n })\n .catch(function (e) {\n console.log('Error loading background data: ' + e)\n })\n })\n .catch(function (e) {\n console.log('Error loading calendarYear: ' + e)\n })\n } else {\n console.log('Can\\'t get categories, because no calendarYear')\n }\n div.appendChild(\n UI.widgets.makeDescription(\n dom,\n kb,\n subject,\n UI.ns.rdfs('comment'),\n store,\n complainIfBad\n )\n )\n\n let trips = kb\n .statementsMatching(undefined, TRIP('trip'), undefined, store)\n .map(function (st) {\n return st.object\n }) // @@ Use rdfs\n const trips2 = kb.each(undefined, UI.ns.rdf('type'), TRIP('Trip'))\n trips = trips.concat(trips2).sort() // @@ Unique\n\n const sortedBy = function (kb, list, pred, reverse) {\n const l2 = list.map(function (x) {\n let key = kb.any(x, pred)\n key = key ? key.value : '9999-12-31'\n return [key, x]\n })\n l2.sort()\n if (reverse) l2.reverse()\n return l2.map(function (pair) {\n return pair[1]\n })\n }\n\n trips = sortedBy(kb, trips, UI.ns.cal('dtstart'), true) // Reverse chron\n\n if (trips.length > 1) {\n div.appendChild(\n UI.widgets.makeSelectForOptions(\n dom,\n kb,\n subject,\n TRIP('trip'),\n trips,\n {\n multiple: false,\n nullLabel: '-- what trip? --',\n mint: 'New Trip *',\n mintClass: TRIP('Trip'),\n mintStatementsFun: function (trip) {\n const is = []\n is.push(\n $rdf.st(trip, UI.ns.rdf('type'), TRIP('Trip'), trip.doc())\n )\n return is\n }\n },\n store,\n complainIfBad\n )\n )\n }\n\n div.appendChild(dom.createElement('br'))\n\n // Add in simple comments about the transaction\n\n const outliner = context.getOutliner(dom)\n\n donePredicate(ns.rdfs('comment')) // Done above\n\n UI.widgets.attachmentList(dom, subject, div)\n donePredicate(ns.wf('attachment'))\n\n div\n .appendChild(dom.createElement('tr'))\n .setAttribute('style', 'height: 1em') // spacer\n\n // Remaining properties\n outliner.appendPropertyTRs(div, plist, false, function (\n pred,\n _inverse\n ) {\n return !(pred.uri in predicateURIsDone)\n })\n outliner.appendPropertyTRs(div, qlist, true, function (\n pred,\n _inverse\n ) {\n return !(pred.uri in predicateURIsDone)\n })\n }) // fetch\n }\n // end of render tranasaction instance\n\n // ////////////////////////////////////////////////////////////////////\n //\n // Render the transactions in a Trip\n //\n } else if (t['http://www.w3.org/ns/pim/trip#Trip']) {\n /*\n var query = new $rdf.Query(UI.utils.label(subject))\n var vars = [ 'date', 'transaction', 'comment', 'type', 'in_USD']\n var v = {}\n vars.map(function(x){query.vars.push(v[x]=$rdf.variable(x))}) // Only used by UI\n query.pat.add(v['transaction'], TRIP('trip'), subject)\n\n var opt = kb.formula()\n opt.add(v['transaction'], ns.rdf('type'), v['type']); // Issue: this will get stored supertypes too\n query.pat.optional.push(opt)\n\n query.pat.add(v['transaction'], UI.ns.qu('date'), v['date'])\n\n var opt = kb.formula()\n opt.add(v['transaction'], ns.rdfs('comment'), v['comment'])\n query.pat.optional.push(opt)\n\n //opt = kb.formula()\n query.pat.add(v['transaction'], UI.ns.qu('in_USD'), v['in_USD'])\n\n //query.pat.optional.push(opt)\n\n var tableDiv = UI.widgets.renderTableViewPane(dom, {'query': query, 'onDone': calculations} )\n div.appendChild(tableDiv)\n\n*/\n const calculations = function () {\n const total = {}\n const yearTotal = {}\n const yearCategoryTotal = {}\n const trans = kb.each(undefined, TRIP('trip'), subject)\n const bankStatements = trans.map(function (t) {\n return t.doc()\n })\n kb.fetcher\n .load(bankStatements)\n .then(function () {\n trans.forEach(function (t) {\n const date = kb.the(t, ns.qu('date'))\n const year = date ? ('' + date.value).slice(0, 4) : '????'\n let ty = kb.the(t, ns.rdf('type')) // @@ find most specific type\n // complain(\" -- one trans: \"+t.uri + ' -> '+kb.any(t, UI.ns.qu('in_USD')))\n if (!ty) ty = UI.ns.qu('ErrorNoType')\n if (ty && ty.uri) {\n const tyuri = ty.uri\n if (!yearTotal[year]) yearTotal[year] = 0.0\n if (!yearCategoryTotal[year]) yearCategoryTotal[year] = {}\n if (!total[tyuri]) total[tyuri] = 0.0\n if (!yearCategoryTotal[year][tyuri]) {\n yearCategoryTotal[year][tyuri] = 0.0\n }\n\n const lit = kb.any(t, UI.ns.qu('in_USD'))\n if (!lit) {\n complain('@@ No amount in USD: ' + lit + ' for ' + t)\n }\n if (lit) {\n const amount = parseFloat(lit.value)\n total[tyuri] += amount\n yearCategoryTotal[year][tyuri] += amount\n yearTotal[year] += amount\n }\n }\n })\n\n const types = []\n let grandTotal = 0.0\n const years = []\n let i\n\n for (const y in yearCategoryTotal) {\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(yearCategoryTotal, y)) {\n years.push(y)\n }\n }\n years.sort()\n const ny = years.length\n let cell\n\n const table = div.appendChild(dom.createElement('table'))\n table.setAttribute(\n 'style',\n 'font-size: 120%; margin-left:auto; margin-right:1em; margin-top: 1em; border: 0.05em solid gray; padding: 1em;'\n )\n\n if (ny > 1) {\n const header = table.appendChild(dom.createElement('tr'))\n header.appendChild(headerCell(''))\n for (i = 0; i < ny; i++) {\n header.appendChild(headerCell(years[i]))\n }\n header.appendChild(headerCell('total'))\n }\n\n for (const uri in total) {\n // @@ TODO: Write away the need for exception on next line\n\n if (Object.prototype.hasOwnProperty.call(total, uri)) {\n types.push(uri)\n grandTotal += total[uri]\n }\n }\n types.sort()\n let row, label, z\n for (let j = 0; j < types.length; j++) {\n const cat = kb.sym(types[j])\n row = table.appendChild(dom.createElement('tr'))\n label = row.appendChild(dom.createElement('td'))\n label.textContent = UI.utils.label(cat)\n if (ny > 1) {\n for (i = 0; i < ny; i++) {\n z = yearCategoryTotal[years[i]][types[j]]\n cell = row.appendChild(numericCell(z, true))\n }\n }\n row.appendChild(numericCell(total[types[j]], true))\n }\n\n // Trailing totals\n if (types.length > 1) {\n row = table.appendChild(dom.createElement('tr'))\n row.appendChild(headerCell('total'))\n if (ny > 1) {\n for (i = 0; i < ny; i++) {\n z = yearTotal[years[i]]\n cell = row.appendChild(numericCell(z ? d2(z) : ''))\n }\n }\n cell = row.appendChild(numericCell(grandTotal))\n cell.setAttribute(\n 'style',\n 'font-weight: bold; text-align: right;'\n )\n }\n\n const tab = transactionTable(dom, trans)\n tab.setAttribute(\n 'style',\n 'margin-left:auto; margin-right:1em; margin-top: 1em; border: padding: 1em;'\n )\n div.appendChild(tab)\n\n UI.widgets.attachmentList(dom, subject, div)\n })\n .catch(function (e) {\n complain('Error loading transactions: ' + e)\n })\n }\n calculations()\n } // if\n\n return div\n }\n}\n\n// ends\n"],"mappings":"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"}