@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.
- package/dist/components/left-bar.js +0 -9
- package/dist/components/router.js +0 -44
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/mention-configs.d.ts +0 -2
- package/dist/mention-configs.js +1 -38
- package/dist/screens/search/global-search.js +2 -4
- package/dist/screens/workflows/workflow-details.js +5 -56
- package/dist/system-apps/index.d.ts +0 -4
- package/dist/system-apps/index.js +1 -18
- package/dist/ui-defaults/index.d.ts +0 -1
- package/dist/ui-defaults/index.js +0 -1
- package/dist/ui-defaults/list-screen.js +0 -1
- package/docs/tabs-ui.md +6 -21
- package/package.json +3 -3
- package/src/components/left-bar.tsx +0 -12
- package/src/components/router.tsx +0 -48
- package/src/index.tsx +2 -2
- package/src/mention-configs.ts +1 -40
- package/src/screens/search/global-search.tsx +2 -6
- package/src/screens/workflows/workflow-details.tsx +3 -28
- package/src/system-apps/index.ts +0 -14
- package/src/ui-defaults/index.ts +0 -1
- package/src/ui-defaults/list-screen.tsx +0 -1
- package/dist/screens/events/cron.d.ts +0 -3
- package/dist/screens/events/cron.js +0 -77
- package/dist/screens/events/event-details.d.ts +0 -6
- package/dist/screens/events/event-details.js +0 -112
- package/dist/screens/events/event-handlers.d.ts +0 -7
- package/dist/screens/events/event-handlers.js +0 -84
- package/dist/screens/events/event-info.d.ts +0 -5
- package/dist/screens/events/event-info.js +0 -19
- package/dist/screens/events/event-list.d.ts +0 -2
- package/dist/screens/events/event-list.js +0 -107
- package/dist/screens/events/event-schedule.d.ts +0 -5
- package/dist/screens/events/event-schedule.js +0 -124
- package/dist/screens/knowledge/knowledge-frame-details.bk.d.ts +0 -6
- package/dist/screens/knowledge/knowledge-frame-details.bk.js +0 -84
- package/dist/screens/knowledge/knowledge-frame-details.d.ts +0 -8
- package/dist/screens/knowledge/knowledge-frame-details.js +0 -143
- package/dist/screens/knowledge/knowledge-frame-list.d.ts +0 -2
- package/dist/screens/knowledge/knowledge-frame-list.js +0 -45
- package/dist/screens/knowledge/knowledge-value-details.d.ts +0 -6
- package/dist/screens/knowledge/knowledge-value-details.js +0 -150
- package/dist/screens/knowledge/knowledge-value-list-item.d.ts +0 -5
- package/dist/screens/knowledge/knowledge-value-list-item.js +0 -39
- package/dist/screens/knowledge/knowledge-value-list.d.ts +0 -3
- package/dist/screens/knowledge/knowledge-value-list.js +0 -123
- package/dist/screens/predicates/predicate-details.d.ts +0 -6
- package/dist/screens/predicates/predicate-details.js +0 -103
- package/dist/screens/predicates/predicate-list.d.ts +0 -2
- package/dist/screens/predicates/predicate-list.js +0 -46
- package/dist/screens/workflows/workflow-subscriptions.d.ts +0 -6
- package/dist/screens/workflows/workflow-subscriptions.js +0 -81
- package/dist/system-apps/events.app.d.ts +0 -2
- package/dist/system-apps/events.app.js +0 -8
- package/dist/system-apps/knowledge-frames.app.d.ts +0 -2
- package/dist/system-apps/knowledge-frames.app.js +0 -9
- package/dist/system-apps/knowledge-values.app.d.ts +0 -2
- package/dist/system-apps/knowledge-values.app.js +0 -9
- package/dist/system-apps/predicates.app.d.ts +0 -2
- package/dist/system-apps/predicates.app.js +0 -8
- package/dist/ui-defaults/notes-editor.d.ts +0 -7
- package/dist/ui-defaults/notes-editor.js +0 -41
- package/src/screens/events/cron.ts +0 -74
- package/src/screens/events/event-details.tsx +0 -117
- package/src/screens/events/event-handlers.tsx +0 -61
- package/src/screens/events/event-info.tsx +0 -29
- package/src/screens/events/event-list.tsx +0 -104
- package/src/screens/events/event-schedule.tsx +0 -130
- package/src/screens/knowledge/knowledge-frame-details.bk.tsx +0 -160
- package/src/screens/knowledge/knowledge-frame-details.tsx +0 -176
- package/src/screens/knowledge/knowledge-frame-list.tsx +0 -49
- package/src/screens/knowledge/knowledge-value-details.tsx +0 -181
- package/src/screens/knowledge/knowledge-value-list-item.tsx +0 -48
- package/src/screens/knowledge/knowledge-value-list.tsx +0 -131
- package/src/screens/predicates/predicate-details.tsx +0 -125
- package/src/screens/predicates/predicate-list.tsx +0 -50
- package/src/screens/workflows/workflow-subscriptions.tsx +0 -58
- package/src/system-apps/events.app.ts +0 -7
- package/src/system-apps/knowledge-frames.app.ts +0 -8
- package/src/system-apps/knowledge-values.app.ts +0 -8
- package/src/system-apps/predicates.app.ts +0 -7
- package/src/ui-defaults/notes-editor.tsx +0 -51
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import { observable } from "@peers-app/peers-sdk";
|
|
2
|
-
import React from "react";
|
|
3
|
-
import { IKnowledgeFrame, KnowledgeFrames, KnowledgeValues, IDoc } from "@peers-app/peers-sdk";
|
|
4
|
-
import { SaveButton } from "../../components/save-button";
|
|
5
|
-
import { TextListEditor } from "../../components/text-list-editor.tsx/text-list-editor";
|
|
6
|
-
import { LoadingIndicator } from "../../components/loading-indicator";
|
|
7
|
-
import { useObservable, useObservableState, usePromise, useSubscription } from "../../hooks";
|
|
8
|
-
import { Input } from "../../components/input";
|
|
9
|
-
|
|
10
|
-
interface IProps {
|
|
11
|
-
knowledgeFrameId: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export const KnowledgeFrameDetails = (props: IProps) => {
|
|
15
|
-
|
|
16
|
-
const frame = usePromise(async () => {
|
|
17
|
-
const frame = await KnowledgeFrames().get(props.knowledgeFrameId);
|
|
18
|
-
if (!frame) {
|
|
19
|
-
throw new Error('Knowledge Frame not found');
|
|
20
|
-
}
|
|
21
|
-
return KnowledgeFrames().initDoc(frame);
|
|
22
|
-
}, undefined, [props.knowledgeFrameId]);
|
|
23
|
-
|
|
24
|
-
const bodyObs = frame?.qs.body || observable('');
|
|
25
|
-
// useEffect
|
|
26
|
-
let p = setTimeout(() => {}, 0);
|
|
27
|
-
useSubscription(bodyObs, () => {
|
|
28
|
-
clearTimeout(p);
|
|
29
|
-
p = setTimeout(() => {
|
|
30
|
-
// todo update frames knowledgeIds that are linked in the body
|
|
31
|
-
frame?.save();
|
|
32
|
-
}, 2000);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
if (!frame) {
|
|
36
|
-
return <LoadingIndicator />;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
return (
|
|
40
|
-
<div className="container-fluid p-3">
|
|
41
|
-
|
|
42
|
-
<div className="d-flex">
|
|
43
|
-
<div>
|
|
44
|
-
<h4>
|
|
45
|
-
<i className="me-2 bi bi-window-dock"></i>
|
|
46
|
-
</h4>
|
|
47
|
-
</div>
|
|
48
|
-
<div className="flex-grow-1">
|
|
49
|
-
<h4>
|
|
50
|
-
<Input
|
|
51
|
-
key={frame.knowledgeFrameId}
|
|
52
|
-
className='border border-0'
|
|
53
|
-
style={{ width: '100%', outline: 'none', backgroundColor: 'transparent' }}
|
|
54
|
-
value={frame.qs.name}
|
|
55
|
-
/>
|
|
56
|
-
</h4>
|
|
57
|
-
</div>
|
|
58
|
-
<div>
|
|
59
|
-
<SaveButton
|
|
60
|
-
key={frame.knowledgeFrameId}
|
|
61
|
-
doc={frame}
|
|
62
|
-
/>
|
|
63
|
-
</div>
|
|
64
|
-
</div>
|
|
65
|
-
|
|
66
|
-
<br />
|
|
67
|
-
|
|
68
|
-
{/* <MarkdownEditorInline
|
|
69
|
-
value={frame.qs.body}
|
|
70
|
-
maxHeight={'calc(100vh - 130px)'}
|
|
71
|
-
/> */}
|
|
72
|
-
|
|
73
|
-
{/* <KnowledgeEntriesList frame={frame} /> */}
|
|
74
|
-
|
|
75
|
-
<TextListEditor value={bodyObs} maxHeight={'calc(100vh - 130px)'} />
|
|
76
|
-
|
|
77
|
-
{/* <KnowledgeEntryEditor /> */}
|
|
78
|
-
|
|
79
|
-
</div>
|
|
80
|
-
)
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
interface IKnowledgeEntriesListProps {
|
|
84
|
-
frame: IDoc<IKnowledgeFrame>;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const KnowledgeEntriesList = (props: IKnowledgeEntriesListProps) => {
|
|
88
|
-
const { frame } = props;
|
|
89
|
-
|
|
90
|
-
useObservable(frame.qs.knowledgeValueIds);
|
|
91
|
-
|
|
92
|
-
const knowledgeEntries = usePromise(async () => {
|
|
93
|
-
return KnowledgeValues().list({ knowledgeValueId: frame.knowledgeValueIds } );
|
|
94
|
-
}, [], [frame.knowledgeValueIds]);
|
|
95
|
-
|
|
96
|
-
return (
|
|
97
|
-
<div>
|
|
98
|
-
<NewKnowledgeEntry frame={frame} />
|
|
99
|
-
|
|
100
|
-
<div>
|
|
101
|
-
{knowledgeEntries?.map(entry => {
|
|
102
|
-
return (
|
|
103
|
-
<div key={entry.knowledgeValueId}>
|
|
104
|
-
{JSON.stringify(entry, null, 2)}
|
|
105
|
-
</div>
|
|
106
|
-
);
|
|
107
|
-
})}
|
|
108
|
-
</div>
|
|
109
|
-
|
|
110
|
-
</div>
|
|
111
|
-
);
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
interface INewKnowledgeEntryProps {
|
|
115
|
-
defaultSubjectId?: string;
|
|
116
|
-
defaultPredicateId?: string;
|
|
117
|
-
frame: IDoc<IKnowledgeFrame>;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
const NewKnowledgeEntry = (props: INewKnowledgeEntryProps) => {
|
|
121
|
-
const { defaultSubjectId, defaultPredicateId, frame } = props;
|
|
122
|
-
|
|
123
|
-
const valueStr = useObservableState('', true);
|
|
124
|
-
|
|
125
|
-
const addKnowledgeEntry = async (e: React.FormEvent) => {
|
|
126
|
-
e.preventDefault();
|
|
127
|
-
const value = valueStr().trim();
|
|
128
|
-
throw new Error('Not implemented');
|
|
129
|
-
// const entry = await KnowledgeValues().insert({
|
|
130
|
-
// knowledgeValueId: newid(),
|
|
131
|
-
// peerTypeId: 'string',
|
|
132
|
-
// value,
|
|
133
|
-
// // predicateId: defaultPredicateId,
|
|
134
|
-
// // subjectId: defaultSubjectId,
|
|
135
|
-
// // modified: Date.now(),
|
|
136
|
-
|
|
137
|
-
// });
|
|
138
|
-
|
|
139
|
-
// frame.knowledgeValueIds = [...frame.knowledgeValueIds, entry.knowledgeValueId];
|
|
140
|
-
// await frame.save();
|
|
141
|
-
// valueStr('');
|
|
142
|
-
};
|
|
143
|
-
|
|
144
|
-
return (
|
|
145
|
-
<div>
|
|
146
|
-
<form
|
|
147
|
-
onSubmit={addKnowledgeEntry}
|
|
148
|
-
>
|
|
149
|
-
<Input
|
|
150
|
-
value={valueStr}
|
|
151
|
-
className="form-control sm"
|
|
152
|
-
type="text"
|
|
153
|
-
placeholder="Add Entry"
|
|
154
|
-
/>
|
|
155
|
-
</form>
|
|
156
|
-
|
|
157
|
-
</div>
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
|
|
@@ -1,176 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
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
|
-
};
|
|
@@ -1,181 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
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
|
-
});
|