@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_TutorialsHistory","_actions","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_interopRequireDefault","QUERY","filterFields","id","type","title","initialValue","items","logFilterApply","action","logFilterReset","BASE_ITEMS","query","height","meta","component","TutorialsHistory","tags","parameters","layout","_default","exports","DefaultStory","_useState","useState","concat","_useState2","_slicedToArray","setItems","_useState3","value","fullSearch","_useState4","search","setSearch","handleOnSearch","data","newItems","filter","item","_item$query","toLowerCase","searchValue","includes","_jsx","style","width","children","fields","onApply","onReset","hasClear","onUpdate","EmptyStory","_useState5","_useState6","Default","render","Empty"],"sources":["TutorialsHistory.stories.tsx"],"sourcesContent":["import React, {useState} from 'react';\nimport type {Meta, StoryObj} from '@storybook/react';\nimport {TutorialsHistory} from './TutorialsHistory';\nimport {QueryListFilterConfig, QueryListItem} from '../../types/queryList';\nimport {TutorialHistoryRow} from '../../types/tutorial';\nimport {action} from 'storybook/actions';\n\nconst QUERY = `use test;\n\nSELECT\n \"test_session\" AS session_id,\n \"test_task\" AS task_id,\n SUBSTRING(\"test\", 1, 1) AS truncated_char`;\n\nconst filterFields: QueryListFilterConfig['fields'] = [\n {id: 'onlyMine', type: 'switch', title: 'My queries only', initialValue: true},\n {id: 'range', type: 'rangeDatePicker', title: 'Period'},\n {\n id: 'dialect',\n type: 'checkboxGroup',\n title: 'Dialect',\n initialValue: [],\n items: [\n {id: 'yql', title: 'YQL'},\n {id: 'sql', title: 'SQL'},\n ],\n },\n];\n\nconst logFilterApply = action('onFilterApply');\nconst logFilterReset = action('onFilterReset');\n\nconst BASE_ITEMS: QueryListItem<TutorialHistoryRow>[] = [\n {\n id: 1,\n title: 'Getting started with YQL',\n query: QUERY,\n height: 28,\n },\n {\n id: 2,\n title: 'Working with tables',\n query: QUERY,\n height: 28,\n },\n {\n id: 3,\n title: 'Window functions',\n query: QUERY,\n height: 28,\n },\n];\n\nconst meta: Meta<typeof TutorialsHistory> = {\n title: 'Widgets/TutorialsHistory',\n component: TutorialsHistory,\n tags: ['autodocs'],\n parameters: {\n layout: 'padded',\n },\n};\n\nexport default meta;\ntype Story = StoryObj<typeof TutorialsHistory>;\n\nconst DefaultStory = () => {\n const [items, setItems] = useState([...BASE_ITEMS]);\n const [search, setSearch] = useState({value: '', fullSearch: false});\n\n const handleOnSearch = (data: {value: string; fullSearch: boolean}) => {\n setSearch(data);\n\n if (!data.value) {\n setItems(BASE_ITEMS);\n return;\n }\n\n const newItems = BASE_ITEMS.filter((item) => {\n if (!('id' in item)) return false;\n\n const title = item.title.toLowerCase();\n const query = item.query?.toLowerCase();\n const searchValue = data.value.toLowerCase();\n\n if (data.fullSearch) {\n return title.includes(searchValue) || query?.includes(searchValue);\n }\n\n return title.includes(searchValue);\n });\n setItems(newItems);\n };\n\n return (\n <div style={{width: 300, height: 500}}>\n <TutorialsHistory\n title=\"Tutorials\"\n items={items}\n filter={{\n fields: filterFields,\n onApply: logFilterApply,\n onReset: logFilterReset('reset'),\n }}\n search={{\n value: search.value,\n fullSearch: search.fullSearch,\n hasClear: true,\n onUpdate: handleOnSearch,\n }}\n />\n </div>\n );\n};\n\nconst EmptyStory = () => {\n const [search, setSearch] = useState({value: '', fullSearch: false});\n\n return (\n <div style={{width: 300, height: 500}}>\n <TutorialsHistory\n title=\"Tutorials\"\n items={[]}\n search={{\n value: search.value,\n fullSearch: search.fullSearch,\n hasClear: true,\n onUpdate: setSearch,\n }}\n />\n </div>\n );\n};\n\nexport const Default: Story = {render: () => <DefaultStory />};\nexport const Empty: Story = {render: () => <EmptyStory />};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_uikit","_components","_TutorialsHistory","_actions","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_interopRequireDefault","BookOpenIcon","props","_jsx","_objectSpread","children","fill","fillRule","d","clipRule","defaultProps","xmlns","width","height","viewBox","QUERY","filterFields","id","type","title","initialValue","items","logFilterApply","action","logFilterReset","BASE_ITEMS","query","LINK_ITEMS","map","item","href","concat","PAGINATION_PAGES","Array","from","length","_","index","CUSTOM_ROW_ITEMS","header","renderRouterLink","_ref","_onClick","onClick","_objectWithoutProperties","_excluded","event","defaultPrevented","button","metaKey","ctrlKey","shiftKey","altKey","preventDefault","meta","component","TutorialsHistory","tags","parameters","layout","_default","exports","DefaultStory","_useState","useState","_useState2","_slicedToArray","setItems","_useState3","value","fullSearch","_useState4","search","setSearch","handleOnSearch","data","newItems","filter","_item$query","toLowerCase","searchValue","includes","style","fields","onApply","onReset","hasClear","onUpdate","EmptyStory","_useState5","_useState6","PaginatedStory","_useState7","_useState8","_useState9","_useState0","page","setPage","_useState1","_useState10","loading","setLoading","handleLoadMore","nextPage","window","setTimeout","currentItems","_toConsumableArray","currentPage","selectedRowId","hasMore","onLoadMore","renderLink","RouterLinksStory","_useState11","_useState12","CustomRowRendererStory","renderRowItem","_ref2","HistoryGroupHeader","RowLink","_jsxs","Flex","alignItems","gap","Icon","size","Text","ellipsis","Default","render","Empty","InitialLoading","args","decorators","StoryComponent","Paginated","LoadingMore","RouterLinks","CustomRowRenderer"],"sources":["TutorialsHistory.stories.tsx"],"sourcesContent":["import React, {useState} from 'react';\nimport type {Meta, StoryObj} from '@storybook/react';\nimport {Flex, Icon, Text} from '@gravity-ui/uikit';\nimport BookOpenIcon from '@gravity-ui/icons/svgs/book-open.svg';\nimport {HistoryGroupHeader, RowLink} from '../../components';\nimport {TutorialsHistory} from './TutorialsHistory';\nimport type {\n QueryListFilterConfig,\n QueryListItem,\n QueryListLinkRenderer,\n} from '../../types/queryList';\nimport type {TutorialHistoryRow} from '../../types/tutorial';\nimport {action} from 'storybook/actions';\n\nconst QUERY = `use test;\n\nSELECT\n \"test_session\" AS session_id,\n \"test_task\" AS task_id,\n SUBSTRING(\"test\", 1, 1) AS truncated_char`;\n\nconst filterFields: QueryListFilterConfig['fields'] = [\n {id: 'onlyMine', type: 'switch', title: 'My queries only', initialValue: true},\n {id: 'range', type: 'rangeDatePicker', title: 'Period'},\n {\n id: 'dialect',\n type: 'checkboxGroup',\n title: 'Dialect',\n initialValue: [],\n items: [\n {id: 'yql', title: 'YQL'},\n {id: 'sql', title: 'SQL'},\n ],\n },\n];\n\nconst logFilterApply = action('onFilterApply');\nconst logFilterReset = action('onFilterReset');\n\nconst BASE_ITEMS: QueryListItem<TutorialHistoryRow>[] = [\n {\n id: 1,\n title: 'Getting started with YQL',\n query: QUERY,\n height: 28,\n },\n {\n id: 2,\n title: 'Working with tables',\n query: QUERY,\n height: 28,\n },\n {\n id: 3,\n title: 'Window functions',\n query: QUERY,\n height: 28,\n },\n];\n\nconst LINK_ITEMS = BASE_ITEMS.map((item) =>\n 'id' in item ? {...item, href: `/tutorials/${item.id}`} : item,\n);\n\nconst PAGINATION_PAGES: QueryListItem<TutorialHistoryRow>[][] = [\n Array.from({length: 8}, (_, index) => ({\n id: `basics-${index + 1}`,\n title: `YQL basics: lesson ${index + 1}`,\n query: QUERY,\n href: `/tutorials/basics-${index + 1}`,\n height: 28,\n })),\n Array.from({length: 8}, (_, index) => ({\n id: `advanced-${index + 1}`,\n title: `Advanced YQL: lesson ${index + 1}`,\n query: QUERY,\n href: `/tutorials/advanced-${index + 1}`,\n height: 28,\n })),\n];\n\nconst CUSTOM_ROW_ITEMS: QueryListItem<TutorialHistoryRow>[] = [\n {header: 'Getting started', height: 28},\n {\n id: '01HZXB4K8P7Y2Q9T6M3N5R1C0A',\n title: 'Getting started with YQL',\n href: '/tutorials/getting-started',\n height: 32,\n },\n];\n\nconst renderRouterLink: QueryListLinkRenderer = ({onClick, ...props}) => (\n <a\n {...props}\n data-router-link\n onClick={(event) => {\n onClick?.(event);\n\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey\n ) {\n return;\n }\n\n event.preventDefault();\n action('routerNavigate')(props.href);\n }}\n />\n);\n\nconst meta: Meta<typeof TutorialsHistory> = {\n title: 'Widgets/TutorialsHistory',\n component: TutorialsHistory,\n tags: ['autodocs'],\n parameters: {\n layout: 'padded',\n },\n};\n\nexport default meta;\ntype Story = StoryObj<typeof TutorialsHistory>;\n\nconst DefaultStory = () => {\n const [items, setItems] = useState([...BASE_ITEMS]);\n const [search, setSearch] = useState({value: '', fullSearch: false});\n\n const handleOnSearch = (data: {value: string; fullSearch: boolean}) => {\n setSearch(data);\n\n if (!data.value) {\n setItems(BASE_ITEMS);\n return;\n }\n\n const newItems = BASE_ITEMS.filter((item) => {\n if (!('id' in item)) return false;\n\n const title = item.title.toLowerCase();\n const query = item.query?.toLowerCase();\n const searchValue = data.value.toLowerCase();\n\n if (data.fullSearch) {\n return title.includes(searchValue) || query?.includes(searchValue);\n }\n\n return title.includes(searchValue);\n });\n setItems(newItems);\n };\n\n return (\n <div style={{width: 300, height: 500}}>\n <TutorialsHistory\n title=\"Tutorials\"\n items={items}\n filter={{\n fields: filterFields,\n onApply: logFilterApply,\n onReset: logFilterReset('reset'),\n }}\n search={{\n value: search.value,\n fullSearch: search.fullSearch,\n hasClear: true,\n onUpdate: handleOnSearch,\n }}\n />\n </div>\n );\n};\n\nconst EmptyStory = () => {\n const [search, setSearch] = useState({value: '', fullSearch: false});\n\n return (\n <div style={{width: 300, height: 500}}>\n <TutorialsHistory\n title=\"Tutorials\"\n items={[]}\n search={{\n value: search.value,\n fullSearch: search.fullSearch,\n hasClear: true,\n onUpdate: setSearch,\n }}\n />\n </div>\n );\n};\n\nconst PaginatedStory = () => {\n const [items, setItems] = useState<QueryListItem<TutorialHistoryRow>[]>(PAGINATION_PAGES[0]);\n const [page, setPage] = useState(1);\n const [loading, setLoading] = useState(false);\n\n const handleLoadMore = () => {\n const nextPage = PAGINATION_PAGES[page];\n\n if (loading || !nextPage) {\n return;\n }\n\n action('onLoadMore')(page);\n setLoading(true);\n\n window.setTimeout(() => {\n setItems((currentItems) => [...currentItems, ...nextPage]);\n setPage((currentPage) => currentPage + 1);\n setLoading(false);\n }, 1500);\n };\n\n return (\n <div style={{width: 300, height: 300}}>\n <TutorialsHistory\n title=\"Paginated tutorials\"\n items={items}\n selectedRowId=\"basics-2\"\n loading={loading}\n hasMore={page < PAGINATION_PAGES.length}\n onLoadMore={handleLoadMore}\n renderLink={renderRouterLink}\n search={{onUpdate: action('onSearchUpdate')}}\n />\n </div>\n );\n};\n\nconst RouterLinksStory = () => {\n const [search, setSearch] = useState({value: '', fullSearch: false});\n\n return (\n <div style={{width: 500, height: 500}}>\n <TutorialsHistory\n title=\"Router links\"\n items={LINK_ITEMS}\n renderLink={renderRouterLink}\n search={{...search, hasClear: true, onUpdate: setSearch}}\n />\n </div>\n );\n};\n\nconst CustomRowRendererStory = () => (\n <div style={{width: 400, height: 300}}>\n <TutorialsHistory\n title=\"Custom tutorial rows\"\n items={CUSTOM_ROW_ITEMS}\n selectedRowId=\"01HZXB4K8P7Y2Q9T6M3N5R1C0A\"\n renderLink={renderRouterLink}\n renderRowItem={({item, renderLink}) =>\n 'header' in item ? (\n <HistoryGroupHeader title={item.header} />\n ) : (\n <RowLink href={item.href} renderLink={renderLink}>\n <Flex alignItems=\"center\" gap={2}>\n <Icon data={BookOpenIcon} size={16} />\n <Text ellipsis>{item.title}</Text>\n </Flex>\n </RowLink>\n )\n }\n search={{onUpdate: action('onSearchUpdate')}}\n />\n </div>\n);\n\nexport const Default: Story = {render: () => <DefaultStory />};\nexport const Empty: Story = {render: () => <EmptyStory />};\nexport const InitialLoading: Story = {\n args: {\n title: 'Loading tutorials',\n items: [],\n loading: true,\n search: {onUpdate: action('onSearchUpdate')},\n },\n decorators: [\n (StoryComponent) => (\n <div style={{width: 300, height: 500}}>\n <StoryComponent />\n </div>\n ),\n ],\n};\nexport const Paginated: Story = {render: () => <PaginatedStory />};\nexport const LoadingMore: Story = {\n args: {\n title: 'Loading next page',\n items: PAGINATION_PAGES[0],\n loading: true,\n hasMore: true,\n onLoadMore: action('onLoadMore'),\n search: {onUpdate: action('onSearchUpdate')},\n },\n decorators: [\n (StoryComponent) => (\n <div style={{width: 300, height: 300}}>\n <StoryComponent />\n </div>\n ),\n ],\n};\nexport const RouterLinks: Story = {render: () => <RouterLinksStory />};\nexport const CustomRowRenderer: Story = {render: () => <CustomRowRendererStory />};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -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>;
|
|
@@ -55,6 +55,7 @@ export var Breadcrumbs = function Breadcrumbs(_ref) {
|
|
|
55
55
|
var location = _ref.location,
|
|
56
56
|
hideResetButton = _ref.hideResetButton,
|
|
57
57
|
onUpdate = _ref.onUpdate,
|
|
58
|
+
getBreadcrumbHref = _ref.getBreadcrumbHref,
|
|
58
59
|
onLoadSuggestions = _ref.onLoadSuggestions,
|
|
59
60
|
className = _ref.className;
|
|
60
61
|
var _useState = useState(false),
|
|
@@ -134,13 +135,25 @@ export var Breadcrumbs = function Breadcrumbs(_ref) {
|
|
|
134
135
|
children: items.map(function (item, index) {
|
|
135
136
|
var _item$path;
|
|
136
137
|
var isLast = index === items.length - 1;
|
|
138
|
+
var itemLocation = {
|
|
139
|
+
cluster: cluster,
|
|
140
|
+
path: item.path
|
|
141
|
+
};
|
|
142
|
+
var href = getBreadcrumbHref === null || getBreadcrumbHref === void 0 ? void 0 : getBreadcrumbHref(itemLocation);
|
|
137
143
|
return /*#__PURE__*/_jsx(GravityBreadcrumbs.Item, {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
+
href: href,
|
|
145
|
+
disabled: isLast && !href,
|
|
146
|
+
onClick: function onClick(event) {
|
|
147
|
+
var isPlainLeftClick = event.button === 0 && !event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey;
|
|
148
|
+
if (href && !isPlainLeftClick) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
if (href) {
|
|
152
|
+
event.preventDefault();
|
|
153
|
+
}
|
|
154
|
+
if (!isLast) {
|
|
155
|
+
onUpdate(itemLocation);
|
|
156
|
+
}
|
|
144
157
|
},
|
|
145
158
|
children: item.title
|
|
146
159
|
}, (_item$path = item.path) !== null && _item$path !== void 0 ? _item$path : 'root');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useState","Button","Flex","Breadcrumbs","GravityBreadcrumbs","Icon","Text","FolderTreeIcon","props","_jsx","_objectSpread","children","fill","fillRule","d","clipRule","defaultProps","xmlns","width","height","viewBox","PencilIcon","cn","parsePathSegments","PathEditor","i18n","jsx","jsxs","_jsxs","block","_ref","location","hideResetButton","onUpdate","onLoadSuggestions","className","_useState","_useState2","_slicedToArray","edit","setEdit","cluster","path","ROOT_PATH","undefined","items","title","concat","_toConsumableArray","handleReset","handleCancelEdit","handleOnSubmit","nextPath","normalizedPath","endsWith","slice","grow","minWidth","defaultPath","autoFocus","onApply","onCancel","onBlur","onFocus","event","currentTarget","select","gap","alignItems","view","onClick","data","size","length","overflow","color","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","useState","Button","Flex","Breadcrumbs","GravityBreadcrumbs","Icon","Text","FolderTreeIcon","props","_jsx","_objectSpread","children","fill","fillRule","d","clipRule","defaultProps","xmlns","width","height","viewBox","PencilIcon","cn","parsePathSegments","PathEditor","i18n","jsx","jsxs","_jsxs","block","_ref","location","hideResetButton","onUpdate","getBreadcrumbHref","onLoadSuggestions","className","_useState","_useState2","_slicedToArray","edit","setEdit","cluster","path","ROOT_PATH","undefined","items","title","concat","_toConsumableArray","handleReset","handleCancelEdit","handleOnSubmit","nextPath","normalizedPath","endsWith","slice","grow","minWidth","defaultPath","autoFocus","onApply","onCancel","onBlur","onFocus","event","currentTarget","select","gap","alignItems","view","onClick","data","size","length","overflow","color","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":"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","ignoreList":[]}
|
|
@@ -287,11 +287,13 @@ export var QueryGraphCanvasBlock = /*#__PURE__*/function (_CanvasBlock) {
|
|
|
287
287
|
var cameraScale = this.context.graph.cameraService.getCameraScale();
|
|
288
288
|
var fontSize = getScaleAdjustedFontSize(LABEL_FONT_SIZE, cameraScale);
|
|
289
289
|
var labelGap = getScaleAdjustedFontSize(LABEL_GAP, cameraScale);
|
|
290
|
+
// Keep the available screen width stable, just like the label's font size.
|
|
291
|
+
var maxWidth = getScaleAdjustedFontSize(width * LABEL_MAX_WIDTH_RATIO, cameraScale);
|
|
290
292
|
context.fillStyle = cssValue('--g-color-text-primary', context.canvas);
|
|
291
293
|
context.textAlign = 'center';
|
|
292
294
|
context.textBaseline = 'top';
|
|
293
295
|
context.font = "400 ".concat(fontSize, "px ").concat(cssValue('--g-font-family-sans', context.canvas));
|
|
294
|
-
var fitted = fitCanvasText(context, label,
|
|
296
|
+
var fitted = fitCanvasText(context, label, maxWidth, trimStart);
|
|
295
297
|
context.fillText(fitted, x + width / 2, y + height + labelGap);
|
|
296
298
|
}
|
|
297
299
|
}]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["CanvasBlock","getQueryGraphProgress","fitCanvasFontSize","fitCanvasText","getQueryGraphNodeContent","getScaleAdjustedFontSize","getQueryGraphStatusIconSvg","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","_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","drawNodeShape","content","_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","graph","cameraService","getCameraScale","fontFamily","textAlign","textBaseline","font","fontSize","measureText","fillText","colorToken","_this$state5","backgroundRadius","iconX","iconY","fallbackSvg","fallbackColor","_entry","_entry2","drawImage","trimStart","_this$state6","cameraScale","labelGap","fitted"],"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":["CanvasBlock","getQueryGraphProgress","fitCanvasFontSize","fitCanvasText","getQueryGraphNodeContent","getScaleAdjustedFontSize","getQueryGraphStatusIconSvg","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","_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","drawNodeShape","content","_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","graph","cameraService","getCameraScale","fontFamily","textAlign","textBaseline","font","fontSize","measureText","fillText","colorToken","_this$state5","backgroundRadius","iconX","iconY","fallbackSvg","fallbackColor","_entry","_entry2","drawImage","trimStart","_this$state6","cameraScale","labelGap","maxWidth","fitted"],"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;
|
|
@@ -25,6 +25,8 @@ export var NavigationDetail = function NavigationDetail(_ref) {
|
|
|
25
25
|
onUpdate = _ref.onUpdate,
|
|
26
26
|
onLoadSuggestions = _ref.onLoadSuggestions,
|
|
27
27
|
actions = _ref.actions,
|
|
28
|
+
renderActions = _ref.renderActions,
|
|
29
|
+
getBreadcrumbHref = _ref.getBreadcrumbHref,
|
|
28
30
|
activeTabProp = _ref.activeTab,
|
|
29
31
|
onTabUpdate = _ref.onTabUpdate,
|
|
30
32
|
searchProp = _ref.search,
|
|
@@ -82,6 +84,8 @@ export var NavigationDetail = function NavigationDetail(_ref) {
|
|
|
82
84
|
children: [/*#__PURE__*/_jsx(NavigationHeader, {
|
|
83
85
|
location: location,
|
|
84
86
|
actions: mergedActions,
|
|
87
|
+
renderActions: renderActions,
|
|
88
|
+
getBreadcrumbHref: getBreadcrumbHref,
|
|
85
89
|
onUpdate: onUpdate,
|
|
86
90
|
onLoadSuggestions: onLoadSuggestions
|
|
87
91
|
}), hasTabs ? /*#__PURE__*/_jsxs(_Fragment, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","useMemo","useState","cn","Flex","NavigationHeader","SearchWithButtons","NavigationDetailTabs","getInitialTab","getVisibleTabs","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","block","NavigationDetail","_ref","_ref2","_activeTabConfig$rend","_activeTabConfig$rend2","config","location","onUpdate","onLoadSuggestions","actions","activeTabProp","activeTab","onTabUpdate","searchProp","search","onSearchUpdate","className","isTabControlled","undefined","isSearchControlled","visibleTabs","tabs","_useState","defaultTab","_useState2","_slicedToArray","activeTabState","setActiveTabState","_useState3","_useState4","searchState","setSearchState","handleTabUpdate","tab","handleSearchUpdate","value","mergedActions","_config$actions","concat","_toConsumableArray","activeTabConfig","find","id","activeContent","renderContent","call","searchPlaceholder","content","hasTabs","length","direction","gap","children","hasSearch","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":";;;;;;;;;AAAA,OAAOA,KAAK,IAAGC,OAAO,EAAEC,QAAQ,QAAO,OAAO;AAC9C,OAAOC,EAAE,MAAM,aAAa;AAC5B,SAAQC,IAAI,QAAO,mBAAmB;AACtC,SAAQC,gBAAgB;AACxB,SAAQC,iBAAiB;
|
|
1
|
+
{"version":3,"names":["React","useMemo","useState","cn","Flex","NavigationHeader","SearchWithButtons","NavigationDetailTabs","getInitialTab","getVisibleTabs","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","block","NavigationDetail","_ref","_ref2","_activeTabConfig$rend","_activeTabConfig$rend2","config","location","onUpdate","onLoadSuggestions","actions","renderActions","getBreadcrumbHref","activeTabProp","activeTab","onTabUpdate","searchProp","search","onSearchUpdate","className","isTabControlled","undefined","isSearchControlled","visibleTabs","tabs","_useState","defaultTab","_useState2","_slicedToArray","activeTabState","setActiveTabState","_useState3","_useState4","searchState","setSearchState","handleTabUpdate","tab","handleSearchUpdate","value","mergedActions","_config$actions","concat","_toConsumableArray","activeTabConfig","find","id","activeContent","renderContent","call","searchPlaceholder","content","hasTabs","length","direction","gap","children","hasSearch","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;
|
|
@@ -6,6 +6,8 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
6
6
|
export var NavigationHeader = function NavigationHeader(_ref) {
|
|
7
7
|
var location = _ref.location,
|
|
8
8
|
actions = _ref.actions,
|
|
9
|
+
renderActions = _ref.renderActions,
|
|
10
|
+
getBreadcrumbHref = _ref.getBreadcrumbHref,
|
|
9
11
|
onUpdate = _ref.onUpdate,
|
|
10
12
|
onLoadSuggestions = _ref.onLoadSuggestions,
|
|
11
13
|
className = _ref.className;
|
|
@@ -17,8 +19,12 @@ export var NavigationHeader = function NavigationHeader(_ref) {
|
|
|
17
19
|
children: [/*#__PURE__*/_jsx(Breadcrumbs, {
|
|
18
20
|
location: location,
|
|
19
21
|
onUpdate: onUpdate,
|
|
22
|
+
getBreadcrumbHref: getBreadcrumbHref,
|
|
20
23
|
onLoadSuggestions: onLoadSuggestions
|
|
21
|
-
}),
|
|
24
|
+
}), renderActions ? renderActions({
|
|
25
|
+
location: location,
|
|
26
|
+
actions: actions !== null && actions !== void 0 ? actions : []
|
|
27
|
+
}) : /*#__PURE__*/_jsx(NavigationActionButtons, {
|
|
22
28
|
actions: actions,
|
|
23
29
|
arg: location
|
|
24
30
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","Flex","Breadcrumbs","NavigationActionButtons","jsx","_jsx","jsxs","_jsxs","NavigationHeader","_ref","location","actions","onUpdate","onLoadSuggestions","className","gap","justifyContent","alignItems","children","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","Flex","Breadcrumbs","NavigationActionButtons","jsx","_jsx","jsxs","_jsxs","NavigationHeader","_ref","location","actions","renderActions","getBreadcrumbHref","onUpdate","onLoadSuggestions","className","gap","justifyContent","alignItems","children","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,OAAOA,KAAK,MAAY,OAAO;AAC/B,SAAQC,IAAI,QAAO,mBAAmB;AACtC,SAAQC,WAAW;AACnB,SAAQC,uBAAuB;AAAkD,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAmBjF,OAAO,IAAMC,gBAA2C,GAAG,SAA9CA,gBAA2CA,CAAAC,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,oBACIT,KAAA,CAACN,IAAI;IAACgB,GAAG,EAAE,CAAE;IAACC,cAAc,EAAC,eAAe;IAACC,UAAU,EAAC,QAAQ;IAACH,SAAS,EAAEA,SAAU;IAAAI,QAAA,gBAClFf,IAAA,CAACH,WAAW;MACRQ,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,gBAEjDN,IAAA,CAACF,uBAAuB;MAACQ,OAAO,EAAEA,OAAQ;MAACU,GAAG,EAAEX;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;
|
|
@@ -18,6 +18,7 @@ export var NavigationItemsList = function NavigationItemsList(_ref) {
|
|
|
18
18
|
var items = _ref.items,
|
|
19
19
|
path = _ref.path,
|
|
20
20
|
search = _ref.search,
|
|
21
|
+
parentRowConfig = _ref.parentRow,
|
|
21
22
|
sort = _ref.sort,
|
|
22
23
|
onSortUpdate = _ref.onSortUpdate,
|
|
23
24
|
titleLabel = _ref.titleLabel,
|
|
@@ -29,7 +30,7 @@ export var NavigationItemsList = function NavigationItemsList(_ref) {
|
|
|
29
30
|
renderRowItem = _ref.renderRowItem,
|
|
30
31
|
_onItemClick = _ref.onItemClick,
|
|
31
32
|
className = _ref.className;
|
|
32
|
-
var parentRow = useParentRow(path, search);
|
|
33
|
+
var parentRow = useParentRow(path, search, parentRowConfig === null || parentRowConfig === void 0 ? void 0 : parentRowConfig.showDuringSearch);
|
|
33
34
|
var rows = parentRow ? [parentRow].concat(_toConsumableArray(items)) : items;
|
|
34
35
|
return /*#__PURE__*/_jsxs("div", {
|
|
35
36
|
className: block(null, className),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","cn","LazyList","NavigationItemRow","NavigationItemsListHeader","NavigationItemsListEmptyState","useParentRow","NAVIGATION_ROW_HEIGHT","jsx","_jsx","jsxs","_jsxs","block","NavigationItemsList","_ref","items","path","search","sort","onSortUpdate","titleLabel","loading","error","hasMore","onLoadMore","emptyContent","renderRowItem","onItemClick","className","
|
|
1
|
+
{"version":3,"names":["React","cn","LazyList","NavigationItemRow","NavigationItemsListHeader","NavigationItemsListEmptyState","useParentRow","NAVIGATION_ROW_HEIGHT","jsx","_jsx","jsxs","_jsxs","block","NavigationItemsList","_ref","items","path","search","parentRowConfig","parentRow","sort","onSortUpdate","titleLabel","loading","error","hasMore","onLoadMore","emptyContent","renderRowItem","onItemClick","className","showDuringSearch","rows","concat","_toConsumableArray","children","isEmpty","length","itemHeight","renderItem","item","isActive","index","_renderRowItem","isParentRow","Boolean","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;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { useMemo } from 'react';
|
|
2
2
|
import { getParentPath } from "../../../helpers/getParentPath";
|
|
3
3
|
export function useParentRow(path, search) {
|
|
4
|
-
var
|
|
4
|
+
var showDuringSearch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
5
|
+
var parentPath = path && path !== '/' && (!search || showDuringSearch) ? getParentPath(path) : undefined;
|
|
5
6
|
return useMemo(function () {
|
|
6
7
|
if (!parentPath) {
|
|
7
8
|
return undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useMemo","getParentPath","useParentRow","path","search","
|
|
1
|
+
{"version":3,"names":["useMemo","getParentPath","useParentRow","path","search","showDuringSearch","arguments","length","undefined","parentPath","title","kind","hasChildren"],"sources":["useParentRow.ts"],"sourcesContent":["import {useMemo} from 'react';\nimport {NavigationItem} from '../../../types/navigation';\nimport {getParentPath} from '../../../helpers/getParentPath';\n\nexport function useParentRow(\n path: string | undefined,\n search: string | undefined,\n showDuringSearch = false,\n): NavigationItem | undefined {\n const parentPath =\n path && path !== '/' && (!search || showDuringSearch) ? getParentPath(path) : undefined;\n\n return useMemo<NavigationItem | undefined>(() => {\n if (!parentPath) {\n return undefined;\n }\n\n return {\n path: parentPath,\n title: '\\u2026',\n kind: 'folder',\n hasChildren: true,\n };\n }, [parentPath]);\n}\n"],"mappings":"AAAA,SAAQA,OAAO,QAAO,OAAO;AAE7B,SAAQC,aAAa;AAErB,OAAO,SAASC,YAAYA,CACxBC,IAAwB,EACxBC,MAA0B,EAEA;EAAA,IAD1BC,gBAAgB,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,KAAK;EAExB,IAAMG,UAAU,GACZN,IAAI,IAAIA,IAAI,KAAK,GAAG,KAAK,CAACC,MAAM,IAAIC,gBAAgB,CAAC,GAAGJ,aAAa,CAACE,IAAI,CAAC,GAAGK,SAAS;EAE3F,OAAOR,OAAO,CAA6B,YAAM;IAC7C,IAAI,CAACS,UAAU,EAAE;MACb,OAAOD,SAAS;IACpB;IAEA,OAAO;MACHL,IAAI,EAAEM,UAAU;MAChBC,KAAK,EAAE,QAAQ;MACfC,IAAI,EAAE,QAAQ;MACdC,WAAW,EAAE;IACjB,CAAC;EACL,CAAC,EAAE,CAACH,UAAU,CAAC,CAAC;AACpB","ignoreList":[]}
|