@peers-app/peers-ui 0.13.6 → 0.14.0

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 (84) hide show
  1. package/dist/components/left-bar.js +0 -9
  2. package/dist/components/router.js +0 -44
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.js +1 -1
  5. package/dist/mention-configs.d.ts +0 -2
  6. package/dist/mention-configs.js +1 -38
  7. package/dist/screens/search/global-search.js +2 -4
  8. package/dist/screens/workflows/workflow-details.js +5 -56
  9. package/dist/system-apps/index.d.ts +0 -4
  10. package/dist/system-apps/index.js +1 -18
  11. package/dist/ui-defaults/index.d.ts +0 -1
  12. package/dist/ui-defaults/index.js +0 -1
  13. package/dist/ui-defaults/list-screen.js +0 -1
  14. package/docs/tabs-ui.md +6 -21
  15. package/package.json +3 -3
  16. package/src/components/left-bar.tsx +0 -12
  17. package/src/components/router.tsx +0 -48
  18. package/src/index.tsx +2 -2
  19. package/src/mention-configs.ts +1 -40
  20. package/src/screens/search/global-search.tsx +2 -6
  21. package/src/screens/workflows/workflow-details.tsx +3 -28
  22. package/src/system-apps/index.ts +0 -14
  23. package/src/ui-defaults/index.ts +0 -1
  24. package/src/ui-defaults/list-screen.tsx +0 -1
  25. package/dist/screens/events/cron.d.ts +0 -3
  26. package/dist/screens/events/cron.js +0 -77
  27. package/dist/screens/events/event-details.d.ts +0 -6
  28. package/dist/screens/events/event-details.js +0 -112
  29. package/dist/screens/events/event-handlers.d.ts +0 -7
  30. package/dist/screens/events/event-handlers.js +0 -84
  31. package/dist/screens/events/event-info.d.ts +0 -5
  32. package/dist/screens/events/event-info.js +0 -19
  33. package/dist/screens/events/event-list.d.ts +0 -2
  34. package/dist/screens/events/event-list.js +0 -107
  35. package/dist/screens/events/event-schedule.d.ts +0 -5
  36. package/dist/screens/events/event-schedule.js +0 -124
  37. package/dist/screens/knowledge/knowledge-frame-details.bk.d.ts +0 -6
  38. package/dist/screens/knowledge/knowledge-frame-details.bk.js +0 -84
  39. package/dist/screens/knowledge/knowledge-frame-details.d.ts +0 -8
  40. package/dist/screens/knowledge/knowledge-frame-details.js +0 -143
  41. package/dist/screens/knowledge/knowledge-frame-list.d.ts +0 -2
  42. package/dist/screens/knowledge/knowledge-frame-list.js +0 -45
  43. package/dist/screens/knowledge/knowledge-value-details.d.ts +0 -6
  44. package/dist/screens/knowledge/knowledge-value-details.js +0 -150
  45. package/dist/screens/knowledge/knowledge-value-list-item.d.ts +0 -5
  46. package/dist/screens/knowledge/knowledge-value-list-item.js +0 -39
  47. package/dist/screens/knowledge/knowledge-value-list.d.ts +0 -3
  48. package/dist/screens/knowledge/knowledge-value-list.js +0 -123
  49. package/dist/screens/predicates/predicate-details.d.ts +0 -6
  50. package/dist/screens/predicates/predicate-details.js +0 -103
  51. package/dist/screens/predicates/predicate-list.d.ts +0 -2
  52. package/dist/screens/predicates/predicate-list.js +0 -46
  53. package/dist/screens/workflows/workflow-subscriptions.d.ts +0 -6
  54. package/dist/screens/workflows/workflow-subscriptions.js +0 -81
  55. package/dist/system-apps/events.app.d.ts +0 -2
  56. package/dist/system-apps/events.app.js +0 -8
  57. package/dist/system-apps/knowledge-frames.app.d.ts +0 -2
  58. package/dist/system-apps/knowledge-frames.app.js +0 -9
  59. package/dist/system-apps/knowledge-values.app.d.ts +0 -2
  60. package/dist/system-apps/knowledge-values.app.js +0 -9
  61. package/dist/system-apps/predicates.app.d.ts +0 -2
  62. package/dist/system-apps/predicates.app.js +0 -8
  63. package/dist/ui-defaults/notes-editor.d.ts +0 -7
  64. package/dist/ui-defaults/notes-editor.js +0 -41
  65. package/src/screens/events/cron.ts +0 -74
  66. package/src/screens/events/event-details.tsx +0 -117
  67. package/src/screens/events/event-handlers.tsx +0 -61
  68. package/src/screens/events/event-info.tsx +0 -29
  69. package/src/screens/events/event-list.tsx +0 -104
  70. package/src/screens/events/event-schedule.tsx +0 -130
  71. package/src/screens/knowledge/knowledge-frame-details.bk.tsx +0 -160
  72. package/src/screens/knowledge/knowledge-frame-details.tsx +0 -176
  73. package/src/screens/knowledge/knowledge-frame-list.tsx +0 -49
  74. package/src/screens/knowledge/knowledge-value-details.tsx +0 -181
  75. package/src/screens/knowledge/knowledge-value-list-item.tsx +0 -48
  76. package/src/screens/knowledge/knowledge-value-list.tsx +0 -131
  77. package/src/screens/predicates/predicate-details.tsx +0 -125
  78. package/src/screens/predicates/predicate-list.tsx +0 -50
  79. package/src/screens/workflows/workflow-subscriptions.tsx +0 -58
  80. package/src/system-apps/events.app.ts +0 -7
  81. package/src/system-apps/knowledge-frames.app.ts +0 -8
  82. package/src/system-apps/knowledge-values.app.ts +0 -8
  83. package/src/system-apps/predicates.app.ts +0 -7
  84. package/src/ui-defaults/notes-editor.tsx +0 -51
@@ -1,131 +0,0 @@
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> | undefined>());
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
- })
@@ -1,125 +0,0 @@
1
- import { IDoc, IPredicate, Observable, Predicates } from "@peers-app/peers-sdk";
2
- import React, { useEffect } from "react";
3
- import { Input } from "../../components/input";
4
- import { LoadingIndicator } from "../../components/loading-indicator";
5
- import { MarkdownEditorInline } from "../../components/markdown-editor/editor-inline";
6
- import { SaveButton } from "../../components/save-button";
7
- import { ScreenTabBody, Tabs } from "../../components/tabs";
8
- import { usePromise } from "../../hooks";
9
- import { updateActiveTabTitle } from "../../tabs-layout/tabs-state";
10
-
11
- interface IProps {
12
- predicateId: string;
13
- }
14
-
15
- export const PredicateDetails = (props: IProps) => {
16
-
17
- const predicate = usePromise(async () => {
18
- const predicate = await Predicates().get(props.predicateId);
19
- if (!predicate) {
20
- throw new Error('Predicate not found');
21
- }
22
- const doc = Predicates().initDoc(predicate);
23
- updateActiveTabTitle(doc.name || "Predicate");
24
- return doc;
25
- }, undefined, [props.predicateId]);
26
-
27
-
28
- useEffect(() => {
29
- if (!predicate) return;
30
- const sub = predicate.qs.name.subscribe(() => {
31
- predicate.name = predicate.qs.name().replaceAll(/\s/g, '_').replaceAll(/[^a-zA-Z0-9_-]/g, '');
32
- });
33
- return () => {
34
- sub.dispose();
35
- }
36
- }, [predicate]);
37
-
38
- if (!predicate) {
39
- return <LoadingIndicator />;
40
- }
41
-
42
- return (
43
- <div className="container-fluid p-3">
44
-
45
- <div className="d-flex">
46
- <div>
47
- <h4>
48
- <i className="me-2 bi bi-node-plus-fill"></i>
49
- </h4>
50
- </div>
51
- <div className="flex-grow-1">
52
- <h4>
53
- <Input
54
- key={predicate.predicateId}
55
- className='border border-0'
56
- style={{ width: '100%', outline: 'none', backgroundColor: 'transparent' }}
57
- value={predicate.qs.name}
58
- />
59
- </h4>
60
- </div>
61
- <div>
62
- <SaveButton
63
- key={predicate.predicateId}
64
- doc={predicate}
65
- />
66
- </div>
67
- </div>
68
-
69
- <Tabs
70
- key={predicate.predicateId}
71
- tabs={[
72
- {
73
- name: 'Info', content:
74
- <ScreenTabBody>
75
- <PredicateInfo predicate={predicate} />
76
- </ScreenTabBody>
77
- },
78
- {
79
- name: 'Allowed Types', content:
80
- <ScreenTabBody>
81
- <AllowedTypes predicate={predicate} />
82
- </ScreenTabBody>
83
- },
84
- ]}
85
- />
86
- </div>
87
- )
88
- }
89
-
90
-
91
- const PredicateInfo = (props: { predicate: IDoc<IPredicate> }) => {
92
- const { predicate } = props
93
-
94
- predicate.description = predicate.description || '';
95
-
96
- return (
97
- <div>
98
-
99
- <small>Name:</small>
100
- <Input
101
- value={predicate.qs.name}
102
- className="form-control mb-3 p-0 ps-2"
103
- placeholder="Variable name"
104
- title="Variable name"
105
- />
106
-
107
- <small className="mt-2">Description:</small>
108
- <MarkdownEditorInline
109
- value={predicate.qs.description as Observable<string>}
110
- />
111
-
112
- </div>
113
- )
114
- }
115
-
116
- const AllowedTypes = (props: { predicate: IDoc<IPredicate> }) => {
117
- const { predicate } = props
118
-
119
- return (
120
- <div>
121
- {/* <TextListEditor value={predicate} /> */}
122
- </div>
123
- )
124
- }
125
-
@@ -1,50 +0,0 @@
1
- import React from 'react';
2
- import { newid, IPredicate, Predicates } from "@peers-app/peers-sdk";
3
- import { ListScreen } from '../../components/list-screen';
4
- import { MarkdownWithMentions } from '../../components/markdown-with-mentions';
5
- import { mainContentPath } from '../../globals';
6
-
7
- export function PredicateList() {
8
- const screenPathPart = 'predicates';
9
- const icon = 'bi bi-node-plus-fill';
10
-
11
- return ListScreen({
12
- table: Predicates(),
13
- sortBy: ['-predicateId'],
14
- placeholderName: 'frame',
15
- getFilter: (text: string) => {
16
- return {
17
- $or: [
18
- { name: { $matchWords: text } },
19
- { description: { $matchWords: text } },
20
- ]
21
- };
22
- },
23
- newRecord: async (text: string) => {
24
- text = text.trim().replace(/\s+/g, '_');
25
- const item = await Predicates().insert({
26
- predicateId: newid(),
27
- name: text,
28
- description: '',
29
- });
30
- mainContentPath(`${screenPathPart}/${item.predicateId}`);
31
- return item;
32
- },
33
- renderItem: (item: IPredicate) => {
34
- return (
35
- <div
36
- key={item.predicateId}
37
- className='container-fluid pb-4'
38
- >
39
- <i className={icon}></i>&nbsp;
40
- <a href={`#${screenPathPart}/${item.predicateId}`}>
41
- {item.name || '<empty-name>'}
42
- </a>
43
- <div style={{ paddingLeft: '20px' }}>
44
- <MarkdownWithMentions content={item.description || ''} />
45
- </div>
46
- </div>
47
- )
48
- },
49
- });
50
- }
@@ -1,58 +0,0 @@
1
- import { formatMention, getAllMentions, IDoc, IPeerEventHandler, IWorkflow, newid, observable, Observable, PeerEventTypes } from "@peers-app/peers-sdk";
2
- import { isEqual } from "lodash";
3
- import React, { useState } from "react";
4
- import { LoadingIndicator } from "../../components/loading-indicator";
5
- import { MarkdownEditorInline } from "../../components/markdown-editor/editor-inline";
6
- import { Tooltip } from "../../components/tooltip";
7
- import { usePromise, useSubscription } from "../../hooks";
8
-
9
- export const WorkflowEventSubscriptions = (props: { workflow: IDoc<IWorkflow>, eventSubscriptions: Observable<IPeerEventHandler[]> }) => {
10
- const { workflow, eventSubscriptions } = props;
11
-
12
- const [subscriptionsMarkdown] = useState(() => observable(''));
13
-
14
- const markdownInitialized = usePromise(async () => {
15
- const eventTypeIds = eventSubscriptions().map(h => h.peerEventTypeId);
16
- const subscribedEvents = await PeerEventTypes().list({ peerEventTypeId: { $in: eventTypeIds } });
17
- const peerEventTypeNames = subscribedEvents.reduce((acc, evt) => ({ ...acc, [evt.peerEventTypeId]: evt.name }), {} as Record<string, string>);
18
- const mentions = eventTypeIds.map(eventTypeId => '- ' + formatMention({ kind: 'event', id: eventTypeId, name: peerEventTypeNames[eventTypeId] ?? eventTypeId }));
19
- const markdown = `${mentions.join('\n') || '- '}`;
20
- subscriptionsMarkdown(markdown);
21
- return true;
22
- });
23
-
24
- useSubscription(subscriptionsMarkdown, () => {
25
- if (!markdownInitialized) return;
26
- const startEventTypeIds = eventSubscriptions().map(h => h.peerEventTypeId);
27
- const eventTypeIds = getAllMentions(subscriptionsMarkdown()).filter(m => m.kind === 'event').map(m => m.id);
28
- if (isEqual(startEventTypeIds, eventTypeIds)) return;
29
- const newHandler: IPeerEventHandler[] = eventTypeIds.map(eventTypeId => ({
30
- peerEventHandlerId: newid(),
31
- peerEventTypeId: eventTypeId,
32
- handlerWorkflowId: workflow.workflowId,
33
- }));
34
- eventSubscriptions(newHandler);
35
- workflow.q(workflow.q() + 1);
36
- });
37
-
38
- if (!markdownInitialized) {
39
- return <LoadingIndicator />;
40
- }
41
-
42
- return (
43
- <div>
44
-
45
- <div className='mt-2'>
46
- <small>Mention events that should trigger this workflow:</small>
47
- <small>
48
- <Tooltip markdownContent={`The mentions will be reformatted as a bulleted list regardless of how they are entered. All other content except for event mentions will be discarded.`} />
49
- </small>
50
-
51
- <MarkdownEditorInline
52
- value={subscriptionsMarkdown}
53
- />
54
- </div>
55
-
56
- </div>
57
- );
58
- };
@@ -1,7 +0,0 @@
1
- import { IAppNav } from "@peers-app/peers-sdk";
2
-
3
- export const eventsApp: IAppNav = {
4
- name: 'Events',
5
- iconClassName: 'bi-lightning-charge-fill',
6
- navigationPath: 'events'
7
- };
@@ -1,8 +0,0 @@
1
- import { IAppNav } from "@peers-app/peers-sdk";
2
-
3
- export const knowledgeFramesApp: IAppNav = {
4
- name: 'Knowledge Frames',
5
- displayName: 'K-Frames',
6
- iconClassName: 'bi-window-dock',
7
- navigationPath: 'knowledge-frames'
8
- };
@@ -1,8 +0,0 @@
1
- import { IAppNav } from "@peers-app/peers-sdk";
2
-
3
- export const knowledgeValuesApp: IAppNav = {
4
- name: 'Knowledge Values',
5
- displayName: 'K-Values',
6
- iconClassName: 'bi-journal-bookmark-fill',
7
- navigationPath: 'knowledge-values'
8
- };
@@ -1,7 +0,0 @@
1
- import { IAppNav } from "@peers-app/peers-sdk";
2
-
3
- export const predicatesApp: IAppNav = {
4
- name: 'Predicates',
5
- iconClassName: 'bi-node-plus-fill',
6
- navigationPath: 'predicates'
7
- };
@@ -1,51 +0,0 @@
1
- import { computed, IDoc, IKnowledgeValue, knowledgeValueSchema, Observable } from "@peers-app/peers-sdk";
2
- import React from "react";
3
- import { z } from "zod";
4
- import { MarkdownEditorInline } from "../components/markdown-editor/editor-inline";
5
- import { registerInternalPeersUI } from "../ui-router/ui-loader";
6
-
7
- interface IProps {
8
- markdown: Observable<string>,
9
- }
10
-
11
- export const FullScreenMarkdownEditor = (props: IProps) => {
12
- return (
13
- <MarkdownEditorInline
14
- value={props.markdown}
15
- maxHeight={'calc(100vh - 160px)'}
16
- autoFocus
17
- />
18
- )
19
- }
20
-
21
- registerInternalPeersUI({
22
- peersUIId: '00m4rof6uwka5kfi6t7rav8t3',
23
- component: (props: { knowledgeValue: IDoc<IKnowledgeValue> }) => {
24
- const doc = props.knowledgeValue;
25
- const markdown = computed({
26
- read: () => doc.value?.body || '',
27
- write: (value: string) => {
28
- doc.value.body = value;
29
- doc.qs.value.notifySubscribers();
30
- doc.q(doc.q() + 1);
31
- }
32
- })
33
- return (
34
- <FullScreenMarkdownEditor
35
- key={doc.knowledgeValueId}
36
- markdown={markdown as any}
37
- />
38
- );
39
- },
40
- propsSchema: z.object({
41
- knowledgeValue: knowledgeValueSchema as any, // TODO fix this
42
- }),
43
- routes: [
44
- {
45
- // KnowledgeValue with PeerType: Note
46
- isMatch: (props, context) => props.knowledgeValue?.peerTypeId === '00m3g0ntcop3mrh6ynuzgekiy',
47
- uiEditMode: 'edit',
48
- uiCategory: 'details',
49
- }
50
- ]
51
- });