Skip to content

Commit 4817ae7

Browse files
committed
feat: Add basic list of dimensions (metadata panel)
1 parent 0b3ad68 commit 4817ae7

3 files changed

Lines changed: 100 additions & 40 deletions

File tree

app/components/chart-preview.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Box, Theme, Typography } from "@mui/material";
33
import { makeStyles } from "@mui/styles";
44
import Head from "next/head";
55
import * as React from "react";
6+
import { useMemo } from "react";
67

78
import { ChartDataFilters } from "@/charts/shared/chart-data-filters";
89
import { useQueryFilters } from "@/charts/shared/chart-helpers";
@@ -22,7 +23,7 @@ import { HintYellow } from "@/components/hint";
2223
import { MetadataPanel } from "@/components/metadata-panel";
2324
import { ChartConfig, DataSource, useConfiguratorState } from "@/configurator";
2425
import { DataSetTable } from "@/configurator/components/datatable";
25-
import { useDataCubeMetadataQuery } from "@/graphql/query-hooks";
26+
import { useDataCubeMetadataWithComponentValuesQuery } from "@/graphql/query-hooks";
2627
import { DataCubePublicationStatus } from "@/graphql/resolver-types";
2728
import { useLocale } from "@/locales/use-locale";
2829
import useEvent from "@/utils/use-event";
@@ -68,7 +69,7 @@ export const ChartPreviewInner = ({
6869
const [state, dispatch] = useConfiguratorState();
6970
const locale = useLocale();
7071
const classes = useStyles();
71-
const [{ data: metaData }] = useDataCubeMetadataQuery({
72+
const [{ data: metaData }] = useDataCubeMetadataWithComponentValuesQuery({
7273
variables: {
7374
iri: dataSetIri,
7475
sourceType: dataSource.type,
@@ -85,6 +86,13 @@ export const ChartPreviewInner = ({
8586

8687
const handleToggleTableView = useEvent(() => setIsTablePreview((c) => !c));
8788

89+
const allDimensions = useMemo(() => {
90+
return [
91+
...(metaData?.dataCubeByIri?.dimensions ?? []),
92+
...(metaData?.dataCubeByIri?.measures ?? []),
93+
];
94+
}, [metaData?.dataCubeByIri?.dimensions, metaData?.dataCubeByIri?.measures]);
95+
8896
return (
8997
<Flex
9098
sx={{
@@ -143,6 +151,7 @@ export const ChartPreviewInner = ({
143151
<MetadataPanel
144152
datasetIri={dataSetIri}
145153
dataSource={dataSource}
154+
dimensions={allDimensions}
146155
top={96}
147156
/>
148157
</Flex>

app/components/chart-published.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import {
3333
DEFAULT_DATA_SOURCE,
3434
useIsTrustedDataSource,
3535
} from "@/domain/datasource";
36-
import { useDataCubeMetadataQuery } from "@/graphql/query-hooks";
36+
import { useDataCubeMetadataWithComponentValuesQuery } from "@/graphql/query-hooks";
3737
import { DataCubePublicationStatus } from "@/graphql/resolver-types";
3838
import { useLocale } from "@/locales/use-locale";
3939
import useEvent from "@/utils/use-event";
@@ -95,7 +95,7 @@ export const ChartPublishedInner = ({
9595

9696
const rootRef = useRef<HTMLDivElement>(null);
9797

98-
const [{ data: metaData }] = useDataCubeMetadataQuery({
98+
const [{ data: metaData }] = useDataCubeMetadataWithComponentValuesQuery({
9999
variables: {
100100
iri: dataSet,
101101
sourceType: dataSource.type,
@@ -120,6 +120,13 @@ export const ChartPublishedInner = ({
120120
} = useChartTablePreview();
121121
const handleToggleTableView = useEvent(() => setIsTablePreview((c) => !c));
122122

123+
const allDimensions = useMemo(() => {
124+
return [
125+
...(metaData?.dataCubeByIri?.dimensions ?? []),
126+
...(metaData?.dataCubeByIri?.measures ?? []),
127+
];
128+
}, [metaData?.dataCubeByIri?.dimensions, metaData?.dataCubeByIri?.measures]);
129+
123130
return (
124131
<Box className={classes.root} ref={rootRef}>
125132
<ChartErrorBoundary resetKeys={[chartConfig]}>
@@ -173,6 +180,7 @@ export const ChartPublishedInner = ({
173180
<MetadataPanel
174181
datasetIri={dataSet}
175182
dataSource={dataSource}
183+
dimensions={allDimensions}
176184
container={rootRef.current}
177185
/>
178186
</Flex>

app/components/metadata-panel.tsx

Lines changed: 79 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { TabContext, TabList, TabPanel } from "@mui/lab";
22
import {
3+
Box,
34
Button,
45
Drawer,
56
IconButton,
@@ -13,6 +14,7 @@ import React from "react";
1314
import { DataSource } from "@/configurator";
1415
import { DataSetMetadata } from "@/configurator/components/dataset-metadata";
1516
import { DRAWER_WIDTH } from "@/configurator/components/drawer";
17+
import { DimensionMetadataFragment } from "@/graphql/query-hooks";
1618
import SvgIcClose from "@/icons/components/IcClose";
1719
import useEvent from "@/utils/use-event";
1820

@@ -96,6 +98,9 @@ const useStyles = makeStyles<Theme, { drawerTop?: number }>((theme) => {
9698
},
9799
},
98100
tabPanel: {
101+
display: "flex",
102+
flexDirection: "column",
103+
gap: theme.spacing(4),
99104
padding: 0,
100105
},
101106
};
@@ -104,11 +109,13 @@ const useStyles = makeStyles<Theme, { drawerTop?: number }>((theme) => {
104109
export const MetadataPanel = ({
105110
datasetIri,
106111
dataSource,
112+
dimensions,
107113
container,
108114
top,
109115
}: {
110116
datasetIri: string;
111117
dataSource: DataSource;
118+
dimensions: DimensionMetadataFragment[];
112119
container?: HTMLDivElement | null;
113120
top?: number;
114121
}) => {
@@ -117,51 +124,24 @@ export const MetadataPanel = ({
117124
<PanelInner
118125
datasetIri={datasetIri}
119126
dataSource={dataSource}
127+
dimensions={dimensions}
120128
container={container}
121129
top={top}
122130
/>
123131
</ContextProvider>
124132
);
125133
};
126134

127-
const ToggleButton = ({ onClick }: { onClick: () => void }) => {
128-
return (
129-
<Button component="a" variant="text" size="small" onClick={onClick}>
130-
<Typography variant="body2">Metadata</Typography>
131-
</Button>
132-
);
133-
};
134-
135-
const Header = ({ onClose }: { onClose: () => void }) => {
136-
const classes = useStyles({});
137-
138-
return (
139-
<div className={classes.header}>
140-
<Typography variant="body2" fontWeight="bold">
141-
Metadata
142-
</Typography>
143-
144-
<IconButton size="small" onClick={onClose}>
145-
<SvgIcClose />
146-
</IconButton>
147-
</div>
148-
);
149-
};
150-
151-
const Content = () => {
152-
const classes = useStyles({});
153-
154-
return <div className={classes.content}></div>;
155-
};
156-
157135
const PanelInner = ({
158136
datasetIri,
159137
dataSource,
138+
dimensions,
160139
container,
161140
top = 0,
162141
}: {
163142
datasetIri: string;
164143
dataSource: DataSource;
144+
dimensions: DimensionMetadataFragment[];
165145
container: HTMLDivElement | null | undefined;
166146
top?: number;
167147
}) => {
@@ -210,16 +190,79 @@ const PanelInner = ({
210190
/>
211191
</TabList>
212192

213-
<TabPanel className={classes.tabPanel} value="general">
214-
<DataSetMetadata dataSetIri={datasetIri} dataSource={dataSource} />
215-
</TabPanel>
216-
<TabPanel className={classes.tabPanel} value="data">
217-
Data
218-
</TabPanel>
193+
<TabPanelGeneral datasetIri={datasetIri} dataSource={dataSource} />
194+
<TabPanelData dimensions={dimensions} />
219195
</TabContext>
220196

221197
<Content />
222198
</Drawer>
223199
</>
224200
);
225201
};
202+
203+
const ToggleButton = ({ onClick }: { onClick: () => void }) => {
204+
return (
205+
<Button component="a" variant="text" size="small" onClick={onClick}>
206+
<Typography variant="body2">Metadata</Typography>
207+
</Button>
208+
);
209+
};
210+
211+
const Header = ({ onClose }: { onClose: () => void }) => {
212+
const classes = useStyles({});
213+
214+
return (
215+
<div className={classes.header}>
216+
<Typography variant="body2" fontWeight="bold">
217+
Metadata
218+
</Typography>
219+
220+
<IconButton size="small" onClick={onClose}>
221+
<SvgIcClose />
222+
</IconButton>
223+
</div>
224+
);
225+
};
226+
227+
const Content = () => {
228+
const classes = useStyles({});
229+
230+
return <div className={classes.content}></div>;
231+
};
232+
233+
const TabPanelGeneral = ({
234+
datasetIri,
235+
dataSource,
236+
}: {
237+
datasetIri: string;
238+
dataSource: DataSource;
239+
}) => {
240+
const classes = useStyles({});
241+
242+
return (
243+
<TabPanel className={classes.tabPanel} value="general">
244+
<DataSetMetadata dataSetIri={datasetIri} dataSource={dataSource} />
245+
</TabPanel>
246+
);
247+
};
248+
249+
const TabPanelData = ({
250+
dimensions,
251+
}: {
252+
dimensions: DimensionMetadataFragment[];
253+
}) => {
254+
const classes = useStyles({});
255+
256+
return (
257+
<TabPanel className={classes.tabPanel} value="data">
258+
{dimensions.map((d) => (
259+
<Box key={d.iri}>
260+
<Typography variant="body2" fontWeight="bold">
261+
{d.label}
262+
</Typography>
263+
<Typography variant="body2">{d.description}</Typography>
264+
</Box>
265+
))}
266+
</TabPanel>
267+
);
268+
};

0 commit comments

Comments
 (0)