@riboseinc/paneron-registry-kit 2.0.0-dev9 → 2.0.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/common.d.ts +1 -1
- package/common.js +1 -1
- package/common.js.map +1 -1
- package/index.d.ts +3 -3
- package/index.js +3 -3
- package/index.js.map +1 -1
- package/package.json +26 -19
- package/types/cr.d.ts +216 -0
- package/types/cr.js +175 -0
- package/types/cr.js.map +1 -0
- package/types/index.d.ts +1 -0
- package/types/index.js +19 -0
- package/types/index.js.map +1 -1
- package/types/item.d.ts +13 -3
- package/types/item.js +11 -1
- package/types/item.js.map +1 -1
- package/types/proposal.d.ts +31 -14
- package/types/proposal.js +1 -1
- package/types/proposal.js.map +1 -1
- package/types/register.d.ts +6 -5
- package/types/register.js +19 -1
- package/types/register.js.map +1 -1
- package/types/registry.d.ts +8 -3
- package/types/registry.js +8 -1
- package/types/registry.js.map +1 -1
- package/types/stakeholder.d.ts +40 -16
- package/types/stakeholder.js +47 -3
- package/types/stakeholder.js.map +1 -1
- package/types/views.d.ts +98 -24
- package/types/views.js.map +1 -1
- package/views/AnnotatedChange.d.ts +7 -0
- package/views/AnnotatedChange.js +91 -0
- package/views/AnnotatedChange.js.map +1 -0
- package/views/BrowserCtx.d.ts +66 -2
- package/views/BrowserCtx.js +13 -2
- package/views/BrowserCtx.js.map +1 -1
- package/views/FilterCriteria/CRITERIA_CONFIGURATION.d.ts +13 -1
- package/views/FilterCriteria/CRITERIA_CONFIGURATION.js +178 -85
- package/views/FilterCriteria/CRITERIA_CONFIGURATION.js.map +1 -1
- package/views/FilterCriteria/criteriaGroupToQueryExpression.d.ts +4 -0
- package/views/FilterCriteria/criteriaGroupToQueryExpression.js +10 -3
- package/views/FilterCriteria/criteriaGroupToQueryExpression.js.map +1 -1
- package/views/FilterCriteria/criteriaGroupToSummary.js +7 -7
- package/views/FilterCriteria/criteriaGroupToSummary.js.map +1 -1
- package/views/FilterCriteria/criteriaToNodes.d.ts +9 -0
- package/views/FilterCriteria/criteriaToNodes.js +42 -28
- package/views/FilterCriteria/criteriaToNodes.js.map +1 -1
- package/views/FilterCriteria/index.d.ts +1 -0
- package/views/FilterCriteria/index.js +29 -21
- package/views/FilterCriteria/index.js.map +1 -1
- package/views/FilterCriteria/models.d.ts +29 -2
- package/views/FilterCriteria/models.js +17 -10
- package/views/FilterCriteria/models.js.map +1 -1
- package/views/FilterCriteria/mutateGroup.d.ts +4 -1
- package/views/FilterCriteria/mutateGroup.js +4 -3
- package/views/FilterCriteria/mutateGroup.js.map +1 -1
- package/views/GenericRelatedItemView.d.ts +1 -1
- package/views/GenericRelatedItemView.js +142 -102
- package/views/GenericRelatedItemView.js.map +1 -1
- package/views/RegisterStakeholder.d.ts +9 -0
- package/views/RegisterStakeholder.js +40 -0
- package/views/RegisterStakeholder.js.map +1 -0
- package/views/RegisterVersion.d.ts +9 -0
- package/views/RegisterVersion.js +41 -0
- package/views/RegisterVersion.js.map +1 -0
- package/views/SearchQuery.d.ts +13 -0
- package/views/SearchQuery.js +137 -0
- package/views/SearchQuery.js.map +1 -0
- package/views/change-request/ChangeRequestContext.d.ts +20 -0
- package/views/change-request/ChangeRequestContext.js +56 -0
- package/views/change-request/ChangeRequestContext.js.map +1 -0
- package/views/change-request/Proposals.d.ts +21 -0
- package/views/change-request/Proposals.js +331 -0
- package/views/change-request/Proposals.js.map +1 -0
- package/views/change-request/objectChangeset.d.ts +31 -0
- package/views/change-request/objectChangeset.js +229 -0
- package/views/change-request/objectChangeset.js.map +1 -0
- package/views/detail/ChangeRequest/Proposal.d.ts +0 -0
- package/views/detail/ChangeRequest/Proposal.js +142 -0
- package/views/detail/ChangeRequest/Proposal.js.map +1 -0
- package/views/detail/ChangeRequest/index.d.ts +13 -0
- package/views/detail/ChangeRequest/index.js +207 -0
- package/views/detail/ChangeRequest/index.js.map +1 -0
- package/views/detail/ChangeRequest/transitions.d.ts +28 -0
- package/views/detail/ChangeRequest/transitions.js +530 -0
- package/views/detail/ChangeRequest/transitions.js.map +1 -0
- package/views/detail/CustomView/index.d.ts +13 -0
- package/views/detail/CustomView/index.js +68 -0
- package/views/detail/CustomView/index.js.map +1 -0
- package/views/detail/RegisterHome/index.d.ts +5 -0
- package/views/detail/RegisterHome/index.js +128 -0
- package/views/detail/RegisterHome/index.js.map +1 -0
- package/views/detail/RegisterItem/RelatedItems.d.ts +13 -0
- package/views/detail/RegisterItem/RelatedItems.js +61 -0
- package/views/detail/RegisterItem/RelatedItems.js.map +1 -0
- package/views/detail/RegisterItem/SupersedingItemMenu.d.ts +13 -0
- package/views/detail/RegisterItem/SupersedingItemMenu.js +56 -0
- package/views/detail/RegisterItem/SupersedingItemMenu.js.map +1 -0
- package/views/detail/RegisterItem/index.d.ts +13 -0
- package/views/detail/RegisterItem/index.js +356 -0
- package/views/detail/RegisterItem/index.js.map +1 -0
- package/views/detail/RegisterMeta/RegisterMetaForm.d.ts +10 -0
- package/views/detail/RegisterMeta/RegisterMetaForm.js +331 -0
- package/views/detail/RegisterMeta/RegisterMetaForm.js.map +1 -0
- package/views/detail/RegisterMeta/index.d.ts +10 -0
- package/views/detail/RegisterMeta/index.js +111 -0
- package/views/detail/RegisterMeta/index.js.map +1 -0
- package/views/detail/index.d.ts +1 -0
- package/views/detail/index.js +24 -0
- package/views/detail/index.js.map +1 -0
- package/views/diffing/InlineDiff.d.ts +12 -0
- package/views/diffing/InlineDiff.js +58 -0
- package/views/diffing/InlineDiff.js.map +1 -0
- package/views/diffing/StructuredDiff.d.ts +11 -0
- package/views/diffing/StructuredDiff.js +65 -0
- package/views/diffing/StructuredDiff.js.map +1 -0
- package/views/hooks/useCustomView.d.ts +3 -0
- package/views/hooks/useCustomView.js +24 -0
- package/views/hooks/useCustomView.js.map +1 -0
- package/views/hooks/useItemClassConfig.d.ts +3 -0
- package/views/hooks/useItemClassConfig.js +24 -0
- package/views/hooks/useItemClassConfig.js.map +1 -0
- package/views/hooks/useItemRef.d.ts +3 -0
- package/views/hooks/useItemRef.js +39 -0
- package/views/hooks/useItemRef.js.map +1 -0
- package/views/hooks/useSingleRegisterItemData.d.ts +3 -0
- package/views/hooks/useSingleRegisterItemData.js +32 -0
- package/views/hooks/useSingleRegisterItemData.js.map +1 -0
- package/views/index.d.ts +2 -2
- package/views/index.js +161 -130
- package/views/index.js.map +1 -1
- package/views/itemPathUtils.d.ts +45 -2
- package/views/itemPathUtils.js +101 -14
- package/views/itemPathUtils.js.map +1 -1
- package/views/itemQueryUtils.d.ts +11 -0
- package/views/itemQueryUtils.js +48 -0
- package/views/itemQueryUtils.js.map +1 -0
- package/views/protocolRegistry.d.ts +12 -0
- package/views/protocolRegistry.js +42 -0
- package/views/protocolRegistry.js.map +1 -0
- package/views/sidebar/Browse/index.d.ts +11 -0
- package/views/sidebar/Browse/index.js +453 -0
- package/views/sidebar/Browse/index.js.map +1 -0
- package/views/sidebar/Export/index.d.ts +5 -0
- package/views/sidebar/Export/index.js +94 -0
- package/views/sidebar/Export/index.js.map +1 -0
- package/views/sidebar/ListItem.d.ts +10 -0
- package/views/sidebar/ListItem.js +43 -0
- package/views/sidebar/ListItem.js.map +1 -0
- package/views/sidebar/Registration/index.d.ts +5 -0
- package/views/sidebar/Registration/index.js +163 -0
- package/views/sidebar/Registration/index.js.map +1 -0
- package/views/sidebar/Search/index.d.ts +18 -0
- package/views/sidebar/Search/index.js +177 -0
- package/views/sidebar/Search/index.js.map +1 -0
- package/views/sidebar/index.d.ts +6 -0
- package/views/sidebar/index.js +104 -0
- package/views/sidebar/index.js.map +1 -0
- package/views/util.d.ts +29 -5
- package/views/util.js +92 -6
- package/views/util.js.map +1 -1
- package/views/ChangeRequest.d.ts +0 -12
- package/views/ChangeRequest.js +0 -689
- package/views/ChangeRequest.js.map +0 -1
- package/views/ItemBrowser.d.ts +0 -12
- package/views/ItemBrowser.js +0 -258
- package/views/ItemBrowser.js.map +0 -1
- package/views/ItemDetails.d.ts +0 -14
- package/views/ItemDetails.js +0 -128
- package/views/ItemDetails.js.map +0 -1
- package/views/MainView.d.ts +0 -8
- package/views/MainView.js +0 -34
- package/views/MainView.js.map +0 -1
- package/views/RegisterInformation.d.ts +0 -7
- package/views/RegisterInformation.js +0 -264
- package/views/RegisterInformation.js.map +0 -1
- package/views/RegisterItemGrid.d.ts +0 -25
- package/views/RegisterItemGrid.js +0 -276
- package/views/RegisterItemGrid.js.map +0 -1
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _react2 = require("@emotion/react");
|
|
11
|
+
|
|
12
|
+
var _core = require("@blueprintjs/core");
|
|
13
|
+
|
|
14
|
+
var _popover = require("@blueprintjs/popover2");
|
|
15
|
+
|
|
16
|
+
var _context = require("@riboseinc/paneron-extension-kit/context");
|
|
17
|
+
|
|
18
|
+
var _context2 = require("@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context");
|
|
19
|
+
|
|
20
|
+
var _SearchResultList = _interopRequireDefault(require("@riboseinc/paneron-extension-kit/widgets/SearchResultList"));
|
|
21
|
+
|
|
22
|
+
var _criteriaGroupToQueryExpression = _interopRequireDefault(require("../../FilterCriteria/criteriaGroupToQueryExpression"));
|
|
23
|
+
|
|
24
|
+
var _CRITERIA_CONFIGURATION = _interopRequireDefault(require("../../FilterCriteria/CRITERIA_CONFIGURATION"));
|
|
25
|
+
|
|
26
|
+
var _itemPathUtils = require("../../itemPathUtils");
|
|
27
|
+
|
|
28
|
+
var _itemQueryUtils = require("../../itemQueryUtils");
|
|
29
|
+
|
|
30
|
+
var _ChangeRequestContext = require("../../change-request/ChangeRequestContext");
|
|
31
|
+
|
|
32
|
+
var _objectChangeset = require("../../change-request/objectChangeset");
|
|
33
|
+
|
|
34
|
+
var _BrowserCtx = require("../../BrowserCtx");
|
|
35
|
+
|
|
36
|
+
var _ListItem = _interopRequireDefault(require("../ListItem"));
|
|
37
|
+
|
|
38
|
+
var _protocolRegistry = require("../../protocolRegistry");
|
|
39
|
+
|
|
40
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
41
|
+
|
|
42
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
43
|
+
|
|
44
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
45
|
+
|
|
46
|
+
/** @jsx jsx */
|
|
47
|
+
|
|
48
|
+
/** @jsxFrag React.Fragment */
|
|
49
|
+
const Browse = function ({
|
|
50
|
+
stateName,
|
|
51
|
+
onOpenItem,
|
|
52
|
+
className,
|
|
53
|
+
style
|
|
54
|
+
}) {
|
|
55
|
+
const {
|
|
56
|
+
performOperation,
|
|
57
|
+
updateObjects,
|
|
58
|
+
makeRandomID,
|
|
59
|
+
usePersistentDatasetStateReducer
|
|
60
|
+
} = (0, _react.useContext)(_context.DatasetContext);
|
|
61
|
+
const {
|
|
62
|
+
spawnTab,
|
|
63
|
+
focusedTabURI
|
|
64
|
+
} = (0, _react.useContext)(_context2.TabbedWorkspaceContext);
|
|
65
|
+
const {
|
|
66
|
+
keyExpression,
|
|
67
|
+
itemClasses,
|
|
68
|
+
subregisters
|
|
69
|
+
} = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
|
|
70
|
+
const {
|
|
71
|
+
changeRequest: activeCR,
|
|
72
|
+
canEdit: activeCRIsEditable
|
|
73
|
+
} = (0, _react.useContext)(_ChangeRequestContext.ChangeRequestContext);
|
|
74
|
+
const [state, dispatch] = usePersistentDatasetStateReducer(stateName ?? 'browse-sidebar', undefined, function valdateState(loadedValue) {
|
|
75
|
+
function validateFolderID(foldID) {
|
|
76
|
+
return foldID !== undefined && (foldID === null || foldID.startsWith('by-item-class/') || foldID.startsWith('by-subregister/'));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return validateFolderID(loadedValue.enteredFolderID) && validateFolderID(loadedValue.selectedFolderID) && loadedValue.selectedItemPath !== undefined;
|
|
80
|
+
}, (prevState, action) => {
|
|
81
|
+
switch (action.type) {
|
|
82
|
+
case 'select-folder':
|
|
83
|
+
if (prevState.enteredFolderID !== null) {
|
|
84
|
+
return prevState;
|
|
85
|
+
} else {
|
|
86
|
+
return { ...prevState,
|
|
87
|
+
selectedFolderID: action.payload.id
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
case 'enter-folder':
|
|
92
|
+
if (prevState.enteredFolderID === null) {
|
|
93
|
+
return { ...prevState,
|
|
94
|
+
selectedFolderID: action.payload.id,
|
|
95
|
+
enteredFolderID: action.payload.id
|
|
96
|
+
};
|
|
97
|
+
} else {
|
|
98
|
+
return prevState;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
case 'exit-folder':
|
|
102
|
+
if (prevState.enteredFolderID !== null) {
|
|
103
|
+
return { ...prevState,
|
|
104
|
+
enteredFolderID: null,
|
|
105
|
+
selectedItemPath: null
|
|
106
|
+
};
|
|
107
|
+
} else {
|
|
108
|
+
return prevState;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
case 'select-item':
|
|
112
|
+
if (prevState.enteredFolderID && prevState.selectedFolderID) {
|
|
113
|
+
return { ...prevState,
|
|
114
|
+
selectedItemPath: action.payload.itemPath
|
|
115
|
+
};
|
|
116
|
+
} else {
|
|
117
|
+
return prevState;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
default:
|
|
121
|
+
throw new Error("Unexpected browse state");
|
|
122
|
+
}
|
|
123
|
+
}, {
|
|
124
|
+
selectedFolderID: null,
|
|
125
|
+
enteredFolderID: null,
|
|
126
|
+
selectedItemPath: null
|
|
127
|
+
}, null); // If currently focused tab changed, select corresponding item in view
|
|
128
|
+
|
|
129
|
+
(0, _react.useEffect)(() => {
|
|
130
|
+
if (focusedTabURI) {
|
|
131
|
+
const [proto, itemPath] = focusedTabURI.split(':'); // TODO: also check entered folder?
|
|
132
|
+
|
|
133
|
+
if (proto === _protocolRegistry.Protocols.ITEM_DETAILS) {
|
|
134
|
+
dispatch({
|
|
135
|
+
type: 'select-item',
|
|
136
|
+
payload: {
|
|
137
|
+
itemPath
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}, [focusedTabURI]);
|
|
143
|
+
|
|
144
|
+
async function handleAdd(classID, subregisterID) {
|
|
145
|
+
if (!updateObjects || !makeRandomID || !activeCRIsEditable || !activeCR) {
|
|
146
|
+
throw new Error("Unable to create item: likely current proposal is not editable or dataset is read-only");
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (subregisters && !subregisterID) {
|
|
150
|
+
throw new Error("Unable to create item: register uses subregisters, but subregister ID was not provided");
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const clsConfig = itemClasses[classID];
|
|
154
|
+
|
|
155
|
+
if (!clsConfig) {
|
|
156
|
+
throw new Error("Unable to generate new item data: item class configuration is missing");
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const initialItemData = (clsConfig === null || clsConfig === void 0 ? void 0 : clsConfig.defaults) ?? {};
|
|
160
|
+
const itemID = await makeRandomID();
|
|
161
|
+
const ref = {
|
|
162
|
+
classID,
|
|
163
|
+
itemID,
|
|
164
|
+
subregisterID
|
|
165
|
+
};
|
|
166
|
+
const registerItem = {
|
|
167
|
+
id: itemID,
|
|
168
|
+
dateAccepted: new Date(),
|
|
169
|
+
status: 'valid',
|
|
170
|
+
data: initialItemData
|
|
171
|
+
};
|
|
172
|
+
const itemPath = (0, _itemPathUtils.itemRefToItemPath)(ref);
|
|
173
|
+
await updateObjects({
|
|
174
|
+
commitMessage: `propose to add new ${ref.classID}`,
|
|
175
|
+
objectChangeset: (0, _objectChangeset.updateCRObjectChangeset)(activeCR, {
|
|
176
|
+
[itemPath]: {
|
|
177
|
+
type: 'addition'
|
|
178
|
+
}
|
|
179
|
+
}, {
|
|
180
|
+
[itemPath]: registerItem
|
|
181
|
+
}),
|
|
182
|
+
_dangerouslySkipValidation: true
|
|
183
|
+
});
|
|
184
|
+
spawnTab(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${(0, _itemPathUtils.itemRefToItemPath)(ref, activeCR.id)}`);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (state.enteredFolderID !== null) {
|
|
188
|
+
// If we are in a folder, show a tree with a single element
|
|
189
|
+
// indicating currently entered folder
|
|
190
|
+
// followed by windowed search result list
|
|
191
|
+
// with query according to the folder (item class, subregister)
|
|
192
|
+
let criteria;
|
|
193
|
+
let folderInfo;
|
|
194
|
+
|
|
195
|
+
if (state.enteredFolderID.startsWith('by-item-class/')) {
|
|
196
|
+
var _clsConfig$meta;
|
|
197
|
+
|
|
198
|
+
const classID = state.enteredFolderID.split('/')[1];
|
|
199
|
+
const clsConfig = itemClasses[classID];
|
|
200
|
+
folderInfo = {
|
|
201
|
+
title: (clsConfig === null || clsConfig === void 0 ? void 0 : (_clsConfig$meta = clsConfig.meta) === null || _clsConfig$meta === void 0 ? void 0 : _clsConfig$meta.title) ?? classID,
|
|
202
|
+
moreMenu: clsConfig ? (0, _react2.jsx)(ItemClassMenu, {
|
|
203
|
+
cfg: itemClasses[classID],
|
|
204
|
+
onCreate: !subregisters && activeCRIsEditable && performOperation ? () => performOperation('generating new item', handleAdd)(classID) : undefined
|
|
205
|
+
}) : undefined
|
|
206
|
+
};
|
|
207
|
+
criteria = {
|
|
208
|
+
require: 'all',
|
|
209
|
+
criteria: [{
|
|
210
|
+
key: 'item-class',
|
|
211
|
+
query: _CRITERIA_CONFIGURATION.default['item-class'].toQuery({
|
|
212
|
+
classID
|
|
213
|
+
}, {
|
|
214
|
+
itemClasses,
|
|
215
|
+
subregisters
|
|
216
|
+
})
|
|
217
|
+
}]
|
|
218
|
+
};
|
|
219
|
+
} else if (subregisters && state.enteredFolderID.startsWith('by-subregister/')) {
|
|
220
|
+
const subregisterID = state.enteredFolderID.split('/')[1];
|
|
221
|
+
const subregConfig = subregisters[subregisterID];
|
|
222
|
+
folderInfo = {
|
|
223
|
+
title: (subregConfig === null || subregConfig === void 0 ? void 0 : subregConfig.title) ?? subregisterID,
|
|
224
|
+
moreMenu: subregConfig ? (0, _react2.jsx)(SubregisterMenu, {
|
|
225
|
+
cfg: subregConfig,
|
|
226
|
+
itemClasses: itemClasses,
|
|
227
|
+
onCreate: activeCRIsEditable && performOperation ? clsID => performOperation('generating new item', handleAdd)(clsID, subregisterID) : undefined
|
|
228
|
+
}) : undefined
|
|
229
|
+
};
|
|
230
|
+
criteria = {
|
|
231
|
+
require: 'all',
|
|
232
|
+
criteria: [{
|
|
233
|
+
key: 'subregister',
|
|
234
|
+
query: _CRITERIA_CONFIGURATION.default['subregister'].toQuery({
|
|
235
|
+
subregisterID
|
|
236
|
+
}, {
|
|
237
|
+
itemClasses,
|
|
238
|
+
subregisters
|
|
239
|
+
})
|
|
240
|
+
}]
|
|
241
|
+
};
|
|
242
|
+
} else {
|
|
243
|
+
folderInfo = {
|
|
244
|
+
title: ''
|
|
245
|
+
};
|
|
246
|
+
criteria = {
|
|
247
|
+
require: 'all',
|
|
248
|
+
criteria: []
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const queryExpression = (0, _criteriaGroupToQueryExpression.default)(criteria);
|
|
253
|
+
return (0, _react2.jsx)("div", {
|
|
254
|
+
css: (0, _react2.css)`display: flex; flex-flow: column nowrap;`,
|
|
255
|
+
className: className,
|
|
256
|
+
style: style
|
|
257
|
+
}, (0, _react2.jsx)(_core.Tree, {
|
|
258
|
+
css: (0, _react2.css)`flex: 0;`,
|
|
259
|
+
onNodeClick: () => dispatch({
|
|
260
|
+
type: 'select-item',
|
|
261
|
+
payload: {
|
|
262
|
+
itemPath: null
|
|
263
|
+
}
|
|
264
|
+
}),
|
|
265
|
+
onNodeCollapse: () => dispatch({
|
|
266
|
+
type: 'exit-folder'
|
|
267
|
+
}),
|
|
268
|
+
onNodeDoubleClick: () => dispatch({
|
|
269
|
+
type: 'exit-folder'
|
|
270
|
+
}),
|
|
271
|
+
contents: [{
|
|
272
|
+
id: 'opened-class',
|
|
273
|
+
isSelected: state.selectedItemPath === null,
|
|
274
|
+
isExpanded: true,
|
|
275
|
+
hasCaret: true,
|
|
276
|
+
icon: 'folder-open',
|
|
277
|
+
label: folderInfo.title,
|
|
278
|
+
secondaryLabel: folderInfo.moreMenu ? (0, _react2.jsx)(MoreMenu, null, folderInfo.moreMenu) : undefined
|
|
279
|
+
}]
|
|
280
|
+
}), (0, _react2.jsx)("div", {
|
|
281
|
+
css: (0, _react2.css)`flex: 1;`
|
|
282
|
+
}, (0, _react2.jsx)(SearchResultList, {
|
|
283
|
+
queryExpression: (0, _itemQueryUtils.getRegisterItemQuery)(queryExpression, activeCR ?? undefined),
|
|
284
|
+
keyExpression: keyExpression,
|
|
285
|
+
selectedItemPath: state.selectedItemPath,
|
|
286
|
+
onSelectItem: itemPath => dispatch({
|
|
287
|
+
type: 'select-item',
|
|
288
|
+
payload: {
|
|
289
|
+
itemPath
|
|
290
|
+
}
|
|
291
|
+
}),
|
|
292
|
+
onOpenItem: onOpenItem ?? (itemPath => spawnTab(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${itemPath}`))
|
|
293
|
+
})));
|
|
294
|
+
} else {
|
|
295
|
+
// If we are *not* in a folder, show a list of available folders/views
|
|
296
|
+
// (item classes, subregisters)
|
|
297
|
+
const contents = [{
|
|
298
|
+
id: 'by-item-class',
|
|
299
|
+
isExpanded: true,
|
|
300
|
+
hasCaret: false,
|
|
301
|
+
icon: 'filter',
|
|
302
|
+
label: "By item class",
|
|
303
|
+
disabled: true,
|
|
304
|
+
nodeData: {
|
|
305
|
+
folderID: null
|
|
306
|
+
}
|
|
307
|
+
}, ...Object.entries(itemClasses).map(([classID, classConfig]) => ({
|
|
308
|
+
isSelected: state.selectedFolderID === `by-item-class/${classID}`,
|
|
309
|
+
id: classID,
|
|
310
|
+
isExpanded: false,
|
|
311
|
+
icon: 'folder-close',
|
|
312
|
+
hasCaret: true,
|
|
313
|
+
label: classConfig.meta.title,
|
|
314
|
+
nodeData: {
|
|
315
|
+
folderID: `by-item-class/${classID}`
|
|
316
|
+
},
|
|
317
|
+
secondaryLabel: (0, _react2.jsx)(MoreMenu, null, (0, _react2.jsx)(ItemClassMenu, {
|
|
318
|
+
cfg: classConfig,
|
|
319
|
+
onCreate: !subregisters && activeCRIsEditable && performOperation ? () => performOperation('generating new item', handleAdd)(classID) : undefined
|
|
320
|
+
}))
|
|
321
|
+
})), ...(subregisters ? [{
|
|
322
|
+
id: 'by-subregister',
|
|
323
|
+
isExpanded: true,
|
|
324
|
+
hasCaret: false,
|
|
325
|
+
disabled: true,
|
|
326
|
+
icon: 'filter',
|
|
327
|
+
label: "By subregister",
|
|
328
|
+
nodeData: {
|
|
329
|
+
folderID: null
|
|
330
|
+
}
|
|
331
|
+
}, ...Object.entries(subregisters).map(([subregisterID, subregisterConfig]) => ({
|
|
332
|
+
isSelected: state.selectedFolderID === `by-subregister/${subregisterID}`,
|
|
333
|
+
id: subregisterID,
|
|
334
|
+
isExpanded: false,
|
|
335
|
+
icon: 'folder-close',
|
|
336
|
+
hasCaret: true,
|
|
337
|
+
label: subregisterConfig.title,
|
|
338
|
+
nodeData: {
|
|
339
|
+
folderID: `by-subregister/${subregisterID}`
|
|
340
|
+
},
|
|
341
|
+
secondaryLabel: (0, _react2.jsx)(MoreMenu, null, (0, _react2.jsx)(SubregisterMenu, {
|
|
342
|
+
cfg: subregisterConfig,
|
|
343
|
+
itemClasses: itemClasses,
|
|
344
|
+
onCreate: activeCRIsEditable && performOperation ? clsID => performOperation('generating new item', handleAdd)(clsID, subregisterID) : undefined
|
|
345
|
+
}))
|
|
346
|
+
}))] : [])];
|
|
347
|
+
|
|
348
|
+
if (subregisters) {
|
|
349
|
+
contents.push();
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
return (0, _react2.jsx)(_core.Tree, {
|
|
353
|
+
css: (0, _react2.css)`flex: 1;`,
|
|
354
|
+
className: className,
|
|
355
|
+
onNodeClick: node => {
|
|
356
|
+
var _node$nodeData;
|
|
357
|
+
|
|
358
|
+
return (_node$nodeData = node.nodeData) !== null && _node$nodeData !== void 0 && _node$nodeData.folderID ? dispatch({
|
|
359
|
+
type: 'select-folder',
|
|
360
|
+
payload: {
|
|
361
|
+
id: node.nodeData.folderID
|
|
362
|
+
}
|
|
363
|
+
}) : void 0;
|
|
364
|
+
},
|
|
365
|
+
onNodeExpand: node => {
|
|
366
|
+
var _node$nodeData2;
|
|
367
|
+
|
|
368
|
+
return (_node$nodeData2 = node.nodeData) !== null && _node$nodeData2 !== void 0 && _node$nodeData2.folderID ? dispatch({
|
|
369
|
+
type: 'enter-folder',
|
|
370
|
+
payload: {
|
|
371
|
+
id: node.nodeData.folderID
|
|
372
|
+
}
|
|
373
|
+
}) : void 0;
|
|
374
|
+
},
|
|
375
|
+
onNodeDoubleClick: node => {
|
|
376
|
+
var _node$nodeData3;
|
|
377
|
+
|
|
378
|
+
return (_node$nodeData3 = node.nodeData) !== null && _node$nodeData3 !== void 0 && _node$nodeData3.folderID ? dispatch({
|
|
379
|
+
type: 'enter-folder',
|
|
380
|
+
payload: {
|
|
381
|
+
id: node.nodeData.folderID
|
|
382
|
+
}
|
|
383
|
+
}) : void 0;
|
|
384
|
+
},
|
|
385
|
+
contents: contents
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
const MoreMenu = function ({
|
|
391
|
+
children
|
|
392
|
+
}) {
|
|
393
|
+
return (0, _react2.jsx)(_popover.Popover2, {
|
|
394
|
+
minimal: true,
|
|
395
|
+
content: (0, _react2.jsx)(_react.default.Fragment, null, children)
|
|
396
|
+
}, (0, _react2.jsx)(_core.Button, {
|
|
397
|
+
icon: "more",
|
|
398
|
+
small: true,
|
|
399
|
+
minimal: true
|
|
400
|
+
}));
|
|
401
|
+
};
|
|
402
|
+
|
|
403
|
+
const SubregisterMenu = function ({
|
|
404
|
+
cfg,
|
|
405
|
+
itemClasses,
|
|
406
|
+
onCreate
|
|
407
|
+
}) {
|
|
408
|
+
return (0, _react2.jsx)(_core.Menu, null, (0, _react2.jsx)(_core.MenuDivider, {
|
|
409
|
+
title: `Item classes in ${cfg.title}`
|
|
410
|
+
}), cfg.itemClasses.map(classID => {
|
|
411
|
+
var _itemClasses$classID, _itemClasses$classID$;
|
|
412
|
+
|
|
413
|
+
return (0, _react2.jsx)(_core.MenuItem, {
|
|
414
|
+
text: ((_itemClasses$classID = itemClasses[classID]) === null || _itemClasses$classID === void 0 ? void 0 : (_itemClasses$classID$ = _itemClasses$classID.meta) === null || _itemClasses$classID$ === void 0 ? void 0 : _itemClasses$classID$.title) ?? classID,
|
|
415
|
+
key: classID
|
|
416
|
+
}, (0, _react2.jsx)(ItemClassMenu, {
|
|
417
|
+
cfg: itemClasses[classID],
|
|
418
|
+
onCreate: onCreate ? () => onCreate(classID) : undefined
|
|
419
|
+
}));
|
|
420
|
+
}));
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
const ItemClassMenu = function ({
|
|
424
|
+
cfg,
|
|
425
|
+
onCreate
|
|
426
|
+
}) {
|
|
427
|
+
return (0, _react2.jsx)(_core.Menu, null, (0, _react2.jsx)(_core.MenuDivider, {
|
|
428
|
+
title: "About this class"
|
|
429
|
+
}), (0, _react2.jsx)(_core.MenuItem, {
|
|
430
|
+
multiline: true,
|
|
431
|
+
disabled: true,
|
|
432
|
+
css: (0, _react2.css)`max-width: 400px`,
|
|
433
|
+
text: cfg.meta.description
|
|
434
|
+
}), onCreate ? (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)(_core.MenuDivider, {
|
|
435
|
+
title: "Quick actions"
|
|
436
|
+
}), (0, _react2.jsx)(_core.MenuItem, {
|
|
437
|
+
text: "Propose new",
|
|
438
|
+
intent: "primary",
|
|
439
|
+
onClick: onCreate,
|
|
440
|
+
icon: "plus"
|
|
441
|
+
})) : null);
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
const SearchResultList = (0, _SearchResultList.default)(_ListItem.default, objPath => ({
|
|
445
|
+
name: 'reg. item',
|
|
446
|
+
iconProps: {
|
|
447
|
+
icon: 'document',
|
|
448
|
+
title: objPath,
|
|
449
|
+
htmlTitle: `Icon for item at ${objPath}`
|
|
450
|
+
}
|
|
451
|
+
}));
|
|
452
|
+
var _default = Browse;
|
|
453
|
+
exports.default = _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Browse/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useEffect } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Button, IconName, Menu, MenuItem, MenuDivider, Tree, TreeNodeInfo } from '@blueprintjs/core';\nimport { Popover2 } from '@blueprintjs/popover2';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\nimport makeSearchResultList from '@riboseinc/paneron-extension-kit/widgets/SearchResultList';\n\nimport type { CriteriaGroup } from '../../FilterCriteria/models';\nimport criteriaGroupToQueryExpression from '../../FilterCriteria/criteriaGroupToQueryExpression';\nimport CRITERIA_CONFIGURATION from '../../FilterCriteria/CRITERIA_CONFIGURATION';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { getRegisterItemQuery } from '../../itemQueryUtils';\nimport { ChangeRequestContext } from '../../change-request/ChangeRequestContext';\nimport { updateCRObjectChangeset } from '../../change-request/objectChangeset';\nimport type { RegisterItem, InternalItemReference } from '../../../types';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport ListItem from '../ListItem';\nimport { Protocols } from '../../protocolRegistry';\n\n\ninterface BaseState {\n selectedFolderID: string | null\n selectedItemPath: string | null\n enteredFolderID: string | null\n}\ninterface FolderListState extends BaseState {\n enteredFolderID: null\n selectedItemPath: null\n}\ninterface ItemListState extends BaseState {\n enteredFolderID: string\n selectedFolderID: string\n}\ntype State = FolderListState | ItemListState\n\ntype Action =\n | { type: 'select-folder'; payload: { id: string | null; }; }\n | { type: 'enter-folder'; payload: { id: string; }; }\n | { type: 'exit-folder'; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\nconst Browse: React.FC<{\n availableClassIDs?: string[]\n onOpenItem?: (itemPath: string) => void\n stateName?: string\n className?: string\n style?: React.CSSProperties\n}> =\nfunction ({ stateName, onOpenItem, className, style }) {\n const { performOperation, updateObjects, makeRandomID, usePersistentDatasetStateReducer } = useContext(DatasetContext);\n const { spawnTab, focusedTabURI } = useContext(TabbedWorkspaceContext);\n const { keyExpression, itemClasses, subregisters } = useContext(BrowserCtx);\n const { changeRequest: activeCR, canEdit: activeCRIsEditable } = useContext(ChangeRequestContext);\n\n const [ state, dispatch, ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)(\n stateName ?? 'browse-sidebar',\n undefined,\n function valdateState(loadedValue): loadedValue is State {\n function validateFolderID(foldID: string) {\n return foldID !== undefined &&\n (\n foldID === null || (\n foldID.startsWith('by-item-class/') ||\n foldID.startsWith('by-subregister/')\n )\n )\n\n }\n return (\n validateFolderID(loadedValue.enteredFolderID) &&\n validateFolderID(loadedValue.selectedFolderID) &&\n loadedValue.selectedItemPath !== undefined\n );\n },\n (prevState, action) => {\n switch (action.type) {\n case 'select-folder':\n if (prevState.enteredFolderID !== null) {\n return prevState;\n } else {\n return {\n ...prevState,\n selectedFolderID: action.payload.id,\n };\n }\n case 'enter-folder':\n if (prevState.enteredFolderID === null) {\n return {\n ...prevState,\n selectedFolderID: action.payload.id,\n enteredFolderID: action.payload.id,\n };\n } else {\n return prevState;\n }\n case 'exit-folder':\n if (prevState.enteredFolderID !== null) {\n return {\n ...prevState,\n enteredFolderID: null,\n selectedItemPath: null,\n };\n } else {\n return prevState;\n }\n case 'select-item':\n if (prevState.enteredFolderID && prevState.selectedFolderID) {\n return {\n ...prevState,\n selectedItemPath: action.payload.itemPath,\n };\n } else {\n return prevState;\n }\n default:\n throw new Error(\"Unexpected browse state\");\n }\n },\n {\n selectedFolderID: null,\n enteredFolderID: null,\n selectedItemPath: null,\n },\n null);\n\n // If currently focused tab changed, select corresponding item in view\n useEffect(() => {\n if (focusedTabURI) {\n const [proto, itemPath] = focusedTabURI.split(':');\n // TODO: also check entered folder?\n if (proto === Protocols.ITEM_DETAILS) {\n dispatch({ type: 'select-item', payload: { itemPath } });\n }\n }\n }, [focusedTabURI]);\n\n async function handleAdd(classID: string, subregisterID?: string) {\n if (!updateObjects || !makeRandomID || !activeCRIsEditable || !activeCR) {\n throw new Error(\"Unable to create item: likely current proposal is not editable or dataset is read-only\");\n }\n if (subregisters && !subregisterID) {\n throw new Error(\"Unable to create item: register uses subregisters, but subregister ID was not provided\");\n }\n const clsConfig = itemClasses[classID];\n if (!clsConfig) {\n throw new Error(\"Unable to generate new item data: item class configuration is missing\");\n }\n const initialItemData = clsConfig?.defaults ?? {};\n const itemID = await makeRandomID();\n const ref: InternalItemReference = { classID, itemID, subregisterID };\n const registerItem: RegisterItem<any> = {\n id: itemID,\n dateAccepted: new Date(),\n status: 'valid',\n data: initialItemData,\n };\n const itemPath = itemRefToItemPath(ref);\n await updateObjects({\n commitMessage: `propose to add new ${ref.classID}`,\n objectChangeset: updateCRObjectChangeset(\n activeCR as any,\n { [itemPath]: { type: 'addition' } },\n { [itemPath]: registerItem },\n ),\n _dangerouslySkipValidation: true,\n });\n spawnTab(`${Protocols.ITEM_DETAILS}:${itemRefToItemPath(ref, activeCR.id)}`);\n }\n\n if (state.enteredFolderID !== null) {\n // If we are in a folder, show a tree with a single element\n // indicating currently entered folder\n // followed by windowed search result list\n // with query according to the folder (item class, subregister)\n\n let criteria: CriteriaGroup;\n let folderInfo: { title: string; moreMenu?: JSX.Element };\n\n if (state.enteredFolderID.startsWith('by-item-class/')) {\n const classID = state.enteredFolderID.split('/')[1];\n const clsConfig = itemClasses[classID];\n folderInfo = {\n title: clsConfig?.meta?.title ?? classID,\n moreMenu: clsConfig\n ? <ItemClassMenu\n cfg={itemClasses[classID]}\n onCreate={!subregisters && activeCRIsEditable && performOperation\n ? () => performOperation('generating new item', handleAdd)(classID)\n : undefined}\n />\n : undefined,\n };\n criteria = {\n require: 'all',\n criteria: [\n {\n key: 'item-class',\n query: CRITERIA_CONFIGURATION['item-class'].toQuery(\n { classID },\n { itemClasses, subregisters }),\n },\n ],\n };\n } else if (subregisters && state.enteredFolderID.startsWith('by-subregister/')) {\n const subregisterID = state.enteredFolderID.split('/')[1];\n const subregConfig = subregisters[subregisterID];\n folderInfo = {\n title: subregConfig?.title ?? subregisterID,\n moreMenu: subregConfig\n ? <SubregisterMenu\n cfg={subregConfig}\n itemClasses={itemClasses}\n onCreate={activeCRIsEditable && performOperation\n ? (clsID) => performOperation('generating new item', handleAdd)(clsID, subregisterID)\n : undefined}\n />\n : undefined,\n };\n criteria = {\n require: 'all',\n criteria: [\n {\n key: 'subregister',\n query: CRITERIA_CONFIGURATION['subregister'].toQuery(\n { subregisterID },\n { itemClasses, subregisters }),\n },\n ],\n };\n } else {\n folderInfo = { title: '' };\n criteria = { require: 'all', criteria: [] };\n }\n\n\n const queryExpression = criteriaGroupToQueryExpression(criteria);\n\n return (\n <div css={css`display: flex; flex-flow: column nowrap;`} className={className} style={style}>\n {/* */}\n <Tree\n css={css`flex: 0;`}\n onNodeClick={() => dispatch({ type: 'select-item', payload: { itemPath: null }})}\n onNodeCollapse={() => dispatch({ type: 'exit-folder' })}\n onNodeDoubleClick={() => dispatch({ type: 'exit-folder' })}\n contents={[{\n id: 'opened-class',\n isSelected: state.selectedItemPath === null,\n isExpanded: true,\n hasCaret: true,\n icon: 'folder-open',\n label: folderInfo.title,\n secondaryLabel: folderInfo.moreMenu ? <MoreMenu>{folderInfo.moreMenu}</MoreMenu> : undefined,\n }]}\n />\n <div css={css`flex: 1;`}>\n <SearchResultList\n queryExpression={getRegisterItemQuery(queryExpression, activeCR ?? undefined)}\n keyExpression={keyExpression}\n selectedItemPath={state.selectedItemPath}\n onSelectItem={itemPath => dispatch({ type: 'select-item', payload: { itemPath }})}\n onOpenItem={onOpenItem ?? (itemPath => spawnTab(`${Protocols.ITEM_DETAILS}:${itemPath}`))}\n />\n </div>\n </div>\n );\n } else {\n // If we are *not* in a folder, show a list of available folders/views\n // (item classes, subregisters)\n\n const contents: TreeNodeInfo<{ folderID: string | null }>[] = [{\n id: 'by-item-class',\n isExpanded: true,\n hasCaret: false,\n icon: 'filter',\n label: \"By item class\",\n disabled: true,\n nodeData: { folderID: null },\n }, ...Object.entries(itemClasses).map(([classID, classConfig]) => ({\n isSelected: state.selectedFolderID === `by-item-class/${classID}`,\n id: classID,\n isExpanded: false,\n icon: 'folder-close' as IconName,\n hasCaret: true,\n label: classConfig.meta.title,\n nodeData: { folderID: `by-item-class/${classID}` },\n secondaryLabel:\n <MoreMenu>\n <ItemClassMenu\n cfg={classConfig}\n onCreate={!subregisters && activeCRIsEditable && performOperation\n ? () => performOperation('generating new item', handleAdd)(classID)\n : undefined}\n />\n </MoreMenu>,\n })), ...(subregisters\n ? [{\n id: 'by-subregister',\n isExpanded: true,\n hasCaret: false,\n disabled: true,\n icon: 'filter' as IconName,\n label: \"By subregister\",\n nodeData: { folderID: null },\n }, ...Object.entries(subregisters).map(([subregisterID, subregisterConfig]) => ({\n isSelected: state.selectedFolderID === `by-subregister/${subregisterID}`,\n id: subregisterID,\n isExpanded: false,\n icon: 'folder-close' as IconName,\n hasCaret: true,\n label: subregisterConfig.title,\n nodeData: { folderID: `by-subregister/${subregisterID}` },\n secondaryLabel:\n <MoreMenu>\n <SubregisterMenu\n cfg={subregisterConfig}\n itemClasses={itemClasses}\n onCreate={activeCRIsEditable && performOperation\n ? (clsID) => performOperation('generating new item', handleAdd)(clsID, subregisterID)\n : undefined}\n />\n </MoreMenu>,\n }))]\n : [])\n ];\n if (subregisters) {\n contents.push()\n }\n return (\n <Tree\n css={css`flex: 1;`}\n className={className}\n onNodeClick={node => node.nodeData?.folderID\n ? dispatch({ type: 'select-folder', payload: { id: node.nodeData.folderID }})\n : void 0}\n onNodeExpand={node => node.nodeData?.folderID\n ? dispatch({ type: 'enter-folder', payload: { id: node.nodeData.folderID }})\n : void 0}\n onNodeDoubleClick={node => node.nodeData?.folderID\n ? dispatch({ type: 'enter-folder', payload: { id: node.nodeData.folderID }})\n : void 0}\n contents={contents}\n />\n );\n }\n};\n\n\nconst MoreMenu: React.FC<Record<never, never>> = function ({ children }) {\n return (\n <Popover2 minimal content={<>{children}</>}>\n <Button icon=\"more\" small minimal />\n </Popover2>\n );\n}\n\n\nconst SubregisterMenu: React.FC<{\n cfg: { title: string, itemClasses: string[] };\n itemClasses: BrowserCtx[\"itemClasses\"];\n onCreate?: (classID: string) => void;\n}> = function ({ cfg, itemClasses, onCreate }) {\n return (\n <Menu>\n <MenuDivider title={`Item classes in ${cfg.title}`} />\n {cfg.itemClasses.map(classID =>\n <MenuItem\n text={itemClasses[classID]?.meta?.title ?? classID}\n key={classID}>\n <ItemClassMenu\n cfg={itemClasses[classID]}\n onCreate={onCreate ? () => onCreate(classID) : undefined}\n />\n </MenuItem>\n )}\n </Menu>\n );\n}\n\n\nconst ItemClassMenu: React.FC<{\n cfg: BrowserCtx[\"itemClasses\"][string];\n onCreate?: () => void;\n}> = function ({ cfg, onCreate }) {\n return (\n <Menu>\n <MenuDivider title=\"About this class\" />\n <MenuItem multiline disabled css={css`max-width: 400px`} text={cfg.meta.description} />\n {onCreate\n ? <>\n <MenuDivider title=\"Quick actions\" />\n <MenuItem\n text=\"Propose new\"\n intent=\"primary\"\n onClick={onCreate} icon=\"plus\"\n />\n </>\n : null}\n </Menu>\n );\n}\n\n\nconst SearchResultList = makeSearchResultList<RegisterItem<any>>(ListItem, (objPath) => ({\n name: 'reg. item',\n iconProps: {\n icon: 'document',\n title: objPath,\n htmlTitle: `Icon for item at ${objPath}`\n }\n}));\n\n\nexport default Browse;\n"]}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.ExportSidebarBlock = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _react2 = require("@emotion/react");
|
|
11
|
+
|
|
12
|
+
var _core = require("@blueprintjs/core");
|
|
13
|
+
|
|
14
|
+
var _context = require("@riboseinc/paneron-extension-kit/context");
|
|
15
|
+
|
|
16
|
+
var _BrowserCtx = require("../../BrowserCtx");
|
|
17
|
+
|
|
18
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
19
|
+
|
|
20
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
21
|
+
|
|
22
|
+
/** @jsx jsx */
|
|
23
|
+
|
|
24
|
+
/** @jsxFrag React.Fragment */
|
|
25
|
+
const ExportSidebarBlock = function () {
|
|
26
|
+
const {
|
|
27
|
+
writeFileToFilesystem,
|
|
28
|
+
getObjectData,
|
|
29
|
+
getBlob
|
|
30
|
+
} = (0, _react.useContext)(_context.DatasetContext);
|
|
31
|
+
const {
|
|
32
|
+
selectedRegisterItem
|
|
33
|
+
} = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
|
|
34
|
+
|
|
35
|
+
async function handleExport(bufferData) {
|
|
36
|
+
if (!writeFileToFilesystem) {
|
|
37
|
+
throw new Error("Unable to export: filesystem write function unavailable");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
await writeFileToFilesystem({
|
|
41
|
+
dialogOpts: {
|
|
42
|
+
prompt: "Choose location to export to",
|
|
43
|
+
filters: [{
|
|
44
|
+
name: 'All files',
|
|
45
|
+
extensions: ['*']
|
|
46
|
+
}]
|
|
47
|
+
},
|
|
48
|
+
bufferData
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function getExportedData(formatConfig) {
|
|
53
|
+
if (!selectedRegisterItem) {
|
|
54
|
+
throw new Error("Unable to export item: current item data not available");
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!getBlob) {
|
|
58
|
+
throw new Error("Unable to export item: no blob helper");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (formatConfig) {
|
|
62
|
+
return await formatConfig.exportItem(selectedRegisterItem.item, {
|
|
63
|
+
getObjectData,
|
|
64
|
+
getBlob
|
|
65
|
+
});
|
|
66
|
+
} else {
|
|
67
|
+
return await getBlob(JSON.stringify(selectedRegisterItem.item));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (!selectedRegisterItem) {
|
|
72
|
+
return (0, _react2.jsx)(_react.default.Fragment, null);
|
|
73
|
+
} else {
|
|
74
|
+
var _selectedRegisterItem;
|
|
75
|
+
|
|
76
|
+
return (0, _react2.jsx)(_core.ButtonGroup, {
|
|
77
|
+
vertical: true,
|
|
78
|
+
fill: true
|
|
79
|
+
}, ((selectedRegisterItem === null || selectedRegisterItem === void 0 ? void 0 : (_selectedRegisterItem = selectedRegisterItem.itemClass) === null || _selectedRegisterItem === void 0 ? void 0 : _selectedRegisterItem.exportFormats) ?? []).map((exportFormat, idx) => (0, _react2.jsx)(_core.Button, {
|
|
80
|
+
fill: true,
|
|
81
|
+
key: idx,
|
|
82
|
+
alignText: "left",
|
|
83
|
+
onClick: async () => await handleExport(await getExportedData(exportFormat))
|
|
84
|
+
}, exportFormat.label)), (0, _react2.jsx)(_core.Button, {
|
|
85
|
+
fill: true,
|
|
86
|
+
alignText: "left",
|
|
87
|
+
onClick: async () => await handleExport(await getExportedData())
|
|
88
|
+
}, "JSON"));
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
exports.ExportSidebarBlock = ExportSidebarBlock;
|
|
93
|
+
var _default = ExportSidebarBlock;
|
|
94
|
+
exports.default = _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Export/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,CAAC,MAAM,kBAAkB,GAAmC;IAChE,MAAM,EAAE,qBAAqB,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACrF,MAAM,EAAE,oBAAoB,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAExD,KAAK,UAAU,YAAY,CAAC,UAAsB;QAChD,IAAI,CAAC,qBAAqB,EAAE;YAC1B,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;SAC5E;QAED,MAAM,qBAAqB,CAAC;YAC1B,UAAU,EAAE;gBACV,MAAM,EAAE,8BAA8B;gBACtC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;aACpD;YACD,UAAU;SACX,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,eAAe,CAAC,YAA6C;QAC1E,IAAI,CAAC,oBAAoB,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;SAC3E;QACD,IAAI,CAAC,OAAO,EAAE;YACZ,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;SAC1D;QACD,IAAI,YAAY,EAAE;YAChB,OAAO,MAAM,YAAY,CAAC,UAAU,CAAC,oBAAoB,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;SAC7F;aAAM;YACL,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;SACjE;IACH,CAAC;IAED,IAAI,CAAC,oBAAoB,EAAE;QACzB,OAAO,yBAAK,CAAC;KACd;SAAM;QACL,OAAO,CACN,IAAC,WAAW,IAAC,QAAQ,QAAC,IAAI;YACvB,CAAC,oBAAoB,EAAE,SAAS,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,GAAG,EAAE,EAAE,CAChF,IAAC,MAAM,IAAC,IAAI,QAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAC,MAAM,EAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,YAAY,CAAC,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC,IACjH,YAAY,CAAC,KAAK,CACZ,CACV;YACD,IAAC,MAAM,IAAC,IAAI,QAAC,SAAS,EAAC,MAAM,EAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,YAAY,CAAC,MAAM,eAAe,EAAE,CAAC,WAErF,CACG,CACd,CAAC;KACH;AACH,CAAC,CAAA;AAED,eAAe,kBAAkB,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport { jsx } from '@emotion/react';\nimport { Button, ButtonGroup } from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { ExportFormatConfiguration } from '../../../types';\nimport { BrowserCtx } from '../../BrowserCtx';\n\n\nexport const ExportSidebarBlock: React.FC<Record<never, never>> = function () {\n const { writeFileToFilesystem, getObjectData, getBlob } = useContext(DatasetContext);\n const { selectedRegisterItem } = useContext(BrowserCtx);\n\n async function handleExport(bufferData: Uint8Array) {\n if (!writeFileToFilesystem) {\n throw new Error(\"Unable to export: filesystem write function unavailable\");\n }\n\n await writeFileToFilesystem({\n dialogOpts: {\n prompt: \"Choose location to export to\",\n filters: [{ name: 'All files', extensions: ['*'] }],\n },\n bufferData,\n });\n }\n\n async function getExportedData(formatConfig?: ExportFormatConfiguration<any>): Promise<Uint8Array> {\n if (!selectedRegisterItem) {\n throw new Error(\"Unable to export item: current item data not available\");\n }\n if (!getBlob) {\n throw new Error(\"Unable to export item: no blob helper\");\n }\n if (formatConfig) {\n return await formatConfig.exportItem(selectedRegisterItem.item, { getObjectData, getBlob });\n } else {\n return await getBlob(JSON.stringify(selectedRegisterItem.item));\n }\n }\n\n if (!selectedRegisterItem) {\n return <></>;\n } else {\n return (\n <ButtonGroup vertical fill>\n {(selectedRegisterItem?.itemClass?.exportFormats ?? []).map((exportFormat, idx) =>\n <Button fill key={idx} alignText=\"left\" onClick={async () => await handleExport(await getExportedData(exportFormat))}>\n {exportFormat.label}\n </Button>\n )}\n <Button fill alignText=\"left\" onClick={async () => await handleExport(await getExportedData())}>\n JSON\n </Button>\n </ButtonGroup>\n );\n }\n}\n\nexport default ExportSidebarBlock;\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** @jsx jsx */
|
|
2
|
+
/** @jsxFrag React.Fragment */
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import type { RegisterItem } from '../../types';
|
|
5
|
+
/** Register item list view. */
|
|
6
|
+
declare const ListItem: React.FC<{
|
|
7
|
+
objectData: RegisterItem<any>;
|
|
8
|
+
objectPath: string;
|
|
9
|
+
}>;
|
|
10
|
+
export default ListItem;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
|
|
10
|
+
var _react2 = require("@emotion/react");
|
|
11
|
+
|
|
12
|
+
var _BrowserCtx = require("../BrowserCtx");
|
|
13
|
+
|
|
14
|
+
var _itemPathUtils = require("../itemPathUtils");
|
|
15
|
+
|
|
16
|
+
/** @jsx jsx */
|
|
17
|
+
|
|
18
|
+
/** @jsxFrag React.Fragment */
|
|
19
|
+
|
|
20
|
+
/** Register item list view. */
|
|
21
|
+
const ListItem = function ({
|
|
22
|
+
objectData,
|
|
23
|
+
objectPath
|
|
24
|
+
}) {
|
|
25
|
+
const {
|
|
26
|
+
subregisters,
|
|
27
|
+
getRelatedItemClassConfiguration
|
|
28
|
+
} = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
|
|
29
|
+
const itemRef = (0, _itemPathUtils.itemPathToItemRef)(subregisters !== undefined, objectPath);
|
|
30
|
+
const clsConfig = getRelatedItemClassConfiguration(itemRef.classID);
|
|
31
|
+
const ListItemView = clsConfig.itemView;
|
|
32
|
+
const itemPayload = objectData === null || objectData === void 0 ? void 0 : objectData.data;
|
|
33
|
+
const itemView = itemPayload ? (0, _react2.jsx)(ListItemView, {
|
|
34
|
+
itemData: itemPayload,
|
|
35
|
+
itemRef: itemRef
|
|
36
|
+
}) : (0, _react2.jsx)("span", {
|
|
37
|
+
css: (0, _react2.css)`opacity: .4`
|
|
38
|
+
}, "(missing item data at ", objectPath, ")");
|
|
39
|
+
return itemView;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
var _default = ListItem;
|
|
43
|
+
exports.default = _default;
|