diff --git a/lattice/src/App/QueryBuilder/QueryBuilder.module.scss b/lattice/src/App/QueryBuilder/QueryBuilder.module.scss index af2358697..b5bc0985a 100644 --- a/lattice/src/App/QueryBuilder/QueryBuilder.module.scss +++ b/lattice/src/App/QueryBuilder/QueryBuilder.module.scss @@ -115,6 +115,18 @@ .fieldSelector { margin-top: 16px; } + + .filterHeader { + display: flex; + align-items: center; + justify-content: space-between; + margin-top: 8px; + } + + .filterInfo { + vertical-align: text-top; + margin-left: 4px; + } } .savePopover { diff --git a/lattice/src/App/QueryBuilder/QueryBuilder.tsx b/lattice/src/App/QueryBuilder/QueryBuilder.tsx index ec495294b..b8a048556 100644 --- a/lattice/src/App/QueryBuilder/QueryBuilder.tsx +++ b/lattice/src/App/QueryBuilder/QueryBuilder.tsx @@ -1,4 +1,4 @@ -import React, { FC, Fragment, useState } from 'react'; +import React, { FC, Fragment, useEffect, useState } from 'react'; import AddIcon from '@material-ui/icons/Add'; import ArrowForwardIosIcon from '@material-ui/icons/ArrowForwardIos'; import ArrowBackIcon from '@material-ui/icons/ArrowBack'; @@ -30,6 +30,7 @@ import { ResultType } from 'App/Query/QueryContainer'; import { RowCall } from './RowCall'; import { SavedQueries } from './SavedQueries'; import { Select } from 'shared/Select'; +import { stringifyRowData } from './utils'; import css from './QueryBuilder.module.scss'; type QueryBuilderProps = { @@ -46,7 +47,7 @@ type QueryBuilderProps = { columns: string[], operator?: Operator ) => void; - onRunGroupBy: (table: any, rowsData: RowsCallType) => void; + onRunGroupBy: (table: any, rowsData: RowsCallType, filter?: string) => void; onExternalLookup: (table: string, columns: number[]) => void; onClear: () => void; }; @@ -92,12 +93,22 @@ export const QueryBuilder: FC = ({ const [queriesList, setQueriesList] = useState( JSON.parse(localStorage.getItem('saved-queries') || '[]') ); + const [groupByFilters, setGroupByFilters] = useState([]); + const [filter, setFilter] = useState(); const colSizes = JSON.parse( localStorage.getItem('builderColSizes') || '[25, 75]' ); const queryNameIdx = queriesList.findIndex((q) => q.name === queryName); const inEditMode = editSavedIdx >= 0; + useEffect(() => { + setGroupByFilters( + queriesList.filter( + (q) => q.table === selectedTable.name && q.operation === 'Extract' + ) + ); + }, [selectedTable]); + const getColumnsToShow = (cols?: { name: string; show: boolean }[]) => { let columns: string[] = []; const list = cols ? cols : selectedColumns; @@ -216,7 +227,11 @@ export const QueryBuilder: FC = ({ const onRunClick = () => { if (operation === 'GroupBy') { - onRunGroupBy(selectedTable, groupByCall); + const isInvalid = groupByCall.primary ? false : true; + setHasInvalid(isInvalid); + if (!isInvalid) { + onRunGroupBy(selectedTable, groupByCall, filter); + } } else { const { cleanRowCalls, isInvalid } = cleanupRows(); @@ -248,6 +263,7 @@ export const QueryBuilder: FC = ({ operator, rowCalls: cleanRowCalls, groupByCall, + filter, isInvalid }; @@ -282,6 +298,7 @@ export const QueryBuilder: FC = ({ operator, rowCalls, groupByCall, + filter, isInvalid } = queriesList[idx]; const tableDetails = tables.find((t) => t.name === table); @@ -303,10 +320,11 @@ export const QueryBuilder: FC = ({ setQueryName(name); setQueryDescription(description || ''); setHasInvalid(!!isInvalid); + setFilter(filter); if (!isInvalid) { if (operation === 'GroupBy') { - onRunGroupBy(tableDetails, groupByCall); + onRunGroupBy(tableDetails, groupByCall, filter); } else { onQuery(tableDetails, operation, rowCalls, columns, operator); } @@ -338,6 +356,7 @@ export const QueryBuilder: FC = ({ primary: '', secondary: '' }); + setFilter(undefined); onClear(); }; @@ -474,7 +493,7 @@ export const QueryBuilder: FC = ({ /> - {selectedTable + {selectedTable && operation !== 'GroupBy' ? rowCalls.map((rowCall, idx) => ( {idx > 0 ? ( @@ -546,6 +565,7 @@ export const QueryBuilder: FC = ({ primary: value.toString() }) } + error={hasInvalid && !groupByCall.primary} />