@gravity-ui/querieskit 1.6.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +88 -3
- package/build/cjs/components/Breadcrumbs/Breadcrumbs.d.ts +2 -1
- package/build/cjs/components/Breadcrumbs/Breadcrumbs.js +19 -6
- package/build/cjs/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/build/cjs/components/QueryGraph/internal/QueryGraphCanvasBlock.js +3 -1
- package/build/cjs/components/QueryGraph/internal/QueryGraphCanvasBlock.js.map +1 -1
- package/build/cjs/modules/NavigationDetail/NavigationDetail.d.ts +3 -1
- package/build/cjs/modules/NavigationDetail/NavigationDetail.js +4 -0
- package/build/cjs/modules/NavigationDetail/NavigationDetail.js.map +1 -1
- package/build/cjs/modules/NavigationHeader/NavigationHeader.d.ts +3 -1
- package/build/cjs/modules/NavigationHeader/NavigationHeader.js +7 -1
- package/build/cjs/modules/NavigationHeader/NavigationHeader.js.map +1 -1
- package/build/cjs/modules/NavigationItemsList/NavigationItemsList.d.ts +3 -2
- package/build/cjs/modules/NavigationItemsList/NavigationItemsList.js +2 -1
- package/build/cjs/modules/NavigationItemsList/NavigationItemsList.js.map +1 -1
- package/build/cjs/modules/NavigationItemsList/internal/useParentRow.d.ts +1 -1
- package/build/cjs/modules/NavigationItemsList/internal/useParentRow.js +2 -1
- package/build/cjs/modules/NavigationItemsList/internal/useParentRow.js.map +1 -1
- package/build/cjs/modules/TutorialRow/TutorialRow.d.ts +3 -1
- package/build/cjs/modules/TutorialRow/TutorialRow.js +3 -1
- package/build/cjs/modules/TutorialRow/TutorialRow.js.map +1 -1
- package/build/cjs/modules/TutorialSearchRow/TutorialSearchRow.d.ts +3 -1
- package/build/cjs/modules/TutorialSearchRow/TutorialSearchRow.js +3 -1
- package/build/cjs/modules/TutorialSearchRow/TutorialSearchRow.js.map +1 -1
- package/build/cjs/types/navigation.d.ts +11 -0
- package/build/cjs/types/navigation.js.map +1 -1
- package/build/cjs/widgets/QueriesNavigation/QueriesNavigation.d.ts +3 -2
- package/build/cjs/widgets/QueriesNavigation/QueriesNavigation.js +8 -0
- package/build/cjs/widgets/QueriesNavigation/QueriesNavigation.js.map +1 -1
- package/build/cjs/widgets/QueriesNavigation/QueriesNavigation.stories.d.ts +3 -0
- package/build/cjs/widgets/QueriesNavigation/QueriesNavigation.stories.js +166 -1
- package/build/cjs/widgets/QueriesNavigation/QueriesNavigation.stories.js.map +1 -1
- package/build/cjs/widgets/TutorialsHistory/TutorialRowContent.d.ts +1 -1
- package/build/cjs/widgets/TutorialsHistory/TutorialRowContent.js +6 -3
- package/build/cjs/widgets/TutorialsHistory/TutorialRowContent.js.map +1 -1
- package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.d.ts +7 -2
- package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.js +13 -3
- package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.js.map +1 -1
- package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.stories.d.ts +5 -0
- package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.stories.js +244 -1
- package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.stories.js.map +1 -1
- package/build/esm/components/Breadcrumbs/Breadcrumbs.d.ts +2 -1
- package/build/esm/components/Breadcrumbs/Breadcrumbs.js +19 -6
- package/build/esm/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/build/esm/components/QueryGraph/internal/QueryGraphCanvasBlock.js +3 -1
- package/build/esm/components/QueryGraph/internal/QueryGraphCanvasBlock.js.map +1 -1
- package/build/esm/modules/NavigationDetail/NavigationDetail.d.ts +3 -1
- package/build/esm/modules/NavigationDetail/NavigationDetail.js +4 -0
- package/build/esm/modules/NavigationDetail/NavigationDetail.js.map +1 -1
- package/build/esm/modules/NavigationHeader/NavigationHeader.d.ts +3 -1
- package/build/esm/modules/NavigationHeader/NavigationHeader.js +7 -1
- package/build/esm/modules/NavigationHeader/NavigationHeader.js.map +1 -1
- package/build/esm/modules/NavigationItemsList/NavigationItemsList.d.ts +3 -2
- package/build/esm/modules/NavigationItemsList/NavigationItemsList.js +2 -1
- package/build/esm/modules/NavigationItemsList/NavigationItemsList.js.map +1 -1
- package/build/esm/modules/NavigationItemsList/internal/useParentRow.d.ts +1 -1
- package/build/esm/modules/NavigationItemsList/internal/useParentRow.js +2 -1
- package/build/esm/modules/NavigationItemsList/internal/useParentRow.js.map +1 -1
- package/build/esm/modules/TutorialRow/TutorialRow.d.ts +3 -1
- package/build/esm/modules/TutorialRow/TutorialRow.js +3 -1
- package/build/esm/modules/TutorialRow/TutorialRow.js.map +1 -1
- package/build/esm/modules/TutorialSearchRow/TutorialSearchRow.d.ts +3 -1
- package/build/esm/modules/TutorialSearchRow/TutorialSearchRow.js +3 -1
- package/build/esm/modules/TutorialSearchRow/TutorialSearchRow.js.map +1 -1
- package/build/esm/types/navigation.d.ts +11 -0
- package/build/esm/types/navigation.js.map +1 -1
- package/build/esm/widgets/QueriesNavigation/QueriesNavigation.d.ts +3 -2
- package/build/esm/widgets/QueriesNavigation/QueriesNavigation.js +8 -0
- package/build/esm/widgets/QueriesNavigation/QueriesNavigation.js.map +1 -1
- package/build/esm/widgets/QueriesNavigation/QueriesNavigation.stories.d.ts +3 -0
- package/build/esm/widgets/QueriesNavigation/QueriesNavigation.stories.js +166 -1
- package/build/esm/widgets/QueriesNavigation/QueriesNavigation.stories.js.map +1 -1
- package/build/esm/widgets/TutorialsHistory/TutorialRowContent.d.ts +1 -1
- package/build/esm/widgets/TutorialsHistory/TutorialRowContent.js +6 -3
- package/build/esm/widgets/TutorialsHistory/TutorialRowContent.js.map +1 -1
- package/build/esm/widgets/TutorialsHistory/TutorialsHistory.d.ts +7 -2
- package/build/esm/widgets/TutorialsHistory/TutorialsHistory.js +13 -3
- package/build/esm/widgets/TutorialsHistory/TutorialsHistory.js.map +1 -1
- package/build/esm/widgets/TutorialsHistory/TutorialsHistory.stories.d.ts +5 -0
- package/build/esm/widgets/TutorialsHistory/TutorialsHistory.stories.js +244 -1
- package/build/esm/widgets/TutorialsHistory/TutorialsHistory.stories.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -133,20 +133,105 @@ function HistoryPanel() {
|
|
|
133
133
|
|
|
134
134
|
### TutorialsHistory
|
|
135
135
|
|
|
136
|
-
|
|
136
|
+
Tutorial list with search, optional filters, selectable rows, incremental loading, and custom
|
|
137
|
+
link or row rendering.
|
|
137
138
|
|
|
138
139
|
```tsx
|
|
139
|
-
import {TutorialsHistory} from '@gravity-ui/querieskit';
|
|
140
|
+
import {TutorialsHistory, type QueryListLinkRenderer} from '@gravity-ui/querieskit';
|
|
141
|
+
|
|
142
|
+
const renderLink: QueryListLinkRenderer = ({href = '', ...props}) => (
|
|
143
|
+
<RouterLink {...props} to={href} />
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
<TutorialsHistory
|
|
147
|
+
items={tutorials}
|
|
148
|
+
selectedRowId={selectedTutorialId}
|
|
149
|
+
hasMore={hasNextPage}
|
|
150
|
+
loading={isLoading}
|
|
151
|
+
onLoadMore={loadNextPage}
|
|
152
|
+
renderLink={renderLink}
|
|
153
|
+
search={{value: search, onUpdate: updateSearch}}
|
|
154
|
+
/>;
|
|
140
155
|
```
|
|
141
156
|
|
|
157
|
+
`renderLink` is used for tutorial rows with a non-empty `href`, including full-text search
|
|
158
|
+
results. Without it, those rows render as regular `<a>` elements; rows without an `href` render
|
|
159
|
+
as `<div>` elements.
|
|
160
|
+
|
|
161
|
+
Use `renderRowItem` to replace the row contents while retaining the list's navigation and
|
|
162
|
+
selection behavior. It receives the original item, its list index, the current row variant
|
|
163
|
+
(`default` or `search`), keyboard activity as `isActive`, and `renderLink`. Group headers are
|
|
164
|
+
passed to the renderer as items and must be rendered by the consumer. Default rows continue to
|
|
165
|
+
show the tutorial `id`. A custom renderer can omit a long string ID from the visible content
|
|
166
|
+
while keeping it on the item for `selectedRowId` and navigation.
|
|
167
|
+
|
|
168
|
+
An empty list with `loading` shows the initial spinner. When existing items are present, loading
|
|
169
|
+
the next page shows an inline loader after them. Keep `loading` controlled, including passing
|
|
170
|
+
`false` between requests; the consumer remains responsible for the initial request, filtering,
|
|
171
|
+
and routing.
|
|
172
|
+
|
|
142
173
|
Browse interactive examples in [Storybook](https://preview.gravity-ui.com/querieskit/).
|
|
143
174
|
|
|
175
|
+
### QueriesNavigation
|
|
176
|
+
|
|
177
|
+
`QueriesNavigation` renders cluster and path navigation, an optional detail panel, and
|
|
178
|
+
application-provided header actions. Applications remain responsible for loading data, routing,
|
|
179
|
+
favorites, and item-specific operations.
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
import {Button, DropdownMenu, Flex} from '@gravity-ui/uikit';
|
|
183
|
+
import {QueriesNavigation} from '@gravity-ui/querieskit';
|
|
184
|
+
|
|
185
|
+
<QueriesNavigation
|
|
186
|
+
location={location}
|
|
187
|
+
onUpdate={setLocation}
|
|
188
|
+
items={items}
|
|
189
|
+
search={{value: search, onUpdate: setSearch}}
|
|
190
|
+
parentRow={{showDuringSearch: true}}
|
|
191
|
+
header={{
|
|
192
|
+
actions,
|
|
193
|
+
getBreadcrumbHref: ({cluster, path}) =>
|
|
194
|
+
cluster ? `/navigation/${cluster}${path ?? ''}` : '/navigation',
|
|
195
|
+
renderActions: ({location, actions: headerActions}) => (
|
|
196
|
+
<Flex gap={1}>
|
|
197
|
+
<DropdownMenu
|
|
198
|
+
items={headerActions.map((action) => ({
|
|
199
|
+
text: action.title,
|
|
200
|
+
disabled: action.disabled,
|
|
201
|
+
hidden: action.hidden,
|
|
202
|
+
action: () => action.onClick(location),
|
|
203
|
+
}))}
|
|
204
|
+
/>
|
|
205
|
+
<Button href={`/navigation/${location.cluster}${location.path ?? ''}`} target="_blank">
|
|
206
|
+
Open
|
|
207
|
+
</Button>
|
|
208
|
+
</Flex>
|
|
209
|
+
),
|
|
210
|
+
}}
|
|
211
|
+
/>;
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Without `renderActions`, actions keep the standard button rendering. A custom renderer receives
|
|
215
|
+
the unfiltered action array and owns handling of `hidden`, `disabled`, and clicks; returning
|
|
216
|
+
`null` intentionally leaves the action area empty. In a detail panel the array contains the
|
|
217
|
+
panel actions (or header actions when panel actions are absent), followed by actions supplied by
|
|
218
|
+
the resolved detail config.
|
|
219
|
+
|
|
220
|
+
`getBreadcrumbHref` turns every breadcrumb, including the cluster root and current item, into a
|
|
221
|
+
real link. Plain clicks continue through `onUpdate`, while modified and middle clicks keep native
|
|
222
|
+
browser behavior. URL construction and router integration belong to the application. Breadcrumb
|
|
223
|
+
segments are derived from normalized single-slash paths; the parser does not preserve a Cypress
|
|
224
|
+
`//` prefix.
|
|
225
|
+
|
|
226
|
+
`parentRow.showDuringSearch` defaults to `false`. Set it to `true` to keep the parent navigation
|
|
227
|
+
row available while search results are filtered, including when the result list is empty.
|
|
228
|
+
|
|
144
229
|
## Widgets
|
|
145
230
|
|
|
146
231
|
| Widget | Description |
|
|
147
232
|
| --- | --- |
|
|
148
233
|
| `QueriesHistory` | Query history with search, filters, visible fields, editing, and comparison |
|
|
149
|
-
| `TutorialsHistory` | Tutorials list with search and
|
|
234
|
+
| `TutorialsHistory` | Tutorials list with search, filters, pagination, and custom rendering |
|
|
150
235
|
|
|
151
236
|
## Development
|
|
152
237
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
|
-
import { NavigationLocation } from '../../types/navigation';
|
|
2
|
+
import type { GetNavigationBreadcrumbHref, NavigationLocation } from '../../types/navigation';
|
|
3
3
|
import type { LoadPathSuggestions } from '../../types/pathEditor';
|
|
4
4
|
import './Breadcrumbs.scss';
|
|
5
5
|
export type BreadcrumbsProps = {
|
|
@@ -7,6 +7,7 @@ export type BreadcrumbsProps = {
|
|
|
7
7
|
hideResetButton?: boolean;
|
|
8
8
|
className?: string;
|
|
9
9
|
onUpdate: (location: NavigationLocation) => void;
|
|
10
|
+
getBreadcrumbHref?: GetNavigationBreadcrumbHref;
|
|
10
11
|
onLoadSuggestions?: LoadPathSuggestions;
|
|
11
12
|
};
|
|
12
13
|
export declare const Breadcrumbs: FC<BreadcrumbsProps>;
|
|
@@ -63,6 +63,7 @@ var Breadcrumbs = exports.Breadcrumbs = function Breadcrumbs(_ref) {
|
|
|
63
63
|
var location = _ref.location,
|
|
64
64
|
hideResetButton = _ref.hideResetButton,
|
|
65
65
|
onUpdate = _ref.onUpdate,
|
|
66
|
+
getBreadcrumbHref = _ref.getBreadcrumbHref,
|
|
66
67
|
onLoadSuggestions = _ref.onLoadSuggestions,
|
|
67
68
|
className = _ref.className;
|
|
68
69
|
var _useState = (0, _react.useState)(false),
|
|
@@ -142,13 +143,25 @@ var Breadcrumbs = exports.Breadcrumbs = function Breadcrumbs(_ref) {
|
|
|
142
143
|
children: items.map(function (item, index) {
|
|
143
144
|
var _item$path;
|
|
144
145
|
var isLast = index === items.length - 1;
|
|
146
|
+
var itemLocation = {
|
|
147
|
+
cluster: cluster,
|
|
148
|
+
path: item.path
|
|
149
|
+
};
|
|
150
|
+
var href = getBreadcrumbHref === null || getBreadcrumbHref === void 0 ? void 0 : getBreadcrumbHref(itemLocation);
|
|
145
151
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_uikit.Breadcrumbs.Item, {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
+
href: href,
|
|
153
|
+
disabled: isLast && !href,
|
|
154
|
+
onClick: function onClick(event) {
|
|
155
|
+
var isPlainLeftClick = event.button === 0 && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey;
|
|
156
|
+
if (href && !isPlainLeftClick) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (href) {
|
|
160
|
+
event.preventDefault();
|
|
161
|
+
}
|
|
162
|
+
if (!isLast) {
|
|
163
|
+
onUpdate(itemLocation);
|
|
164
|
+
}
|
|
152
165
|
},
|
|
153
166
|
children: item.title
|
|
154
167
|
}, (_item$path = item.path) !== null && _item$path !== void 0 ? _item$path : 'root');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_uikit","_bemCnLite","_interopRequireDefault","_parsePathSegments","_PathEditor","_i18n","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","FolderTreeIcon","props","_jsx","_objectSpread","children","fill","fillRule","d","clipRule","defaultProps","xmlns","width","height","viewBox","PencilIcon","block","cn","Breadcrumbs","exports","_ref","location","hideResetButton","onUpdate","onLoadSuggestions","className","_useState","useState","_useState2","_slicedToArray","edit","setEdit","cluster","path","ROOT_PATH","undefined","items","title","concat","_toConsumableArray","parsePathSegments","handleReset","handleCancelEdit","handleOnSubmit","nextPath","normalizedPath","endsWith","slice","Flex","grow","minWidth","PathEditor","defaultPath","autoFocus","onApply","onCancel","onBlur","onFocus","event","currentTarget","select","_jsxs","gap","alignItems","Button","view","onClick","i18n","Icon","data","size","length","overflow","Text","color","GravityBreadcrumbs","showRoot","maxItems","map","item","index","_item$path","isLast","Item","disabled"],"sources":["Breadcrumbs.tsx"],"sourcesContent":["import React, {FC, useState} from 'react';\nimport {Button, Flex, Breadcrumbs as GravityBreadcrumbs, Icon, Text} from '@gravity-ui/uikit';\nimport FolderTreeIcon from '@gravity-ui/icons/svgs/folder-tree.svg';\nimport PencilIcon from '@gravity-ui/icons/svgs/pencil.svg';\nimport cn from 'bem-cn-lite';\nimport {parsePathSegments} from './helpers/parsePathSegments';\nimport {NavigationLocation} from '../../types/navigation';\nimport type {LoadPathSuggestions} from '../../types/pathEditor';\nimport {PathEditor} from '../PathEditor';\nimport i18n from './i18n';\nimport './Breadcrumbs.scss';\n\nexport type BreadcrumbsProps = {\n location: NavigationLocation;\n hideResetButton?: boolean;\n className?: string;\n onUpdate: (location: NavigationLocation) => void;\n onLoadSuggestions?: LoadPathSuggestions;\n};\n\nconst block = cn('qp-breadcrumbs');\n\nexport const Breadcrumbs: FC<BreadcrumbsProps> = ({\n location,\n hideResetButton,\n onUpdate,\n onLoadSuggestions,\n className,\n}) => {\n const [edit, setEdit] = useState(false);\n\n const {cluster, path} = location;\n const ROOT_PATH = undefined;\n const items = cluster ? [{path: ROOT_PATH, title: cluster}, ...parsePathSegments(path)] : [];\n\n const handleReset = () => {\n onUpdate({cluster: undefined, path: undefined});\n };\n\n const handleCancelEdit = () => {\n setEdit(false);\n };\n\n const handleOnSubmit = (nextPath: string) => {\n const normalizedPath = nextPath.endsWith('/') ? nextPath.slice(0, -1) : nextPath;\n onUpdate({cluster, path: normalizedPath || undefined});\n setEdit(false);\n };\n\n if (edit) {\n return (\n <Flex grow minWidth={0} className={block(null, className)}>\n <PathEditor\n className={block('path-editor')}\n defaultPath={path ?? ''}\n autoFocus\n cluster={cluster}\n onLoadSuggestions={onLoadSuggestions}\n onApply={handleOnSubmit}\n onCancel={handleCancelEdit}\n onBlur={handleCancelEdit}\n onFocus={(event) => event.currentTarget.select()}\n />\n </Flex>\n );\n }\n\n return (\n <Flex gap={1} alignItems=\"center\" grow minWidth={0} className={block(null, className)}>\n {!hideResetButton && (\n <Button view=\"flat\" onClick={handleReset} aria-label={i18n('action_reset')}>\n <Icon data={FolderTreeIcon} size={16} />\n </Button>\n )}\n {items.length > 0 ? (\n <Flex\n alignItems=\"center\"\n minWidth={0}\n overflow=\"hidden\"\n gap={items.length > 1 ? undefined : 1}\n >\n <Text color=\"secondary\">/</Text>\n <GravityBreadcrumbs showRoot className={block('list')} maxItems={3}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n return (\n <GravityBreadcrumbs.Item\n key={item.path ?? 'root'}\n disabled={isLast}\n onClick={\n isLast\n ? undefined\n : () => onUpdate({cluster, path: item.path})\n }\n >\n {item.title}\n </GravityBreadcrumbs.Item>\n );\n })}\n </GravityBreadcrumbs>\n <Button\n view=\"flat\"\n className={block('edit-button')}\n onClick={() => setEdit(true)}\n aria-label={i18n('action_edit-path')}\n >\n <Icon data={PencilIcon} size={16} />\n </Button>\n </Flex>\n ) : null}\n </Flex>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_uikit","_bemCnLite","_interopRequireDefault","_parsePathSegments","_PathEditor","_i18n","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","FolderTreeIcon","props","_jsx","_objectSpread","children","fill","fillRule","d","clipRule","defaultProps","xmlns","width","height","viewBox","PencilIcon","block","cn","Breadcrumbs","exports","_ref","location","hideResetButton","onUpdate","getBreadcrumbHref","onLoadSuggestions","className","_useState","useState","_useState2","_slicedToArray","edit","setEdit","cluster","path","ROOT_PATH","undefined","items","title","concat","_toConsumableArray","parsePathSegments","handleReset","handleCancelEdit","handleOnSubmit","nextPath","normalizedPath","endsWith","slice","Flex","grow","minWidth","PathEditor","defaultPath","autoFocus","onApply","onCancel","onBlur","onFocus","event","currentTarget","select","_jsxs","gap","alignItems","Button","view","onClick","i18n","Icon","data","size","length","overflow","Text","color","GravityBreadcrumbs","showRoot","maxItems","map","item","index","_item$path","isLast","itemLocation","href","Item","disabled","isPlainLeftClick","button","altKey","ctrlKey","metaKey","shiftKey","preventDefault"],"sources":["Breadcrumbs.tsx"],"sourcesContent":["import React, {FC, useState} from 'react';\nimport {Button, Flex, Breadcrumbs as GravityBreadcrumbs, Icon, Text} from '@gravity-ui/uikit';\nimport FolderTreeIcon from '@gravity-ui/icons/svgs/folder-tree.svg';\nimport PencilIcon from '@gravity-ui/icons/svgs/pencil.svg';\nimport cn from 'bem-cn-lite';\nimport {parsePathSegments} from './helpers/parsePathSegments';\nimport type {GetNavigationBreadcrumbHref, NavigationLocation} from '../../types/navigation';\nimport type {LoadPathSuggestions} from '../../types/pathEditor';\nimport {PathEditor} from '../PathEditor';\nimport i18n from './i18n';\nimport './Breadcrumbs.scss';\n\nexport type BreadcrumbsProps = {\n location: NavigationLocation;\n hideResetButton?: boolean;\n className?: string;\n onUpdate: (location: NavigationLocation) => void;\n getBreadcrumbHref?: GetNavigationBreadcrumbHref;\n onLoadSuggestions?: LoadPathSuggestions;\n};\n\nconst block = cn('qp-breadcrumbs');\n\nexport const Breadcrumbs: FC<BreadcrumbsProps> = ({\n location,\n hideResetButton,\n onUpdate,\n getBreadcrumbHref,\n onLoadSuggestions,\n className,\n}) => {\n const [edit, setEdit] = useState(false);\n\n const {cluster, path} = location;\n const ROOT_PATH = undefined;\n const items = cluster ? [{path: ROOT_PATH, title: cluster}, ...parsePathSegments(path)] : [];\n\n const handleReset = () => {\n onUpdate({cluster: undefined, path: undefined});\n };\n\n const handleCancelEdit = () => {\n setEdit(false);\n };\n\n const handleOnSubmit = (nextPath: string) => {\n const normalizedPath = nextPath.endsWith('/') ? nextPath.slice(0, -1) : nextPath;\n onUpdate({cluster, path: normalizedPath || undefined});\n setEdit(false);\n };\n\n if (edit) {\n return (\n <Flex grow minWidth={0} className={block(null, className)}>\n <PathEditor\n className={block('path-editor')}\n defaultPath={path ?? ''}\n autoFocus\n cluster={cluster}\n onLoadSuggestions={onLoadSuggestions}\n onApply={handleOnSubmit}\n onCancel={handleCancelEdit}\n onBlur={handleCancelEdit}\n onFocus={(event) => event.currentTarget.select()}\n />\n </Flex>\n );\n }\n\n return (\n <Flex gap={1} alignItems=\"center\" grow minWidth={0} className={block(null, className)}>\n {!hideResetButton && (\n <Button view=\"flat\" onClick={handleReset} aria-label={i18n('action_reset')}>\n <Icon data={FolderTreeIcon} size={16} />\n </Button>\n )}\n {items.length > 0 ? (\n <Flex\n alignItems=\"center\"\n minWidth={0}\n overflow=\"hidden\"\n gap={items.length > 1 ? undefined : 1}\n >\n <Text color=\"secondary\">/</Text>\n <GravityBreadcrumbs showRoot className={block('list')} maxItems={3}>\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const itemLocation = {cluster, path: item.path};\n const href = getBreadcrumbHref?.(itemLocation);\n\n return (\n <GravityBreadcrumbs.Item\n key={item.path ?? 'root'}\n href={href}\n disabled={isLast && !href}\n onClick={(event) => {\n const isPlainLeftClick =\n event.button === 0 &&\n !event.altKey &&\n !event.ctrlKey &&\n !event.metaKey &&\n !event.shiftKey;\n\n if (href && !isPlainLeftClick) {\n return;\n }\n\n if (href) {\n event.preventDefault();\n }\n\n if (!isLast) {\n onUpdate(itemLocation);\n }\n }}\n >\n {item.title}\n </GravityBreadcrumbs.Item>\n );\n })}\n </GravityBreadcrumbs>\n <Button\n view=\"flat\"\n className={block('edit-button')}\n onClick={() => setEdit(true)}\n aria-label={i18n('action_edit-path')}\n >\n <Icon data={PencilIcon} size={16} />\n </Button>\n </Flex>\n ) : null}\n </Flex>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAGA,IAAAE,UAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,kBAAA,GAAAJ,OAAA;AAGA,IAAAK,WAAA,GAAAL,OAAA;AACA,IAAAM,KAAA,GAAAH,sBAAA,CAAAH,OAAA;AACAA,OAAA;AAA4B,IAAAO,WAAA,GAAAP,OAAA;AAAA,SAAAD,wBAAAS,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAX,uBAAA,YAAAA,CAAAS,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAAA,SAAAN,uBAAAK,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAK,UAAA,GAAAL,CAAA,KAAAU,OAAA,EAAAV,CAAA;AATkE,IACvFmB,cAAc,YAAdA,cAAcA,CAAAC,KAAA;EAAA,wBAAAC,eAAA,aAAAC,sBAAA,MAAAA,sBAAA,MAAAF,KAAA;IAAAG,QAAA,mBAAAF,eAAA;MAAAG,IAAA;MAAAC,QAAA;MAAAC,CAAA;MAAAC,QAAA;IAAA;EAAA;AAAA;AAAdR,cAAc,CAAAS,YAAA;EAAAC,KAAA;EAAAC,KAAA;EAAAC,MAAA;EAAAP,IAAA;EAAAQ,OAAA;AAAA;AAAA,IACdC,UAAU,YAAVA,UAAUA,CAAAb,KAAA;EAAA,wBAAAC,eAAA,aAAAC,sBAAA,MAAAA,sBAAA,MAAAF,KAAA;IAAAG,QAAA,mBAAAF,eAAA;MAAAG,IAAA;MAAAC,QAAA;MAAAC,CAAA;MAAAC,QAAA;IAAA;EAAA;AAAA;AAAVM,UAAU,CAAAL,YAAA;EAAAC,KAAA;EAAAC,KAAA;EAAAC,MAAA;EAAAP,IAAA;EAAAQ,OAAA;AAAA;AAkBjB,IAAME,KAAK,GAAG,IAAAC,kBAAE,EAAC,gBAAgB,CAAC;AAE3B,IAAMC,WAAiC,GAAAC,OAAA,CAAAD,WAAA,GAAG,SAApCA,WAAiCA,CAAAE,IAAA,EAOxC;EAAA,IANFC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;IACRC,eAAe,GAAAF,IAAA,CAAfE,eAAe;IACfC,QAAQ,GAAAH,IAAA,CAARG,QAAQ;IACRC,iBAAiB,GAAAJ,IAAA,CAAjBI,iBAAiB;IACjBC,iBAAiB,GAAAL,IAAA,CAAjBK,iBAAiB;IACjBC,SAAS,GAAAN,IAAA,CAATM,SAAS;EAET,IAAAC,SAAA,GAAwB,IAAAC,eAAQ,EAAC,KAAK,CAAC;IAAAC,UAAA,OAAAC,uBAAA,EAAAH,SAAA;IAAhCI,IAAI,GAAAF,UAAA;IAAEG,OAAO,GAAAH,UAAA;EAEpB,IAAOI,OAAO,GAAUZ,QAAQ,CAAzBY,OAAO;IAAEC,IAAI,GAAIb,QAAQ,CAAhBa,IAAI;EACpB,IAAMC,SAAS,GAAGC,SAAS;EAC3B,IAAMC,KAAK,GAAGJ,OAAO,IAAI;IAACC,IAAI,EAAEC,SAAS;IAAEG,KAAK,EAAEL;EAAO,CAAC,EAAAM,MAAA,KAAAC,2BAAA,EAAK,IAAAC,oCAAiB,EAACP,IAAI,CAAC,KAAI,EAAE;EAE5F,IAAMQ,WAAW,GAAG,SAAdA,WAAWA,CAAA,EAAS;IACtBnB,QAAQ,CAAC;MAACU,OAAO,EAAEG,SAAS;MAAEF,IAAI,EAAEE;IAAS,CAAC,CAAC;EACnD,CAAC;EAED,IAAMO,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAA,EAAS;IAC3BX,OAAO,CAAC,KAAK,CAAC;EAClB,CAAC;EAED,IAAMY,cAAc,GAAG,SAAjBA,cAAcA,CAAIC,QAAgB,EAAK;IACzC,IAAMC,cAAc,GAAGD,QAAQ,CAACE,QAAQ,CAAC,GAAG,CAAC,GAAGF,QAAQ,CAACG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAGH,QAAQ;IAChFtB,QAAQ,CAAC;MAACU,OAAO,EAAPA,OAAO;MAAEC,IAAI,EAAEY,cAAc,IAAIV;IAAS,CAAC,CAAC;IACtDJ,OAAO,CAAC,KAAK,CAAC;EAClB,CAAC;EAED,IAAID,IAAI,EAAE;IACN,oBACI,IAAA5B,eAAA,EAAC8C,WAAI;MAACC,IAAI;MAACC,QAAQ,EAAE,CAAE;MAACzB,SAAS,EAAEV,KAAK,CAAC,IAAI,EAAEU,SAAS,CAAE;MAAArB,QAAA,eACtD,IAAAF,eAAA,EAACiD,sBAAU;QACP1B,SAAS,EAAEV,KAAK,CAAC,aAAa,CAAE;QAChCqC,WAAW,EAAEnB,IAAI,aAAJA,IAAI,cAAJA,IAAI,GAAI,EAAG;QACxBoB,SAAS;QACTrB,OAAO,EAAEA,OAAQ;QACjBR,iBAAiB,EAAEA,iBAAkB;QACrC8B,OAAO,EAAEX,cAAe;QACxBY,QAAQ,EAAEb,gBAAiB;QAC3Bc,MAAM,EAAEd,gBAAiB;QACzBe,OAAO,EAAE,SAATA,OAAOA,CAAGC,KAAK;UAAA,OAAKA,KAAK,CAACC,aAAa,CAACC,MAAM,CAAC,CAAC;QAAA;MAAC,CACpD;IAAC,CACA,CAAC;EAEf;EAEA,oBACI,IAAAC,gBAAA,EAACb,WAAI;IAACc,GAAG,EAAE,CAAE;IAACC,UAAU,EAAC,QAAQ;IAACd,IAAI;IAACC,QAAQ,EAAE,CAAE;IAACzB,SAAS,EAAEV,KAAK,CAAC,IAAI,EAAEU,SAAS,CAAE;IAAArB,QAAA,GACjF,CAACiB,eAAe,iBACb,IAAAnB,eAAA,EAAC8D,aAAM;MAACC,IAAI,EAAC,MAAM;MAACC,OAAO,EAAEzB,WAAY;MAAC,cAAY,IAAA0B,aAAI,EAAC,cAAc,CAAE;MAAA/D,QAAA,eACvE,IAAAF,eAAA,EAACkE,WAAI;QAACC,IAAI,EAAErE,cAAe;QAACsE,IAAI,EAAE;MAAG,CAAE;IAAC,CACpC,CACX,EACAlC,KAAK,CAACmC,MAAM,GAAG,CAAC,gBACb,IAAAV,gBAAA,EAACb,WAAI;MACDe,UAAU,EAAC,QAAQ;MACnBb,QAAQ,EAAE,CAAE;MACZsB,QAAQ,EAAC,QAAQ;MACjBV,GAAG,EAAE1B,KAAK,CAACmC,MAAM,GAAG,CAAC,GAAGpC,SAAS,GAAG,CAAE;MAAA/B,QAAA,gBAEtC,IAAAF,eAAA,EAACuE,WAAI;QAACC,KAAK,EAAC,WAAW;QAAAtE,QAAA,EAAC;MAAC,CAAM,CAAC,eAChC,IAAAF,eAAA,EAACyE,kBAAkB;QAACC,QAAQ;QAACnD,SAAS,EAAEV,KAAK,CAAC,MAAM,CAAE;QAAC8D,QAAQ,EAAE,CAAE;QAAAzE,QAAA,EAC9DgC,KAAK,CAAC0C,GAAG,CAAC,UAACC,IAAI,EAAEC,KAAK,EAAK;UAAA,IAAAC,UAAA;UACxB,IAAMC,MAAM,GAAGF,KAAK,KAAK5C,KAAK,CAACmC,MAAM,GAAG,CAAC;UACzC,IAAMY,YAAY,GAAG;YAACnD,OAAO,EAAPA,OAAO;YAAEC,IAAI,EAAE8C,IAAI,CAAC9C;UAAI,CAAC;UAC/C,IAAMmD,IAAI,GAAG7D,iBAAiB,aAAjBA,iBAAiB,uBAAjBA,iBAAiB,CAAG4D,YAAY,CAAC;UAE9C,oBACI,IAAAjF,eAAA,EAACyE,kBAAkB,CAACU,IAAI;YAEpBD,IAAI,EAAEA,IAAK;YACXE,QAAQ,EAAEJ,MAAM,IAAI,CAACE,IAAK;YAC1BlB,OAAO,EAAE,SAATA,OAAOA,CAAGR,KAAK,EAAK;cAChB,IAAM6B,gBAAgB,GAClB7B,KAAK,CAAC8B,MAAM,KAAK,CAAC,IAClB,CAAC9B,KAAK,CAAC+B,MAAM,IACb,CAAC/B,KAAK,CAACgC,OAAO,IACd,CAAChC,KAAK,CAACiC,OAAO,IACd,CAACjC,KAAK,CAACkC,QAAQ;cAEnB,IAAIR,IAAI,IAAI,CAACG,gBAAgB,EAAE;gBAC3B;cACJ;cAEA,IAAIH,IAAI,EAAE;gBACN1B,KAAK,CAACmC,cAAc,CAAC,CAAC;cAC1B;cAEA,IAAI,CAACX,MAAM,EAAE;gBACT5D,QAAQ,CAAC6D,YAAY,CAAC;cAC1B;YACJ,CAAE;YAAA/E,QAAA,EAED2E,IAAI,CAAC1C;UAAK,IAAA4C,UAAA,GAxBNF,IAAI,CAAC9C,IAAI,cAAAgD,UAAA,cAAAA,UAAA,GAAI,MAyBG,CAAC;QAElC,CAAC;MAAC,CACc,CAAC,eACrB,IAAA/E,eAAA,EAAC8D,aAAM;QACHC,IAAI,EAAC,MAAM;QACXxC,SAAS,EAAEV,KAAK,CAAC,aAAa,CAAE;QAChCmD,OAAO,EAAE,SAATA,OAAOA,CAAA;UAAA,OAAQnC,OAAO,CAAC,IAAI,CAAC;QAAA,CAAC;QAC7B,cAAY,IAAAoC,aAAI,EAAC,kBAAkB,CAAE;QAAA/D,QAAA,eAErC,IAAAF,eAAA,EAACkE,WAAI;UAACC,IAAI,EAAEvD,UAAW;UAACwD,IAAI,EAAE;QAAG,CAAE;MAAC,CAChC,CAAC;IAAA,CACP,CAAC,GACP,IAAI;EAAA,CACN,CAAC;AAEf,CAAC","ignoreList":[]}
|
|
@@ -295,11 +295,13 @@ var QueryGraphCanvasBlock = exports.QueryGraphCanvasBlock = /*#__PURE__*/functio
|
|
|
295
295
|
var cameraScale = this.context.graph.cameraService.getCameraScale();
|
|
296
296
|
var fontSize = (0, _presentation.getScaleAdjustedFontSize)(LABEL_FONT_SIZE, cameraScale);
|
|
297
297
|
var labelGap = (0, _presentation.getScaleAdjustedFontSize)(LABEL_GAP, cameraScale);
|
|
298
|
+
// Keep the available screen width stable, just like the label's font size.
|
|
299
|
+
var maxWidth = (0, _presentation.getScaleAdjustedFontSize)(width * LABEL_MAX_WIDTH_RATIO, cameraScale);
|
|
298
300
|
context.fillStyle = cssValue('--g-color-text-primary', context.canvas);
|
|
299
301
|
context.textAlign = 'center';
|
|
300
302
|
context.textBaseline = 'top';
|
|
301
303
|
context.font = "400 ".concat(fontSize, "px ").concat(cssValue('--g-font-family-sans', context.canvas));
|
|
302
|
-
var fitted = (0, _presentation.fitCanvasText)(context, label,
|
|
304
|
+
var fitted = (0, _presentation.fitCanvasText)(context, label, maxWidth, trimStart);
|
|
303
305
|
context.fillText(fitted, x + width / 2, y + height + labelGap);
|
|
304
306
|
}
|
|
305
307
|
}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_graph","require","_layout","_presentation","_queryGraphIcons","_interopRequireDefault","e","__esModule","default","imageCache","Map","statusTokens","waiting","running","completed","failed","aborted","statusIconTokens","resourceTokens","START_ANGLE","Math","PI","STATUS_ICON_SIZE_RATIO","STATUS_ICON_BACKGROUND_RADIUS_RATIO","PROGRESS_WIDTH_RATIO","INNER_BORDER_WIDTH_RATIO","COUNTER_MAX_WIDTH_RATIO","LABEL_MAX_WIDTH_RATIO","COUNTER_FONT_SIZE","LABEL_FONT_SIZE","LABEL_GAP","RESOURCE_ICON_SIZE","cssValue","token","element","document","getComputedStyle","documentElement","getPropertyValue","trim","coloredSvgDataUrl","svg","color","markup","split","join","concat","encodeURIComponent","getCanvasImage","onSettled","Image","undefined","key","entry","get","image","state","listeners","Set","set","onload","forEach","listener","clear","onerror","src","add","QueryGraphCanvasBlock","exports","_CanvasBlock","_this","_classCallCheck","_len","arguments","length","args","Array","_key","_callSuper","redrawAfterImageLoad","performRender","_inherits","_createClass","value","renderMinimalisticBlock","ctx","renderQueryNode","renderSchematicView","renderDetailedView","context","_node$status","_node$label","meta","node","status","_ref","kind","_ref2","_slicedToArray","lineToken","baseToken","save","drawRunningOperation","getQueryGraphProgress","drawNodeShape","content","getQueryGraphNodeContent","_this$state","x","y","width","height","side","drawIcon","iconSvg","fallbackIconSvg","iconColorToken","canvas","fallbackIconColorToken","drawCounter","drawStatusIcon","drawLabel","label","name","restore","_this$state2","beginPath","arc","roundRect","fillStyle","fill","lineWidth","strokeStyle","stroke","progress","_this$state3","centerX","centerY","radius","progressWidth","endAngle","runningBase","runningLine","progressBase","progressLine","background","moveTo","closePath","_this$state4","maxFontSize","getScaleAdjustedFontSize","graph","cameraService","getCameraScale","fontFamily","textAlign","textBaseline","font","fontSize","fitCanvasFontSize","measureText","fillText","getQueryGraphStatusIconSvg","colorToken","_this$state5","backgroundRadius","iconX","iconY","fallbackSvg","fallbackColor","_entry","_entry2","drawImage","trimStart","_this$state6","cameraScale","labelGap","fitted","fitCanvasText","CanvasBlock"],"sources":["QueryGraphCanvasBlock.ts"],"sourcesContent":["/* eslint-disable no-param-reassign -- CanvasRenderingContext2D exposes drawing state as mutable properties. */\nimport {CanvasBlock, type TBlock} from '@gravity-ui/graph';\n\nimport type {QueryGraphNode, QueryGraphNodeStatus} from '../../../types/queryGraph';\nimport {getQueryGraphProgress} from '../helpers/layout';\nimport {\n fitCanvasFontSize,\n fitCanvasText,\n getQueryGraphNodeContent,\n getScaleAdjustedFontSize,\n} from '../helpers/presentation';\nimport {getQueryGraphStatusIconSvg} from './queryGraphIcons';\n\ntype QueryGraphBlockMeta = {\n node: QueryGraphNode;\n iconSvg: string;\n fallbackIconSvg: string;\n iconColorToken: string;\n fallbackIconColorToken: string;\n};\n\nexport type QueryGraphBlock = TBlock<QueryGraphBlockMeta>;\n\ntype ImageCacheEntry = {\n image: HTMLImageElement;\n state: 'loading' | 'loaded' | 'failed';\n listeners: Set<() => void>;\n};\n\nconst imageCache = new Map<string, ImageCacheEntry>();\nconst statusTokens = {\n 'not-started': ['--g-color-line-generic', '--g-color-base-float'],\n waiting: ['--g-color-text-misc-heavy', '--g-color-base-misc-light'],\n running: ['--g-color-line-generic', '--g-color-line-generic'],\n completed: ['--g-color-text-positive-heavy', '--g-color-base-positive-light'],\n failed: ['--g-color-text-danger-heavy', '--g-color-base-danger-light'],\n aborted: ['--g-color-text-complementary', '--g-color-base-generic'],\n} as const;\nconst statusIconTokens: Partial<Record<QueryGraphNodeStatus, string>> = {\n running: '--g-color-text-info',\n completed: '--g-color-text-positive-heavy',\n failed: '--g-color-text-danger-heavy',\n aborted: '--g-color-text-complementary',\n};\nconst resourceTokens = ['--g-color-line-generic', '--g-color-base-float'] as const;\nconst START_ANGLE = -Math.PI / 2;\nconst STATUS_ICON_SIZE_RATIO = 1 / 4;\nconst STATUS_ICON_BACKGROUND_RADIUS_RATIO = 1 / 6;\nconst PROGRESS_WIDTH_RATIO = 1 / 9;\nconst INNER_BORDER_WIDTH_RATIO = 1 / 25;\nconst COUNTER_MAX_WIDTH_RATIO = 7 / 9;\nconst LABEL_MAX_WIDTH_RATIO = 2;\nconst COUNTER_FONT_SIZE = 11;\nconst LABEL_FONT_SIZE = 9;\nconst LABEL_GAP = 4;\nconst RESOURCE_ICON_SIZE = 16;\n\nfunction cssValue(token: string, element?: Element) {\n if (typeof document === 'undefined') return '';\n return getComputedStyle(element ?? document.documentElement)\n .getPropertyValue(token)\n .trim();\n}\n\nfunction coloredSvgDataUrl(svg: string, color: string) {\n const markup = svg.split('currentColor').join(color || '#000');\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(markup)}`;\n}\n\nfunction getCanvasImage(svg: string, color: string, onSettled: () => void) {\n if (typeof Image === 'undefined') return undefined;\n const key = `${color}\\n${svg}`;\n let entry = imageCache.get(key);\n if (!entry) {\n const image = new Image();\n entry = {image, state: 'loading', listeners: new Set()};\n imageCache.set(key, entry);\n image.onload = () => {\n if (!entry) return;\n entry.state = 'loaded';\n entry.listeners.forEach((listener) => listener());\n entry.listeners.clear();\n };\n image.onerror = () => {\n if (!entry) return;\n entry.state = 'failed';\n entry.listeners.forEach((listener) => listener());\n entry.listeners.clear();\n };\n image.src = coloredSvgDataUrl(svg, color);\n }\n if (entry.state === 'loading') entry.listeners.add(onSettled);\n return entry;\n}\n\nexport class QueryGraphCanvasBlock extends CanvasBlock<QueryGraphBlock> {\n public override renderMinimalisticBlock(ctx: CanvasRenderingContext2D) {\n this.renderQueryNode(ctx);\n }\n\n public override renderSchematicView(ctx: CanvasRenderingContext2D) {\n this.renderQueryNode(ctx);\n }\n\n public override renderDetailedView(ctx: CanvasRenderingContext2D) {\n this.renderQueryNode(ctx);\n }\n\n private readonly redrawAfterImageLoad = () => this.performRender();\n\n private renderQueryNode(context: CanvasRenderingContext2D) {\n const {meta} = this.state;\n if (!meta?.node) return;\n const {node} = meta;\n const status = node.status ?? 'not-started';\n const [lineToken, baseToken] =\n node.kind === 'operation' ? statusTokens[status] : resourceTokens;\n\n context.save();\n if (node.kind === 'operation' && status === 'running') {\n this.drawRunningOperation(context, getQueryGraphProgress(node));\n } else {\n this.drawNodeShape(context, lineToken, baseToken);\n }\n\n const content = getQueryGraphNodeContent(node);\n if (content.kind === 'icon') {\n const {x, y, width, height} = this.state;\n const side = node.kind === 'operation' ? width / 2 : RESOURCE_ICON_SIZE;\n this.drawIcon(\n context,\n meta.iconSvg,\n meta.fallbackIconSvg,\n x + (width - side) / 2,\n y + (height - side) / 2,\n side,\n cssValue(meta.iconColorToken, context.canvas),\n cssValue(meta.fallbackIconColorToken, context.canvas),\n );\n } else if (content.kind === 'counter') {\n this.drawCounter(context, content.value);\n }\n\n if (node.kind === 'operation') this.drawStatusIcon(context, status);\n this.drawLabel(context, node.label ?? node.name, node.kind !== 'operation');\n context.restore();\n }\n\n private drawNodeShape(context: CanvasRenderingContext2D, lineToken: string, baseToken: string) {\n const {x, y, width, height, meta} = this.state;\n context.beginPath();\n if (meta?.node.kind === 'operation') {\n context.arc(x + width / 2, y + height / 2, width / 2 - 1, 0, Math.PI * 2);\n } else {\n context.roundRect(x + 1, y + 1, width - 2, height - 2, 12);\n }\n context.fillStyle = cssValue(baseToken, context.canvas);\n context.fill();\n context.lineWidth = 2;\n context.strokeStyle = cssValue(lineToken, context.canvas);\n context.stroke();\n }\n\n private drawRunningOperation(context: CanvasRenderingContext2D, progress: number) {\n const {x, y, width, height} = this.state;\n const centerX = x + width / 2;\n const centerY = y + height / 2;\n const radius = width / 2;\n const progressWidth = width * PROGRESS_WIDTH_RATIO;\n const endAngle = START_ANGLE + Math.PI * 2 * progress;\n const runningBase = cssValue('--g-color-line-generic', context.canvas);\n const runningLine = cssValue('--g-color-line-generic', context.canvas);\n const progressBase = cssValue('--g-color-base-info-light', context.canvas);\n const progressLine = cssValue('--g-color-text-info', context.canvas);\n const background = cssValue('--g-color-base-background', context.canvas);\n\n context.beginPath();\n context.arc(centerX, centerY, radius - progressWidth / 2, 0, Math.PI * 2);\n context.fillStyle = runningBase;\n context.fill();\n context.lineWidth = progressWidth;\n context.strokeStyle = runningLine;\n context.stroke();\n\n if (progress > 0) {\n context.beginPath();\n context.moveTo(centerX, centerY);\n context.arc(centerX, centerY, radius - progressWidth / 2, START_ANGLE, endAngle);\n context.closePath();\n context.fillStyle = progressBase;\n context.fill();\n\n context.beginPath();\n context.arc(centerX, centerY, radius - progressWidth / 2, START_ANGLE, endAngle);\n context.lineWidth = progressWidth;\n context.strokeStyle = progressLine;\n context.stroke();\n }\n\n context.beginPath();\n context.arc(centerX, centerY, radius - progressWidth, 0, Math.PI * 2);\n context.lineWidth = width * INNER_BORDER_WIDTH_RATIO;\n context.strokeStyle = background;\n context.stroke();\n }\n\n private drawCounter(context: CanvasRenderingContext2D, value: string) {\n const {x, y, width, height} = this.state;\n const maxFontSize = getScaleAdjustedFontSize(\n COUNTER_FONT_SIZE,\n this.context.graph.cameraService.getCameraScale(),\n );\n const fontFamily = cssValue('--g-font-family-sans', context.canvas);\n context.fillStyle = cssValue('--g-color-text-primary', context.canvas);\n context.textAlign = 'center';\n context.textBaseline = 'middle';\n context.font = `500 ${maxFontSize}px ${fontFamily}`;\n const fontSize = fitCanvasFontSize(\n maxFontSize,\n context.measureText(value).width,\n width * COUNTER_MAX_WIDTH_RATIO,\n );\n context.font = `500 ${fontSize}px ${fontFamily}`;\n context.fillText(value, x + width / 2, y + height / 2);\n }\n\n private drawStatusIcon(context: CanvasRenderingContext2D, status: QueryGraphNodeStatus) {\n const iconSvg = getQueryGraphStatusIconSvg(status);\n const colorToken = statusIconTokens[status];\n if (!iconSvg || !colorToken) return;\n const {x, y, width} = this.state;\n const side = width * STATUS_ICON_SIZE_RATIO;\n const backgroundRadius = width * STATUS_ICON_BACKGROUND_RADIUS_RATIO;\n const iconX = x + width - side;\n const iconY = y;\n\n context.beginPath();\n context.arc(iconX + side / 2, iconY + side / 2, backgroundRadius, 0, Math.PI * 2);\n context.fillStyle = cssValue('--g-color-base-background', context.canvas);\n context.fill();\n this.drawIcon(\n context,\n iconSvg,\n iconSvg,\n iconX,\n iconY,\n side,\n cssValue(colorToken, context.canvas),\n cssValue(colorToken, context.canvas),\n );\n }\n\n private drawIcon(\n context: CanvasRenderingContext2D,\n svg: string,\n fallbackSvg: string,\n x: number,\n y: number,\n side: number,\n color: string,\n fallbackColor: string,\n ) {\n let entry = getCanvasImage(svg, color, this.redrawAfterImageLoad);\n if (entry?.state === 'failed' && fallbackSvg !== svg) {\n entry = getCanvasImage(fallbackSvg, fallbackColor, this.redrawAfterImageLoad);\n }\n if (entry?.state === 'loaded') context.drawImage(entry.image, x, y, side, side);\n }\n\n private drawLabel(context: CanvasRenderingContext2D, label: string, trimStart: boolean) {\n const {x, y, width, height} = this.state;\n const cameraScale = this.context.graph.cameraService.getCameraScale();\n const fontSize = getScaleAdjustedFontSize(LABEL_FONT_SIZE, cameraScale);\n const labelGap = getScaleAdjustedFontSize(LABEL_GAP, cameraScale);\n context.fillStyle = cssValue('--g-color-text-primary', context.canvas);\n context.textAlign = 'center';\n context.textBaseline = 'top';\n context.font = `400 ${fontSize}px ${cssValue('--g-font-family-sans', context.canvas)}`;\n const fitted = fitCanvasText(context, label, width * LABEL_MAX_WIDTH_RATIO, trimStart);\n context.fillText(fitted, x + width / 2, y + height + labelGap);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_graph","require","_layout","_presentation","_queryGraphIcons","_interopRequireDefault","e","__esModule","default","imageCache","Map","statusTokens","waiting","running","completed","failed","aborted","statusIconTokens","resourceTokens","START_ANGLE","Math","PI","STATUS_ICON_SIZE_RATIO","STATUS_ICON_BACKGROUND_RADIUS_RATIO","PROGRESS_WIDTH_RATIO","INNER_BORDER_WIDTH_RATIO","COUNTER_MAX_WIDTH_RATIO","LABEL_MAX_WIDTH_RATIO","COUNTER_FONT_SIZE","LABEL_FONT_SIZE","LABEL_GAP","RESOURCE_ICON_SIZE","cssValue","token","element","document","getComputedStyle","documentElement","getPropertyValue","trim","coloredSvgDataUrl","svg","color","markup","split","join","concat","encodeURIComponent","getCanvasImage","onSettled","Image","undefined","key","entry","get","image","state","listeners","Set","set","onload","forEach","listener","clear","onerror","src","add","QueryGraphCanvasBlock","exports","_CanvasBlock","_this","_classCallCheck","_len","arguments","length","args","Array","_key","_callSuper","redrawAfterImageLoad","performRender","_inherits","_createClass","value","renderMinimalisticBlock","ctx","renderQueryNode","renderSchematicView","renderDetailedView","context","_node$status","_node$label","meta","node","status","_ref","kind","_ref2","_slicedToArray","lineToken","baseToken","save","drawRunningOperation","getQueryGraphProgress","drawNodeShape","content","getQueryGraphNodeContent","_this$state","x","y","width","height","side","drawIcon","iconSvg","fallbackIconSvg","iconColorToken","canvas","fallbackIconColorToken","drawCounter","drawStatusIcon","drawLabel","label","name","restore","_this$state2","beginPath","arc","roundRect","fillStyle","fill","lineWidth","strokeStyle","stroke","progress","_this$state3","centerX","centerY","radius","progressWidth","endAngle","runningBase","runningLine","progressBase","progressLine","background","moveTo","closePath","_this$state4","maxFontSize","getScaleAdjustedFontSize","graph","cameraService","getCameraScale","fontFamily","textAlign","textBaseline","font","fontSize","fitCanvasFontSize","measureText","fillText","getQueryGraphStatusIconSvg","colorToken","_this$state5","backgroundRadius","iconX","iconY","fallbackSvg","fallbackColor","_entry","_entry2","drawImage","trimStart","_this$state6","cameraScale","labelGap","maxWidth","fitted","fitCanvasText","CanvasBlock"],"sources":["QueryGraphCanvasBlock.ts"],"sourcesContent":["/* eslint-disable no-param-reassign -- CanvasRenderingContext2D exposes drawing state as mutable properties. */\nimport {CanvasBlock, type TBlock} from '@gravity-ui/graph';\n\nimport type {QueryGraphNode, QueryGraphNodeStatus} from '../../../types/queryGraph';\nimport {getQueryGraphProgress} from '../helpers/layout';\nimport {\n fitCanvasFontSize,\n fitCanvasText,\n getQueryGraphNodeContent,\n getScaleAdjustedFontSize,\n} from '../helpers/presentation';\nimport {getQueryGraphStatusIconSvg} from './queryGraphIcons';\n\ntype QueryGraphBlockMeta = {\n node: QueryGraphNode;\n iconSvg: string;\n fallbackIconSvg: string;\n iconColorToken: string;\n fallbackIconColorToken: string;\n};\n\nexport type QueryGraphBlock = TBlock<QueryGraphBlockMeta>;\n\ntype ImageCacheEntry = {\n image: HTMLImageElement;\n state: 'loading' | 'loaded' | 'failed';\n listeners: Set<() => void>;\n};\n\nconst imageCache = new Map<string, ImageCacheEntry>();\nconst statusTokens = {\n 'not-started': ['--g-color-line-generic', '--g-color-base-float'],\n waiting: ['--g-color-text-misc-heavy', '--g-color-base-misc-light'],\n running: ['--g-color-line-generic', '--g-color-line-generic'],\n completed: ['--g-color-text-positive-heavy', '--g-color-base-positive-light'],\n failed: ['--g-color-text-danger-heavy', '--g-color-base-danger-light'],\n aborted: ['--g-color-text-complementary', '--g-color-base-generic'],\n} as const;\nconst statusIconTokens: Partial<Record<QueryGraphNodeStatus, string>> = {\n running: '--g-color-text-info',\n completed: '--g-color-text-positive-heavy',\n failed: '--g-color-text-danger-heavy',\n aborted: '--g-color-text-complementary',\n};\nconst resourceTokens = ['--g-color-line-generic', '--g-color-base-float'] as const;\nconst START_ANGLE = -Math.PI / 2;\nconst STATUS_ICON_SIZE_RATIO = 1 / 4;\nconst STATUS_ICON_BACKGROUND_RADIUS_RATIO = 1 / 6;\nconst PROGRESS_WIDTH_RATIO = 1 / 9;\nconst INNER_BORDER_WIDTH_RATIO = 1 / 25;\nconst COUNTER_MAX_WIDTH_RATIO = 7 / 9;\nconst LABEL_MAX_WIDTH_RATIO = 2;\nconst COUNTER_FONT_SIZE = 11;\nconst LABEL_FONT_SIZE = 9;\nconst LABEL_GAP = 4;\nconst RESOURCE_ICON_SIZE = 16;\n\nfunction cssValue(token: string, element?: Element) {\n if (typeof document === 'undefined') return '';\n return getComputedStyle(element ?? document.documentElement)\n .getPropertyValue(token)\n .trim();\n}\n\nfunction coloredSvgDataUrl(svg: string, color: string) {\n const markup = svg.split('currentColor').join(color || '#000');\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(markup)}`;\n}\n\nfunction getCanvasImage(svg: string, color: string, onSettled: () => void) {\n if (typeof Image === 'undefined') return undefined;\n const key = `${color}\\n${svg}`;\n let entry = imageCache.get(key);\n if (!entry) {\n const image = new Image();\n entry = {image, state: 'loading', listeners: new Set()};\n imageCache.set(key, entry);\n image.onload = () => {\n if (!entry) return;\n entry.state = 'loaded';\n entry.listeners.forEach((listener) => listener());\n entry.listeners.clear();\n };\n image.onerror = () => {\n if (!entry) return;\n entry.state = 'failed';\n entry.listeners.forEach((listener) => listener());\n entry.listeners.clear();\n };\n image.src = coloredSvgDataUrl(svg, color);\n }\n if (entry.state === 'loading') entry.listeners.add(onSettled);\n return entry;\n}\n\nexport class QueryGraphCanvasBlock extends CanvasBlock<QueryGraphBlock> {\n public override renderMinimalisticBlock(ctx: CanvasRenderingContext2D) {\n this.renderQueryNode(ctx);\n }\n\n public override renderSchematicView(ctx: CanvasRenderingContext2D) {\n this.renderQueryNode(ctx);\n }\n\n public override renderDetailedView(ctx: CanvasRenderingContext2D) {\n this.renderQueryNode(ctx);\n }\n\n private readonly redrawAfterImageLoad = () => this.performRender();\n\n private renderQueryNode(context: CanvasRenderingContext2D) {\n const {meta} = this.state;\n if (!meta?.node) return;\n const {node} = meta;\n const status = node.status ?? 'not-started';\n const [lineToken, baseToken] =\n node.kind === 'operation' ? statusTokens[status] : resourceTokens;\n\n context.save();\n if (node.kind === 'operation' && status === 'running') {\n this.drawRunningOperation(context, getQueryGraphProgress(node));\n } else {\n this.drawNodeShape(context, lineToken, baseToken);\n }\n\n const content = getQueryGraphNodeContent(node);\n if (content.kind === 'icon') {\n const {x, y, width, height} = this.state;\n const side = node.kind === 'operation' ? width / 2 : RESOURCE_ICON_SIZE;\n this.drawIcon(\n context,\n meta.iconSvg,\n meta.fallbackIconSvg,\n x + (width - side) / 2,\n y + (height - side) / 2,\n side,\n cssValue(meta.iconColorToken, context.canvas),\n cssValue(meta.fallbackIconColorToken, context.canvas),\n );\n } else if (content.kind === 'counter') {\n this.drawCounter(context, content.value);\n }\n\n if (node.kind === 'operation') this.drawStatusIcon(context, status);\n this.drawLabel(context, node.label ?? node.name, node.kind !== 'operation');\n context.restore();\n }\n\n private drawNodeShape(context: CanvasRenderingContext2D, lineToken: string, baseToken: string) {\n const {x, y, width, height, meta} = this.state;\n context.beginPath();\n if (meta?.node.kind === 'operation') {\n context.arc(x + width / 2, y + height / 2, width / 2 - 1, 0, Math.PI * 2);\n } else {\n context.roundRect(x + 1, y + 1, width - 2, height - 2, 12);\n }\n context.fillStyle = cssValue(baseToken, context.canvas);\n context.fill();\n context.lineWidth = 2;\n context.strokeStyle = cssValue(lineToken, context.canvas);\n context.stroke();\n }\n\n private drawRunningOperation(context: CanvasRenderingContext2D, progress: number) {\n const {x, y, width, height} = this.state;\n const centerX = x + width / 2;\n const centerY = y + height / 2;\n const radius = width / 2;\n const progressWidth = width * PROGRESS_WIDTH_RATIO;\n const endAngle = START_ANGLE + Math.PI * 2 * progress;\n const runningBase = cssValue('--g-color-line-generic', context.canvas);\n const runningLine = cssValue('--g-color-line-generic', context.canvas);\n const progressBase = cssValue('--g-color-base-info-light', context.canvas);\n const progressLine = cssValue('--g-color-text-info', context.canvas);\n const background = cssValue('--g-color-base-background', context.canvas);\n\n context.beginPath();\n context.arc(centerX, centerY, radius - progressWidth / 2, 0, Math.PI * 2);\n context.fillStyle = runningBase;\n context.fill();\n context.lineWidth = progressWidth;\n context.strokeStyle = runningLine;\n context.stroke();\n\n if (progress > 0) {\n context.beginPath();\n context.moveTo(centerX, centerY);\n context.arc(centerX, centerY, radius - progressWidth / 2, START_ANGLE, endAngle);\n context.closePath();\n context.fillStyle = progressBase;\n context.fill();\n\n context.beginPath();\n context.arc(centerX, centerY, radius - progressWidth / 2, START_ANGLE, endAngle);\n context.lineWidth = progressWidth;\n context.strokeStyle = progressLine;\n context.stroke();\n }\n\n context.beginPath();\n context.arc(centerX, centerY, radius - progressWidth, 0, Math.PI * 2);\n context.lineWidth = width * INNER_BORDER_WIDTH_RATIO;\n context.strokeStyle = background;\n context.stroke();\n }\n\n private drawCounter(context: CanvasRenderingContext2D, value: string) {\n const {x, y, width, height} = this.state;\n const maxFontSize = getScaleAdjustedFontSize(\n COUNTER_FONT_SIZE,\n this.context.graph.cameraService.getCameraScale(),\n );\n const fontFamily = cssValue('--g-font-family-sans', context.canvas);\n context.fillStyle = cssValue('--g-color-text-primary', context.canvas);\n context.textAlign = 'center';\n context.textBaseline = 'middle';\n context.font = `500 ${maxFontSize}px ${fontFamily}`;\n const fontSize = fitCanvasFontSize(\n maxFontSize,\n context.measureText(value).width,\n width * COUNTER_MAX_WIDTH_RATIO,\n );\n context.font = `500 ${fontSize}px ${fontFamily}`;\n context.fillText(value, x + width / 2, y + height / 2);\n }\n\n private drawStatusIcon(context: CanvasRenderingContext2D, status: QueryGraphNodeStatus) {\n const iconSvg = getQueryGraphStatusIconSvg(status);\n const colorToken = statusIconTokens[status];\n if (!iconSvg || !colorToken) return;\n const {x, y, width} = this.state;\n const side = width * STATUS_ICON_SIZE_RATIO;\n const backgroundRadius = width * STATUS_ICON_BACKGROUND_RADIUS_RATIO;\n const iconX = x + width - side;\n const iconY = y;\n\n context.beginPath();\n context.arc(iconX + side / 2, iconY + side / 2, backgroundRadius, 0, Math.PI * 2);\n context.fillStyle = cssValue('--g-color-base-background', context.canvas);\n context.fill();\n this.drawIcon(\n context,\n iconSvg,\n iconSvg,\n iconX,\n iconY,\n side,\n cssValue(colorToken, context.canvas),\n cssValue(colorToken, context.canvas),\n );\n }\n\n private drawIcon(\n context: CanvasRenderingContext2D,\n svg: string,\n fallbackSvg: string,\n x: number,\n y: number,\n side: number,\n color: string,\n fallbackColor: string,\n ) {\n let entry = getCanvasImage(svg, color, this.redrawAfterImageLoad);\n if (entry?.state === 'failed' && fallbackSvg !== svg) {\n entry = getCanvasImage(fallbackSvg, fallbackColor, this.redrawAfterImageLoad);\n }\n if (entry?.state === 'loaded') context.drawImage(entry.image, x, y, side, side);\n }\n\n private drawLabel(context: CanvasRenderingContext2D, label: string, trimStart: boolean) {\n const {x, y, width, height} = this.state;\n const cameraScale = this.context.graph.cameraService.getCameraScale();\n const fontSize = getScaleAdjustedFontSize(LABEL_FONT_SIZE, cameraScale);\n const labelGap = getScaleAdjustedFontSize(LABEL_GAP, cameraScale);\n // Keep the available screen width stable, just like the label's font size.\n const maxWidth = getScaleAdjustedFontSize(width * LABEL_MAX_WIDTH_RATIO, cameraScale);\n context.fillStyle = cssValue('--g-color-text-primary', context.canvas);\n context.textAlign = 'center';\n context.textBaseline = 'top';\n context.font = `400 ${fontSize}px ${cssValue('--g-font-family-sans', context.canvas)}`;\n const fitted = fitCanvasText(context, label, maxWidth, trimStart);\n context.fillText(fitted, x + width / 2, y + height + labelGap);\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type { NavigationDetailConfig, NavigationHeaderAction, NavigationLocation } from '../../types/navigation';
|
|
2
|
+
import type { GetNavigationBreadcrumbHref, NavigationDetailConfig, NavigationHeaderAction, NavigationLocation, RenderNavigationHeaderActions } from '../../types/navigation';
|
|
3
3
|
import type { LoadPathSuggestions } from '../../types/pathEditor';
|
|
4
4
|
import './NavigationDetail.scss';
|
|
5
5
|
export type NavigationDetailProps = {
|
|
@@ -8,6 +8,8 @@ export type NavigationDetailProps = {
|
|
|
8
8
|
onUpdate: (location: NavigationLocation) => void;
|
|
9
9
|
onLoadSuggestions?: LoadPathSuggestions;
|
|
10
10
|
actions?: NavigationHeaderAction[];
|
|
11
|
+
renderActions?: RenderNavigationHeaderActions;
|
|
12
|
+
getBreadcrumbHref?: GetNavigationBreadcrumbHref;
|
|
11
13
|
activeTab?: string;
|
|
12
14
|
onTabUpdate?: (tab: string) => void;
|
|
13
15
|
search?: string;
|
|
@@ -33,6 +33,8 @@ var NavigationDetail = exports.NavigationDetail = function NavigationDetail(_ref
|
|
|
33
33
|
onUpdate = _ref.onUpdate,
|
|
34
34
|
onLoadSuggestions = _ref.onLoadSuggestions,
|
|
35
35
|
actions = _ref.actions,
|
|
36
|
+
renderActions = _ref.renderActions,
|
|
37
|
+
getBreadcrumbHref = _ref.getBreadcrumbHref,
|
|
36
38
|
activeTabProp = _ref.activeTab,
|
|
37
39
|
onTabUpdate = _ref.onTabUpdate,
|
|
38
40
|
searchProp = _ref.search,
|
|
@@ -90,6 +92,8 @@ var NavigationDetail = exports.NavigationDetail = function NavigationDetail(_ref
|
|
|
90
92
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_NavigationHeader.NavigationHeader, {
|
|
91
93
|
location: location,
|
|
92
94
|
actions: mergedActions,
|
|
95
|
+
renderActions: renderActions,
|
|
96
|
+
getBreadcrumbHref: getBreadcrumbHref,
|
|
93
97
|
onUpdate: onUpdate,
|
|
94
98
|
onLoadSuggestions: onLoadSuggestions
|
|
95
99
|
}), hasTabs ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_bemCnLite","_interopRequireDefault","_uikit","_NavigationHeader","_SearchWithButtons","_NavigationDetailTabs","_getInitialTab","_getVisibleTabs","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","block","cn","NavigationDetail","exports","_ref","_ref2","_activeTabConfig$rend","_activeTabConfig$rend2","config","location","onUpdate","onLoadSuggestions","actions","activeTabProp","activeTab","onTabUpdate","searchProp","search","onSearchUpdate","className","isTabControlled","undefined","isSearchControlled","visibleTabs","useMemo","getVisibleTabs","tabs","_useState","useState","getInitialTab","defaultTab","_useState2","_slicedToArray","activeTabState","setActiveTabState","_useState3","_useState4","searchState","setSearchState","handleTabUpdate","tab","handleSearchUpdate","value","mergedActions","_config$actions","concat","_toConsumableArray","activeTabConfig","find","id","activeContent","renderContent","searchPlaceholder","content","hasTabs","length","_jsxs","Flex","direction","gap","children","_jsx","NavigationHeader","_Fragment","NavigationDetailTabs","hasSearch","SearchWithButtons","placeholder","emptyContent"],"sources":["NavigationDetail.tsx"],"sourcesContent":["import React, {useMemo, useState} from 'react';\nimport cn from 'bem-cn-lite';\nimport {Flex} from '@gravity-ui/uikit';\nimport {NavigationHeader} from '../NavigationHeader';\nimport {SearchWithButtons} from '../../components/SearchWithButtons';\nimport type {\n NavigationDetailConfig,\n NavigationHeaderAction,\n NavigationLocation,\n} from '../../types/navigation';\nimport type {LoadPathSuggestions} from '../../types/pathEditor';\nimport {NavigationDetailTabs} from './internal/NavigationDetailTabs';\nimport {getInitialTab} from './helpers/getInitialTab';\nimport {getVisibleTabs} from './helpers/getVisibleTabs';\nimport './NavigationDetail.scss';\n\nconst block = cn('qp-navigation-detail');\n\nexport type NavigationDetailProps = {\n config: NavigationDetailConfig;\n location: NavigationLocation;\n onUpdate: (location: NavigationLocation) => void;\n onLoadSuggestions?: LoadPathSuggestions;\n actions?: NavigationHeaderAction[];\n activeTab?: string;\n onTabUpdate?: (tab: string) => void;\n search?: string;\n onSearchUpdate?: (value: string) => void;\n className?: string;\n};\n\nexport const NavigationDetail: React.FC<NavigationDetailProps> = ({\n config,\n location,\n onUpdate,\n onLoadSuggestions,\n actions,\n activeTab: activeTabProp,\n onTabUpdate,\n search: searchProp,\n onSearchUpdate,\n className,\n}) => {\n const isTabControlled = activeTabProp !== undefined;\n const isSearchControlled = searchProp !== undefined;\n\n const visibleTabs = useMemo(() => getVisibleTabs(config.tabs), [config.tabs]);\n\n const [activeTabState, setActiveTabState] = useState(() =>\n getInitialTab(visibleTabs, config.defaultTab),\n );\n const [searchState, setSearchState] = useState('');\n\n const activeTab = isTabControlled ? activeTabProp : activeTabState;\n const search = isSearchControlled ? searchProp : searchState;\n\n const handleTabUpdate = (tab: string) => {\n if (!isTabControlled) {\n setActiveTabState(tab);\n }\n onTabUpdate?.(tab);\n };\n\n const handleSearchUpdate = (value: string) => {\n if (!isSearchControlled) {\n setSearchState(value);\n }\n onSearchUpdate?.(value);\n };\n\n const mergedActions = useMemo(() => {\n if (!actions && !config.actions) {\n return undefined;\n }\n return [...(actions ?? []), ...(config.actions ?? [])];\n }, [actions, config.actions]);\n\n const activeTabConfig = visibleTabs.find((tab) => tab.id === activeTab);\n const activeContent = activeTabConfig\n ? (activeTabConfig.renderContent?.({\n search,\n onSearchUpdate: handleSearchUpdate,\n searchPlaceholder: config.searchPlaceholder,\n }) ??\n activeTabConfig.content ??\n null)\n : null;\n\n const hasTabs = visibleTabs.length > 0;\n\n return (\n <Flex direction=\"column\" gap={2} className={block(null, className)}>\n <NavigationHeader\n location={location}\n actions={mergedActions}\n onUpdate={onUpdate}\n onLoadSuggestions={onLoadSuggestions}\n />\n {hasTabs ? (\n <>\n <NavigationDetailTabs\n tabs={visibleTabs}\n activeTab={activeTab}\n onUpdate={handleTabUpdate}\n className={block('tabs')}\n />\n {config.hasSearch && (\n <SearchWithButtons\n placeholder={config.searchPlaceholder}\n value={search}\n onUpdate={handleSearchUpdate}\n />\n )}\n <div className={block('content')}>{activeContent}</div>\n </>\n ) : (\n config.emptyContent\n )}\n </Flex>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_bemCnLite","_interopRequireDefault","_uikit","_NavigationHeader","_SearchWithButtons","_NavigationDetailTabs","_getInitialTab","_getVisibleTabs","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","block","cn","NavigationDetail","exports","_ref","_ref2","_activeTabConfig$rend","_activeTabConfig$rend2","config","location","onUpdate","onLoadSuggestions","actions","renderActions","getBreadcrumbHref","activeTabProp","activeTab","onTabUpdate","searchProp","search","onSearchUpdate","className","isTabControlled","undefined","isSearchControlled","visibleTabs","useMemo","getVisibleTabs","tabs","_useState","useState","getInitialTab","defaultTab","_useState2","_slicedToArray","activeTabState","setActiveTabState","_useState3","_useState4","searchState","setSearchState","handleTabUpdate","tab","handleSearchUpdate","value","mergedActions","_config$actions","concat","_toConsumableArray","activeTabConfig","find","id","activeContent","renderContent","searchPlaceholder","content","hasTabs","length","_jsxs","Flex","direction","gap","children","_jsx","NavigationHeader","_Fragment","NavigationDetailTabs","hasSearch","SearchWithButtons","placeholder","emptyContent"],"sources":["NavigationDetail.tsx"],"sourcesContent":["import React, {useMemo, useState} from 'react';\nimport cn from 'bem-cn-lite';\nimport {Flex} from '@gravity-ui/uikit';\nimport {NavigationHeader} from '../NavigationHeader';\nimport {SearchWithButtons} from '../../components/SearchWithButtons';\nimport type {\n GetNavigationBreadcrumbHref,\n NavigationDetailConfig,\n NavigationHeaderAction,\n NavigationLocation,\n RenderNavigationHeaderActions,\n} from '../../types/navigation';\nimport type {LoadPathSuggestions} from '../../types/pathEditor';\nimport {NavigationDetailTabs} from './internal/NavigationDetailTabs';\nimport {getInitialTab} from './helpers/getInitialTab';\nimport {getVisibleTabs} from './helpers/getVisibleTabs';\nimport './NavigationDetail.scss';\n\nconst block = cn('qp-navigation-detail');\n\nexport type NavigationDetailProps = {\n config: NavigationDetailConfig;\n location: NavigationLocation;\n onUpdate: (location: NavigationLocation) => void;\n onLoadSuggestions?: LoadPathSuggestions;\n actions?: NavigationHeaderAction[];\n renderActions?: RenderNavigationHeaderActions;\n getBreadcrumbHref?: GetNavigationBreadcrumbHref;\n activeTab?: string;\n onTabUpdate?: (tab: string) => void;\n search?: string;\n onSearchUpdate?: (value: string) => void;\n className?: string;\n};\n\nexport const NavigationDetail: React.FC<NavigationDetailProps> = ({\n config,\n location,\n onUpdate,\n onLoadSuggestions,\n actions,\n renderActions,\n getBreadcrumbHref,\n activeTab: activeTabProp,\n onTabUpdate,\n search: searchProp,\n onSearchUpdate,\n className,\n}) => {\n const isTabControlled = activeTabProp !== undefined;\n const isSearchControlled = searchProp !== undefined;\n\n const visibleTabs = useMemo(() => getVisibleTabs(config.tabs), [config.tabs]);\n\n const [activeTabState, setActiveTabState] = useState(() =>\n getInitialTab(visibleTabs, config.defaultTab),\n );\n const [searchState, setSearchState] = useState('');\n\n const activeTab = isTabControlled ? activeTabProp : activeTabState;\n const search = isSearchControlled ? searchProp : searchState;\n\n const handleTabUpdate = (tab: string) => {\n if (!isTabControlled) {\n setActiveTabState(tab);\n }\n onTabUpdate?.(tab);\n };\n\n const handleSearchUpdate = (value: string) => {\n if (!isSearchControlled) {\n setSearchState(value);\n }\n onSearchUpdate?.(value);\n };\n\n const mergedActions = useMemo(() => {\n if (!actions && !config.actions) {\n return undefined;\n }\n return [...(actions ?? []), ...(config.actions ?? [])];\n }, [actions, config.actions]);\n\n const activeTabConfig = visibleTabs.find((tab) => tab.id === activeTab);\n const activeContent = activeTabConfig\n ? (activeTabConfig.renderContent?.({\n search,\n onSearchUpdate: handleSearchUpdate,\n searchPlaceholder: config.searchPlaceholder,\n }) ??\n activeTabConfig.content ??\n null)\n : null;\n\n const hasTabs = visibleTabs.length > 0;\n\n return (\n <Flex direction=\"column\" gap={2} className={block(null, className)}>\n <NavigationHeader\n location={location}\n actions={mergedActions}\n renderActions={renderActions}\n getBreadcrumbHref={getBreadcrumbHref}\n onUpdate={onUpdate}\n onLoadSuggestions={onLoadSuggestions}\n />\n {hasTabs ? (\n <>\n <NavigationDetailTabs\n tabs={visibleTabs}\n activeTab={activeTab}\n onUpdate={handleTabUpdate}\n className={block('tabs')}\n />\n {config.hasSearch && (\n <SearchWithButtons\n placeholder={config.searchPlaceholder}\n value={search}\n onUpdate={handleSearchUpdate}\n />\n )}\n <div className={block('content')}>{activeContent}</div>\n </>\n ) : (\n config.emptyContent\n )}\n </Flex>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { FC } from 'react';
|
|
2
|
-
import type { NavigationHeaderAction, NavigationLocation } from '../../types/navigation';
|
|
2
|
+
import type { GetNavigationBreadcrumbHref, NavigationHeaderAction, NavigationLocation, RenderNavigationHeaderActions } from '../../types/navigation';
|
|
3
3
|
import type { LoadPathSuggestions } from '../../types/pathEditor';
|
|
4
4
|
export type NavigationHeaderProps = {
|
|
5
5
|
location: NavigationLocation;
|
|
6
6
|
actions?: NavigationHeaderAction[];
|
|
7
|
+
renderActions?: RenderNavigationHeaderActions;
|
|
8
|
+
getBreadcrumbHref?: GetNavigationBreadcrumbHref;
|
|
7
9
|
onUpdate: (location: NavigationLocation) => void;
|
|
8
10
|
onLoadSuggestions?: LoadPathSuggestions;
|
|
9
11
|
className?: string;
|
|
@@ -13,6 +13,8 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
13
13
|
var NavigationHeader = exports.NavigationHeader = function NavigationHeader(_ref) {
|
|
14
14
|
var location = _ref.location,
|
|
15
15
|
actions = _ref.actions,
|
|
16
|
+
renderActions = _ref.renderActions,
|
|
17
|
+
getBreadcrumbHref = _ref.getBreadcrumbHref,
|
|
16
18
|
onUpdate = _ref.onUpdate,
|
|
17
19
|
onLoadSuggestions = _ref.onLoadSuggestions,
|
|
18
20
|
className = _ref.className;
|
|
@@ -24,8 +26,12 @@ var NavigationHeader = exports.NavigationHeader = function NavigationHeader(_ref
|
|
|
24
26
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Breadcrumbs.Breadcrumbs, {
|
|
25
27
|
location: location,
|
|
26
28
|
onUpdate: onUpdate,
|
|
29
|
+
getBreadcrumbHref: getBreadcrumbHref,
|
|
27
30
|
onLoadSuggestions: onLoadSuggestions
|
|
28
|
-
}),
|
|
31
|
+
}), renderActions ? renderActions({
|
|
32
|
+
location: location,
|
|
33
|
+
actions: actions !== null && actions !== void 0 ? actions : []
|
|
34
|
+
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_NavigationActionButtons.NavigationActionButtons, {
|
|
29
35
|
actions: actions,
|
|
30
36
|
arg: location
|
|
31
37
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireDefault","require","_uikit","_Breadcrumbs","_NavigationActionButtons","_jsxRuntime","e","__esModule","default","NavigationHeader","exports","_ref","location","actions","onUpdate","onLoadSuggestions","className","_jsxs","Flex","gap","justifyContent","alignItems","children","_jsx","Breadcrumbs","NavigationActionButtons","arg"],"sources":["NavigationHeader.tsx"],"sourcesContent":["import React, {FC} from 'react';\nimport {Flex} from '@gravity-ui/uikit';\nimport {Breadcrumbs} from '../../components/Breadcrumbs';\nimport {NavigationActionButtons} from '../../components/NavigationActionButtons';\nimport type {NavigationHeaderAction
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_uikit","_Breadcrumbs","_NavigationActionButtons","_jsxRuntime","e","__esModule","default","NavigationHeader","exports","_ref","location","actions","renderActions","getBreadcrumbHref","onUpdate","onLoadSuggestions","className","_jsxs","Flex","gap","justifyContent","alignItems","children","_jsx","Breadcrumbs","NavigationActionButtons","arg"],"sources":["NavigationHeader.tsx"],"sourcesContent":["import React, {FC} from 'react';\nimport {Flex} from '@gravity-ui/uikit';\nimport {Breadcrumbs} from '../../components/Breadcrumbs';\nimport {NavigationActionButtons} from '../../components/NavigationActionButtons';\nimport type {\n GetNavigationBreadcrumbHref,\n NavigationHeaderAction,\n NavigationLocation,\n RenderNavigationHeaderActions,\n} from '../../types/navigation';\nimport type {LoadPathSuggestions} from '../../types/pathEditor';\n\nexport type NavigationHeaderProps = {\n location: NavigationLocation;\n actions?: NavigationHeaderAction[];\n renderActions?: RenderNavigationHeaderActions;\n getBreadcrumbHref?: GetNavigationBreadcrumbHref;\n onUpdate: (location: NavigationLocation) => void;\n onLoadSuggestions?: LoadPathSuggestions;\n className?: string;\n};\n\nexport const NavigationHeader: FC<NavigationHeaderProps> = ({\n location,\n actions,\n renderActions,\n getBreadcrumbHref,\n onUpdate,\n onLoadSuggestions,\n className,\n}) => {\n return (\n <Flex gap={2} justifyContent=\"space-between\" alignItems=\"center\" className={className}>\n <Breadcrumbs\n location={location}\n onUpdate={onUpdate}\n getBreadcrumbHref={getBreadcrumbHref}\n onLoadSuggestions={onLoadSuggestions}\n />\n {renderActions ? (\n renderActions({location, actions: actions ?? []})\n ) : (\n <NavigationActionButtons actions={actions} arg={location} />\n )}\n </Flex>\n );\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAF,OAAA;AACA,IAAAG,wBAAA,GAAAH,OAAA;AAAiF,IAAAI,WAAA,GAAAJ,OAAA;AAAA,SAAAD,uBAAAM,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAmB1E,IAAMG,gBAA2C,GAAAC,OAAA,CAAAD,gBAAA,GAAG,SAA9CA,gBAA2CA,CAAAE,IAAA,EAQlD;EAAA,IAPFC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;IACRC,OAAO,GAAAF,IAAA,CAAPE,OAAO;IACPC,aAAa,GAAAH,IAAA,CAAbG,aAAa;IACbC,iBAAiB,GAAAJ,IAAA,CAAjBI,iBAAiB;IACjBC,QAAQ,GAAAL,IAAA,CAARK,QAAQ;IACRC,iBAAiB,GAAAN,IAAA,CAAjBM,iBAAiB;IACjBC,SAAS,GAAAP,IAAA,CAATO,SAAS;EAET,oBACI,IAAAC,gBAAA,EAACC,WAAI;IAACC,GAAG,EAAE,CAAE;IAACC,cAAc,EAAC,eAAe;IAACC,UAAU,EAAC,QAAQ;IAACL,SAAS,EAAEA,SAAU;IAAAM,QAAA,gBAClF,IAAAC,eAAA,EAACC,wBAAW;MACRd,QAAQ,EAAEA,QAAS;MACnBI,QAAQ,EAAEA,QAAS;MACnBD,iBAAiB,EAAEA,iBAAkB;MACrCE,iBAAiB,EAAEA;IAAkB,CACxC,CAAC,EACDH,aAAa,GACVA,aAAa,CAAC;MAACF,QAAQ,EAARA,QAAQ;MAAEC,OAAO,EAAEA,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAI;IAAE,CAAC,CAAC,gBAEjD,IAAAY,eAAA,EAACE,gDAAuB;MAACd,OAAO,EAAEA,OAAQ;MAACe,GAAG,EAAEhB;IAAS,CAAE,CAC9D;EAAA,CACC,CAAC;AAEf,CAAC","ignoreList":[]}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import type { NavigationItem, NavigationSortOrder, RenderNavigationItem } from '../../types/navigation';
|
|
2
|
+
import type { NavigationItem, NavigationParentRowConfig, NavigationSortOrder, RenderNavigationItem } from '../../types/navigation';
|
|
3
3
|
import './NavigationItemsList.scss';
|
|
4
4
|
export type NavigationItemsListProps<T extends NavigationItem = NavigationItem> = {
|
|
5
5
|
items: T[];
|
|
6
6
|
path?: string;
|
|
7
7
|
search?: string;
|
|
8
|
+
parentRow?: NavigationParentRowConfig;
|
|
8
9
|
sort?: NavigationSortOrder;
|
|
9
10
|
onSortUpdate?: (sort: NavigationSortOrder) => void;
|
|
10
11
|
titleLabel: string;
|
|
@@ -17,4 +18,4 @@ export type NavigationItemsListProps<T extends NavigationItem = NavigationItem>
|
|
|
17
18
|
onItemClick?: (item: T) => void;
|
|
18
19
|
className?: string;
|
|
19
20
|
};
|
|
20
|
-
export declare const NavigationItemsList: <T extends NavigationItem = NavigationItem>({ items, path, search, sort, onSortUpdate, titleLabel, loading, error, hasMore, onLoadMore, emptyContent, renderRowItem, onItemClick, className, }: NavigationItemsListProps<T>) => React.JSX.Element;
|
|
21
|
+
export declare const NavigationItemsList: <T extends NavigationItem = NavigationItem>({ items, path, search, parentRow: parentRowConfig, sort, onSortUpdate, titleLabel, loading, error, hasMore, onLoadMore, emptyContent, renderRowItem, onItemClick, className, }: NavigationItemsListProps<T>) => React.JSX.Element;
|
|
@@ -25,6 +25,7 @@ var NavigationItemsList = exports.NavigationItemsList = function NavigationItems
|
|
|
25
25
|
var items = _ref.items,
|
|
26
26
|
path = _ref.path,
|
|
27
27
|
search = _ref.search,
|
|
28
|
+
parentRowConfig = _ref.parentRow,
|
|
28
29
|
sort = _ref.sort,
|
|
29
30
|
onSortUpdate = _ref.onSortUpdate,
|
|
30
31
|
titleLabel = _ref.titleLabel,
|
|
@@ -36,7 +37,7 @@ var NavigationItemsList = exports.NavigationItemsList = function NavigationItems
|
|
|
36
37
|
renderRowItem = _ref.renderRowItem,
|
|
37
38
|
_onItemClick = _ref.onItemClick,
|
|
38
39
|
className = _ref.className;
|
|
39
|
-
var parentRow = (0, _useParentRow.useParentRow)(path, search);
|
|
40
|
+
var parentRow = (0, _useParentRow.useParentRow)(path, search, parentRowConfig === null || parentRowConfig === void 0 ? void 0 : parentRowConfig.showDuringSearch);
|
|
40
41
|
var rows = parentRow ? [parentRow].concat((0, _toConsumableArray2.default)(items)) : items;
|
|
41
42
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
42
43
|
className: block(null, className),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireDefault","require","_bemCnLite","_LazyList","_NavigationItemRow","_NavigationItemsListHeader","_NavigationItemsListEmptyState","_useParentRow","_row","_jsxRuntime","e","__esModule","default","block","cn","NavigationItemsList","exports","_ref","items","path","search","sort","onSortUpdate","titleLabel","loading","error","hasMore","onLoadMore","emptyContent","renderRowItem","onItemClick","className","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_bemCnLite","_LazyList","_NavigationItemRow","_NavigationItemsListHeader","_NavigationItemsListEmptyState","_useParentRow","_row","_jsxRuntime","e","__esModule","default","block","cn","NavigationItemsList","exports","_ref","items","path","search","parentRowConfig","parentRow","sort","onSortUpdate","titleLabel","loading","error","hasMore","onLoadMore","emptyContent","renderRowItem","onItemClick","className","useParentRow","showDuringSearch","rows","concat","_toConsumableArray","_jsxs","children","_jsx","NavigationItemsListHeader","LazyList","isEmpty","length","itemHeight","NAVIGATION_ROW_HEIGHT","renderItem","item","isActive","index","_renderRowItem","isParentRow","Boolean","NavigationItemRow","NavigationItemsListEmptyState","_onItemClick","disabled"],"sources":["NavigationItemsList.tsx"],"sourcesContent":["import React from 'react';\nimport cn from 'bem-cn-lite';\nimport type {\n NavigationItem,\n NavigationParentRowConfig,\n NavigationSortOrder,\n RenderNavigationItem,\n} from '../../types/navigation';\nimport {LazyList} from '../../components/LazyList';\nimport {NavigationItemRow} from '../../components/NavigationItemRow';\nimport {NavigationItemsListHeader} from './internal/NavigationItemsListHeader';\nimport {NavigationItemsListEmptyState} from './internal/NavigationItemsListEmptyState';\nimport {useParentRow} from './internal/useParentRow';\nimport {NAVIGATION_ROW_HEIGHT} from '../../constants/row';\nimport './NavigationItemsList.scss';\n\nconst block = cn('qp-navigation-items-list');\n\nexport type NavigationItemsListProps<T extends NavigationItem = NavigationItem> = {\n items: T[];\n path?: string;\n search?: string;\n parentRow?: NavigationParentRowConfig;\n sort?: NavigationSortOrder;\n onSortUpdate?: (sort: NavigationSortOrder) => void;\n titleLabel: string;\n loading?: boolean;\n error?: React.ReactNode;\n hasMore?: boolean;\n onLoadMore?: () => void;\n emptyContent?: React.ReactNode;\n renderRowItem?: RenderNavigationItem<T>;\n onItemClick?: (item: T) => void;\n className?: string;\n};\n\nexport const NavigationItemsList = <T extends NavigationItem = NavigationItem>({\n items,\n path,\n search,\n parentRow: parentRowConfig,\n sort,\n onSortUpdate,\n titleLabel,\n loading,\n error,\n hasMore,\n onLoadMore,\n emptyContent,\n renderRowItem,\n onItemClick,\n className,\n}: NavigationItemsListProps<T>) => {\n const parentRow = useParentRow(path, search, parentRowConfig?.showDuringSearch);\n\n const rows = (parentRow ? [parentRow as T, ...items] : items) as T[];\n\n return (\n <div className={block(null, className)}>\n <NavigationItemsListHeader\n titleLabel={titleLabel}\n sort={sort}\n onSortUpdate={onSortUpdate}\n className={block('header')}\n />\n <LazyList<T>\n className={block('list')}\n items={rows}\n isEmpty={!items.length}\n itemHeight={() => NAVIGATION_ROW_HEIGHT}\n renderItem={(item, isActive, index) => {\n const isParentRow = Boolean(parentRow) && item === (parentRow as T);\n\n return (\n renderRowItem?.({item, index, isActive, isParentRow}) ?? (\n <NavigationItemRow item={item} />\n )\n );\n }}\n hasMore={hasMore}\n onLoadMore={onLoadMore}\n loading={loading}\n error={error}\n emptyContent={\n <NavigationItemsListEmptyState\n parentRow={parentRow as T | undefined}\n emptyContent={emptyContent}\n renderRowItem={renderRowItem}\n onItemClick={onItemClick}\n />\n }\n onItemClick={(item) => {\n if (!item.disabled) {\n onItemClick?.(item);\n }\n }}\n />\n </div>\n );\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { NavigationItem } from '../../../types/navigation';
|
|
2
|
-
export declare function useParentRow(path: string | undefined, search: string | undefined): NavigationItem | undefined;
|
|
2
|
+
export declare function useParentRow(path: string | undefined, search: string | undefined, showDuringSearch?: boolean): NavigationItem | undefined;
|