Skip to content

Commit 8d68e2c

Browse files
authored
Merge pull request #906 from visualize-admin/feat/metadata-panel
feat: First version of metadata panel
2 parents f2376d0 + 14ecd8c commit 8d68e2c

24 files changed

Lines changed: 847 additions & 261 deletions

app/components/chart-preview.tsx

Lines changed: 47 additions & 17 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";
@@ -19,9 +20,14 @@ import GenericChart from "@/components/common-chart";
1920
import DebugPanel from "@/components/debug-panel";
2021
import Flex from "@/components/flex";
2122
import { HintYellow } from "@/components/hint";
23+
import { MetadataPanel } from "@/components/metadata-panel";
2224
import { ChartConfig, DataSource, useConfiguratorState } from "@/configurator";
2325
import { DataSetTable } from "@/configurator/components/datatable";
24-
import { useDataCubeMetadataQuery } from "@/graphql/query-hooks";
26+
import { flag } from "@/configurator/components/flag";
27+
import {
28+
DimensionMetadataFragment,
29+
useDataCubeMetadataWithComponentValuesQuery,
30+
} from "@/graphql/query-hooks";
2531
import { DataCubePublicationStatus } from "@/graphql/resolver-types";
2632
import { useLocale } from "@/locales/use-locale";
2733
import useEvent from "@/utils/use-event";
@@ -67,7 +73,7 @@ export const ChartPreviewInner = ({
6773
const [state, dispatch] = useConfiguratorState();
6874
const locale = useLocale();
6975
const classes = useStyles();
70-
const [{ data: metaData }] = useDataCubeMetadataQuery({
76+
const [{ data: metaData }] = useDataCubeMetadataWithComponentValuesQuery({
7177
variables: {
7278
iri: dataSetIri,
7379
sourceType: dataSource.type,
@@ -84,6 +90,13 @@ export const ChartPreviewInner = ({
8490

8591
const handleToggleTableView = useEvent(() => setIsTablePreview((c) => !c));
8692

93+
const allDimensions: DimensionMetadataFragment[] = useMemo(() => {
94+
return [
95+
...(metaData?.dataCubeByIri?.dimensions ?? []),
96+
...(metaData?.dataCubeByIri?.measures ?? []),
97+
];
98+
}, [metaData?.dataCubeByIri?.dimensions, metaData?.dataCubeByIri?.measures]);
99+
87100
return (
88101
<Flex
89102
sx={{
@@ -112,25 +125,42 @@ export const ChartPreviewInner = ({
112125
state.state === "PUBLISHING") && (
113126
<>
114127
<>
115-
<Typography
116-
variant="h2"
128+
<Flex
117129
sx={{
118-
color: state.meta.title[locale] === "" ? "grey.500" : "text",
130+
justifyContent: "space-between",
131+
alignItems: "flex-start",
119132
}}
120-
className={classes.title}
121-
onClick={() =>
122-
dispatch({
123-
type: "ACTIVE_FIELD_CHANGED",
124-
value: "title",
125-
})
126-
}
127133
>
128-
{state.meta.title[locale] === "" ? (
129-
<Trans id="annotation.add.title">[ Title ]</Trans>
130-
) : (
131-
state.meta.title[locale]
134+
<Typography
135+
variant="h2"
136+
sx={{
137+
color:
138+
state.meta.title[locale] === "" ? "grey.500" : "text",
139+
}}
140+
className={classes.title}
141+
onClick={() =>
142+
dispatch({
143+
type: "ACTIVE_FIELD_CHANGED",
144+
value: "title",
145+
})
146+
}
147+
>
148+
{state.meta.title[locale] === "" ? (
149+
<Trans id="annotation.add.title">[ Title ]</Trans>
150+
) : (
151+
state.meta.title[locale]
152+
)}
153+
</Typography>
154+
155+
{flag("metadata") && (
156+
<MetadataPanel
157+
datasetIri={dataSetIri}
158+
dataSource={dataSource}
159+
dimensions={allDimensions}
160+
top={96}
161+
/>
132162
)}
133-
</Typography>
163+
</Flex>
134164
<Head>
135165
<title key="title">
136166
{state.meta.title[locale] === ""

app/components/chart-published.tsx

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Trans } from "@lingui/macro";
22
import { Box, Theme, Typography } from "@mui/material";
33
import { makeStyles } from "@mui/styles";
44
import * as React from "react";
5-
import { useEffect, useMemo } from "react";
5+
import { useEffect, useMemo, useRef } from "react";
66

77
import { ChartDataFilters } from "@/charts/shared/chart-data-filters";
88
import { isUsingImputation } from "@/charts/shared/imputation";
@@ -19,6 +19,7 @@ import {
1919
import GenericChart from "@/components/common-chart";
2020
import Flex from "@/components/flex";
2121
import { HintBlue, HintRed, HintYellow } from "@/components/hint";
22+
import { MetadataPanel } from "@/components/metadata-panel";
2223
import {
2324
ChartConfig,
2425
ConfiguratorStatePublishing,
@@ -27,12 +28,16 @@ import {
2728
PublishedConfiguratorStateProvider,
2829
} from "@/configurator";
2930
import { DataSetTable } from "@/configurator/components/datatable";
31+
import { flag } from "@/configurator/components/flag";
3032
import { parseDate } from "@/configurator/components/ui-helpers";
3133
import {
3234
DEFAULT_DATA_SOURCE,
3335
useIsTrustedDataSource,
3436
} from "@/domain/datasource";
35-
import { useDataCubeMetadataQuery } from "@/graphql/query-hooks";
37+
import {
38+
DimensionMetadataFragment,
39+
useDataCubeMetadataWithComponentValuesQuery,
40+
} from "@/graphql/query-hooks";
3641
import { DataCubePublicationStatus } from "@/graphql/resolver-types";
3742
import { useLocale } from "@/locales/use-locale";
3843
import useEvent from "@/utils/use-event";
@@ -65,6 +70,7 @@ export const ChartPublished = ({
6570

6671
const useStyles = makeStyles((theme: Theme) => ({
6772
root: {
73+
position: "relative",
6874
display: "flex",
6975
flexGrow: 1,
7076
flexDirection: "column",
@@ -91,7 +97,9 @@ export const ChartPublishedInner = ({
9197
const locale = useLocale();
9298
const isTrustedDataSource = useIsTrustedDataSource(dataSource);
9399

94-
const [{ data: metaData }] = useDataCubeMetadataQuery({
100+
const rootRef = useRef<HTMLDivElement>(null);
101+
102+
const [{ data: metaData }] = useDataCubeMetadataWithComponentValuesQuery({
95103
variables: {
96104
iri: dataSet,
97105
sourceType: dataSource.type,
@@ -116,8 +124,15 @@ export const ChartPublishedInner = ({
116124
} = useChartTablePreview();
117125
const handleToggleTableView = useEvent(() => setIsTablePreview((c) => !c));
118126

127+
const allDimensions: DimensionMetadataFragment[] = useMemo(() => {
128+
return [
129+
...(metaData?.dataCubeByIri?.dimensions ?? []),
130+
...(metaData?.dataCubeByIri?.measures ?? []),
131+
];
132+
}, [metaData?.dataCubeByIri?.dimensions, metaData?.dataCubeByIri?.measures]);
133+
119134
return (
120-
<Box className={classes.root}>
135+
<Box className={classes.root} ref={rootRef}>
121136
<ChartErrorBoundary resetKeys={[chartConfig]}>
122137
{metaData?.dataCubeByIri?.publicationStatus ===
123138
DataCubePublicationStatus.Draft && (
@@ -161,11 +176,21 @@ export const ChartPublishedInner = ({
161176
</HintBlue>
162177
</Box>
163178
)}
164-
{meta.title[locale] !== "" && (
179+
<Flex sx={{ justifyContent: "space-between", alignItems: "center" }}>
165180
<Typography component="div" variant="h2" mb={2}>
166181
{meta.title[locale]}
167182
</Typography>
168-
)}
183+
184+
{flag("metadata") && (
185+
<MetadataPanel
186+
datasetIri={dataSet}
187+
dataSource={dataSource}
188+
dimensions={allDimensions}
189+
container={rootRef.current}
190+
/>
191+
)}
192+
</Flex>
193+
169194
{meta.description[locale] && (
170195
<Typography component="div" variant="body1" mb={2}>
171196
{meta.description[locale]}

app/components/chart-selection-tabs.tsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,20 @@ const TabsInner = ({
195195
}) => {
196196
return (
197197
<Box display="flex" sx={{ width: "100%", alignItems: "flex-start" }}>
198-
<Tabs value={0} sx={{ position: "relative", top: 1, flexGrow: 1 }}>
199-
{/* TODO: Generate dynamically when chart composition is implemented */}
198+
<Tabs
199+
value={0}
200+
TabIndicatorProps={{ style: { display: "none" } }}
201+
sx={{ position: "relative", top: 1, flexGrow: 1 }}
202+
>
203+
{/* TODO: Generate dynamically when chart composition is implemented. Add useStyles */}
200204
<Tab
201-
sx={{ p: 0, background: "white" }}
205+
sx={{
206+
p: 0,
207+
background: "white",
208+
border: "1px solid",
209+
borderBottomWidth: 0,
210+
borderColor: "divider",
211+
}}
202212
onClick={onActionButtonClick}
203213
label={
204214
<TabContent iconName={getIconName(chartType)} editable={editable} />

0 commit comments

Comments
 (0)