@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.
- package/README.md +34 -3
- package/build/cjs/components/QueryGraph/internal/QueryGraphCanvasBlock.js +3 -1
- package/build/cjs/components/QueryGraph/internal/QueryGraphCanvasBlock.js.map +1 -1
- package/build/cjs/modules/TutorialRow/TutorialRow.d.ts +3 -1
- package/build/cjs/modules/TutorialRow/TutorialRow.js +3 -1
- package/build/cjs/modules/TutorialRow/TutorialRow.js.map +1 -1
- package/build/cjs/modules/TutorialSearchRow/TutorialSearchRow.d.ts +3 -1
- package/build/cjs/modules/TutorialSearchRow/TutorialSearchRow.js +3 -1
- package/build/cjs/modules/TutorialSearchRow/TutorialSearchRow.js.map +1 -1
- package/build/cjs/widgets/TutorialsHistory/TutorialRowContent.d.ts +1 -1
- package/build/cjs/widgets/TutorialsHistory/TutorialRowContent.js +6 -3
- package/build/cjs/widgets/TutorialsHistory/TutorialRowContent.js.map +1 -1
- package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.d.ts +7 -2
- package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.js +13 -3
- package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.js.map +1 -1
- package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.stories.d.ts +5 -0
- package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.stories.js +244 -1
- package/build/cjs/widgets/TutorialsHistory/TutorialsHistory.stories.js.map +1 -1
- package/build/esm/components/QueryGraph/internal/QueryGraphCanvasBlock.js +3 -1
- package/build/esm/components/QueryGraph/internal/QueryGraphCanvasBlock.js.map +1 -1
- package/build/esm/modules/TutorialRow/TutorialRow.d.ts +3 -1
- package/build/esm/modules/TutorialRow/TutorialRow.js +3 -1
- package/build/esm/modules/TutorialRow/TutorialRow.js.map +1 -1
- package/build/esm/modules/TutorialSearchRow/TutorialSearchRow.d.ts +3 -1
- package/build/esm/modules/TutorialSearchRow/TutorialSearchRow.js +3 -1
- package/build/esm/modules/TutorialSearchRow/TutorialSearchRow.js.map +1 -1
- package/build/esm/widgets/TutorialsHistory/TutorialRowContent.d.ts +1 -1
- package/build/esm/widgets/TutorialsHistory/TutorialRowContent.js +6 -3
- package/build/esm/widgets/TutorialsHistory/TutorialRowContent.js.map +1 -1
- package/build/esm/widgets/TutorialsHistory/TutorialsHistory.d.ts +7 -2
- package/build/esm/widgets/TutorialsHistory/TutorialsHistory.js +13 -3
- package/build/esm/widgets/TutorialsHistory/TutorialsHistory.js.map +1 -1
- package/build/esm/widgets/TutorialsHistory/TutorialsHistory.stories.d.ts +5 -0
- package/build/esm/widgets/TutorialsHistory/TutorialsHistory.stories.js +244 -1
- package/build/esm/widgets/TutorialsHistory/TutorialsHistory.stories.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -133,12 +133,43 @@ function HistoryPanel() {
|
|
|
133
133
|
|
|
134
134
|
### TutorialsHistory
|
|
135
135
|
|
|
136
|
-
|
|
136
|
+
Tutorial list with search, optional filters, selectable rows, incremental loading, and custom
|
|
137
|
+
link or row rendering.
|
|
137
138
|
|
|
138
139
|
```tsx
|
|
139
|
-
import {TutorialsHistory} from '@gravity-ui/querieskit';
|
|
140
|
+
import {TutorialsHistory, type QueryListLinkRenderer} from '@gravity-ui/querieskit';
|
|
141
|
+
|
|
142
|
+
const renderLink: QueryListLinkRenderer = ({href = '', ...props}) => (
|
|
143
|
+
<RouterLink {...props} to={href} />
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
<TutorialsHistory
|
|
147
|
+
items={tutorials}
|
|
148
|
+
selectedRowId={selectedTutorialId}
|
|
149
|
+
hasMore={hasNextPage}
|
|
150
|
+
loading={isLoading}
|
|
151
|
+
onLoadMore={loadNextPage}
|
|
152
|
+
renderLink={renderLink}
|
|
153
|
+
search={{value: search, onUpdate: updateSearch}}
|
|
154
|
+
/>;
|
|
140
155
|
```
|
|
141
156
|
|
|
157
|
+
`renderLink` is used for tutorial rows with a non-empty `href`, including full-text search
|
|
158
|
+
results. Without it, those rows render as regular `<a>` elements; rows without an `href` render
|
|
159
|
+
as `<div>` elements.
|
|
160
|
+
|
|
161
|
+
Use `renderRowItem` to replace the row contents while retaining the list's navigation and
|
|
162
|
+
selection behavior. It receives the original item, its list index, the current row variant
|
|
163
|
+
(`default` or `search`), keyboard activity as `isActive`, and `renderLink`. Group headers are
|
|
164
|
+
passed to the renderer as items and must be rendered by the consumer. Default rows continue to
|
|
165
|
+
show the tutorial `id`. A custom renderer can omit a long string ID from the visible content
|
|
166
|
+
while keeping it on the item for `selectedRowId` and navigation.
|
|
167
|
+
|
|
168
|
+
An empty list with `loading` shows the initial spinner. When existing items are present, loading
|
|
169
|
+
the next page shows an inline loader after them. Keep `loading` controlled, including passing
|
|
170
|
+
`false` between requests; the consumer remains responsible for the initial request, filtering,
|
|
171
|
+
and routing.
|
|
172
|
+
|
|
142
173
|
Browse interactive examples in [Storybook](https://preview.gravity-ui.com/querieskit/).
|
|
143
174
|
|
|
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
|
|
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,
|
|
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;
|
|
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;
|
|
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}
|
|
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
|
|
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
|
-
},
|
|
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","
|
|
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;
|