@riboseinc/paneron-registry-kit 2.2.5 → 2.2.6
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/package.json +2 -2
- package/views/SearchQuery.js +8 -9
- package/views/SearchQuery.js.map +1 -1
- package/views/sidebar/Browse/index.js +15 -17
- package/views/sidebar/Browse/index.js.map +1 -1
- package/views/sidebar/ListItem.js +2 -3
- package/views/sidebar/ListItem.js.map +1 -1
- package/views/sidebar/Search/index.js +2 -4
- package/views/sidebar/Search/index.js.map +1 -1
- package/views/util.js +2 -3
- package/views/util.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@riboseinc/paneron-registry-kit",
|
|
3
|
-
"version": "2.2.
|
|
3
|
+
"version": "2.2.6",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"author": "Ribose Inc. <open.source@ribose.com>",
|
|
6
6
|
"scripts": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"@blueprintjs/select": "~4.9.10",
|
|
29
29
|
"@emotion/react": "^11.10.6",
|
|
30
30
|
"@emotion/styled": "^11.10.6",
|
|
31
|
-
"@riboseinc/paneron-extension-kit": "2.2.
|
|
31
|
+
"@riboseinc/paneron-extension-kit": "2.2.4",
|
|
32
32
|
"@types/react": "17.0.53",
|
|
33
33
|
"@types/react-dom": "^17.0.2",
|
|
34
34
|
"@types/react-helmet": "^6.1.2",
|
package/views/SearchQuery.js
CHANGED
|
@@ -29,7 +29,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
29
29
|
|
|
30
30
|
/** @jsxFrag React.Fragment */
|
|
31
31
|
//import criteriaGroupToSummary from './FilterCriteria/criteriaGroupToSummary';
|
|
32
|
-
const SearchQuery = function ({
|
|
32
|
+
const SearchQuery = (0, _react.memo)(function ({
|
|
33
33
|
rootCriteria,
|
|
34
34
|
onCriteriaChange,
|
|
35
35
|
quickSearchString,
|
|
@@ -124,14 +124,13 @@ const SearchQuery = function ({
|
|
|
124
124
|
}), (0, _react2.jsx)("div", {
|
|
125
125
|
key: "query",
|
|
126
126
|
css: (0, _react2.css)`
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
127
|
+
margin-top: 5px;
|
|
128
|
+
padding: 0 10px 10px 10px;
|
|
129
|
+
color: ${_core.Colors.GRAY3};
|
|
130
|
+
font-size: 90%;
|
|
131
|
+
overflow-wrap: break-word;
|
|
132
|
+
`
|
|
133
133
|
}, "Query used: ", (0, _react2.jsx)("code", null, (0, _criteriaGroupToQueryExpression.default)(rootCriteria)))) : null);
|
|
134
|
-
};
|
|
135
|
-
|
|
134
|
+
});
|
|
136
135
|
var _default = SearchQuery;
|
|
137
136
|
exports.default = _default;
|
package/views/SearchQuery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchQuery.js","sourceRoot":"","sources":["../../src/views/SearchQuery.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"SearchQuery.js","sourceRoot":"","sources":["../../src/views/SearchQuery.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useState, useContext } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { Button, ControlGroup, Colors, InputGroup, Tag, ButtonGroup } from '@blueprintjs/core';\nimport CriteriaTree from './FilterCriteria';\nimport { CUSTOM_CONDITION, RAW_SUBSTRING } from './FilterCriteria/CRITERIA_CONFIGURATION';\nimport { CriteriaGroup, Criterion } from './FilterCriteria/models';\nimport criteriaGroupToQueryExpression from './FilterCriteria/criteriaGroupToQueryExpression';\n//import criteriaGroupToSummary from './FilterCriteria/criteriaGroupToSummary';\nimport { BrowserCtx } from './BrowserCtx';\n\n\nconst SearchQuery: React.FC<{\n rootCriteria: CriteriaGroup;\n onCriteriaChange?: (rootCriteria: CriteriaGroup) => void;\n\n quickSearchString: string;\n onQuickSearchStringChange?: (searchString: string) => void;\n\n availableClassIDs?: string[];\n className?: string;\n}> = memo(function ({\n rootCriteria,\n onCriteriaChange,\n quickSearchString,\n onQuickSearchStringChange,\n availableClassIDs,\n className,\n}) {\n const { itemClasses, subregisters } = useContext(BrowserCtx);\n\n const [ editingAdvanced, toggleEditingAdvanced ] = useState<boolean>(false);\n\n const classIDs = availableClassIDs ?? Object.keys(itemClasses);\n\n const hasAdvancedQuery = rootCriteria.criteria.length > 0;\n\n function makeDefaultCriteria(): Criterion {\n if (quickSearchString) {\n return {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters },\n ),\n }\n } else {\n return {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: 'false' },\n { itemClasses, subregisters },\n ),\n }\n }\n }\n\n return (\n <ControlGroup fill vertical className={className}>\n <InputGroup\n fill\n small\n disabled={!onQuickSearchStringChange || hasAdvancedQuery}\n value={hasAdvancedQuery ? '' : quickSearchString}\n leftIcon=\"search\"\n placeholder=\"Quick search\"\n title={!hasAdvancedQuery\n ? \"Search for a substring occurring anywhere within serialized item data.\"\n : \"Advanced query overrides quick search.\"}\n css={css`width: 200px; ${quickSearchString !== '' && !hasAdvancedQuery ? 'input { font-weight: bold; }' : ''}`}\n rightElement={<Button\n disabled={!onQuickSearchStringChange || quickSearchString === '' || hasAdvancedQuery}\n onClick={() => onQuickSearchStringChange?.('')}\n small\n minimal\n icon=\"cross\"\n title=\"Clear quick search\" />}\n onChange={evt => onQuickSearchStringChange?.(evt.currentTarget.value)} />\n <ButtonGroup fill>\n <Button\n fill\n small\n title=\"Edit advanced search query\"\n icon='filter'\n onClick={!hasAdvancedQuery\n ? (() => {\n onCriteriaChange!({ criteria: [makeDefaultCriteria()], require: 'all' });\n toggleEditingAdvanced(true);\n })\n : () => toggleEditingAdvanced(v => !v)}\n active={editingAdvanced && hasAdvancedQuery}\n disabled={!hasAdvancedQuery && !onCriteriaChange}\n rightIcon={rootCriteria.criteria.length > 0\n ? <Tag intent=\"success\" round>on</Tag>\n : <Tag round>off</Tag>}>\n Advanced\n </Button>\n </ButtonGroup>\n {hasAdvancedQuery && editingAdvanced\n ? <>\n <CriteriaTree\n key=\"tree\"\n criteria={rootCriteria}\n onChange={onCriteriaChange}\n itemClasses={itemClasses}\n availableClassIDs={classIDs}\n subregisters={subregisters}\n css={css`max-height: 50vh; overflow-y: auto;`} />\n <div\n key=\"query\"\n css={css`\n margin-top: 5px;\n padding: 0 10px 10px 10px;\n color: ${Colors.GRAY3};\n font-size: 90%;\n overflow-wrap: break-word;\n `}>\n Query used: <code>{criteriaGroupToQueryExpression(rootCriteria)}</code>\n </div>\n </>\n : null}\n </ControlGroup>\n );\n});\n\nexport default SearchQuery;\n"]}
|
|
@@ -62,7 +62,7 @@ function _validateFolderID(foldID) {
|
|
|
62
62
|
return foldID !== undefined && (foldID === null || foldID.startsWith('by-item-class/') || foldID.startsWith('by-subregister/'));
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
const Browse = function ({
|
|
65
|
+
const Browse = (0, _react.memo)(function ({
|
|
66
66
|
stateName,
|
|
67
67
|
onOpenItem,
|
|
68
68
|
className,
|
|
@@ -148,7 +148,7 @@ const Browse = function ({
|
|
|
148
148
|
}
|
|
149
149
|
}
|
|
150
150
|
}, [focusedTabURI, dispatch]);
|
|
151
|
-
const
|
|
151
|
+
const createItem = (0, _react.useCallback)(async function _createItem(classID, subregisterID) {
|
|
152
152
|
var _a;
|
|
153
153
|
|
|
154
154
|
if (!updateObjects || !makeRandomID || !activeCRIsEditable || !activeCR) {
|
|
@@ -208,6 +208,8 @@ const Browse = function ({
|
|
|
208
208
|
const handleExitFolder = (0, _react.useCallback)(() => dispatch({
|
|
209
209
|
type: 'exit-folder'
|
|
210
210
|
}), [dispatch]);
|
|
211
|
+
const handleAdd = (0, _react.useMemo)(() => !subregisters && activeCRIsEditable && performOperation ? clsID => performOperation('generating new item', createItem)(clsID) : undefined, [createItem, subregisters === undefined, activeCRIsEditable, performOperation]);
|
|
212
|
+
const handleAddInSubregister = (0, _react.useMemo)(() => subregisters && activeCRIsEditable && performOperation ? (clsID, subregID) => performOperation('generating new item', createItem)(clsID, subregID) : undefined, [createItem, subregisters === undefined, activeCRIsEditable, performOperation]);
|
|
211
213
|
|
|
212
214
|
if (state.enteredFolderID !== null) {
|
|
213
215
|
// If we are in a folder, show a tree with a single element
|
|
@@ -224,7 +226,7 @@ const Browse = function ({
|
|
|
224
226
|
title: (_b = (_a = clsConfig === null || clsConfig === void 0 ? void 0 : clsConfig.meta) === null || _a === void 0 ? void 0 : _a.title) !== null && _b !== void 0 ? _b : classID,
|
|
225
227
|
moreMenu: clsConfig ? (0, _react2.jsx)(ItemClassMenu, {
|
|
226
228
|
cfg: itemClasses[classID],
|
|
227
|
-
onCreate:
|
|
229
|
+
onCreate: handleAdd ? () => handleAdd(classID) : undefined
|
|
228
230
|
}) : undefined
|
|
229
231
|
};
|
|
230
232
|
criteria = {
|
|
@@ -247,7 +249,7 @@ const Browse = function ({
|
|
|
247
249
|
moreMenu: subregConfig ? (0, _react2.jsx)(SubregisterMenu, {
|
|
248
250
|
cfg: subregConfig,
|
|
249
251
|
itemClasses: itemClasses,
|
|
250
|
-
onCreate:
|
|
252
|
+
onCreate: handleAddInSubregister ? clsID => handleAddInSubregister(clsID, subregisterID) : undefined
|
|
251
253
|
}) : undefined
|
|
252
254
|
};
|
|
253
255
|
criteria = {
|
|
@@ -326,7 +328,7 @@ const Browse = function ({
|
|
|
326
328
|
},
|
|
327
329
|
secondaryLabel: (0, _react2.jsx)(MoreMenu, null, (0, _react2.jsx)(ItemClassMenu, {
|
|
328
330
|
cfg: classConfig,
|
|
329
|
-
onCreate:
|
|
331
|
+
onCreate: handleAdd ? () => handleAdd(classID) : undefined
|
|
330
332
|
}))
|
|
331
333
|
})), ...(subregisters ? [{
|
|
332
334
|
id: 'by-subregister',
|
|
@@ -351,7 +353,7 @@ const Browse = function ({
|
|
|
351
353
|
secondaryLabel: (0, _react2.jsx)(MoreMenu, null, (0, _react2.jsx)(SubregisterMenu, {
|
|
352
354
|
cfg: subregisterConfig,
|
|
353
355
|
itemClasses: itemClasses,
|
|
354
|
-
onCreate:
|
|
356
|
+
onCreate: handleAddInSubregister ? clsID => handleAddInSubregister(clsID, subregisterID) : undefined
|
|
355
357
|
}))
|
|
356
358
|
}))] : [])];
|
|
357
359
|
|
|
@@ -395,9 +397,8 @@ const Browse = function ({
|
|
|
395
397
|
contents: contents
|
|
396
398
|
});
|
|
397
399
|
}
|
|
398
|
-
};
|
|
399
|
-
|
|
400
|
-
const MoreMenu = function ({
|
|
400
|
+
});
|
|
401
|
+
const MoreMenu = (0, _react.memo)(function ({
|
|
401
402
|
children
|
|
402
403
|
}) {
|
|
403
404
|
return (0, _react2.jsx)(_popover.Popover2, {
|
|
@@ -408,9 +409,8 @@ const MoreMenu = function ({
|
|
|
408
409
|
small: true,
|
|
409
410
|
minimal: true
|
|
410
411
|
}));
|
|
411
|
-
};
|
|
412
|
-
|
|
413
|
-
const SubregisterMenu = function ({
|
|
412
|
+
});
|
|
413
|
+
const SubregisterMenu = (0, _react.memo)(function ({
|
|
414
414
|
cfg,
|
|
415
415
|
itemClasses,
|
|
416
416
|
onCreate
|
|
@@ -428,9 +428,8 @@ const SubregisterMenu = function ({
|
|
|
428
428
|
onCreate: onCreate ? () => onCreate(classID) : undefined
|
|
429
429
|
}));
|
|
430
430
|
}));
|
|
431
|
-
};
|
|
432
|
-
|
|
433
|
-
const ItemClassMenu = function ({
|
|
431
|
+
});
|
|
432
|
+
const ItemClassMenu = (0, _react.memo)(function ({
|
|
434
433
|
cfg,
|
|
435
434
|
onCreate
|
|
436
435
|
}) {
|
|
@@ -449,8 +448,7 @@ const ItemClassMenu = function ({
|
|
|
449
448
|
onClick: onCreate,
|
|
450
449
|
icon: "plus"
|
|
451
450
|
})) : null);
|
|
452
|
-
};
|
|
453
|
-
|
|
451
|
+
});
|
|
454
452
|
const SearchResultList = (0, _SearchResultList.default)(_ListItem.default, objPath => ({
|
|
455
453
|
name: 'reg. item',
|
|
456
454
|
iconProps: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Browse/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAY,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAgB,MAAM,mBAAmB,CAAC;AACtG,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAE1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,oBAAoB,MAAM,2DAA2D,CAAC;AAG7F,OAAO,8BAA8B,MAAM,qDAAqD,CAAC;AACjG,OAAO,sBAAsB,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAE/E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,QAAQ,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAwBnD,MAAM,YAAY,GAAU;IAC1B,gBAAgB,EAAE,IAAI;IACtB,eAAe,EAAE,IAAI;IACrB,gBAAgB,EAAE,IAAI;CACvB,CAAC;AACF,SAAS,aAAa,CAAC,WAAgB;IACrC,OAAO,CACL,iBAAiB,CAAC,WAAW,CAAC,eAAe,CAAC;QAC9C,iBAAiB,CAAC,WAAW,CAAC,gBAAgB,CAAC;QAC/C,WAAW,CAAC,gBAAgB,KAAK,SAAS,CAC3C,CAAC;AACJ,CAAC;AAAA,CAAC;AACF,SAAS,iBAAiB,CAAC,MAAc;IACvC,OAAO,MAAM,KAAK,SAAS;QAC3B,CACE,MAAM,KAAK,IAAI,IAAI,CACjB,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC;YACnC,MAAM,CAAC,UAAU,CAAC,iBAAiB,CAAC,CACrC,CACF,CAAA;AACH,CAAC;AAED,MAAM,MAAM,GAOZ,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE;;IACnD,MAAM,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,gCAAgC,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACvH,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACvE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5E,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAElG,MAAM,CAAE,KAAK,EAAE,QAAQ,EAAG,GAAI,gCAA8E,CAC1G,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,gBAAgB,EAC7B,SAAS,EACT,aAAa,EACb,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;QACpB,QAAQ,MAAM,CAAC,IAAI,EAAE;YACnB,KAAK,eAAe;gBAClB,IAAI,SAAS,CAAC,eAAe,KAAK,IAAI,EAAE;oBACtC,OAAO,SAAS,CAAC;iBAClB;qBAAM;oBACL,OAAO;wBACL,GAAG,SAAS;wBACZ,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE;qBACpC,CAAC;iBACH;YACH,KAAK,cAAc;gBACjB,IAAI,SAAS,CAAC,eAAe,KAAK,IAAI,EAAE;oBACtC,OAAO;wBACL,GAAG,SAAS;wBACZ,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE;wBACnC,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE;qBACnC,CAAC;iBACH;qBAAM;oBACL,OAAO,SAAS,CAAC;iBAClB;YACH,KAAK,aAAa;gBAChB,IAAI,SAAS,CAAC,eAAe,KAAK,IAAI,EAAE;oBACtC,OAAO;wBACL,GAAG,SAAS;wBACZ,eAAe,EAAE,IAAI;wBACrB,gBAAgB,EAAE,IAAI;qBACvB,CAAC;iBACH;qBAAM;oBACL,OAAO,SAAS,CAAC;iBAClB;YACH,KAAK,aAAa;gBAChB,IAAI,SAAS,CAAC,eAAe,IAAI,SAAS,CAAC,gBAAgB,EAAE;oBAC3D,OAAO;wBACL,GAAG,SAAS;wBACZ,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;qBAC1C,CAAC;iBACH;qBAAM;oBACL,OAAO,SAAS,CAAC;iBAClB;YACH;gBACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC9C;IACH,CAAC,EACD,YAAY,EACZ,IAAI,CAAC,CAAC;IAER,sEAAsE;IACtE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,aAAa,EAAE;YACjB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnD,mCAAmC;YACnC,IAAI,KAAK,KAAK,SAAS,CAAC,YAAY,EAAE;gBACpC,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;aAC1D;SACF;IACH,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE9B,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,aAAsB;;QAC7F,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY,IAAI,CAAC,kBAAkB,IAAI,CAAC,QAAQ,EAAE;YACvE,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;SAC3G;QACD,IAAI,YAAY,IAAI,CAAC,aAAa,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;SAC3G;QACD,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,EAAE;YACd,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;SAC1F;QACD,MAAM,eAAe,GAAG,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,QAAQ,mCAAI,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;QACpC,MAAM,GAAG,GAA0B,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QACtE,MAAM,YAAY,GAAsB;YACtC,EAAE,EAAE,MAAM;YACV,YAAY,EAAE,IAAI,IAAI,EAAE;YACxB,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,eAAe;SACtB,CAAC;QACF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,aAAa,CAAC;YAClB,aAAa,EAAE,sBAAsB,GAAG,CAAC,OAAO,EAAE;YAClD,eAAe,EAAE,uBAAuB,CACtC,QAAe,EACf,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EACpC,EAAE,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAC7B;YACD,0BAA0B,EAAE,IAAI;SACjC,CAAC,CAAC;QACH,QAAQ,CAAC,GAAG,SAAS,CAAC,YAAY,IAAI,iBAAiB,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/E,CAAC,EAAE,CAAC,QAAQ,EAAE,kBAAkB,EAAE,YAAY,KAAK,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC,CAAC;IAEtG,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAC,CAAC,CAAC,EACrE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACd,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EACtE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACd,MAAM,cAAc,GAAG,WAAW,CAChC,CAAC,CAAC,QAAQ,EAAE,EAAE,CACZ,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,YAAY,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,CAC9E,QAAQ,CAAC,CAAC,EACb,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1B,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,EACzC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEd,IAAI,KAAK,CAAC,eAAe,KAAK,IAAI,EAAE;QAClC,2DAA2D;QAC3D,sCAAsC;QACtC,0CAA0C;QAC1C,+DAA+D;QAE/D,IAAI,QAAuB,CAAC;QAC5B,IAAI,UAAqD,CAAC;QAE1D,IAAI,KAAK,CAAC,eAAe,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE;YACtD,MAAM,OAAO,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;YACvC,UAAU,GAAG;gBACX,KAAK,EAAE,MAAA,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,0CAAE,KAAK,mCAAI,OAAO;gBACxC,QAAQ,EAAE,SAAS;oBACjB,CAAC,CAAC,IAAC,aAAa,IACZ,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,EACzB,QAAQ,EAAE,CAAC,YAAY,IAAI,kBAAkB,IAAI,gBAAgB;4BAC/D,CAAC,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC;4BACnE,CAAC,CAAC,SAAS,GACb;oBACJ,CAAC,CAAC,SAAS;aACd,CAAC;YACF,QAAQ,GAAG;gBACT,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,YAAY;wBACjB,KAAK,EAAE,sBAAsB,CAAC,YAAY,CAAC,CAAC,OAAO,CACjD,EAAE,OAAO,EAAE,EACX,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;qBACjC;iBACF;aACF,CAAC;SACH;aAAM,IAAI,YAAY,IAAI,KAAK,CAAC,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE;YAC9E,MAAM,aAAa,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,YAAY,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;YACjD,UAAU,GAAG;gBACX,KAAK,EAAE,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,mCAAI,aAAa;gBAC3C,QAAQ,EAAE,YAAY;oBACpB,CAAC,CAAC,IAAC,eAAe,IACd,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,kBAAkB,IAAI,gBAAgB;4BAC9C,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,aAAa,CAAC;4BACrF,CAAC,CAAC,SAAS,GACb;oBACJ,CAAC,CAAC,SAAS;aACd,CAAC;YACF,QAAQ,GAAG;gBACT,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,aAAa;wBAClB,KAAK,EAAE,sBAAsB,CAAC,aAAa,CAAC,CAAC,OAAO,CAClD,EAAE,aAAa,EAAE,EACjB,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;qBACjC;iBACF;aACF,CAAC;SACH;aAAM;YACL,UAAU,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAC3B,QAAQ,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;SAC7C;QAGD,MAAM,eAAe,GAAG,8BAA8B,CAAC,QAAQ,CAAC,CAAC;QAEjE,OAAO,CACL,aAAK,GAAG,EAAE,GAAG,CAAA,0CAA0C,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK;YACzF,IAAC,IAAI,IACH,GAAG,EAAE,GAAG,CAAA,UAAU;gBAClB,8DAA8D;gBAC9D,WAAW,EAAE,kBAAkB,EAC/B,cAAc,EAAE,gBAAgB,EAChC,iBAAiB,EAAE,gBAAgB,EACnC,QAAQ,EAAE,CAAC;wBACT,EAAE,EAAE,cAAc;wBAClB,UAAU,EAAE,KAAK,CAAC,gBAAgB,KAAK,IAAI;wBAC3C,UAAU,EAAE,IAAI;wBAChB,QAAQ,EAAE,IAAI;wBACd,IAAI,EAAE,aAAa;wBACnB,KAAK,EAAE,UAAU,CAAC,KAAK;wBACvB,cAAc,EAAE,UAAU,CAAC,QAAQ;4BACjC,CAAC,CAAC,IAAC,QAAQ,QAAE,UAAU,CAAC,QAAQ,CAAY;4BAC5C,CAAC,CAAC,SAAS;qBACd,CAAC,GACF;YACF,aAAK,GAAG,EAAE,GAAG,CAAA,UAAU;gBACrB,IAAC,gBAAgB,IACf,eAAe,EAAE,oBAAoB,CAAC,eAAe,EAAE,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,SAAS,CAAC,EAC7E,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EACxC,YAAY,EAAE,gBAAgB,EAC9B,UAAU,EAAE,cAAc,GAC1B,CACE,CACF,CACP,CAAC;KACH;SAAM;QACL,sEAAsE;QACtE,+BAA+B;QAE/B,MAAM,QAAQ,GAAgD,CAAC;gBAC7D,EAAE,EAAE,eAAe;gBACnB,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,KAAK;gBACf,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,eAAe;gBACtB,QAAQ,EAAE,IAAI;gBACd,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;aAC7B,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjE,UAAU,EAAE,KAAK,CAAC,gBAAgB,KAAK,iBAAiB,OAAO,EAAE;gBACjE,EAAE,EAAE,OAAO;gBACX,UAAU,EAAE,KAAK;gBACjB,IAAI,EAAE,cAA0B;gBAChC,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK;gBAC7B,QAAQ,EAAE,EAAE,QAAQ,EAAE,iBAAiB,OAAO,EAAE,EAAE;gBAClD,cAAc,EACZ,IAAC,QAAQ;oBACP,IAAC,aAAa,IACZ,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,CAAC,YAAY,IAAI,kBAAkB,IAAI,gBAAgB;4BAC/D,CAAC,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC;4BACnE,CAAC,CAAC,SAAS,GACb,CACO;aACd,CAAC,CAAC,EAAE,GAAG,CAAC,YAAY;gBACnB,CAAC,CAAC,CAAC;wBACC,EAAE,EAAE,gBAAgB;wBACpB,UAAU,EAAE,IAAI;wBAChB,QAAQ,EAAE,KAAK;wBACf,QAAQ,EAAE,IAAI;wBACd,IAAI,EAAE,QAAoB;wBAC1B,KAAK,EAAE,gBAAgB;wBACvB,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;qBAC7B,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,iBAAiB,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC9E,UAAU,EAAE,KAAK,CAAC,gBAAgB,KAAK,kBAAkB,aAAa,EAAE;wBACxE,EAAE,EAAE,aAAa;wBACjB,UAAU,EAAE,KAAK;wBACjB,IAAI,EAAE,cAA0B;wBAChC,QAAQ,EAAE,IAAI;wBACd,KAAK,EAAE,iBAAiB,CAAC,KAAK;wBAC9B,QAAQ,EAAE,EAAE,QAAQ,EAAE,kBAAkB,aAAa,EAAE,EAAE;wBACzD,cAAc,EACZ,IAAC,QAAQ;4BACP,IAAC,eAAe,IACd,GAAG,EAAE,iBAAiB,EACtB,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,kBAAkB,IAAI,gBAAgB;oCAC9C,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,aAAa,CAAC;oCACrF,CAAC,CAAC,SAAS,GACb,CACO;qBACd,CAAC,CAAC,CAAC;gBACN,CAAC,CAAC,EAAE,CAAC;SACN,CAAC;QACF,IAAI,YAAY,EAAE;YAChB,QAAQ,CAAC,IAAI,EAAE,CAAA;SAChB;QACD,OAAO,CACL,IAAC,IAAI,IACH,GAAG,EAAE,GAAG,CAAA,UAAU,EAClB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,IAAI,CAAC,EAAE;;gBAAC,OAAA,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,QAAQ;oBAC1C,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAC,CAAC;oBAC7E,CAAC,CAAC,KAAK,CAAC,CAAA;aAAA,EACV,YAAY,EAAE,IAAI,CAAC,EAAE;;gBAAC,OAAA,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,QAAQ;oBAC3C,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAC,CAAC;oBAC5E,CAAC,CAAC,KAAK,CAAC,CAAA;aAAA,EACV,iBAAiB,EAAE,IAAI,CAAC,EAAE;;gBAAC,OAAA,CAAA,MAAA,IAAI,CAAC,QAAQ,0CAAE,QAAQ;oBAChD,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAC,CAAC;oBAC5E,CAAC,CAAC,KAAK,CAAC,CAAA;aAAA,EACV,QAAQ,EAAE,QAAQ,GAClB,CACH,CAAC;KACH;AACH,CAAC,CAAC;AAGF,MAAM,QAAQ,GAAmC,UAAU,EAAE,QAAQ,EAAE;IACrE,OAAO,CACL,IAAC,QAAQ,IAAC,OAAO,QAAC,OAAO,EAAE,0BAAG,QAAQ,CAAI;QACxC,IAAC,MAAM,IAAC,IAAI,EAAC,MAAM,EAAC,KAAK,QAAC,OAAO,SAAG,CAC3B,CACZ,CAAC;AACJ,CAAC,CAAA;AAGD,MAAM,eAAe,GAIhB,UAAU,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE;IAC3C,OAAO,CACL,IAAC,IAAI;QACH,IAAC,WAAW,IAAC,KAAK,EAAE,mBAAmB,GAAG,CAAC,KAAK,EAAE,GAAI;QACnD,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;;YAC7B,OAAA,IAAC,QAAQ,IACL,IAAI,EAAE,MAAA,MAAA,MAAA,WAAW,CAAC,OAAO,CAAC,0CAAE,IAAI,0CAAE,KAAK,mCAAI,OAAO,EAClD,GAAG,EAAE,OAAO;gBACd,IAAC,aAAa,IACZ,GAAG,EAAE,WAAW,CAAC,OAAO,CAAC,EACzB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,GACxD,CACO,CAAA;SAAA,CACZ,CACE,CACR,CAAC;AACJ,CAAC,CAAA;AAGD,MAAM,aAAa,GAGd,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE;IAC9B,OAAO,CACL,IAAC,IAAI;QACH,IAAC,WAAW,IAAC,KAAK,EAAC,kBAAkB,GAAG;QACxC,IAAC,QAAQ,IAAC,SAAS,QAAC,QAAQ,QAAC,GAAG,EAAE,GAAG,CAAA,kBAAkB,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,GAAI;QACtF,QAAQ;YACP,CAAC,CAAC;gBACE,IAAC,WAAW,IAAC,KAAK,EAAC,eAAe,GAAG;gBACrC,IAAC,QAAQ,IACP,IAAI,EAAC,aAAa,EAClB,MAAM,EAAC,SAAS,EAChB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAC,MAAM,GAC9B,CACD;YACL,CAAC,CAAC,IAAI,CACH,CACR,CAAC;AACJ,CAAC,CAAA;AAGD,MAAM,gBAAgB,GAAG,oBAAoB,CAAoB,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACvF,IAAI,EAAE,WAAW;IACjB,SAAS,EAAE;QACT,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,oBAAoB,OAAO,EAAE;KACzC;CACF,CAAC,CAAC,CAAC;AAGJ,eAAe,MAAM,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useCallback, 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 initialState: State = {\n selectedFolderID: null,\n enteredFolderID: null,\n selectedItemPath: null,\n};\nfunction validateState(loadedValue: any): loadedValue is State {\n return (\n _validateFolderID(loadedValue.enteredFolderID) &&\n _validateFolderID(loadedValue.selectedFolderID) &&\n loadedValue.selectedItemPath !== undefined\n );\n};\nfunction _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\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 validateState,\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 initialState,\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, dispatch]);\n\n const handleAdd = useCallback(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 }, [activeCR, activeCRIsEditable, subregisters === undefined, spawnTab, updateObjects, makeRandomID]);\n\n const handleSelectItem = useCallback(\n (itemPath => dispatch({ type: 'select-item', payload: { itemPath }})),\n [dispatch]);\n const handleDeselectItem = useCallback(\n (() => dispatch({ type: 'select-item', payload: { itemPath: null } })),\n [dispatch]);\n const handleOpenItem = useCallback(\n ((itemPath) =>\n (onOpenItem ?? (itemPath => spawnTab(`${Protocols.ITEM_DETAILS}:${itemPath}`)))\n (itemPath)),\n [onOpenItem, spawnTab]);\n const handleExitFolder = useCallback(\n (() => dispatch({ type: 'exit-folder' })),\n [dispatch]);\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 <Tree\n css={css`flex: 0;`}\n // This click handler deselects any items in results, meaning.\n onNodeClick={handleDeselectItem}\n onNodeCollapse={handleExitFolder}\n onNodeDoubleClick={handleExitFolder}\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\n ? <MoreMenu>{folderInfo.moreMenu}</MoreMenu>\n : 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={handleSelectItem}\n onOpenItem={handleOpenItem}\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"]}
|
|
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, { memo, useMemo, useCallback, 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 initialState: State = {\n selectedFolderID: null,\n enteredFolderID: null,\n selectedItemPath: null,\n};\nfunction validateState(loadedValue: any): loadedValue is State {\n return (\n _validateFolderID(loadedValue.enteredFolderID) &&\n _validateFolderID(loadedValue.selectedFolderID) &&\n loadedValue.selectedItemPath !== undefined\n );\n};\nfunction _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\nconst Browse: React.FC<{\n availableClassIDs?: string[]\n onOpenItem?: (itemPath: string) => void\n stateName?: string\n className?: string\n style?: React.CSSProperties\n}> =\nmemo(function ({ 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 validateState,\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 initialState,\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, dispatch]);\n\n const createItem = useCallback(async function _createItem(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 }, [activeCR, activeCRIsEditable, subregisters === undefined, spawnTab, updateObjects, makeRandomID]);\n\n const handleSelectItem = useCallback(\n (itemPath => dispatch({ type: 'select-item', payload: { itemPath }})),\n [dispatch]);\n const handleDeselectItem = useCallback(\n (() => dispatch({ type: 'select-item', payload: { itemPath: null } })),\n [dispatch]);\n const handleOpenItem = useCallback(\n ((itemPath) =>\n (onOpenItem ?? (itemPath => spawnTab(`${Protocols.ITEM_DETAILS}:${itemPath}`)))\n (itemPath)),\n [onOpenItem, spawnTab]);\n const handleExitFolder = useCallback(\n (() => dispatch({ type: 'exit-folder' })),\n [dispatch]);\n\n const handleAdd: undefined | ((clsID: string) => Promise<void>) = useMemo((() =>\n !subregisters && activeCRIsEditable && performOperation\n ? (clsID) => performOperation('generating new item', createItem)(clsID)\n : undefined\n ), [createItem, subregisters === undefined, activeCRIsEditable, performOperation]);\n\n const handleAddInSubregister: undefined | ((clsID: string, subregID: string) => Promise<void>) = useMemo((() =>\n subregisters && activeCRIsEditable && performOperation\n ? (clsID, subregID) => performOperation('generating new item', createItem)(clsID, subregID)\n : undefined\n ), [createItem, subregisters === undefined, activeCRIsEditable, performOperation]);\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={handleAdd ? () => handleAdd(classID) : 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={handleAddInSubregister\n ? (clsID) => handleAddInSubregister(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 <Tree\n css={css`flex: 0;`}\n // This click handler deselects any items in results, meaning.\n onNodeClick={handleDeselectItem}\n onNodeCollapse={handleExitFolder}\n onNodeDoubleClick={handleExitFolder}\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\n ? <MoreMenu>{folderInfo.moreMenu}</MoreMenu>\n : 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={handleSelectItem}\n onOpenItem={handleOpenItem}\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={handleAdd ? () => handleAdd(classID) : 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={handleAddInSubregister\n ? (clsID) => handleAddInSubregister(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>> = memo(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}> = memo(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}> = memo(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"]}
|
|
@@ -18,7 +18,7 @@ var _itemPathUtils = require("../itemPathUtils");
|
|
|
18
18
|
/** @jsxFrag React.Fragment */
|
|
19
19
|
|
|
20
20
|
/** Register item list view. */
|
|
21
|
-
const ListItem = function ({
|
|
21
|
+
const ListItem = (0, _react.memo)(function ({
|
|
22
22
|
objectData,
|
|
23
23
|
objectPath
|
|
24
24
|
}) {
|
|
@@ -37,7 +37,6 @@ const ListItem = function ({
|
|
|
37
37
|
css: (0, _react2.css)`opacity: .4`
|
|
38
38
|
}, "(missing item data at ", objectPath, ")");
|
|
39
39
|
return itemView;
|
|
40
|
-
};
|
|
41
|
-
|
|
40
|
+
});
|
|
42
41
|
var _default = ListItem;
|
|
43
42
|
exports.default = _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListItem.js","sourceRoot":"","sources":["../../../src/views/sidebar/ListItem.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ListItem.js","sourceRoot":"","sources":["../../../src/views/sidebar/ListItem.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAc,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,+BAA+B;AAC/B,MAAM,QAAQ,GACd,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE;IACvC,MAAM,EAAE,YAAY,EAAE,gCAAgC,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,iBAAiB,CAAC,YAAY,KAAK,SAAS,EAAE,UAAU,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,gCAAgC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,SAAS,CAAC,QAAQ,CAAC;IACxC,MAAM,WAAW,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,CAAC;IAErC,MAAM,QAAQ,GAAG,WAAW;QAC1B,CAAC,CAAC,IAAC,YAAY,IACX,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,OAAO,GAChB;QACJ,CAAC,CAAC,cAAM,GAAG,EAAE,GAAG,CAAA,aAAa;;YACF,UAAU;gBAC5B,CAAC;IAEZ,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC,CAAC;AAGH,eAAe,QAAQ,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useContext } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport type { RegisterItem } from '../../types';\nimport { BrowserCtx } from '../BrowserCtx';\nimport { itemPathToItemRef } from '../itemPathUtils';\n\n\n/** Register item list view. */\nconst ListItem: React.FC<{ objectData: RegisterItem<any>, objectPath: string }> =\nmemo(function ({ objectData, objectPath }) {\n const { subregisters, getRelatedItemClassConfiguration } = useContext(BrowserCtx);\n const itemRef = itemPathToItemRef(subregisters !== undefined, objectPath);\n const clsConfig = getRelatedItemClassConfiguration(itemRef.classID);\n const ListItemView = clsConfig.itemView;\n const itemPayload = objectData?.data;\n\n const itemView = itemPayload\n ? <ListItemView\n itemData={itemPayload}\n itemRef={itemRef}\n />\n : <span css={css`opacity: .4`}>\n (missing item data at {objectPath})\n </span>;\n\n return itemView;\n});\n\n\nexport default ListItem;\n"]}
|
|
@@ -49,8 +49,7 @@ const initialState = {
|
|
|
49
49
|
quickSubstringQuery: '',
|
|
50
50
|
selectedItemPath: null
|
|
51
51
|
};
|
|
52
|
-
|
|
53
|
-
const Search = function ({
|
|
52
|
+
const Search = (0, _react.memo)(function ({
|
|
54
53
|
implicitCriteria,
|
|
55
54
|
availableClassIDs,
|
|
56
55
|
stateName,
|
|
@@ -170,8 +169,7 @@ const Search = function ({
|
|
|
170
169
|
onSelectItem: handleSelectItem,
|
|
171
170
|
onOpenItem: handleOpenItem
|
|
172
171
|
})));
|
|
173
|
-
};
|
|
174
|
-
|
|
172
|
+
});
|
|
175
173
|
const SearchResultList = (0, _SearchResultList.default)(_ListItem.default, objPath => ({
|
|
176
174
|
name: 'reg. item',
|
|
177
175
|
iconProps: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Search/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAc,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC3E,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAE1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAC1G,OAAO,oBAAoB,MAAM,2DAA2D,CAAC;AAC7F,OAAO,WAAW,MAAM,8CAA8C,CAAC;AACvE,OAAO,EAAsB,cAAc,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,8BAA8B,MAAM,qDAAqD,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,QAAQ,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAmBnD,MAAM,YAAY,GAAU;IAC1B,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;IACnC,mBAAmB,EAAE,EAAE;IACvB,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF,MAAM,MAAM,GAgBZ,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE;IACxF,MAAM,EAAE,gCAAgC,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IACxE,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACxD,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,oBAAoB,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAClG,MAAM,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAE3D,MAAM,CAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAE,GAAI,gCAA8E,CACxH,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,gBAAgB,EAC7B,SAAS,EACT,SAAS,EACT,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE;QACpB,QAAQ,MAAM,CAAC,IAAI,EAAE;YACnB,KAAK,cAAc;gBACjB,OAAO;oBACL,GAAG,SAAS;oBACZ,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;iBAC5B,CAAC;YACJ,KAAK,8BAA8B;gBACjC,OAAO;oBACL,GAAG,SAAS;oBACZ,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;iBAC9C,CAAC;YACJ,KAAK,aAAa;gBAChB,OAAO;oBACL,GAAG,SAAS;oBACZ,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;iBAC1C,CAAC;YACJ;gBACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;SAC9C;IACH,CAAC,EACD,YAAY,EACZ,IAAI,CAAC,CAAC;IAER,MAAM,gBAAgB,GAAG,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,GAAG;QAChD,CAAC,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,GAAG,EAAE,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,EAAE,CAAC;QAChE,CAAC,CAAC,IAAI,CAAC;IAET,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,gBAAgB,EAAE;YACpB,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;SAC5E;IACH,CAAC,EAAE,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEjC,MAAM,wBAAwB,GAAG,OAAO,CAAC,GAAG,EAAE;;QAC5C,MAAM,iBAAiB,GAAG,CAAC,MAAA,KAAK,CAAC,mBAAmB,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACnE,MAAM,gBAAgB,GACpB,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,KAAK,EAAE;YAClE,CAAC,CAAC;gBACE,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,eAAe;wBACpB,KAAK,EAAE,aAAa,CAAC,OAAO,CAC1B,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAChC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;qBACjC;iBACF;aACF;YACH,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAA;QAC1B,MAAM,YAAY,GAAkB,gBAAgB;YAClD,CAAC,CAAC;gBACE,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,CAAE,gBAAgB,EAAE,gBAAgB,CAAE;aACjD;YACH,CAAC,CAAC,gBAAgB,CAAC;QACrB,OAAO,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YACrC,CAAC,CAAC,8BAA8B,CAAC,YAAY,CAAC;YAC9C,2DAA2D;YAC3D,CAAC,CAAC,OAAO,CAAC;IACd,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,mBAAmB,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAEjF,MAAM,sBAAsB,GAAG,WAAW,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAC/D,MAAM,wBAAwB,GAAG,WAAW,CAC1C,wBAAwB,EACxB,sBAAsB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACjC,CAAC;IAEF,MAAM,kCAAkC,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,CACvD,wBAAwB,IAAI,OAAO;QACjC,CAAC,CAAC,oBAAoB,CAAC,wBAAwB,EAAE,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,SAAS,CAAC;QAC5E,CAAC,CAAC,cAAc,CACnB,EAAE,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC,CAAC;IAE9C,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAC,CAAC,CAAC,EACrE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAGd,MAAM,cAAc,GAAG,WAAW,CAChC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC,YAAY,IAAI,QAAQ,EAAE,CAAC,CAAC,EAC7E,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAE1B,OAAO,CACL,aAAK,GAAG,EAAE,GAAG,CAAA,0CAA0C,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK;QACzF,IAAC,WAAW,IACV,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAClC,iBAAiB,EAAE,KAAK,CAAC,mBAAmB,EAC5C,iBAAiB,EAAE,iBAAiB,EACpC,gBAAgB,EAAE,WAAW,CAAC,CAC5B,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CACjF,EAAE,CAAC,QAAQ,CAAC,CAAC,EACd,yBAAyB,EAAE,WAAW,CAAC,CACrC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CACxF,EAAE,CAAC,QAAQ,CAAC,CAAC,EACd,GAAG,EAAE,GAAG,CAAA,eAAe,GACvB;QACF,aAAK,GAAG,EAAE,GAAG,CAAA,UAAU;YACrB,IAAC,gBAAgB,IACb,eAAe,EAAE,kCAAkC,EACnD,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EACxC,YAAY,EAAE,gBAAgB,EAC9B,UAAU,EAAE,cAAc,GAC1B,CACA,CACF,CACP,CAAC;AACJ,CAAC,CAAC;AAGF,MAAM,gBAAgB,GAAG,oBAAoB,CAAoB,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACvF,IAAI,EAAE,WAAW;IACjB,SAAS,EAAE;QACT,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,oBAAoB,OAAO,EAAE;KACzC;CACF,CAAC,CAAC,CAAC;AAGJ,eAAe,MAAM,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useCallback, useMemo, useEffect } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { 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';\nimport useDebounce from '@riboseinc/paneron-extension-kit/useDebounce';\nimport { type CriteriaGroup, BLANK_CRITERIA } from '../../FilterCriteria/models';\nimport criteriaGroupToQueryExpression from '../../FilterCriteria/criteriaGroupToQueryExpression';\nimport { RAW_SUBSTRING } from '../../FilterCriteria/CRITERIA_CONFIGURATION';\nimport { ChangeRequestContext } from '../../change-request/ChangeRequestContext';\nimport type { RegisterItem } from '../../../types';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { getRegisterItemQuery } from '../../itemQueryUtils';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport SearchQuery from '../../SearchQuery';\nimport ListItem from '../ListItem';\nimport { Protocols } from '../../protocolRegistry';\n\n\n// TODO: Move Search widget core out of sidebar, as it’s used elsewhere too.\n\n\ninterface Query {\n criteria: CriteriaGroup;\n}\ninterface State {\n query: Query;\n quickSubstringQuery: string;\n selectedItemPath: string | null;\n}\ntype Action =\n | { type: 'update-query'; payload: { query: Query; }; }\n | { type: 'update-quick-substring-query'; payload: { substring: string; }; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\nconst initialState: State = {\n query: { criteria: BLANK_CRITERIA },\n quickSubstringQuery: '',\n selectedItemPath: null,\n};\n\nconst Search: React.FC<{\n /**\n * Criteria that will always apply.\n * Used e.g. in superseding item selection\n * (to limit to the same item class).\n */\n implicitCriteria?: CriteriaGroup,\n\n availableClassIDs?: string[]\n onOpenItem?: (itemPath: string) => void\n\n stateName?: string\n\n className?: string\n style?: React.CSSProperties\n}> =\nfunction ({ implicitCriteria, availableClassIDs, stateName, onOpenItem, className, style }) {\n const { usePersistentDatasetStateReducer } = useContext(DatasetContext);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const { keyExpression, itemClasses, subregisters, selectedRegisterItem } = useContext(BrowserCtx);\n const { changeRequest } = useContext(ChangeRequestContext);\n\n const [ state, dispatch, stateRecalled ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)(\n stateName ?? 'search-sidebar',\n undefined,\n undefined,\n (prevState, action) => {\n switch (action.type) {\n case 'update-query':\n return {\n ...prevState,\n query: action.payload.query,\n };\n case 'update-quick-substring-query':\n return {\n ...prevState,\n quickSubstringQuery: action.payload.substring,\n };\n case 'select-item':\n return {\n ...prevState,\n selectedItemPath: action.payload.itemPath,\n };\n default:\n throw new Error(\"Unexpected search state\");\n }\n },\n initialState,\n null);\n\n const selectedItemPath = selectedRegisterItem?.ref\n ? itemRefToItemPath(selectedRegisterItem.ref, changeRequest?.id)\n : null;\n\n useEffect(() => {\n if (selectedItemPath) {\n dispatch({ type: 'select-item', payload: { itemPath: selectedItemPath } });\n }\n }, [selectedItemPath, dispatch]);\n\n const effectiveQueryExpression = useMemo(() => {\n const quickSearchString = (state.quickSubstringQuery ?? '').trim();\n const withSearchString: CriteriaGroup =\n state.query.criteria.criteria.length < 1 && quickSearchString !== ''\n ? {\n require: 'all',\n criteria: [\n {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters }),\n },\n ],\n }\n : state.query.criteria\n const withImplicit: CriteriaGroup = implicitCriteria\n ? {\n require: 'all',\n criteria: [ implicitCriteria, withSearchString ],\n }\n : withSearchString;\n return withImplicit.criteria.length > 0\n ? criteriaGroupToQueryExpression(withImplicit)\n // If no criteria provided, don’t show anything by default.\n : 'false';\n }, [state.query.criteria, state.quickSubstringQuery, itemClasses, subregisters]);\n\n const stateRecalledDebounced = useDebounce(stateRecalled, 100);\n const queryExpressionDebounced = useDebounce(\n effectiveQueryExpression,\n stateRecalledDebounced ? 500 : 0,\n );\n\n const datasetObjectSearchQueryExpression = useMemo((() =>\n queryExpressionDebounced != 'false'\n ? getRegisterItemQuery(queryExpressionDebounced, changeRequest ?? undefined)\n : 'return false'\n ), [queryExpressionDebounced, changeRequest]);\n\n const handleSelectItem = useCallback(\n (itemPath => dispatch({ type: 'select-item', payload: { itemPath }})),\n [dispatch]);\n\n\n const handleOpenItem = useCallback(\n onOpenItem ?? (itemPath => spawnTab(`${Protocols.ITEM_DETAILS}:${itemPath}`)),\n [onOpenItem, spawnTab]);\n\n return (\n <div css={css`display: flex; flex-flow: column nowrap;`} className={className} style={style}>\n <SearchQuery\n rootCriteria={state.query.criteria}\n quickSearchString={state.quickSubstringQuery}\n availableClassIDs={availableClassIDs}\n onCriteriaChange={useCallback((\n criteria => dispatch({ type: 'update-query', payload: { query: { criteria } } })\n ), [dispatch])}\n onQuickSearchStringChange={useCallback((\n substring => dispatch({ type: 'update-quick-substring-query', payload: { substring } })\n ), [dispatch])}\n css={css`padding: 5px;`}\n />\n <div css={css`flex: 1;`}>\n <SearchResultList\n queryExpression={datasetObjectSearchQueryExpression}\n keyExpression={keyExpression}\n selectedItemPath={state.selectedItemPath}\n onSelectItem={handleSelectItem}\n onOpenItem={handleOpenItem}\n />\n </div>\n </div>\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 Search;\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Search/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useContext, useCallback, useMemo, useEffect } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { 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';\nimport useDebounce from '@riboseinc/paneron-extension-kit/useDebounce';\nimport { type CriteriaGroup, BLANK_CRITERIA } from '../../FilterCriteria/models';\nimport criteriaGroupToQueryExpression from '../../FilterCriteria/criteriaGroupToQueryExpression';\nimport { RAW_SUBSTRING } from '../../FilterCriteria/CRITERIA_CONFIGURATION';\nimport { ChangeRequestContext } from '../../change-request/ChangeRequestContext';\nimport type { RegisterItem } from '../../../types';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { getRegisterItemQuery } from '../../itemQueryUtils';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport SearchQuery from '../../SearchQuery';\nimport ListItem from '../ListItem';\nimport { Protocols } from '../../protocolRegistry';\n\n\n// TODO: Move Search widget core out of sidebar, as it’s used elsewhere too.\n\n\ninterface Query {\n criteria: CriteriaGroup;\n}\ninterface State {\n query: Query;\n quickSubstringQuery: string;\n selectedItemPath: string | null;\n}\ntype Action =\n | { type: 'update-query'; payload: { query: Query; }; }\n | { type: 'update-quick-substring-query'; payload: { substring: string; }; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\nconst initialState: State = {\n query: { criteria: BLANK_CRITERIA },\n quickSubstringQuery: '',\n selectedItemPath: null,\n};\n\nconst Search: React.FC<{\n /**\n * Criteria that will always apply.\n * Used e.g. in superseding item selection\n * (to limit to the same item class).\n */\n implicitCriteria?: CriteriaGroup,\n\n availableClassIDs?: string[]\n onOpenItem?: (itemPath: string) => void\n\n stateName?: string\n\n className?: string\n style?: React.CSSProperties\n}> =\nmemo(function ({ implicitCriteria, availableClassIDs, stateName, onOpenItem, className, style }) {\n const { usePersistentDatasetStateReducer } = useContext(DatasetContext);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const { keyExpression, itemClasses, subregisters, selectedRegisterItem } = useContext(BrowserCtx);\n const { changeRequest } = useContext(ChangeRequestContext);\n\n const [ state, dispatch, stateRecalled ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)(\n stateName ?? 'search-sidebar',\n undefined,\n undefined,\n (prevState, action) => {\n switch (action.type) {\n case 'update-query':\n return {\n ...prevState,\n query: action.payload.query,\n };\n case 'update-quick-substring-query':\n return {\n ...prevState,\n quickSubstringQuery: action.payload.substring,\n };\n case 'select-item':\n return {\n ...prevState,\n selectedItemPath: action.payload.itemPath,\n };\n default:\n throw new Error(\"Unexpected search state\");\n }\n },\n initialState,\n null);\n\n const selectedItemPath = selectedRegisterItem?.ref\n ? itemRefToItemPath(selectedRegisterItem.ref, changeRequest?.id)\n : null;\n\n useEffect(() => {\n if (selectedItemPath) {\n dispatch({ type: 'select-item', payload: { itemPath: selectedItemPath } });\n }\n }, [selectedItemPath, dispatch]);\n\n const effectiveQueryExpression = useMemo(() => {\n const quickSearchString = (state.quickSubstringQuery ?? '').trim();\n const withSearchString: CriteriaGroup =\n state.query.criteria.criteria.length < 1 && quickSearchString !== ''\n ? {\n require: 'all',\n criteria: [\n {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters }),\n },\n ],\n }\n : state.query.criteria\n const withImplicit: CriteriaGroup = implicitCriteria\n ? {\n require: 'all',\n criteria: [ implicitCriteria, withSearchString ],\n }\n : withSearchString;\n return withImplicit.criteria.length > 0\n ? criteriaGroupToQueryExpression(withImplicit)\n // If no criteria provided, don’t show anything by default.\n : 'false';\n }, [state.query.criteria, state.quickSubstringQuery, itemClasses, subregisters]);\n\n const stateRecalledDebounced = useDebounce(stateRecalled, 100);\n const queryExpressionDebounced = useDebounce(\n effectiveQueryExpression,\n stateRecalledDebounced ? 500 : 0,\n );\n\n const datasetObjectSearchQueryExpression = useMemo((() =>\n queryExpressionDebounced != 'false'\n ? getRegisterItemQuery(queryExpressionDebounced, changeRequest ?? undefined)\n : 'return false'\n ), [queryExpressionDebounced, changeRequest]);\n\n const handleSelectItem = useCallback(\n (itemPath => dispatch({ type: 'select-item', payload: { itemPath }})),\n [dispatch]);\n\n\n const handleOpenItem = useCallback(\n onOpenItem ?? (itemPath => spawnTab(`${Protocols.ITEM_DETAILS}:${itemPath}`)),\n [onOpenItem, spawnTab]);\n\n return (\n <div css={css`display: flex; flex-flow: column nowrap;`} className={className} style={style}>\n <SearchQuery\n rootCriteria={state.query.criteria}\n quickSearchString={state.quickSubstringQuery}\n availableClassIDs={availableClassIDs}\n onCriteriaChange={useCallback((\n criteria => dispatch({ type: 'update-query', payload: { query: { criteria } } })\n ), [dispatch])}\n onQuickSearchStringChange={useCallback((\n substring => dispatch({ type: 'update-quick-substring-query', payload: { substring } })\n ), [dispatch])}\n css={css`padding: 5px;`}\n />\n <div css={css`flex: 1;`}>\n <SearchResultList\n queryExpression={datasetObjectSearchQueryExpression}\n keyExpression={keyExpression}\n selectedItemPath={state.selectedItemPath}\n onSelectItem={handleSelectItem}\n onOpenItem={handleOpenItem}\n />\n </div>\n </div>\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 Search;\n"]}
|
package/views/util.js
CHANGED
|
@@ -42,7 +42,7 @@ function maybeEllipsizeString(str, maxLength = 20) {
|
|
|
42
42
|
return str.length > maxLength ? `${str.slice(0, maxLength)}…` : str;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
const RegisterHelmet = function (props) {
|
|
45
|
+
const RegisterHelmet = (0, _react.memo)(function (props) {
|
|
46
46
|
const {
|
|
47
47
|
title: datasetTitle
|
|
48
48
|
} = (0, _react.useContext)(_context.DatasetContext);
|
|
@@ -50,8 +50,7 @@ const RegisterHelmet = function (props) {
|
|
|
50
50
|
titleTemplate: `%s in ${datasetTitle} register`,
|
|
51
51
|
defaultTitle: `${datasetTitle} register`
|
|
52
52
|
}, props.children);
|
|
53
|
-
};
|
|
54
|
-
|
|
53
|
+
});
|
|
55
54
|
exports.RegisterHelmet = RegisterHelmet;
|
|
56
55
|
|
|
57
56
|
const PropertyDetailView = function ({
|
package/views/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/views/util.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,iCAAiC;AACjC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAc,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/views/util.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\n//import log from 'electron-log';\nimport format from 'date-fns/format';\nimport React, { memo, useContext } from 'react';\nimport { Helmet, HelmetProps } from 'react-helmet';\nimport { css, jsx } from '@emotion/react';\nimport { FormGroup, FormGroupProps, Colors } from '@blueprintjs/core';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport type { ItemClassConfiguration, RelatedItemClassConfiguration } from '../types';\nexport { GenericRelatedItemView } from './GenericRelatedItemView';\n\n\n/**\n * Get give string truncated & with ellipsis appended\n * if its length exceeds given number of characters.\n */\nexport function maybeEllipsizeString(\n str: string,\n maxLength: number = 20,\n): string {\n return str.length > maxLength\n ? `${str.slice(0, maxLength)}…`\n : str;\n}\n\n\nexport const RegisterHelmet: React.FC<HelmetProps> = memo(function (props) {\n const { title: datasetTitle } = useContext(DatasetContext);\n\n return (\n <Helmet\n titleTemplate={`%s in ${datasetTitle} register`}\n defaultTitle={`${datasetTitle} register`}>\n {props.children}\n </Helmet>\n );\n});\n\n\nexport const PropertyDetailView: React.FC<{\n title: FormGroupProps[\"label\"]\n secondaryTitle?: FormGroupProps[\"labelInfo\"]\n inline?: FormGroupProps[\"inline\"]\n className?: string\n}> = function ({ title, secondaryTitle, inline, children, className }) {\n return (\n <FormGroup\n label={`${title}:`}\n labelInfo={secondaryTitle}\n css={css`&, &.bp4-inline { label.bp4-label { font-weight: bold; line-height: unset } }`}\n className={className}\n inline={inline}>\n {children}\n </FormGroup>\n );\n};\n\n\n/** Formats given date as a span with tooltip set to full ISO date & time. */\nexport const Datestamp: React.FC<{\n date: Date\n title?: string\n className?: string\n}> = function ({ date, title, className }) {\n const asString = formatDate(date);\n return <span\n className={className}\n title={`${title ? `${title}: ` : ''}${date?.toString() ?? 'N/A'}`}>\n {asString}\n </span>;\n};\n\n\n/** Foramts given date as plain text. */\nexport function formatDate(date: Date): string {\n try {\n return format(date, 'yyyy-MM-dd');\n } catch (e) {\n return `Invalid date (${e})`;\n }\n}\n\n\nexport const _getRelatedClass = (classes: Record<string, ItemClassConfiguration<any>>) => {\n return (clsID: string): RelatedItemClassConfiguration => {\n const cfg = classes[clsID];\n return {\n title: cfg.meta.title,\n // TODO: The itemView/listItemView inconsistency is annoying\n itemView: cfg.views.listItemView,\n };\n };\n};\n\n\n/**\n * Suitable for use as tab contents for TabbedWorkspace.\n * Provides top bar with actions and main content.\n */\nexport const TabContentsWithActions: React.FC<{\n actions: JSX.Element;\n main: JSX.Element;\n className?: string;\n}> = function ({ actions, main, className }) {\n return (\n <div css={css`\n position: absolute; inset: 0;\n display: flex; flex-flow: column nowrap;\n `} className={className}>\n <div css={css`flex: 0; padding: 10px; display: flex; flex-flow: row wrap; gap: 10px;`}>\n {actions}\n </div>\n <div css={css`\n position: relative;\n flex: 1;\n padding: 10px;\n overflow-y: auto;\n background: ${Colors.GRAY5};\n .bp4-dark & { background: ${Colors.DARK_GRAY2}; }\n `}>\n {main}\n </div>\n </div>\n )\n}\n"]}
|