Skip to content

Commit 2b912cf

Browse files
authored
Wizard chart receipt (#3079)
1 parent 201dff7 commit 2b912cf

File tree

8 files changed

+357
-8
lines changed

8 files changed

+357
-8
lines changed

src/server/modes/charts/plugins/datalens/js/js.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,7 @@ export const buildGraphPrivate = (args: {
863863

864864
const fields: Record<string, string> = {};
865865

866-
const schema = datasetsSchemaFields[datasetIndex];
866+
const schema = datasetsSchemaFields[datasetIndex] ?? [];
867867

868868
schema.forEach((item) => {
869869
fields[item.guid] = idToTitle[item.guid];
@@ -904,7 +904,7 @@ export const buildGraphPrivate = (args: {
904904

905905
const fields: Record<string, string> = {};
906906

907-
const schema = datasetsSchemaFields[datasetIndex];
907+
const schema = datasetsSchemaFields[datasetIndex] ?? [];
908908

909909
schema.forEach((item) => {
910910
fields[item.guid] = idToTitle[item.guid];

src/server/modes/charts/plugins/datalens/url/build-request-body/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -702,9 +702,9 @@ export const getUrlsRequestBody = (args: {
702702
const placeholders = currentLayer.placeholders;
703703
const currentDatasetIndex = config.datasetsIds.findIndex((value) => value === datasetId);
704704
const currentLocalFields =
705-
currentDatasetIndex >= 0 ? config.datasetsPartialFields[currentDatasetIndex] : [];
705+
currentDatasetIndex >= 0 ? config.datasetsPartialFields?.[currentDatasetIndex] : [];
706706

707-
const datasetSchema = [...args.datasetFields, ...currentLocalFields];
707+
const datasetSchema = [...args.datasetFields, ...(currentLocalFields ?? [])];
708708

709709
const links = config.links;
710710
const segments = config.segments;

src/ui/constants/common.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ export const URL_QUERY = {
338338
OPEN_DASH_INFO: '_opened_info',
339339
UNRELEASED: 'unreleased',
340340
ENTRY_CONFIG: '_entry_config',
341+
CHART_RECIPE: '_chart_recipe',
341342
};
342343

343344
const GRADIENT_ICONS = {

src/ui/units/wizard/actions/index.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ import {getFilteredObject} from '../../../utils';
6868
import type {WizardDispatch, WizardGlobalState} from '../reducers';
6969
import {selectWizardWorkbookId} from '../selectors/settings';
7070
import {selectVisualization} from '../selectors/visualization';
71+
import {getWizardConfigFromRecipe} from '../utils/chart-recipe';
7172
import {filterVisualizationColors} from '../utils/colors';
7273
import {getChartFiltersWithDisabledProp} from '../utils/filters';
7374
import {getVisualization, transformSchema} from '../utils/helpers';
@@ -2157,6 +2158,7 @@ export function setDefaults(args: SetDefaultsArgs) {
21572158
return async function (dispatch: WizardDispatch, getState: () => DatalensGlobalState) {
21582159
const searchPairs = new URLSearchParams(window.location.search);
21592160
const entryConfigParam = searchPairs.get(URL_QUERY.ENTRY_CONFIG);
2161+
const chartRecipeParam = searchPairs.get(URL_QUERY.CHART_RECIPE);
21602162

21612163
if (routeWorkbookId) {
21622164
dispatch(setRouteWorkbookId(routeWorkbookId));
@@ -2180,6 +2182,16 @@ export function setDefaults(args: SetDefaultsArgs) {
21802182
}
21812183
}
21822184

2185+
if (chartRecipeParam) {
2186+
try {
2187+
const chartRecipe = JSON.parse(chartRecipeParam);
2188+
const config = await getWizardConfigFromRecipe({recipe: chartRecipe});
2189+
await processWidget({widget: {data: config}, dispatch, getState});
2190+
} catch (e) {
2191+
console.error(e);
2192+
}
2193+
}
2194+
21832195
const visualization = getState().wizard.visualization;
21842196
if (!visualization?.visualization) {
21852197
const defaultVisualization = getDefaultVisualization();
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import React from 'react';
2+
3+
import {Loader} from '@gravity-ui/uikit';
4+
import {ChartWrapper} from 'ui/components/Widgets/Chart/ChartWidgetWithProvider';
5+
import type {ConfigNode} from 'ui/libs/DatalensChartkit/modules/data-provider/charts';
6+
7+
import {getChartTypeByVisualizationId} from '../../reducers/preview';
8+
import {type WizardChartRecipe, getWizardConfigFromRecipe} from '../../utils/chart-recipe';
9+
10+
type Props = {
11+
recipe: WizardChartRecipe;
12+
};
13+
14+
export const ChartFromRecipe = React.memo(({recipe}: Props) => {
15+
const [entryConfig, setEntryConfig] = React.useState<ConfigNode | null>(null);
16+
const chartRef = React.useRef(null);
17+
18+
React.useEffect(() => {
19+
(async function () {
20+
const wizardConfig = await getWizardConfigFromRecipe({recipe});
21+
const entryType = getChartTypeByVisualizationId(wizardConfig.visualization.id);
22+
setEntryConfig({
23+
type: entryType,
24+
data: {
25+
shared: wizardConfig,
26+
},
27+
} as unknown as ConfigNode);
28+
})();
29+
}, [recipe]);
30+
31+
if (!entryConfig) {
32+
return <Loader />;
33+
}
34+
35+
return <ChartWrapper usageType="chart" config={entryConfig} forwardedRef={chartRef} />;
36+
});
37+
38+
ChartFromRecipe.displayName = 'ChartFromRecipe';

src/ui/units/wizard/containers/Wizard/WizardActionPanel/WizardActionPanel.tsx

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
import React from 'react';
22

3-
import type {DropdownMenuProps} from '@gravity-ui/uikit';
3+
import {Button, type DropdownMenuProps} from '@gravity-ui/uikit';
44
import block from 'bem-cn-lite';
5+
import copyToClipboard from 'clipboard-copy';
56
import {useDispatch, useSelector} from 'react-redux';
6-
import type {ClientChartsConfigWithDataset, WizardType} from 'shared';
7+
import type {ClientChartsConfigWithDataset, ServerChartsConfig, WizardType} from 'shared';
78
import {EntryUpdateMode, Feature} from 'shared';
9+
import {getChartReceiptFromWizardConfig} from 'ui/units/wizard/utils/chart-recipe';
810
import {isEnabledFeature} from 'ui/utils/isEnabledFeature';
911
import {selectIsChartSaved} from 'units/wizard/selectors/preview';
1012

1113
import type {DatalensGlobalState} from '../../../../../';
12-
import {ActionPanel} from '../../../../../';
14+
import {ActionPanel, Utils} from '../../../../../';
1315
import {ChartSaveControls} from '../../../../../components/ActionPanel/components/ChartSaveControls/ChartSaveControl';
1416
import {registry} from '../../../../../registry';
17+
import {showToast} from '../../../../../store/actions/toaster';
1518
import {selectCanGoBack, selectCanGoForward} from '../../../../../store/selectors/editHistory';
1619
import {setEditMode} from '../../../../dash/store/actions/base/actions';
1720
import {toggleViewOnlyMode} from '../../../actions/settings';
@@ -90,6 +93,18 @@ export const WizardActionPanel: React.FC<WizardActionPanelProps> = (
9093
}
9194
}, [isCurrentRevisionActual, onSaveCallback]);
9295

96+
const handleCopyRecipe = React.useCallback(() => {
97+
try {
98+
const recipe = getChartReceiptFromWizardConfig(
99+
config?.shared as unknown as ServerChartsConfig,
100+
);
101+
copyToClipboard(JSON.stringify(recipe));
102+
dispatch(showToast({title: 'Copied to clipboard'}));
103+
} catch (e) {
104+
console.error(e);
105+
}
106+
}, [config?.shared, dispatch]);
107+
93108
const canGoBack = useSelector<DatalensGlobalState, ReturnType<typeof selectCanGoBack>>(
94109
(state) => selectCanGoBack(state, {unitId: WIZARD_EDIT_HISTORY_UNIT_ID}),
95110
);
@@ -118,6 +133,11 @@ export const WizardActionPanel: React.FC<WizardActionPanelProps> = (
118133
enablePublish={enablePublish}
119134
rightItems={
120135
<React.Fragment>
136+
{Utils.isSuperUser() && (
137+
<Button style={{marginRight: 8}} onClick={handleCopyRecipe}>
138+
copy recipe
139+
</Button>
140+
)}
121141
<WizardActionPanelExtension />
122142
<ChartSaveControls
123143
className={b('save-controls')}

src/ui/units/wizard/reducers/preview.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ function mutateAndValidateVisualization({
272272
return everythingIsOk;
273273
}
274274

275-
const getChartTypeByVisualizationId = (visualizationId: string): WizardType => {
275+
export const getChartTypeByVisualizationId = (visualizationId: string): WizardType => {
276276
if (isD3Visualization(visualizationId as WizardVisualizationId)) {
277277
return WizardType.GravityChartsWizardNode;
278278
}

0 commit comments

Comments
 (0)