@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.
Files changed (41) hide show
  1. package/package.json +4 -3
  2. package/types/item.d.ts +1 -0
  3. package/types/item.js +8 -0
  4. package/types/item.js.map +1 -1
  5. package/views/GenericRelatedItemView.js +89 -75
  6. package/views/GenericRelatedItemView.js.map +1 -1
  7. package/views/SearchQuery.js +8 -9
  8. package/views/SearchQuery.js.map +1 -1
  9. package/views/change-request/ChangeRequestContext.js +6 -4
  10. package/views/change-request/ChangeRequestContext.js.map +1 -1
  11. package/views/detail/ChangeRequest/index.d.ts +0 -1
  12. package/views/detail/ChangeRequest/index.js +143 -128
  13. package/views/detail/ChangeRequest/index.js.map +1 -1
  14. package/views/detail/ChangeRequest/transitions.js +14 -9
  15. package/views/detail/ChangeRequest/transitions.js.map +1 -1
  16. package/views/detail/RegisterItem/index.js +27 -40
  17. package/views/detail/RegisterItem/index.js.map +1 -1
  18. package/views/hooks/useItemClassConfig.d.ts +1 -2
  19. package/views/hooks/useItemClassConfig.js +1 -7
  20. package/views/hooks/useItemClassConfig.js.map +1 -1
  21. package/views/hooks/useSingleRegisterItemData.d.ts +1 -1
  22. package/views/hooks/useSingleRegisterItemData.js +4 -3
  23. package/views/hooks/useSingleRegisterItemData.js.map +1 -1
  24. package/views/index.js +32 -23
  25. package/views/index.js.map +1 -1
  26. package/views/itemPathUtils.d.ts +3 -8
  27. package/views/itemPathUtils.js +26 -1
  28. package/views/itemPathUtils.js.map +1 -1
  29. package/views/protocolRegistry.d.ts +1 -1
  30. package/views/protocolRegistry.js.map +1 -1
  31. package/views/sidebar/Browse/index.js +57 -51
  32. package/views/sidebar/Browse/index.js.map +1 -1
  33. package/views/sidebar/ListItem.js +2 -3
  34. package/views/sidebar/ListItem.js.map +1 -1
  35. package/views/sidebar/Registration/index.js +12 -11
  36. package/views/sidebar/Registration/index.js.map +1 -1
  37. package/views/sidebar/Search/index.js +49 -46
  38. package/views/sidebar/Search/index.js.map +1 -1
  39. package/views/util.d.ts +1 -0
  40. package/views/util.js +5 -4
  41. 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;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAIrD,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAChD,GAAsC;;IAErC,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;IACjD,MAAM,MAAM,GAAG,4BAA4B,CAAC;IAC5C,OAAO;QACL,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;AACJ,CAAC","sourcesContent":["import { useContext } 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\nexport default function useSingleRegisterItemData\n(ref: InternalItemReference | undefined):\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 const errMsg = \"Item data cannot be loaded\";\n return {\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 };\n}\n"]}
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, _c;
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
- const selectedItemPath = focusedTabURI && focusedTabURI.startsWith(`${_protocolRegistry.Protocols.ITEM_DETAILS}:`) ? focusedTabURI.split(':')[1] : null;
130
- const selectedItemRef = selectedItemPath ? (0, _itemPathUtils.itemPathToItemRefLike)(subregisters !== undefined, selectedItemPath) : null;
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, _types.isInternalItemReference)(selectedItemRef) ? maybeSelectedRegisterItemData && (0, _types.isRegisterItem)(maybeSelectedRegisterItemData) ? {
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; // TODO: Confirm that end extensions using RegistryKit can’t just import hooks
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 = remoteUsername ? ((_c = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.stakeholders) !== null && _c !== void 0 ? _c : []).find(s => s.gitServerUsername === remoteUsername) : undefined; // Active CR
204
-
205
- const [activeChangeRequestID, setActiveChangeRequestID] = (0, _react.useState)(null);
206
- const getRelatedClass = (0, _util._getRelatedClass)(itemClassConfiguration);
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: getRelatedClass,
220
- customViews: customViews !== null && customViews !== void 0 ? 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: activeChangeRequestID
234
+ changeRequestID: activeChangeRequestIDDebounced
226
235
  }, children));
227
236
  };
@@ -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"]}
@@ -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
- * Attempts to return a structured register item reference
18
- * given a dataset-relative item path.
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 itemPathToItemRefLike(hasSubregisters: boolean, itemPath: string): {
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
  /**
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.itemRefToItemPath = itemRefToItemPath;
7
7
  exports.incompleteItemRefToItemPathPrefix = incompleteItemRefToItemPathPrefix;
8
- exports.itemPathToItemRefLike = itemPathToItemRefLike;
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":"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","sourcesContent":["import 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 * 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 */\nexport function 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
+ {"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 Browse = function ({
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, function valdateState(loadedValue) {
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: !subregisters && activeCRIsEditable && performOperation ? () => performOperation('generating new item', handleAdd)(classID) : undefined
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: activeCRIsEditable && performOperation ? clsID => performOperation('generating new item', handleAdd)(clsID, subregisterID) : undefined
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
- onNodeClick: () => dispatch({
262
- type: 'select-item',
263
- payload: {
264
- itemPath: null
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: itemPath => dispatch({
289
- type: 'select-item',
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: !subregisters && activeCRIsEditable && performOperation ? () => performOperation('generating new item', handleAdd)(classID) : undefined
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: activeCRIsEditable && performOperation ? clsID => performOperation('generating new item', handleAdd)(clsID, subregisterID) : undefined
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: {