@gravity-ui/querieskit 1.6.0 → 1.7.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.
Files changed (36) hide show
  1. package/README.md +34 -3
  2. package/build/cjs/components/QueryGraph/internal/QueryGraphCanvasBlock.js +3 -1
  3. package/build/cjs/components/QueryGraph/internal/QueryGraphCanvasBlock.js.map +1 -1
  4. package/build/cjs/modules/TutorialRow/TutorialRow.d.ts +3 -1
  5. package/build/cjs/modules/TutorialRow/TutorialRow.js +3 -1
  6. package/build/cjs/modules/TutorialRow/TutorialRow.js.map +1 -1
  7. package/build/cjs/modules/TutorialSearchRow/TutorialSearchRow.d.ts +3 -1
  8. package/build/cjs/modules/TutorialSearchRow/TutorialSearchRow.js +3 -1
  9. package/build/cjs/modules/TutorialSearchRow/TutorialSearchRow.js.map +1 -1
  10. package/build/cjs/widgets/TutorialsHistory/TutorialRowContent.d.ts +1 -1
  11. package/build/cjs/widgets/TutorialsHistory/TutorialRowContent.js +6 -3
  12. package/build/cjs/widgets/TutorialsHistory/TutorialRowContent.js.map +1 -1
  13. package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.d.ts +7 -2
  14. package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.js +13 -3
  15. package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.js.map +1 -1
  16. package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.stories.d.ts +5 -0
  17. package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.stories.js +244 -1
  18. package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.stories.js.map +1 -1
  19. package/build/esm/components/QueryGraph/internal/QueryGraphCanvasBlock.js +3 -1
  20. package/build/esm/components/QueryGraph/internal/QueryGraphCanvasBlock.js.map +1 -1
  21. package/build/esm/modules/TutorialRow/TutorialRow.d.ts +3 -1
  22. package/build/esm/modules/TutorialRow/TutorialRow.js +3 -1
  23. package/build/esm/modules/TutorialRow/TutorialRow.js.map +1 -1
  24. package/build/esm/modules/TutorialSearchRow/TutorialSearchRow.d.ts +3 -1
  25. package/build/esm/modules/TutorialSearchRow/TutorialSearchRow.js +3 -1
  26. package/build/esm/modules/TutorialSearchRow/TutorialSearchRow.js.map +1 -1
  27. package/build/esm/widgets/TutorialsHistory/TutorialRowContent.d.ts +1 -1
  28. package/build/esm/widgets/TutorialsHistory/TutorialRowContent.js +6 -3
  29. package/build/esm/widgets/TutorialsHistory/TutorialRowContent.js.map +1 -1
  30. package/build/esm/widgets/TutorialsHistory/TutorialsHistory.d.ts +7 -2
  31. package/build/esm/widgets/TutorialsHistory/TutorialsHistory.js +13 -3
  32. package/build/esm/widgets/TutorialsHistory/TutorialsHistory.js.map +1 -1
  33. package/build/esm/widgets/TutorialsHistory/TutorialsHistory.stories.d.ts +5 -0
  34. package/build/esm/widgets/TutorialsHistory/TutorialsHistory.stories.js +244 -1
  35. package/build/esm/widgets/TutorialsHistory/TutorialsHistory.stories.js.map +1 -1
  36. package/package.json +1 -1
@@ -3,19 +3,46 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = exports.Empty = exports.Default = void 0;
6
+ exports.default = exports.RouterLinks = exports.Paginated = exports.LoadingMore = exports.InitialLoading = exports.Empty = exports.Default = exports.CustomRowRenderer = void 0;
7
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
7
8
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
9
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
10
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
8
11
  require("core-js/modules/es.array.concat.js");
9
12
  require("core-js/modules/es.array.filter.js");
13
+ require("core-js/modules/es.array.from.js");
10
14
  require("core-js/modules/es.array.includes.js");
15
+ require("core-js/modules/es.array.map.js");
11
16
  require("core-js/modules/es.object.to-string.js");
12
17
  require("core-js/modules/es.string.includes.js");
18
+ require("core-js/modules/es.string.iterator.js");
19
+ require("core-js/modules/web.timers.js");
13
20
  var _react = _interopRequireWildcard(require("react"));
21
+ var _uikit = require("@gravity-ui/uikit");
22
+ var _components = require("../../components");
14
23
  var _TutorialsHistory = require("./TutorialsHistory");
15
24
  var _actions = require("storybook/actions");
16
25
  var _jsxRuntime = require("react/jsx-runtime");
17
26
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
18
27
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
28
+ var _excluded = ["onClick"];
29
+ var BookOpenIcon = function BookOpenIcon(props) {
30
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
31
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("path", {
32
+ fill: "currentColor",
33
+ fillRule: "evenodd",
34
+ d: "M7.345 2.634q.136.069.268.145L8 3l.387-.221q.133-.076.268-.145a6.7 6.7 0 0 1 6.052-.03c.486.242.793.74.793 1.283v8.938c0 .65-.526 1.175-1.175 1.175h-.04c-.187 0-.37-.05-.529-.146a4.8 4.8 0 0 0-4.61-.177l-.199.1A2.1 2.1 0 0 1 8 14h-.117a1.6 1.6 0 0 1-.726-.171l-.233-.117a4.94 4.94 0 0 0-4.748.183.74.74 0 0 1-.381.105h-.12A1.175 1.175 0 0 1 .5 12.825V3.887c0-.543.307-1.04.793-1.284a6.7 6.7 0 0 1 6.052.03m1.405 9.572V4.3l.382-.218A5.2 5.2 0 0 1 14 3.927v8.357a6.3 6.3 0 0 0-5.25-.078m-1.5.005V4.299l-.382-.218A5.2 5.2 0 0 0 2 3.927v8.365a6.44 6.44 0 0 1 5.25-.082",
35
+ clipRule: "evenodd"
36
+ })
37
+ }));
38
+ };
39
+ BookOpenIcon.defaultProps = {
40
+ xmlns: "http://www.w3.org/2000/svg",
41
+ width: "16",
42
+ height: "16",
43
+ fill: "none",
44
+ viewBox: "0 0 16 16"
45
+ };
19
46
  var 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";
20
47
  var filterFields = [{
21
48
  id: 'onlyMine',
@@ -57,6 +84,56 @@ var BASE_ITEMS = [{
57
84
  query: QUERY,
58
85
  height: 28
59
86
  }];
87
+ var LINK_ITEMS = BASE_ITEMS.map(function (item) {
88
+ return 'id' in item ? (0, _objectSpread2.default)((0, _objectSpread2.default)({}, item), {}, {
89
+ href: "/tutorials/".concat(item.id)
90
+ }) : item;
91
+ });
92
+ var PAGINATION_PAGES = [Array.from({
93
+ length: 8
94
+ }, function (_, index) {
95
+ return {
96
+ id: "basics-".concat(index + 1),
97
+ title: "YQL basics: lesson ".concat(index + 1),
98
+ query: QUERY,
99
+ href: "/tutorials/basics-".concat(index + 1),
100
+ height: 28
101
+ };
102
+ }), Array.from({
103
+ length: 8
104
+ }, function (_, index) {
105
+ return {
106
+ id: "advanced-".concat(index + 1),
107
+ title: "Advanced YQL: lesson ".concat(index + 1),
108
+ query: QUERY,
109
+ href: "/tutorials/advanced-".concat(index + 1),
110
+ height: 28
111
+ };
112
+ })];
113
+ var CUSTOM_ROW_ITEMS = [{
114
+ header: 'Getting started',
115
+ height: 28
116
+ }, {
117
+ id: '01HZXB4K8P7Y2Q9T6M3N5R1C0A',
118
+ title: 'Getting started with YQL',
119
+ href: '/tutorials/getting-started',
120
+ height: 32
121
+ }];
122
+ var renderRouterLink = function renderRouterLink(_ref) {
123
+ var _onClick = _ref.onClick,
124
+ props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
125
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("a", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, props), {}, {
126
+ "data-router-link": true,
127
+ onClick: function onClick(event) {
128
+ _onClick === null || _onClick === void 0 || _onClick(event);
129
+ if (event.defaultPrevented || event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) {
130
+ return;
131
+ }
132
+ event.preventDefault();
133
+ (0, _actions.action)('routerNavigate')(props.href);
134
+ }
135
+ }));
136
+ };
60
137
  var meta = {
61
138
  title: 'Widgets/TutorialsHistory',
62
139
  component: _TutorialsHistory.TutorialsHistory,
@@ -144,6 +221,117 @@ var EmptyStory = function EmptyStory() {
144
221
  })
145
222
  });
146
223
  };
224
+ var PaginatedStory = function PaginatedStory() {
225
+ var _useState7 = (0, _react.useState)(PAGINATION_PAGES[0]),
226
+ _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
227
+ items = _useState8[0],
228
+ setItems = _useState8[1];
229
+ var _useState9 = (0, _react.useState)(1),
230
+ _useState0 = (0, _slicedToArray2.default)(_useState9, 2),
231
+ page = _useState0[0],
232
+ setPage = _useState0[1];
233
+ var _useState1 = (0, _react.useState)(false),
234
+ _useState10 = (0, _slicedToArray2.default)(_useState1, 2),
235
+ loading = _useState10[0],
236
+ setLoading = _useState10[1];
237
+ var handleLoadMore = function handleLoadMore() {
238
+ var nextPage = PAGINATION_PAGES[page];
239
+ if (loading || !nextPage) {
240
+ return;
241
+ }
242
+ (0, _actions.action)('onLoadMore')(page);
243
+ setLoading(true);
244
+ window.setTimeout(function () {
245
+ setItems(function (currentItems) {
246
+ return [].concat((0, _toConsumableArray2.default)(currentItems), (0, _toConsumableArray2.default)(nextPage));
247
+ });
248
+ setPage(function (currentPage) {
249
+ return currentPage + 1;
250
+ });
251
+ setLoading(false);
252
+ }, 1500);
253
+ };
254
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
255
+ style: {
256
+ width: 300,
257
+ height: 300
258
+ },
259
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_TutorialsHistory.TutorialsHistory, {
260
+ title: "Paginated tutorials",
261
+ items: items,
262
+ selectedRowId: "basics-2",
263
+ loading: loading,
264
+ hasMore: page < PAGINATION_PAGES.length,
265
+ onLoadMore: handleLoadMore,
266
+ renderLink: renderRouterLink,
267
+ search: {
268
+ onUpdate: (0, _actions.action)('onSearchUpdate')
269
+ }
270
+ })
271
+ });
272
+ };
273
+ var RouterLinksStory = function RouterLinksStory() {
274
+ var _useState11 = (0, _react.useState)({
275
+ value: '',
276
+ fullSearch: false
277
+ }),
278
+ _useState12 = (0, _slicedToArray2.default)(_useState11, 2),
279
+ search = _useState12[0],
280
+ setSearch = _useState12[1];
281
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
282
+ style: {
283
+ width: 500,
284
+ height: 500
285
+ },
286
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_TutorialsHistory.TutorialsHistory, {
287
+ title: "Router links",
288
+ items: LINK_ITEMS,
289
+ renderLink: renderRouterLink,
290
+ search: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, search), {}, {
291
+ hasClear: true,
292
+ onUpdate: setSearch
293
+ })
294
+ })
295
+ });
296
+ };
297
+ var CustomRowRendererStory = function CustomRowRendererStory() {
298
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
299
+ style: {
300
+ width: 400,
301
+ height: 300
302
+ },
303
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_TutorialsHistory.TutorialsHistory, {
304
+ title: "Custom tutorial rows",
305
+ items: CUSTOM_ROW_ITEMS,
306
+ selectedRowId: "01HZXB4K8P7Y2Q9T6M3N5R1C0A",
307
+ renderLink: renderRouterLink,
308
+ renderRowItem: function renderRowItem(_ref2) {
309
+ var item = _ref2.item,
310
+ renderLink = _ref2.renderLink;
311
+ return 'header' in item ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.HistoryGroupHeader, {
312
+ title: item.header
313
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.RowLink, {
314
+ href: item.href,
315
+ renderLink: renderLink,
316
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_uikit.Flex, {
317
+ alignItems: "center",
318
+ gap: 2,
319
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_uikit.Icon, {
320
+ data: BookOpenIcon,
321
+ size: 16
322
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_uikit.Text, {
323
+ ellipsis: true,
324
+ children: item.title
325
+ })]
326
+ })
327
+ });
328
+ },
329
+ search: {
330
+ onUpdate: (0, _actions.action)('onSearchUpdate')
331
+ }
332
+ })
333
+ });
334
+ };
147
335
  var Default = exports.Default = {
148
336
  render: function render() {
149
337
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(DefaultStory, {});
@@ -154,4 +342,59 @@ var Empty = exports.Empty = {
154
342
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(EmptyStory, {});
155
343
  }
156
344
  };
345
+ var InitialLoading = exports.InitialLoading = {
346
+ args: {
347
+ title: 'Loading tutorials',
348
+ items: [],
349
+ loading: true,
350
+ search: {
351
+ onUpdate: (0, _actions.action)('onSearchUpdate')
352
+ }
353
+ },
354
+ decorators: [function (StoryComponent) {
355
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
356
+ style: {
357
+ width: 300,
358
+ height: 500
359
+ },
360
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(StoryComponent, {})
361
+ });
362
+ }]
363
+ };
364
+ var Paginated = exports.Paginated = {
365
+ render: function render() {
366
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(PaginatedStory, {});
367
+ }
368
+ };
369
+ var LoadingMore = exports.LoadingMore = {
370
+ args: {
371
+ title: 'Loading next page',
372
+ items: PAGINATION_PAGES[0],
373
+ loading: true,
374
+ hasMore: true,
375
+ onLoadMore: (0, _actions.action)('onLoadMore'),
376
+ search: {
377
+ onUpdate: (0, _actions.action)('onSearchUpdate')
378
+ }
379
+ },
380
+ decorators: [function (StoryComponent) {
381
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
382
+ style: {
383
+ width: 300,
384
+ height: 300
385
+ },
386
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(StoryComponent, {})
387
+ });
388
+ }]
389
+ };
390
+ var RouterLinks = exports.RouterLinks = {
391
+ render: function render() {
392
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(RouterLinksStory, {});
393
+ }
394
+ };
395
+ var CustomRowRenderer = exports.CustomRowRenderer = {
396
+ render: function render() {
397
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(CustomRowRendererStory, {});
398
+ }
399
+ };
157
400
  // #sourceMappingURL=TutorialsHistory.stories.js.map
@@ -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":";;;;;;;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AAEA,IAAAE,WAAA,GAAAF,OAAA;AACA,IAAAG,iBAAA,GAAAH,OAAA;AAOA,IAAAI,QAAA,GAAAJ,OAAA;AAAyC,IAAAK,WAAA,GAAAL,OAAA;AAAA,SAAAD,wBAAAO,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAT,uBAAA,YAAAA,CAAAO,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,SAAAkB,uBAAAnB,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAK,UAAA,GAAAL,CAAA,KAAAU,OAAA,EAAAV,CAAA;;AAVU,IAC5CoB,YAAY,YAAZA,YAAYA,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;AAAZR,YAAY,CAAAS,YAAA;EAAAC,KAAA;EAAAC,KAAA;EAAAC,MAAA;EAAAP,IAAA;EAAAQ,OAAA;AAAA;AAWnB,IAAMC,KAAK,6IAKmC;AAE9C,IAAMC,YAA6C,GAAG,CAClD;EAACC,EAAE,EAAE,UAAU;EAAEC,IAAI,EAAE,QAAQ;EAAEC,KAAK,EAAE,iBAAiB;EAAEC,YAAY,EAAE;AAAI,CAAC,EAC9E;EAACH,EAAE,EAAE,OAAO;EAAEC,IAAI,EAAE,iBAAiB;EAAEC,KAAK,EAAE;AAAQ,CAAC,EACvD;EACIF,EAAE,EAAE,SAAS;EACbC,IAAI,EAAE,eAAe;EACrBC,KAAK,EAAE,SAAS;EAChBC,YAAY,EAAE,EAAE;EAChBC,KAAK,EAAE,CACH;IAACJ,EAAE,EAAE,KAAK;IAAEE,KAAK,EAAE;EAAK,CAAC,EACzB;IAACF,EAAE,EAAE,KAAK;IAAEE,KAAK,EAAE;EAAK,CAAC;AAEjC,CAAC,CACJ;AAED,IAAMG,cAAc,GAAG,IAAAC,eAAM,EAAC,eAAe,CAAC;AAC9C,IAAMC,cAAc,GAAG,IAAAD,eAAM,EAAC,eAAe,CAAC;AAE9C,IAAME,UAA+C,GAAG,CACpD;EACIR,EAAE,EAAE,CAAC;EACLE,KAAK,EAAE,0BAA0B;EACjCO,KAAK,EAAEX,KAAK;EACZF,MAAM,EAAE;AACZ,CAAC,EACD;EACII,EAAE,EAAE,CAAC;EACLE,KAAK,EAAE,qBAAqB;EAC5BO,KAAK,EAAEX,KAAK;EACZF,MAAM,EAAE;AACZ,CAAC,EACD;EACII,EAAE,EAAE,CAAC;EACLE,KAAK,EAAE,kBAAkB;EACzBO,KAAK,EAAEX,KAAK;EACZF,MAAM,EAAE;AACZ,CAAC,CACJ;AAED,IAAMc,UAAU,GAAGF,UAAU,CAACG,GAAG,CAAC,UAACC,IAAI;EAAA,OACnC,IAAI,IAAIA,IAAI,OAAAzB,sBAAA,MAAAA,sBAAA,MAAOyB,IAAI;IAAEC,IAAI,gBAAAC,MAAA,CAAgBF,IAAI,CAACZ,EAAE;EAAE,KAAIY,IAAI;AAAA,CAClE,CAAC;AAED,IAAMG,gBAAuD,GAAG,CAC5DC,KAAK,CAACC,IAAI,CAAC;EAACC,MAAM,EAAE;AAAC,CAAC,EAAE,UAACC,CAAC,EAAEC,KAAK;EAAA,OAAM;IACnCpB,EAAE,YAAAc,MAAA,CAAYM,KAAK,GAAG,CAAC,CAAE;IACzBlB,KAAK,wBAAAY,MAAA,CAAwBM,KAAK,GAAG,CAAC,CAAE;IACxCX,KAAK,EAAEX,KAAK;IACZe,IAAI,uBAAAC,MAAA,CAAuBM,KAAK,GAAG,CAAC,CAAE;IACtCxB,MAAM,EAAE;EACZ,CAAC;AAAA,CAAC,CAAC,EACHoB,KAAK,CAACC,IAAI,CAAC;EAACC,MAAM,EAAE;AAAC,CAAC,EAAE,UAACC,CAAC,EAAEC,KAAK;EAAA,OAAM;IACnCpB,EAAE,cAAAc,MAAA,CAAcM,KAAK,GAAG,CAAC,CAAE;IAC3BlB,KAAK,0BAAAY,MAAA,CAA0BM,KAAK,GAAG,CAAC,CAAE;IAC1CX,KAAK,EAAEX,KAAK;IACZe,IAAI,yBAAAC,MAAA,CAAyBM,KAAK,GAAG,CAAC,CAAE;IACxCxB,MAAM,EAAE;EACZ,CAAC;AAAA,CAAC,CAAC,CACN;AAED,IAAMyB,gBAAqD,GAAG,CAC1D;EAACC,MAAM,EAAE,iBAAiB;EAAE1B,MAAM,EAAE;AAAE,CAAC,EACvC;EACII,EAAE,EAAE,4BAA4B;EAChCE,KAAK,EAAE,0BAA0B;EACjCW,IAAI,EAAE,4BAA4B;EAClCjB,MAAM,EAAE;AACZ,CAAC,CACJ;AAED,IAAM2B,gBAAuC,GAAG,SAA1CA,gBAAuCA,CAAAC,IAAA;EAAA,IAAKC,QAAO,GAAAD,IAAA,CAAPE,OAAO;IAAKzC,KAAK,OAAA0C,iCAAA,EAAAH,IAAA,EAAAI,SAAA;EAAA,oBAC/D,IAAA1C,eAAA,WAAAC,sBAAA,MAAAA,sBAAA,MACQF,KAAK;IACT,wBAAgB;IAChByC,OAAO,EAAE,SAATA,OAAOA,CAAGG,KAAK,EAAK;MAChBJ,QAAO,aAAPA,QAAO,eAAPA,QAAO,CAAGI,KAAK,CAAC;MAEhB,IACIA,KAAK,CAACC,gBAAgB,IACtBD,KAAK,CAACE,MAAM,KAAK,CAAC,IAClBF,KAAK,CAACG,OAAO,IACbH,KAAK,CAACI,OAAO,IACbJ,KAAK,CAACK,QAAQ,IACdL,KAAK,CAACM,MAAM,EACd;QACE;MACJ;MAEAN,KAAK,CAACO,cAAc,CAAC,CAAC;MACtB,IAAA9B,eAAM,EAAC,gBAAgB,CAAC,CAACrB,KAAK,CAAC4B,IAAI,CAAC;IACxC;EAAE,EACL,CAAC;AAAA,CACL;AAED,IAAMwB,IAAmC,GAAG;EACxCnC,KAAK,EAAE,0BAA0B;EACjCoC,SAAS,EAAEC,kCAAgB;EAC3BC,IAAI,EAAE,CAAC,UAAU,CAAC;EAClBC,UAAU,EAAE;IACRC,MAAM,EAAE;EACZ;AACJ,CAAC;AAAA,IAAAC,QAAA,GAAAC,OAAA,CAAAtE,OAAA,GAEc+D,IAAI;AAGnB,IAAMQ,YAAY,GAAG,SAAfA,YAAYA,CAAA,EAAS;EACvB,IAAAC,SAAA,GAA0B,IAAAC,eAAQ,KAAAjC,MAAA,CAAKN,UAAU,CAAC,CAAC;IAAAwC,UAAA,OAAAC,uBAAA,EAAAH,SAAA;IAA5C1C,KAAK,GAAA4C,UAAA;IAAEE,QAAQ,GAAAF,UAAA;EACtB,IAAAG,UAAA,GAA4B,IAAAJ,eAAQ,EAAC;MAACK,KAAK,EAAE,EAAE;MAAEC,UAAU,EAAE;IAAK,CAAC,CAAC;IAAAC,UAAA,OAAAL,uBAAA,EAAAE,UAAA;IAA7DI,MAAM,GAAAD,UAAA;IAAEE,SAAS,GAAAF,UAAA;EAExB,IAAMG,cAAc,GAAG,SAAjBA,cAAcA,CAAIC,IAA0C,EAAK;IACnEF,SAAS,CAACE,IAAI,CAAC;IAEf,IAAI,CAACA,IAAI,CAACN,KAAK,EAAE;MACbF,QAAQ,CAAC1C,UAAU,CAAC;MACpB;IACJ;IAEA,IAAMmD,QAAQ,GAAGnD,UAAU,CAACoD,MAAM,CAAC,UAAChD,IAAI,EAAK;MAAA,IAAAiD,WAAA;MACzC,IAAI,EAAE,IAAI,IAAIjD,IAAI,CAAC,EAAE,OAAO,KAAK;MAEjC,IAAMV,KAAK,GAAGU,IAAI,CAACV,KAAK,CAAC4D,WAAW,CAAC,CAAC;MACtC,IAAMrD,KAAK,IAAAoD,WAAA,GAAGjD,IAAI,CAACH,KAAK,cAAAoD,WAAA,uBAAVA,WAAA,CAAYC,WAAW,CAAC,CAAC;MACvC,IAAMC,WAAW,GAAGL,IAAI,CAACN,KAAK,CAACU,WAAW,CAAC,CAAC;MAE5C,IAAIJ,IAAI,CAACL,UAAU,EAAE;QACjB,OAAOnD,KAAK,CAAC8D,QAAQ,CAACD,WAAW,CAAC,KAAItD,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEuD,QAAQ,CAACD,WAAW,CAAC;MACtE;MAEA,OAAO7D,KAAK,CAAC8D,QAAQ,CAACD,WAAW,CAAC;IACtC,CAAC,CAAC;IACFb,QAAQ,CAACS,QAAQ,CAAC;EACtB,CAAC;EAED,oBACI,IAAAzE,eAAA;IAAK+E,KAAK,EAAE;MAACtE,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAG,CAAE;IAAAR,QAAA,eAClC,IAAAF,eAAA,EAACqD,kCAAgB;MACbrC,KAAK,EAAC,WAAW;MACjBE,KAAK,EAAEA,KAAM;MACbwD,MAAM,EAAE;QACJM,MAAM,EAAEnE,YAAY;QACpBoE,OAAO,EAAE9D,cAAc;QACvB+D,OAAO,EAAE7D,cAAc,CAAC,OAAO;MACnC,CAAE;MACFgD,MAAM,EAAE;QACJH,KAAK,EAAEG,MAAM,CAACH,KAAK;QACnBC,UAAU,EAAEE,MAAM,CAACF,UAAU;QAC7BgB,QAAQ,EAAE,IAAI;QACdC,QAAQ,EAAEb;MACd;IAAE,CACL;EAAC,CACD,CAAC;AAEd,CAAC;AAED,IAAMc,UAAU,GAAG,SAAbA,UAAUA,CAAA,EAAS;EACrB,IAAAC,UAAA,GAA4B,IAAAzB,eAAQ,EAAC;MAACK,KAAK,EAAE,EAAE;MAAEC,UAAU,EAAE;IAAK,CAAC,CAAC;IAAAoB,UAAA,OAAAxB,uBAAA,EAAAuB,UAAA;IAA7DjB,MAAM,GAAAkB,UAAA;IAAEjB,SAAS,GAAAiB,UAAA;EAExB,oBACI,IAAAvF,eAAA;IAAK+E,KAAK,EAAE;MAACtE,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAG,CAAE;IAAAR,QAAA,eAClC,IAAAF,eAAA,EAACqD,kCAAgB;MACbrC,KAAK,EAAC,WAAW;MACjBE,KAAK,EAAE,EAAG;MACVmD,MAAM,EAAE;QACJH,KAAK,EAAEG,MAAM,CAACH,KAAK;QACnBC,UAAU,EAAEE,MAAM,CAACF,UAAU;QAC7BgB,QAAQ,EAAE,IAAI;QACdC,QAAQ,EAAEd;MACd;IAAE,CACL;EAAC,CACD,CAAC;AAEd,CAAC;AAED,IAAMkB,cAAc,GAAG,SAAjBA,cAAcA,CAAA,EAAS;EACzB,IAAAC,UAAA,GAA0B,IAAA5B,eAAQ,EAAsChC,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAAA6D,UAAA,OAAA3B,uBAAA,EAAA0B,UAAA;IAArFvE,KAAK,GAAAwE,UAAA;IAAE1B,QAAQ,GAAA0B,UAAA;EACtB,IAAAC,UAAA,GAAwB,IAAA9B,eAAQ,EAAC,CAAC,CAAC;IAAA+B,UAAA,OAAA7B,uBAAA,EAAA4B,UAAA;IAA5BE,IAAI,GAAAD,UAAA;IAAEE,OAAO,GAAAF,UAAA;EACpB,IAAAG,UAAA,GAA8B,IAAAlC,eAAQ,EAAC,KAAK,CAAC;IAAAmC,WAAA,OAAAjC,uBAAA,EAAAgC,UAAA;IAAtCE,OAAO,GAAAD,WAAA;IAAEE,UAAU,GAAAF,WAAA;EAE1B,IAAMG,cAAc,GAAG,SAAjBA,cAAcA,CAAA,EAAS;IACzB,IAAMC,QAAQ,GAAGvE,gBAAgB,CAACgE,IAAI,CAAC;IAEvC,IAAII,OAAO,IAAI,CAACG,QAAQ,EAAE;MACtB;IACJ;IAEA,IAAAhF,eAAM,EAAC,YAAY,CAAC,CAACyE,IAAI,CAAC;IAC1BK,UAAU,CAAC,IAAI,CAAC;IAEhBG,MAAM,CAACC,UAAU,CAAC,YAAM;MACpBtC,QAAQ,CAAC,UAACuC,YAAY;QAAA,UAAA3E,MAAA,KAAA4E,2BAAA,EAASD,YAAY,OAAAC,2BAAA,EAAKJ,QAAQ;MAAA,CAAC,CAAC;MAC1DN,OAAO,CAAC,UAACW,WAAW;QAAA,OAAKA,WAAW,GAAG,CAAC;MAAA,EAAC;MACzCP,UAAU,CAAC,KAAK,CAAC;IACrB,CAAC,EAAE,IAAI,CAAC;EACZ,CAAC;EAED,oBACI,IAAAlG,eAAA;IAAK+E,KAAK,EAAE;MAACtE,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAG,CAAE;IAAAR,QAAA,eAClC,IAAAF,eAAA,EAACqD,kCAAgB;MACbrC,KAAK,EAAC,qBAAqB;MAC3BE,KAAK,EAAEA,KAAM;MACbwF,aAAa,EAAC,UAAU;MACxBT,OAAO,EAAEA,OAAQ;MACjBU,OAAO,EAAEd,IAAI,GAAGhE,gBAAgB,CAACG,MAAO;MACxC4E,UAAU,EAAET,cAAe;MAC3BU,UAAU,EAAExE,gBAAiB;MAC7BgC,MAAM,EAAE;QAACe,QAAQ,EAAE,IAAAhE,eAAM,EAAC,gBAAgB;MAAC;IAAE,CAChD;EAAC,CACD,CAAC;AAEd,CAAC;AAED,IAAM0F,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAA,EAAS;EAC3B,IAAAC,WAAA,GAA4B,IAAAlD,eAAQ,EAAC;MAACK,KAAK,EAAE,EAAE;MAAEC,UAAU,EAAE;IAAK,CAAC,CAAC;IAAA6C,WAAA,OAAAjD,uBAAA,EAAAgD,WAAA;IAA7D1C,MAAM,GAAA2C,WAAA;IAAE1C,SAAS,GAAA0C,WAAA;EAExB,oBACI,IAAAhH,eAAA;IAAK+E,KAAK,EAAE;MAACtE,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAG,CAAE;IAAAR,QAAA,eAClC,IAAAF,eAAA,EAACqD,kCAAgB;MACbrC,KAAK,EAAC,cAAc;MACpBE,KAAK,EAAEM,UAAW;MAClBqF,UAAU,EAAExE,gBAAiB;MAC7BgC,MAAM,MAAApE,sBAAA,MAAAA,sBAAA,MAAMoE,MAAM;QAAEc,QAAQ,EAAE,IAAI;QAAEC,QAAQ,EAAEd;MAAS;IAAE,CAC5D;EAAC,CACD,CAAC;AAEd,CAAC;AAED,IAAM2C,sBAAsB,GAAG,SAAzBA,sBAAsBA,CAAA;EAAA,oBACxB,IAAAjH,eAAA;IAAK+E,KAAK,EAAE;MAACtE,KAAK,EAAE,GAAG;MAAEC,MAAM,EAAE;IAAG,CAAE;IAAAR,QAAA,eAClC,IAAAF,eAAA,EAACqD,kCAAgB;MACbrC,KAAK,EAAC,sBAAsB;MAC5BE,KAAK,EAAEiB,gBAAiB;MACxBuE,aAAa,EAAC,4BAA4B;MAC1CG,UAAU,EAAExE,gBAAiB;MAC7B6E,aAAa,EAAE,SAAfA,aAAaA,CAAAC,KAAA;QAAA,IAAIzF,IAAI,GAAAyF,KAAA,CAAJzF,IAAI;UAAEmF,UAAU,GAAAM,KAAA,CAAVN,UAAU;QAAA,OAC7B,QAAQ,IAAInF,IAAI,gBACZ,IAAA1B,eAAA,EAACoH,8BAAkB;UAACpG,KAAK,EAAEU,IAAI,CAACU;QAAO,CAAE,CAAC,gBAE1C,IAAApC,eAAA,EAACqH,mBAAO;UAAC1F,IAAI,EAAED,IAAI,CAACC,IAAK;UAACkF,UAAU,EAAEA,UAAW;UAAA3G,QAAA,eAC7C,IAAAoH,gBAAA,EAACC,WAAI;YAACC,UAAU,EAAC,QAAQ;YAACC,GAAG,EAAE,CAAE;YAAAvH,QAAA,gBAC7B,IAAAF,eAAA,EAAC0H,WAAI;cAAClD,IAAI,EAAE1E,YAAa;cAAC6H,IAAI,EAAE;YAAG,CAAE,CAAC,eACtC,IAAA3H,eAAA,EAAC4H,WAAI;cAACC,QAAQ;cAAA3H,QAAA,EAAEwB,IAAI,CAACV;YAAK,CAAO,CAAC;UAAA,CAChC;QAAC,CACF,CACZ;MAAA,CACJ;MACDqD,MAAM,EAAE;QAACe,QAAQ,EAAE,IAAAhE,eAAM,EAAC,gBAAgB;MAAC;IAAE,CAChD;EAAC,CACD,CAAC;AAAA,CACT;AAEM,IAAM0G,OAAc,GAAApE,OAAA,CAAAoE,OAAA,GAAG;EAACC,MAAM,EAAE,SAARA,MAAMA,CAAA;IAAA,oBAAQ,IAAA/H,eAAA,EAAC2D,YAAY,IAAE,CAAC;EAAA;AAAA,CAAC;AACvD,IAAMqE,KAAY,GAAAtE,OAAA,CAAAsE,KAAA,GAAG;EAACD,MAAM,EAAE,SAARA,MAAMA,CAAA;IAAA,oBAAQ,IAAA/H,eAAA,EAACqF,UAAU,IAAE,CAAC;EAAA;AAAA,CAAC;AACnD,IAAM4C,cAAqB,GAAAvE,OAAA,CAAAuE,cAAA,GAAG;EACjCC,IAAI,EAAE;IACFlH,KAAK,EAAE,mBAAmB;IAC1BE,KAAK,EAAE,EAAE;IACT+E,OAAO,EAAE,IAAI;IACb5B,MAAM,EAAE;MAACe,QAAQ,EAAE,IAAAhE,eAAM,EAAC,gBAAgB;IAAC;EAC/C,CAAC;EACD+G,UAAU,EAAE,CACR,UAACC,cAAc;IAAA,oBACX,IAAApI,eAAA;MAAK+E,KAAK,EAAE;QAACtE,KAAK,EAAE,GAAG;QAAEC,MAAM,EAAE;MAAG,CAAE;MAAAR,QAAA,eAClC,IAAAF,eAAA,EAACoI,cAAc,IAAE;IAAC,CACjB,CAAC;EAAA,CACT;AAET,CAAC;AACM,IAAMC,SAAgB,GAAA3E,OAAA,CAAA2E,SAAA,GAAG;EAACN,MAAM,EAAE,SAARA,MAAMA,CAAA;IAAA,oBAAQ,IAAA/H,eAAA,EAACwF,cAAc,IAAE,CAAC;EAAA;AAAA,CAAC;AAC3D,IAAM8C,WAAkB,GAAA5E,OAAA,CAAA4E,WAAA,GAAG;EAC9BJ,IAAI,EAAE;IACFlH,KAAK,EAAE,mBAAmB;IAC1BE,KAAK,EAAEW,gBAAgB,CAAC,CAAC,CAAC;IAC1BoE,OAAO,EAAE,IAAI;IACbU,OAAO,EAAE,IAAI;IACbC,UAAU,EAAE,IAAAxF,eAAM,EAAC,YAAY,CAAC;IAChCiD,MAAM,EAAE;MAACe,QAAQ,EAAE,IAAAhE,eAAM,EAAC,gBAAgB;IAAC;EAC/C,CAAC;EACD+G,UAAU,EAAE,CACR,UAACC,cAAc;IAAA,oBACX,IAAApI,eAAA;MAAK+E,KAAK,EAAE;QAACtE,KAAK,EAAE,GAAG;QAAEC,MAAM,EAAE;MAAG,CAAE;MAAAR,QAAA,eAClC,IAAAF,eAAA,EAACoI,cAAc,IAAE;IAAC,CACjB,CAAC;EAAA,CACT;AAET,CAAC;AACM,IAAMG,WAAkB,GAAA7E,OAAA,CAAA6E,WAAA,GAAG;EAACR,MAAM,EAAE,SAARA,MAAMA,CAAA;IAAA,oBAAQ,IAAA/H,eAAA,EAAC8G,gBAAgB,IAAE,CAAC;EAAA;AAAA,CAAC;AAC/D,IAAM0B,iBAAwB,GAAA9E,OAAA,CAAA8E,iBAAA,GAAG;EAACT,MAAM,EAAE,SAARA,MAAMA,CAAA;IAAA,oBAAQ,IAAA/H,eAAA,EAACiH,sBAAsB,IAAE,CAAC;EAAA;AAAA,CAAC","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, width * LABEL_MAX_WIDTH_RATIO, trimStart);
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA,SAAQA,WAAW,QAAoB,mBAAmB;AAG1D,SAAQC,qBAAqB;AAC7B,SACIC,iBAAiB,EACjBC,aAAa,EACbC,wBAAwB,EACxBC,wBAAwB;AAE5B,SAAQC,0BAA0B;AAkBlC,IAAMC,UAAU,GAAG,IAAIC,GAAG,CAA0B,CAAC;AACrD,IAAMC,YAAY,GAAG;EACjB,aAAa,EAAE,CAAC,wBAAwB,EAAE,sBAAsB,CAAC;EACjEC,OAAO,EAAE,CAAC,2BAA2B,EAAE,2BAA2B,CAAC;EACnEC,OAAO,EAAE,CAAC,wBAAwB,EAAE,wBAAwB,CAAC;EAC7DC,SAAS,EAAE,CAAC,+BAA+B,EAAE,+BAA+B,CAAC;EAC7EC,MAAM,EAAE,CAAC,6BAA6B,EAAE,6BAA6B,CAAC;EACtEC,OAAO,EAAE,CAAC,8BAA8B,EAAE,wBAAwB;AACtE,CAAU;AACV,IAAMC,gBAA+D,GAAG;EACpEJ,OAAO,EAAE,qBAAqB;EAC9BC,SAAS,EAAE,+BAA+B;EAC1CC,MAAM,EAAE,6BAA6B;EACrCC,OAAO,EAAE;AACb,CAAC;AACD,IAAME,cAAc,GAAG,CAAC,wBAAwB,EAAE,sBAAsB,CAAU;AAClF,IAAMC,WAAW,GAAG,CAACC,IAAI,CAACC,EAAE,GAAG,CAAC;AAChC,IAAMC,sBAAsB,GAAG,CAAC,GAAG,CAAC;AACpC,IAAMC,mCAAmC,GAAG,CAAC,GAAG,CAAC;AACjD,IAAMC,oBAAoB,GAAG,CAAC,GAAG,CAAC;AAClC,IAAMC,wBAAwB,GAAG,CAAC,GAAG,EAAE;AACvC,IAAMC,uBAAuB,GAAG,CAAC,GAAG,CAAC;AACrC,IAAMC,qBAAqB,GAAG,CAAC;AAC/B,IAAMC,iBAAiB,GAAG,EAAE;AAC5B,IAAMC,eAAe,GAAG,CAAC;AACzB,IAAMC,SAAS,GAAG,CAAC;AACnB,IAAMC,kBAAkB,GAAG,EAAE;AAE7B,SAASC,QAAQA,CAACC,KAAa,EAAEC,OAAiB,EAAE;EAChD,IAAI,OAAOC,QAAQ,KAAK,WAAW,EAAE,OAAO,EAAE;EAC9C,OAAOC,gBAAgB,CAACF,OAAO,aAAPA,OAAO,cAAPA,OAAO,GAAIC,QAAQ,CAACE,eAAe,CAAC,CACvDC,gBAAgB,CAACL,KAAK,CAAC,CACvBM,IAAI,CAAC,CAAC;AACf;AAEA,SAASC,iBAAiBA,CAACC,GAAW,EAAEC,KAAa,EAAE;EACnD,IAAMC,MAAM,GAAGF,GAAG,CAACG,KAAK,CAAC,cAAc,CAAC,CAACC,IAAI,CAACH,KAAK,IAAI,MAAM,CAAC;EAC9D,2CAAAI,MAAA,CAA2CC,kBAAkB,CAACJ,MAAM,CAAC;AACzE;AAEA,SAASK,cAAcA,CAACP,GAAW,EAAEC,KAAa,EAAEO,SAAqB,EAAE;EACvE,IAAI,OAAOC,KAAK,KAAK,WAAW,EAAE,OAAOC,SAAS;EAClD,IAAMC,GAAG,MAAAN,MAAA,CAAMJ,KAAK,QAAAI,MAAA,CAAKL,GAAG,CAAE;EAC9B,IAAIY,KAAK,GAAG5C,UAAU,CAAC6C,GAAG,CAACF,GAAG,CAAC;EAC/B,IAAI,CAACC,KAAK,EAAE;IACR,IAAME,KAAK,GAAG,IAAIL,KAAK,CAAC,CAAC;IACzBG,KAAK,GAAG;MAACE,KAAK,EAALA,KAAK;MAAEC,KAAK,EAAE,SAAS;MAAEC,SAAS,EAAE,IAAIC,GAAG,CAAC;IAAC,CAAC;IACvDjD,UAAU,CAACkD,GAAG,CAACP,GAAG,EAAEC,KAAK,CAAC;IAC1BE,KAAK,CAACK,MAAM,GAAG,YAAM;MACjB,IAAI,CAACP,KAAK,EAAE;MACZA,KAAK,CAACG,KAAK,GAAG,QAAQ;MACtBH,KAAK,CAACI,SAAS,CAACI,OAAO,CAAC,UAACC,QAAQ;QAAA,OAAKA,QAAQ,CAAC,CAAC;MAAA,EAAC;MACjDT,KAAK,CAACI,SAAS,CAACM,KAAK,CAAC,CAAC;IAC3B,CAAC;IACDR,KAAK,CAACS,OAAO,GAAG,YAAM;MAClB,IAAI,CAACX,KAAK,EAAE;MACZA,KAAK,CAACG,KAAK,GAAG,QAAQ;MACtBH,KAAK,CAACI,SAAS,CAACI,OAAO,CAAC,UAACC,QAAQ;QAAA,OAAKA,QAAQ,CAAC,CAAC;MAAA,EAAC;MACjDT,KAAK,CAACI,SAAS,CAACM,KAAK,CAAC,CAAC;IAC3B,CAAC;IACDR,KAAK,CAACU,GAAG,GAAGzB,iBAAiB,CAACC,GAAG,EAAEC,KAAK,CAAC;EAC7C;EACA,IAAIW,KAAK,CAACG,KAAK,KAAK,SAAS,EAAEH,KAAK,CAACI,SAAS,CAACS,GAAG,CAACjB,SAAS,CAAC;EAC7D,OAAOI,KAAK;AAChB;AAEA,WAAac,qBAAqB,0BAAAC,YAAA;EAAA,SAAAD,sBAAA;IAAA,IAAAE,KAAA;IAAAC,eAAA,OAAAH,qBAAA;IAAA,SAAAI,IAAA,GAAAC,SAAA,CAAAC,MAAA,EAAAC,IAAA,OAAAC,KAAA,CAAAJ,IAAA,GAAAK,IAAA,MAAAA,IAAA,GAAAL,IAAA,EAAAK,IAAA;MAAAF,IAAA,CAAAE,IAAA,IAAAJ,SAAA,CAAAI,IAAA;IAAA;IAAAP,KAAA,GAAAQ,UAAA,OAAAV,qBAAA,KAAArB,MAAA,CAAA4B,IAAA;IAAAL,KAAA,CAabS,oBAAoB,GAAG;MAAA,OAAMT,KAAA,CAAKU,aAAa,CAAC,CAAC;IAAA;IAAA,OAAAV,KAAA;EAAA;EAAAW,SAAA,CAAAb,qBAAA,EAAAC,YAAA;EAAA,OAAAa,YAAA,CAAAd,qBAAA;IAAAf,GAAA;IAAA8B,KAAA,EAZlE,SAAgBC,uBAAuBA,CAACC,GAA6B,EAAE;MACnE,IAAI,CAACC,eAAe,CAACD,GAAG,CAAC;IAC7B;EAAC;IAAAhC,GAAA;IAAA8B,KAAA,EAED,SAAgBI,mBAAmBA,CAACF,GAA6B,EAAE;MAC/D,IAAI,CAACC,eAAe,CAACD,GAAG,CAAC;IAC7B;EAAC;IAAAhC,GAAA;IAAA8B,KAAA,EAED,SAAgBK,kBAAkBA,CAACH,GAA6B,EAAE;MAC9D,IAAI,CAACC,eAAe,CAACD,GAAG,CAAC;IAC7B;EAAC;IAAAhC,GAAA;IAAA8B,KAAA,EAID,SAAQG,eAAeA,CAACG,OAAiC,EAAE;MAAA,IAAAC,YAAA,EAAAC,WAAA;MACvD,IAAOC,IAAI,GAAI,IAAI,CAACnC,KAAK,CAAlBmC,IAAI;MACX,IAAI,EAACA,IAAI,aAAJA,IAAI,eAAJA,IAAI,CAAEC,IAAI,GAAE;MACjB,IAAOA,IAAI,GAAID,IAAI,CAAZC,IAAI;MACX,IAAMC,MAAM,IAAAJ,YAAA,GAAGG,IAAI,CAACC,MAAM,cAAAJ,YAAA,cAAAA,YAAA,GAAI,aAAa;MAC3C,IAAAK,IAAA,GACIF,IAAI,CAACG,IAAI,KAAK,WAAW,GAAGpF,YAAY,CAACkF,MAAM,CAAC,GAAG3E,cAAc;QAAA8E,KAAA,GAAAC,cAAA,CAAAH,IAAA;QAD9DI,SAAS,GAAAF,KAAA;QAAEG,SAAS,GAAAH,KAAA;MAG3BR,OAAO,CAACY,IAAI,CAAC,CAAC;MACd,IAAIR,IAAI,CAACG,IAAI,KAAK,WAAW,IAAIF,MAAM,KAAK,SAAS,EAAE;QACnD,IAAI,CAACQ,oBAAoB,CAACb,OAAO,EAAErF,qBAAqB,CAACyF,IAAI,CAAC,CAAC;MACnE,CAAC,MAAM;QACH,IAAI,CAACU,aAAa,CAACd,OAAO,EAAEU,SAAS,EAAEC,SAAS,CAAC;MACrD;MAEA,IAAMI,OAAO,GAAGjG,wBAAwB,CAACsF,IAAI,CAAC;MAC9C,IAAIW,OAAO,CAACR,IAAI,KAAK,MAAM,EAAE;QACzB,IAAAS,WAAA,GAA8B,IAAI,CAAChD,KAAK;UAAjCiD,CAAC,GAAAD,WAAA,CAADC,CAAC;UAAEC,CAAC,GAAAF,WAAA,CAADE,CAAC;UAAEC,KAAK,GAAAH,WAAA,CAALG,KAAK;UAAEC,MAAM,GAAAJ,WAAA,CAANI,MAAM;QAC1B,IAAMC,IAAI,GAAGjB,IAAI,CAACG,IAAI,KAAK,WAAW,GAAGY,KAAK,GAAG,CAAC,GAAG5E,kBAAkB;QACvE,IAAI,CAAC+E,QAAQ,CACTtB,OAAO,EACPG,IAAI,CAACoB,OAAO,EACZpB,IAAI,CAACqB,eAAe,EACpBP,CAAC,GAAG,CAACE,KAAK,GAAGE,IAAI,IAAI,CAAC,EACtBH,CAAC,GAAG,CAACE,MAAM,GAAGC,IAAI,IAAI,CAAC,EACvBA,IAAI,EACJ7E,QAAQ,CAAC2D,IAAI,CAACsB,cAAc,EAAEzB,OAAO,CAAC0B,MAAM,CAAC,EAC7ClF,QAAQ,CAAC2D,IAAI,CAACwB,sBAAsB,EAAE3B,OAAO,CAAC0B,MAAM,CACxD,CAAC;MACL,CAAC,MAAM,IAAIX,OAAO,CAACR,IAAI,KAAK,SAAS,EAAE;QACnC,IAAI,CAACqB,WAAW,CAAC5B,OAAO,EAAEe,OAAO,CAACrB,KAAK,CAAC;MAC5C;MAEA,IAAIU,IAAI,CAACG,IAAI,KAAK,WAAW,EAAE,IAAI,CAACsB,cAAc,CAAC7B,OAAO,EAAEK,MAAM,CAAC;MACnE,IAAI,CAACyB,SAAS,CAAC9B,OAAO,GAAAE,WAAA,GAAEE,IAAI,CAAC2B,KAAK,cAAA7B,WAAA,cAAAA,WAAA,GAAIE,IAAI,CAAC4B,IAAI,EAAE5B,IAAI,CAACG,IAAI,KAAK,WAAW,CAAC;MAC3EP,OAAO,CAACiC,OAAO,CAAC,CAAC;IACrB;EAAC;IAAArE,GAAA;IAAA8B,KAAA,EAED,SAAQoB,aAAaA,CAACd,OAAiC,EAAEU,SAAiB,EAAEC,SAAiB,EAAE;MAC3F,IAAAuB,YAAA,GAAoC,IAAI,CAAClE,KAAK;QAAvCiD,CAAC,GAAAiB,YAAA,CAADjB,CAAC;QAAEC,CAAC,GAAAgB,YAAA,CAADhB,CAAC;QAAEC,KAAK,GAAAe,YAAA,CAALf,KAAK;QAAEC,MAAM,GAAAc,YAAA,CAANd,MAAM;QAAEjB,IAAI,GAAA+B,YAAA,CAAJ/B,IAAI;MAChCH,OAAO,CAACmC,SAAS,CAAC,CAAC;MACnB,IAAI,CAAAhC,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEC,IAAI,CAACG,IAAI,MAAK,WAAW,EAAE;QACjCP,OAAO,CAACoC,GAAG,CAACnB,CAAC,GAAGE,KAAK,GAAG,CAAC,EAAED,CAAC,GAAGE,MAAM,GAAG,CAAC,EAAED,KAAK,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAEvF,IAAI,CAACC,EAAE,GAAG,CAAC,CAAC;MAC7E,CAAC,MAAM;QACHmE,OAAO,CAACqC,SAAS,CAACpB,CAAC,GAAG,CAAC,EAAEC,CAAC,GAAG,CAAC,EAAEC,KAAK,GAAG,CAAC,EAAEC,MAAM,GAAG,CAAC,EAAE,EAAE,CAAC;MAC9D;MACApB,OAAO,CAACsC,SAAS,GAAG9F,QAAQ,CAACmE,SAAS,EAAEX,OAAO,CAAC0B,MAAM,CAAC;MACvD1B,OAAO,CAACuC,IAAI,CAAC,CAAC;MACdvC,OAAO,CAACwC,SAAS,GAAG,CAAC;MACrBxC,OAAO,CAACyC,WAAW,GAAGjG,QAAQ,CAACkE,SAAS,EAAEV,OAAO,CAAC0B,MAAM,CAAC;MACzD1B,OAAO,CAAC0C,MAAM,CAAC,CAAC;IACpB;EAAC;IAAA9E,GAAA;IAAA8B,KAAA,EAED,SAAQmB,oBAAoBA,CAACb,OAAiC,EAAE2C,QAAgB,EAAE;MAC9E,IAAAC,YAAA,GAA8B,IAAI,CAAC5E,KAAK;QAAjCiD,CAAC,GAAA2B,YAAA,CAAD3B,CAAC;QAAEC,CAAC,GAAA0B,YAAA,CAAD1B,CAAC;QAAEC,KAAK,GAAAyB,YAAA,CAALzB,KAAK;QAAEC,MAAM,GAAAwB,YAAA,CAANxB,MAAM;MAC1B,IAAMyB,OAAO,GAAG5B,CAAC,GAAGE,KAAK,GAAG,CAAC;MAC7B,IAAM2B,OAAO,GAAG5B,CAAC,GAAGE,MAAM,GAAG,CAAC;MAC9B,IAAM2B,MAAM,GAAG5B,KAAK,GAAG,CAAC;MACxB,IAAM6B,aAAa,GAAG7B,KAAK,GAAGnF,oBAAoB;MAClD,IAAMiH,QAAQ,GAAGtH,WAAW,GAAGC,IAAI,CAACC,EAAE,GAAG,CAAC,GAAG8G,QAAQ;MACrD,IAAMO,WAAW,GAAG1G,QAAQ,CAAC,wBAAwB,EAAEwD,OAAO,CAAC0B,MAAM,CAAC;MACtE,IAAMyB,WAAW,GAAG3G,QAAQ,CAAC,wBAAwB,EAAEwD,OAAO,CAAC0B,MAAM,CAAC;MACtE,IAAM0B,YAAY,GAAG5G,QAAQ,CAAC,2BAA2B,EAAEwD,OAAO,CAAC0B,MAAM,CAAC;MAC1E,IAAM2B,YAAY,GAAG7G,QAAQ,CAAC,qBAAqB,EAAEwD,OAAO,CAAC0B,MAAM,CAAC;MACpE,IAAM4B,UAAU,GAAG9G,QAAQ,CAAC,2BAA2B,EAAEwD,OAAO,CAAC0B,MAAM,CAAC;MAExE1B,OAAO,CAACmC,SAAS,CAAC,CAAC;MACnBnC,OAAO,CAACoC,GAAG,CAACS,OAAO,EAAEC,OAAO,EAAEC,MAAM,GAAGC,aAAa,GAAG,CAAC,EAAE,CAAC,EAAEpH,IAAI,CAACC,EAAE,GAAG,CAAC,CAAC;MACzEmE,OAAO,CAACsC,SAAS,GAAGY,WAAW;MAC/BlD,OAAO,CAACuC,IAAI,CAAC,CAAC;MACdvC,OAAO,CAACwC,SAAS,GAAGQ,aAAa;MACjChD,OAAO,CAACyC,WAAW,GAAGU,WAAW;MACjCnD,OAAO,CAAC0C,MAAM,CAAC,CAAC;MAEhB,IAAIC,QAAQ,GAAG,CAAC,EAAE;QACd3C,OAAO,CAACmC,SAAS,CAAC,CAAC;QACnBnC,OAAO,CAACuD,MAAM,CAACV,OAAO,EAAEC,OAAO,CAAC;QAChC9C,OAAO,CAACoC,GAAG,CAACS,OAAO,EAAEC,OAAO,EAAEC,MAAM,GAAGC,aAAa,GAAG,CAAC,EAAErH,WAAW,EAAEsH,QAAQ,CAAC;QAChFjD,OAAO,CAACwD,SAAS,CAAC,CAAC;QACnBxD,OAAO,CAACsC,SAAS,GAAGc,YAAY;QAChCpD,OAAO,CAACuC,IAAI,CAAC,CAAC;QAEdvC,OAAO,CAACmC,SAAS,CAAC,CAAC;QACnBnC,OAAO,CAACoC,GAAG,CAACS,OAAO,EAAEC,OAAO,EAAEC,MAAM,GAAGC,aAAa,GAAG,CAAC,EAAErH,WAAW,EAAEsH,QAAQ,CAAC;QAChFjD,OAAO,CAACwC,SAAS,GAAGQ,aAAa;QACjChD,OAAO,CAACyC,WAAW,GAAGY,YAAY;QAClCrD,OAAO,CAAC0C,MAAM,CAAC,CAAC;MACpB;MAEA1C,OAAO,CAACmC,SAAS,CAAC,CAAC;MACnBnC,OAAO,CAACoC,GAAG,CAACS,OAAO,EAAEC,OAAO,EAAEC,MAAM,GAAGC,aAAa,EAAE,CAAC,EAAEpH,IAAI,CAACC,EAAE,GAAG,CAAC,CAAC;MACrEmE,OAAO,CAACwC,SAAS,GAAGrB,KAAK,GAAGlF,wBAAwB;MACpD+D,OAAO,CAACyC,WAAW,GAAGa,UAAU;MAChCtD,OAAO,CAAC0C,MAAM,CAAC,CAAC;IACpB;EAAC;IAAA9E,GAAA;IAAA8B,KAAA,EAED,SAAQkC,WAAWA,CAAC5B,OAAiC,EAAEN,KAAa,EAAE;MAClE,IAAA+D,YAAA,GAA8B,IAAI,CAACzF,KAAK;QAAjCiD,CAAC,GAAAwC,YAAA,CAADxC,CAAC;QAAEC,CAAC,GAAAuC,YAAA,CAADvC,CAAC;QAAEC,KAAK,GAAAsC,YAAA,CAALtC,KAAK;QAAEC,MAAM,GAAAqC,YAAA,CAANrC,MAAM;MAC1B,IAAMsC,WAAW,GAAG3I,wBAAwB,CACxCqB,iBAAiB,EACjB,IAAI,CAAC4D,OAAO,CAAC2D,KAAK,CAACC,aAAa,CAACC,cAAc,CAAC,CACpD,CAAC;MACD,IAAMC,UAAU,GAAGtH,QAAQ,CAAC,sBAAsB,EAAEwD,OAAO,CAAC0B,MAAM,CAAC;MACnE1B,OAAO,CAACsC,SAAS,GAAG9F,QAAQ,CAAC,wBAAwB,EAAEwD,OAAO,CAAC0B,MAAM,CAAC;MACtE1B,OAAO,CAAC+D,SAAS,GAAG,QAAQ;MAC5B/D,OAAO,CAACgE,YAAY,GAAG,QAAQ;MAC/BhE,OAAO,CAACiE,IAAI,UAAA3G,MAAA,CAAUoG,WAAW,SAAApG,MAAA,CAAMwG,UAAU,CAAE;MACnD,IAAMI,QAAQ,GAAGtJ,iBAAiB,CAC9B8I,WAAW,EACX1D,OAAO,CAACmE,WAAW,CAACzE,KAAK,CAAC,CAACyB,KAAK,EAChCA,KAAK,GAAGjF,uBACZ,CAAC;MACD8D,OAAO,CAACiE,IAAI,UAAA3G,MAAA,CAAU4G,QAAQ,SAAA5G,MAAA,CAAMwG,UAAU,CAAE;MAChD9D,OAAO,CAACoE,QAAQ,CAAC1E,KAAK,EAAEuB,CAAC,GAAGE,KAAK,GAAG,CAAC,EAAED,CAAC,GAAGE,MAAM,GAAG,CAAC,CAAC;IAC1D;EAAC;IAAAxD,GAAA;IAAA8B,KAAA,EAED,SAAQmC,cAAcA,CAAC7B,OAAiC,EAAEK,MAA4B,EAAE;MACpF,IAAMkB,OAAO,GAAGvG,0BAA0B,CAACqF,MAAM,CAAC;MAClD,IAAMgE,UAAU,GAAG5I,gBAAgB,CAAC4E,MAAM,CAAC;MAC3C,IAAI,CAACkB,OAAO,IAAI,CAAC8C,UAAU,EAAE;MAC7B,IAAAC,YAAA,GAAsB,IAAI,CAACtG,KAAK;QAAzBiD,CAAC,GAAAqD,YAAA,CAADrD,CAAC;QAAEC,CAAC,GAAAoD,YAAA,CAADpD,CAAC;QAAEC,KAAK,GAAAmD,YAAA,CAALnD,KAAK;MAClB,IAAME,IAAI,GAAGF,KAAK,GAAGrF,sBAAsB;MAC3C,IAAMyI,gBAAgB,GAAGpD,KAAK,GAAGpF,mCAAmC;MACpE,IAAMyI,KAAK,GAAGvD,CAAC,GAAGE,KAAK,GAAGE,IAAI;MAC9B,IAAMoD,KAAK,GAAGvD,CAAC;MAEflB,OAAO,CAACmC,SAAS,CAAC,CAAC;MACnBnC,OAAO,CAACoC,GAAG,CAACoC,KAAK,GAAGnD,IAAI,GAAG,CAAC,EAAEoD,KAAK,GAAGpD,IAAI,GAAG,CAAC,EAAEkD,gBAAgB,EAAE,CAAC,EAAE3I,IAAI,CAACC,EAAE,GAAG,CAAC,CAAC;MACjFmE,OAAO,CAACsC,SAAS,GAAG9F,QAAQ,CAAC,2BAA2B,EAAEwD,OAAO,CAAC0B,MAAM,CAAC;MACzE1B,OAAO,CAACuC,IAAI,CAAC,CAAC;MACd,IAAI,CAACjB,QAAQ,CACTtB,OAAO,EACPuB,OAAO,EACPA,OAAO,EACPiD,KAAK,EACLC,KAAK,EACLpD,IAAI,EACJ7E,QAAQ,CAAC6H,UAAU,EAAErE,OAAO,CAAC0B,MAAM,CAAC,EACpClF,QAAQ,CAAC6H,UAAU,EAAErE,OAAO,CAAC0B,MAAM,CACvC,CAAC;IACL;EAAC;IAAA9D,GAAA;IAAA8B,KAAA,EAED,SAAQ4B,QAAQA,CACZtB,OAAiC,EACjC/C,GAAW,EACXyH,WAAmB,EACnBzD,CAAS,EACTC,CAAS,EACTG,IAAY,EACZnE,KAAa,EACbyH,aAAqB,EACvB;MAAA,IAAAC,MAAA,EAAAC,OAAA;MACE,IAAIhH,KAAK,GAAGL,cAAc,CAACP,GAAG,EAAEC,KAAK,EAAE,IAAI,CAACoC,oBAAoB,CAAC;MACjE,IAAI,EAAAsF,MAAA,GAAA/G,KAAK,cAAA+G,MAAA,uBAALA,MAAA,CAAO5G,KAAK,MAAK,QAAQ,IAAI0G,WAAW,KAAKzH,GAAG,EAAE;QAClDY,KAAK,GAAGL,cAAc,CAACkH,WAAW,EAAEC,aAAa,EAAE,IAAI,CAACrF,oBAAoB,CAAC;MACjF;MACA,IAAI,EAAAuF,OAAA,GAAAhH,KAAK,cAAAgH,OAAA,uBAALA,OAAA,CAAO7G,KAAK,MAAK,QAAQ,EAAEgC,OAAO,CAAC8E,SAAS,CAACjH,KAAK,CAACE,KAAK,EAAEkD,CAAC,EAAEC,CAAC,EAAEG,IAAI,EAAEA,IAAI,CAAC;IACnF;EAAC;IAAAzD,GAAA;IAAA8B,KAAA,EAED,SAAQoC,SAASA,CAAC9B,OAAiC,EAAE+B,KAAa,EAAEgD,SAAkB,EAAE;MACpF,IAAAC,YAAA,GAA8B,IAAI,CAAChH,KAAK;QAAjCiD,CAAC,GAAA+D,YAAA,CAAD/D,CAAC;QAAEC,CAAC,GAAA8D,YAAA,CAAD9D,CAAC;QAAEC,KAAK,GAAA6D,YAAA,CAAL7D,KAAK;QAAEC,MAAM,GAAA4D,YAAA,CAAN5D,MAAM;MAC1B,IAAM6D,WAAW,GAAG,IAAI,CAACjF,OAAO,CAAC2D,KAAK,CAACC,aAAa,CAACC,cAAc,CAAC,CAAC;MACrE,IAAMK,QAAQ,GAAGnJ,wBAAwB,CAACsB,eAAe,EAAE4I,WAAW,CAAC;MACvE,IAAMC,QAAQ,GAAGnK,wBAAwB,CAACuB,SAAS,EAAE2I,WAAW,CAAC;MACjE;MACA,IAAME,QAAQ,GAAGpK,wBAAwB,CAACoG,KAAK,GAAGhF,qBAAqB,EAAE8I,WAAW,CAAC;MACrFjF,OAAO,CAACsC,SAAS,GAAG9F,QAAQ,CAAC,wBAAwB,EAAEwD,OAAO,CAAC0B,MAAM,CAAC;MACtE1B,OAAO,CAAC+D,SAAS,GAAG,QAAQ;MAC5B/D,OAAO,CAACgE,YAAY,GAAG,KAAK;MAC5BhE,OAAO,CAACiE,IAAI,UAAA3G,MAAA,CAAU4G,QAAQ,SAAA5G,MAAA,CAAMd,QAAQ,CAAC,sBAAsB,EAAEwD,OAAO,CAAC0B,MAAM,CAAC,CAAE;MACtF,IAAM0D,MAAM,GAAGvK,aAAa,CAACmF,OAAO,EAAE+B,KAAK,EAAEoD,QAAQ,EAAEJ,SAAS,CAAC;MACjE/E,OAAO,CAACoE,QAAQ,CAACgB,MAAM,EAAEnE,CAAC,GAAGE,KAAK,GAAG,CAAC,EAAED,CAAC,GAAGE,MAAM,GAAG8D,QAAQ,CAAC;IAClE;EAAC;AAAA,EA3LsCxK,WAAW","ignoreList":[]}
@@ -1,7 +1,9 @@
1
1
  import React from 'react';
2
+ import type { QueryListLinkRenderer } from '../../types/queryList';
2
3
  import type { TutorialHistoryRow } from '../../types/tutorial';
3
4
  import './TutorialRow.scss';
4
5
  export type TutorialRowProps<T extends TutorialHistoryRow = TutorialHistoryRow> = {
5
6
  item: T;
7
+ renderLink?: QueryListLinkRenderer;
6
8
  };
7
- export declare const TutorialRow: <T extends TutorialHistoryRow>({ item }: TutorialRowProps<T>) => React.JSX.Element;
9
+ export declare const TutorialRow: <T extends TutorialHistoryRow>({ item, renderLink, }: TutorialRowProps<T>) => React.JSX.Element;
@@ -6,12 +6,14 @@ import "./TutorialRow.css";
6
6
  import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
7
7
  var block = cn('qp-tutorial-row');
8
8
  export var TutorialRow = function TutorialRow(_ref) {
9
- var item = _ref.item;
9
+ var item = _ref.item,
10
+ renderLink = _ref.renderLink;
10
11
  var href = item.href,
11
12
  id = item.id,
12
13
  title = item.title;
13
14
  return /*#__PURE__*/_jsx(RowLink, {
14
15
  href: href,
16
+ renderLink: renderLink,
15
17
  className: block(),
16
18
  children: /*#__PURE__*/_jsxs(Flex, {
17
19
  gap: 1,
@@ -1 +1 @@
1
- {"version":3,"names":["React","Flex","Text","RowLink","cn","jsxs","_jsxs","jsx","_jsx","block","TutorialRow","_ref","item","href","id","title","className","children","gap","alignItems","color","ellipsis"],"sources":["TutorialRow.tsx"],"sourcesContent":["import React from 'react';\nimport {Flex, Text} from '@gravity-ui/uikit';\nimport type {TutorialHistoryRow} from '../../types/tutorial';\nimport {RowLink} from '../../components/RowLink';\nimport cn from 'bem-cn-lite';\nimport './TutorialRow.scss';\n\nconst block = cn('qp-tutorial-row');\n\nexport type TutorialRowProps<T extends TutorialHistoryRow = TutorialHistoryRow> = {\n item: T;\n};\n\nexport const TutorialRow = <T extends TutorialHistoryRow>({item}: TutorialRowProps<T>) => {\n const {href, id, title} = item;\n\n return (\n <RowLink href={href} className={block()}>\n <Flex gap={1} alignItems=\"center\" className={block('content')}>\n <Text color=\"secondary\">{id}.</Text>\n <Text ellipsis>{title}</Text>\n </Flex>\n </RowLink>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAAQC,IAAI,EAAEC,IAAI,QAAO,mBAAmB;AAE5C,SAAQC,OAAO;AACf,OAAOC,EAAE,MAAM,aAAa;AAC5B;AAA4B,SAAAC,IAAA,IAAAC,KAAA,EAAAC,GAAA,IAAAC,IAAA;AAE5B,IAAMC,KAAK,GAAGL,EAAE,CAAC,iBAAiB,CAAC;AAMnC,OAAO,IAAMM,WAAW,GAAG,SAAdA,WAAWA,CAAAC,IAAA,EAAkE;EAAA,IAA/BC,IAAI,GAAAD,IAAA,CAAJC,IAAI;EAC3D,IAAOC,IAAI,GAAeD,IAAI,CAAvBC,IAAI;IAAEC,EAAE,GAAWF,IAAI,CAAjBE,EAAE;IAAEC,KAAK,GAAIH,IAAI,CAAbG,KAAK;EAEtB,oBACIP,IAAA,CAACL,OAAO;IAACU,IAAI,EAAEA,IAAK;IAACG,SAAS,EAAEP,KAAK,CAAC,CAAE;IAAAQ,QAAA,eACpCX,KAAA,CAACL,IAAI;MAACiB,GAAG,EAAE,CAAE;MAACC,UAAU,EAAC,QAAQ;MAACH,SAAS,EAAEP,KAAK,CAAC,SAAS,CAAE;MAAAQ,QAAA,gBAC1DX,KAAA,CAACJ,IAAI;QAACkB,KAAK,EAAC,WAAW;QAAAH,QAAA,GAAEH,EAAE,EAAC,GAAC;MAAA,CAAM,CAAC,eACpCN,IAAA,CAACN,IAAI;QAACmB,QAAQ;QAAAJ,QAAA,EAAEF;MAAK,CAAO,CAAC;IAAA,CAC3B;EAAC,CACF,CAAC;AAElB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","Flex","Text","RowLink","cn","jsxs","_jsxs","jsx","_jsx","block","TutorialRow","_ref","item","renderLink","href","id","title","className","children","gap","alignItems","color","ellipsis"],"sources":["TutorialRow.tsx"],"sourcesContent":["import React from 'react';\nimport {Flex, Text} from '@gravity-ui/uikit';\nimport type {QueryListLinkRenderer} from '../../types/queryList';\nimport type {TutorialHistoryRow} from '../../types/tutorial';\nimport {RowLink} from '../../components/RowLink';\nimport cn from 'bem-cn-lite';\nimport './TutorialRow.scss';\n\nconst block = cn('qp-tutorial-row');\n\nexport type TutorialRowProps<T extends TutorialHistoryRow = TutorialHistoryRow> = {\n item: T;\n renderLink?: QueryListLinkRenderer;\n};\n\nexport const TutorialRow = <T extends TutorialHistoryRow>({\n item,\n renderLink,\n}: TutorialRowProps<T>) => {\n const {href, id, title} = item;\n\n return (\n <RowLink href={href} renderLink={renderLink} className={block()}>\n <Flex gap={1} alignItems=\"center\" className={block('content')}>\n <Text color=\"secondary\">{id}.</Text>\n <Text ellipsis>{title}</Text>\n </Flex>\n </RowLink>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAAQC,IAAI,EAAEC,IAAI,QAAO,mBAAmB;AAG5C,SAAQC,OAAO;AACf,OAAOC,EAAE,MAAM,aAAa;AAC5B;AAA4B,SAAAC,IAAA,IAAAC,KAAA,EAAAC,GAAA,IAAAC,IAAA;AAE5B,IAAMC,KAAK,GAAGL,EAAE,CAAC,iBAAiB,CAAC;AAOnC,OAAO,IAAMM,WAAW,GAAG,SAAdA,WAAWA,CAAAC,IAAA,EAGG;EAAA,IAFvBC,IAAI,GAAAD,IAAA,CAAJC,IAAI;IACJC,UAAU,GAAAF,IAAA,CAAVE,UAAU;EAEV,IAAOC,IAAI,GAAeF,IAAI,CAAvBE,IAAI;IAAEC,EAAE,GAAWH,IAAI,CAAjBG,EAAE;IAAEC,KAAK,GAAIJ,IAAI,CAAbI,KAAK;EAEtB,oBACIR,IAAA,CAACL,OAAO;IAACW,IAAI,EAAEA,IAAK;IAACD,UAAU,EAAEA,UAAW;IAACI,SAAS,EAAER,KAAK,CAAC,CAAE;IAAAS,QAAA,eAC5DZ,KAAA,CAACL,IAAI;MAACkB,GAAG,EAAE,CAAE;MAACC,UAAU,EAAC,QAAQ;MAACH,SAAS,EAAER,KAAK,CAAC,SAAS,CAAE;MAAAS,QAAA,gBAC1DZ,KAAA,CAACJ,IAAI;QAACmB,KAAK,EAAC,WAAW;QAAAH,QAAA,GAAEH,EAAE,EAAC,GAAC;MAAA,CAAM,CAAC,eACpCP,IAAA,CAACN,IAAI;QAACoB,QAAQ;QAAAJ,QAAA,EAAEF;MAAK,CAAO,CAAC;IAAA,CAC3B;EAAC,CACF,CAAC;AAElB,CAAC","ignoreList":[]}
@@ -1,7 +1,9 @@
1
1
  import React from 'react';
2
+ import type { QueryListLinkRenderer } from '../../types/queryList';
2
3
  import type { TutorialHistoryRow } from '../../types/tutorial';
3
4
  import './TutorialSearchRow.scss';
4
5
  export type TutorialSearchRowProps<T extends TutorialHistoryRow = TutorialHistoryRow> = {
5
6
  item: T;
7
+ renderLink?: QueryListLinkRenderer;
6
8
  };
7
- export declare const TutorialSearchRow: <T extends TutorialHistoryRow>({ item, }: TutorialSearchRowProps<T>) => React.JSX.Element;
9
+ export declare const TutorialSearchRow: <T extends TutorialHistoryRow>({ item, renderLink, }: TutorialSearchRowProps<T>) => React.JSX.Element;
@@ -7,7 +7,8 @@ import cn from 'bem-cn-lite';
7
7
  import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
8
8
  var block = cn('qp-tutorial-search-row');
9
9
  export var TutorialSearchRow = function TutorialSearchRow(_ref) {
10
- var item = _ref.item;
10
+ var item = _ref.item,
11
+ renderLink = _ref.renderLink;
11
12
  var href = item.href,
12
13
  id = item.id,
13
14
  title = item.title,
@@ -16,6 +17,7 @@ export var TutorialSearchRow = function TutorialSearchRow(_ref) {
16
17
  query: query,
17
18
  language: MonacoLanguage.YQL,
18
19
  href: href,
20
+ renderLink: renderLink,
19
21
  className: block(),
20
22
  header: /*#__PURE__*/_jsxs(Flex, {
21
23
  gap: 2,
@@ -1 +1 @@
1
- {"version":3,"names":["React","Flex","Text","MonacoLanguage","SearchRowLayout","cn","jsxs","_jsxs","jsx","_jsx","block","TutorialSearchRow","_ref","item","href","id","title","query","language","YQL","className","header","gap","alignItems","children","color","ellipsis"],"sources":["TutorialSearchRow.tsx"],"sourcesContent":["import React from 'react';\nimport {Flex, Text} from '@gravity-ui/uikit';\nimport type {TutorialHistoryRow} from '../../types/tutorial';\nimport {MonacoLanguage} from '../../components/MonacoEditor';\nimport {SearchRowLayout} from '../../components/SearchRowLayout';\nimport './TutorialSearchRow.scss';\nimport cn from 'bem-cn-lite';\n\nconst block = cn('qp-tutorial-search-row');\n\nexport type TutorialSearchRowProps<T extends TutorialHistoryRow = TutorialHistoryRow> = {\n item: T;\n};\n\nexport const TutorialSearchRow = <T extends TutorialHistoryRow>({\n item,\n}: TutorialSearchRowProps<T>) => {\n const {href, id, title, query} = item;\n\n return (\n <SearchRowLayout\n query={query}\n language={MonacoLanguage.YQL}\n href={href}\n className={block()}\n header={\n <Flex gap={2} alignItems=\"center\" className={block('header')}>\n <Text color=\"secondary\">{id}.</Text>\n <Text ellipsis>{title}</Text>\n </Flex>\n }\n />\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAAQC,IAAI,EAAEC,IAAI,QAAO,mBAAmB;AAE5C,SAAQC,cAAc;AACtB,SAAQC,eAAe;AACvB;AACA,OAAOC,EAAE,MAAM,aAAa;AAAC,SAAAC,IAAA,IAAAC,KAAA,EAAAC,GAAA,IAAAC,IAAA;AAE7B,IAAMC,KAAK,GAAGL,EAAE,CAAC,wBAAwB,CAAC;AAM1C,OAAO,IAAMM,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAAC,IAAA,EAEG;EAAA,IAD7BC,IAAI,GAAAD,IAAA,CAAJC,IAAI;EAEJ,IAAOC,IAAI,GAAsBD,IAAI,CAA9BC,IAAI;IAAEC,EAAE,GAAkBF,IAAI,CAAxBE,EAAE;IAAEC,KAAK,GAAWH,IAAI,CAApBG,KAAK;IAAEC,KAAK,GAAIJ,IAAI,CAAbI,KAAK;EAE7B,oBACIR,IAAA,CAACL,eAAe;IACZa,KAAK,EAAEA,KAAM;IACbC,QAAQ,EAAEf,cAAc,CAACgB,GAAI;IAC7BL,IAAI,EAAEA,IAAK;IACXM,SAAS,EAAEV,KAAK,CAAC,CAAE;IACnBW,MAAM,eACFd,KAAA,CAACN,IAAI;MAACqB,GAAG,EAAE,CAAE;MAACC,UAAU,EAAC,QAAQ;MAACH,SAAS,EAAEV,KAAK,CAAC,QAAQ,CAAE;MAAAc,QAAA,gBACzDjB,KAAA,CAACL,IAAI;QAACuB,KAAK,EAAC,WAAW;QAAAD,QAAA,GAAET,EAAE,EAAC,GAAC;MAAA,CAAM,CAAC,eACpCN,IAAA,CAACP,IAAI;QAACwB,QAAQ;QAAAF,QAAA,EAAER;MAAK,CAAO,CAAC;IAAA,CAC3B;EACT,CACJ,CAAC;AAEV,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","Flex","Text","MonacoLanguage","SearchRowLayout","cn","jsxs","_jsxs","jsx","_jsx","block","TutorialSearchRow","_ref","item","renderLink","href","id","title","query","language","YQL","className","header","gap","alignItems","children","color","ellipsis"],"sources":["TutorialSearchRow.tsx"],"sourcesContent":["import React from 'react';\nimport {Flex, Text} from '@gravity-ui/uikit';\nimport type {QueryListLinkRenderer} from '../../types/queryList';\nimport type {TutorialHistoryRow} from '../../types/tutorial';\nimport {MonacoLanguage} from '../../components/MonacoEditor';\nimport {SearchRowLayout} from '../../components/SearchRowLayout';\nimport './TutorialSearchRow.scss';\nimport cn from 'bem-cn-lite';\n\nconst block = cn('qp-tutorial-search-row');\n\nexport type TutorialSearchRowProps<T extends TutorialHistoryRow = TutorialHistoryRow> = {\n item: T;\n renderLink?: QueryListLinkRenderer;\n};\n\nexport const TutorialSearchRow = <T extends TutorialHistoryRow>({\n item,\n renderLink,\n}: TutorialSearchRowProps<T>) => {\n const {href, id, title, query} = item;\n\n return (\n <SearchRowLayout\n query={query}\n language={MonacoLanguage.YQL}\n href={href}\n renderLink={renderLink}\n className={block()}\n header={\n <Flex gap={2} alignItems=\"center\" className={block('header')}>\n <Text color=\"secondary\">{id}.</Text>\n <Text ellipsis>{title}</Text>\n </Flex>\n }\n />\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAAQC,IAAI,EAAEC,IAAI,QAAO,mBAAmB;AAG5C,SAAQC,cAAc;AACtB,SAAQC,eAAe;AACvB;AACA,OAAOC,EAAE,MAAM,aAAa;AAAC,SAAAC,IAAA,IAAAC,KAAA,EAAAC,GAAA,IAAAC,IAAA;AAE7B,IAAMC,KAAK,GAAGL,EAAE,CAAC,wBAAwB,CAAC;AAO1C,OAAO,IAAMM,iBAAiB,GAAG,SAApBA,iBAAiBA,CAAAC,IAAA,EAGG;EAAA,IAF7BC,IAAI,GAAAD,IAAA,CAAJC,IAAI;IACJC,UAAU,GAAAF,IAAA,CAAVE,UAAU;EAEV,IAAOC,IAAI,GAAsBF,IAAI,CAA9BE,IAAI;IAAEC,EAAE,GAAkBH,IAAI,CAAxBG,EAAE;IAAEC,KAAK,GAAWJ,IAAI,CAApBI,KAAK;IAAEC,KAAK,GAAIL,IAAI,CAAbK,KAAK;EAE7B,oBACIT,IAAA,CAACL,eAAe;IACZc,KAAK,EAAEA,KAAM;IACbC,QAAQ,EAAEhB,cAAc,CAACiB,GAAI;IAC7BL,IAAI,EAAEA,IAAK;IACXD,UAAU,EAAEA,UAAW;IACvBO,SAAS,EAAEX,KAAK,CAAC,CAAE;IACnBY,MAAM,eACFf,KAAA,CAACN,IAAI;MAACsB,GAAG,EAAE,CAAE;MAACC,UAAU,EAAC,QAAQ;MAACH,SAAS,EAAEX,KAAK,CAAC,QAAQ,CAAE;MAAAe,QAAA,gBACzDlB,KAAA,CAACL,IAAI;QAACwB,KAAK,EAAC,WAAW;QAAAD,QAAA,GAAET,EAAE,EAAC,GAAC;MAAA,CAAM,CAAC,eACpCP,IAAA,CAACP,IAAI;QAACyB,QAAQ;QAAAF,QAAA,EAAER;MAAK,CAAO,CAAC;IAAA,CAC3B;EACT,CACJ,CAAC;AAEV,CAAC","ignoreList":[]}
@@ -1,4 +1,4 @@
1
1
  import React from 'react';
2
2
  import type { QueryListRowRenderData } from '../../types/queryList';
3
3
  import type { TutorialHistoryRow } from '../../types/tutorial';
4
- export declare const TutorialRowContent: <T extends TutorialHistoryRow>({ item, variant, }: QueryListRowRenderData<T>) => React.JSX.Element;
4
+ export declare const TutorialRowContent: <T extends TutorialHistoryRow>({ item, variant, renderLink, }: QueryListRowRenderData<T>) => React.JSX.Element;