diff --git a/src/components/productView/__tests__/__snapshots__/productView.test.js.snap b/src/components/productView/__tests__/__snapshots__/productView.test.js.snap index 944d8f3dc..1dc463c51 100644 --- a/src/components/productView/__tests__/__snapshots__/productView.test.js.snap +++ b/src/components/productView/__tests__/__snapshots__/productView.test.js.snap @@ -117,6 +117,7 @@ exports[`ProductView Component should allow custom inventory displays via config }, ] } + position="right" t={[Function]} useOnSelect={[Function]} useProductGraphTallyQuery={[Function]} @@ -278,6 +279,7 @@ exports[`ProductView Component should allow custom product views via props: cust }, ] } + position="right" t={[Function]} useOnSelect={[Function]} useProductGraphTallyQuery={[Function]} @@ -501,6 +503,7 @@ exports[`ProductView Component should render a basic component: basic 1`] = ` }, ] } + position="right" t={[Function]} useOnSelect={[Function]} useProductGraphTallyQuery={[Function]} diff --git a/src/components/productView/__tests__/__snapshots__/productViewOpenShiftContainer.test.js.snap b/src/components/productView/__tests__/__snapshots__/productViewOpenShiftContainer.test.js.snap index 810bd58c2..9e7e62bb7 100644 --- a/src/components/productView/__tests__/__snapshots__/productViewOpenShiftContainer.test.js.snap +++ b/src/components/productView/__tests__/__snapshots__/productViewOpenShiftContainer.test.js.snap @@ -230,6 +230,7 @@ exports[`ProductViewOpenShiftContainer Component should render a basic component }, ] } + position="right" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} @@ -260,6 +261,7 @@ exports[`ProductViewOpenShiftContainer Component should render a basic component }, ] } + position="right" t={[Function]} useOnSelect={[Function]} useProductGraphTallyQuery={[Function]} @@ -624,6 +626,7 @@ exports[`ProductViewOpenShiftContainer Component should render a basic component }, ] } + position="right" t={[Function]} useOnSelect={[Function]} useProductGraphTallyQuery={[Function]} diff --git a/src/components/productView/__tests__/__snapshots__/productViewOpenShiftDedicated.test.js.snap b/src/components/productView/__tests__/__snapshots__/productViewOpenShiftDedicated.test.js.snap index a0a50b9ab..88cdf3c7f 100644 --- a/src/components/productView/__tests__/__snapshots__/productViewOpenShiftDedicated.test.js.snap +++ b/src/components/productView/__tests__/__snapshots__/productViewOpenShiftDedicated.test.js.snap @@ -118,6 +118,7 @@ exports[`ProductViewOpenShiftDedicated Component should render a basic component }, ] } + position="right" t={[Function]} useOnSelect={[Function]} useProductGraphTallyQuery={[Function]} diff --git a/src/components/productView/productView.js b/src/components/productView/productView.js index bd50d104f..72f3f3df0 100644 --- a/src/components/productView/productView.js +++ b/src/components/productView/productView.js @@ -11,6 +11,7 @@ import { Toolbar } from '../toolbar/toolbar'; import { ConnectedInventoryList } from '../inventoryList/inventoryList'; import { helpers } from '../../common'; import BannerMessages from '../bannerMessages/bannerMessages'; +import { SelectPosition } from '../form/select'; import { ToolbarFieldGranularity } from '../toolbar/toolbarFieldGranularity'; import InventoryTabs, { InventoryTab } from '../inventoryTabs/inventoryTabs'; import { ConnectedInventorySubscriptions } from '../inventorySubscriptions/inventorySubscriptions'; @@ -104,7 +105,7 @@ const ProductView = ({ t, toolbarGraph, toolbarGraphDescription, useRouteDetail: cardTitle={graphCardTitle} > {(React.isValidElement(toolbarGraph) && toolbarGraph) || - (toolbarGraph !== false && )} + (toolbarGraph !== false && )} diff --git a/src/components/productView/productViewOpenShiftContainer.js b/src/components/productView/productViewOpenShiftContainer.js index daba81787..9d371532c 100644 --- a/src/components/productView/productViewOpenShiftContainer.js +++ b/src/components/productView/productViewOpenShiftContainer.js @@ -8,6 +8,7 @@ import { PageLayout, PageColumns, PageHeader, PageSection, PageToolbar } from '. import { RHSM_API_PATH_ID_TYPES, RHSM_API_QUERY_TYPES } from '../../types/rhsmApiTypes'; import { apiQueries, storeHooks } from '../../redux'; import GraphCard from '../graphCard/graphCard'; +import { SelectPosition } from '../form/select'; import { ToolbarFieldUom } from '../toolbar/toolbarFieldUom'; import { ToolbarFieldGranularity } from '../toolbar/toolbarFieldGranularity'; import { ToolbarFieldRangedMonthly } from '../toolbar/toolbarFieldRangedMonthly'; @@ -107,9 +108,15 @@ const ProductViewOpenShiftContainer = ({ t, useRouteDetail: useAliasRouteDetail viewId={viewId} cardTitle={graphCardTitle} > - {productId === RHSM_API_PATH_ID_TYPES.OPENSHIFT && uomFilter && } - {productId === RHSM_API_PATH_ID_TYPES.OPENSHIFT && } - {productId === RHSM_API_PATH_ID_TYPES.OPENSHIFT_METRICS && } + {productId === RHSM_API_PATH_ID_TYPES.OPENSHIFT && uomFilter && ( + + )} + {productId === RHSM_API_PATH_ID_TYPES.OPENSHIFT && ( + + )} + {productId === RHSM_API_PATH_ID_TYPES.OPENSHIFT_METRICS && ( + + )} diff --git a/src/components/productView/productViewOpenShiftDedicated.js b/src/components/productView/productViewOpenShiftDedicated.js index 52a88374b..5fc043442 100644 --- a/src/components/productView/productViewOpenShiftDedicated.js +++ b/src/components/productView/productViewOpenShiftDedicated.js @@ -1,5 +1,6 @@ import React from 'react'; import { ProductView } from './productView'; +import { SelectPosition } from '../form/select'; import { ToolbarFieldRangedMonthly } from '../toolbar/toolbarFieldRangedMonthly'; /** @@ -8,7 +9,7 @@ import { ToolbarFieldRangedMonthly } from '../toolbar/toolbarFieldRangedMonthly' * @returns {Node} */ const ProductViewOpenShiftDedicated = () => ( - } toolbarGraphDescription /> + } toolbarGraphDescription /> ); /** diff --git a/src/components/toolbar/__tests__/__snapshots__/toolbar.test.js.snap b/src/components/toolbar/__tests__/__snapshots__/toolbar.test.js.snap index 00b9deb50..670f32515 100644 --- a/src/components/toolbar/__tests__/__snapshots__/toolbar.test.js.snap +++ b/src/components/toolbar/__tests__/__snapshots__/toolbar.test.js.snap @@ -63,6 +63,7 @@ exports[`Toolbar Component should handle updating toolbar chips: chips 1`] = ` }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} @@ -133,6 +134,7 @@ exports[`Toolbar Component should hide categories when a single filter is availa }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} @@ -210,6 +212,7 @@ exports[`Toolbar Component should render a basic component: basic 1`] = ` }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} @@ -249,6 +252,7 @@ exports[`Toolbar Component should render a basic component: basic 1`] = ` }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} diff --git a/src/components/toolbar/__tests__/__snapshots__/toolbarFieldRangedMonthly.test.js.snap b/src/components/toolbar/__tests__/__snapshots__/toolbarFieldRangedMonthly.test.js.snap index 511d9b940..b16d785e0 100644 --- a/src/components/toolbar/__tests__/__snapshots__/toolbarFieldRangedMonthly.test.js.snap +++ b/src/components/toolbar/__tests__/__snapshots__/toolbarFieldRangedMonthly.test.js.snap @@ -239,7 +239,7 @@ exports[`ToolbarFieldRangedMonthly Component should handle selecting an option d ] } placeholder="t(curiosity-toolbar.placeholder, {\\"context\\":\\"rangedMonthly\\"})" - position="right" + position="left" selectedOptions={null} toggleIcon={null} variant="single" @@ -428,7 +428,7 @@ exports[`ToolbarFieldRangedMonthly Component should render a basic component: ba ] } placeholder="t(curiosity-toolbar.placeholder, {\\"context\\":\\"rangedMonthly\\"})" - position="right" + position="left" selectedOptions={null} toggleIcon={null} variant="single" diff --git a/src/components/toolbar/__tests__/__snapshots__/toolbarFieldSelectCategory.test.js.snap b/src/components/toolbar/__tests__/__snapshots__/toolbarFieldSelectCategory.test.js.snap index da8719d1c..a45cbcba6 100644 --- a/src/components/toolbar/__tests__/__snapshots__/toolbarFieldSelectCategory.test.js.snap +++ b/src/components/toolbar/__tests__/__snapshots__/toolbarFieldSelectCategory.test.js.snap @@ -29,6 +29,7 @@ Array [ }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductGraphTallyQuery={[Function]} @@ -175,6 +176,7 @@ Array [ }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductGraphTallyQuery={[Function]} @@ -311,6 +313,7 @@ Array [ }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} @@ -359,6 +362,7 @@ Array [ }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} @@ -417,6 +421,7 @@ Array [ }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} @@ -521,6 +526,7 @@ exports[`ToolbarFieldSelectCategory Component should render a basic component: b }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} @@ -579,6 +585,7 @@ exports[`ToolbarFieldSelectCategory Component should render a basic component: b }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} @@ -658,6 +665,7 @@ Object { }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} @@ -716,6 +724,7 @@ Object { }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} @@ -783,6 +792,7 @@ Object { }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} @@ -841,6 +851,7 @@ Object { }, ] } + position="left" t={[Function]} useOnSelect={[Function]} useProductQuery={[Function]} diff --git a/src/components/toolbar/toolbar.js b/src/components/toolbar/toolbar.js index 535b343fe..f16b124db 100644 --- a/src/components/toolbar/toolbar.js +++ b/src/components/toolbar/toolbar.js @@ -95,12 +95,11 @@ const Toolbar = ({ )} {options.map(({ title, value, component, isClearable, options: filterOptions }) => { - const chipProps = {}; + const chipProps = { categoryName: title }; if (isClearable !== false) { chipProps.chips = setSelectedOptions({ options: filterOptions, value }); chipProps.deleteChip = () => onClearFilter({ options: filterOptions, value }); - chipProps.categoryName = title; } return ( diff --git a/src/components/toolbar/toolbarFieldGranularity.js b/src/components/toolbar/toolbarFieldGranularity.js index 24e888ecf..db8f0c7a5 100644 --- a/src/components/toolbar/toolbarFieldGranularity.js +++ b/src/components/toolbar/toolbarFieldGranularity.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { reduxTypes, storeHooks } from '../../redux'; import { useProduct, useProductGraphTallyQuery } from '../productView/productViewContext'; -import { Select } from '../form/select'; +import { Select, SelectPosition } from '../form/select'; import { RHSM_API_QUERY_GRANULARITY_TYPES as FIELD_TYPES, RHSM_API_QUERY_TYPES } from '../../types/rhsmApiTypes'; import { dateHelpers } from '../../common'; import { translate } from '../i18n/i18n'; @@ -66,6 +66,7 @@ const useOnSelect = ({ * @param {object} props * @param {boolean} props.isFilter * @param {Array} props.options + * @param {string} props.position * @param {Function} props.t * @param {Function} props.useOnSelect * @param {Function} props.useProductGraphTallyQuery @@ -74,6 +75,7 @@ const useOnSelect = ({ const ToolbarFieldGranularity = ({ isFilter, options, + position, t, useOnSelect: useAliasOnSelect, useProductGraphTallyQuery: useAliasProductGraphTallyQuery @@ -89,6 +91,7 @@ const ToolbarFieldGranularity = ({ options={updatedOptions} selectedOptions={updatedValue} placeholder={t(`curiosity-toolbar.placeholder${(isFilter && '_filter') || ''}`, { context: 'granularity' })} + position={position} data-test="toolbarFieldGranularity" /> ); @@ -98,7 +101,7 @@ const ToolbarFieldGranularity = ({ * Prop types. * * @type {{useOnSelect: Function, useProductGraphTallyQuery: Function, t: Function, isFilter: boolean, - * options: Array}} + * options: Array, position: string}} */ ToolbarFieldGranularity.propTypes = { isFilter: PropTypes.bool, @@ -109,6 +112,7 @@ ToolbarFieldGranularity.propTypes = { selected: PropTypes.bool }) ), + position: PropTypes.string, t: PropTypes.func, useOnSelect: PropTypes.func, useProductGraphTallyQuery: PropTypes.func @@ -118,11 +122,12 @@ ToolbarFieldGranularity.propTypes = { * Default props. * * @type {{useOnSelect: Function, useProductGraphTallyQuery: Function, t: Function, isFilter: boolean, - * options: Array}} + * options: Array, position: string}} */ ToolbarFieldGranularity.defaultProps = { isFilter: false, options: toolbarFieldOptions, + position: SelectPosition.left, t: translate, useOnSelect, useProductGraphTallyQuery diff --git a/src/components/toolbar/toolbarFieldRangedMonthly.js b/src/components/toolbar/toolbarFieldRangedMonthly.js index 87acbbbbe..6b9ba3958 100644 --- a/src/components/toolbar/toolbarFieldRangedMonthly.js +++ b/src/components/toolbar/toolbarFieldRangedMonthly.js @@ -65,6 +65,7 @@ const useOnSelect = ({ * @param {object} props * @param {boolean} props.isFilter * @param {Array} props.options + * @param {string} props.position * @param {Function} props.t * @param {Function} props.useOnSelect * @param {Function} props.useProductGraphTallyQuery @@ -73,6 +74,7 @@ const useOnSelect = ({ const ToolbarFieldRangedMonthly = ({ isFilter, options, + position, t, useOnSelect: useAliasOnSelect, useProductGraphTallyQuery: useAliasProductGraphTallyQuery @@ -91,7 +93,7 @@ const ToolbarFieldRangedMonthly = ({ onSelect={onSelect} options={updatedOptions} placeholder={t(`curiosity-toolbar.placeholder${(isFilter && '_filter') || ''}`, { context: 'rangedMonthly' })} - position={SelectPosition.right} + position={position} maxHeight={250} data-test="toolbarFieldRangeGranularity" /> @@ -102,7 +104,7 @@ const ToolbarFieldRangedMonthly = ({ * Prop types. * * @type {{useOnSelect: Function, useProductGraphTallyQuery: Function, t: Function, isFilter: boolean, - * options: Array}} + * options: Array, position: string}} */ ToolbarFieldRangedMonthly.propTypes = { isFilter: PropTypes.bool, @@ -113,6 +115,7 @@ ToolbarFieldRangedMonthly.propTypes = { selected: PropTypes.bool }) ), + position: PropTypes.string, t: PropTypes.func, useOnSelect: PropTypes.func, useProductGraphTallyQuery: PropTypes.func @@ -122,11 +125,12 @@ ToolbarFieldRangedMonthly.propTypes = { * Default props. * * @type {{useOnSelect: Function, useProductGraphTallyQuery: Function, t: Function, isFilter: boolean, - * options: Array}} + * options: Array, position: string}} */ ToolbarFieldRangedMonthly.defaultProps = { isFilter: false, options: toolbarFieldOptions, + position: SelectPosition.left, t: translate, useOnSelect, useProductGraphTallyQuery diff --git a/src/components/toolbar/toolbarFieldSla.js b/src/components/toolbar/toolbarFieldSla.js index 9fd6e2853..3e36984b0 100644 --- a/src/components/toolbar/toolbarFieldSla.js +++ b/src/components/toolbar/toolbarFieldSla.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { reduxTypes, storeHooks } from '../../redux'; import { useProduct, useProductQuery } from '../productView/productViewContext'; -import { Select } from '../form/select'; +import { Select, SelectPosition } from '../form/select'; import { RHSM_API_QUERY_SLA_TYPES as FIELD_TYPES, RHSM_API_QUERY_TYPES } from '../../types/rhsmApiTypes'; import { translate } from '../i18n/i18n'; @@ -54,6 +54,7 @@ const useOnSelect = ({ * @param {object} props * @param {boolean} props.isFilter * @param {object} props.options + * @param {string} props.position * @param {Function} props.t * @param {Function} props.useOnSelect * @param {Function} props.useProductQuery @@ -62,6 +63,7 @@ const useOnSelect = ({ const ToolbarFieldSla = ({ isFilter, options, + position, t, useOnSelect: useAliasOnSelect, useProductQuery: useAliasProductQuery @@ -78,6 +80,7 @@ const ToolbarFieldSla = ({ options={updatedOptions} selectedOptions={updatedValue} placeholder={t(`curiosity-toolbar.placeholder${(isFilter && '_filter') || ''}`, { context: 'sla' })} + position={position} data-test="toolbarFieldSla" /> ); @@ -86,7 +89,8 @@ const ToolbarFieldSla = ({ /** * Prop types. * - * @type {{useOnSelect: Function, t: Function, isFilter: boolean, options: Array, useProductQuery: Function}} + * @type {{useOnSelect: Function, t: Function, isFilter: boolean, options: Array, useProductQuery: Function, + * position: string}} */ ToolbarFieldSla.propTypes = { isFilter: PropTypes.bool, @@ -97,6 +101,7 @@ ToolbarFieldSla.propTypes = { selected: PropTypes.bool }) ), + position: PropTypes.string, t: PropTypes.func, useOnSelect: PropTypes.func, useProductQuery: PropTypes.func @@ -105,11 +110,13 @@ ToolbarFieldSla.propTypes = { /** * Default props. * - * @type {{useOnSelect: Function, t: Function, isFilter: boolean, options: Array, useProductQuery: Function}} + * @type {{useOnSelect: Function, t: Function, isFilter: boolean, options: Array, useProductQuery: Function, + * position: string}} */ ToolbarFieldSla.defaultProps = { isFilter: false, options: toolbarFieldOptions, + position: SelectPosition.left, t: translate, useOnSelect, useProductQuery diff --git a/src/components/toolbar/toolbarFieldUom.js b/src/components/toolbar/toolbarFieldUom.js index 14c7a44c6..a198bc999 100644 --- a/src/components/toolbar/toolbarFieldUom.js +++ b/src/components/toolbar/toolbarFieldUom.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { reduxTypes, storeHooks } from '../../redux'; import { useProduct, useProductQuery } from '../productView/productViewContext'; -import { Select } from '../form/select'; +import { Select, SelectPosition } from '../form/select'; import { RHSM_API_QUERY_UOM_TYPES as FIELD_TYPES, RHSM_API_QUERY_TYPES } from '../../types/rhsmApiTypes'; import { translate } from '../i18n/i18n'; @@ -53,6 +53,7 @@ const useOnSelect = ({ * @param {object} props * @param {boolean} props.isFilter * @param {Array} props.options + * @param {string} props.position * @param {Function} props.t * @param {Function} props.useOnSelect * @param {Function} props.useProductQuery @@ -61,6 +62,7 @@ const useOnSelect = ({ const ToolbarFieldUom = ({ isFilter, options, + position, t, useOnSelect: useAliasOnSelect, useProductQuery: useAliasProductQuery @@ -77,6 +79,7 @@ const ToolbarFieldUom = ({ options={updatedOptions} selectedOptions={updatedValue} placeholder={t(`curiosity-toolbar.placeholder${(isFilter && '_filter') || ''}`, { context: 'uom' })} + position={position} data-test="toolbarFieldUom" /> ); @@ -85,7 +88,8 @@ const ToolbarFieldUom = ({ /** * Prop types. * - * @type {{useOnSelect: Function, t: Function, isFilter: boolean, options: Array, useProductQuery: Function}} + * @type {{useOnSelect: Function, t: Function, isFilter: boolean, options: Array, useProductQuery: Function, + * position: string}} */ ToolbarFieldUom.propTypes = { isFilter: PropTypes.bool, @@ -96,6 +100,7 @@ ToolbarFieldUom.propTypes = { selected: PropTypes.bool }) ), + position: PropTypes.string, t: PropTypes.func, useOnSelect: PropTypes.func, useProductQuery: PropTypes.func @@ -104,11 +109,13 @@ ToolbarFieldUom.propTypes = { /** * Default props. * - * @type {{useOnSelect: Function, t: Function, isFilter: boolean, options: Array, useProductQuery: Function}} + * @type {{useOnSelect: Function, t: Function, isFilter: boolean, options: Array, useProductQuery: Function, + * position: string}} */ ToolbarFieldUom.defaultProps = { isFilter: false, options: toolbarFieldOptions, + position: SelectPosition.left, t: translate, useOnSelect, useProductQuery diff --git a/src/components/toolbar/toolbarFieldUsage.js b/src/components/toolbar/toolbarFieldUsage.js index a135674bf..eda91a4ef 100644 --- a/src/components/toolbar/toolbarFieldUsage.js +++ b/src/components/toolbar/toolbarFieldUsage.js @@ -2,7 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { reduxTypes, storeHooks } from '../../redux'; import { useProduct, useProductQuery } from '../productView/productViewContext'; -import { Select } from '../form/select'; +import { Select, SelectPosition } from '../form/select'; import { RHSM_API_QUERY_USAGE_TYPES as FIELD_TYPES, RHSM_API_QUERY_TYPES } from '../../types/rhsmApiTypes'; import { translate } from '../i18n/i18n'; @@ -53,6 +53,7 @@ const useOnSelect = ({ * @param {object} props * @param {boolean} props.isFilter * @param {object} props.options + * @param {string} props.position * @param {Function} props.t * @param {Function} props.useOnSelect * @param {Function} props.useProductQuery @@ -61,6 +62,7 @@ const useOnSelect = ({ const ToolbarFieldUsage = ({ isFilter, options, + position, t, useOnSelect: useAliasOnSelect, useProductQuery: useAliasProductQuery @@ -77,6 +79,7 @@ const ToolbarFieldUsage = ({ options={updatedOptions} selectedOptions={updatedValue} placeholder={t(`curiosity-toolbar.placeholder${(isFilter && '_filter') || ''}`, { context: 'usage' })} + position={position} data-test="toolbarFieldUsage" /> ); @@ -85,7 +88,8 @@ const ToolbarFieldUsage = ({ /** * Prop types. * - * @type {{useOnSelect: Function, t: Function, isFilter: boolean, options: Array, useProductQuery: Function}} + * @type {{useOnSelect: Function, t: Function, isFilter: boolean, options: Array, useProductQuery: Function, + * position: string}} */ ToolbarFieldUsage.propTypes = { isFilter: PropTypes.bool, @@ -96,6 +100,7 @@ ToolbarFieldUsage.propTypes = { selected: PropTypes.bool }) ), + position: PropTypes.string, t: PropTypes.func, useOnSelect: PropTypes.func, useProductQuery: PropTypes.func @@ -104,12 +109,14 @@ ToolbarFieldUsage.propTypes = { /** * Default props. * - * @type {{useOnSelect: Function, t: Function, isFilter: boolean, options: Array, useProductQuery: Function}} + * @type {{useOnSelect: Function, t: Function, isFilter: boolean, options: Array, useProductQuery: Function, + * position: string}} */ ToolbarFieldUsage.defaultProps = { isFilter: false, options: toolbarFieldOptions, + position: SelectPosition.left, t: translate, useOnSelect, useProductQuery