@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.
- package/.github/README.md +52 -0
- package/.github/workflows/publish.yml +45 -0
- package/babel.config.js +7 -0
- package/dist/app.d.ts +9 -0
- package/dist/app.js +54 -0
- package/dist/command-palette/command-palette-ui.d.ts +2 -0
- package/dist/command-palette/command-palette-ui.js +192 -0
- package/dist/command-palette/command-palette.d.ts +23 -0
- package/dist/command-palette/command-palette.js +371 -0
- package/dist/components/checkbox.d.ts +7 -0
- package/dist/components/checkbox.js +20 -0
- package/dist/components/group-switcher.d.ts +6 -0
- package/dist/components/group-switcher.js +301 -0
- package/dist/components/input-date.d.ts +7 -0
- package/dist/components/input-date.js +19 -0
- package/dist/components/input-datetime.d.ts +7 -0
- package/dist/components/input-datetime.js +35 -0
- package/dist/components/input-number.d.ts +9 -0
- package/dist/components/input-number.js +87 -0
- package/dist/components/input.d.ts +7 -0
- package/dist/components/input.js +20 -0
- package/dist/components/io-schema-values.d.ts +15 -0
- package/dist/components/io-schema-values.js +105 -0
- package/dist/components/io-schema.d.ts +13 -0
- package/dist/components/io-schema.js +163 -0
- package/dist/components/lazy-list.d.ts +13 -0
- package/dist/components/lazy-list.js +91 -0
- package/dist/components/lazy-sortable-list.d.ts +29 -0
- package/dist/components/lazy-sortable-list.js +12 -0
- package/dist/components/left-bar.d.ts +3 -0
- package/dist/components/left-bar.js +130 -0
- package/dist/components/list-screen.d.ts +16 -0
- package/dist/components/list-screen.js +100 -0
- package/dist/components/loading-indicator.d.ts +2 -0
- package/dist/components/loading-indicator.js +12 -0
- package/dist/components/main-content-container.d.ts +2 -0
- package/dist/components/main-content-container.js +90 -0
- package/dist/components/markdown-editor/autolink-plugin.d.ts +2 -0
- package/dist/components/markdown-editor/autolink-plugin.js +29 -0
- package/dist/components/markdown-editor/editor-inline.d.ts +3 -0
- package/dist/components/markdown-editor/editor-inline.js +13 -0
- package/dist/components/markdown-editor/editor.d.ts +18 -0
- package/dist/components/markdown-editor/editor.js +143 -0
- package/dist/components/markdown-editor/markdown-plugin.d.ts +9 -0
- package/dist/components/markdown-editor/markdown-plugin.js +194 -0
- package/dist/components/markdown-editor/mention-node.d.ts +21 -0
- package/dist/components/markdown-editor/mention-node.js +160 -0
- package/dist/components/markdown-editor/mentions-plugin.d.ts +7 -0
- package/dist/components/markdown-editor/mentions-plugin.js +268 -0
- package/dist/components/markdown-editor/theme.d.ts +46 -0
- package/dist/components/markdown-editor/theme.js +48 -0
- package/dist/components/markdown-editor/toolbar.d.ts +10 -0
- package/dist/components/markdown-editor/toolbar.js +112 -0
- package/dist/components/markdown-with-mentions.d.ts +4 -0
- package/dist/components/markdown-with-mentions.js +140 -0
- package/dist/components/message-logs/message-logs.d.ts +6 -0
- package/dist/components/message-logs/message-logs.js +307 -0
- package/dist/components/messages/avatar.d.ts +10 -0
- package/dist/components/messages/avatar.js +65 -0
- package/dist/components/messages/channel-message-list.d.ts +14 -0
- package/dist/components/messages/channel-message-list.js +158 -0
- package/dist/components/messages/channel-view.d.ts +6 -0
- package/dist/components/messages/channel-view.js +82 -0
- package/dist/components/messages/message-compose.d.ts +11 -0
- package/dist/components/messages/message-compose.js +152 -0
- package/dist/components/messages/message-display.d.ts +10 -0
- package/dist/components/messages/message-display.js +152 -0
- package/dist/components/messages/thread-message-list.d.ts +11 -0
- package/dist/components/messages/thread-message-list.js +122 -0
- package/dist/components/messages/thread-view.d.ts +6 -0
- package/dist/components/messages/thread-view.js +174 -0
- package/dist/components/off-canvas.d.ts +13 -0
- package/dist/components/off-canvas.js +89 -0
- package/dist/components/router.d.ts +6 -0
- package/dist/components/router.js +240 -0
- package/dist/components/save-button.d.ts +13 -0
- package/dist/components/save-button.js +75 -0
- package/dist/components/sortable-list.d.ts +36 -0
- package/dist/components/sortable-list.js +77 -0
- package/dist/components/tabs.d.ts +11 -0
- package/dist/components/tabs.js +69 -0
- package/dist/components/text-list-editor.tsx/text-list-editor.d.ts +6 -0
- package/dist/components/text-list-editor.tsx/text-list-editor.js +13 -0
- package/dist/components/tooltip.d.ts +11 -0
- package/dist/components/tooltip.js +20 -0
- package/dist/components/top-bar.d.ts +2 -0
- package/dist/components/top-bar.js +51 -0
- package/dist/components/typeahead/mentions-plugin.d.ts +7 -0
- package/dist/components/typeahead/mentions-plugin.js +203 -0
- package/dist/components/typeahead/typeahead-editor.d.ts +15 -0
- package/dist/components/typeahead/typeahead-editor.js +134 -0
- package/dist/components/typeahead/typeahead.d.ts +12 -0
- package/dist/components/typeahead/typeahead.js +94 -0
- package/dist/components/typeahead.d.ts +22 -0
- package/dist/components/typeahead.js +270 -0
- package/dist/globals.d.ts +29 -0
- package/dist/globals.js +148 -0
- package/dist/hooks.d.ts +34 -0
- package/dist/hooks.js +137 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +20 -0
- package/dist/layout-vars.d.ts +6 -0
- package/dist/layout-vars.js +10 -0
- package/dist/mention-configs.d.ts +18 -0
- package/dist/mention-configs.js +149 -0
- package/dist/screens/assistants/assistant-config.d.ts +5 -0
- package/dist/screens/assistants/assistant-config.js +52 -0
- package/dist/screens/assistants/assistant-details.d.ts +4 -0
- package/dist/screens/assistants/assistant-details.js +85 -0
- package/dist/screens/assistants/assistant-info.d.ts +6 -0
- package/dist/screens/assistants/assistant-info.js +28 -0
- package/dist/screens/assistants/assistant-list.d.ts +2 -0
- package/dist/screens/assistants/assistant-list.js +114 -0
- package/dist/screens/assistants/assistant-tools.d.ts +5 -0
- package/dist/screens/assistants/assistant-tools.js +38 -0
- package/dist/screens/contacts/contact-details.d.ts +6 -0
- package/dist/screens/contacts/contact-details.js +100 -0
- package/dist/screens/contacts/contact-list.d.ts +2 -0
- package/dist/screens/contacts/contact-list.js +213 -0
- package/dist/screens/contacts/index.d.ts +4 -0
- package/dist/screens/contacts/index.js +21 -0
- package/dist/screens/events/cron.d.ts +3 -0
- package/dist/screens/events/cron.js +77 -0
- package/dist/screens/events/event-details.d.ts +6 -0
- package/dist/screens/events/event-details.js +112 -0
- package/dist/screens/events/event-handlers.d.ts +7 -0
- package/dist/screens/events/event-handlers.js +84 -0
- package/dist/screens/events/event-info.d.ts +5 -0
- package/dist/screens/events/event-info.js +19 -0
- package/dist/screens/events/event-list.d.ts +2 -0
- package/dist/screens/events/event-list.js +107 -0
- package/dist/screens/events/event-schedule.d.ts +5 -0
- package/dist/screens/events/event-schedule.js +124 -0
- package/dist/screens/groups/group-details.d.ts +6 -0
- package/dist/screens/groups/group-details.js +218 -0
- package/dist/screens/groups/group-list.d.ts +2 -0
- package/dist/screens/groups/group-list.js +275 -0
- package/dist/screens/groups/group-members.d.ts +8 -0
- package/dist/screens/groups/group-members.js +315 -0
- package/dist/screens/groups/index.d.ts +6 -0
- package/dist/screens/groups/index.js +23 -0
- package/dist/screens/knowledge/knowledge-frame-details.bk.d.ts +6 -0
- package/dist/screens/knowledge/knowledge-frame-details.bk.js +84 -0
- package/dist/screens/knowledge/knowledge-frame-details.d.ts +8 -0
- package/dist/screens/knowledge/knowledge-frame-details.js +143 -0
- package/dist/screens/knowledge/knowledge-frame-list.d.ts +2 -0
- package/dist/screens/knowledge/knowledge-frame-list.js +45 -0
- package/dist/screens/knowledge/knowledge-value-details.d.ts +6 -0
- package/dist/screens/knowledge/knowledge-value-details.js +150 -0
- package/dist/screens/knowledge/knowledge-value-list-item.d.ts +5 -0
- package/dist/screens/knowledge/knowledge-value-list-item.js +39 -0
- package/dist/screens/knowledge/knowledge-value-list.d.ts +3 -0
- package/dist/screens/knowledge/knowledge-value-list.js +123 -0
- package/dist/screens/packages/package-details.d.ts +6 -0
- package/dist/screens/packages/package-details.js +82 -0
- package/dist/screens/packages/package-info.d.ts +5 -0
- package/dist/screens/packages/package-info.js +42 -0
- package/dist/screens/packages/package-list.d.ts +2 -0
- package/dist/screens/packages/package-list.js +182 -0
- package/dist/screens/packages/package-new-local.d.ts +2 -0
- package/dist/screens/packages/package-new-local.js +82 -0
- package/dist/screens/peer-types/peer-type-details.d.ts +10 -0
- package/dist/screens/peer-types/peer-type-details.js +126 -0
- package/dist/screens/peer-types/peer-type-list.d.ts +2 -0
- package/dist/screens/peer-types/peer-type-list.js +57 -0
- package/dist/screens/predicates/predicate-details.d.ts +6 -0
- package/dist/screens/predicates/predicate-details.js +103 -0
- package/dist/screens/predicates/predicate-list.d.ts +2 -0
- package/dist/screens/predicates/predicate-list.js +46 -0
- package/dist/screens/profile.d.ts +2 -0
- package/dist/screens/profile.js +66 -0
- package/dist/screens/search/global-search.d.ts +2 -0
- package/dist/screens/search/global-search.js +186 -0
- package/dist/screens/settings/color-mode-dropdown.d.ts +6 -0
- package/dist/screens/settings/color-mode-dropdown.js +63 -0
- package/dist/screens/settings/settings-page.d.ts +2 -0
- package/dist/screens/settings/settings-page.js +49 -0
- package/dist/screens/setup-user.d.ts +2 -0
- package/dist/screens/setup-user.js +270 -0
- package/dist/screens/tools/tool-code.d.ts +5 -0
- package/dist/screens/tools/tool-code.js +32 -0
- package/dist/screens/tools/tool-details.d.ts +6 -0
- package/dist/screens/tools/tool-details.js +68 -0
- package/dist/screens/tools/tool-info.d.ts +5 -0
- package/dist/screens/tools/tool-info.js +74 -0
- package/dist/screens/tools/tool-list.d.ts +2 -0
- package/dist/screens/tools/tool-list.js +123 -0
- package/dist/screens/tools/tool-schema.d.ts +5 -0
- package/dist/screens/tools/tool-schema.js +30 -0
- package/dist/screens/tools/tool-test-details.d.ts +4 -0
- package/dist/screens/tools/tool-test-details.js +54 -0
- package/dist/screens/tools/tool-test-list.d.ts +4 -0
- package/dist/screens/tools/tool-test-list.js +82 -0
- package/dist/screens/variables/variable-details.d.ts +6 -0
- package/dist/screens/variables/variable-details.js +140 -0
- package/dist/screens/variables/variable-list.d.ts +2 -0
- package/dist/screens/variables/variable-list.js +58 -0
- package/dist/screens/workflows/workflow-details.d.ts +6 -0
- package/dist/screens/workflows/workflow-details.js +122 -0
- package/dist/screens/workflows/workflow-info.d.ts +5 -0
- package/dist/screens/workflows/workflow-info.js +18 -0
- package/dist/screens/workflows/workflow-instructions.d.ts +5 -0
- package/dist/screens/workflows/workflow-instructions.js +118 -0
- package/dist/screens/workflows/workflow-list.d.ts +2 -0
- package/dist/screens/workflows/workflow-list.js +109 -0
- package/dist/screens/workflows/workflow-subscriptions.d.ts +6 -0
- package/dist/screens/workflows/workflow-subscriptions.js +81 -0
- package/dist/setupTests.d.ts +1 -0
- package/dist/setupTests.js +31 -0
- package/dist/system-apps/assistants.app.d.ts +2 -0
- package/dist/system-apps/assistants.app.js +8 -0
- package/dist/system-apps/contacts.app.d.ts +2 -0
- package/dist/system-apps/contacts.app.js +9 -0
- package/dist/system-apps/events.app.d.ts +2 -0
- package/dist/system-apps/events.app.js +8 -0
- package/dist/system-apps/groups.app.d.ts +2 -0
- package/dist/system-apps/groups.app.js +9 -0
- package/dist/system-apps/index.d.ts +19 -0
- package/dist/system-apps/index.js +90 -0
- package/dist/system-apps/knowledge-frames.app.d.ts +2 -0
- package/dist/system-apps/knowledge-frames.app.js +9 -0
- package/dist/system-apps/knowledge-values.app.d.ts +2 -0
- package/dist/system-apps/knowledge-values.app.js +9 -0
- package/dist/system-apps/packages.app.d.ts +2 -0
- package/dist/system-apps/packages.app.js +8 -0
- package/dist/system-apps/predicates.app.d.ts +2 -0
- package/dist/system-apps/predicates.app.js +8 -0
- package/dist/system-apps/profile.app.d.ts +2 -0
- package/dist/system-apps/profile.app.js +8 -0
- package/dist/system-apps/search.app.d.ts +2 -0
- package/dist/system-apps/search.app.js +9 -0
- package/dist/system-apps/settings.app.d.ts +2 -0
- package/dist/system-apps/settings.app.js +8 -0
- package/dist/system-apps/threads.app.d.ts +2 -0
- package/dist/system-apps/threads.app.js +8 -0
- package/dist/system-apps/tools.app.d.ts +2 -0
- package/dist/system-apps/tools.app.js +8 -0
- package/dist/system-apps/types.app.d.ts +2 -0
- package/dist/system-apps/types.app.js +8 -0
- package/dist/system-apps/variables.app.d.ts +2 -0
- package/dist/system-apps/variables.app.js +8 -0
- package/dist/system-apps/workflows.app.d.ts +2 -0
- package/dist/system-apps/workflows.app.js +8 -0
- package/dist/tabs-layout/tabs-layout.d.ts +5 -0
- package/dist/tabs-layout/tabs-layout.js +374 -0
- package/dist/tabs-layout/tabs-state.d.ts +26 -0
- package/dist/tabs-layout/tabs-state.js +239 -0
- package/dist/three-bar-layout/left-bar-content.d.ts +7 -0
- package/dist/three-bar-layout/left-bar-content.js +151 -0
- package/dist/three-bar-layout/right-bar-content.d.ts +2 -0
- package/dist/three-bar-layout/right-bar-content.js +64 -0
- package/dist/three-bar-layout/three-bar-layout.d.ts +5 -0
- package/dist/three-bar-layout/three-bar-layout.js +218 -0
- package/dist/ui-defaults/index.d.ts +2 -0
- package/dist/ui-defaults/index.js +4 -0
- package/dist/ui-defaults/list-screen.d.ts +6 -0
- package/dist/ui-defaults/list-screen.js +74 -0
- package/dist/ui-defaults/notes-editor.d.ts +7 -0
- package/dist/ui-defaults/notes-editor.js +41 -0
- package/dist/ui-router/routes-loader.d.ts +25 -0
- package/dist/ui-router/routes-loader.js +97 -0
- package/dist/ui-router/ui-loader.d.ts +18 -0
- package/dist/ui-router/ui-loader.js +481 -0
- package/dist/utils.d.ts +9 -0
- package/dist/utils.js +250 -0
- package/docs/conversation-tab.md +201 -0
- package/docs/getting-started.md +284 -0
- package/docs/knowledge.md +187 -0
- package/docs/tabs-ui.md +696 -0
- package/docs/user-contacts-ui.md +384 -0
- package/jest.config.js +25 -0
- package/package.json +109 -0
- package/src/app.tsx +59 -0
- package/src/command-palette/command-palette-ui.tsx +264 -0
- package/src/command-palette/command-palette.ts +364 -0
- package/src/components/checkbox.tsx +22 -0
- package/src/components/group-switcher.tsx +469 -0
- package/src/components/input-date.tsx +28 -0
- package/src/components/input-datetime.tsx +41 -0
- package/src/components/input-number.tsx +67 -0
- package/src/components/input.tsx +22 -0
- package/src/components/io-schema-values.tsx +122 -0
- package/src/components/io-schema.tsx +234 -0
- package/src/components/lazy-list.tsx +98 -0
- package/src/components/lazy-sortable-list.tsx +51 -0
- package/src/components/left-bar.tsx +264 -0
- package/src/components/list-screen.tsx +105 -0
- package/src/components/loading-indicator.tsx +9 -0
- package/src/components/main-content-container.tsx +76 -0
- package/src/components/markdown-editor/autolink-plugin.tsx +36 -0
- package/src/components/markdown-editor/editor-inline.tsx +10 -0
- package/src/components/markdown-editor/editor.tsx +152 -0
- package/src/components/markdown-editor/markdown-plugin.tsx +224 -0
- package/src/components/markdown-editor/mention-node.ts +199 -0
- package/src/components/markdown-editor/mentions-plugin.tsx +356 -0
- package/src/components/markdown-editor/theme.ts +47 -0
- package/src/components/markdown-editor/toolbar.tsx +263 -0
- package/src/components/markdown-with-mentions.tsx +183 -0
- package/src/components/message-logs/message-logs.tsx +406 -0
- package/src/components/messages/avatar.tsx +95 -0
- package/src/components/messages/channel-message-list.tsx +177 -0
- package/src/components/messages/channel-view.tsx +74 -0
- package/src/components/messages/message-compose.tsx +162 -0
- package/src/components/messages/message-display.tsx +217 -0
- package/src/components/messages/thread-message-list.tsx +126 -0
- package/src/components/messages/thread-view.tsx +214 -0
- package/src/components/off-canvas.tsx +83 -0
- package/src/components/router.tsx +224 -0
- package/src/components/save-button.tsx +109 -0
- package/src/components/sortable-list.tsx +102 -0
- package/src/components/tabs.tsx +70 -0
- package/src/components/text-list-editor.tsx/text-list-editor.tsx +13 -0
- package/src/components/tooltip.tsx +50 -0
- package/src/components/top-bar.tsx +119 -0
- package/src/components/typeahead/mentions-plugin.tsx +265 -0
- package/src/components/typeahead/typeahead-editor.tsx +140 -0
- package/src/components/typeahead/typeahead.tsx +77 -0
- package/src/components/typeahead.tsx +359 -0
- package/src/globals.tsx +162 -0
- package/src/hooks.ts +144 -0
- package/src/index.tsx +8 -0
- package/src/layout-vars.ts +8 -0
- package/src/mention-configs.ts +166 -0
- package/src/screens/assistants/assistant-config.tsx +80 -0
- package/src/screens/assistants/assistant-details.tsx +77 -0
- package/src/screens/assistants/assistant-info.tsx +45 -0
- package/src/screens/assistants/assistant-list.tsx +115 -0
- package/src/screens/assistants/assistant-tools.tsx +61 -0
- package/src/screens/contacts/contact-details.tsx +175 -0
- package/src/screens/contacts/contact-list.tsx +251 -0
- package/src/screens/contacts/index.ts +6 -0
- package/src/screens/events/cron.ts +74 -0
- package/src/screens/events/event-details.tsx +117 -0
- package/src/screens/events/event-handlers.tsx +61 -0
- package/src/screens/events/event-info.tsx +29 -0
- package/src/screens/events/event-list.tsx +104 -0
- package/src/screens/events/event-schedule.tsx +130 -0
- package/src/screens/groups/group-details.tsx +306 -0
- package/src/screens/groups/group-list.tsx +366 -0
- package/src/screens/groups/group-members.tsx +455 -0
- package/src/screens/groups/index.ts +9 -0
- package/src/screens/knowledge/knowledge-frame-details.bk.tsx +160 -0
- package/src/screens/knowledge/knowledge-frame-details.tsx +176 -0
- package/src/screens/knowledge/knowledge-frame-list.tsx +49 -0
- package/src/screens/knowledge/knowledge-value-details.tsx +181 -0
- package/src/screens/knowledge/knowledge-value-list-item.tsx +48 -0
- package/src/screens/knowledge/knowledge-value-list.tsx +131 -0
- package/src/screens/packages/package-details.tsx +117 -0
- package/src/screens/packages/package-info.tsx +83 -0
- package/src/screens/packages/package-list.tsx +191 -0
- package/src/screens/packages/package-new-local.tsx +93 -0
- package/src/screens/peer-types/peer-type-details.tsx +162 -0
- package/src/screens/peer-types/peer-type-list.tsx +74 -0
- package/src/screens/predicates/predicate-details.tsx +125 -0
- package/src/screens/predicates/predicate-list.tsx +50 -0
- package/src/screens/profile.tsx +68 -0
- package/src/screens/search/global-search.tsx +274 -0
- package/src/screens/settings/color-mode-dropdown.tsx +57 -0
- package/src/screens/settings/settings-page.tsx +76 -0
- package/src/screens/setup-user.tsx +367 -0
- package/src/screens/tools/tool-code.tsx +35 -0
- package/src/screens/tools/tool-details.tsx +101 -0
- package/src/screens/tools/tool-info.tsx +60 -0
- package/src/screens/tools/tool-list.tsx +121 -0
- package/src/screens/tools/tool-schema.tsx +42 -0
- package/src/screens/tools/tool-test-details.tsx +100 -0
- package/src/screens/tools/tool-test-list.tsx +74 -0
- package/src/screens/variables/variable-details.tsx +183 -0
- package/src/screens/variables/variable-list.tsx +74 -0
- package/src/screens/workflows/workflow-details.tsx +130 -0
- package/src/screens/workflows/workflow-info.tsx +29 -0
- package/src/screens/workflows/workflow-instructions.tsx +127 -0
- package/src/screens/workflows/workflow-list.tsx +107 -0
- package/src/screens/workflows/workflow-subscriptions.tsx +58 -0
- package/src/setupTests.ts +32 -0
- package/src/system-apps/assistants.app.ts +7 -0
- package/src/system-apps/contacts.app.ts +8 -0
- package/src/system-apps/events.app.ts +7 -0
- package/src/system-apps/groups.app.ts +8 -0
- package/src/system-apps/index.ts +79 -0
- package/src/system-apps/knowledge-frames.app.ts +8 -0
- package/src/system-apps/knowledge-values.app.ts +8 -0
- package/src/system-apps/packages.app.ts +7 -0
- package/src/system-apps/predicates.app.ts +7 -0
- package/src/system-apps/profile.app.ts +7 -0
- package/src/system-apps/search.app.ts +8 -0
- package/src/system-apps/settings.app.ts +7 -0
- package/src/system-apps/threads.app.ts +7 -0
- package/src/system-apps/tools.app.ts +7 -0
- package/src/system-apps/types.app.ts +7 -0
- package/src/system-apps/variables.app.ts +7 -0
- package/src/system-apps/workflows.app.ts +7 -0
- package/src/tabs-layout/tabs-layout.tsx +672 -0
- package/src/tabs-layout/tabs-state.ts +269 -0
- package/src/three-bar-layout/left-bar-content.tsx +202 -0
- package/src/three-bar-layout/right-bar-content.tsx +67 -0
- package/src/three-bar-layout/three-bar-layout.tsx +297 -0
- package/src/ui-defaults/index.ts +3 -0
- package/src/ui-defaults/list-screen.tsx +92 -0
- package/src/ui-defaults/notes-editor.tsx +51 -0
- package/src/ui-router/routes-loader.ts +98 -0
- package/src/ui-router/ui-loader.tsx +497 -0
- package/src/utils.ts +266 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { DataFilter, formatMention, getAllMentions, IDoc, IKnowledgeFrame, IKnowledgeValue, KnowledgeFrames, KnowledgeValues, Observable, observable, PeersUI } from "@peers-app/peers-sdk";
|
|
2
|
+
import { sortBy } from "lodash";
|
|
3
|
+
import React, { useState } from "react";
|
|
4
|
+
import { Input } from "../../components/input";
|
|
5
|
+
import { LoadingIndicator } from "../../components/loading-indicator";
|
|
6
|
+
import { SaveButton } from "../../components/save-button";
|
|
7
|
+
import { Typeahead } from "../../components/typeahead/typeahead";
|
|
8
|
+
import { useObservable, useObservableState, usePromise, useSubscription } from "../../hooks";
|
|
9
|
+
import { mentionConfigs } from "../../mention-configs";
|
|
10
|
+
import { updateActiveTabTitle } from "../../tabs-layout/tabs-state";
|
|
11
|
+
|
|
12
|
+
interface IProps {
|
|
13
|
+
knowledgeFrameId: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const KnowledgeFrameDetails = (props: IProps) => {
|
|
17
|
+
|
|
18
|
+
const frame = usePromise(async () => {
|
|
19
|
+
const frame = await KnowledgeFrames().get(props.knowledgeFrameId);
|
|
20
|
+
if (!frame) {
|
|
21
|
+
throw new Error('Knowledge Frame not found');
|
|
22
|
+
}
|
|
23
|
+
const doc = KnowledgeFrames().initDoc(frame);
|
|
24
|
+
updateActiveTabTitle(doc.name || "Knowledge Frame");
|
|
25
|
+
return doc;
|
|
26
|
+
}, undefined, [props.knowledgeFrameId]);
|
|
27
|
+
|
|
28
|
+
const typeaheadText = useObservableState('', true);
|
|
29
|
+
|
|
30
|
+
if (!frame) {
|
|
31
|
+
return <LoadingIndicator />;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function createKnowledgeValue() {
|
|
35
|
+
console.log('submit', { textValue: typeaheadText() });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return (
|
|
39
|
+
<div className="container-fluid p-3">
|
|
40
|
+
|
|
41
|
+
<div className="d-flex">
|
|
42
|
+
<div>
|
|
43
|
+
<h4>
|
|
44
|
+
<i className="me-2 bi bi-window-dock"></i>
|
|
45
|
+
</h4>
|
|
46
|
+
</div>
|
|
47
|
+
<div className="flex-grow-1">
|
|
48
|
+
<h4>
|
|
49
|
+
<Input
|
|
50
|
+
key={frame.knowledgeFrameId}
|
|
51
|
+
className='border border-0'
|
|
52
|
+
style={{ width: '100%', outline: 'none', backgroundColor: 'transparent' }}
|
|
53
|
+
value={frame.qs.name}
|
|
54
|
+
/>
|
|
55
|
+
</h4>
|
|
56
|
+
</div>
|
|
57
|
+
<div>
|
|
58
|
+
<SaveButton
|
|
59
|
+
key={frame.knowledgeFrameId}
|
|
60
|
+
doc={frame}
|
|
61
|
+
/>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<br />
|
|
66
|
+
|
|
67
|
+
<Typeahead
|
|
68
|
+
value={observable('')}
|
|
69
|
+
textValue={typeaheadText}
|
|
70
|
+
mentionConfigs={mentionConfigs}
|
|
71
|
+
// placeholder={`Search for knowledge to add or create new`}
|
|
72
|
+
autoFocus
|
|
73
|
+
onSubmit={createKnowledgeValue}
|
|
74
|
+
/>
|
|
75
|
+
|
|
76
|
+
<KnowledgeSearchValuesList searchText={typeaheadText} />
|
|
77
|
+
|
|
78
|
+
<KnowledgeFrameValuesList frame={frame} />
|
|
79
|
+
|
|
80
|
+
</div>
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let p: ReturnType<typeof setTimeout> | undefined = undefined;
|
|
85
|
+
const KnowledgeSearchValuesList = (props: { searchText: Observable<string> }) => {
|
|
86
|
+
const { searchText } = props;
|
|
87
|
+
|
|
88
|
+
useObservable(searchText);
|
|
89
|
+
const [searchResults, setSearchResults] = useState<IKnowledgeValue[] | undefined>(undefined);
|
|
90
|
+
|
|
91
|
+
useSubscription(searchText, async (text) => {
|
|
92
|
+
clearTimeout(p);
|
|
93
|
+
setSearchResults(undefined);
|
|
94
|
+
if (!searchText()) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
p = setTimeout(async () => {
|
|
98
|
+
p = undefined;
|
|
99
|
+
const values = await searchKnowledgeValues(searchText());
|
|
100
|
+
if (p) return;
|
|
101
|
+
setSearchResults(values);
|
|
102
|
+
}, 1000);
|
|
103
|
+
}, true);
|
|
104
|
+
|
|
105
|
+
if (!searchText()) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (searchResults === undefined) {
|
|
110
|
+
return (
|
|
111
|
+
<div className="d-flex justify-content-center m-3">
|
|
112
|
+
<div className="spinner-grow" role="status"
|
|
113
|
+
style={{ width: '1.2rem', height: '1.2rem', }}
|
|
114
|
+
>
|
|
115
|
+
<span className="visually-hidden">Loading...</span>
|
|
116
|
+
</div>
|
|
117
|
+
</div>
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
if (searchResults.length === 0) {
|
|
121
|
+
return (
|
|
122
|
+
<div className="d-flex justify-content-center mt-3" style={{ minHeight: '35px' }}>
|
|
123
|
+
<div>No results found</div>
|
|
124
|
+
</div>
|
|
125
|
+
)
|
|
126
|
+
}
|
|
127
|
+
return (
|
|
128
|
+
<div style={{ minHeight: '51px' }}>
|
|
129
|
+
{searchResults.map(item =>
|
|
130
|
+
<PeersUI
|
|
131
|
+
key={item.knowledgeValueId}
|
|
132
|
+
uiEditMode="view"
|
|
133
|
+
uiCategory="list-item"
|
|
134
|
+
props={{ knowledgeValue: item }}
|
|
135
|
+
/>
|
|
136
|
+
)}
|
|
137
|
+
</div>
|
|
138
|
+
)
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const KnowledgeFrameValuesList = (props: { frame: IDoc<IKnowledgeFrame> }) => {
|
|
142
|
+
const { frame } = props;
|
|
143
|
+
return (
|
|
144
|
+
<div>
|
|
145
|
+
show values included in frame
|
|
146
|
+
</div>
|
|
147
|
+
)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export async function searchKnowledgeValues(searchText: string): Promise<IKnowledgeValue[]> {
|
|
151
|
+
const mentions = getAllMentions(searchText)
|
|
152
|
+
const typeMentions = mentions.filter(m => m.kind === "type");
|
|
153
|
+
const otherMentions = mentions.filter(m => m.kind !== "type");
|
|
154
|
+
const filter: DataFilter<IKnowledgeValue> = {};
|
|
155
|
+
if (typeMentions.length) {
|
|
156
|
+
filter.peerTypeId = typeMentions.map(m => m.id);
|
|
157
|
+
for (const typeMention of typeMentions) {
|
|
158
|
+
searchText = searchText.replace(formatMention(typeMention), '');
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (otherMentions.length) {
|
|
163
|
+
for (const mention of mentions) {
|
|
164
|
+
searchText = searchText.replace(formatMention(mention), mention.id);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
searchText = searchText.trim();
|
|
168
|
+
|
|
169
|
+
let matches = await KnowledgeValues().list(filter, { pageSize: 100, textSearch: searchText });
|
|
170
|
+
|
|
171
|
+
if (searchText) {
|
|
172
|
+
const words = searchText.toLowerCase().split(' ');
|
|
173
|
+
matches = sortBy(matches, r => words.filter(w => r.name.toLowerCase().includes(w)).length).reverse();
|
|
174
|
+
}
|
|
175
|
+
return matches;
|
|
176
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { newid, IKnowledgeFrame, KnowledgeFrames } from "@peers-app/peers-sdk";
|
|
3
|
+
import { ListScreen } from '../../components/list-screen';
|
|
4
|
+
import { mainContentPath } from '../../globals';
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export const KnowledgeFrameList = () => {
|
|
8
|
+
const screenPathPart = 'knowledge-frames';
|
|
9
|
+
const icon = 'bi bi-window-dock';
|
|
10
|
+
|
|
11
|
+
return ListScreen({
|
|
12
|
+
table: KnowledgeFrames(),
|
|
13
|
+
sortBy: ['-modified'],
|
|
14
|
+
placeholderName: 'frame',
|
|
15
|
+
getFilter: (text: string) => {
|
|
16
|
+
return {
|
|
17
|
+
$or: [
|
|
18
|
+
{ name: { $matchWords: text } },
|
|
19
|
+
{ body: { $matchWords: text } },
|
|
20
|
+
]
|
|
21
|
+
};
|
|
22
|
+
},
|
|
23
|
+
newRecord: async (text: string) => {
|
|
24
|
+
const knowledgeFrame = await KnowledgeFrames().insert({
|
|
25
|
+
knowledgeFrameId: newid(),
|
|
26
|
+
name: text,
|
|
27
|
+
knowledgeValueIds: [],
|
|
28
|
+
body: '',
|
|
29
|
+
modified: Date.now(),
|
|
30
|
+
});
|
|
31
|
+
mainContentPath(`${screenPathPart}/${knowledgeFrame.knowledgeFrameId}`);
|
|
32
|
+
return knowledgeFrame;
|
|
33
|
+
},
|
|
34
|
+
renderItem: (item: IKnowledgeFrame) => {
|
|
35
|
+
return (
|
|
36
|
+
<div
|
|
37
|
+
key={item.knowledgeFrameId}
|
|
38
|
+
className='container-fluid pb-4'
|
|
39
|
+
>
|
|
40
|
+
<i style={{ cursor: 'pointer' }} className={icon}></i>
|
|
41
|
+
|
|
42
|
+
<a href={`#${screenPathPart}/${item.knowledgeFrameId}`}>
|
|
43
|
+
{item.name?.trim() || 'No Name'}
|
|
44
|
+
</a>
|
|
45
|
+
</div>
|
|
46
|
+
)
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
};
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { IDoc, IKnowledgeValue, KnowledgeValues, newid, PeersUI, PeerTypes } from "@peers-app/peers-sdk";
|
|
2
|
+
import React, { useEffect, useState } from "react";
|
|
3
|
+
import { Input } from "../../components/input";
|
|
4
|
+
import { IOSchemaValues } from "../../components/io-schema-values";
|
|
5
|
+
import { LoadingIndicator } from "../../components/loading-indicator";
|
|
6
|
+
import { SaveButton } from "../../components/save-button";
|
|
7
|
+
import { Tooltip } from "../../components/tooltip";
|
|
8
|
+
import { Typeahead } from "../../components/typeahead/typeahead";
|
|
9
|
+
import { useObservable, usePromise, useSubscription } from "../../hooks";
|
|
10
|
+
import { valueTypeMentionConfig } from "../../mention-configs";
|
|
11
|
+
import { updateActiveTabTitle } from "../../tabs-layout/tabs-state";
|
|
12
|
+
|
|
13
|
+
interface IProps {
|
|
14
|
+
knowledgeValueId: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const KnowledgeValueDetails = (props: IProps) => {
|
|
18
|
+
|
|
19
|
+
const knowledgeValue = usePromise(async () => {
|
|
20
|
+
const knowledgeValue = await KnowledgeValues().get(props.knowledgeValueId);
|
|
21
|
+
if (!knowledgeValue) {
|
|
22
|
+
throw new Error('Knowledge Value not found');
|
|
23
|
+
}
|
|
24
|
+
updateActiveTabTitle(knowledgeValue.name || "Knowledge Value");
|
|
25
|
+
return KnowledgeValues().initDoc(knowledgeValue);
|
|
26
|
+
}, undefined, [props.knowledgeValueId]);
|
|
27
|
+
|
|
28
|
+
// Force refresh when value type changes
|
|
29
|
+
const [forceRefreshOnTypeChange, setForceRefreshOnTypeChange] = useState(newid());
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (!knowledgeValue) return;
|
|
32
|
+
const sub = knowledgeValue.qs.peerTypeId.subscribe(() => {
|
|
33
|
+
setForceRefreshOnTypeChange(newid());
|
|
34
|
+
});
|
|
35
|
+
return () => {
|
|
36
|
+
sub.dispose();
|
|
37
|
+
}
|
|
38
|
+
}, [knowledgeValue]);
|
|
39
|
+
|
|
40
|
+
if (!(knowledgeValue)) {
|
|
41
|
+
return <LoadingIndicator />;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async function saveChanges() {
|
|
45
|
+
if (!knowledgeValue) return;
|
|
46
|
+
const type = await PeerTypes().get(knowledgeValue.peerTypeId);
|
|
47
|
+
const existingFields = type?.schema.fields.map(f => f.name) || [];
|
|
48
|
+
const value = knowledgeValue.value || {};
|
|
49
|
+
for (const key of Object.keys(value)) {
|
|
50
|
+
if (!existingFields.includes(key)) {
|
|
51
|
+
delete value[key];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
knowledgeValue.save();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<div className="container-fluid p-1">
|
|
59
|
+
<Autosave doc={knowledgeValue} />
|
|
60
|
+
|
|
61
|
+
<div className="d-flex">
|
|
62
|
+
<div>
|
|
63
|
+
<h4>
|
|
64
|
+
<KnowledgeValueIcon knowledgeValue={knowledgeValue} />
|
|
65
|
+
</h4>
|
|
66
|
+
</div>
|
|
67
|
+
<div className="flex-grow-1">
|
|
68
|
+
<h4>
|
|
69
|
+
<Input
|
|
70
|
+
className='border border-0'
|
|
71
|
+
style={{ width: '100%', outline: 'none', backgroundColor: 'transparent' }}
|
|
72
|
+
value={knowledgeValue.qs.name}
|
|
73
|
+
placeholder="Name"
|
|
74
|
+
/>
|
|
75
|
+
</h4>
|
|
76
|
+
</div>
|
|
77
|
+
<div>
|
|
78
|
+
<SaveButton
|
|
79
|
+
key={knowledgeValue.knowledgeValueId}
|
|
80
|
+
doc={knowledgeValue}
|
|
81
|
+
onClick={saveChanges}
|
|
82
|
+
/>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
{/* <br /> */}
|
|
87
|
+
|
|
88
|
+
<PeersUI
|
|
89
|
+
key={forceRefreshOnTypeChange}
|
|
90
|
+
uiEditMode="edit"
|
|
91
|
+
uiCategory="details"
|
|
92
|
+
props={{ knowledgeValue }}
|
|
93
|
+
>
|
|
94
|
+
<KnowledgeValueDefaultEditor knowledgeValue={knowledgeValue} />
|
|
95
|
+
</PeersUI>
|
|
96
|
+
</div>
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const Autosave = (props: { doc: IDoc<IKnowledgeValue> }) => {
|
|
101
|
+
let p = setTimeout(() => { }, 0);
|
|
102
|
+
const oldTypeId = props.doc.peerTypeId;
|
|
103
|
+
useSubscription(props.doc.q, () => {
|
|
104
|
+
clearTimeout(p);
|
|
105
|
+
p = setTimeout(() => {
|
|
106
|
+
if (props.doc.q() === 0) return;
|
|
107
|
+
if (oldTypeId === props.doc.peerTypeId) {
|
|
108
|
+
props.doc.lastModified = new Date();
|
|
109
|
+
props.doc.save();
|
|
110
|
+
} else {
|
|
111
|
+
console.log('Not auto-saving because type changed which can cause unexpected data loss');
|
|
112
|
+
}
|
|
113
|
+
}, 2000);
|
|
114
|
+
});
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const KnowledgeValueIcon = (props: { knowledgeValue: IDoc<IKnowledgeValue> }) => {
|
|
119
|
+
const { knowledgeValue } = props;
|
|
120
|
+
|
|
121
|
+
useObservable(knowledgeValue.qs.peerTypeId);
|
|
122
|
+
|
|
123
|
+
const valueType = usePromise(async () => {
|
|
124
|
+
const valueType = await PeerTypes().get(knowledgeValue.peerTypeId, { useCache: true });
|
|
125
|
+
return valueType;
|
|
126
|
+
}, undefined, [knowledgeValue.peerTypeId]);
|
|
127
|
+
|
|
128
|
+
return (
|
|
129
|
+
<Tooltip
|
|
130
|
+
handle={
|
|
131
|
+
<i className={"btn btn-secondary dropdown-toggle me-2 " + (valueType?.iconClass || "bi bi-diagram-2-fill")}> </i>
|
|
132
|
+
}
|
|
133
|
+
positions={['bottom', 'right', 'left']}
|
|
134
|
+
genericContent={
|
|
135
|
+
<div
|
|
136
|
+
style={{ minWidth: 200 }}
|
|
137
|
+
className="bg-dark p-2"
|
|
138
|
+
>
|
|
139
|
+
<small>
|
|
140
|
+
Knowledge Type:
|
|
141
|
+
</small>
|
|
142
|
+
<Typeahead
|
|
143
|
+
value={knowledgeValue.qs.peerTypeId}
|
|
144
|
+
mentionConfigs={[valueTypeMentionConfig]}
|
|
145
|
+
/>
|
|
146
|
+
</div>
|
|
147
|
+
}
|
|
148
|
+
/>
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const KnowledgeValueDefaultEditor = (props: { knowledgeValue: IDoc<IKnowledgeValue> }) => {
|
|
153
|
+
const { knowledgeValue } = props;
|
|
154
|
+
const [peerTypeId] = useObservable(knowledgeValue.qs.peerTypeId);
|
|
155
|
+
|
|
156
|
+
const valueType = usePromise(async () => {
|
|
157
|
+
const valueType = await PeerTypes().get(peerTypeId);
|
|
158
|
+
if (valueType) {
|
|
159
|
+
return PeerTypes().initDoc(valueType);
|
|
160
|
+
}
|
|
161
|
+
}, null, [peerTypeId]);
|
|
162
|
+
|
|
163
|
+
if (valueType === undefined) {
|
|
164
|
+
return <div>Value Type {peerTypeId} not found in database</div>
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (!valueType) {
|
|
168
|
+
return <LoadingIndicator />;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return (
|
|
172
|
+
<div>
|
|
173
|
+
<IOSchemaValues
|
|
174
|
+
q={knowledgeValue.q}
|
|
175
|
+
ioSchema={valueType.schema}
|
|
176
|
+
values={knowledgeValue.value || {}}
|
|
177
|
+
excludeFields={['name']}
|
|
178
|
+
/>
|
|
179
|
+
</div>
|
|
180
|
+
);
|
|
181
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { IKnowledgeValue, knowledgeValueSchema, PeerTypes } from "@peers-app/peers-sdk";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { usePromise } from '../../hooks';
|
|
5
|
+
import { registerInternalPeersUI } from '../../ui-router/ui-loader';
|
|
6
|
+
|
|
7
|
+
export const KnowledgeValueListItem = (props: { knowledgeValue: IKnowledgeValue }) => {
|
|
8
|
+
const { knowledgeValue } = props;
|
|
9
|
+
const id = knowledgeValue.knowledgeValueId;
|
|
10
|
+
const _item = knowledgeValue.value as any;
|
|
11
|
+
const description = _item.description || _item.body || _item.content || _item.value;
|
|
12
|
+
|
|
13
|
+
const peerType = usePromise(async () => {
|
|
14
|
+
const peerType = await PeerTypes().get(knowledgeValue.peerTypeId, { useCache: true });
|
|
15
|
+
return peerType;
|
|
16
|
+
}, undefined, [knowledgeValue.peerTypeId]);
|
|
17
|
+
|
|
18
|
+
const name = knowledgeValue.name || knowledgeValue.value?.name || knowledgeValue.knowledgeValueId;
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<div
|
|
22
|
+
key={id}
|
|
23
|
+
className='container-fluid pb-3'
|
|
24
|
+
>
|
|
25
|
+
<i style={{ cursor: 'pointer' }} className={peerType?.iconClass || "bi bi-diagram-2-fill"}></i>
|
|
26
|
+
|
|
27
|
+
<a href={`#knowledge-values/${id}`}>
|
|
28
|
+
{name || 'No Name'}
|
|
29
|
+
</a>
|
|
30
|
+
{/* <div style={{ paddingLeft: '20px' }}>
|
|
31
|
+
<MarkdownWithMentions content={String(description || '').substring(0, 200)} />
|
|
32
|
+
</div> */}
|
|
33
|
+
</div>
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
registerInternalPeersUI({
|
|
38
|
+
peersUIId: '00m5enc2nj313e8neyf35f1gp',
|
|
39
|
+
component: KnowledgeValueListItem,
|
|
40
|
+
propsSchema: z.object({
|
|
41
|
+
knowledgeValue: knowledgeValueSchema as any,
|
|
42
|
+
}),
|
|
43
|
+
routes: [{
|
|
44
|
+
// isMatch: (props) => true,
|
|
45
|
+
uiCategory: 'list-item',
|
|
46
|
+
uiEditMode: 'view',
|
|
47
|
+
}]
|
|
48
|
+
});
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { ICursorIterable, IKnowledgeValue, KnowledgeValues, newid, observable, PeersUI } from "@peers-app/peers-sdk";
|
|
2
|
+
import React, { useEffect, useState } from 'react';
|
|
3
|
+
import { Input } from "../../components/input";
|
|
4
|
+
import { LazyList } from "../../components/lazy-list";
|
|
5
|
+
import { LoadingIndicator } from '../../components/loading-indicator';
|
|
6
|
+
import { isDesktop, mainContentPath } from '../../globals';
|
|
7
|
+
import { useObservable } from "../../hooks";
|
|
8
|
+
import { registerInternalPeersUI } from "../../ui-router/ui-loader";
|
|
9
|
+
import './knowledge-value-list-item';
|
|
10
|
+
|
|
11
|
+
const screenPathPart = 'knowledge-values';
|
|
12
|
+
// const icon = 'bi bi-diagram-2-fill';
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
export const KnowledgeValueList = (props: {}) => {
|
|
16
|
+
const [searchTextObs] = useState(() => observable(''));
|
|
17
|
+
const [searchText] = useObservable(searchTextObs);
|
|
18
|
+
|
|
19
|
+
const [cursorObs] = useState(() => observable<ICursorIterable<IKnowledgeValue>>());
|
|
20
|
+
const [allLoadedIds] = useState(() => new Set<string>());
|
|
21
|
+
|
|
22
|
+
async function newCursor() {
|
|
23
|
+
const cursor = await KnowledgeValues().cursor({}, { sortBy: ['-lastModified', '-knowledgeValueId'], textSearch: searchText });
|
|
24
|
+
cursorObs(cursor);
|
|
25
|
+
return cursor;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
cursorObs(undefined); // Clear existing cursor first
|
|
30
|
+
allLoadedIds.clear(); // Clear loaded IDs when search changes
|
|
31
|
+
newCursor();
|
|
32
|
+
}, [searchText]);
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
async function loadMore(existing: IKnowledgeValue[]): Promise<IKnowledgeValue[]> {
|
|
36
|
+
let moreMatches: IKnowledgeValue[] = [];
|
|
37
|
+
let cursor = cursorObs() || await newCursor();
|
|
38
|
+
|
|
39
|
+
for await (const nextRecord of cursor) {
|
|
40
|
+
// Skip if already loaded globally or in existing items
|
|
41
|
+
if (allLoadedIds.has(nextRecord.knowledgeValueId) ||
|
|
42
|
+
existing.some(e => e.knowledgeValueId === nextRecord.knowledgeValueId)) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
allLoadedIds.add(nextRecord.knowledgeValueId); // Track as loaded
|
|
47
|
+
moreMatches.push(nextRecord);
|
|
48
|
+
if (searchText.length && moreMatches.length > 5) break;
|
|
49
|
+
if (moreMatches.length >= 50) break;
|
|
50
|
+
}
|
|
51
|
+
if (moreMatches.length === 0) {
|
|
52
|
+
cursorObs(undefined);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return moreMatches;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
async function searchSubmit(evt: React.KeyboardEvent<HTMLInputElement>) {
|
|
60
|
+
if (evt.key !== "Enter") return;
|
|
61
|
+
const name = searchText.trim();
|
|
62
|
+
if (!name) return;
|
|
63
|
+
|
|
64
|
+
const newKV = await KnowledgeValues().insert({
|
|
65
|
+
knowledgeValueId: newid(),
|
|
66
|
+
lastModified: new Date(),
|
|
67
|
+
name: name,
|
|
68
|
+
peerTypeId: "00m3g0ntcop3mrh6ynuzgekiy", // `Note` value type
|
|
69
|
+
value: {
|
|
70
|
+
body: '',
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
mainContentPath(`${screenPathPart}/${newKV.knowledgeValueId}`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return (
|
|
77
|
+
<div className='container-fluid'>
|
|
78
|
+
|
|
79
|
+
<div className="input-group mt-3 mb-3">
|
|
80
|
+
{/* <Typeahead /> */}
|
|
81
|
+
<Input value={searchTextObs} className="form-control" placeholder={`Search or create knowledge`}
|
|
82
|
+
autoFocus={isDesktop() ? true : false}
|
|
83
|
+
onKeyUp={evt => searchSubmit(evt)}
|
|
84
|
+
/>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
<div className="peers-list-container">
|
|
88
|
+
<LazyList
|
|
89
|
+
resetTrigger={searchText}
|
|
90
|
+
loadMore={loadMore}
|
|
91
|
+
scrollThreshold={0.6}
|
|
92
|
+
renderItems={(items) => {
|
|
93
|
+
// return items.map(item => <KnowledgeValueListItem key={item.knowledgeValueId} data={item} />);
|
|
94
|
+
return items.map(item =>
|
|
95
|
+
<PeersUI
|
|
96
|
+
key={item.knowledgeValueId}
|
|
97
|
+
uiEditMode='view'
|
|
98
|
+
uiCategory='list-item'
|
|
99
|
+
props={{ knowledgeValue: item }}
|
|
100
|
+
/>
|
|
101
|
+
);
|
|
102
|
+
}}
|
|
103
|
+
loadingIndicator={
|
|
104
|
+
<div className="d-flex justify-content-center" style={{ height: 200 }}>
|
|
105
|
+
<LoadingIndicator />
|
|
106
|
+
</div>
|
|
107
|
+
}
|
|
108
|
+
endOfList={
|
|
109
|
+
<div className="d-flex justify-content-center" style={{ height: 200 }}>
|
|
110
|
+
{/* <span className="h3">End of List</span> */}
|
|
111
|
+
</div>
|
|
112
|
+
}
|
|
113
|
+
/>
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
);
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
registerInternalPeersUI({
|
|
121
|
+
peersUIId: '00m5fshz2g6ea23v8z6y0a1ck',
|
|
122
|
+
component: KnowledgeValueList,
|
|
123
|
+
routes: [
|
|
124
|
+
{
|
|
125
|
+
isMatch: (props, context) => context.path === 'knowledge-values',
|
|
126
|
+
// path: 'knowledge-values',
|
|
127
|
+
uiCategory: 'screen',
|
|
128
|
+
priority: 2
|
|
129
|
+
}
|
|
130
|
+
]
|
|
131
|
+
})
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Packages, rpcServerCalls } from "@peers-app/peers-sdk";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { LoadingIndicator } from "../../components/loading-indicator";
|
|
4
|
+
import { ISaveButtonProps, SaveButton } from "../../components/save-button";
|
|
5
|
+
import { ScreenTabBody, Tabs } from "../../components/tabs";
|
|
6
|
+
import { PackageInfo } from "./package-info";
|
|
7
|
+
import { useObservableState, usePromise } from "../../hooks";
|
|
8
|
+
import { Input } from "../../components/input";
|
|
9
|
+
import { updateActiveTabTitle } from "../../tabs-layout/tabs-state";
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
interface IProps {
|
|
13
|
+
packageId: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const PackageDetails = (props: IProps) => {
|
|
17
|
+
|
|
18
|
+
const refresh = useObservableState(Date.now());
|
|
19
|
+
|
|
20
|
+
const pkg = usePromise(async () => {
|
|
21
|
+
const pkg = await Packages().get(props.packageId);
|
|
22
|
+
if (!pkg) {
|
|
23
|
+
throw new Error('Workflow not found');
|
|
24
|
+
}
|
|
25
|
+
updateActiveTabTitle(pkg.name || "Package");
|
|
26
|
+
return Packages().initDoc(pkg);
|
|
27
|
+
}, undefined, [props.packageId, refresh()]);
|
|
28
|
+
|
|
29
|
+
if (!pkg) {
|
|
30
|
+
return <LoadingIndicator />;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const addActions: ISaveButtonProps['addActions'] = [
|
|
34
|
+
{
|
|
35
|
+
label: 'Reload Package',
|
|
36
|
+
onClick: async () => {
|
|
37
|
+
await rpcServerCalls.installOrUpdatePackage(pkg.packageId);
|
|
38
|
+
await pkg.load();
|
|
39
|
+
window.location.reload();
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
if (!pkg.remoteRepo) {
|
|
44
|
+
addActions.push({
|
|
45
|
+
label: 'Make Remote ',
|
|
46
|
+
// className: 'text-bg-warning',
|
|
47
|
+
onClick: async () => {
|
|
48
|
+
if (confirm(`Create a remote repository from this local one: ${pkg.name}`)) {
|
|
49
|
+
try {
|
|
50
|
+
|
|
51
|
+
await rpcServerCalls.linkRemoteRepo(pkg.packageId);
|
|
52
|
+
await rpcServerCalls.installOrUpdatePackage(pkg.packageId);
|
|
53
|
+
refresh(Date.now());
|
|
54
|
+
} catch (err) {
|
|
55
|
+
alert(`Error linking remote repo: ${err}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return (
|
|
63
|
+
<div className="container-fluid p-3">
|
|
64
|
+
|
|
65
|
+
<div className="d-flex">
|
|
66
|
+
<div>
|
|
67
|
+
<h4>
|
|
68
|
+
<i className="bi bi-box-fill me-2"></i>
|
|
69
|
+
</h4>
|
|
70
|
+
</div>
|
|
71
|
+
<div className="flex-grow-1">
|
|
72
|
+
<h4>
|
|
73
|
+
<Input
|
|
74
|
+
key={pkg.packageId}
|
|
75
|
+
className='border border-0'
|
|
76
|
+
style={{ width: '100%', outline: 'none', backgroundColor: 'transparent' }}
|
|
77
|
+
value={pkg.qs.name}
|
|
78
|
+
/>
|
|
79
|
+
</h4>
|
|
80
|
+
</div>
|
|
81
|
+
<div>
|
|
82
|
+
<SaveButton
|
|
83
|
+
key={pkg.packageId}
|
|
84
|
+
doc={pkg}
|
|
85
|
+
addActions={[
|
|
86
|
+
...addActions
|
|
87
|
+
]}
|
|
88
|
+
/>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<Tabs
|
|
93
|
+
key={pkg.packageId}
|
|
94
|
+
tabs={[
|
|
95
|
+
{
|
|
96
|
+
name: 'Info', content:
|
|
97
|
+
<ScreenTabBody>
|
|
98
|
+
<PackageInfo pkg={pkg} />
|
|
99
|
+
</ScreenTabBody>
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: 'Components', content:
|
|
103
|
+
<ScreenTabBody>
|
|
104
|
+
TODO - show all of the different components in the package
|
|
105
|
+
</ScreenTabBody>
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
name: 'Dependencies', content:
|
|
109
|
+
<ScreenTabBody>
|
|
110
|
+
TODO - show all of the dependencies of the package
|
|
111
|
+
</ScreenTabBody>
|
|
112
|
+
},
|
|
113
|
+
]}
|
|
114
|
+
/>
|
|
115
|
+
</div>
|
|
116
|
+
)
|
|
117
|
+
}
|