@riboseinc/paneron-registry-kit 2.2.37 → 2.2.39

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riboseinc/paneron-registry-kit",
3
- "version": "2.2.37",
3
+ "version": "2.2.39",
4
4
  "main": "index.js",
5
5
  "author": "Ribose Inc. <open.source@ribose.com>",
6
6
  "scripts": {
@@ -71,27 +71,29 @@ const ProposalSearchResultList = (0, _react.memo)(function ({
71
71
  keyExpression
72
72
  } = (0, _react.useContext)(_BrowserCtx.BrowserCtx);
73
73
  const proposal = extraItemViewData.proposal;
74
- const expressionParsed = new Function('objPath', 'obj', queryExpression);
75
- const keyExpressionParsed = keyExpression ? new Function('obj', `return ${keyExpression}`) : null;
76
74
  const proposedItemDataReq = useRegisterItemData({
77
75
  itemPaths: Object.keys(proposal.items)
78
76
  });
79
77
  const itemData = proposedItemDataReq.value;
78
+ const expressionParsed = new Function('objPath', 'obj', queryExpression);
80
79
  const predicate = (0, _react.useCallback)(([objPath, obj]) => {
81
80
  const objPathInCR = (0, _itemPathUtils.itemPathInCR)(objPath, extraItemViewData.proposal.id);
82
81
  return expressionParsed(objPath, itemData[objPath]) || expressionParsed(objPath, obj) || expressionParsed(objPathInCR, itemData[objPath]) || expressionParsed(objPathInCR, obj);
83
- }, [queryExpression, itemData]);
84
- const matchingItems = Object.entries(proposal.items).filter(predicate);
85
- const matchingItemsWithKeys = keyExpressionParsed && !proposedItemDataReq.isUpdating ? matchingItems.map(([p]) => {
86
- try {
87
- return [p, keyExpressionParsed(itemData[p])];
88
- } catch (e) {
89
- console.debug("Failed to run key expression", keyExpression, p, itemData[p], e);
90
- return [p, p];
91
- }
92
- }) : matchingItems.map(([p]) => [p, p]);
93
- matchingItemsWithKeys.sort((pair1, pair2) => typeof pair1[1] === 'string' ? pair1[1].localeCompare(pair2[1]) : typeof pair1[1] === 'number' ? pair1[1] - pair2[1] : 0);
94
- const matchingItemIDs = matchingItemsWithKeys.map(([p]) => p);
82
+ }, [queryExpression, itemData, extraItemViewData.proposal.id]);
83
+ const matchingItemIDs = (0, _react.useMemo)(() => {
84
+ const keyExpressionParsed = keyExpression ? new Function('obj', `return ${keyExpression}`) : null;
85
+ const matchingItems = Object.entries(proposal.items).filter(predicate);
86
+ const matchingItemsWithKeys = keyExpressionParsed && !proposedItemDataReq.isUpdating ? matchingItems.map(([p]) => {
87
+ try {
88
+ return [p, keyExpressionParsed(itemData[p])];
89
+ } catch (e) {
90
+ console.debug("Failed to run key expression", keyExpression, p, itemData[p], e);
91
+ return [p, p];
92
+ }
93
+ }) : matchingItems.map(([p]) => [p, p]);
94
+ matchingItemsWithKeys.sort((pair1, pair2) => typeof pair1[1] === 'string' ? pair1[1].localeCompare(pair2[1]) : typeof pair1[1] === 'number' ? pair1[1] - pair2[1] : 0);
95
+ return matchingItemsWithKeys.map(([p]) => p);
96
+ }, [keyExpression, itemData, predicate, proposal.items]);
95
97
  const extraData = (0, _react.useMemo)(() => ({
96
98
  extraItemViewData: {
97
99
  proposal,
@@ -1 +1 @@
1
- {"version":3,"file":"Search.js","sourceRoot":"","sources":["../../src/proposals/Search.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useContext, useCallback, useMemo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport makeList, { type ItemProps, LabelledListIcon, type ListData } from '@riboseinc/paneron-extension-kit/widgets/List';\n\nimport type { RegisterItem } from '../types/item';\nimport { itemPathInCR, itemPathToItemRef } from '../views/itemPathUtils';\nimport { BrowserCtx } from '../views/BrowserCtx';\n\nimport type { SomeCR } from './types';\nimport type { ChangeProposal } from './types';\n\n\nexport interface ProposalListData {\n selectedItemPath: string | null;\n extraItemViewData: { proposal: SomeCR, itemData: Record<string, RegisterItem<any> | null> }\n}\n\nexport interface SearchResultListProps {\n queryExpression: string;\n selectedItemPath: string | null;\n onSelectItem: (itemPath: string | null) => void;\n onOpenItem?: (itemPath: string) => void;\n keyExpression?: string;\n extraItemViewData: { proposal: SomeCR, itemData: Record<string, RegisterItem<any> | null> }\n className?: string;\n}\n\n\nconst ProposalItem: React.FC<ItemProps<ProposalListData>> =\nfunction ({ onSelect, onOpen, extraData, itemRef: itemPath }) {\n const { subregisters, getRelatedItemClassConfiguration } = useContext(BrowserCtx);\n\n const proposalItem = extraData.extraItemViewData.proposal.items[itemPath];\n const registerItem = extraData.extraItemViewData.itemData[itemPath] ?? null;\n\n const itemRef = itemPathToItemRef(subregisters !== undefined, itemPath);\n\n const clsConfig = getRelatedItemClassConfiguration(itemRef.classID);\n const ListItemView = clsConfig?.itemView;\n const itemPayload: Record<string, any> | null = registerItem?.data ?? null;\n \n const itemView = itemPayload && ListItemView\n ? <>\n {clsConfig.title}\n &emsp;\n <ListItemView\n itemData={itemPayload}\n itemRef={itemRef}\n />\n </>\n : <span css={css`opacity: .4`}>\n (missing item data at {itemPath})\n </span>;\n\n return (\n <LabelledListIcon\n isSelected={extraData.selectedItemPath === itemPath}\n onSelect={onSelect}\n onOpen={onOpen}\n //contentClassName={(isUpdating && !objData) ? Classes.SKELETON : undefined}\n entityType={{ name: proposalItem.type }}\n >\n {itemView}\n </LabelledListIcon>\n );\n};\n\nconst List = makeList<ProposalListData>(ProposalItem);\n\nexport const ProposalSearchResultList: React.FC<SearchResultListProps> =\nmemo(function ({ extraItemViewData, queryExpression, selectedItemPath, onSelectItem, onOpenItem, className }) {\n const { useRegisterItemData, keyExpression } = useContext(BrowserCtx);\n const proposal = extraItemViewData.proposal;\n\n const expressionParsed =\n new Function('objPath', 'obj', queryExpression) as (objPath: string, obj: null | RegisterItem<any> | ChangeProposal) => boolean;\n\n const keyExpressionParsed = keyExpression\n ? new Function('obj', `return ${keyExpression}`) as (obj: RegisterItem<any>) => any\n : null;\n\n const proposedItemDataReq = useRegisterItemData({\n itemPaths: Object.keys(proposal.items),\n });\n\n const itemData = proposedItemDataReq.value;\n\n const predicate = useCallback(([objPath, obj]: [string, ChangeProposal]) => {\n const objPathInCR = itemPathInCR(objPath, extraItemViewData.proposal.id);\n return (\n expressionParsed(objPath, itemData[objPath])\n || expressionParsed(objPath, obj)\n || expressionParsed(objPathInCR, itemData[objPath])\n || expressionParsed(objPathInCR, obj)\n );\n }, [queryExpression, itemData]);\n\n const matchingItems = Object.entries(proposal.items).filter(predicate);\n\n const matchingItemsWithKeys = keyExpressionParsed && !proposedItemDataReq.isUpdating\n ? matchingItems.map(([p, ]) => {\n try {\n return [p, keyExpressionParsed(itemData[p]!)];\n } catch (e) {\n console.debug(\"Failed to run key expression\", keyExpression, p, itemData[p], e);\n return [p, p];\n }\n })\n : matchingItems.map(([p, ]) => [p, p]);\n\n matchingItemsWithKeys.sort((pair1, pair2) =>\n typeof pair1[1] === 'string'\n ? pair1[1].localeCompare(pair2[1])\n : typeof pair1[1] === 'number'\n ? pair1[1] - pair2[1]\n : 0);\n\n const matchingItemIDs = matchingItemsWithKeys.map(([p, ]) => p);\n\n const extraData: ProposalListData = useMemo((() => ({\n extraItemViewData: { proposal, itemData },\n selectedItemPath,\n })), [selectedItemPath, proposal, itemData]);\n\n const getListData = useCallback(function _getListData(): ListData<ProposalListData> | null {\n return {\n items: matchingItemIDs,\n selectedItem: selectedItemPath,\n selectItem: onSelectItem,\n openItem: onOpenItem,\n itemHeight: 32,\n padding: 0,\n extraData,\n };\n }, [matchingItemIDs.join(','), extraData, onOpenItem, onSelectItem]);\n\n return <List\n className={className}\n getListData={getListData}\n />;\n});\n\n\nexport default ProposalSearchResultList;\n"]}
1
+ {"version":3,"file":"Search.js","sourceRoot":"","sources":["../../src/proposals/Search.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useContext, useCallback, useMemo } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport makeList, { type ItemProps, LabelledListIcon, type ListData } from '@riboseinc/paneron-extension-kit/widgets/List';\n\nimport type { RegisterItem } from '../types/item';\nimport { itemPathInCR, itemPathToItemRef } from '../views/itemPathUtils';\nimport { BrowserCtx } from '../views/BrowserCtx';\n\nimport type { SomeCR } from './types';\nimport type { ChangeProposal } from './types';\n\n\nexport interface ProposalListData {\n selectedItemPath: string | null;\n extraItemViewData: { proposal: SomeCR, itemData: Record<string, RegisterItem<any> | null> }\n}\n\nexport interface SearchResultListProps {\n queryExpression: string;\n selectedItemPath: string | null;\n onSelectItem: (itemPath: string | null) => void;\n onOpenItem?: (itemPath: string) => void;\n keyExpression?: string;\n extraItemViewData: { proposal: SomeCR, itemData: Record<string, RegisterItem<any> | null> }\n className?: string;\n}\n\n\nconst ProposalItem: React.FC<ItemProps<ProposalListData>> =\nfunction ({ onSelect, onOpen, extraData, itemRef: itemPath }) {\n const { subregisters, getRelatedItemClassConfiguration } = useContext(BrowserCtx);\n\n const proposalItem = extraData.extraItemViewData.proposal.items[itemPath];\n const registerItem = extraData.extraItemViewData.itemData[itemPath] ?? null;\n\n const itemRef = itemPathToItemRef(subregisters !== undefined, itemPath);\n\n const clsConfig = getRelatedItemClassConfiguration(itemRef.classID);\n const ListItemView = clsConfig?.itemView;\n const itemPayload: Record<string, any> | null = registerItem?.data ?? null;\n \n const itemView = itemPayload && ListItemView\n ? <>\n {clsConfig.title}\n &emsp;\n <ListItemView\n itemData={itemPayload}\n itemRef={itemRef}\n />\n </>\n : <span css={css`opacity: .4`}>\n (missing item data at {itemPath})\n </span>;\n\n return (\n <LabelledListIcon\n isSelected={extraData.selectedItemPath === itemPath}\n onSelect={onSelect}\n onOpen={onOpen}\n //contentClassName={(isUpdating && !objData) ? Classes.SKELETON : undefined}\n entityType={{ name: proposalItem.type }}\n >\n {itemView}\n </LabelledListIcon>\n );\n};\n\nconst List = makeList<ProposalListData>(ProposalItem);\n\nexport const ProposalSearchResultList: React.FC<SearchResultListProps> =\nmemo(function ({ extraItemViewData, queryExpression, selectedItemPath, onSelectItem, onOpenItem, className }) {\n const { useRegisterItemData, keyExpression } = useContext(BrowserCtx);\n const proposal = extraItemViewData.proposal;\n\n const proposedItemDataReq = useRegisterItemData({\n itemPaths: Object.keys(proposal.items),\n });\n\n const itemData = proposedItemDataReq.value;\n\n const expressionParsed =\n new Function('objPath', 'obj', queryExpression) as (objPath: string, obj: null | RegisterItem<any> | ChangeProposal) => boolean;\n\n\n const predicate = useCallback(([objPath, obj]: [string, ChangeProposal]) => {\n const objPathInCR = itemPathInCR(objPath, extraItemViewData.proposal.id);\n return (\n expressionParsed(objPath, itemData[objPath])\n || expressionParsed(objPath, obj)\n || expressionParsed(objPathInCR, itemData[objPath])\n || expressionParsed(objPathInCR, obj)\n );\n }, [queryExpression, itemData, extraItemViewData.proposal.id]);\n\n const matchingItemIDs = useMemo(() => {\n const keyExpressionParsed = keyExpression\n ? new Function('obj', `return ${keyExpression}`) as (obj: RegisterItem<any>) => any\n : null;\n\n const matchingItems = Object.entries(proposal.items).filter(predicate);\n\n const matchingItemsWithKeys = keyExpressionParsed && !proposedItemDataReq.isUpdating\n ? matchingItems.map(([p, ]) => {\n try {\n return [p, keyExpressionParsed(itemData[p]!)];\n } catch (e) {\n console.debug(\"Failed to run key expression\", keyExpression, p, itemData[p], e);\n return [p, p];\n }\n })\n : matchingItems.map(([p, ]) => [p, p]);\n\n matchingItemsWithKeys.sort((pair1, pair2) =>\n typeof pair1[1] === 'string'\n ? pair1[1].localeCompare(pair2[1])\n : typeof pair1[1] === 'number'\n ? pair1[1] - pair2[1]\n : 0);\n\n return matchingItemsWithKeys.map(([p, ]) => p);\n }, [keyExpression, itemData, predicate, proposal.items]);\n\n const extraData: ProposalListData = useMemo((() => ({\n extraItemViewData: { proposal, itemData },\n selectedItemPath,\n })), [selectedItemPath, proposal, itemData]);\n\n const getListData = useCallback(function _getListData(): ListData<ProposalListData> | null {\n return {\n items: matchingItemIDs,\n selectedItem: selectedItemPath,\n selectItem: onSelectItem,\n openItem: onOpenItem,\n itemHeight: 32,\n padding: 0,\n extraData,\n };\n }, [matchingItemIDs.join(','), extraData, onOpenItem, onSelectItem]);\n\n return <List\n className={className}\n getListData={getListData}\n />;\n});\n\n\nexport default ProposalSearchResultList;\n"]}
@@ -43,19 +43,19 @@ const RegisterHome2 = function () {
43
43
  title: (0, _react2.jsx)(_react.default.Fragment, null, "Welcome to ", (_a = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.name) !== null && _a !== void 0 ? _a : 'this register')
44
44
  }, (0, _react2.jsx)(_core.Card, {
45
45
  css: (0, _react2.css)`flex: 1; box-shadow: none !important; position: absolute; border-radius: 0; display: flex; flex-flow: column nowrap; padding: 10px;`
46
- }, (0, _react2.jsx)("p", null, (0, _react2.jsx)(_core.Button, {
47
- css: (0, _react2.css)`vertical-align: baseline`,
48
- onClick: () => spawnTab(_protocolRegistry.Protocols.REGISTER_META)
49
- }, "Learn more about the register"), "\u2002 or search all items:"), (0, _react2.jsx)(_Search.default, {
50
- css: (0, _react2.css)`flex: 1;`,
46
+ }, (0, _react2.jsx)("p", null, "Search all items:"), (0, _react2.jsx)(_Search.default, {
47
+ css: (0, _react2.css)`flex: 1; overflow: hidden;`,
51
48
  //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}
52
49
  availableClassIDs: [],
53
50
  stateName: "item-search-global",
54
- initialView: (0, _react2.jsx)("div", {
51
+ initialView: (0, _react2.jsx)(_react.default.Fragment, null, (0, _react2.jsx)("div", {
55
52
  dangerouslySetInnerHTML: {
56
53
  __html: (_b = registerMetadata === null || registerMetadata === void 0 ? void 0 : registerMetadata.contentSummary) !== null && _b !== void 0 ? _b : "There is no content summary of this registry yet."
57
54
  }
58
- }),
55
+ }), (0, _react2.jsx)(_core.Button, {
56
+ css: (0, _react2.css)`vertical-align: baseline`,
57
+ onClick: () => spawnTab(_protocolRegistry.Protocols.REGISTER_META)
58
+ }, "View register metadata")),
59
59
  zeroResultsView: (0, _react2.jsx)(_core.NonIdealState, {
60
60
  icon: "clean",
61
61
  title: "No results matching query"
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome2/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAE1G,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,aAAa,GAAsD;;IACvE,MAAM,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACxD,OAAO,CACL,IAAC,qBAAqB,IAAC,KAAK,EAAE;2BAAc,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,mCAAI,eAAe,CAAI;QACvF,IAAC,IAAI,IAAC,GAAG,EAAE,GAAG,CAAA,qIAAqI;YACjJ;gBACE,IAAC,MAAM,IACH,GAAG,EAAE,GAAG,CAAA,0BAA0B,EAClC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,oCAE3C;8CAGP;YACJ,IAAC,MAAM,IACL,GAAG,EAAE,GAAG,CAAA,UAAU;gBAClB,iFAAiF;gBACjF,iBAAiB,EAAE,EAAE,EACrB,SAAS,EAAC,oBAAoB,EAC9B,WAAW,EAAE,aAAK,uBAAuB,EAAE,EAAE,MAAM,EACjD,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,cAAc,mCAC7B,mDAAmD;qBACvD,GAAI,EACL,eAAe,EAAE,IAAC,aAAa,IAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAC,2BAA2B,GAAG,GAEjF,CACG,CACe,CACzB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { NonIdealState, Button, Card } from '@blueprintjs/core';\n\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\n\nimport { TabContentsWithHeader } from '../../util';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport Search from '../../sidebar/Search';\nimport { Protocols } from '../../protocolRegistry';\n\n\nconst RegisterHome2: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { registerMetadata } = useContext(BrowserCtx);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n return (\n <TabContentsWithHeader title={<>Welcome to {registerMetadata?.name ?? 'this register'}</>}>\n <Card css={css`flex: 1; box-shadow: none !important; position: absolute; border-radius: 0; display: flex; flex-flow: column nowrap; padding: 10px;`}>\n <p>\n <Button\n css={css`vertical-align: baseline`}\n onClick={() => spawnTab(Protocols.REGISTER_META)}>\n Learn more about the register\n </Button>\n &ensp;\n or search all items:\n </p>\n <Search\n css={css`flex: 1;`}\n //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}\n availableClassIDs={[]}\n stateName=\"item-search-global\"\n initialView={<div dangerouslySetInnerHTML={{ __html:\n registerMetadata?.contentSummary\n ?? \"There is no content summary of this registry yet.\"\n }} />}\n zeroResultsView={<NonIdealState icon=\"clean\" title=\"No results matching query\" />}\n //onOpenItem={onChooseItem ? handleOpenItem : undefined}\n />\n </Card>\n </TabContentsWithHeader>\n );\n};\n\nexport default RegisterHome2;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/detail/RegisterHome2/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,sBAAsB,EAAE,MAAM,kEAAkE,CAAC;AAE1G,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAGnD,MAAM,aAAa,GAAsD;;IACvE,MAAM,EAAE,gBAAgB,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACpD,MAAM,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,sBAAsB,CAAC,CAAC;IACxD,OAAO,CACL,IAAC,qBAAqB,IAAC,KAAK,EAAE;2BAAc,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,mCAAI,eAAe,CAAI;QACvF,IAAC,IAAI,IAAC,GAAG,EAAE,GAAG,CAAA,qIAAqI;YACjJ,mCAEI;YACJ,IAAC,MAAM,IACL,GAAG,EAAE,GAAG,CAAA,4BAA4B;gBACpC,iFAAiF;gBACjF,iBAAiB,EAAE,EAAE,EACrB,SAAS,EAAC,oBAAoB,EAC9B,WAAW,EAAE;oBACX,aAAK,uBAAuB,EAAE,EAAE,MAAM,EACpC,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,cAAc,mCAC7B,mDAAmD;yBACvD,GAAI;oBACL,IAAC,MAAM,IACH,GAAG,EAAE,GAAG,CAAA,0BAA0B,EAClC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,6BAE3C,CACR,EACH,eAAe,EACb,IAAC,aAAa,IACZ,IAAI,EAAC,OAAO,EACZ,KAAK,EAAC,2BAA2B,GACjC,GAEJ,CACG,CACe,CACzB,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,aAAa,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { useContext } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { NonIdealState, Button, Card } from '@blueprintjs/core';\n\nimport { TabbedWorkspaceContext } from '@riboseinc/paneron-extension-kit/widgets/TabbedWorkspace/context';\n\nimport { TabContentsWithHeader } from '../../util';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport Search from '../../sidebar/Search';\nimport { Protocols } from '../../protocolRegistry';\n\n\nconst RegisterHome2: React.VoidFunctionComponent<Record<never, never>> = function () {\n const { registerMetadata } = useContext(BrowserCtx);\n const { spawnTab } = useContext(TabbedWorkspaceContext);\n return (\n <TabContentsWithHeader title={<>Welcome to {registerMetadata?.name ?? 'this register'}</>}>\n <Card css={css`flex: 1; box-shadow: none !important; position: absolute; border-radius: 0; display: flex; flex-flow: column nowrap; padding: 10px;`}>\n <p>\n Search all items:\n </p>\n <Search\n css={css`flex: 1; overflow: hidden;`}\n //style={{ height: '100vh', width: '50vw', minWidth: '500px', maxWidth: '90vw' }}\n availableClassIDs={[]}\n stateName=\"item-search-global\"\n initialView={<>\n <div dangerouslySetInnerHTML={{ __html:\n registerMetadata?.contentSummary\n ?? \"There is no content summary of this registry yet.\"\n }} />\n <Button\n css={css`vertical-align: baseline`}\n onClick={() => spawnTab(Protocols.REGISTER_META)}>\n View register metadata\n </Button>\n </>}\n zeroResultsView={\n <NonIdealState\n icon=\"clean\"\n title=\"No results matching query\"\n />}\n //onOpenItem={onChooseItem ? handleOpenItem : undefined}\n />\n </Card>\n </TabContentsWithHeader>\n );\n};\n\nexport default RegisterHome2;\n"]}
@@ -190,7 +190,7 @@ const Search = (0, _react.memo)(function ({
190
190
  }), [dispatch]),
191
191
  css: (0, _react2.css)`padding: 2px;`
192
192
  }), (0, _react2.jsx)("div", {
193
- css: (0, _react2.css)`flex: 1;`
193
+ css: (0, _react2.css)`flex: 1; overflow-y: auto;`
194
194
  }, showInitialScreen ? initialView : (0, _react2.jsx)(ListComponent, {
195
195
  queryExpression: datasetObjectSearchQueryExpression,
196
196
  keyExpression: keyExpression,
@@ -198,7 +198,7 @@ const Search = (0, _react.memo)(function ({
198
198
  onSelectItem: handleSelectItem,
199
199
  onOpenItem: handleOpenItem,
200
200
  extraItemViewData: extraData,
201
- zeroResultsView: zeroResultsView
201
+ zeroResultsView: effectiveQueryExpression === queryExpressionDebounced ? zeroResultsView : undefined
202
202
  })));
203
203
  });
204
204
  const RegisterItemSearchResultList = (0, _SearchResultList.default)(_ListItem.default, objPath => ({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Search/index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useContext, useCallback, useMemo, useEffect } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { toJSONNormalized } from '@riboseinc/paneron-extension-kit/util';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\nimport makeSearchResultList from '@riboseinc/paneron-extension-kit/widgets/SearchResultList';\nimport useDebounce from '@riboseinc/paneron-extension-kit/useDebounce';\nimport { type CriteriaGroup, isCriteriaGroup, BLANK_CRITERIA } from '../../FilterCriteria/models';\nimport criteriaGroupToQueryExpression from '../../FilterCriteria/criteriaGroupToQueryExpression';\nimport { RAW_SUBSTRING, CUSTOM_CONDITION } from '../../FilterCriteria/CRITERIA_CONFIGURATION';\nimport { ChangeRequestContext } from '../../../proposals/ChangeRequestContext';\nimport type { RegisterItem } from '../../../types';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { getRegisterItemQuery } from '../../itemQueryUtils';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport SearchQuery from '../../SearchQuery';\nimport ListItem from '../ListItem';\nimport { Protocols } from '../../protocolRegistry';\n\n\n// TODO: Move Search widget core out of sidebar, as it’s used elsewhere too.\n\n\ninterface Query {\n criteria: CriteriaGroup;\n}\ninterface State {\n query: Query;\n quickSubstringQuery: string;\n selectedItemPath: string | null;\n}\nfunction isState(val: any): val is State {\n return val\n && val.query\n && val.query.criteria\n && isCriteriaGroup(val.query.criteria)\n && typeof val.quickSubstringQuery === 'string'\n && (val.selectedItemPath === null || typeof val.selectedItemPath === 'string')\n}\ntype Action =\n | { type: 'update-query'; payload: { query: Query; }; }\n | { type: 'update-quick-substring-query'; payload: { substring: string; }; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\nconst initialState: State = {\n query: { criteria: BLANK_CRITERIA },\n quickSubstringQuery: '',\n selectedItemPath: null,\n} as const;\n\nfunction isInitialState(state: State): boolean {\n return toJSONNormalized(state) === toJSONNormalized(initialState);\n}\n\nfunction reducer(prevState: State, action: Action) {\n switch (action.type) {\n case 'update-query':\n return {\n ...prevState,\n query: action.payload.query,\n };\n case 'update-quick-substring-query':\n return {\n ...prevState,\n quickSubstringQuery: action.payload.substring,\n };\n case 'select-item':\n return {\n ...prevState,\n selectedItemPath: action.payload.itemPath,\n };\n default:\n throw new Error(\"Unexpected search state\");\n }\n}\n\nconst Search: React.FC<{\n /**\n * Criteria that will always apply.\n * Used e.g. in superseding item selection\n * (to limit to the same item class).\n */\n implicitCriteria?: CriteriaGroup,\n\n availableClassIDs?: string[]\n onOpenItem?: (itemPath: string) => void\n\n zeroResultsView?: JSX.Element\n initialView?: JSX.Element\n\n stateName?: string\n\n List?: ReturnType<typeof makeSearchResultList>\n extraData?: Record<string, any>\n\n className?: string\n style?: React.CSSProperties\n}> =\nmemo(function ({ implicitCriteria, initialView, zeroResultsView, availableClassIDs, stateName, onOpenItem, List, extraData, className, style }) {\n const { usePersistentDatasetStateReducer } = useContext(DatasetContext);\n\n const ListComponent = useMemo((() => List ?? RegisterItemSearchResultList), [List]);\n\n const {\n // TODO: defaultSearchCriteria,\n keyExpression,\n getQuickSearchPredicate,\n itemClasses,\n subregisters,\n selectedRegisterItem,\n jumpTo,\n } = useContext(BrowserCtx);\n const { changeRequest } = useContext(ChangeRequestContext);\n\n const [ state, dispatch, stateRecalled ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)( stateName ?? 'search-sidebar',\n undefined,\n isState,\n reducer,\n initialState,\n null);\n\n const selectedItemPath = selectedRegisterItem?.ref\n ? itemRefToItemPath(selectedRegisterItem.ref, changeRequest?.id)\n : null;\n\n useEffect(() => {\n if (selectedItemPath) {\n dispatch({ type: 'select-item', payload: { itemPath: selectedItemPath } });\n }\n }, [selectedItemPath, dispatch]);\n\n // Why are we memoing this? It’s just a string and seems not too slow to compute.\n const effectiveQueryExpression: string = useMemo(() => {\n const quickSearchString = (state.quickSubstringQuery ?? '').trim();\n const withSearchString: CriteriaGroup =\n state.query.criteria.criteria.length < 1 && quickSearchString !== ''\n ? {\n require: 'all',\n criteria: [\n getQuickSearchPredicate\n ? {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: getQuickSearchPredicate(quickSearchString) },\n { itemClasses, subregisters },\n ),\n }\n : {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters }),\n },\n ],\n }\n : state.query.criteria;\n const withImplicit: CriteriaGroup = implicitCriteria\n ? {\n require: 'all',\n criteria: [ implicitCriteria, withSearchString ],\n }\n : withSearchString;\n return withImplicit.criteria.length > 0\n ? criteriaGroupToQueryExpression(withImplicit)\n // If no criteria provided, don’t show anything by default.\n : 'false';\n }, [state.query.criteria, state.quickSubstringQuery, itemClasses, subregisters, getQuickSearchPredicate]);\n\n const stateRecalledDebounced = useDebounce(stateRecalled, 100);\n const queryExpressionDebounced = useDebounce(\n effectiveQueryExpression,\n stateRecalledDebounced ? 500 : 0,\n );\n\n const datasetObjectSearchQueryExpression = useMemo((() =>\n queryExpressionDebounced != 'false'\n ? getRegisterItemQuery(queryExpressionDebounced, changeRequest ?? undefined)\n : 'return false'\n ), [queryExpressionDebounced, changeRequest]);\n\n const handleSelectItem = useCallback(\n (itemPath => dispatch({ type: 'select-item', payload: { itemPath }})),\n [dispatch]);\n\n const defaultHandleOpenItem = useCallback(\n (itemPath => jumpTo?.(`${Protocols.ITEM_DETAILS}:${itemPath}`)),\n [jumpTo]);\n const handleOpenItem = onOpenItem ?? defaultHandleOpenItem;\n\n const showInitialScreen = initialView && isInitialState({ ...state, selectedItemPath: null });\n\n return (\n <div css={css`display: flex; flex-flow: column nowrap;`} className={className} style={style}>\n <SearchQuery\n rootCriteria={state.query.criteria}\n quickSearchString={state.quickSubstringQuery}\n availableClassIDs={availableClassIDs}\n onCriteriaChange={useCallback((\n criteria => dispatch({ type: 'update-query', payload: { query: { criteria } } })\n ), [dispatch])}\n onQuickSearchStringChange={useCallback((\n substring => dispatch({ type: 'update-quick-substring-query', payload: { substring } })\n ), [dispatch])}\n css={css`padding: 2px;`}\n />\n <div css={css`flex: 1;`}>\n {showInitialScreen\n ? initialView\n : <ListComponent\n queryExpression={datasetObjectSearchQueryExpression}\n keyExpression={keyExpression}\n selectedItemPath={state.selectedItemPath}\n onSelectItem={handleSelectItem}\n onOpenItem={handleOpenItem}\n extraItemViewData={extraData as any}\n zeroResultsView={zeroResultsView}\n />}\n </div>\n </div>\n );\n});\n\n\nconst RegisterItemSearchResultList = makeSearchResultList<RegisterItem<any>>(ListItem, (objPath) => ({\n name: 'reg. item',\n iconProps: {\n icon: 'document',\n title: objPath,\n htmlTitle: `Icon for item at ${objPath}`,\n },\n}));\n\n\nexport default Search;\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/views/sidebar/Search/index.tsx"],"names":[],"mappings":"AAAA,eAAe;AACf,8BAA8B;AAE9B,OAAc,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACjF,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAEzE,OAAO,oBAAoB,MAAM,2DAA2D,CAAC;AAC7F,OAAO,WAAW,MAAM,8CAA8C,CAAC;AACvE,OAAO,EAAsB,eAAe,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClG,OAAO,8BAA8B,MAAM,qDAAqD,CAAC;AACjG,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,6CAA6C,CAAC;AAC9F,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,QAAQ,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAcnD,SAAS,OAAO,CAAC,GAAQ;IACvB,OAAO,GAAG;WACL,GAAG,CAAC,KAAK;WACT,GAAG,CAAC,KAAK,CAAC,QAAQ;WAClB,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;WACnC,OAAO,GAAG,CAAC,mBAAmB,KAAK,QAAQ;WAC3C,CAAC,GAAG,CAAC,gBAAgB,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAA;AAClF,CAAC;AAMD,MAAM,YAAY,GAAU;IAC1B,KAAK,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE;IACnC,mBAAmB,EAAE,EAAE;IACvB,gBAAgB,EAAE,IAAI;CACd,CAAC;AAEX,SAAS,cAAc,CAAC,KAAY;IAClC,OAAO,gBAAgB,CAAC,KAAK,CAAC,KAAK,gBAAgB,CAAC,YAAY,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,OAAO,CAAC,SAAgB,EAAE,MAAc;IAC/C,QAAQ,MAAM,CAAC,IAAI,EAAE;QACnB,KAAK,cAAc;YACjB,OAAO;gBACL,GAAG,SAAS;gBACZ,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK;aAC5B,CAAC;QACJ,KAAK,8BAA8B;YACjC,OAAO;gBACL,GAAG,SAAS;gBACZ,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;aAC9C,CAAC;QACJ,KAAK,aAAa;YAChB,OAAO;gBACL,GAAG,SAAS;gBACZ,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;aAC1C,CAAC;QACJ;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;KAC9C;AACH,CAAC;AAED,MAAM,MAAM,GAsBZ,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE;IAC5I,MAAM,EAAE,gCAAgC,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC;IAExE,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,4BAA4B,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEpF,MAAM;IACJ,+BAA+B;IAC/B,aAAa,EACb,uBAAuB,EACvB,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,MAAM,GACP,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAE3B,MAAM,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC,oBAAoB,CAAC,CAAC;IAE3D,MAAM,CAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAE,GAAI,gCAA8E,CAAE,SAAS,aAAT,SAAS,cAAT,SAAS,GAAI,gBAAgB,EACvJ,SAAS,EACT,OAAO,EACP,OAAO,EACP,YAAY,EACZ,IAAI,CAAC,CAAC;IAER,MAAM,gBAAgB,GAAG,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,GAAG;QAChD,CAAC,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,GAAG,EAAE,aAAa,aAAb,aAAa,uBAAb,aAAa,CAAE,EAAE,CAAC;QAChE,CAAC,CAAC,IAAI,CAAC;IAET,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,gBAAgB,EAAE;YACpB,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC;SAC5E;IACH,CAAC,EAAE,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEjC,iFAAiF;IACjF,MAAM,wBAAwB,GAAW,OAAO,CAAC,GAAG,EAAE;;QACpD,MAAM,iBAAiB,GAAG,CAAC,MAAA,KAAK,CAAC,mBAAmB,mCAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACnE,MAAM,gBAAgB,GACpB,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,iBAAiB,KAAK,EAAE;YAClE,CAAC,CAAC;gBACE,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE;oBACR,uBAAuB;wBACrB,CAAC,CAAC;4BACE,GAAG,EAAE,QAAQ;4BACb,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAC7B,EAAE,gBAAgB,EAAE,uBAAuB,CAAC,iBAAiB,CAAC,EAAE,EAChE,EAAE,WAAW,EAAE,YAAY,EAAE,CAC9B;yBACF;wBACH,CAAC,CAAC;4BACE,GAAG,EAAE,eAAe;4BACpB,KAAK,EAAE,aAAa,CAAC,OAAO,CAC1B,EAAE,SAAS,EAAE,iBAAiB,EAAE,EAChC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;yBACjC;iBACN;aACF;YACH,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC3B,MAAM,YAAY,GAAkB,gBAAgB;YAClD,CAAC,CAAC;gBACE,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,CAAE,gBAAgB,EAAE,gBAAgB,CAAE;aACjD;YACH,CAAC,CAAC,gBAAgB,CAAC;QACrB,OAAO,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YACrC,CAAC,CAAC,8BAA8B,CAAC,YAAY,CAAC;YAC9C,2DAA2D;YAC3D,CAAC,CAAC,OAAO,CAAC;IACd,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,mBAAmB,EAAE,WAAW,EAAE,YAAY,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAE1G,MAAM,sBAAsB,GAAG,WAAW,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAC/D,MAAM,wBAAwB,GAAG,WAAW,CAC1C,wBAAwB,EACxB,sBAAsB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACjC,CAAC;IAEF,MAAM,kCAAkC,GAAG,OAAO,CAAC,CAAC,GAAG,EAAE,CACvD,wBAAwB,IAAI,OAAO;QACjC,CAAC,CAAC,oBAAoB,CAAC,wBAAwB,EAAE,aAAa,aAAb,aAAa,cAAb,aAAa,GAAI,SAAS,CAAC;QAC5E,CAAC,CAAC,cAAc,CACnB,EAAE,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAC,CAAC;IAE9C,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAC,CAAC,CAAC,EACrE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEd,MAAM,qBAAqB,GAAG,WAAW,CACvC,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAG,GAAG,SAAS,CAAC,YAAY,IAAI,QAAQ,EAAE,CAAC,CAAC,EAC/D,CAAC,MAAM,CAAC,CAAC,CAAC;IACZ,MAAM,cAAc,GAAG,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,qBAAqB,CAAC;IAE3D,MAAM,iBAAiB,GAAG,WAAW,IAAI,cAAc,CAAC,EAAE,GAAG,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9F,OAAO,CACL,aAAK,GAAG,EAAE,GAAG,CAAA,0CAA0C,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK;QACzF,IAAC,WAAW,IACV,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAClC,iBAAiB,EAAE,KAAK,CAAC,mBAAmB,EAC5C,iBAAiB,EAAE,iBAAiB,EACpC,gBAAgB,EAAE,WAAW,CAAC,CAC5B,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CACjF,EAAE,CAAC,QAAQ,CAAC,CAAC,EACd,yBAAyB,EAAE,WAAW,CAAC,CACrC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CACxF,EAAE,CAAC,QAAQ,CAAC,CAAC,EACd,GAAG,EAAE,GAAG,CAAA,eAAe,GACvB;QACF,aAAK,GAAG,EAAE,GAAG,CAAA,4BAA4B,IACtC,iBAAiB;YAChB,CAAC,CAAC,WAAW;YACb,CAAC,CAAC,IAAC,aAAa,IACZ,eAAe,EAAE,kCAAkC,EACnD,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,EACxC,YAAY,EAAE,gBAAgB,EAC9B,UAAU,EAAE,cAAc,EAC1B,iBAAiB,EAAE,SAAgB,EACnC,eAAe,EAAE,wBAAwB,KAAK,wBAAwB;oBACpE,CAAC,CAAC,eAAe;oBACjB,CAAC,CAAC,SAAS,GACb,CACF,CACF,CACP,CAAC;AACJ,CAAC,CAAC,CAAC;AAGH,MAAM,4BAA4B,GAAG,oBAAoB,CAAoB,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnG,IAAI,EAAE,WAAW;IACjB,SAAS,EAAE;QACT,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,oBAAoB,OAAO,EAAE;KACzC;CACF,CAAC,CAAC,CAAC;AAGJ,eAAe,MAAM,CAAC","sourcesContent":["/** @jsx jsx */\n/** @jsxFrag React.Fragment */\n\nimport React, { memo, useContext, useCallback, useMemo, useEffect } from 'react';\nimport { jsx, css } from '@emotion/react';\nimport { DatasetContext } from '@riboseinc/paneron-extension-kit/context';\nimport { toJSONNormalized } from '@riboseinc/paneron-extension-kit/util';\nimport type { PersistentStateReducerHook } from '@riboseinc/paneron-extension-kit/usePersistentStateReducer';\nimport makeSearchResultList from '@riboseinc/paneron-extension-kit/widgets/SearchResultList';\nimport useDebounce from '@riboseinc/paneron-extension-kit/useDebounce';\nimport { type CriteriaGroup, isCriteriaGroup, BLANK_CRITERIA } from '../../FilterCriteria/models';\nimport criteriaGroupToQueryExpression from '../../FilterCriteria/criteriaGroupToQueryExpression';\nimport { RAW_SUBSTRING, CUSTOM_CONDITION } from '../../FilterCriteria/CRITERIA_CONFIGURATION';\nimport { ChangeRequestContext } from '../../../proposals/ChangeRequestContext';\nimport type { RegisterItem } from '../../../types';\nimport { itemRefToItemPath } from '../../itemPathUtils';\nimport { getRegisterItemQuery } from '../../itemQueryUtils';\nimport { BrowserCtx } from '../../BrowserCtx';\nimport SearchQuery from '../../SearchQuery';\nimport ListItem from '../ListItem';\nimport { Protocols } from '../../protocolRegistry';\n\n\n// TODO: Move Search widget core out of sidebar, as it’s used elsewhere too.\n\n\ninterface Query {\n criteria: CriteriaGroup;\n}\ninterface State {\n query: Query;\n quickSubstringQuery: string;\n selectedItemPath: string | null;\n}\nfunction isState(val: any): val is State {\n return val\n && val.query\n && val.query.criteria\n && isCriteriaGroup(val.query.criteria)\n && typeof val.quickSubstringQuery === 'string'\n && (val.selectedItemPath === null || typeof val.selectedItemPath === 'string')\n}\ntype Action =\n | { type: 'update-query'; payload: { query: Query; }; }\n | { type: 'update-quick-substring-query'; payload: { substring: string; }; }\n | { type: 'select-item'; payload: { itemPath: string | null; }; }\n\nconst initialState: State = {\n query: { criteria: BLANK_CRITERIA },\n quickSubstringQuery: '',\n selectedItemPath: null,\n} as const;\n\nfunction isInitialState(state: State): boolean {\n return toJSONNormalized(state) === toJSONNormalized(initialState);\n}\n\nfunction reducer(prevState: State, action: Action) {\n switch (action.type) {\n case 'update-query':\n return {\n ...prevState,\n query: action.payload.query,\n };\n case 'update-quick-substring-query':\n return {\n ...prevState,\n quickSubstringQuery: action.payload.substring,\n };\n case 'select-item':\n return {\n ...prevState,\n selectedItemPath: action.payload.itemPath,\n };\n default:\n throw new Error(\"Unexpected search state\");\n }\n}\n\nconst Search: React.FC<{\n /**\n * Criteria that will always apply.\n * Used e.g. in superseding item selection\n * (to limit to the same item class).\n */\n implicitCriteria?: CriteriaGroup,\n\n availableClassIDs?: string[]\n onOpenItem?: (itemPath: string) => void\n\n zeroResultsView?: JSX.Element\n initialView?: JSX.Element\n\n stateName?: string\n\n List?: ReturnType<typeof makeSearchResultList>\n extraData?: Record<string, any>\n\n className?: string\n style?: React.CSSProperties\n}> =\nmemo(function ({ implicitCriteria, initialView, zeroResultsView, availableClassIDs, stateName, onOpenItem, List, extraData, className, style }) {\n const { usePersistentDatasetStateReducer } = useContext(DatasetContext);\n\n const ListComponent = useMemo((() => List ?? RegisterItemSearchResultList), [List]);\n\n const {\n // TODO: defaultSearchCriteria,\n keyExpression,\n getQuickSearchPredicate,\n itemClasses,\n subregisters,\n selectedRegisterItem,\n jumpTo,\n } = useContext(BrowserCtx);\n\n const { changeRequest } = useContext(ChangeRequestContext);\n\n const [ state, dispatch, stateRecalled ] = (usePersistentDatasetStateReducer as PersistentStateReducerHook<State, Action>)( stateName ?? 'search-sidebar',\n undefined,\n isState,\n reducer,\n initialState,\n null);\n\n const selectedItemPath = selectedRegisterItem?.ref\n ? itemRefToItemPath(selectedRegisterItem.ref, changeRequest?.id)\n : null;\n\n useEffect(() => {\n if (selectedItemPath) {\n dispatch({ type: 'select-item', payload: { itemPath: selectedItemPath } });\n }\n }, [selectedItemPath, dispatch]);\n\n // Why are we memoing this? It’s just a string and seems not too slow to compute.\n const effectiveQueryExpression: string = useMemo(() => {\n const quickSearchString = (state.quickSubstringQuery ?? '').trim();\n const withSearchString: CriteriaGroup =\n state.query.criteria.criteria.length < 1 && quickSearchString !== ''\n ? {\n require: 'all',\n criteria: [\n getQuickSearchPredicate\n ? {\n key: 'custom',\n query: CUSTOM_CONDITION.toQuery(\n { customExpression: getQuickSearchPredicate(quickSearchString) },\n { itemClasses, subregisters },\n ),\n }\n : {\n key: 'raw-substring',\n query: RAW_SUBSTRING.toQuery(\n { substring: quickSearchString },\n { itemClasses, subregisters }),\n },\n ],\n }\n : state.query.criteria;\n const withImplicit: CriteriaGroup = implicitCriteria\n ? {\n require: 'all',\n criteria: [ implicitCriteria, withSearchString ],\n }\n : withSearchString;\n return withImplicit.criteria.length > 0\n ? criteriaGroupToQueryExpression(withImplicit)\n // If no criteria provided, don’t show anything by default.\n : 'false';\n }, [state.query.criteria, state.quickSubstringQuery, itemClasses, subregisters, getQuickSearchPredicate]);\n\n const stateRecalledDebounced = useDebounce(stateRecalled, 100);\n const queryExpressionDebounced = useDebounce(\n effectiveQueryExpression,\n stateRecalledDebounced ? 500 : 0,\n );\n\n const datasetObjectSearchQueryExpression = useMemo((() =>\n queryExpressionDebounced != 'false'\n ? getRegisterItemQuery(queryExpressionDebounced, changeRequest ?? undefined)\n : 'return false'\n ), [queryExpressionDebounced, changeRequest]);\n\n const handleSelectItem = useCallback(\n (itemPath => dispatch({ type: 'select-item', payload: { itemPath }})),\n [dispatch]);\n\n const defaultHandleOpenItem = useCallback(\n (itemPath => jumpTo?.(`${Protocols.ITEM_DETAILS}:${itemPath}`)),\n [jumpTo]);\n const handleOpenItem = onOpenItem ?? defaultHandleOpenItem;\n\n const showInitialScreen = initialView && isInitialState({ ...state, selectedItemPath: null });\n\n return (\n <div css={css`display: flex; flex-flow: column nowrap;`} className={className} style={style}>\n <SearchQuery\n rootCriteria={state.query.criteria}\n quickSearchString={state.quickSubstringQuery}\n availableClassIDs={availableClassIDs}\n onCriteriaChange={useCallback((\n criteria => dispatch({ type: 'update-query', payload: { query: { criteria } } })\n ), [dispatch])}\n onQuickSearchStringChange={useCallback((\n substring => dispatch({ type: 'update-quick-substring-query', payload: { substring } })\n ), [dispatch])}\n css={css`padding: 2px;`}\n />\n <div css={css`flex: 1; overflow-y: auto;`}>\n {showInitialScreen\n ? initialView\n : <ListComponent\n queryExpression={datasetObjectSearchQueryExpression}\n keyExpression={keyExpression}\n selectedItemPath={state.selectedItemPath}\n onSelectItem={handleSelectItem}\n onOpenItem={handleOpenItem}\n extraItemViewData={extraData as any}\n zeroResultsView={effectiveQueryExpression === queryExpressionDebounced\n ? zeroResultsView\n : undefined}\n />}\n </div>\n </div>\n );\n});\n\n\nconst RegisterItemSearchResultList = makeSearchResultList<RegisterItem<any>>(ListItem, (objPath) => ({\n name: 'reg. item',\n iconProps: {\n icon: 'document',\n title: objPath,\n htmlTitle: `Icon for item at ${objPath}`,\n },\n}));\n\n\nexport default Search;\n"]}