@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
package/README.md CHANGED
@@ -133,12 +133,43 @@ function HistoryPanel() {
133
133
 
134
134
  ### TutorialsHistory
135
135
 
136
- Same layout pattern for tutorial lists search, optional filters, and selectable rows.
136
+ Tutorial list with search, optional filters, selectable rows, incremental loading, and custom
137
+ link or row rendering.
137
138
 
138
139
  ```tsx
139
- import {TutorialsHistory} from '@gravity-ui/querieskit';
140
+ import {TutorialsHistory, type QueryListLinkRenderer} from '@gravity-ui/querieskit';
141
+
142
+ const renderLink: QueryListLinkRenderer = ({href = '', ...props}) => (
143
+ <RouterLink {...props} to={href} />
144
+ );
145
+
146
+ <TutorialsHistory
147
+ items={tutorials}
148
+ selectedRowId={selectedTutorialId}
149
+ hasMore={hasNextPage}
150
+ loading={isLoading}
151
+ onLoadMore={loadNextPage}
152
+ renderLink={renderLink}
153
+ search={{value: search, onUpdate: updateSearch}}
154
+ />;
140
155
  ```
141
156
 
157
+ `renderLink` is used for tutorial rows with a non-empty `href`, including full-text search
158
+ results. Without it, those rows render as regular `<a>` elements; rows without an `href` render
159
+ as `<div>` elements.
160
+
161
+ Use `renderRowItem` to replace the row contents while retaining the list's navigation and
162
+ selection behavior. It receives the original item, its list index, the current row variant
163
+ (`default` or `search`), keyboard activity as `isActive`, and `renderLink`. Group headers are
164
+ passed to the renderer as items and must be rendered by the consumer. Default rows continue to
165
+ show the tutorial `id`. A custom renderer can omit a long string ID from the visible content
166
+ while keeping it on the item for `selectedRowId` and navigation.
167
+
168
+ An empty list with `loading` shows the initial spinner. When existing items are present, loading
169
+ the next page shows an inline loader after them. Keep `loading` controlled, including passing
170
+ `false` between requests; the consumer remains responsible for the initial request, filtering,
171
+ and routing.
172
+
142
173
  Browse interactive examples in [Storybook](https://preview.gravity-ui.com/querieskit/).
143
174
 
144
175
  ## Widgets
@@ -146,7 +177,7 @@ Browse interactive examples in [Storybook](https://preview.gravity-ui.com/querie
146
177
  | Widget | Description |
147
178
  | --- | --- |
148
179
  | `QueriesHistory` | Query history with search, filters, visible fields, editing, and comparison |
149
- | `TutorialsHistory` | Tutorials list with search and filters |
180
+ | `TutorialsHistory` | Tutorials list with search, filters, pagination, and custom rendering |
150
181
 
151
182
  ## Development
152
183
 
@@ -295,11 +295,13 @@ var QueryGraphCanvasBlock = exports.QueryGraphCanvasBlock = /*#__PURE__*/functio
295
295
  var cameraScale = this.context.graph.cameraService.getCameraScale();
296
296
  var fontSize = (0, _presentation.getScaleAdjustedFontSize)(LABEL_FONT_SIZE, cameraScale);
297
297
  var labelGap = (0, _presentation.getScaleAdjustedFontSize)(LABEL_GAP, cameraScale);
298
+ // Keep the available screen width stable, just like the label's font size.
299
+ var maxWidth = (0, _presentation.getScaleAdjustedFontSize)(width * LABEL_MAX_WIDTH_RATIO, cameraScale);
298
300
  context.fillStyle = cssValue('--g-color-text-primary', context.canvas);
299
301
  context.textAlign = 'center';
300
302
  context.textBaseline = 'top';
301
303
  context.font = "400 ".concat(fontSize, "px ").concat(cssValue('--g-font-family-sans', context.canvas));
302
- var fitted = (0, _presentation.fitCanvasText)(context, label, width * LABEL_MAX_WIDTH_RATIO, trimStart);
304
+ var fitted = (0, _presentation.fitCanvasText)(context, label, maxWidth, trimStart);
303
305
  context.fillText(fitted, x + width / 2, y + height + labelGap);
304
306
  }
305
307
  }]);
@@ -1 +1 @@
1
- {"version":3,"names":["_graph","require","_layout","_presentation","_queryGraphIcons","_interopRequireDefault","e","__esModule","default","imageCache","Map","statusTokens","waiting","running","completed","failed","aborted","statusIconTokens","resourceTokens","START_ANGLE","Math","PI","STATUS_ICON_SIZE_RATIO","STATUS_ICON_BACKGROUND_RADIUS_RATIO","PROGRESS_WIDTH_RATIO","INNER_BORDER_WIDTH_RATIO","COUNTER_MAX_WIDTH_RATIO","LABEL_MAX_WIDTH_RATIO","COUNTER_FONT_SIZE","LABEL_FONT_SIZE","LABEL_GAP","RESOURCE_ICON_SIZE","cssValue","token","element","document","getComputedStyle","documentElement","getPropertyValue","trim","coloredSvgDataUrl","svg","color","markup","split","join","concat","encodeURIComponent","getCanvasImage","onSettled","Image","undefined","key","entry","get","image","state","listeners","Set","set","onload","forEach","listener","clear","onerror","src","add","QueryGraphCanvasBlock","exports","_CanvasBlock","_this","_classCallCheck","_len","arguments","length","args","Array","_key","_callSuper","redrawAfterImageLoad","performRender","_inherits","_createClass","value","renderMinimalisticBlock","ctx","renderQueryNode","renderSchematicView","renderDetailedView","context","_node$status","_node$label","meta","node","status","_ref","kind","_ref2","_slicedToArray","lineToken","baseToken","save","drawRunningOperation","getQueryGraphProgress","drawNodeShape","content","getQueryGraphNodeContent","_this$state","x","y","width","height","side","drawIcon","iconSvg","fallbackIconSvg","iconColorToken","canvas","fallbackIconColorToken","drawCounter","drawStatusIcon","drawLabel","label","name","restore","_this$state2","beginPath","arc","roundRect","fillStyle","fill","lineWidth","strokeStyle","stroke","progress","_this$state3","centerX","centerY","radius","progressWidth","endAngle","runningBase","runningLine","progressBase","progressLine","background","moveTo","closePath","_this$state4","maxFontSize","getScaleAdjustedFontSize","graph","cameraService","getCameraScale","fontFamily","textAlign","textBaseline","font","fontSize","fitCanvasFontSize","measureText","fillText","getQueryGraphStatusIconSvg","colorToken","_this$state5","backgroundRadius","iconX","iconY","fallbackSvg","fallbackColor","_entry","_entry2","drawImage","trimStart","_this$state6","cameraScale","labelGap","fitted","fitCanvasText","CanvasBlock"],"sources":["QueryGraphCanvasBlock.ts"],"sourcesContent":["/* eslint-disable no-param-reassign -- CanvasRenderingContext2D exposes drawing state as mutable properties. */\nimport {CanvasBlock, type TBlock} from '@gravity-ui/graph';\n\nimport type {QueryGraphNode, QueryGraphNodeStatus} from '../../../types/queryGraph';\nimport {getQueryGraphProgress} from '../helpers/layout';\nimport {\n fitCanvasFontSize,\n fitCanvasText,\n getQueryGraphNodeContent,\n getScaleAdjustedFontSize,\n} from '../helpers/presentation';\nimport {getQueryGraphStatusIconSvg} from './queryGraphIcons';\n\ntype QueryGraphBlockMeta = {\n node: QueryGraphNode;\n iconSvg: string;\n fallbackIconSvg: string;\n iconColorToken: string;\n fallbackIconColorToken: string;\n};\n\nexport type QueryGraphBlock = TBlock<QueryGraphBlockMeta>;\n\ntype ImageCacheEntry = {\n image: HTMLImageElement;\n state: 'loading' | 'loaded' | 'failed';\n listeners: Set<() => void>;\n};\n\nconst imageCache = new Map<string, ImageCacheEntry>();\nconst statusTokens = {\n 'not-started': ['--g-color-line-generic', '--g-color-base-float'],\n waiting: ['--g-color-text-misc-heavy', '--g-color-base-misc-light'],\n running: ['--g-color-line-generic', '--g-color-line-generic'],\n completed: ['--g-color-text-positive-heavy', '--g-color-base-positive-light'],\n failed: ['--g-color-text-danger-heavy', '--g-color-base-danger-light'],\n aborted: ['--g-color-text-complementary', '--g-color-base-generic'],\n} as const;\nconst statusIconTokens: Partial<Record<QueryGraphNodeStatus, string>> = {\n running: '--g-color-text-info',\n completed: '--g-color-text-positive-heavy',\n failed: '--g-color-text-danger-heavy',\n aborted: '--g-color-text-complementary',\n};\nconst resourceTokens = ['--g-color-line-generic', '--g-color-base-float'] as const;\nconst START_ANGLE = -Math.PI / 2;\nconst STATUS_ICON_SIZE_RATIO = 1 / 4;\nconst STATUS_ICON_BACKGROUND_RADIUS_RATIO = 1 / 6;\nconst PROGRESS_WIDTH_RATIO = 1 / 9;\nconst INNER_BORDER_WIDTH_RATIO = 1 / 25;\nconst COUNTER_MAX_WIDTH_RATIO = 7 / 9;\nconst LABEL_MAX_WIDTH_RATIO = 2;\nconst COUNTER_FONT_SIZE = 11;\nconst LABEL_FONT_SIZE = 9;\nconst LABEL_GAP = 4;\nconst RESOURCE_ICON_SIZE = 16;\n\nfunction cssValue(token: string, element?: Element) {\n if (typeof document === 'undefined') return '';\n return getComputedStyle(element ?? document.documentElement)\n .getPropertyValue(token)\n .trim();\n}\n\nfunction coloredSvgDataUrl(svg: string, color: string) {\n const markup = svg.split('currentColor').join(color || '#000');\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(markup)}`;\n}\n\nfunction getCanvasImage(svg: string, color: string, onSettled: () => void) {\n if (typeof Image === 'undefined') return undefined;\n const key = `${color}\\n${svg}`;\n let entry = imageCache.get(key);\n if (!entry) {\n const image = new Image();\n entry = {image, state: 'loading', listeners: new Set()};\n imageCache.set(key, entry);\n image.onload = () => {\n if (!entry) return;\n entry.state = 'loaded';\n entry.listeners.forEach((listener) => listener());\n entry.listeners.clear();\n };\n image.onerror = () => {\n if (!entry) return;\n entry.state = 'failed';\n entry.listeners.forEach((listener) => listener());\n entry.listeners.clear();\n };\n image.src = coloredSvgDataUrl(svg, color);\n }\n if (entry.state === 'loading') entry.listeners.add(onSettled);\n return entry;\n}\n\nexport class QueryGraphCanvasBlock extends CanvasBlock<QueryGraphBlock> {\n public override renderMinimalisticBlock(ctx: CanvasRenderingContext2D) {\n this.renderQueryNode(ctx);\n }\n\n public override renderSchematicView(ctx: CanvasRenderingContext2D) {\n this.renderQueryNode(ctx);\n }\n\n public override renderDetailedView(ctx: CanvasRenderingContext2D) {\n this.renderQueryNode(ctx);\n }\n\n private readonly redrawAfterImageLoad = () => this.performRender();\n\n private renderQueryNode(context: CanvasRenderingContext2D) {\n const {meta} = this.state;\n if (!meta?.node) return;\n const {node} = meta;\n const status = node.status ?? 'not-started';\n const [lineToken, baseToken] =\n node.kind === 'operation' ? statusTokens[status] : resourceTokens;\n\n context.save();\n if (node.kind === 'operation' && status === 'running') {\n this.drawRunningOperation(context, getQueryGraphProgress(node));\n } else {\n this.drawNodeShape(context, lineToken, baseToken);\n }\n\n const content = getQueryGraphNodeContent(node);\n if (content.kind === 'icon') {\n const {x, y, width, height} = this.state;\n const side = node.kind === 'operation' ? width / 2 : RESOURCE_ICON_SIZE;\n this.drawIcon(\n context,\n meta.iconSvg,\n meta.fallbackIconSvg,\n x + (width - side) / 2,\n y + (height - side) / 2,\n side,\n cssValue(meta.iconColorToken, context.canvas),\n cssValue(meta.fallbackIconColorToken, context.canvas),\n );\n } else if (content.kind === 'counter') {\n this.drawCounter(context, content.value);\n }\n\n if (node.kind === 'operation') this.drawStatusIcon(context, status);\n this.drawLabel(context, node.label ?? node.name, node.kind !== 'operation');\n context.restore();\n }\n\n private drawNodeShape(context: CanvasRenderingContext2D, lineToken: string, baseToken: string) {\n const {x, y, width, height, meta} = this.state;\n context.beginPath();\n if (meta?.node.kind === 'operation') {\n context.arc(x + width / 2, y + height / 2, width / 2 - 1, 0, Math.PI * 2);\n } else {\n context.roundRect(x + 1, y + 1, width - 2, height - 2, 12);\n }\n context.fillStyle = cssValue(baseToken, context.canvas);\n context.fill();\n context.lineWidth = 2;\n context.strokeStyle = cssValue(lineToken, context.canvas);\n context.stroke();\n }\n\n private drawRunningOperation(context: CanvasRenderingContext2D, progress: number) {\n const {x, y, width, height} = this.state;\n const centerX = x + width / 2;\n const centerY = y + height / 2;\n const radius = width / 2;\n const progressWidth = width * PROGRESS_WIDTH_RATIO;\n const endAngle = START_ANGLE + Math.PI * 2 * progress;\n const runningBase = cssValue('--g-color-line-generic', context.canvas);\n const runningLine = cssValue('--g-color-line-generic', context.canvas);\n const progressBase = cssValue('--g-color-base-info-light', context.canvas);\n const progressLine = cssValue('--g-color-text-info', context.canvas);\n const background = cssValue('--g-color-base-background', context.canvas);\n\n context.beginPath();\n context.arc(centerX, centerY, radius - progressWidth / 2, 0, Math.PI * 2);\n context.fillStyle = runningBase;\n context.fill();\n context.lineWidth = progressWidth;\n context.strokeStyle = runningLine;\n context.stroke();\n\n if (progress > 0) {\n context.beginPath();\n context.moveTo(centerX, centerY);\n context.arc(centerX, centerY, radius - progressWidth / 2, START_ANGLE, endAngle);\n context.closePath();\n context.fillStyle = progressBase;\n context.fill();\n\n context.beginPath();\n context.arc(centerX, centerY, radius - progressWidth / 2, START_ANGLE, endAngle);\n context.lineWidth = progressWidth;\n context.strokeStyle = progressLine;\n context.stroke();\n }\n\n context.beginPath();\n context.arc(centerX, centerY, radius - progressWidth, 0, Math.PI * 2);\n context.lineWidth = width * INNER_BORDER_WIDTH_RATIO;\n context.strokeStyle = background;\n context.stroke();\n }\n\n private drawCounter(context: CanvasRenderingContext2D, value: string) {\n const {x, y, width, height} = this.state;\n const maxFontSize = getScaleAdjustedFontSize(\n COUNTER_FONT_SIZE,\n this.context.graph.cameraService.getCameraScale(),\n );\n const fontFamily = cssValue('--g-font-family-sans', context.canvas);\n context.fillStyle = cssValue('--g-color-text-primary', context.canvas);\n context.textAlign = 'center';\n context.textBaseline = 'middle';\n context.font = `500 ${maxFontSize}px ${fontFamily}`;\n const fontSize = fitCanvasFontSize(\n maxFontSize,\n context.measureText(value).width,\n width * COUNTER_MAX_WIDTH_RATIO,\n );\n context.font = `500 ${fontSize}px ${fontFamily}`;\n context.fillText(value, x + width / 2, y + height / 2);\n }\n\n private drawStatusIcon(context: CanvasRenderingContext2D, status: QueryGraphNodeStatus) {\n const iconSvg = getQueryGraphStatusIconSvg(status);\n const colorToken = statusIconTokens[status];\n if (!iconSvg || !colorToken) return;\n const {x, y, width} = this.state;\n const side = width * STATUS_ICON_SIZE_RATIO;\n const backgroundRadius = width * STATUS_ICON_BACKGROUND_RADIUS_RATIO;\n const iconX = x + width - side;\n const iconY = y;\n\n context.beginPath();\n context.arc(iconX + side / 2, iconY + side / 2, backgroundRadius, 0, Math.PI * 2);\n context.fillStyle = cssValue('--g-color-base-background', context.canvas);\n context.fill();\n this.drawIcon(\n context,\n iconSvg,\n iconSvg,\n iconX,\n iconY,\n side,\n cssValue(colorToken, context.canvas),\n cssValue(colorToken, context.canvas),\n );\n }\n\n private drawIcon(\n context: CanvasRenderingContext2D,\n svg: string,\n fallbackSvg: string,\n x: number,\n y: number,\n side: number,\n color: string,\n fallbackColor: string,\n ) {\n let entry = getCanvasImage(svg, color, this.redrawAfterImageLoad);\n if (entry?.state === 'failed' && fallbackSvg !== svg) {\n entry = getCanvasImage(fallbackSvg, fallbackColor, this.redrawAfterImageLoad);\n }\n if (entry?.state === 'loaded') context.drawImage(entry.image, x, y, side, side);\n }\n\n private drawLabel(context: CanvasRenderingContext2D, label: string, trimStart: boolean) {\n const {x, y, width, height} = this.state;\n const cameraScale = this.context.graph.cameraService.getCameraScale();\n const fontSize = getScaleAdjustedFontSize(LABEL_FONT_SIZE, cameraScale);\n const labelGap = getScaleAdjustedFontSize(LABEL_GAP, cameraScale);\n context.fillStyle = cssValue('--g-color-text-primary', context.canvas);\n context.textAlign = 'center';\n context.textBaseline = 'top';\n context.font = `400 ${fontSize}px ${cssValue('--g-font-family-sans', context.canvas)}`;\n const fitted = fitCanvasText(context, label, width * LABEL_MAX_WIDTH_RATIO, trimStart);\n context.fillText(fitted, x + width / 2, y + height + labelGap);\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_graph","require","_layout","_presentation","_queryGraphIcons","_interopRequireDefault","e","__esModule","default","imageCache","Map","statusTokens","waiting","running","completed","failed","aborted","statusIconTokens","resourceTokens","START_ANGLE","Math","PI","STATUS_ICON_SIZE_RATIO","STATUS_ICON_BACKGROUND_RADIUS_RATIO","PROGRESS_WIDTH_RATIO","INNER_BORDER_WIDTH_RATIO","COUNTER_MAX_WIDTH_RATIO","LABEL_MAX_WIDTH_RATIO","COUNTER_FONT_SIZE","LABEL_FONT_SIZE","LABEL_GAP","RESOURCE_ICON_SIZE","cssValue","token","element","document","getComputedStyle","documentElement","getPropertyValue","trim","coloredSvgDataUrl","svg","color","markup","split","join","concat","encodeURIComponent","getCanvasImage","onSettled","Image","undefined","key","entry","get","image","state","listeners","Set","set","onload","forEach","listener","clear","onerror","src","add","QueryGraphCanvasBlock","exports","_CanvasBlock","_this","_classCallCheck","_len","arguments","length","args","Array","_key","_callSuper","redrawAfterImageLoad","performRender","_inherits","_createClass","value","renderMinimalisticBlock","ctx","renderQueryNode","renderSchematicView","renderDetailedView","context","_node$status","_node$label","meta","node","status","_ref","kind","_ref2","_slicedToArray","lineToken","baseToken","save","drawRunningOperation","getQueryGraphProgress","drawNodeShape","content","getQueryGraphNodeContent","_this$state","x","y","width","height","side","drawIcon","iconSvg","fallbackIconSvg","iconColorToken","canvas","fallbackIconColorToken","drawCounter","drawStatusIcon","drawLabel","label","name","restore","_this$state2","beginPath","arc","roundRect","fillStyle","fill","lineWidth","strokeStyle","stroke","progress","_this$state3","centerX","centerY","radius","progressWidth","endAngle","runningBase","runningLine","progressBase","progressLine","background","moveTo","closePath","_this$state4","maxFontSize","getScaleAdjustedFontSize","graph","cameraService","getCameraScale","fontFamily","textAlign","textBaseline","font","fontSize","fitCanvasFontSize","measureText","fillText","getQueryGraphStatusIconSvg","colorToken","_this$state5","backgroundRadius","iconX","iconY","fallbackSvg","fallbackColor","_entry","_entry2","drawImage","trimStart","_this$state6","cameraScale","labelGap","maxWidth","fitted","fitCanvasText","CanvasBlock"],"sources":["QueryGraphCanvasBlock.ts"],"sourcesContent":["/* eslint-disable no-param-reassign -- CanvasRenderingContext2D exposes drawing state as mutable properties. */\nimport {CanvasBlock, type TBlock} from '@gravity-ui/graph';\n\nimport type {QueryGraphNode, QueryGraphNodeStatus} from '../../../types/queryGraph';\nimport {getQueryGraphProgress} from '../helpers/layout';\nimport {\n fitCanvasFontSize,\n fitCanvasText,\n getQueryGraphNodeContent,\n getScaleAdjustedFontSize,\n} from '../helpers/presentation';\nimport {getQueryGraphStatusIconSvg} from './queryGraphIcons';\n\ntype QueryGraphBlockMeta = {\n node: QueryGraphNode;\n iconSvg: string;\n fallbackIconSvg: string;\n iconColorToken: string;\n fallbackIconColorToken: string;\n};\n\nexport type QueryGraphBlock = TBlock<QueryGraphBlockMeta>;\n\ntype ImageCacheEntry = {\n image: HTMLImageElement;\n state: 'loading' | 'loaded' | 'failed';\n listeners: Set<() => void>;\n};\n\nconst imageCache = new Map<string, ImageCacheEntry>();\nconst statusTokens = {\n 'not-started': ['--g-color-line-generic', '--g-color-base-float'],\n waiting: ['--g-color-text-misc-heavy', '--g-color-base-misc-light'],\n running: ['--g-color-line-generic', '--g-color-line-generic'],\n completed: ['--g-color-text-positive-heavy', '--g-color-base-positive-light'],\n failed: ['--g-color-text-danger-heavy', '--g-color-base-danger-light'],\n aborted: ['--g-color-text-complementary', '--g-color-base-generic'],\n} as const;\nconst statusIconTokens: Partial<Record<QueryGraphNodeStatus, string>> = {\n running: '--g-color-text-info',\n completed: '--g-color-text-positive-heavy',\n failed: '--g-color-text-danger-heavy',\n aborted: '--g-color-text-complementary',\n};\nconst resourceTokens = ['--g-color-line-generic', '--g-color-base-float'] as const;\nconst START_ANGLE = -Math.PI / 2;\nconst STATUS_ICON_SIZE_RATIO = 1 / 4;\nconst STATUS_ICON_BACKGROUND_RADIUS_RATIO = 1 / 6;\nconst PROGRESS_WIDTH_RATIO = 1 / 9;\nconst INNER_BORDER_WIDTH_RATIO = 1 / 25;\nconst COUNTER_MAX_WIDTH_RATIO = 7 / 9;\nconst LABEL_MAX_WIDTH_RATIO = 2;\nconst COUNTER_FONT_SIZE = 11;\nconst LABEL_FONT_SIZE = 9;\nconst LABEL_GAP = 4;\nconst RESOURCE_ICON_SIZE = 16;\n\nfunction cssValue(token: string, element?: Element) {\n if (typeof document === 'undefined') return '';\n return getComputedStyle(element ?? document.documentElement)\n .getPropertyValue(token)\n .trim();\n}\n\nfunction coloredSvgDataUrl(svg: string, color: string) {\n const markup = svg.split('currentColor').join(color || '#000');\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(markup)}`;\n}\n\nfunction getCanvasImage(svg: string, color: string, onSettled: () => void) {\n if (typeof Image === 'undefined') return undefined;\n const key = `${color}\\n${svg}`;\n let entry = imageCache.get(key);\n if (!entry) {\n const image = new Image();\n entry = {image, state: 'loading', listeners: new Set()};\n imageCache.set(key, entry);\n image.onload = () => {\n if (!entry) return;\n entry.state = 'loaded';\n entry.listeners.forEach((listener) => listener());\n entry.listeners.clear();\n };\n image.onerror = () => {\n if (!entry) return;\n entry.state = 'failed';\n entry.listeners.forEach((listener) => listener());\n entry.listeners.clear();\n };\n image.src = coloredSvgDataUrl(svg, color);\n }\n if (entry.state === 'loading') entry.listeners.add(onSettled);\n return entry;\n}\n\nexport class QueryGraphCanvasBlock extends CanvasBlock<QueryGraphBlock> {\n public override renderMinimalisticBlock(ctx: CanvasRenderingContext2D) {\n this.renderQueryNode(ctx);\n }\n\n public override renderSchematicView(ctx: CanvasRenderingContext2D) {\n this.renderQueryNode(ctx);\n }\n\n public override renderDetailedView(ctx: CanvasRenderingContext2D) {\n this.renderQueryNode(ctx);\n }\n\n private readonly redrawAfterImageLoad = () => this.performRender();\n\n private renderQueryNode(context: CanvasRenderingContext2D) {\n const {meta} = this.state;\n if (!meta?.node) return;\n const {node} = meta;\n const status = node.status ?? 'not-started';\n const [lineToken, baseToken] =\n node.kind === 'operation' ? statusTokens[status] : resourceTokens;\n\n context.save();\n if (node.kind === 'operation' && status === 'running') {\n this.drawRunningOperation(context, getQueryGraphProgress(node));\n } else {\n this.drawNodeShape(context, lineToken, baseToken);\n }\n\n const content = getQueryGraphNodeContent(node);\n if (content.kind === 'icon') {\n const {x, y, width, height} = this.state;\n const side = node.kind === 'operation' ? width / 2 : RESOURCE_ICON_SIZE;\n this.drawIcon(\n context,\n meta.iconSvg,\n meta.fallbackIconSvg,\n x + (width - side) / 2,\n y + (height - side) / 2,\n side,\n cssValue(meta.iconColorToken, context.canvas),\n cssValue(meta.fallbackIconColorToken, context.canvas),\n );\n } else if (content.kind === 'counter') {\n this.drawCounter(context, content.value);\n }\n\n if (node.kind === 'operation') this.drawStatusIcon(context, status);\n this.drawLabel(context, node.label ?? node.name, node.kind !== 'operation');\n context.restore();\n }\n\n private drawNodeShape(context: CanvasRenderingContext2D, lineToken: string, baseToken: string) {\n const {x, y, width, height, meta} = this.state;\n context.beginPath();\n if (meta?.node.kind === 'operation') {\n context.arc(x + width / 2, y + height / 2, width / 2 - 1, 0, Math.PI * 2);\n } else {\n context.roundRect(x + 1, y + 1, width - 2, height - 2, 12);\n }\n context.fillStyle = cssValue(baseToken, context.canvas);\n context.fill();\n context.lineWidth = 2;\n context.strokeStyle = cssValue(lineToken, context.canvas);\n context.stroke();\n }\n\n private drawRunningOperation(context: CanvasRenderingContext2D, progress: number) {\n const {x, y, width, height} = this.state;\n const centerX = x + width / 2;\n const centerY = y + height / 2;\n const radius = width / 2;\n const progressWidth = width * PROGRESS_WIDTH_RATIO;\n const endAngle = START_ANGLE + Math.PI * 2 * progress;\n const runningBase = cssValue('--g-color-line-generic', context.canvas);\n const runningLine = cssValue('--g-color-line-generic', context.canvas);\n const progressBase = cssValue('--g-color-base-info-light', context.canvas);\n const progressLine = cssValue('--g-color-text-info', context.canvas);\n const background = cssValue('--g-color-base-background', context.canvas);\n\n context.beginPath();\n context.arc(centerX, centerY, radius - progressWidth / 2, 0, Math.PI * 2);\n context.fillStyle = runningBase;\n context.fill();\n context.lineWidth = progressWidth;\n context.strokeStyle = runningLine;\n context.stroke();\n\n if (progress > 0) {\n context.beginPath();\n context.moveTo(centerX, centerY);\n context.arc(centerX, centerY, radius - progressWidth / 2, START_ANGLE, endAngle);\n context.closePath();\n context.fillStyle = progressBase;\n context.fill();\n\n context.beginPath();\n context.arc(centerX, centerY, radius - progressWidth / 2, START_ANGLE, endAngle);\n context.lineWidth = progressWidth;\n context.strokeStyle = progressLine;\n context.stroke();\n }\n\n context.beginPath();\n context.arc(centerX, centerY, radius - progressWidth, 0, Math.PI * 2);\n context.lineWidth = width * INNER_BORDER_WIDTH_RATIO;\n context.strokeStyle = background;\n context.stroke();\n }\n\n private drawCounter(context: CanvasRenderingContext2D, value: string) {\n const {x, y, width, height} = this.state;\n const maxFontSize = getScaleAdjustedFontSize(\n COUNTER_FONT_SIZE,\n this.context.graph.cameraService.getCameraScale(),\n );\n const fontFamily = cssValue('--g-font-family-sans', context.canvas);\n context.fillStyle = cssValue('--g-color-text-primary', context.canvas);\n context.textAlign = 'center';\n context.textBaseline = 'middle';\n context.font = `500 ${maxFontSize}px ${fontFamily}`;\n const fontSize = fitCanvasFontSize(\n maxFontSize,\n context.measureText(value).width,\n width * COUNTER_MAX_WIDTH_RATIO,\n );\n context.font = `500 ${fontSize}px ${fontFamily}`;\n context.fillText(value, x + width / 2, y + height / 2);\n }\n\n private drawStatusIcon(context: CanvasRenderingContext2D, status: QueryGraphNodeStatus) {\n const iconSvg = getQueryGraphStatusIconSvg(status);\n const colorToken = statusIconTokens[status];\n if (!iconSvg || !colorToken) return;\n const {x, y, width} = this.state;\n const side = width * STATUS_ICON_SIZE_RATIO;\n const backgroundRadius = width * STATUS_ICON_BACKGROUND_RADIUS_RATIO;\n const iconX = x + width - side;\n const iconY = y;\n\n context.beginPath();\n context.arc(iconX + side / 2, iconY + side / 2, backgroundRadius, 0, Math.PI * 2);\n context.fillStyle = cssValue('--g-color-base-background', context.canvas);\n context.fill();\n this.drawIcon(\n context,\n iconSvg,\n iconSvg,\n iconX,\n iconY,\n side,\n cssValue(colorToken, context.canvas),\n cssValue(colorToken, context.canvas),\n );\n }\n\n private drawIcon(\n context: CanvasRenderingContext2D,\n svg: string,\n fallbackSvg: string,\n x: number,\n y: number,\n side: number,\n color: string,\n fallbackColor: string,\n ) {\n let entry = getCanvasImage(svg, color, this.redrawAfterImageLoad);\n if (entry?.state === 'failed' && fallbackSvg !== svg) {\n entry = getCanvasImage(fallbackSvg, fallbackColor, this.redrawAfterImageLoad);\n }\n if (entry?.state === 'loaded') context.drawImage(entry.image, x, y, side, side);\n }\n\n private drawLabel(context: CanvasRenderingContext2D, label: string, trimStart: boolean) {\n const {x, y, width, height} = this.state;\n const cameraScale = this.context.graph.cameraService.getCameraScale();\n const fontSize = getScaleAdjustedFontSize(LABEL_FONT_SIZE, cameraScale);\n const labelGap = getScaleAdjustedFontSize(LABEL_GAP, cameraScale);\n // Keep the available screen width stable, just like the label's font size.\n const maxWidth = getScaleAdjustedFontSize(width * LABEL_MAX_WIDTH_RATIO, cameraScale);\n context.fillStyle = cssValue('--g-color-text-primary', context.canvas);\n context.textAlign = 'center';\n context.textBaseline = 'top';\n context.font = `400 ${fontSize}px ${cssValue('--g-font-family-sans', context.canvas)}`;\n const fitted = fitCanvasText(context, label, maxWidth, trimStart);\n context.fillText(fitted, x + width / 2, y + height + labelGap);\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,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;
@@ -13,12 +13,14 @@ var _jsxRuntime = require("react/jsx-runtime");
13
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
14
  var block = (0, _bemCnLite.default)('qp-tutorial-row');
15
15
  var TutorialRow = exports.TutorialRow = function TutorialRow(_ref) {
16
- var item = _ref.item;
16
+ var item = _ref.item,
17
+ renderLink = _ref.renderLink;
17
18
  var href = item.href,
18
19
  id = item.id,
19
20
  title = item.title;
20
21
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_RowLink.RowLink, {
21
22
  href: href,
23
+ renderLink: renderLink,
22
24
  className: block(),
23
25
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_uikit.Flex, {
24
26
  gap: 1,
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireDefault","require","_uikit","_RowLink","_bemCnLite","_jsxRuntime","e","__esModule","default","block","cn","TutorialRow","exports","_ref","item","href","id","title","_jsx","RowLink","className","children","_jsxs","Flex","gap","alignItems","Text","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,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAEA,IAAAE,QAAA,GAAAF,OAAA;AACA,IAAAG,UAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACAA,OAAA;AAA4B,IAAAI,WAAA,GAAAJ,OAAA;AAAA,SAAAD,uBAAAM,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE5B,IAAMG,KAAK,GAAG,IAAAC,kBAAE,EAAC,iBAAiB,CAAC;AAM5B,IAAMC,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,SAAdA,WAAWA,CAAAE,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,oBACI,IAAAC,eAAA,EAACC,gBAAO;IAACJ,IAAI,EAAEA,IAAK;IAACK,SAAS,EAAEX,KAAK,CAAC,CAAE;IAAAY,QAAA,eACpC,IAAAC,gBAAA,EAACC,WAAI;MAACC,GAAG,EAAE,CAAE;MAACC,UAAU,EAAC,QAAQ;MAACL,SAAS,EAAEX,KAAK,CAAC,SAAS,CAAE;MAAAY,QAAA,gBAC1D,IAAAC,gBAAA,EAACI,WAAI;QAACC,KAAK,EAAC,WAAW;QAAAN,QAAA,GAAEL,EAAE,EAAC,GAAC;MAAA,CAAM,CAAC,eACpC,IAAAE,eAAA,EAACQ,WAAI;QAACE,QAAQ;QAAAP,QAAA,EAAEJ;MAAK,CAAO,CAAC;IAAA,CAC3B;EAAC,CACF,CAAC;AAElB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_uikit","_RowLink","_bemCnLite","_jsxRuntime","e","__esModule","default","block","cn","TutorialRow","exports","_ref","item","renderLink","href","id","title","_jsx","RowLink","className","children","_jsxs","Flex","gap","alignItems","Text","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,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAGA,IAAAE,QAAA,GAAAF,OAAA;AACA,IAAAG,UAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACAA,OAAA;AAA4B,IAAAI,WAAA,GAAAJ,OAAA;AAAA,SAAAD,uBAAAM,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE5B,IAAMG,KAAK,GAAG,IAAAC,kBAAE,EAAC,iBAAiB,CAAC;AAO5B,IAAMC,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,SAAdA,WAAWA,CAAAE,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,oBACI,IAAAC,eAAA,EAACC,gBAAO;IAACJ,IAAI,EAAEA,IAAK;IAACD,UAAU,EAAEA,UAAW;IAACM,SAAS,EAAEZ,KAAK,CAAC,CAAE;IAAAa,QAAA,eAC5D,IAAAC,gBAAA,EAACC,WAAI;MAACC,GAAG,EAAE,CAAE;MAACC,UAAU,EAAC,QAAQ;MAACL,SAAS,EAAEZ,KAAK,CAAC,SAAS,CAAE;MAAAa,QAAA,gBAC1D,IAAAC,gBAAA,EAACI,WAAI;QAACC,KAAK,EAAC,WAAW;QAAAN,QAAA,GAAEL,EAAE,EAAC,GAAC;MAAA,CAAM,CAAC,eACpC,IAAAE,eAAA,EAACQ,WAAI;QAACE,QAAQ;QAAAP,QAAA,EAAEJ;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;
@@ -14,7 +14,8 @@ var _jsxRuntime = require("react/jsx-runtime");
14
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
15
  var block = (0, _bemCnLite.default)('qp-tutorial-search-row');
16
16
  var TutorialSearchRow = exports.TutorialSearchRow = function TutorialSearchRow(_ref) {
17
- var item = _ref.item;
17
+ var item = _ref.item,
18
+ renderLink = _ref.renderLink;
18
19
  var href = item.href,
19
20
  id = item.id,
20
21
  title = item.title,
@@ -23,6 +24,7 @@ var TutorialSearchRow = exports.TutorialSearchRow = function TutorialSearchRow(_
23
24
  query: query,
24
25
  language: _MonacoEditor.MonacoLanguage.YQL,
25
26
  href: href,
27
+ renderLink: renderLink,
26
28
  className: block(),
27
29
  header: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_uikit.Flex, {
28
30
  gap: 2,
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireDefault","require","_uikit","_MonacoEditor","_SearchRowLayout","_bemCnLite","_jsxRuntime","e","__esModule","default","block","cn","TutorialSearchRow","exports","_ref","item","href","id","title","query","_jsx","SearchRowLayout","language","MonacoLanguage","YQL","className","header","_jsxs","Flex","gap","alignItems","children","Text","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,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAEA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,gBAAA,GAAAH,OAAA;AACAA,OAAA;AACA,IAAAI,UAAA,GAAAL,sBAAA,CAAAC,OAAA;AAA6B,IAAAK,WAAA,GAAAL,OAAA;AAAA,SAAAD,uBAAAO,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE7B,IAAMG,KAAK,GAAG,IAAAC,kBAAE,EAAC,wBAAwB,CAAC;AAMnC,IAAMC,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAAG,SAApBA,iBAAiBA,CAAAE,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,oBACI,IAAAC,eAAA,EAACC,gCAAe;IACZF,KAAK,EAAEA,KAAM;IACbG,QAAQ,EAAEC,4BAAc,CAACC,GAAI;IAC7BR,IAAI,EAAEA,IAAK;IACXS,SAAS,EAAEf,KAAK,CAAC,CAAE;IACnBgB,MAAM,eACF,IAAAC,gBAAA,EAACC,WAAI;MAACC,GAAG,EAAE,CAAE;MAACC,UAAU,EAAC,QAAQ;MAACL,SAAS,EAAEf,KAAK,CAAC,QAAQ,CAAE;MAAAqB,QAAA,gBACzD,IAAAJ,gBAAA,EAACK,WAAI;QAACC,KAAK,EAAC,WAAW;QAAAF,QAAA,GAAEd,EAAE,EAAC,GAAC;MAAA,CAAM,CAAC,eACpC,IAAAG,eAAA,EAACY,WAAI;QAACE,QAAQ;QAAAH,QAAA,EAAEb;MAAK,CAAO,CAAC;IAAA,CAC3B;EACT,CACJ,CAAC;AAEV,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_uikit","_MonacoEditor","_SearchRowLayout","_bemCnLite","_jsxRuntime","e","__esModule","default","block","cn","TutorialSearchRow","exports","_ref","item","renderLink","href","id","title","query","_jsx","SearchRowLayout","language","MonacoLanguage","YQL","className","header","_jsxs","Flex","gap","alignItems","children","Text","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,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AAGA,IAAAE,aAAA,GAAAF,OAAA;AACA,IAAAG,gBAAA,GAAAH,OAAA;AACAA,OAAA;AACA,IAAAI,UAAA,GAAAL,sBAAA,CAAAC,OAAA;AAA6B,IAAAK,WAAA,GAAAL,OAAA;AAAA,SAAAD,uBAAAO,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE7B,IAAMG,KAAK,GAAG,IAAAC,kBAAE,EAAC,wBAAwB,CAAC;AAOnC,IAAMC,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAAG,SAApBA,iBAAiBA,CAAAE,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,oBACI,IAAAC,eAAA,EAACC,gCAAe;IACZF,KAAK,EAAEA,KAAM;IACbG,QAAQ,EAAEC,4BAAc,CAACC,GAAI;IAC7BR,IAAI,EAAEA,IAAK;IACXD,UAAU,EAAEA,UAAW;IACvBU,SAAS,EAAEhB,KAAK,CAAC,CAAE;IACnBiB,MAAM,eACF,IAAAC,gBAAA,EAACC,WAAI;MAACC,GAAG,EAAE,CAAE;MAACC,UAAU,EAAC,QAAQ;MAACL,SAAS,EAAEhB,KAAK,CAAC,QAAQ,CAAE;MAAAsB,QAAA,gBACzD,IAAAJ,gBAAA,EAACK,WAAI;QAACC,KAAK,EAAC,WAAW;QAAAF,QAAA,GAAEd,EAAE,EAAC,GAAC;MAAA,CAAM,CAAC,eACpC,IAAAG,eAAA,EAACY,WAAI;QAACE,QAAQ;QAAAH,QAAA,EAAEb;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;
@@ -12,16 +12,19 @@ var _jsxRuntime = require("react/jsx-runtime");
12
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
13
  var TutorialRowContent = exports.TutorialRowContent = function TutorialRowContent(_ref) {
14
14
  var item = _ref.item,
15
- variant = _ref.variant;
15
+ variant = _ref.variant,
16
+ renderLink = _ref.renderLink;
16
17
  if ('header' in item) {
17
18
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_HistoryGroupHeader.HistoryGroupHeader, {
18
19
  title: item.header
19
20
  });
20
21
  }
21
22
  return variant === 'search' ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_TutorialSearchRow.TutorialSearchRow, {
22
- item: item
23
+ item: item,
24
+ renderLink: renderLink
23
25
  }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_TutorialRow.TutorialRow, {
24
- item: item
26
+ item: item,
27
+ renderLink: renderLink
25
28
  });
26
29
  };
27
30
  // #sourceMappingURL=TutorialRowContent.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireDefault","require","_HistoryGroupHeader","_TutorialRow","_TutorialSearchRow","_jsxRuntime","e","__esModule","default","TutorialRowContent","exports","_ref","item","variant","_jsx","HistoryGroupHeader","title","header","TutorialSearchRow","TutorialRow"],"sources":["TutorialRowContent.tsx"],"sourcesContent":["import React from 'react';\nimport type {QueryListRowRenderData} from '../../types/queryList';\nimport type {TutorialHistoryRow} from '../../types/tutorial';\nimport {HistoryGroupHeader} from '../../components/HistoryGroupHeader';\nimport {TutorialRow} from '../../modules/TutorialRow';\nimport {TutorialSearchRow} from '../../modules/TutorialSearchRow';\n\nexport const TutorialRowContent = <T extends TutorialHistoryRow>({\n item,\n variant,\n}: QueryListRowRenderData<T>) => {\n if ('header' in item) {\n return <HistoryGroupHeader title={item.header} />;\n }\n\n return variant === 'search' ? <TutorialSearchRow item={item} /> : <TutorialRow item={item} />;\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAGA,IAAAC,mBAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAF,OAAA;AACA,IAAAG,kBAAA,GAAAH,OAAA;AAAkE,IAAAI,WAAA,GAAAJ,OAAA;AAAA,SAAAD,uBAAAM,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE3D,IAAMG,kBAAkB,GAAAC,OAAA,CAAAD,kBAAA,GAAG,SAArBA,kBAAkBA,CAAAE,IAAA,EAGE;EAAA,IAF7BC,IAAI,GAAAD,IAAA,CAAJC,IAAI;IACJC,OAAO,GAAAF,IAAA,CAAPE,OAAO;EAEP,IAAI,QAAQ,IAAID,IAAI,EAAE;IAClB,oBAAO,IAAAE,eAAA,EAACC,sCAAkB;MAACC,KAAK,EAAEJ,IAAI,CAACK;IAAO,CAAE,CAAC;EACrD;EAEA,OAAOJ,OAAO,KAAK,QAAQ,gBAAG,IAAAC,eAAA,EAACI,oCAAiB;IAACN,IAAI,EAAEA;EAAK,CAAE,CAAC,gBAAG,IAAAE,eAAA,EAACK,wBAAW;IAACP,IAAI,EAAEA;EAAK,CAAE,CAAC;AACjG,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_HistoryGroupHeader","_TutorialRow","_TutorialSearchRow","_jsxRuntime","e","__esModule","default","TutorialRowContent","exports","_ref","item","variant","renderLink","_jsx","HistoryGroupHeader","title","header","TutorialSearchRow","TutorialRow"],"sources":["TutorialRowContent.tsx"],"sourcesContent":["import React from 'react';\nimport type {QueryListRowRenderData} from '../../types/queryList';\nimport type {TutorialHistoryRow} from '../../types/tutorial';\nimport {HistoryGroupHeader} from '../../components/HistoryGroupHeader';\nimport {TutorialRow} from '../../modules/TutorialRow';\nimport {TutorialSearchRow} from '../../modules/TutorialSearchRow';\n\nexport const TutorialRowContent = <T extends TutorialHistoryRow>({\n item,\n variant,\n renderLink,\n}: QueryListRowRenderData<T>) => {\n if ('header' in item) {\n return <HistoryGroupHeader title={item.header} />;\n }\n\n return variant === 'search' ? (\n <TutorialSearchRow item={item} renderLink={renderLink} />\n ) : (\n <TutorialRow item={item} renderLink={renderLink} />\n );\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAGA,IAAAC,mBAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAF,OAAA;AACA,IAAAG,kBAAA,GAAAH,OAAA;AAAkE,IAAAI,WAAA,GAAAJ,OAAA;AAAA,SAAAD,uBAAAM,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAE3D,IAAMG,kBAAkB,GAAAC,OAAA,CAAAD,kBAAA,GAAG,SAArBA,kBAAkBA,CAAAE,IAAA,EAIE;EAAA,IAH7BC,IAAI,GAAAD,IAAA,CAAJC,IAAI;IACJC,OAAO,GAAAF,IAAA,CAAPE,OAAO;IACPC,UAAU,GAAAH,IAAA,CAAVG,UAAU;EAEV,IAAI,QAAQ,IAAIF,IAAI,EAAE;IAClB,oBAAO,IAAAG,eAAA,EAACC,sCAAkB;MAACC,KAAK,EAAEL,IAAI,CAACM;IAAO,CAAE,CAAC;EACrD;EAEA,OAAOL,OAAO,KAAK,QAAQ,gBACvB,IAAAE,eAAA,EAACI,oCAAiB;IAACP,IAAI,EAAEA,IAAK;IAACE,UAAU,EAAEA;EAAW,CAAE,CAAC,gBAEzD,IAAAC,eAAA,EAACK,wBAAW;IAACR,IAAI,EAAEA,IAAK;IAACE,UAAU,EAAEA;EAAW,CAAE,CACrD;AACL,CAAC","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { QueryListFilterConfig, QueryListItem, QueryListSearchConfig } from '../../types/queryList';
2
+ import type { QueryListFilterConfig, QueryListItem, QueryListLinkRenderer, QueryListRowRenderData, QueryListSearchConfig } from '../../types/queryList';
3
3
  import type { TutorialHistoryRow } from '../../types/tutorial';
4
4
  import './TutorialsHistory.scss';
5
5
  export type TutorialsHistoryProps<T extends TutorialHistoryRow = TutorialHistoryRow> = {
@@ -10,6 +10,11 @@ export type TutorialsHistoryProps<T extends TutorialHistoryRow = TutorialHistory
10
10
  filter?: QueryListFilterConfig;
11
11
  items: QueryListItem<T>[];
12
12
  selectedRowId?: T['id'];
13
+ renderRowItem?: (data: QueryListRowRenderData<T>) => React.ReactNode;
13
14
  onListItemClick?: (item: QueryListItem<T>) => void;
15
+ hasMore?: boolean;
16
+ loading?: boolean;
17
+ onLoadMore?: () => void;
18
+ renderLink?: QueryListLinkRenderer;
14
19
  };
15
- export declare const TutorialsHistory: <T extends TutorialHistoryRow>({ title, logo, search, filter, items, selectedRowId, onListItemClick, className, }: TutorialsHistoryProps<T>) => React.JSX.Element;
20
+ export declare const TutorialsHistory: <T extends TutorialHistoryRow>({ title, logo, search, filter, items, selectedRowId, renderRowItem, onListItemClick, hasMore, loading, onLoadMore, renderLink, className, }: TutorialsHistoryProps<T>) => React.JSX.Element;
@@ -17,7 +17,7 @@ var _HistoryHeader = require("../../modules/HistoryHeader");
17
17
  var _HistoryLayout = require("../../modules/HistoryLayout");
18
18
  var _RowsList = require("../../modules/RowsList");
19
19
  var _i18n = _interopRequireDefault(require("./i18n"));
20
- var _getListKey = require("../../helpers/getListKey");
20
+ var _useListKey = require("../../helpers/useListKey");
21
21
  var _TutorialRowContent = require("./TutorialRowContent");
22
22
  var _bemCnLite = _interopRequireDefault(require("bem-cn-lite"));
23
23
  require("./TutorialsHistory.css");
@@ -32,11 +32,17 @@ var TutorialsHistory = exports.TutorialsHistory = function TutorialsHistory(_ref
32
32
  filter = _ref.filter,
33
33
  items = _ref.items,
34
34
  selectedRowId = _ref.selectedRowId,
35
+ renderRowItem = _ref.renderRowItem,
35
36
  onListItemClick = _ref.onListItemClick,
37
+ hasMore = _ref.hasMore,
38
+ loading = _ref.loading,
39
+ onLoadMore = _ref.onLoadMore,
40
+ renderLink = _ref.renderLink,
36
41
  className = _ref.className;
37
42
  var fullSearchAvailable = search.fullSearchAvailable !== false;
38
43
  var showSearchResults = Boolean(fullSearchAvailable && search.fullSearch && ((_search$value = search.value) === null || _search$value === void 0 ? void 0 : _search$value.trim()));
39
44
  var rowVariant = showSearchResults ? 'search' : 'default';
45
+ var listKey = (0, _useListKey.useListKey)(items, rowVariant, Boolean(onLoadMore));
40
46
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_HistoryLayout.HistoryLayout, {
41
47
  className: block(null, className),
42
48
  title: title || (0, _i18n.default)('title_tutorials'),
@@ -54,11 +60,15 @@ var TutorialsHistory = exports.TutorialsHistory = function TutorialsHistory(_ref
54
60
  rowVariant: rowVariant,
55
61
  selectedRowId: selectedRowId,
56
62
  renderRow: function renderRow(data) {
57
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_TutorialRowContent.TutorialRowContent, (0, _objectSpread2.default)({}, data));
63
+ return renderRowItem ? renderRowItem(data) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_TutorialRowContent.TutorialRowContent, (0, _objectSpread2.default)({}, data));
58
64
  },
59
65
  showFiltersHint: Boolean(filter),
66
+ hasMore: hasMore,
67
+ loading: loading,
68
+ onLoadMore: onLoadMore,
69
+ renderLink: renderLink,
60
70
  onItemClick: onListItemClick
61
- }, (0, _getListKey.getListKey)(items, rowVariant))
71
+ }, listKey)
62
72
  });
63
73
  };
64
74
  // #sourceMappingURL=TutorialsHistory.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireDefault","require","_HistoryHeader","_HistoryLayout","_RowsList","_i18n","_getListKey","_TutorialRowContent","_bemCnLite","_jsxRuntime","e","__esModule","default","block","cn","TutorialsHistory","exports","_ref","_search$value","title","logo","search","filter","items","selectedRowId","onListItemClick","className","fullSearchAvailable","showSearchResults","Boolean","fullSearch","value","trim","rowVariant","_jsx","HistoryLayout","i18n","header","HistoryHeader","hasClear","onUpdate","children","RowsList","renderRow","data","TutorialRowContent","_objectSpread","showFiltersHint","onItemClick","getListKey"],"sources":["TutorialsHistory.tsx"],"sourcesContent":["import React from 'react';\nimport {HistoryHeader} from '../../modules/HistoryHeader';\nimport {HistoryLayout} from '../../modules/HistoryLayout';\nimport {RowsList} from '../../modules/RowsList';\nimport i18n from './i18n';\nimport type {\n QueryListFilterConfig,\n QueryListItem,\n QueryListSearchConfig,\n} from '../../types/queryList';\nimport type {TutorialHistoryRow} from '../../types/tutorial';\nimport {getListKey} from '../../helpers/getListKey';\nimport {TutorialRowContent} from './TutorialRowContent';\nimport cn from 'bem-cn-lite';\nimport './TutorialsHistory.scss';\n\nexport type TutorialsHistoryProps<T extends TutorialHistoryRow = TutorialHistoryRow> = {\n className?: string;\n title?: string;\n logo?: React.ReactNode;\n search: QueryListSearchConfig;\n filter?: QueryListFilterConfig;\n items: QueryListItem<T>[];\n selectedRowId?: T['id'];\n onListItemClick?: (item: QueryListItem<T>) => void;\n};\n\nconst block = cn('qp-tutorials-history');\n\nexport const TutorialsHistory = <T extends TutorialHistoryRow>({\n title,\n logo,\n search,\n filter,\n items,\n selectedRowId,\n onListItemClick,\n className,\n}: TutorialsHistoryProps<T>) => {\n const fullSearchAvailable = search.fullSearchAvailable !== false;\n const showSearchResults = Boolean(\n fullSearchAvailable && search.fullSearch && search.value?.trim(),\n );\n const rowVariant = showSearchResults ? 'search' : 'default';\n\n return (\n <HistoryLayout\n className={block(null, className)}\n title={title || i18n('title_tutorials')}\n logo={logo}\n header={\n <HistoryHeader\n search={search.value}\n fullSearch={search.fullSearch}\n fullSearchAvailable={fullSearchAvailable}\n hasClear={search.hasClear}\n filter={filter}\n onUpdate={search.onUpdate}\n />\n }\n >\n <RowsList\n key={getListKey(items, rowVariant)}\n items={items}\n rowVariant={rowVariant}\n selectedRowId={selectedRowId}\n renderRow={(data) => <TutorialRowContent {...data} />}\n showFiltersHint={Boolean(filter)}\n onItemClick={onListItemClick}\n />\n </HistoryLayout>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,cAAA,GAAAD,OAAA;AACA,IAAAE,cAAA,GAAAF,OAAA;AACA,IAAAG,SAAA,GAAAH,OAAA;AACA,IAAAI,KAAA,GAAAL,sBAAA,CAAAC,OAAA;AAOA,IAAAK,WAAA,GAAAL,OAAA;AACA,IAAAM,mBAAA,GAAAN,OAAA;AACA,IAAAO,UAAA,GAAAR,sBAAA,CAAAC,OAAA;AACAA,OAAA;AAAiC,IAAAQ,WAAA,GAAAR,OAAA;AAAA,SAAAD,uBAAAU,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAajC,IAAMG,KAAK,GAAG,IAAAC,kBAAE,EAAC,sBAAsB,CAAC;AAEjC,IAAMC,gBAAgB,GAAAC,OAAA,CAAAD,gBAAA,GAAG,SAAnBA,gBAAgBA,CAAAE,IAAA,EASG;EAAA,IAAAC,aAAA;EAAA,IAR5BC,KAAK,GAAAF,IAAA,CAALE,KAAK;IACLC,IAAI,GAAAH,IAAA,CAAJG,IAAI;IACJC,MAAM,GAAAJ,IAAA,CAANI,MAAM;IACNC,MAAM,GAAAL,IAAA,CAANK,MAAM;IACNC,KAAK,GAAAN,IAAA,CAALM,KAAK;IACLC,aAAa,GAAAP,IAAA,CAAbO,aAAa;IACbC,eAAe,GAAAR,IAAA,CAAfQ,eAAe;IACfC,SAAS,GAAAT,IAAA,CAATS,SAAS;EAET,IAAMC,mBAAmB,GAAGN,MAAM,CAACM,mBAAmB,KAAK,KAAK;EAChE,IAAMC,iBAAiB,GAAGC,OAAO,CAC7BF,mBAAmB,IAAIN,MAAM,CAACS,UAAU,MAAAZ,aAAA,GAAIG,MAAM,CAACU,KAAK,cAAAb,aAAA,uBAAZA,aAAA,CAAcc,IAAI,CAAC,CAAC,CACpE,CAAC;EACD,IAAMC,UAAU,GAAGL,iBAAiB,GAAG,QAAQ,GAAG,SAAS;EAE3D,oBACI,IAAAM,eAAA,EAACC,4BAAa;IACVT,SAAS,EAAEb,KAAK,CAAC,IAAI,EAAEa,SAAS,CAAE;IAClCP,KAAK,EAAEA,KAAK,IAAI,IAAAiB,aAAI,EAAC,iBAAiB,CAAE;IACxChB,IAAI,EAAEA,IAAK;IACXiB,MAAM,eACF,IAAAH,eAAA,EAACI,4BAAa;MACVjB,MAAM,EAAEA,MAAM,CAACU,KAAM;MACrBD,UAAU,EAAET,MAAM,CAACS,UAAW;MAC9BH,mBAAmB,EAAEA,mBAAoB;MACzCY,QAAQ,EAAElB,MAAM,CAACkB,QAAS;MAC1BjB,MAAM,EAAEA,MAAO;MACfkB,QAAQ,EAAEnB,MAAM,CAACmB;IAAS,CAC7B,CACJ;IAAAC,QAAA,eAED,IAAAP,eAAA,EAACQ,kBAAQ;MAELnB,KAAK,EAAEA,KAAM;MACbU,UAAU,EAAEA,UAAW;MACvBT,aAAa,EAAEA,aAAc;MAC7BmB,SAAS,EAAE,SAAXA,SAASA,CAAGC,IAAI;QAAA,oBAAK,IAAAV,eAAA,EAACW,sCAAkB,MAAAC,sBAAA,MAAKF,IAAI,CAAG,CAAC;MAAA,CAAC;MACtDG,eAAe,EAAElB,OAAO,CAACP,MAAM,CAAE;MACjC0B,WAAW,EAAEvB;IAAgB,GANxB,IAAAwB,sBAAU,EAAC1B,KAAK,EAAEU,UAAU,CAOpC;EAAC,CACS,CAAC;AAExB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireDefault","require","_HistoryHeader","_HistoryLayout","_RowsList","_i18n","_useListKey","_TutorialRowContent","_bemCnLite","_jsxRuntime","e","__esModule","default","block","cn","TutorialsHistory","exports","_ref","_search$value","title","logo","search","filter","items","selectedRowId","renderRowItem","onListItemClick","hasMore","loading","onLoadMore","renderLink","className","fullSearchAvailable","showSearchResults","Boolean","fullSearch","value","trim","rowVariant","listKey","useListKey","_jsx","HistoryLayout","i18n","header","HistoryHeader","hasClear","onUpdate","children","RowsList","renderRow","data","TutorialRowContent","_objectSpread","showFiltersHint","onItemClick"],"sources":["TutorialsHistory.tsx"],"sourcesContent":["import React from 'react';\nimport {HistoryHeader} from '../../modules/HistoryHeader';\nimport {HistoryLayout} from '../../modules/HistoryLayout';\nimport {RowsList} from '../../modules/RowsList';\nimport i18n from './i18n';\nimport type {\n QueryListFilterConfig,\n QueryListItem,\n QueryListLinkRenderer,\n QueryListRowRenderData,\n QueryListSearchConfig,\n} from '../../types/queryList';\nimport type {TutorialHistoryRow} from '../../types/tutorial';\nimport {useListKey} from '../../helpers/useListKey';\nimport {TutorialRowContent} from './TutorialRowContent';\nimport cn from 'bem-cn-lite';\nimport './TutorialsHistory.scss';\n\nexport type TutorialsHistoryProps<T extends TutorialHistoryRow = TutorialHistoryRow> = {\n className?: string;\n title?: string;\n logo?: React.ReactNode;\n search: QueryListSearchConfig;\n filter?: QueryListFilterConfig;\n items: QueryListItem<T>[];\n selectedRowId?: T['id'];\n renderRowItem?: (data: QueryListRowRenderData<T>) => React.ReactNode;\n onListItemClick?: (item: QueryListItem<T>) => void;\n hasMore?: boolean;\n loading?: boolean;\n onLoadMore?: () => void;\n renderLink?: QueryListLinkRenderer;\n};\n\nconst block = cn('qp-tutorials-history');\n\nexport const TutorialsHistory = <T extends TutorialHistoryRow>({\n title,\n logo,\n search,\n filter,\n items,\n selectedRowId,\n renderRowItem,\n onListItemClick,\n hasMore,\n loading,\n onLoadMore,\n renderLink,\n className,\n}: TutorialsHistoryProps<T>) => {\n const fullSearchAvailable = search.fullSearchAvailable !== false;\n const showSearchResults = Boolean(\n fullSearchAvailable && search.fullSearch && search.value?.trim(),\n );\n const rowVariant = showSearchResults ? 'search' : 'default';\n const listKey = useListKey(items, rowVariant, Boolean(onLoadMore));\n\n return (\n <HistoryLayout\n className={block(null, className)}\n title={title || i18n('title_tutorials')}\n logo={logo}\n header={\n <HistoryHeader\n search={search.value}\n fullSearch={search.fullSearch}\n fullSearchAvailable={fullSearchAvailable}\n hasClear={search.hasClear}\n filter={filter}\n onUpdate={search.onUpdate}\n />\n }\n >\n <RowsList\n key={listKey}\n items={items}\n rowVariant={rowVariant}\n selectedRowId={selectedRowId}\n renderRow={(data) =>\n renderRowItem ? renderRowItem(data) : <TutorialRowContent {...data} />\n }\n showFiltersHint={Boolean(filter)}\n hasMore={hasMore}\n loading={loading}\n onLoadMore={onLoadMore}\n renderLink={renderLink}\n onItemClick={onListItemClick}\n />\n </HistoryLayout>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -5,3 +5,8 @@ export default meta;
5
5
  type Story = StoryObj<typeof TutorialsHistory>;
6
6
  export declare const Default: Story;
7
7
  export declare const Empty: Story;
8
+ export declare const InitialLoading: Story;
9
+ export declare const Paginated: Story;
10
+ export declare const LoadingMore: Story;
11
+ export declare const RouterLinks: Story;
12
+ export declare const CustomRowRenderer: Story;