diff --git a/frontend/src/metabase-lib/lib/metadata/Database.ts b/frontend/src/metabase-lib/lib/metadata/Database.ts index 056df41d54215ee00988f197c3d283b80320304d..d519555ef647314dbaef980934919f222a85ae50 100644 --- a/frontend/src/metabase-lib/lib/metadata/Database.ts +++ b/frontend/src/metabase-lib/lib/metadata/Database.ts @@ -98,6 +98,10 @@ class DatabaseInner extends Base { return this.hasFeature("expressions") && this.hasFeature("left-join"); } + supportsExpressions() { + return this.hasFeature("expressions"); + } + canWrite() { return this.native_permissions === "write"; } diff --git a/frontend/src/metabase/components/DateAllOptionsWidget/DateAllOptionsWidget.tsx b/frontend/src/metabase/components/DateAllOptionsWidget/DateAllOptionsWidget.tsx index f4350ecdacb705525ef104b5c991e18f9e3acbd1..d5a1d406293354e9d7fae6190685c32dddd45dcd 100644 --- a/frontend/src/metabase/components/DateAllOptionsWidget/DateAllOptionsWidget.tsx +++ b/frontend/src/metabase/components/DateAllOptionsWidget/DateAllOptionsWidget.tsx @@ -50,6 +50,7 @@ const DateAllOptionsWidget = ({ hideTimeSelectors hideEmptinessOperators disableOperatorSelection={disableOperatorSelection} + supportsExpressions > <UpdateButton className={cx({ diff --git a/frontend/src/metabase/query_builder/components/filters/FilterPopover/FilterPopover.tsx b/frontend/src/metabase/query_builder/components/filters/FilterPopover/FilterPopover.tsx index cbeec8fe33cc71f3e0c4fa5b06a9608c3c0c273f..7b4befaec2d6f5ce198fdbae105dee5f536ad7b6 100644 --- a/frontend/src/metabase/query_builder/components/filters/FilterPopover/FilterPopover.tsx +++ b/frontend/src/metabase/query_builder/components/filters/FilterPopover/FilterPopover.tsx @@ -250,6 +250,7 @@ export default class FilterPopover extends Component<Props, State> { }; const shouldShowDatePicker = field?.isDate() && !field?.isTime(); + const supportsExpressions = query.database()?.supportsExpressions(); return ( <div className={className} style={{ minWidth: MIN_WIDTH, ...style }}> @@ -265,6 +266,7 @@ export default class FilterPopover extends Component<Props, State> { onCommit={this.handleCommit} onFilterChange={this.handleFilterChange} disableChangingDimension={!showFieldPicker} + supportsExpressions={supportsExpressions} > <Button data-ui-tag="add-filter" diff --git a/frontend/src/metabase/query_builder/components/filters/pickers/DatePicker/DatePicker.tsx b/frontend/src/metabase/query_builder/components/filters/pickers/DatePicker/DatePicker.tsx index 234a4f63d06eb7a03b0c82b5d94338933123a8e8..e3d1be36903f45c69c64a890e5a0f21044ff85c0 100644 --- a/frontend/src/metabase/query_builder/components/filters/pickers/DatePicker/DatePicker.tsx +++ b/frontend/src/metabase/query_builder/components/filters/pickers/DatePicker/DatePicker.tsx @@ -237,6 +237,7 @@ type Props = { hideEmptinessOperators?: boolean; disableOperatorSelection?: boolean; disableChangingDimension?: boolean; + supportsExpressions?: boolean; primaryColor?: string; minWidth?: number | null; @@ -255,6 +256,7 @@ const DatePicker: React.FC<Props> = props => { onFilterChange, disableOperatorSelection, disableChangingDimension, + supportsExpressions, primaryColor, onCommit, children, @@ -313,6 +315,7 @@ const DatePicker: React.FC<Props> = props => { filter={filter} onCommit={onCommit} primaryColor={primaryColor} + supportsExpressions={supportsExpressions} onFilterChange={(filter: Filter) => { if (!isStartingFrom(filter) && operator && operator.init) { onFilterChange(operator.init(filter)); diff --git a/frontend/src/metabase/query_builder/components/filters/pickers/DatePicker/RelativeDatePicker.tsx b/frontend/src/metabase/query_builder/components/filters/pickers/DatePicker/RelativeDatePicker.tsx index 58a1c489554070efa206dc8a81749ffd60fb4371..dc0379b0fe8da2ad965e2a6852f12d85e143f21f 100644 --- a/frontend/src/metabase/query_builder/components/filters/pickers/DatePicker/RelativeDatePicker.tsx +++ b/frontend/src/metabase/query_builder/components/filters/pickers/DatePicker/RelativeDatePicker.tsx @@ -36,6 +36,7 @@ type RelativeDatePickerProps = { offsetFormatter: (value: number) => number; primaryColor?: string; reverseIconDirection?: boolean; + supportsExpressions?: boolean; }; type OptionsContentProps = RelativeDatePickerProps & { @@ -106,6 +107,7 @@ const OptionsContent: React.FC<OptionsContentProps> = ({ onFilterChange, reverseIconDirection, setOptionsVisible, + supportsExpressions, }) => { const options = filter[4] || {}; const includeCurrent = !!options["include-current"]; @@ -128,14 +130,16 @@ const OptionsContent: React.FC<OptionsContentProps> = ({ return ( <OptionsContainer> - <OptionButton - icon="arrow_left_to_line" - primaryColor={primaryColor} - reverseIconDirection={reverseIconDirection} - onClick={handleClickOnStartingFrom} - > - {t`Starting from...`} - </OptionButton> + {supportsExpressions && ( + <OptionButton + icon="arrow_left_to_line" + primaryColor={primaryColor} + reverseIconDirection={reverseIconDirection} + onClick={handleClickOnStartingFrom} + > + {t`Starting from...`} + </OptionButton> + )} <OptionButton selected={includeCurrent} primaryColor={primaryColor} @@ -157,7 +161,6 @@ const RelativeDatePicker: React.FC<RelativeDatePickerProps> = props => { offsetFormatter = value => value, className, primaryColor, - reverseIconDirection, } = props; const startingFrom = getStartingFrom(filter); diff --git a/frontend/src/metabase/query_builder/components/notebook/lib/steps.js b/frontend/src/metabase/query_builder/components/notebook/lib/steps.js index 65f06b2a14e694573d8559d42e28dfa16bf8124c..abf6fd7c6f995e579697c01a3a9d91f48c1e715a 100644 --- a/frontend/src/metabase/query_builder/components/notebook/lib/steps.js +++ b/frontend/src/metabase/query_builder/components/notebook/lib/steps.js @@ -38,8 +38,7 @@ const STEPS = [ }, { type: "expression", - valid: query => - query.hasData() && query.database().hasFeature("expressions"), + valid: query => query.hasData() && query.database().supportsExpressions(), active: query => query.hasExpressions(), revert: query => query.clearExpressions(), clean: query => query.cleanExpressions(),