diff --git a/frontend/src/metabase/query_builder/components/SidebarContent/SidebarContent.tsx b/frontend/src/metabase/query_builder/components/SidebarContent/SidebarContent.tsx index 89998162da7625d3ab8b43b2b912567dd67f9ab0..7e944e77fb635b5ce1541faf93da57ccd1d7f4de 100644 --- a/frontend/src/metabase/query_builder/components/SidebarContent/SidebarContent.tsx +++ b/frontend/src/metabase/query_builder/components/SidebarContent/SidebarContent.tsx @@ -48,7 +48,7 @@ function SidebarContent({ onClose={onClose} /> )} - <div className="px3">{children}</div> + {children} </SidebarContentMain> {footer} </SidebarContentRoot> diff --git a/frontend/src/metabase/query_builder/components/dataref/DatabaseSchemasPane.tsx b/frontend/src/metabase/query_builder/components/dataref/DatabaseSchemasPane.tsx index f7fd0db853ae65af3abb86c3dd8f0c86f2806d37..8f46de1f5a5e5b838d078ce17120cc3155e36dda 100644 --- a/frontend/src/metabase/query_builder/components/dataref/DatabaseSchemasPane.tsx +++ b/frontend/src/metabase/query_builder/components/dataref/DatabaseSchemasPane.tsx @@ -16,6 +16,7 @@ import { NodeListTitleText, QuestionId, } from "./NodeList.styled"; +import { PaneContent } from "./Pane.styled"; interface DatabaseSchemasPaneProps { onBack: () => void; @@ -44,56 +45,58 @@ const DatabaseSchemasPane = ({ onBack={onBack} onClose={onClose} > - <NodeListContainer> - {sortedModels.length ? ( - <> - <NodeListTitle> - <NodeListIcon name="model" /> - <NodeListTitleText> - {ngettext( - msgid`${sortedModels.length} model`, - `${sortedModels.length} models`, - sortedModels.length, - )} - </NodeListTitleText> - </NodeListTitle> - <ul> - {sortedModels.map(model => ( - <li key={model.id}> - <NodeListItemLink - onClick={() => onItemClick("question", model)} - > - <NodeListItemIcon name="model" /> - <NodeListItemName>{model.name}</NodeListItemName> - <QuestionId>{`#${model.id}`}</QuestionId> - </NodeListItemLink> - </li> - ))} - </ul> - <br></br> - </> - ) : null} - <NodeListTitle> - <NodeListIcon name="folder" /> - <NodeListTitleText> - {ngettext( - msgid`${schemas.length} schema`, - `${schemas.length} schemas`, - schemas.length, - )} - </NodeListTitleText> - </NodeListTitle> - <ul> - {schemas.map(schema => ( - <li key={schema.id}> - <NodeListItemLink onClick={() => onItemClick("schema", schema)}> - <NodeListItemIcon name="folder" /> - <NodeListItemName>{schema.name}</NodeListItemName> - </NodeListItemLink> - </li> - ))} - </ul> - </NodeListContainer> + <PaneContent> + <NodeListContainer> + {sortedModels.length ? ( + <> + <NodeListTitle> + <NodeListIcon name="model" /> + <NodeListTitleText> + {ngettext( + msgid`${sortedModels.length} model`, + `${sortedModels.length} models`, + sortedModels.length, + )} + </NodeListTitleText> + </NodeListTitle> + <ul> + {sortedModels.map(model => ( + <li key={model.id}> + <NodeListItemLink + onClick={() => onItemClick("question", model)} + > + <NodeListItemIcon name="model" /> + <NodeListItemName>{model.name}</NodeListItemName> + <QuestionId>{`#${model.id}`}</QuestionId> + </NodeListItemLink> + </li> + ))} + </ul> + <br></br> + </> + ) : null} + <NodeListTitle> + <NodeListIcon name="folder" /> + <NodeListTitleText> + {ngettext( + msgid`${schemas.length} schema`, + `${schemas.length} schemas`, + schemas.length, + )} + </NodeListTitleText> + </NodeListTitle> + <ul> + {schemas.map(schema => ( + <li key={schema.id}> + <NodeListItemLink onClick={() => onItemClick("schema", schema)}> + <NodeListItemIcon name="folder" /> + <NodeListItemName>{schema.name}</NodeListItemName> + </NodeListItemLink> + </li> + ))} + </ul> + </NodeListContainer> + </PaneContent> </SidebarContent> ); }; diff --git a/frontend/src/metabase/query_builder/components/dataref/DatabaseTablesPane.tsx b/frontend/src/metabase/query_builder/components/dataref/DatabaseTablesPane.tsx index 9c83cd83bc8c323c6c87fd9482cef18130590823..750f620ada8721e49b96d13c9b48df2f55028b34 100644 --- a/frontend/src/metabase/query_builder/components/dataref/DatabaseTablesPane.tsx +++ b/frontend/src/metabase/query_builder/components/dataref/DatabaseTablesPane.tsx @@ -16,6 +16,7 @@ import { NodeListTitleText, QuestionId, } from "./NodeList.styled"; +import { PaneContent } from "./Pane.styled"; interface DatabaseTablesPaneProps { onBack: () => void; @@ -53,56 +54,58 @@ const DatabaseTablesPane = ({ onBack={onBack} onClose={onClose} > - <NodeListContainer> - {models.length ? ( - <> - <NodeListTitle> - <NodeListIcon name="model" /> - <NodeListTitleText> - {ngettext( - msgid`${models.length} model`, - `${models.length} models`, - models.length, - )} - </NodeListTitleText> - </NodeListTitle> - <ul> - {models.map(model => ( - <li key={model.id}> - <NodeListItemLink - onClick={() => onItemClick("question", model)} - > - <NodeListItemIcon name="model" /> - <NodeListItemName>{model.name}</NodeListItemName> - <QuestionId>{`#${model.id}`}</QuestionId> - </NodeListItemLink> - </li> - ))} - </ul> - <br></br> - </> - ) : null} - <NodeListTitle> - <NodeListIcon name="table" /> - <NodeListTitleText> - {ngettext( - msgid`${tables.length} table`, - `${tables.length} tables`, - tables.length, - )} - </NodeListTitleText> - </NodeListTitle> - <ul> - {tables.map(table => ( - <li key={table.id}> - <NodeListItemLink onClick={() => onItemClick("table", table)}> - <NodeListItemIcon name="table" /> - <NodeListItemName>{table.table_name}</NodeListItemName> - </NodeListItemLink> - </li> - ))} - </ul> - </NodeListContainer> + <PaneContent> + <NodeListContainer> + {models.length ? ( + <> + <NodeListTitle> + <NodeListIcon name="model" /> + <NodeListTitleText> + {ngettext( + msgid`${models.length} model`, + `${models.length} models`, + models.length, + )} + </NodeListTitleText> + </NodeListTitle> + <ul> + {models.map(model => ( + <li key={model.id}> + <NodeListItemLink + onClick={() => onItemClick("question", model)} + > + <NodeListItemIcon name="model" /> + <NodeListItemName>{model.name}</NodeListItemName> + <QuestionId>{`#${model.id}`}</QuestionId> + </NodeListItemLink> + </li> + ))} + </ul> + <br></br> + </> + ) : null} + <NodeListTitle> + <NodeListIcon name="table" /> + <NodeListTitleText> + {ngettext( + msgid`${tables.length} table`, + `${tables.length} tables`, + tables.length, + )} + </NodeListTitleText> + </NodeListTitle> + <ul> + {tables.map(table => ( + <li key={table.id}> + <NodeListItemLink onClick={() => onItemClick("table", table)}> + <NodeListItemIcon name="table" /> + <NodeListItemName>{table.table_name}</NodeListItemName> + </NodeListItemLink> + </li> + ))} + </ul> + </NodeListContainer> + </PaneContent> </SidebarContent> ); }; diff --git a/frontend/src/metabase/query_builder/components/dataref/FieldPane.tsx b/frontend/src/metabase/query_builder/components/dataref/FieldPane.tsx index 055cb9d55ef04d7583b54bc1a1c45f2cc9686c5e..bc769f9302dd55388e23ef3fbe89553bbfade9dc 100644 --- a/frontend/src/metabase/query_builder/components/dataref/FieldPane.tsx +++ b/frontend/src/metabase/query_builder/components/dataref/FieldPane.tsx @@ -3,6 +3,7 @@ import React from "react"; import DimensionInfo from "metabase/components/MetadataInfo/DimensionInfo"; import SidebarContent from "metabase/query_builder/components/SidebarContent"; import Field from "metabase-lib/lib/metadata/Field"; +import { PaneContent } from "./Pane.styled"; interface FieldPaneProps { onBack: () => void; @@ -18,7 +19,9 @@ const FieldPane = ({ onBack, onClose, field }: FieldPaneProps) => { onBack={onBack} onClose={onClose} > - <DimensionInfo dimension={field.dimension()} showAllFieldValues /> + <PaneContent> + <DimensionInfo dimension={field.dimension()} showAllFieldValues /> + </PaneContent> </SidebarContent> ); }; diff --git a/frontend/src/metabase/query_builder/components/dataref/MainPane.jsx b/frontend/src/metabase/query_builder/components/dataref/MainPane.jsx index 06d9198e94c97485343dafa4dd8cf5eca44167ae..274b689534cdda9733a4f8403d43dcea3553ad29 100644 --- a/frontend/src/metabase/query_builder/components/dataref/MainPane.jsx +++ b/frontend/src/metabase/query_builder/components/dataref/MainPane.jsx @@ -10,23 +10,28 @@ import { NodeListItemName, NodeListItemIcon, } from "./NodeList.styled"; +import { PaneContent } from "./Pane.styled"; const MainPane = ({ databases, onClose, onItemClick }) => ( <SidebarContent title={t`Data Reference`} onClose={onClose}> - <p className="mt2 mb3 text-spaced"> - {t`Browse the contents of your databases, tables, and columns. Pick a database to get started.`} - </p> - <ul> - {databases && - databases.map(database => ( - <li key={database.id}> - <NodeListItemLink onClick={() => onItemClick("database", database)}> - <NodeListItemIcon name="database" /> - <NodeListItemName>{database.name}</NodeListItemName> - </NodeListItemLink> - </li> - ))} - </ul> + <PaneContent> + <p className="mt2 mb3 text-spaced"> + {t`Browse the contents of your databases, tables, and columns. Pick a database to get started.`} + </p> + <ul> + {databases && + databases.map(database => ( + <li key={database.id}> + <NodeListItemLink + onClick={() => onItemClick("database", database)} + > + <NodeListItemIcon name="database" /> + <NodeListItemName>{database.name}</NodeListItemName> + </NodeListItemLink> + </li> + ))} + </ul> + </PaneContent> </SidebarContent> ); diff --git a/frontend/src/metabase/query_builder/components/dataref/Pane.styled.tsx b/frontend/src/metabase/query_builder/components/dataref/Pane.styled.tsx new file mode 100644 index 0000000000000000000000000000000000000000..da6e47523f500f5fa77a6e406ed65a94e088d9af --- /dev/null +++ b/frontend/src/metabase/query_builder/components/dataref/Pane.styled.tsx @@ -0,0 +1,6 @@ +import styled from "@emotion/styled"; + +export const PaneContent = styled.div` + padding-left: 1.5rem; + padding-right: 1.5rem; +`; diff --git a/frontend/src/metabase/query_builder/components/dataref/QuestionPane/QuestionPane.tsx b/frontend/src/metabase/query_builder/components/dataref/QuestionPane/QuestionPane.tsx index bc063d02338d8e4e728bcd033ba6c905550ced42..33a971398b89b2937d939819164d59735540fe1e 100644 --- a/frontend/src/metabase/query_builder/components/dataref/QuestionPane/QuestionPane.tsx +++ b/frontend/src/metabase/query_builder/components/dataref/QuestionPane/QuestionPane.tsx @@ -15,6 +15,7 @@ import type { State } from "metabase-types/store"; import Table from "metabase-lib/lib/metadata/Table"; import Question from "metabase-lib/lib/Question"; import FieldList from "../FieldList"; +import { PaneContent } from "../Pane.styled"; import { QuestionPaneDetail, QuestionPaneDetailLink, @@ -49,45 +50,47 @@ const QuestionPane = ({ onBack={onBack} onClose={onClose} > - <QuestionPaneDescription> - {question.description() ? ( - <Description>{question.description()}</Description> - ) : ( - <EmptyDescription>{t`No description`}</EmptyDescription> + <PaneContent> + <QuestionPaneDescription> + {question.description() ? ( + <Description>{question.description()}</Description> + ) : ( + <EmptyDescription>{t`No description`}</EmptyDescription> + )} + </QuestionPaneDescription> + <QuestionPaneDetail> + <QuestionPaneDetailLink + href={question.getUrl()} + target="_blank" + rel="noreferrer" + > + <QuestionPaneIcon name="share" /> + <QuestionPaneDetailLinkText>{t`See it`}</QuestionPaneDetailLinkText> + </QuestionPaneDetailLink> + </QuestionPaneDetail> + <QuestionPaneDetail> + <QuestionPaneIcon name="label" /> + <QuestionPaneDetailText>{t`ID #${question.id()}`}</QuestionPaneDetailText> + </QuestionPaneDetail> + <QuestionPaneDetail> + <QuestionPaneIcon name="calendar" /> + <QuestionPaneDetailText> + {jt`Last edited ${( + <DateTime + key="day" + unit="day" + value={question.lastEditInfo().timestamp} + /> + )}`} + </QuestionPaneDetailText> + </QuestionPaneDetail> + {table.fields && ( + <FieldList + fields={table.fields} + onFieldClick={f => onItemClick("field", f)} + /> )} - </QuestionPaneDescription> - <QuestionPaneDetail> - <QuestionPaneDetailLink - href={question.getUrl()} - target="_blank" - rel="noreferrer" - > - <QuestionPaneIcon name="share" /> - <QuestionPaneDetailLinkText>{t`See it`}</QuestionPaneDetailLinkText> - </QuestionPaneDetailLink> - </QuestionPaneDetail> - <QuestionPaneDetail> - <QuestionPaneIcon name="label" /> - <QuestionPaneDetailText>{t`ID #${question.id()}`}</QuestionPaneDetailText> - </QuestionPaneDetail> - <QuestionPaneDetail> - <QuestionPaneIcon name="calendar" /> - <QuestionPaneDetailText> - {jt`Last edited ${( - <DateTime - key="day" - unit="day" - value={question.lastEditInfo().timestamp} - /> - )}`} - </QuestionPaneDetailText> - </QuestionPaneDetail> - {table.fields && ( - <FieldList - fields={table.fields} - onFieldClick={f => onItemClick("field", f)} - /> - )} + </PaneContent> </SidebarContent> ); }; diff --git a/frontend/src/metabase/query_builder/components/dataref/SchemaPane.tsx b/frontend/src/metabase/query_builder/components/dataref/SchemaPane.tsx index 04ca2c5bfd5c056dc676f83294ffe6bdd4345984..48e8737cfe0d4f203419bc9b4e962dcfd4b74adc 100644 --- a/frontend/src/metabase/query_builder/components/dataref/SchemaPane.tsx +++ b/frontend/src/metabase/query_builder/components/dataref/SchemaPane.tsx @@ -14,6 +14,7 @@ import { NodeListIcon, NodeListTitleText, } from "./NodeList.styled"; +import { PaneContent } from "./Pane.styled"; interface SchemaPaneProps { onBack: () => void; @@ -39,28 +40,30 @@ const SchemaPane = ({ onBack={onBack} onClose={onClose} > - <NodeListContainer> - <NodeListTitle> - <NodeListIcon name="table" /> - <NodeListTitleText> - {ngettext( - msgid`${tables.length} table`, - `${tables.length} tables`, - tables.length, - )} - </NodeListTitleText> - </NodeListTitle> - <ul> - {tables.map(table => ( - <li key={table.id}> - <NodeListItemLink onClick={() => onItemClick("table", table)}> - <NodeListItemIcon name="table" /> - <NodeListItemName>{table.name}</NodeListItemName> - </NodeListItemLink> - </li> - ))} - </ul> - </NodeListContainer> + <PaneContent> + <NodeListContainer> + <NodeListTitle> + <NodeListIcon name="table" /> + <NodeListTitleText> + {ngettext( + msgid`${tables.length} table`, + `${tables.length} tables`, + tables.length, + )} + </NodeListTitleText> + </NodeListTitle> + <ul> + {tables.map(table => ( + <li key={table.id}> + <NodeListItemLink onClick={() => onItemClick("table", table)}> + <NodeListItemIcon name="table" /> + <NodeListItemName>{table.name}</NodeListItemName> + </NodeListItemLink> + </li> + ))} + </ul> + </NodeListContainer> + </PaneContent> </SidebarContent> ); }; diff --git a/frontend/src/metabase/query_builder/components/dataref/TablePane.tsx b/frontend/src/metabase/query_builder/components/dataref/TablePane.tsx index 236f005b79d29c996129e5a8b1af55e93262f7a0..2795fb580af49e72b66277700a380e7a05435832 100644 --- a/frontend/src/metabase/query_builder/components/dataref/TablePane.tsx +++ b/frontend/src/metabase/query_builder/components/dataref/TablePane.tsx @@ -14,6 +14,7 @@ import SidebarContent from "metabase/query_builder/components/SidebarContent"; import type Table from "metabase-lib/lib/metadata/Table"; import TableInfoLoader from "./TableInfoLoader"; import FieldList from "./FieldList"; +import { PaneContent } from "./Pane.styled"; interface TablePaneProps { onBack: () => void; @@ -33,31 +34,33 @@ const TablePane = ({ table, onItemClick, onBack, onClose }: TablePaneProps) => ( onBack={onBack} onClose={onClose} > - <TableInfoLoader table={table}> - <div className="ml1"> - {table.description ? ( - <Description>{table.description}</Description> - ) : ( - <EmptyDescription>{t`No description`}</EmptyDescription> - )} - </div> - <div className="my2"> - {table.fields.length ? ( - <> - <FieldList - fields={table.fields} - onFieldClick={f => onItemClick("field", f)} - /> - {table.connectedTables() && ( - <ConnectedTableList - tables={table.connectedTables()} - onTableClick={t => onItemClick("table", t)} + <PaneContent> + <TableInfoLoader table={table}> + <div className="ml1"> + {table.description ? ( + <Description>{table.description}</Description> + ) : ( + <EmptyDescription>{t`No description`}</EmptyDescription> + )} + </div> + <div className="my2"> + {table.fields.length ? ( + <> + <FieldList + fields={table.fields} + onFieldClick={f => onItemClick("field", f)} /> - )} - </> - ) : null} - </div> - </TableInfoLoader> + {table.connectedTables() && ( + <ConnectedTableList + tables={table.connectedTables()} + onTableClick={t => onItemClick("table", t)} + /> + )} + </> + ) : null} + </div> + </TableInfoLoader> + </PaneContent> </SidebarContent> );