@peers-app/peers-ui 0.0.14

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 (404) hide show
  1. package/.github/README.md +52 -0
  2. package/.github/workflows/publish.yml +45 -0
  3. package/babel.config.js +7 -0
  4. package/dist/app.d.ts +9 -0
  5. package/dist/app.js +54 -0
  6. package/dist/command-palette/command-palette-ui.d.ts +2 -0
  7. package/dist/command-palette/command-palette-ui.js +192 -0
  8. package/dist/command-palette/command-palette.d.ts +23 -0
  9. package/dist/command-palette/command-palette.js +371 -0
  10. package/dist/components/checkbox.d.ts +7 -0
  11. package/dist/components/checkbox.js +20 -0
  12. package/dist/components/group-switcher.d.ts +6 -0
  13. package/dist/components/group-switcher.js +301 -0
  14. package/dist/components/input-date.d.ts +7 -0
  15. package/dist/components/input-date.js +19 -0
  16. package/dist/components/input-datetime.d.ts +7 -0
  17. package/dist/components/input-datetime.js +35 -0
  18. package/dist/components/input-number.d.ts +9 -0
  19. package/dist/components/input-number.js +87 -0
  20. package/dist/components/input.d.ts +7 -0
  21. package/dist/components/input.js +20 -0
  22. package/dist/components/io-schema-values.d.ts +15 -0
  23. package/dist/components/io-schema-values.js +105 -0
  24. package/dist/components/io-schema.d.ts +13 -0
  25. package/dist/components/io-schema.js +163 -0
  26. package/dist/components/lazy-list.d.ts +13 -0
  27. package/dist/components/lazy-list.js +91 -0
  28. package/dist/components/lazy-sortable-list.d.ts +29 -0
  29. package/dist/components/lazy-sortable-list.js +12 -0
  30. package/dist/components/left-bar.d.ts +3 -0
  31. package/dist/components/left-bar.js +130 -0
  32. package/dist/components/list-screen.d.ts +16 -0
  33. package/dist/components/list-screen.js +100 -0
  34. package/dist/components/loading-indicator.d.ts +2 -0
  35. package/dist/components/loading-indicator.js +12 -0
  36. package/dist/components/main-content-container.d.ts +2 -0
  37. package/dist/components/main-content-container.js +90 -0
  38. package/dist/components/markdown-editor/autolink-plugin.d.ts +2 -0
  39. package/dist/components/markdown-editor/autolink-plugin.js +29 -0
  40. package/dist/components/markdown-editor/editor-inline.d.ts +3 -0
  41. package/dist/components/markdown-editor/editor-inline.js +13 -0
  42. package/dist/components/markdown-editor/editor.d.ts +18 -0
  43. package/dist/components/markdown-editor/editor.js +143 -0
  44. package/dist/components/markdown-editor/markdown-plugin.d.ts +9 -0
  45. package/dist/components/markdown-editor/markdown-plugin.js +194 -0
  46. package/dist/components/markdown-editor/mention-node.d.ts +21 -0
  47. package/dist/components/markdown-editor/mention-node.js +160 -0
  48. package/dist/components/markdown-editor/mentions-plugin.d.ts +7 -0
  49. package/dist/components/markdown-editor/mentions-plugin.js +268 -0
  50. package/dist/components/markdown-editor/theme.d.ts +46 -0
  51. package/dist/components/markdown-editor/theme.js +48 -0
  52. package/dist/components/markdown-editor/toolbar.d.ts +10 -0
  53. package/dist/components/markdown-editor/toolbar.js +112 -0
  54. package/dist/components/markdown-with-mentions.d.ts +4 -0
  55. package/dist/components/markdown-with-mentions.js +140 -0
  56. package/dist/components/message-logs/message-logs.d.ts +6 -0
  57. package/dist/components/message-logs/message-logs.js +307 -0
  58. package/dist/components/messages/avatar.d.ts +10 -0
  59. package/dist/components/messages/avatar.js +65 -0
  60. package/dist/components/messages/channel-message-list.d.ts +14 -0
  61. package/dist/components/messages/channel-message-list.js +158 -0
  62. package/dist/components/messages/channel-view.d.ts +6 -0
  63. package/dist/components/messages/channel-view.js +82 -0
  64. package/dist/components/messages/message-compose.d.ts +11 -0
  65. package/dist/components/messages/message-compose.js +152 -0
  66. package/dist/components/messages/message-display.d.ts +10 -0
  67. package/dist/components/messages/message-display.js +152 -0
  68. package/dist/components/messages/thread-message-list.d.ts +11 -0
  69. package/dist/components/messages/thread-message-list.js +122 -0
  70. package/dist/components/messages/thread-view.d.ts +6 -0
  71. package/dist/components/messages/thread-view.js +174 -0
  72. package/dist/components/off-canvas.d.ts +13 -0
  73. package/dist/components/off-canvas.js +89 -0
  74. package/dist/components/router.d.ts +6 -0
  75. package/dist/components/router.js +240 -0
  76. package/dist/components/save-button.d.ts +13 -0
  77. package/dist/components/save-button.js +75 -0
  78. package/dist/components/sortable-list.d.ts +36 -0
  79. package/dist/components/sortable-list.js +77 -0
  80. package/dist/components/tabs.d.ts +11 -0
  81. package/dist/components/tabs.js +69 -0
  82. package/dist/components/text-list-editor.tsx/text-list-editor.d.ts +6 -0
  83. package/dist/components/text-list-editor.tsx/text-list-editor.js +13 -0
  84. package/dist/components/tooltip.d.ts +11 -0
  85. package/dist/components/tooltip.js +20 -0
  86. package/dist/components/top-bar.d.ts +2 -0
  87. package/dist/components/top-bar.js +51 -0
  88. package/dist/components/typeahead/mentions-plugin.d.ts +7 -0
  89. package/dist/components/typeahead/mentions-plugin.js +203 -0
  90. package/dist/components/typeahead/typeahead-editor.d.ts +15 -0
  91. package/dist/components/typeahead/typeahead-editor.js +134 -0
  92. package/dist/components/typeahead/typeahead.d.ts +12 -0
  93. package/dist/components/typeahead/typeahead.js +94 -0
  94. package/dist/components/typeahead.d.ts +22 -0
  95. package/dist/components/typeahead.js +270 -0
  96. package/dist/globals.d.ts +29 -0
  97. package/dist/globals.js +148 -0
  98. package/dist/hooks.d.ts +34 -0
  99. package/dist/hooks.js +137 -0
  100. package/dist/index.d.ts +4 -0
  101. package/dist/index.js +20 -0
  102. package/dist/layout-vars.d.ts +6 -0
  103. package/dist/layout-vars.js +10 -0
  104. package/dist/mention-configs.d.ts +18 -0
  105. package/dist/mention-configs.js +149 -0
  106. package/dist/screens/assistants/assistant-config.d.ts +5 -0
  107. package/dist/screens/assistants/assistant-config.js +52 -0
  108. package/dist/screens/assistants/assistant-details.d.ts +4 -0
  109. package/dist/screens/assistants/assistant-details.js +85 -0
  110. package/dist/screens/assistants/assistant-info.d.ts +6 -0
  111. package/dist/screens/assistants/assistant-info.js +28 -0
  112. package/dist/screens/assistants/assistant-list.d.ts +2 -0
  113. package/dist/screens/assistants/assistant-list.js +114 -0
  114. package/dist/screens/assistants/assistant-tools.d.ts +5 -0
  115. package/dist/screens/assistants/assistant-tools.js +38 -0
  116. package/dist/screens/contacts/contact-details.d.ts +6 -0
  117. package/dist/screens/contacts/contact-details.js +100 -0
  118. package/dist/screens/contacts/contact-list.d.ts +2 -0
  119. package/dist/screens/contacts/contact-list.js +213 -0
  120. package/dist/screens/contacts/index.d.ts +4 -0
  121. package/dist/screens/contacts/index.js +21 -0
  122. package/dist/screens/events/cron.d.ts +3 -0
  123. package/dist/screens/events/cron.js +77 -0
  124. package/dist/screens/events/event-details.d.ts +6 -0
  125. package/dist/screens/events/event-details.js +112 -0
  126. package/dist/screens/events/event-handlers.d.ts +7 -0
  127. package/dist/screens/events/event-handlers.js +84 -0
  128. package/dist/screens/events/event-info.d.ts +5 -0
  129. package/dist/screens/events/event-info.js +19 -0
  130. package/dist/screens/events/event-list.d.ts +2 -0
  131. package/dist/screens/events/event-list.js +107 -0
  132. package/dist/screens/events/event-schedule.d.ts +5 -0
  133. package/dist/screens/events/event-schedule.js +124 -0
  134. package/dist/screens/groups/group-details.d.ts +6 -0
  135. package/dist/screens/groups/group-details.js +218 -0
  136. package/dist/screens/groups/group-list.d.ts +2 -0
  137. package/dist/screens/groups/group-list.js +275 -0
  138. package/dist/screens/groups/group-members.d.ts +8 -0
  139. package/dist/screens/groups/group-members.js +315 -0
  140. package/dist/screens/groups/index.d.ts +6 -0
  141. package/dist/screens/groups/index.js +23 -0
  142. package/dist/screens/knowledge/knowledge-frame-details.bk.d.ts +6 -0
  143. package/dist/screens/knowledge/knowledge-frame-details.bk.js +84 -0
  144. package/dist/screens/knowledge/knowledge-frame-details.d.ts +8 -0
  145. package/dist/screens/knowledge/knowledge-frame-details.js +143 -0
  146. package/dist/screens/knowledge/knowledge-frame-list.d.ts +2 -0
  147. package/dist/screens/knowledge/knowledge-frame-list.js +45 -0
  148. package/dist/screens/knowledge/knowledge-value-details.d.ts +6 -0
  149. package/dist/screens/knowledge/knowledge-value-details.js +150 -0
  150. package/dist/screens/knowledge/knowledge-value-list-item.d.ts +5 -0
  151. package/dist/screens/knowledge/knowledge-value-list-item.js +39 -0
  152. package/dist/screens/knowledge/knowledge-value-list.d.ts +3 -0
  153. package/dist/screens/knowledge/knowledge-value-list.js +123 -0
  154. package/dist/screens/packages/package-details.d.ts +6 -0
  155. package/dist/screens/packages/package-details.js +82 -0
  156. package/dist/screens/packages/package-info.d.ts +5 -0
  157. package/dist/screens/packages/package-info.js +42 -0
  158. package/dist/screens/packages/package-list.d.ts +2 -0
  159. package/dist/screens/packages/package-list.js +182 -0
  160. package/dist/screens/packages/package-new-local.d.ts +2 -0
  161. package/dist/screens/packages/package-new-local.js +82 -0
  162. package/dist/screens/peer-types/peer-type-details.d.ts +10 -0
  163. package/dist/screens/peer-types/peer-type-details.js +126 -0
  164. package/dist/screens/peer-types/peer-type-list.d.ts +2 -0
  165. package/dist/screens/peer-types/peer-type-list.js +57 -0
  166. package/dist/screens/predicates/predicate-details.d.ts +6 -0
  167. package/dist/screens/predicates/predicate-details.js +103 -0
  168. package/dist/screens/predicates/predicate-list.d.ts +2 -0
  169. package/dist/screens/predicates/predicate-list.js +46 -0
  170. package/dist/screens/profile.d.ts +2 -0
  171. package/dist/screens/profile.js +66 -0
  172. package/dist/screens/search/global-search.d.ts +2 -0
  173. package/dist/screens/search/global-search.js +186 -0
  174. package/dist/screens/settings/color-mode-dropdown.d.ts +6 -0
  175. package/dist/screens/settings/color-mode-dropdown.js +63 -0
  176. package/dist/screens/settings/settings-page.d.ts +2 -0
  177. package/dist/screens/settings/settings-page.js +49 -0
  178. package/dist/screens/setup-user.d.ts +2 -0
  179. package/dist/screens/setup-user.js +270 -0
  180. package/dist/screens/tools/tool-code.d.ts +5 -0
  181. package/dist/screens/tools/tool-code.js +32 -0
  182. package/dist/screens/tools/tool-details.d.ts +6 -0
  183. package/dist/screens/tools/tool-details.js +68 -0
  184. package/dist/screens/tools/tool-info.d.ts +5 -0
  185. package/dist/screens/tools/tool-info.js +74 -0
  186. package/dist/screens/tools/tool-list.d.ts +2 -0
  187. package/dist/screens/tools/tool-list.js +123 -0
  188. package/dist/screens/tools/tool-schema.d.ts +5 -0
  189. package/dist/screens/tools/tool-schema.js +30 -0
  190. package/dist/screens/tools/tool-test-details.d.ts +4 -0
  191. package/dist/screens/tools/tool-test-details.js +54 -0
  192. package/dist/screens/tools/tool-test-list.d.ts +4 -0
  193. package/dist/screens/tools/tool-test-list.js +82 -0
  194. package/dist/screens/variables/variable-details.d.ts +6 -0
  195. package/dist/screens/variables/variable-details.js +140 -0
  196. package/dist/screens/variables/variable-list.d.ts +2 -0
  197. package/dist/screens/variables/variable-list.js +58 -0
  198. package/dist/screens/workflows/workflow-details.d.ts +6 -0
  199. package/dist/screens/workflows/workflow-details.js +122 -0
  200. package/dist/screens/workflows/workflow-info.d.ts +5 -0
  201. package/dist/screens/workflows/workflow-info.js +18 -0
  202. package/dist/screens/workflows/workflow-instructions.d.ts +5 -0
  203. package/dist/screens/workflows/workflow-instructions.js +118 -0
  204. package/dist/screens/workflows/workflow-list.d.ts +2 -0
  205. package/dist/screens/workflows/workflow-list.js +109 -0
  206. package/dist/screens/workflows/workflow-subscriptions.d.ts +6 -0
  207. package/dist/screens/workflows/workflow-subscriptions.js +81 -0
  208. package/dist/setupTests.d.ts +1 -0
  209. package/dist/setupTests.js +31 -0
  210. package/dist/system-apps/assistants.app.d.ts +2 -0
  211. package/dist/system-apps/assistants.app.js +8 -0
  212. package/dist/system-apps/contacts.app.d.ts +2 -0
  213. package/dist/system-apps/contacts.app.js +9 -0
  214. package/dist/system-apps/events.app.d.ts +2 -0
  215. package/dist/system-apps/events.app.js +8 -0
  216. package/dist/system-apps/groups.app.d.ts +2 -0
  217. package/dist/system-apps/groups.app.js +9 -0
  218. package/dist/system-apps/index.d.ts +19 -0
  219. package/dist/system-apps/index.js +90 -0
  220. package/dist/system-apps/knowledge-frames.app.d.ts +2 -0
  221. package/dist/system-apps/knowledge-frames.app.js +9 -0
  222. package/dist/system-apps/knowledge-values.app.d.ts +2 -0
  223. package/dist/system-apps/knowledge-values.app.js +9 -0
  224. package/dist/system-apps/packages.app.d.ts +2 -0
  225. package/dist/system-apps/packages.app.js +8 -0
  226. package/dist/system-apps/predicates.app.d.ts +2 -0
  227. package/dist/system-apps/predicates.app.js +8 -0
  228. package/dist/system-apps/profile.app.d.ts +2 -0
  229. package/dist/system-apps/profile.app.js +8 -0
  230. package/dist/system-apps/search.app.d.ts +2 -0
  231. package/dist/system-apps/search.app.js +9 -0
  232. package/dist/system-apps/settings.app.d.ts +2 -0
  233. package/dist/system-apps/settings.app.js +8 -0
  234. package/dist/system-apps/threads.app.d.ts +2 -0
  235. package/dist/system-apps/threads.app.js +8 -0
  236. package/dist/system-apps/tools.app.d.ts +2 -0
  237. package/dist/system-apps/tools.app.js +8 -0
  238. package/dist/system-apps/types.app.d.ts +2 -0
  239. package/dist/system-apps/types.app.js +8 -0
  240. package/dist/system-apps/variables.app.d.ts +2 -0
  241. package/dist/system-apps/variables.app.js +8 -0
  242. package/dist/system-apps/workflows.app.d.ts +2 -0
  243. package/dist/system-apps/workflows.app.js +8 -0
  244. package/dist/tabs-layout/tabs-layout.d.ts +5 -0
  245. package/dist/tabs-layout/tabs-layout.js +374 -0
  246. package/dist/tabs-layout/tabs-state.d.ts +26 -0
  247. package/dist/tabs-layout/tabs-state.js +239 -0
  248. package/dist/three-bar-layout/left-bar-content.d.ts +7 -0
  249. package/dist/three-bar-layout/left-bar-content.js +151 -0
  250. package/dist/three-bar-layout/right-bar-content.d.ts +2 -0
  251. package/dist/three-bar-layout/right-bar-content.js +64 -0
  252. package/dist/three-bar-layout/three-bar-layout.d.ts +5 -0
  253. package/dist/three-bar-layout/three-bar-layout.js +218 -0
  254. package/dist/ui-defaults/index.d.ts +2 -0
  255. package/dist/ui-defaults/index.js +4 -0
  256. package/dist/ui-defaults/list-screen.d.ts +6 -0
  257. package/dist/ui-defaults/list-screen.js +74 -0
  258. package/dist/ui-defaults/notes-editor.d.ts +7 -0
  259. package/dist/ui-defaults/notes-editor.js +41 -0
  260. package/dist/ui-router/routes-loader.d.ts +25 -0
  261. package/dist/ui-router/routes-loader.js +97 -0
  262. package/dist/ui-router/ui-loader.d.ts +18 -0
  263. package/dist/ui-router/ui-loader.js +481 -0
  264. package/dist/utils.d.ts +9 -0
  265. package/dist/utils.js +250 -0
  266. package/docs/conversation-tab.md +201 -0
  267. package/docs/getting-started.md +284 -0
  268. package/docs/knowledge.md +187 -0
  269. package/docs/tabs-ui.md +696 -0
  270. package/docs/user-contacts-ui.md +384 -0
  271. package/jest.config.js +25 -0
  272. package/package.json +109 -0
  273. package/src/app.tsx +59 -0
  274. package/src/command-palette/command-palette-ui.tsx +264 -0
  275. package/src/command-palette/command-palette.ts +364 -0
  276. package/src/components/checkbox.tsx +22 -0
  277. package/src/components/group-switcher.tsx +469 -0
  278. package/src/components/input-date.tsx +28 -0
  279. package/src/components/input-datetime.tsx +41 -0
  280. package/src/components/input-number.tsx +67 -0
  281. package/src/components/input.tsx +22 -0
  282. package/src/components/io-schema-values.tsx +122 -0
  283. package/src/components/io-schema.tsx +234 -0
  284. package/src/components/lazy-list.tsx +98 -0
  285. package/src/components/lazy-sortable-list.tsx +51 -0
  286. package/src/components/left-bar.tsx +264 -0
  287. package/src/components/list-screen.tsx +105 -0
  288. package/src/components/loading-indicator.tsx +9 -0
  289. package/src/components/main-content-container.tsx +76 -0
  290. package/src/components/markdown-editor/autolink-plugin.tsx +36 -0
  291. package/src/components/markdown-editor/editor-inline.tsx +10 -0
  292. package/src/components/markdown-editor/editor.tsx +152 -0
  293. package/src/components/markdown-editor/markdown-plugin.tsx +224 -0
  294. package/src/components/markdown-editor/mention-node.ts +199 -0
  295. package/src/components/markdown-editor/mentions-plugin.tsx +356 -0
  296. package/src/components/markdown-editor/theme.ts +47 -0
  297. package/src/components/markdown-editor/toolbar.tsx +263 -0
  298. package/src/components/markdown-with-mentions.tsx +183 -0
  299. package/src/components/message-logs/message-logs.tsx +406 -0
  300. package/src/components/messages/avatar.tsx +95 -0
  301. package/src/components/messages/channel-message-list.tsx +177 -0
  302. package/src/components/messages/channel-view.tsx +74 -0
  303. package/src/components/messages/message-compose.tsx +162 -0
  304. package/src/components/messages/message-display.tsx +217 -0
  305. package/src/components/messages/thread-message-list.tsx +126 -0
  306. package/src/components/messages/thread-view.tsx +214 -0
  307. package/src/components/off-canvas.tsx +83 -0
  308. package/src/components/router.tsx +224 -0
  309. package/src/components/save-button.tsx +109 -0
  310. package/src/components/sortable-list.tsx +102 -0
  311. package/src/components/tabs.tsx +70 -0
  312. package/src/components/text-list-editor.tsx/text-list-editor.tsx +13 -0
  313. package/src/components/tooltip.tsx +50 -0
  314. package/src/components/top-bar.tsx +119 -0
  315. package/src/components/typeahead/mentions-plugin.tsx +265 -0
  316. package/src/components/typeahead/typeahead-editor.tsx +140 -0
  317. package/src/components/typeahead/typeahead.tsx +77 -0
  318. package/src/components/typeahead.tsx +359 -0
  319. package/src/globals.tsx +162 -0
  320. package/src/hooks.ts +144 -0
  321. package/src/index.tsx +8 -0
  322. package/src/layout-vars.ts +8 -0
  323. package/src/mention-configs.ts +166 -0
  324. package/src/screens/assistants/assistant-config.tsx +80 -0
  325. package/src/screens/assistants/assistant-details.tsx +77 -0
  326. package/src/screens/assistants/assistant-info.tsx +45 -0
  327. package/src/screens/assistants/assistant-list.tsx +115 -0
  328. package/src/screens/assistants/assistant-tools.tsx +61 -0
  329. package/src/screens/contacts/contact-details.tsx +175 -0
  330. package/src/screens/contacts/contact-list.tsx +251 -0
  331. package/src/screens/contacts/index.ts +6 -0
  332. package/src/screens/events/cron.ts +74 -0
  333. package/src/screens/events/event-details.tsx +117 -0
  334. package/src/screens/events/event-handlers.tsx +61 -0
  335. package/src/screens/events/event-info.tsx +29 -0
  336. package/src/screens/events/event-list.tsx +104 -0
  337. package/src/screens/events/event-schedule.tsx +130 -0
  338. package/src/screens/groups/group-details.tsx +306 -0
  339. package/src/screens/groups/group-list.tsx +366 -0
  340. package/src/screens/groups/group-members.tsx +455 -0
  341. package/src/screens/groups/index.ts +9 -0
  342. package/src/screens/knowledge/knowledge-frame-details.bk.tsx +160 -0
  343. package/src/screens/knowledge/knowledge-frame-details.tsx +176 -0
  344. package/src/screens/knowledge/knowledge-frame-list.tsx +49 -0
  345. package/src/screens/knowledge/knowledge-value-details.tsx +181 -0
  346. package/src/screens/knowledge/knowledge-value-list-item.tsx +48 -0
  347. package/src/screens/knowledge/knowledge-value-list.tsx +131 -0
  348. package/src/screens/packages/package-details.tsx +117 -0
  349. package/src/screens/packages/package-info.tsx +83 -0
  350. package/src/screens/packages/package-list.tsx +191 -0
  351. package/src/screens/packages/package-new-local.tsx +93 -0
  352. package/src/screens/peer-types/peer-type-details.tsx +162 -0
  353. package/src/screens/peer-types/peer-type-list.tsx +74 -0
  354. package/src/screens/predicates/predicate-details.tsx +125 -0
  355. package/src/screens/predicates/predicate-list.tsx +50 -0
  356. package/src/screens/profile.tsx +68 -0
  357. package/src/screens/search/global-search.tsx +274 -0
  358. package/src/screens/settings/color-mode-dropdown.tsx +57 -0
  359. package/src/screens/settings/settings-page.tsx +76 -0
  360. package/src/screens/setup-user.tsx +367 -0
  361. package/src/screens/tools/tool-code.tsx +35 -0
  362. package/src/screens/tools/tool-details.tsx +101 -0
  363. package/src/screens/tools/tool-info.tsx +60 -0
  364. package/src/screens/tools/tool-list.tsx +121 -0
  365. package/src/screens/tools/tool-schema.tsx +42 -0
  366. package/src/screens/tools/tool-test-details.tsx +100 -0
  367. package/src/screens/tools/tool-test-list.tsx +74 -0
  368. package/src/screens/variables/variable-details.tsx +183 -0
  369. package/src/screens/variables/variable-list.tsx +74 -0
  370. package/src/screens/workflows/workflow-details.tsx +130 -0
  371. package/src/screens/workflows/workflow-info.tsx +29 -0
  372. package/src/screens/workflows/workflow-instructions.tsx +127 -0
  373. package/src/screens/workflows/workflow-list.tsx +107 -0
  374. package/src/screens/workflows/workflow-subscriptions.tsx +58 -0
  375. package/src/setupTests.ts +32 -0
  376. package/src/system-apps/assistants.app.ts +7 -0
  377. package/src/system-apps/contacts.app.ts +8 -0
  378. package/src/system-apps/events.app.ts +7 -0
  379. package/src/system-apps/groups.app.ts +8 -0
  380. package/src/system-apps/index.ts +79 -0
  381. package/src/system-apps/knowledge-frames.app.ts +8 -0
  382. package/src/system-apps/knowledge-values.app.ts +8 -0
  383. package/src/system-apps/packages.app.ts +7 -0
  384. package/src/system-apps/predicates.app.ts +7 -0
  385. package/src/system-apps/profile.app.ts +7 -0
  386. package/src/system-apps/search.app.ts +8 -0
  387. package/src/system-apps/settings.app.ts +7 -0
  388. package/src/system-apps/threads.app.ts +7 -0
  389. package/src/system-apps/tools.app.ts +7 -0
  390. package/src/system-apps/types.app.ts +7 -0
  391. package/src/system-apps/variables.app.ts +7 -0
  392. package/src/system-apps/workflows.app.ts +7 -0
  393. package/src/tabs-layout/tabs-layout.tsx +672 -0
  394. package/src/tabs-layout/tabs-state.ts +269 -0
  395. package/src/three-bar-layout/left-bar-content.tsx +202 -0
  396. package/src/three-bar-layout/right-bar-content.tsx +67 -0
  397. package/src/three-bar-layout/three-bar-layout.tsx +297 -0
  398. package/src/ui-defaults/index.ts +3 -0
  399. package/src/ui-defaults/list-screen.tsx +92 -0
  400. package/src/ui-defaults/notes-editor.tsx +51 -0
  401. package/src/ui-router/routes-loader.ts +98 -0
  402. package/src/ui-router/ui-loader.tsx +497 -0
  403. package/src/utils.ts +266 -0
  404. package/tsconfig.json +24 -0
@@ -0,0 +1,315 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.GroupMembersUI = void 0;
7
+ const peers_sdk_1 = require("@peers-app/peers-sdk");
8
+ const react_1 = __importDefault(require("react"));
9
+ const loading_indicator_1 = require("../../components/loading-indicator");
10
+ const typeahead_1 = require("../../components/typeahead");
11
+ const hooks_1 = require("../../hooks");
12
+ const GroupMembersUI = (props) => {
13
+ const { groupId, userContext } = props;
14
+ // Get the group's data context and tables
15
+ const groupDataContext = userContext.getDataContext(groupId);
16
+ const groupMembersTable = (0, peers_sdk_1.GroupMembers)(groupDataContext);
17
+ const groupUsersTable = (0, peers_sdk_1.Users)(groupDataContext);
18
+ // State for refreshing the component
19
+ const [refreshKey, setRefreshKey] = react_1.default.useState(0);
20
+ // Load group members with user details and check current user permissions
21
+ const membersData = (0, hooks_1.usePromise)(async () => {
22
+ const members = await groupMembersTable.list({ deleted: { $ne: true } });
23
+ // Get user details for each member using the group context
24
+ const membersWithUsers = await Promise.all(members.map(async (member) => {
25
+ const user = await (0, peers_sdk_1.getUserById)(member.userId, {
26
+ currentDataContext: groupDataContext
27
+ });
28
+ // If user found from external source, save to current group
29
+ if (user && user.source !== 'currentDataContext') {
30
+ try {
31
+ const newGroupUser = await groupUsersTable.initRecord({
32
+ userId: user.userId,
33
+ name: user.name,
34
+ publicKey: user.publicKey || '',
35
+ publicBoxKey: user.publicBoxKey || '',
36
+ trustLevel: peers_sdk_1.TrustLevel.NewUser
37
+ });
38
+ await groupUsersTable.save(newGroupUser);
39
+ // Update user reference to reflect it's now in current group
40
+ user.trustLevel = peers_sdk_1.TrustLevel.NewUser;
41
+ user.source = 'currentDataContext';
42
+ }
43
+ catch (saveErr) {
44
+ console.error('Failed to save user to group context:', saveErr);
45
+ }
46
+ }
47
+ return {
48
+ member,
49
+ user: user || null
50
+ };
51
+ }));
52
+ return membersWithUsers;
53
+ }, [], [groupId, refreshKey]);
54
+ // Check if current user has admin privileges in this group
55
+ const userPermissions = (0, hooks_1.usePromise)(async () => {
56
+ const currentUserContext = await (0, peers_sdk_1.getUserContext)();
57
+ const currentUserId = currentUserContext.userId();
58
+ const userRole = await (0, peers_sdk_1.getUserRole)(groupId, currentUserId);
59
+ return {
60
+ isMember: !!userRole,
61
+ canEdit: userRole >= peers_sdk_1.GroupMemberRole.Admin,
62
+ userRole: userRole,
63
+ currentUserId: currentUserId
64
+ };
65
+ }, undefined, [groupId]);
66
+ // Load group and founder information
67
+ const founderData = (0, hooks_1.usePromise)(async () => {
68
+ const groupsTable = (0, peers_sdk_1.Groups)(groupDataContext);
69
+ const group = await groupsTable.get(groupId) || await (0, peers_sdk_1.Groups)(userContext.userDataContext).get(groupId);
70
+ if (!group) {
71
+ return null;
72
+ }
73
+ // Try to get founder user details
74
+ const founderUser = await (0, peers_sdk_1.getUserById)(group.founderUserId, {
75
+ currentDataContext: groupDataContext
76
+ });
77
+ return {
78
+ group,
79
+ founderUser,
80
+ founderUserId: group.founderUserId
81
+ };
82
+ }, undefined, [groupId, refreshKey]);
83
+ const [newMemberRole, setNewMemberRole] = react_1.default.useState(peers_sdk_1.GroupMemberRole.Reader);
84
+ const [addingMember, setAddingMember] = react_1.default.useState(false);
85
+ const [selectedContacts, setSelectedContacts] = react_1.default.useState([]);
86
+ // Search function for typeahead
87
+ const searchContacts = async (query) => {
88
+ try {
89
+ const cursor = await (0, peers_sdk_1.usersCursor)({ name: { $matchWords: query } });
90
+ const results = [];
91
+ // Get first 10 results
92
+ for await (const contact of cursor) {
93
+ results.push(contact);
94
+ if (results.length >= 10)
95
+ break;
96
+ }
97
+ // Filter out users who are already members
98
+ const currentMembers = membersData?.map(m => m.member.userId) || [];
99
+ const filteredResults = results.filter(contact => !currentMembers.includes(contact.userId));
100
+ return filteredResults.map(contact => ({
101
+ ...contact,
102
+ id: contact.userId
103
+ }));
104
+ }
105
+ catch (error) {
106
+ console.error('Error searching contacts:', error);
107
+ return [];
108
+ }
109
+ };
110
+ // Render function for typeahead results
111
+ const renderContactItem = (contact, isSelected) => (react_1.default.createElement("div", { className: "d-flex align-items-center" },
112
+ react_1.default.createElement("i", { className: "bi-person-circle me-2", style: { fontSize: '20px' } }),
113
+ react_1.default.createElement("div", { className: "flex-grow-1" },
114
+ react_1.default.createElement("div", { className: "fw-semibold" }, contact.name),
115
+ react_1.default.createElement("small", { className: "text-muted" }, contact.userId)),
116
+ react_1.default.createElement("div", null,
117
+ react_1.default.createElement("small", { className: "text-info" },
118
+ react_1.default.createElement("i", { className: `bi-${getSourceIcon(contact.source)} me-1` }),
119
+ getSourceLabel(contact.source)))));
120
+ // Helper functions for contact sources
121
+ const getSourceLabel = (source) => {
122
+ switch (source) {
123
+ case 'userDataContext': return 'Personal';
124
+ case 'currentDataContext': return 'Current';
125
+ case 'otherDataContexts': return 'Groups';
126
+ default: return source;
127
+ }
128
+ };
129
+ const getSourceIcon = (source) => {
130
+ switch (source) {
131
+ case 'userDataContext': return 'person-fill';
132
+ case 'currentDataContext': return 'house-fill';
133
+ case 'otherDataContexts': return 'people-fill';
134
+ default: return 'question-circle';
135
+ }
136
+ };
137
+ const addMember = async () => {
138
+ if (selectedContacts.length === 0)
139
+ return;
140
+ setAddingMember(true);
141
+ try {
142
+ // Add all selected contacts with the chosen role
143
+ for (const contact of selectedContacts) {
144
+ let member = await groupMembersTable.findOne({ userId: contact.userId, groupId });
145
+ if (member) {
146
+ member.role = newMemberRole;
147
+ member.deleted = false;
148
+ }
149
+ else {
150
+ member = await groupMembersTable.initRecord({
151
+ groupId: groupId,
152
+ userId: contact.userId,
153
+ role: newMemberRole
154
+ });
155
+ }
156
+ await groupMembersTable.save(member);
157
+ }
158
+ // Reset form
159
+ setSelectedContacts([]);
160
+ setNewMemberRole(peers_sdk_1.GroupMemberRole.Reader);
161
+ // Refresh the members list
162
+ setRefreshKey(prev => prev + 1);
163
+ }
164
+ catch (err) {
165
+ console.error('Failed to add member:', err);
166
+ alert('Failed to add member. They may already be in the group.');
167
+ }
168
+ finally {
169
+ setAddingMember(false);
170
+ }
171
+ };
172
+ // Render function for contact badges
173
+ const renderContactBadge = (contact) => (react_1.default.createElement("span", null, contact.name));
174
+ const updateRole = async (memberId, newRole) => {
175
+ try {
176
+ const member = await groupMembersTable.get(memberId);
177
+ if (member) {
178
+ member.role = newRole;
179
+ await groupMembersTable.save(member);
180
+ setRefreshKey(prev => prev + 1);
181
+ }
182
+ }
183
+ catch (err) {
184
+ console.error('Failed to update role:', err);
185
+ alert('Failed to update member role.');
186
+ }
187
+ };
188
+ const removeMember = async (memberId) => {
189
+ if (!confirm('Remove this member from the group?'))
190
+ return;
191
+ try {
192
+ await groupMembersTable.delete(memberId);
193
+ setRefreshKey(prev => prev + 1);
194
+ }
195
+ catch (err) {
196
+ console.error('Failed to remove member:', err);
197
+ alert('Failed to remove member.');
198
+ }
199
+ };
200
+ if (!membersData || !userPermissions || !founderData) {
201
+ return react_1.default.createElement(loading_indicator_1.LoadingIndicator, null);
202
+ }
203
+ const { canEdit, userRole, currentUserId } = userPermissions;
204
+ return (react_1.default.createElement("div", null,
205
+ react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-center mb-3" },
206
+ react_1.default.createElement("h6", { className: "mb-0" }, "Group Members"),
207
+ react_1.default.createElement("div", { className: "d-flex align-items-center gap-2" },
208
+ react_1.default.createElement("div", { className: `alert alert-${userRole ? 'primary' : 'warning'} py-2 px-3 mb-0 d-flex align-items-center` },
209
+ react_1.default.createElement("i", { className: `bi ${userRole ? 'bi-person-badge' : 'bi-exclamation-triangle'} me-2` }),
210
+ react_1.default.createElement("strong", null,
211
+ "Your role: ",
212
+ (0, peers_sdk_1.getRoleLabel)(userRole))),
213
+ founderData && founderData.founderUserId !== currentUserId && (react_1.default.createElement("a", { href: `#contacts/${founderData.founderUserId}`, className: "alert alert-warning py-2 px-3 mb-0 d-flex align-items-center text-decoration-none", style: { cursor: 'pointer' } },
214
+ react_1.default.createElement("i", { className: "bi bi-crown-fill me-2" }),
215
+ react_1.default.createElement("strong", null,
216
+ "Founder: ",
217
+ founderData.founderUser?.name || founderData.founderUserId))))),
218
+ canEdit && (react_1.default.createElement("div", { className: "card mb-3" },
219
+ react_1.default.createElement("div", { className: "card-body" },
220
+ react_1.default.createElement("h6", { className: "card-title" }, "Add Member"),
221
+ react_1.default.createElement("div", { className: "row g-2" },
222
+ react_1.default.createElement("div", { className: "col-md-6" },
223
+ react_1.default.createElement(typeahead_1.Typeahead, { placeholder: "Search contacts to add...", searchFn: searchContacts, onSelectionChange: (items) => setSelectedContacts(items), renderItem: renderContactItem, renderBadge: renderContactBadge, selectedItems: selectedContacts.map(contact => ({ ...contact, id: contact.userId })), multiSelect: true, disabled: addingMember })),
224
+ react_1.default.createElement("div", { className: "col-md-3" },
225
+ react_1.default.createElement("select", { className: "form-select", value: newMemberRole, onChange: (e) => setNewMemberRole(Number(e.target.value) || 0), disabled: addingMember },
226
+ react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.None }, "None"),
227
+ react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Reader }, "Reader"),
228
+ react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Writer }, "Writer"),
229
+ react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Admin }, "Admin"),
230
+ react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Owner }, "Owner"))),
231
+ react_1.default.createElement("div", { className: "col-md-3" },
232
+ react_1.default.createElement("button", { className: "btn btn-primary w-100", onClick: addMember, disabled: addingMember || selectedContacts.length === 0 }, addingMember ? 'Adding...' :
233
+ selectedContacts.length === 1 ? 'Add Member' :
234
+ selectedContacts.length > 1 ? `Add ${selectedContacts.length} Members` : 'Add')))))),
235
+ !canEdit && userRole && (react_1.default.createElement("div", { className: "alert alert-info" },
236
+ react_1.default.createElement("i", { className: "bi bi-info-circle me-2" }),
237
+ "You can view group members, but only admins and owners can manage membership.")),
238
+ membersData.length === 0 ? (react_1.default.createElement("div", { className: "alert alert-info" }, "No members in this group yet. Add the first member above.")) : (react_1.default.createElement("div", { className: "list-group" }, membersData.map(({ member, user }) => (react_1.default.createElement("div", { key: member.groupMemberId, className: "list-group-item" },
239
+ react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-center" },
240
+ react_1.default.createElement("div", { className: "flex-grow-1" },
241
+ react_1.default.createElement("div", { className: "d-flex align-items-center" },
242
+ react_1.default.createElement("i", { className: "bi bi-person-fill me-2" }),
243
+ react_1.default.createElement("div", null,
244
+ react_1.default.createElement("div", { className: "d-flex align-items-center" },
245
+ react_1.default.createElement("strong", null,
246
+ user?.name || member.userId,
247
+ member.userId === currentUserId && ' (You)'),
248
+ user?.source === 'userDataContext' && (react_1.default.createElement("span", { className: "badge bg-info ms-2", style: { fontSize: '0.7rem' } },
249
+ react_1.default.createElement("i", { className: "bi bi-person me-1" }),
250
+ "Personal")),
251
+ user?.source === 'otherDataContexts' && (react_1.default.createElement("span", { className: "badge bg-secondary ms-2", style: { fontSize: '0.7rem' } },
252
+ react_1.default.createElement("i", { className: "bi bi-people me-1" }),
253
+ "Other Groups"))),
254
+ user && user.userId !== user.name && (react_1.default.createElement("small", { className: "text-muted d-block" }, member.userId))))),
255
+ react_1.default.createElement("div", { className: "d-flex align-items-center" },
256
+ react_1.default.createElement(TrustLevelBadge, { level: user?.trustLevel || peers_sdk_1.TrustLevel.Unknown }),
257
+ react_1.default.createElement("a", { href: `#contacts/${member.userId}`, className: "btn btn-outline-primary btn-sm me-2" },
258
+ react_1.default.createElement("i", { className: "bi-eye me-1" }),
259
+ "View"),
260
+ canEdit ? (react_1.default.createElement(react_1.default.Fragment, null,
261
+ react_1.default.createElement("select", { className: "form-select form-select-sm me-2", style: { width: '120px' }, value: member.role, onChange: (e) => updateRole(member.groupMemberId, Number(e.target.value) || 0) },
262
+ react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.None }, "None"),
263
+ react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Reader }, "Reader"),
264
+ react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Writer }, "Writer"),
265
+ react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Admin }, "Admin"),
266
+ react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Owner }, "Owner")),
267
+ react_1.default.createElement("button", { className: "btn btn-outline-danger btn-sm", onClick: () => removeMember(member.groupMemberId), title: "Remove member" },
268
+ react_1.default.createElement("i", { className: "bi bi-trash" })))) : (
269
+ /* Read-only role display for non-admins */
270
+ react_1.default.createElement("span", { className: "badge bg-secondary text-capitalize" }, (0, peers_sdk_1.getRoleLabel)(member.role)))))))))),
271
+ react_1.default.createElement("div", { className: "mt-4" },
272
+ react_1.default.createElement("small", { className: "text-muted" },
273
+ react_1.default.createElement("strong", null, "Roles:"),
274
+ react_1.default.createElement("br", null),
275
+ react_1.default.createElement("strong", null, "Reader:"),
276
+ " Can view group content",
277
+ react_1.default.createElement("br", null),
278
+ react_1.default.createElement("strong", null, "Writer:"),
279
+ " Can create and edit content",
280
+ react_1.default.createElement("br", null),
281
+ react_1.default.createElement("strong", null, "Admin:"),
282
+ " Can manage members and settings",
283
+ react_1.default.createElement("br", null),
284
+ react_1.default.createElement("strong", null, "Owner:"),
285
+ " Full control including group deletion"))));
286
+ };
287
+ exports.GroupMembersUI = GroupMembersUI;
288
+ const TrustLevelBadge = ({ level }) => {
289
+ // Define trust level configurations with their numeric values
290
+ const trustLevelConfigs = [
291
+ { value: peers_sdk_1.TrustLevel.Self, color: 'success', icon: 'bi-shield-fill-check', text: 'Self' },
292
+ { value: peers_sdk_1.TrustLevel.Trusted, color: 'success', icon: 'bi-shield-check', text: 'Trusted' },
293
+ { value: peers_sdk_1.TrustLevel.Known, color: 'info', icon: 'bi-shield-check', text: 'Known' },
294
+ { value: peers_sdk_1.TrustLevel.NewDevice, color: 'primary', icon: 'bi-shield-plus', text: 'New Device' },
295
+ { value: peers_sdk_1.TrustLevel.NewUser, color: 'primary', icon: 'bi-shield-plus', text: 'New User' },
296
+ { value: peers_sdk_1.TrustLevel.Unknown, color: 'warning', icon: 'bi-shield-exclamation', text: 'Unknown' },
297
+ { value: peers_sdk_1.TrustLevel.Untrusted, color: 'danger', icon: 'bi-shield-x', text: 'Untrusted' },
298
+ { value: peers_sdk_1.TrustLevel.Malicious, color: 'danger', icon: 'bi-shield-x', text: 'Malicious' }
299
+ ];
300
+ // Sort by trust level value (ascending, so lowest first)
301
+ const sortedConfigs = trustLevelConfigs.sort((a, b) => a.value - b.value);
302
+ // Find the highest trust level that is at or below the current level
303
+ let config = { color: 'secondary', icon: 'bi-shield', text: 'Unknown' };
304
+ for (const trustConfig of sortedConfigs) {
305
+ if (level >= trustConfig.value) {
306
+ config = trustConfig;
307
+ }
308
+ else {
309
+ break;
310
+ }
311
+ }
312
+ return (react_1.default.createElement("span", { className: `badge bg-${config.color} d-flex align-items-center gap-1 me-2`, style: { fontSize: '0.7rem' } },
313
+ react_1.default.createElement("i", { className: config.icon }),
314
+ config.text));
315
+ };
@@ -0,0 +1,6 @@
1
+ import './group-list';
2
+ import './group-details';
3
+ import './group-members';
4
+ export * from "./group-list";
5
+ export * from "./group-details";
6
+ export * from "./group-members";
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ // Import all group screen components to ensure they register their routes
18
+ require("./group-list");
19
+ require("./group-details");
20
+ require("./group-members");
21
+ __exportStar(require("./group-list"), exports);
22
+ __exportStar(require("./group-details"), exports);
23
+ __exportStar(require("./group-members"), exports);
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ interface IProps {
3
+ knowledgeFrameId: string;
4
+ }
5
+ export declare const KnowledgeFrameDetails: (props: IProps) => React.JSX.Element;
6
+ export {};
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.KnowledgeFrameDetails = void 0;
7
+ const peers_sdk_1 = require("@peers-app/peers-sdk");
8
+ const react_1 = __importDefault(require("react"));
9
+ const peers_sdk_2 = require("@peers-app/peers-sdk");
10
+ const save_button_1 = require("../../components/save-button");
11
+ const text_list_editor_1 = require("../../components/text-list-editor.tsx/text-list-editor");
12
+ const loading_indicator_1 = require("../../components/loading-indicator");
13
+ const hooks_1 = require("../../hooks");
14
+ const input_1 = require("../../components/input");
15
+ const KnowledgeFrameDetails = (props) => {
16
+ const frame = (0, hooks_1.usePromise)(async () => {
17
+ const frame = await (0, peers_sdk_2.KnowledgeFrames)().get(props.knowledgeFrameId);
18
+ if (!frame) {
19
+ throw new Error('Knowledge Frame not found');
20
+ }
21
+ return (0, peers_sdk_2.KnowledgeFrames)().initDoc(frame);
22
+ }, undefined, [props.knowledgeFrameId]);
23
+ const bodyObs = frame?.qs.body || (0, peers_sdk_1.observable)('');
24
+ // useEffect
25
+ let p = setTimeout(() => { }, 0);
26
+ (0, hooks_1.useSubscription)(bodyObs, () => {
27
+ clearTimeout(p);
28
+ p = setTimeout(() => {
29
+ // todo update frames knowledgeIds that are linked in the body
30
+ frame?.save();
31
+ }, 2000);
32
+ });
33
+ if (!frame) {
34
+ return react_1.default.createElement(loading_indicator_1.LoadingIndicator, null);
35
+ }
36
+ return (react_1.default.createElement("div", { className: "container-fluid p-3" },
37
+ react_1.default.createElement("div", { className: "d-flex" },
38
+ react_1.default.createElement("div", null,
39
+ react_1.default.createElement("h4", null,
40
+ react_1.default.createElement("i", { className: "me-2 bi bi-window-dock" }))),
41
+ react_1.default.createElement("div", { className: "flex-grow-1" },
42
+ react_1.default.createElement("h4", null,
43
+ react_1.default.createElement(input_1.Input, { key: frame.knowledgeFrameId, className: 'border border-0', style: { width: '100%', outline: 'none', backgroundColor: 'transparent' }, value: frame.qs.name }))),
44
+ react_1.default.createElement("div", null,
45
+ react_1.default.createElement(save_button_1.SaveButton, { key: frame.knowledgeFrameId, doc: frame }))),
46
+ react_1.default.createElement("br", null),
47
+ react_1.default.createElement(text_list_editor_1.TextListEditor, { value: bodyObs, maxHeight: 'calc(100vh - 130px)' })));
48
+ };
49
+ exports.KnowledgeFrameDetails = KnowledgeFrameDetails;
50
+ const KnowledgeEntriesList = (props) => {
51
+ const { frame } = props;
52
+ (0, hooks_1.useObservable)(frame.qs.knowledgeValueIds);
53
+ const knowledgeEntries = (0, hooks_1.usePromise)(async () => {
54
+ return (0, peers_sdk_2.KnowledgeValues)().list({ knowledgeValueId: frame.knowledgeValueIds });
55
+ }, [], [frame.knowledgeValueIds]);
56
+ return (react_1.default.createElement("div", null,
57
+ react_1.default.createElement(NewKnowledgeEntry, { frame: frame }),
58
+ react_1.default.createElement("div", null, knowledgeEntries?.map(entry => {
59
+ return (react_1.default.createElement("div", { key: entry.knowledgeValueId }, JSON.stringify(entry, null, 2)));
60
+ }))));
61
+ };
62
+ const NewKnowledgeEntry = (props) => {
63
+ const { defaultSubjectId, defaultPredicateId, frame } = props;
64
+ const valueStr = (0, hooks_1.useObservableState)('', true);
65
+ const addKnowledgeEntry = async (e) => {
66
+ e.preventDefault();
67
+ const value = valueStr().trim();
68
+ throw new Error('Not implemented');
69
+ // const entry = await KnowledgeValues().insert({
70
+ // knowledgeValueId: newid(),
71
+ // peerTypeId: 'string',
72
+ // value,
73
+ // // predicateId: defaultPredicateId,
74
+ // // subjectId: defaultSubjectId,
75
+ // // modified: Date.now(),
76
+ // });
77
+ // frame.knowledgeValueIds = [...frame.knowledgeValueIds, entry.knowledgeValueId];
78
+ // await frame.save();
79
+ // valueStr('');
80
+ };
81
+ return (react_1.default.createElement("div", null,
82
+ react_1.default.createElement("form", { onSubmit: addKnowledgeEntry },
83
+ react_1.default.createElement(input_1.Input, { value: valueStr, className: "form-control sm", type: "text", placeholder: "Add Entry" }))));
84
+ };
@@ -0,0 +1,8 @@
1
+ import { IKnowledgeValue } from "@peers-app/peers-sdk";
2
+ import React from "react";
3
+ interface IProps {
4
+ knowledgeFrameId: string;
5
+ }
6
+ export declare const KnowledgeFrameDetails: (props: IProps) => React.JSX.Element;
7
+ export declare function searchKnowledgeValues(searchText: string): Promise<IKnowledgeValue[]>;
8
+ export {};
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.KnowledgeFrameDetails = void 0;
37
+ exports.searchKnowledgeValues = searchKnowledgeValues;
38
+ const peers_sdk_1 = require("@peers-app/peers-sdk");
39
+ const lodash_1 = require("lodash");
40
+ const react_1 = __importStar(require("react"));
41
+ const input_1 = require("../../components/input");
42
+ const loading_indicator_1 = require("../../components/loading-indicator");
43
+ const save_button_1 = require("../../components/save-button");
44
+ const typeahead_1 = require("../../components/typeahead/typeahead");
45
+ const hooks_1 = require("../../hooks");
46
+ const mention_configs_1 = require("../../mention-configs");
47
+ const tabs_state_1 = require("../../tabs-layout/tabs-state");
48
+ const KnowledgeFrameDetails = (props) => {
49
+ const frame = (0, hooks_1.usePromise)(async () => {
50
+ const frame = await (0, peers_sdk_1.KnowledgeFrames)().get(props.knowledgeFrameId);
51
+ if (!frame) {
52
+ throw new Error('Knowledge Frame not found');
53
+ }
54
+ const doc = (0, peers_sdk_1.KnowledgeFrames)().initDoc(frame);
55
+ (0, tabs_state_1.updateActiveTabTitle)(doc.name || "Knowledge Frame");
56
+ return doc;
57
+ }, undefined, [props.knowledgeFrameId]);
58
+ const typeaheadText = (0, hooks_1.useObservableState)('', true);
59
+ if (!frame) {
60
+ return react_1.default.createElement(loading_indicator_1.LoadingIndicator, null);
61
+ }
62
+ function createKnowledgeValue() {
63
+ console.log('submit', { textValue: typeaheadText() });
64
+ }
65
+ return (react_1.default.createElement("div", { className: "container-fluid p-3" },
66
+ react_1.default.createElement("div", { className: "d-flex" },
67
+ react_1.default.createElement("div", null,
68
+ react_1.default.createElement("h4", null,
69
+ react_1.default.createElement("i", { className: "me-2 bi bi-window-dock" }))),
70
+ react_1.default.createElement("div", { className: "flex-grow-1" },
71
+ react_1.default.createElement("h4", null,
72
+ react_1.default.createElement(input_1.Input, { key: frame.knowledgeFrameId, className: 'border border-0', style: { width: '100%', outline: 'none', backgroundColor: 'transparent' }, value: frame.qs.name }))),
73
+ react_1.default.createElement("div", null,
74
+ react_1.default.createElement(save_button_1.SaveButton, { key: frame.knowledgeFrameId, doc: frame }))),
75
+ react_1.default.createElement("br", null),
76
+ react_1.default.createElement(typeahead_1.Typeahead, { value: (0, peers_sdk_1.observable)(''), textValue: typeaheadText, mentionConfigs: mention_configs_1.mentionConfigs,
77
+ // placeholder={`Search for knowledge to add or create new`}
78
+ autoFocus: true, onSubmit: createKnowledgeValue }),
79
+ react_1.default.createElement(KnowledgeSearchValuesList, { searchText: typeaheadText }),
80
+ react_1.default.createElement(KnowledgeFrameValuesList, { frame: frame })));
81
+ };
82
+ exports.KnowledgeFrameDetails = KnowledgeFrameDetails;
83
+ let p = undefined;
84
+ const KnowledgeSearchValuesList = (props) => {
85
+ const { searchText } = props;
86
+ (0, hooks_1.useObservable)(searchText);
87
+ const [searchResults, setSearchResults] = (0, react_1.useState)(undefined);
88
+ (0, hooks_1.useSubscription)(searchText, async (text) => {
89
+ clearTimeout(p);
90
+ setSearchResults(undefined);
91
+ if (!searchText()) {
92
+ return;
93
+ }
94
+ p = setTimeout(async () => {
95
+ p = undefined;
96
+ const values = await searchKnowledgeValues(searchText());
97
+ if (p)
98
+ return;
99
+ setSearchResults(values);
100
+ }, 1000);
101
+ }, true);
102
+ if (!searchText()) {
103
+ return null;
104
+ }
105
+ if (searchResults === undefined) {
106
+ return (react_1.default.createElement("div", { className: "d-flex justify-content-center m-3" },
107
+ react_1.default.createElement("div", { className: "spinner-grow", role: "status", style: { width: '1.2rem', height: '1.2rem', } },
108
+ react_1.default.createElement("span", { className: "visually-hidden" }, "Loading..."))));
109
+ }
110
+ if (searchResults.length === 0) {
111
+ return (react_1.default.createElement("div", { className: "d-flex justify-content-center mt-3", style: { minHeight: '35px' } },
112
+ react_1.default.createElement("div", null, "No results found")));
113
+ }
114
+ return (react_1.default.createElement("div", { style: { minHeight: '51px' } }, searchResults.map(item => react_1.default.createElement(peers_sdk_1.PeersUI, { key: item.knowledgeValueId, uiEditMode: "view", uiCategory: "list-item", props: { knowledgeValue: item } }))));
115
+ };
116
+ const KnowledgeFrameValuesList = (props) => {
117
+ const { frame } = props;
118
+ return (react_1.default.createElement("div", null, "show values included in frame"));
119
+ };
120
+ async function searchKnowledgeValues(searchText) {
121
+ const mentions = (0, peers_sdk_1.getAllMentions)(searchText);
122
+ const typeMentions = mentions.filter(m => m.kind === "type");
123
+ const otherMentions = mentions.filter(m => m.kind !== "type");
124
+ const filter = {};
125
+ if (typeMentions.length) {
126
+ filter.peerTypeId = typeMentions.map(m => m.id);
127
+ for (const typeMention of typeMentions) {
128
+ searchText = searchText.replace((0, peers_sdk_1.formatMention)(typeMention), '');
129
+ }
130
+ }
131
+ if (otherMentions.length) {
132
+ for (const mention of mentions) {
133
+ searchText = searchText.replace((0, peers_sdk_1.formatMention)(mention), mention.id);
134
+ }
135
+ }
136
+ searchText = searchText.trim();
137
+ let matches = await (0, peers_sdk_1.KnowledgeValues)().list(filter, { pageSize: 100, textSearch: searchText });
138
+ if (searchText) {
139
+ const words = searchText.toLowerCase().split(' ');
140
+ matches = (0, lodash_1.sortBy)(matches, r => words.filter(w => r.name.toLowerCase().includes(w)).length).reverse();
141
+ }
142
+ return matches;
143
+ }
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const KnowledgeFrameList: () => React.JSX.Element;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.KnowledgeFrameList = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const peers_sdk_1 = require("@peers-app/peers-sdk");
9
+ const list_screen_1 = require("../../components/list-screen");
10
+ const globals_1 = require("../../globals");
11
+ const KnowledgeFrameList = () => {
12
+ const screenPathPart = 'knowledge-frames';
13
+ const icon = 'bi bi-window-dock';
14
+ return (0, list_screen_1.ListScreen)({
15
+ table: (0, peers_sdk_1.KnowledgeFrames)(),
16
+ sortBy: ['-modified'],
17
+ placeholderName: 'frame',
18
+ getFilter: (text) => {
19
+ return {
20
+ $or: [
21
+ { name: { $matchWords: text } },
22
+ { body: { $matchWords: text } },
23
+ ]
24
+ };
25
+ },
26
+ newRecord: async (text) => {
27
+ const knowledgeFrame = await (0, peers_sdk_1.KnowledgeFrames)().insert({
28
+ knowledgeFrameId: (0, peers_sdk_1.newid)(),
29
+ name: text,
30
+ knowledgeValueIds: [],
31
+ body: '',
32
+ modified: Date.now(),
33
+ });
34
+ (0, globals_1.mainContentPath)(`${screenPathPart}/${knowledgeFrame.knowledgeFrameId}`);
35
+ return knowledgeFrame;
36
+ },
37
+ renderItem: (item) => {
38
+ return (react_1.default.createElement("div", { key: item.knowledgeFrameId, className: 'container-fluid pb-4' },
39
+ react_1.default.createElement("i", { style: { cursor: 'pointer' }, className: icon }),
40
+ "\u00A0\u00A0",
41
+ react_1.default.createElement("a", { href: `#${screenPathPart}/${item.knowledgeFrameId}` }, item.name?.trim() || 'No Name')));
42
+ },
43
+ });
44
+ };
45
+ exports.KnowledgeFrameList = KnowledgeFrameList;
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ interface IProps {
3
+ knowledgeValueId: string;
4
+ }
5
+ export declare const KnowledgeValueDetails: (props: IProps) => React.JSX.Element;
6
+ export {};