@riboseinc/paneron-registry-kit 2.2.4 → 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 +4 -3
- package/types/item.d.ts +1 -0
- package/types/item.js +8 -0
- package/types/item.js.map +1 -1
- package/views/GenericRelatedItemView.js +89 -75
- package/views/GenericRelatedItemView.js.map +1 -1
- package/views/SearchQuery.js +8 -9
- package/views/SearchQuery.js.map +1 -1
- package/views/change-request/ChangeRequestContext.js +6 -4
- package/views/change-request/ChangeRequestContext.js.map +1 -1
- package/views/detail/ChangeRequest/index.d.ts +0 -1
- package/views/detail/ChangeRequest/index.js +143 -128
- package/views/detail/ChangeRequest/index.js.map +1 -1
- package/views/detail/ChangeRequest/transitions.js +14 -9
- package/views/detail/ChangeRequest/transitions.js.map +1 -1
- package/views/detail/RegisterItem/index.js +27 -40
- package/views/detail/RegisterItem/index.js.map +1 -1
- package/views/hooks/useItemClassConfig.d.ts +1 -2
- package/views/hooks/useItemClassConfig.js +1 -7
- package/views/hooks/useItemClassConfig.js.map +1 -1
- package/views/hooks/useSingleRegisterItemData.d.ts +1 -1
- package/views/hooks/useSingleRegisterItemData.js +4 -3
- package/views/hooks/useSingleRegisterItemData.js.map +1 -1
- package/views/index.js +32 -23
- package/views/index.js.map +1 -1
- package/views/itemPathUtils.d.ts +3 -8
- package/views/itemPathUtils.js +26 -1
- package/views/itemPathUtils.js.map +1 -1
- package/views/protocolRegistry.d.ts +1 -1
- package/views/protocolRegistry.js.map +1 -1
- package/views/sidebar/Browse/index.js +57 -51
- 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/Registration/index.js +12 -11
- package/views/sidebar/Registration/index.js.map +1 -1
- package/views/sidebar/Search/index.js +49 -46
- package/views/sidebar/Search/index.js.map +1 -1
- package/views/util.d.ts +1 -0
- package/views/util.js +5 -4
- package/views/util.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSingleRegisterItemData.js","sourceRoot":"","sources":["../../../src/views/hooks/useSingleRegisterItemData.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useSingleRegisterItemData.js","sourceRoot":"","sources":["../../../src/views/hooks/useSingleRegisterItemData.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIrD,MAAM,MAAM,GAAG,4BAA4B,CAAC;AAG5C,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAChD,GAA6C;;IAE5C,MAAM,EAAE,mBAAmB,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;IACnE,MAAM,YAAY,GAAG,mBAAmB,CAAC,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACpE,MAAM,iBAAiB,GACrB,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE/B,MAAM,QAAQ,GAAG,MAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,IAAI,mCAAI,IAAI,CAAC;IAEjD,OAAO,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACrB,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,QAAQ,KAAK,IAAI;YACvB,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC;YAClC,CAAC,CAAC,YAAY,CAAC,MAAM;QACvB,UAAU,EAAE,YAAY,CAAC,UAAU;QACnC,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,OAAO,EAAE,YAAY,CAAC,OAAO;KAC9B,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AACvF,CAAC","sourcesContent":["import { useContext, useMemo } from 'react';\nimport type { ValueHook } from '@riboseinc/paneron-extension-kit/types';\nimport { BrowserCtx } from '../BrowserCtx';\nimport { itemRefToItemPath } from '../itemPathUtils';\nimport type { InternalItemReference, RegisterItem } from '../../types';\n\n\nconst errMsg = \"Item data cannot be loaded\";\n\n\nexport default function useSingleRegisterItemData\n(ref: InternalItemReference | undefined | null):\nValueHook<RegisterItem<any> | null> {\n const { useRegisterItemData } = useContext(BrowserCtx);\n const itemPath = ref ? itemRefToItemPath(ref) : 'NONEXISTENT_ITEM';\n const itemResponse = useRegisterItemData({ itemPaths: [itemPath] });\n const itemResponseValue: RegisterItem<any> | null =\n itemResponse.value[itemPath];\n\n const itemData = itemResponseValue?.data ?? null;\n\n return useMemo((() => ({\n value: itemData,\n errors: itemData === null\n ? [errMsg, ...itemResponse.errors]\n : itemResponse.errors,\n isUpdating: itemResponse.isUpdating,\n _reqCounter: itemResponse._reqCounter,\n refresh: itemResponse.refresh,\n })), [itemResponse.isUpdating, itemResponse.refresh, itemData, JSON.stringify(ref)]);\n}\n"]}
|
package/views/index.js
CHANGED
|
@@ -13,6 +13,8 @@ exports.RegistryView = void 0;
|
|
|
13
13
|
|
|
14
14
|
var _react = _interopRequireWildcard(require("react"));
|
|
15
15
|
|
|
16
|
+
var _useDebounce = require("use-debounce");
|
|
17
|
+
|
|
16
18
|
var _react2 = require("@emotion/react");
|
|
17
19
|
|
|
18
20
|
var _context = require("@riboseinc/paneron-extension-kit/context");
|
|
@@ -78,7 +80,7 @@ const RegistryWorkspace = function () {
|
|
|
78
80
|
content: (0, _react2.jsx)(_react.default.Fragment, null, "Viewing register as proposed\u2009\u2014\u2009contents shown may differ from version in effect"),
|
|
79
81
|
intent: 'danger',
|
|
80
82
|
onClick: () => spawnTab(`${_protocolRegistry.Protocols.CHANGE_REQUEST}:/proposals/${activeChangeRequest.id}/main.yaml`)
|
|
81
|
-
} : undefined, [activeChangeRequest === null || activeChangeRequest === void 0 ? void 0 : activeChangeRequest.id]);
|
|
83
|
+
} : undefined, [activeChangeRequest === null || activeChangeRequest === void 0 ? void 0 : activeChangeRequest.id, spawnTab]);
|
|
82
84
|
const {
|
|
83
85
|
value: {
|
|
84
86
|
settings
|
|
@@ -99,12 +101,12 @@ const RegistryWorkspace = function () {
|
|
|
99
101
|
newTabPrompt: (0, _react2.jsx)(_RegisterHome.default, null),
|
|
100
102
|
globalMode: globalMode,
|
|
101
103
|
sidebarWidth: sidebarWidth,
|
|
102
|
-
onSidebarResize: width => {
|
|
104
|
+
onSidebarResize: (0, _react.useCallback)(width => {
|
|
103
105
|
updateSetting({
|
|
104
106
|
key: SIDEBAR_WIDTH_SETTING_NAME,
|
|
105
107
|
value: width
|
|
106
108
|
});
|
|
107
|
-
}
|
|
109
|
+
}, [updateSetting])
|
|
108
110
|
});
|
|
109
111
|
};
|
|
110
112
|
|
|
@@ -116,7 +118,7 @@ const BrowserCtxProvider = function ({
|
|
|
116
118
|
customViews,
|
|
117
119
|
children
|
|
118
120
|
}) {
|
|
119
|
-
var _a, _b
|
|
121
|
+
var _a, _b;
|
|
120
122
|
|
|
121
123
|
const {
|
|
122
124
|
useObjectData,
|
|
@@ -125,23 +127,26 @@ const BrowserCtxProvider = function ({
|
|
|
125
127
|
const {
|
|
126
128
|
focusedTabURI,
|
|
127
129
|
spawnTab
|
|
128
|
-
} = (0, _react.useContext)(_context2.TabbedWorkspaceContext);
|
|
129
|
-
|
|
130
|
-
const
|
|
130
|
+
} = (0, _react.useContext)(_context2.TabbedWorkspaceContext); // Active item
|
|
131
|
+
|
|
132
|
+
const selectedItemPath = (0, _react.useMemo)(() => focusedTabURI && focusedTabURI.startsWith(`${_protocolRegistry.Protocols.ITEM_DETAILS}:`) ? focusedTabURI.split(':')[1] : null, [focusedTabURI]);
|
|
133
|
+
const selectedItemRef = (0, _itemPathUtils.useItemRef)(subregisters !== undefined, selectedItemPath);
|
|
131
134
|
const maybeSelectedRegisterItemData = useObjectData({
|
|
132
135
|
objectPaths: selectedItemPath ? [selectedItemPath] : []
|
|
133
136
|
}).value.data[selectedItemPath !== null && selectedItemPath !== void 0 ? selectedItemPath : ''];
|
|
134
|
-
const selectedRegisterItem = (0,
|
|
137
|
+
const selectedRegisterItem = (0, _react.useMemo)(() => selectedItemRef ? maybeSelectedRegisterItemData && (0, _types.isRegisterItem)(maybeSelectedRegisterItemData) ? {
|
|
135
138
|
item: maybeSelectedRegisterItemData,
|
|
136
139
|
ref: selectedItemRef,
|
|
137
140
|
itemClass: itemClassConfiguration[selectedItemRef.classID]
|
|
138
|
-
} : undefined : null; //
|
|
141
|
+
} : undefined : null, [selectedItemRef, maybeSelectedRegisterItemData]); // Active CR
|
|
142
|
+
|
|
143
|
+
const [activeChangeRequestID, setActiveChangeRequestID] = (0, _react.useState)(null); // TODO: Confirm that end extensions using RegistryKit can’t just import hooks
|
|
139
144
|
// from RegistryKit and we really have to pass this to them via context
|
|
140
145
|
// TODO: Why not use useObjectData directly? Since register item paths
|
|
141
146
|
// are just object paths. The casting here is optimistic, since an item at given path
|
|
142
147
|
// may not be a RegisterItem.
|
|
143
148
|
|
|
144
|
-
const useRegisterItemData = opts => {
|
|
149
|
+
const useRegisterItemData = (0, _react.useCallback)(opts => {
|
|
145
150
|
var _a, _b; // Original item path mapped to its potential alternative path in current CR,
|
|
146
151
|
// if the item is clarified or added in it.
|
|
147
152
|
// TODO(perf): Access CR data and check whether the item is affected instead of blindly trying CR paths
|
|
@@ -191,21 +196,25 @@ const BrowserCtxProvider = function ({
|
|
|
191
196
|
return { ...result,
|
|
192
197
|
value: itemData
|
|
193
198
|
};
|
|
194
|
-
}; // Register data
|
|
195
|
-
|
|
199
|
+
}, [useObjectData, activeChangeRequestID]); // Register data
|
|
196
200
|
|
|
197
201
|
const registerMetadataReq = useObjectData({
|
|
198
|
-
objectPaths: [_common.REGISTER_METADATA_FILENAME]
|
|
202
|
+
objectPaths: [_common.REGISTER_METADATA_FILENAME],
|
|
203
|
+
nounLabel: 'register meta'
|
|
199
204
|
});
|
|
200
205
|
const maybeRegisterMetadata = (_b = (_a = registerMetadataReq.value.data) === null || _a === void 0 ? void 0 : _a[_common.REGISTER_METADATA_FILENAME]) !== null && _b !== void 0 ? _b : registerMetadataReq.isUpdating ? undefined : null;
|
|
201
206
|
const registerMetadata = !maybeRegisterMetadata || (0, _types.isRegisterMetadata)(maybeRegisterMetadata) ? maybeRegisterMetadata : null;
|
|
202
207
|
const remoteUsername = useRemoteUsername().value.username;
|
|
203
|
-
const stakeholder =
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
208
|
+
const stakeholder = (0, _react.useMemo)(() => {
|
|
209
|
+
var _a;
|
|
210
|
+
|
|
211
|
+
return remoteUsername ? ((_a = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.stakeholders) !== null && _a !== void 0 ? _a : []).find(s => s.gitServerUsername === remoteUsername) : undefined;
|
|
212
|
+
}, [remoteUsername, registerMetadata]);
|
|
213
|
+
const getRelatedItemClassConfiguration = (0, _react.useMemo)(() => (0, _util._getRelatedClass)(itemClassConfiguration), [itemClassConfiguration]);
|
|
214
|
+
const [activeChangeRequestIDDebounced] = (0, _useDebounce.useDebounce)(activeChangeRequestID, 200);
|
|
215
|
+
const customViewsMemoized = (0, _react.useMemo)(() => customViews !== null && customViews !== void 0 ? customViews : [], [customViews]);
|
|
207
216
|
return (0, _react2.jsx)(_BrowserCtx.BrowserCtx.Provider, {
|
|
208
|
-
value: {
|
|
217
|
+
value: (0, _react.useMemo)(() => ({
|
|
209
218
|
stakeholder,
|
|
210
219
|
registerMetadata,
|
|
211
220
|
offline: remoteUsername === undefined ? true : undefined,
|
|
@@ -213,15 +222,15 @@ const BrowserCtxProvider = function ({
|
|
|
213
222
|
itemClasses: itemClassConfiguration,
|
|
214
223
|
jumpTo: spawnTab,
|
|
215
224
|
selectedRegisterItem,
|
|
216
|
-
activeChangeRequestID,
|
|
225
|
+
activeChangeRequestID: activeChangeRequestIDDebounced,
|
|
217
226
|
setActiveChangeRequestID,
|
|
218
227
|
useRegisterItemData,
|
|
219
|
-
getRelatedItemClassConfiguration
|
|
220
|
-
customViews:
|
|
228
|
+
getRelatedItemClassConfiguration,
|
|
229
|
+
customViews: customViewsMemoized,
|
|
221
230
|
keyExpression,
|
|
222
231
|
defaultSearchCriteria
|
|
223
|
-
}
|
|
232
|
+
}), [selectedRegisterItem, activeChangeRequestIDDebounced, stakeholder, registerMetadata, remoteUsername, subregisters, spawnTab, useRegisterItemData, customViewsMemoized, itemClassConfiguration, subregisters, keyExpression, defaultSearchCriteria])
|
|
224
233
|
}, (0, _react2.jsx)(_ChangeRequestContext.ChangeRequestContextProvider, {
|
|
225
|
-
changeRequestID:
|
|
234
|
+
changeRequestID: activeChangeRequestIDDebounced
|
|
226
235
|
}, children));
|
|
227
236
|
};
|
package/views/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/views/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useState, useMemo } from 'react';\nimport { jsx, css } from '@emotion/react';\n\nimport { ValueHook } from '@riboseinc/paneron-extension-kit/types';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport TabbedWorkspace, { type TabbedWorkspaceProps } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace';\nimport {\n makeContextProvider as makeTabbedWorkspaceContextProvider,\n TabbedWorkspaceContext,\n} from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\n\nimport {\n type RegisterItem,\n type RegisterItemDataHook,\n type RegisterStakeholder,\n type RegistryViewProps,\n isRegisterItem,\n isRegisterMetadata,\n isInternalItemReference,\n} from '../types';\n\nimport { REGISTER_METADATA_FILENAME } from '../common';\n\nimport GenericRelatedItemView from './GenericRelatedItemView';\nimport { sidebarConfig, SidebarID, sidebarIDs } from './sidebar';\nimport { BrowserCtx } from './BrowserCtx';\nimport { _getRelatedClass } from './util';\nimport RegisterHome from './detail/RegisterHome';\nimport protocolRegistry, { Protocols, type Protocol } from './protocolRegistry';\nimport {\n ChangeRequestContext,\n ChangeRequestContextProvider,\n} from './change-request/ChangeRequestContext';\nimport { itemPathInCR, itemPathToItemRefLike } from './itemPathUtils';\nexport { GenericRelatedItemView };\n\n\nconst TabbedWorkspaceContextProvider = makeTabbedWorkspaceContextProvider<Protocol, SidebarID>(\n 'Browse',\n sidebarIDs,\n protocolRegistry);\n\n\nexport const RegistryView: React.FC<RegistryViewProps> = function (props) {\n return (\n <TabbedWorkspaceContextProvider stateKey=\"main-registry-view\">\n <BrowserCtxProvider {...props}>\n <RegistryWorkspace />\n </BrowserCtxProvider>\n </TabbedWorkspaceContextProvider>\n );\n};\n\n\nconst SIDEBAR_WIDTH_SETTING_NAME = 'registryMainSidebarWidthPixels'\n\n\nconst RegistryWorkspace: React.FC<Record<never, never>> = function () {\n const { changeRequest: activeChangeRequest } = useContext(ChangeRequestContext);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const { useSettings, updateSetting, useGlobalSettings } = useContext(DatasetContext);\n\n const globalMode: TabbedWorkspaceProps<any>['globalMode'] = useMemo(\n (() => activeChangeRequest\n ? {\n content: <>\n Viewing register as proposed — contents shown may differ from version in effect\n </>,\n intent: 'danger',\n onClick: () => spawnTab(`${Protocols.CHANGE_REQUEST}:/proposals/${activeChangeRequest.id}/main.yaml`),\n }\n : undefined),\n [activeChangeRequest?.id],\n );\n\n const { value: { settings } } = useSettings();\n const { value: { settings: globalSettings } } = useGlobalSettings();\n\n const stored = settings[SIDEBAR_WIDTH_SETTING_NAME]\n const sidebarWidth: number | undefined = stored && typeof stored === 'number'\n ? stored as number\n : undefined;\n\n return <TabbedWorkspace\n css={css`flex: 1 1 auto;`}\n sidebarConfig={sidebarConfig}\n sidebarPosition={globalSettings.sidebarPosition}\n sidebarIDs={sidebarIDs}\n newTabPrompt={<RegisterHome />}\n globalMode={globalMode}\n sidebarWidth={sidebarWidth}\n onSidebarResize={(width) => {\n updateSetting({ key: SIDEBAR_WIDTH_SETTING_NAME, value: width })\n }}\n />\n};\n\n\nconst BrowserCtxProvider: React.FC<RegistryViewProps> = function ({\n itemClassConfiguration,\n subregisters,\n keyExpression,\n defaultSearchCriteria,\n customViews,\n children,\n}) {\n\n const { useObjectData, useRemoteUsername } = useContext(DatasetContext);\n const { focusedTabURI, spawnTab } = useContext(TabbedWorkspaceContext);\n\n const selectedItemPath: string | null =\n focusedTabURI && focusedTabURI.startsWith(`${Protocols.ITEM_DETAILS}:`)\n ? focusedTabURI.split(':')[1]\n : null;\n\n const selectedItemRef: Record<string, string> | null =\n selectedItemPath\n ? itemPathToItemRefLike(subregisters !== undefined, selectedItemPath)\n : null;\n\n const maybeSelectedRegisterItemData: Record<string, any> | null = useObjectData({\n objectPaths: selectedItemPath ? [selectedItemPath] : [],\n }).value.data[selectedItemPath ?? ''];\n\n const selectedRegisterItem: BrowserCtx['selectedRegisterItem'] =\n isInternalItemReference(selectedItemRef)\n ? maybeSelectedRegisterItemData &&\n isRegisterItem(maybeSelectedRegisterItemData)\n ? {\n item: maybeSelectedRegisterItemData,\n ref: selectedItemRef,\n itemClass: itemClassConfiguration[selectedItemRef.classID],\n }\n : undefined\n : null;\n\n // TODO: Confirm that end extensions using RegistryKit can’t just import hooks\n // from RegistryKit and we really have to pass this to them via context\n // TODO: Why not use useObjectData directly? Since register item paths\n // are just object paths. The casting here is optimistic, since an item at given path\n // may not be a RegisterItem.\n const useRegisterItemData: RegisterItemDataHook = (opts) => {\n // Original item path mapped to its potential alternative path in current CR,\n // if the item is clarified or added in it.\n // TODO(perf): Access CR data and check whether the item is affected instead of blindly trying CR paths\n const pathsToRequest: Record<string, string> = {};\n\n const { changeRequest: activeChangeRequest } = useContext(ChangeRequestContext);\n\n\n for (const givenItemPath of opts.itemPaths) {\n pathsToRequest[givenItemPath] = givenItemPath;\n\n // Don’t use CR alternative path for any path that is already explicitly in-CR.\n // TODO(perf): move out of the loop what’s possible, use map-reduce maybe too\n if (!opts.ignoreActiveCR && !givenItemPath.startsWith('/proposals') && activeChangeRequest?.id) {\n pathsToRequest[itemPathInCR(givenItemPath, activeChangeRequest.id)] = givenItemPath;\n }\n }\n\n const result = useObjectData({\n objectPaths: Object.keys(pathsToRequest),\n nounLabel: 'register item(s)',\n }) as ValueHook<{ data: Record<string, Record<string, any> | null> }>;\n\n const itemData: Record<string, RegisterItem<any> | null> = {};\n for (const [alternativePath, itemPath] of Object.entries(pathsToRequest)) {\n const data = result.value.data[alternativePath]\n ?? result.value.data[itemPath]\n ?? null;\n if (isRegisterItem(data) || data === null) {\n itemData[itemPath] = data;\n }\n }\n\n // Convert dates\n // const parsedData: Record<string, RegisterItem<any> | null> = Object.entries(result.value.data).\n // map(([ path, data ]) => {\n // return {\n // [path]: data !== null\n // ? {\n // ...data,\n // dateAccepted: parseISO(data!.dateAccepted as unknown as string),\n // }\n // : null,\n // };\n // }).\n // reduce((p, c) => ({ ...p, ...c }), {});\n\n return {\n ...result,\n value: itemData,\n };\n };\n\n\n // Register data\n\n const registerMetadataReq = useObjectData({\n objectPaths: [REGISTER_METADATA_FILENAME],\n }) as ValueHook<{ data: Record<string, Record<string, any> | null> }>;\n const maybeRegisterMetadata =\n registerMetadataReq.value.data?.[REGISTER_METADATA_FILENAME] ??\n (registerMetadataReq.isUpdating ? undefined : null);\n const registerMetadata = !maybeRegisterMetadata || isRegisterMetadata(maybeRegisterMetadata)\n ? maybeRegisterMetadata\n : null;\n\n const remoteUsername: string | undefined = useRemoteUsername().value.username;\n\n const stakeholder: RegisterStakeholder | undefined = remoteUsername\n ? (registerMetadata?.stakeholders ?? []).\n find(s => s.gitServerUsername === remoteUsername)\n : undefined;\n\n\n // Active CR\n\n const [ activeChangeRequestID, setActiveChangeRequestID ] = useState<string | null>(null);\n\n const getRelatedClass = _getRelatedClass(itemClassConfiguration);\n\n return (\n <BrowserCtx.Provider\n value={{\n stakeholder,\n registerMetadata,\n offline: remoteUsername === undefined ? true : undefined,\n\n subregisters,\n itemClasses: itemClassConfiguration,\n\n jumpTo: spawnTab,\n\n selectedRegisterItem,\n\n activeChangeRequestID,\n setActiveChangeRequestID,\n\n useRegisterItemData,\n getRelatedItemClassConfiguration: getRelatedClass,\n customViews: customViews ?? [],\n\n keyExpression,\n defaultSearchCriteria,\n }}>\n <ChangeRequestContextProvider changeRequestID={activeChangeRequestID}>\n {children}\n </ChangeRequestContextProvider>\n </BrowserCtx.Provider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/views/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext, useCallback, useState, useMemo } from 'react';\nimport { useDebounce } from 'use-debounce';\nimport { jsx, css } from '@emotion/react';\n\nimport type { ValueHook } from '@riboseinc/paneron-extension-kit/types';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport TabbedWorkspace, { type TabbedWorkspaceProps } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace';\nimport {\n makeContextProvider as makeTabbedWorkspaceContextProvider,\n TabbedWorkspaceContext,\n} from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\n\nimport {\n type RegisterItem,\n type RegisterItemDataHook,\n type RegisterStakeholder,\n type RegistryViewProps,\n type InternalItemReference,\n isRegisterItem,\n isRegisterMetadata,\n} from '../types';\n\nimport { REGISTER_METADATA_FILENAME } from '../common';\n\nimport GenericRelatedItemView from './GenericRelatedItemView';\nimport { sidebarConfig, type SidebarID, sidebarIDs } from './sidebar';\nimport { BrowserCtx } from './BrowserCtx';\nimport { _getRelatedClass } from './util';\nimport RegisterHome from './detail/RegisterHome';\nimport protocolRegistry, { Protocols, type Protocol } from './protocolRegistry';\nimport {\n ChangeRequestContext,\n ChangeRequestContextProvider,\n} from './change-request/ChangeRequestContext';\nimport { useItemRef, itemPathInCR } from './itemPathUtils';\nexport { GenericRelatedItemView };\n\n\nconst TabbedWorkspaceContextProvider = makeTabbedWorkspaceContextProvider<Protocol, SidebarID>(\n 'Browse',\n sidebarIDs,\n protocolRegistry);\n\n\nexport const RegistryView: React.FC<RegistryViewProps> = function (props) {\n return (\n <TabbedWorkspaceContextProvider stateKey=\"main-registry-view\">\n <BrowserCtxProvider {...props}>\n <RegistryWorkspace />\n </BrowserCtxProvider>\n </TabbedWorkspaceContextProvider>\n );\n};\n\n\nconst SIDEBAR_WIDTH_SETTING_NAME = 'registryMainSidebarWidthPixels'\n\n\nconst RegistryWorkspace: React.FC<Record<never, never>> = function () {\n const { changeRequest: activeChangeRequest } = useContext(ChangeRequestContext);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n const { useSettings, updateSetting, useGlobalSettings } = useContext(DatasetContext);\n\n const globalMode: TabbedWorkspaceProps<any>['globalMode'] = useMemo(\n (() => activeChangeRequest\n ? {\n content: <>\n Viewing register as proposed — contents shown may differ from version in effect\n </>,\n intent: 'danger',\n onClick: () => spawnTab(`${Protocols.CHANGE_REQUEST}:/proposals/${activeChangeRequest.id}/main.yaml`),\n }\n : undefined),\n [activeChangeRequest?.id, spawnTab],\n );\n\n const { value: { settings } } = useSettings();\n const { value: { settings: globalSettings } } = useGlobalSettings();\n\n const stored = settings[SIDEBAR_WIDTH_SETTING_NAME];\n const sidebarWidth: number | undefined = stored && typeof stored === 'number'\n ? stored as number\n : undefined;\n\n return <TabbedWorkspace\n css={css`flex: 1 1 auto;`}\n sidebarConfig={sidebarConfig}\n sidebarPosition={globalSettings.sidebarPosition}\n sidebarIDs={sidebarIDs}\n newTabPrompt={<RegisterHome />}\n globalMode={globalMode}\n sidebarWidth={sidebarWidth}\n onSidebarResize={useCallback((width) => {\n updateSetting({ key: SIDEBAR_WIDTH_SETTING_NAME, value: width })\n }, [updateSetting])}\n />\n};\n\n\nconst BrowserCtxProvider: React.FC<RegistryViewProps> = function ({\n itemClassConfiguration,\n subregisters,\n keyExpression,\n defaultSearchCriteria,\n customViews,\n children,\n}) {\n\n const { useObjectData, useRemoteUsername } = useContext(DatasetContext);\n const { focusedTabURI, spawnTab } = useContext(TabbedWorkspaceContext);\n\n\n // Active item\n\n const selectedItemPath: string | null = useMemo((() =>\n focusedTabURI && focusedTabURI.startsWith(`${Protocols.ITEM_DETAILS}:`)\n ? focusedTabURI.split(':')[1]\n : null\n ), [focusedTabURI]);\n\n const selectedItemRef: InternalItemReference | null = useItemRef(\n subregisters !== undefined,\n selectedItemPath);\n\n const maybeSelectedRegisterItemData: Record<string, any> | null = useObjectData({\n objectPaths: selectedItemPath ? [selectedItemPath] : [],\n }).value.data[selectedItemPath ?? ''];\n\n const selectedRegisterItem: BrowserCtx['selectedRegisterItem'] = useMemo((() =>\n selectedItemRef\n ? maybeSelectedRegisterItemData &&\n isRegisterItem(maybeSelectedRegisterItemData)\n ? {\n item: maybeSelectedRegisterItemData,\n ref: selectedItemRef,\n itemClass: itemClassConfiguration[selectedItemRef.classID],\n }\n : undefined\n : null\n ), [selectedItemRef, maybeSelectedRegisterItemData]);\n\n\n // Active CR\n\n const [ activeChangeRequestID, setActiveChangeRequestID ] = useState<string | null>(null);\n\n\n // TODO: Confirm that end extensions using RegistryKit can’t just import hooks\n // from RegistryKit and we really have to pass this to them via context\n // TODO: Why not use useObjectData directly? Since register item paths\n // are just object paths. The casting here is optimistic, since an item at given path\n // may not be a RegisterItem.\n const useRegisterItemData: RegisterItemDataHook = useCallback((opts) => {\n // Original item path mapped to its potential alternative path in current CR,\n // if the item is clarified or added in it.\n // TODO(perf): Access CR data and check whether the item is affected instead of blindly trying CR paths\n const pathsToRequest: Record<string, string> = {};\n\n const { changeRequest: activeChangeRequest } = useContext(ChangeRequestContext);\n\n\n for (const givenItemPath of opts.itemPaths) {\n pathsToRequest[givenItemPath] = givenItemPath;\n\n // Don’t use CR alternative path for any path that is already explicitly in-CR.\n // TODO(perf): move out of the loop what’s possible, use map-reduce maybe too\n if (!opts.ignoreActiveCR && !givenItemPath.startsWith('/proposals') && activeChangeRequest?.id) {\n pathsToRequest[itemPathInCR(givenItemPath, activeChangeRequest.id)] = givenItemPath;\n }\n }\n\n const result = useObjectData({\n objectPaths: Object.keys(pathsToRequest),\n nounLabel: 'register item(s)',\n }) as ValueHook<{ data: Record<string, Record<string, any> | null> }>;\n\n const itemData: Record<string, RegisterItem<any> | null> = {};\n for (const [alternativePath, itemPath] of Object.entries(pathsToRequest)) {\n const data = result.value.data[alternativePath]\n ?? result.value.data[itemPath]\n ?? null;\n if (isRegisterItem(data) || data === null) {\n itemData[itemPath] = data;\n }\n }\n\n // Convert dates\n // const parsedData: Record<string, RegisterItem<any> | null> = Object.entries(result.value.data).\n // map(([ path, data ]) => {\n // return {\n // [path]: data !== null\n // ? {\n // ...data,\n // dateAccepted: parseISO(data!.dateAccepted as unknown as string),\n // }\n // : null,\n // };\n // }).\n // reduce((p, c) => ({ ...p, ...c }), {});\n\n return {\n ...result,\n value: itemData,\n };\n }, [useObjectData, activeChangeRequestID]);\n\n\n // Register data\n\n const registerMetadataReq = useObjectData({\n objectPaths: [REGISTER_METADATA_FILENAME],\n nounLabel: 'register meta',\n }) as ValueHook<{ data: Record<string, Record<string, any> | null> }>;\n const maybeRegisterMetadata =\n registerMetadataReq.value.data?.[REGISTER_METADATA_FILENAME] ??\n (registerMetadataReq.isUpdating ? undefined : null);\n const registerMetadata = !maybeRegisterMetadata || isRegisterMetadata(maybeRegisterMetadata)\n ? maybeRegisterMetadata\n : null;\n\n const remoteUsername: string | undefined = useRemoteUsername().value.username;\n\n const stakeholder: RegisterStakeholder | undefined = useMemo((() => remoteUsername\n ? (registerMetadata?.stakeholders ?? []).\n find(s => s.gitServerUsername === remoteUsername)\n : undefined\n ), [remoteUsername, registerMetadata]);\n\n const getRelatedItemClassConfiguration = useMemo(\n (() => _getRelatedClass(itemClassConfiguration)),\n [itemClassConfiguration]);\n\n const [activeChangeRequestIDDebounced] = useDebounce(activeChangeRequestID, 200);\n const customViewsMemoized = useMemo((() => customViews ?? []), [customViews]); \n\n return (\n <BrowserCtx.Provider\n value={useMemo((() => ({\n stakeholder,\n registerMetadata,\n offline: remoteUsername === undefined ? true : undefined,\n\n subregisters,\n itemClasses: itemClassConfiguration,\n\n jumpTo: spawnTab,\n\n selectedRegisterItem,\n\n activeChangeRequestID: activeChangeRequestIDDebounced,\n setActiveChangeRequestID,\n\n useRegisterItemData,\n getRelatedItemClassConfiguration,\n customViews: customViewsMemoized,\n\n keyExpression,\n defaultSearchCriteria,\n })), [\n selectedRegisterItem,\n activeChangeRequestIDDebounced,\n stakeholder,\n registerMetadata,\n remoteUsername,\n subregisters,\n spawnTab,\n useRegisterItemData,\n customViewsMemoized,\n itemClassConfiguration,\n subregisters,\n keyExpression,\n defaultSearchCriteria,\n ])}>\n <ChangeRequestContextProvider changeRequestID={activeChangeRequestIDDebounced}>\n {children}\n </ChangeRequestContextProvider>\n </BrowserCtx.Provider>\n );\n}\n"]}
|
package/views/itemPathUtils.d.ts
CHANGED
|
@@ -14,15 +14,10 @@ export declare function itemRefToItemPath({ subregisterID, classID, itemID }: In
|
|
|
14
14
|
*/
|
|
15
15
|
export declare function incompleteItemRefToItemPathPrefix({ subregisterID, classID }: Omit<InternalItemReference, 'itemID'>, inCRWithID?: string): string;
|
|
16
16
|
/**
|
|
17
|
-
*
|
|
18
|
-
* given
|
|
19
|
-
* If some components are missing, returns an incomplete reference.
|
|
17
|
+
* Gives memoized structured item reference or `null`,
|
|
18
|
+
* given subregisters and `itemPath`.
|
|
20
19
|
*/
|
|
21
|
-
export declare function
|
|
22
|
-
itemID?: string;
|
|
23
|
-
classID?: string;
|
|
24
|
-
subregisterID?: string;
|
|
25
|
-
};
|
|
20
|
+
export declare function useItemRef(hasSubregisters: boolean, itemPath: null | undefined | string): InternalItemReference | null;
|
|
26
21
|
/** Returns just register item ID, given dataset-relative path. */
|
|
27
22
|
export declare function itemPathToItemID(objPath: string): string | undefined;
|
|
28
23
|
/**
|
package/views/itemPathUtils.js
CHANGED
|
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.itemRefToItemPath = itemRefToItemPath;
|
|
7
7
|
exports.incompleteItemRefToItemPathPrefix = incompleteItemRefToItemPathPrefix;
|
|
8
|
-
exports.
|
|
8
|
+
exports.useItemRef = useItemRef;
|
|
9
9
|
exports.itemPathToItemID = itemPathToItemID;
|
|
10
10
|
exports.itemPathToItemRef = itemPathToItemRef;
|
|
11
11
|
exports.getCRIDFromProposedItemPath = getCRIDFromProposedItemPath;
|
|
@@ -14,6 +14,10 @@ exports.itemPathNotInCR = itemPathNotInCR;
|
|
|
14
14
|
exports.crIDToCRPath = crIDToCRPath;
|
|
15
15
|
exports.crPathToCRID = crPathToCRID;
|
|
16
16
|
|
|
17
|
+
var _react = require("react");
|
|
18
|
+
|
|
19
|
+
var _types = require("../types");
|
|
20
|
+
|
|
17
21
|
/**
|
|
18
22
|
* Returns dataset-relative path to a register item,
|
|
19
23
|
* given structured item reference.
|
|
@@ -47,6 +51,27 @@ function incompleteItemRefToItemPathPrefix({
|
|
|
47
51
|
const maybeInCR = inCRWithID !== undefined ? `/proposals/${inCRWithID}/items/${fullPath}` : `/${fullPath}`;
|
|
48
52
|
return maybeInCR;
|
|
49
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Gives memoized structured item reference or `null`,
|
|
56
|
+
* given subregisters and `itemPath`.
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
function useItemRef(hasSubregisters, itemPath) {
|
|
61
|
+
return (0, _react.useMemo)(() => {
|
|
62
|
+
if (itemPath) {
|
|
63
|
+
const maybeItemRef = itemPathToItemRefLike(hasSubregisters, itemPath);
|
|
64
|
+
|
|
65
|
+
if ((0, _types.isInternalItemReference)(maybeItemRef)) {
|
|
66
|
+
return maybeItemRef;
|
|
67
|
+
} else {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}, [hasSubregisters, itemPath]);
|
|
74
|
+
}
|
|
50
75
|
/**
|
|
51
76
|
* Attempts to return a structured register item reference
|
|
52
77
|
* given a dataset-relative item path.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"itemPathUtils.js","sourceRoot":"","sources":["../../src/views/itemPathUtils.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"itemPathUtils.js","sourceRoot":"","sources":["../../src/views/itemPathUtils.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useMemo } from 'react';\nimport { isInternalItemReference } from '../types';\nimport type { InternalItemReference } from '../types';\n\n\n/**\n * Returns dataset-relative path to a register item,\n * given structured item reference.\n *\n * Optionally makes path include given change request contents.\n */\nexport function itemRefToItemPath(\n { subregisterID, classID, itemID }: InternalItemReference,\n inCRWithID?: string,\n): string {\n return `${incompleteItemRefToItemPathPrefix({ subregisterID, classID }, inCRWithID)}/${itemID}.yaml`;\n}\n\n\n/**\n * Returns dataset-relative prefix to a register item,\n * given structured item reference without `itemID`.\n *\n * Optionally makes path include given change request contents.\n */\nexport function incompleteItemRefToItemPathPrefix(\n { subregisterID, classID }: Omit<InternalItemReference, 'itemID'>,\n inCRWithID?: string,\n): string {\n const itemWithClass = `${classID}`;\n const fullPath = subregisterID\n ? `subregisters/${subregisterID}/${itemWithClass}`\n : itemWithClass;\n const maybeInCR = inCRWithID !== undefined\n ? `/proposals/${inCRWithID}/items/${fullPath}`\n : `/${fullPath}`;\n return maybeInCR;\n}\n\n/**\n * Gives memoized structured item reference or `null`,\n * given subregisters and `itemPath`.\n */\nexport function useItemRef(\n hasSubregisters: boolean,\n itemPath: null | undefined | string,\n): InternalItemReference | null {\n return useMemo(() => {\n if (itemPath) {\n const maybeItemRef = itemPathToItemRefLike(hasSubregisters, itemPath);\n if (isInternalItemReference(maybeItemRef)) {\n return maybeItemRef;\n } else {\n return null;\n }\n } else {\n return null;\n }\n }, [hasSubregisters, itemPath]);\n}\n\n/**\n * Attempts to return a structured register item reference\n * given a dataset-relative item path.\n * If some components are missing, returns an incomplete reference.\n */\nfunction itemPathToItemRefLike(hasSubregisters: boolean, itemPath: string):\n{ itemID?: string; classID?: string; subregisterID?: string; } {\n const pathNormalized = itemPath.trim()\n ? stripLeadingSlash(itemPathNotInCR(itemPath))\n : undefined;\n const pathParts = pathNormalized?.split('/') ?? [];\n\n const subregisterID: string | undefined = hasSubregisters && pathParts.length >= 1\n ? pathParts[1]\n : undefined;\n\n const classID: string | undefined = hasSubregisters\n ? pathParts.length >= 3\n ? pathParts[2]\n : undefined\n : pathParts.length >= 1\n ? pathParts[0]\n : undefined;\n\n const itemID: string | undefined =\n (hasSubregisters && pathParts.length === 4) ||\n (!hasSubregisters && pathParts.length === 2)\n ? pathParts[pathParts.length - 1].split('.')[0]\n : undefined;\n\n return { subregisterID, classID, itemID };\n}\n\n/** Returns just register item ID, given dataset-relative path. */\nexport function itemPathToItemID(objPath: string): string | undefined {\n const objPathComponents = objPath?.split('/');\n const selectedItemID = objPathComponents !== undefined\n ? objPathComponents[objPathComponents.length - 1].split('.')[0]\n : undefined;\n return selectedItemID;\n}\n\n/**\n * Attempts to return a structured register item reference\n * given a dataset-relative item path.\n * If some components are missing, throws an Error.\n */\nexport function itemPathToItemRef(hasSubregisters: boolean, itemPath: string): InternalItemReference {\n const maybeRef = itemPathToItemRefLike(hasSubregisters, itemPath);\n if (maybeRef.classID && maybeRef.itemID) {\n return maybeRef as InternalItemReference;\n } else {\n console.error(\"Internal item reference cannot be constructed from given item path, got\", maybeRef, itemPath, hasSubregisters, \"from\", itemPath);\n throw new Error(\"Internal item reference cannot be constructed from given item path\");\n }\n}\n\n\nconst CR_ITEM_PREFIX_REGEX = /^proposals\\/(?<crID>\\p{Hex_Digit}{8}(?:-\\p{Hex_Digit}{4}){3}-\\p{Hex_Digit}{12})\\/items\\//u;\n\n\n/**\n * If given item path indicates that it is within any CR, returns respective CR ID.\n * Otherwise, returns `null`.\n */\nexport function getCRIDFromProposedItemPath(givenItemPath: string): string | null {\n return stripLeadingSlash(givenItemPath).match(CR_ITEM_PREFIX_REGEX)?.groups?.crID ?? null;\n}\n\n\n/**\n * Given an item path, returns path relative to specified CR ID\n * (even if the path is already relative to another CR ID).\n */\nexport function itemPathInCR(givenItemPath: string, crID: string): string {\n // Remove any CR prefix from given path\n // TODO(perf): Don’t do if prefix matches CR ID already specified?\n // TODO: Validate given path actually looks like a register item path and throw?\n const normalized = stripLeadingSlash(givenItemPath).replace(CR_ITEM_PREFIX_REGEX, '');\n return `/proposals/${crID}/items/${normalized}`;\n}\n\n/**\n * Returns given item path in register-relative form,\n * even if the path is given within proposal contents.\n */\nexport function itemPathNotInCR(givenItemPath: string): string {\n const normalized = stripLeadingSlash(givenItemPath).replace(CR_ITEM_PREFIX_REGEX, '');\n return `/${normalized}`;\n}\n\nfunction stripLeadingSlash(aPath: string): string {\n return aPath.replace(/^\\//, '');\n}\n\n\n/** Converts a change request ID to dataset-relative path to respective main.yaml. */\nexport function crIDToCRPath(crID: string): string {\n return `/proposals/${crID}/main.yaml`;\n}\n\n/** Extracts change request ID from dataset-relative path to its main.yaml. */\nexport function crPathToCRID(crPath: string): string {\n return (\n stripLeadingSlash(crPath).\n replace('proposals/', '').\n split('/')[0]\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ProtocolRegistry } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/types';
|
|
1
|
+
import type { ProtocolRegistry } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/types';
|
|
2
2
|
export declare const Protocols: {
|
|
3
3
|
readonly ITEM_DETAILS: "itemdetails";
|
|
4
4
|
readonly REGISTER_META: "registermeta";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protocolRegistry.js","sourceRoot":"","sources":["../../src/views/protocolRegistry.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,aAAa,MAAM,wBAAwB,CAAC;AACnD,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,YAAY,EAAE,aAAa;IAC3B,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,WAAW,EAAE,YAAY;CACjB,CAAC;AAIX,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAe,CAAC;AAEhE,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,SAAS,CAAC,OAAO,CAAC,GAAe,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,sEAAsE;AACtE,iCAAiC;AACjC,MAAM,gBAAgB,GAA+B;IACnD,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,YAAY;IACtC,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,YAAY;IACvC,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,aAAa;IACzC,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,UAAU;CACpC,CAAC;AAEF,eAAe,gBAAgB,CAAC","sourcesContent":["import { ProtocolRegistry } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/types';\nimport RegisterItem from './detail/RegisterItem';\nimport RegisterMeta from './detail/RegisterMeta';\nimport ChangeRequest from './detail/ChangeRequest';\nimport CustomView from './detail/CustomView';\n\nexport const Protocols = {\n ITEM_DETAILS: 'itemdetails',\n REGISTER_META: 'registermeta',\n CHANGE_REQUEST: 'changerequest',\n CUSTOM_VIEW: 'customview',\n} as const;\n\nexport type Protocol = typeof Protocols[keyof typeof Protocols];\n\nexport const protocols = Object.values(Protocols) as Protocol[];\n\nexport function isValidProtocol(val: string): val is Protocol {\n return protocols.indexOf(val as Protocol) >= 0;\n}\n\n// TODO: Implement proper registration pattern rather than registering\n// these in a centralized manner.\nconst protocolRegistry: ProtocolRegistry<Protocol> = {\n [Protocols.ITEM_DETAILS]: RegisterItem,\n [Protocols.REGISTER_META]: RegisterMeta,\n [Protocols.CHANGE_REQUEST]: ChangeRequest,\n [Protocols.CUSTOM_VIEW]: CustomView,\n};\n\nexport default protocolRegistry;\n"]}
|
|
1
|
+
{"version":3,"file":"protocolRegistry.js","sourceRoot":"","sources":["../../src/views/protocolRegistry.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,aAAa,MAAM,wBAAwB,CAAC;AACnD,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,YAAY,EAAE,aAAa;IAC3B,aAAa,EAAE,cAAc;IAC7B,cAAc,EAAE,eAAe;IAC/B,WAAW,EAAE,YAAY;CACjB,CAAC;AAIX,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAe,CAAC;AAEhE,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,SAAS,CAAC,OAAO,CAAC,GAAe,CAAC,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,sEAAsE;AACtE,iCAAiC;AACjC,MAAM,gBAAgB,GAA+B;IACnD,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,YAAY;IACtC,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE,YAAY;IACvC,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,aAAa;IACzC,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,UAAU;CACpC,CAAC;AAEF,eAAe,gBAAgB,CAAC","sourcesContent":["import type { ProtocolRegistry } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/types';\nimport RegisterItem from './detail/RegisterItem';\nimport RegisterMeta from './detail/RegisterMeta';\nimport ChangeRequest from './detail/ChangeRequest';\nimport CustomView from './detail/CustomView';\n\nexport const Protocols = {\n ITEM_DETAILS: 'itemdetails',\n REGISTER_META: 'registermeta',\n CHANGE_REQUEST: 'changerequest',\n CUSTOM_VIEW: 'customview',\n} as const;\n\nexport type Protocol = typeof Protocols[keyof typeof Protocols];\n\nexport const protocols = Object.values(Protocols) as Protocol[];\n\nexport function isValidProtocol(val: string): val is Protocol {\n return protocols.indexOf(val as Protocol) >= 0;\n}\n\n// TODO: Implement proper registration pattern rather than registering\n// these in a centralized manner.\nconst protocolRegistry: ProtocolRegistry<Protocol> = {\n [Protocols.ITEM_DETAILS]: RegisterItem,\n [Protocols.REGISTER_META]: RegisterMeta,\n [Protocols.CHANGE_REQUEST]: ChangeRequest,\n [Protocols.CUSTOM_VIEW]: CustomView,\n};\n\nexport default protocolRegistry;\n"]}
|
|
@@ -46,7 +46,23 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
46
46
|
/** @jsx jsx */
|
|
47
47
|
|
|
48
48
|
/** @jsxFrag React.Fragment */
|
|
49
|
-
const
|
|
49
|
+
const initialState = {
|
|
50
|
+
selectedFolderID: null,
|
|
51
|
+
enteredFolderID: null,
|
|
52
|
+
selectedItemPath: null
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
function validateState(loadedValue) {
|
|
56
|
+
return _validateFolderID(loadedValue.enteredFolderID) && _validateFolderID(loadedValue.selectedFolderID) && loadedValue.selectedItemPath !== undefined;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
;
|
|
60
|
+
|
|
61
|
+
function _validateFolderID(foldID) {
|
|
62
|
+
return foldID !== undefined && (foldID === null || foldID.startsWith('by-item-class/') || foldID.startsWith('by-subregister/'));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const Browse = (0, _react.memo)(function ({
|
|
50
66
|
stateName,
|
|
51
67
|
onOpenItem,
|
|
52
68
|
className,
|
|
@@ -73,13 +89,7 @@ const Browse = function ({
|
|
|
73
89
|
changeRequest: activeCR,
|
|
74
90
|
canEdit: activeCRIsEditable
|
|
75
91
|
} = (0, _react.useContext)(_ChangeRequestContext.ChangeRequestContext);
|
|
76
|
-
const [state, dispatch] = usePersistentDatasetStateReducer(stateName !== null && stateName !== void 0 ? stateName : 'browse-sidebar', undefined,
|
|
77
|
-
function validateFolderID(foldID) {
|
|
78
|
-
return foldID !== undefined && (foldID === null || foldID.startsWith('by-item-class/') || foldID.startsWith('by-subregister/'));
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return validateFolderID(loadedValue.enteredFolderID) && validateFolderID(loadedValue.selectedFolderID) && loadedValue.selectedItemPath !== undefined;
|
|
82
|
-
}, (prevState, action) => {
|
|
92
|
+
const [state, dispatch] = usePersistentDatasetStateReducer(stateName !== null && stateName !== void 0 ? stateName : 'browse-sidebar', undefined, validateState, (prevState, action) => {
|
|
83
93
|
switch (action.type) {
|
|
84
94
|
case 'select-folder':
|
|
85
95
|
if (prevState.enteredFolderID !== null) {
|
|
@@ -122,11 +132,7 @@ const Browse = function ({
|
|
|
122
132
|
default:
|
|
123
133
|
throw new Error("Unexpected browse state");
|
|
124
134
|
}
|
|
125
|
-
},
|
|
126
|
-
selectedFolderID: null,
|
|
127
|
-
enteredFolderID: null,
|
|
128
|
-
selectedItemPath: null
|
|
129
|
-
}, null); // If currently focused tab changed, select corresponding item in view
|
|
135
|
+
}, initialState, null); // If currently focused tab changed, select corresponding item in view
|
|
130
136
|
|
|
131
137
|
(0, _react.useEffect)(() => {
|
|
132
138
|
if (focusedTabURI) {
|
|
@@ -141,9 +147,8 @@ const Browse = function ({
|
|
|
141
147
|
});
|
|
142
148
|
}
|
|
143
149
|
}
|
|
144
|
-
}, [focusedTabURI]);
|
|
145
|
-
|
|
146
|
-
async function handleAdd(classID, subregisterID) {
|
|
150
|
+
}, [focusedTabURI, dispatch]);
|
|
151
|
+
const createItem = (0, _react.useCallback)(async function _createItem(classID, subregisterID) {
|
|
147
152
|
var _a;
|
|
148
153
|
|
|
149
154
|
if (!updateObjects || !makeRandomID || !activeCRIsEditable || !activeCR) {
|
|
@@ -186,7 +191,25 @@ const Browse = function ({
|
|
|
186
191
|
_dangerouslySkipValidation: true
|
|
187
192
|
});
|
|
188
193
|
spawnTab(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${(0, _itemPathUtils.itemRefToItemPath)(ref, activeCR.id)}`);
|
|
189
|
-
}
|
|
194
|
+
}, [activeCR, activeCRIsEditable, subregisters === undefined, spawnTab, updateObjects, makeRandomID]);
|
|
195
|
+
const handleSelectItem = (0, _react.useCallback)(itemPath => dispatch({
|
|
196
|
+
type: 'select-item',
|
|
197
|
+
payload: {
|
|
198
|
+
itemPath
|
|
199
|
+
}
|
|
200
|
+
}), [dispatch]);
|
|
201
|
+
const handleDeselectItem = (0, _react.useCallback)(() => dispatch({
|
|
202
|
+
type: 'select-item',
|
|
203
|
+
payload: {
|
|
204
|
+
itemPath: null
|
|
205
|
+
}
|
|
206
|
+
}), [dispatch]);
|
|
207
|
+
const handleOpenItem = (0, _react.useCallback)(itemPath => (onOpenItem !== null && onOpenItem !== void 0 ? onOpenItem : itemPath => spawnTab(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${itemPath}`))(itemPath), [onOpenItem, spawnTab]);
|
|
208
|
+
const handleExitFolder = (0, _react.useCallback)(() => dispatch({
|
|
209
|
+
type: 'exit-folder'
|
|
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]);
|
|
190
213
|
|
|
191
214
|
if (state.enteredFolderID !== null) {
|
|
192
215
|
// If we are in a folder, show a tree with a single element
|
|
@@ -203,7 +226,7 @@ const Browse = function ({
|
|
|
203
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,
|
|
204
227
|
moreMenu: clsConfig ? (0, _react2.jsx)(ItemClassMenu, {
|
|
205
228
|
cfg: itemClasses[classID],
|
|
206
|
-
onCreate:
|
|
229
|
+
onCreate: handleAdd ? () => handleAdd(classID) : undefined
|
|
207
230
|
}) : undefined
|
|
208
231
|
};
|
|
209
232
|
criteria = {
|
|
@@ -226,7 +249,7 @@ const Browse = function ({
|
|
|
226
249
|
moreMenu: subregConfig ? (0, _react2.jsx)(SubregisterMenu, {
|
|
227
250
|
cfg: subregConfig,
|
|
228
251
|
itemClasses: itemClasses,
|
|
229
|
-
onCreate:
|
|
252
|
+
onCreate: handleAddInSubregister ? clsID => handleAddInSubregister(clsID, subregisterID) : undefined
|
|
230
253
|
}) : undefined
|
|
231
254
|
};
|
|
232
255
|
criteria = {
|
|
@@ -258,18 +281,10 @@ const Browse = function ({
|
|
|
258
281
|
style: style
|
|
259
282
|
}, (0, _react2.jsx)(_core.Tree, {
|
|
260
283
|
css: (0, _react2.css)`flex: 0;`,
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
}
|
|
266
|
-
}),
|
|
267
|
-
onNodeCollapse: () => dispatch({
|
|
268
|
-
type: 'exit-folder'
|
|
269
|
-
}),
|
|
270
|
-
onNodeDoubleClick: () => dispatch({
|
|
271
|
-
type: 'exit-folder'
|
|
272
|
-
}),
|
|
284
|
+
// This click handler deselects any items in results, meaning.
|
|
285
|
+
onNodeClick: handleDeselectItem,
|
|
286
|
+
onNodeCollapse: handleExitFolder,
|
|
287
|
+
onNodeDoubleClick: handleExitFolder,
|
|
273
288
|
contents: [{
|
|
274
289
|
id: 'opened-class',
|
|
275
290
|
isSelected: state.selectedItemPath === null,
|
|
@@ -285,13 +300,8 @@ const Browse = function ({
|
|
|
285
300
|
queryExpression: (0, _itemQueryUtils.getRegisterItemQuery)(queryExpression, activeCR !== null && activeCR !== void 0 ? activeCR : undefined),
|
|
286
301
|
keyExpression: keyExpression,
|
|
287
302
|
selectedItemPath: state.selectedItemPath,
|
|
288
|
-
onSelectItem:
|
|
289
|
-
|
|
290
|
-
payload: {
|
|
291
|
-
itemPath
|
|
292
|
-
}
|
|
293
|
-
}),
|
|
294
|
-
onOpenItem: onOpenItem !== null && onOpenItem !== void 0 ? onOpenItem : itemPath => spawnTab(`${_protocolRegistry.Protocols.ITEM_DETAILS}:${itemPath}`)
|
|
303
|
+
onSelectItem: handleSelectItem,
|
|
304
|
+
onOpenItem: handleOpenItem
|
|
295
305
|
})));
|
|
296
306
|
} else {
|
|
297
307
|
// If we are *not* in a folder, show a list of available folders/views
|
|
@@ -318,7 +328,7 @@ const Browse = function ({
|
|
|
318
328
|
},
|
|
319
329
|
secondaryLabel: (0, _react2.jsx)(MoreMenu, null, (0, _react2.jsx)(ItemClassMenu, {
|
|
320
330
|
cfg: classConfig,
|
|
321
|
-
onCreate:
|
|
331
|
+
onCreate: handleAdd ? () => handleAdd(classID) : undefined
|
|
322
332
|
}))
|
|
323
333
|
})), ...(subregisters ? [{
|
|
324
334
|
id: 'by-subregister',
|
|
@@ -343,7 +353,7 @@ const Browse = function ({
|
|
|
343
353
|
secondaryLabel: (0, _react2.jsx)(MoreMenu, null, (0, _react2.jsx)(SubregisterMenu, {
|
|
344
354
|
cfg: subregisterConfig,
|
|
345
355
|
itemClasses: itemClasses,
|
|
346
|
-
onCreate:
|
|
356
|
+
onCreate: handleAddInSubregister ? clsID => handleAddInSubregister(clsID, subregisterID) : undefined
|
|
347
357
|
}))
|
|
348
358
|
}))] : [])];
|
|
349
359
|
|
|
@@ -387,9 +397,8 @@ const Browse = function ({
|
|
|
387
397
|
contents: contents
|
|
388
398
|
});
|
|
389
399
|
}
|
|
390
|
-
};
|
|
391
|
-
|
|
392
|
-
const MoreMenu = function ({
|
|
400
|
+
});
|
|
401
|
+
const MoreMenu = (0, _react.memo)(function ({
|
|
393
402
|
children
|
|
394
403
|
}) {
|
|
395
404
|
return (0, _react2.jsx)(_popover.Popover2, {
|
|
@@ -400,9 +409,8 @@ const MoreMenu = function ({
|
|
|
400
409
|
small: true,
|
|
401
410
|
minimal: true
|
|
402
411
|
}));
|
|
403
|
-
};
|
|
404
|
-
|
|
405
|
-
const SubregisterMenu = function ({
|
|
412
|
+
});
|
|
413
|
+
const SubregisterMenu = (0, _react.memo)(function ({
|
|
406
414
|
cfg,
|
|
407
415
|
itemClasses,
|
|
408
416
|
onCreate
|
|
@@ -420,9 +428,8 @@ const SubregisterMenu = function ({
|
|
|
420
428
|
onCreate: onCreate ? () => onCreate(classID) : undefined
|
|
421
429
|
}));
|
|
422
430
|
}));
|
|
423
|
-
};
|
|
424
|
-
|
|
425
|
-
const ItemClassMenu = function ({
|
|
431
|
+
});
|
|
432
|
+
const ItemClassMenu = (0, _react.memo)(function ({
|
|
426
433
|
cfg,
|
|
427
434
|
onCreate
|
|
428
435
|
}) {
|
|
@@ -441,8 +448,7 @@ const ItemClassMenu = function ({
|
|
|
441
448
|
onClick: onCreate,
|
|
442
449
|
icon: "plus"
|
|
443
450
|
})) : null);
|
|
444
|
-
};
|
|
445
|
-
|
|
451
|
+
});
|
|
446
452
|
const SearchResultList = (0, _SearchResultList.default)(_ListItem.default, objPath => ({
|
|
447
453
|
name: 'reg. item',
|
|
448
454
|
iconProps: {
|