diff --git a/specifyweb/frontend/js_src/lib/components/DataModel/__tests__/helpers.test.ts b/specifyweb/frontend/js_src/lib/components/DataModel/__tests__/helpers.test.ts index 1a50b7cf21e..dffcc6cead2 100644 --- a/specifyweb/frontend/js_src/lib/components/DataModel/__tests__/helpers.test.ts +++ b/specifyweb/frontend/js_src/lib/components/DataModel/__tests__/helpers.test.ts @@ -123,6 +123,7 @@ describe('serializeResource', () => { remarks: null, searchSynonymy: null, selectDistinct: null, + selectSeries: null, smushed: null, specifyUser: null, sqlStr: null, diff --git a/specifyweb/frontend/js_src/lib/components/DataModel/types.ts b/specifyweb/frontend/js_src/lib/components/DataModel/types.ts index 07ff83cdde8..19d245bebe3 100644 --- a/specifyweb/frontend/js_src/lib/components/DataModel/types.ts +++ b/specifyweb/frontend/js_src/lib/components/DataModel/types.ts @@ -5291,6 +5291,7 @@ export type SpQuery = { readonly remarks: string | null; readonly searchSynonymy: boolean | null; readonly selectDistinct: boolean | null; + readonly selectSeries: boolean | null; readonly smushed: boolean | null; readonly sqlStr: string | null; readonly timestampCreated: string; diff --git a/specifyweb/frontend/js_src/lib/components/Forms/__tests__/DeleteButton.test.tsx b/specifyweb/frontend/js_src/lib/components/Forms/__tests__/DeleteButton.test.tsx index 5a94340dd2c..c8605fd31f7 100644 --- a/specifyweb/frontend/js_src/lib/components/Forms/__tests__/DeleteButton.test.tsx +++ b/specifyweb/frontend/js_src/lib/components/Forms/__tests__/DeleteButton.test.tsx @@ -105,6 +105,7 @@ overrideAjax( resource_uri: undefined, searchsynonymy: null, selectdistinct: false, + selectseries: false, smushed: null, specifyuser: '/api/specify/specifyuser/2/', sqlstr: null, diff --git a/specifyweb/frontend/js_src/lib/components/QueryBuilder/Toolbar.tsx b/specifyweb/frontend/js_src/lib/components/QueryBuilder/Toolbar.tsx index 4dc73dbf72c..80fdde12d13 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryBuilder/Toolbar.tsx +++ b/specifyweb/frontend/js_src/lib/components/QueryBuilder/Toolbar.tsx @@ -13,6 +13,8 @@ export function QueryToolbar({ showHiddenFields, tableName, isDistinct, + isSeries, + showSeries, onToggleHidden: handleToggleHidden, onToggleDistinct: handleToggleDistinct, onRunCountOnly: handleRunCountOnly, @@ -21,6 +23,8 @@ export function QueryToolbar({ readonly showHiddenFields: boolean; readonly tableName: keyof Tables; readonly isDistinct: boolean; + readonly isSeries: boolean; + readonly showSeries: boolean; readonly onToggleHidden: (value: boolean) => void; readonly onToggleDistinct: () => void; readonly onRunCountOnly: () => void; @@ -38,6 +42,15 @@ export function QueryToolbar({ {hasPermission('/querybuilder/query', 'execute') && ( <> + {showSeries && ( + + + {queryText.series()} + + )} {/* * Query Distinct for trees is disabled because of * https://github.com/specify/specify7/pull/1019#issuecomment-973525594 diff --git a/specifyweb/frontend/js_src/lib/components/QueryBuilder/Wrapped.tsx b/specifyweb/frontend/js_src/lib/components/QueryBuilder/Wrapped.tsx index 1c1b1c82095..0b859e276fe 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryBuilder/Wrapped.tsx +++ b/specifyweb/frontend/js_src/lib/components/QueryBuilder/Wrapped.tsx @@ -94,6 +94,7 @@ function Wrapped({ readonly onChange?: (props: { readonly fields: RA>; readonly isDistinct: boolean | null; + readonly isSeries: boolean | null; }) => void; }): JSX.Element { const [query, setQuery] = useResource(queryResource); @@ -157,8 +158,9 @@ function Wrapped({ handleChange?.({ fields: unParseQueryFields(state.baseTableName, state.fields), isDistinct: query.selectDistinct, + isSeries: query.selectSeries, }); - }, [state, query.selectDistinct]); + }, [state, query.selectDistinct, query.selectSeries]); /** * If tried to save a query, enforce the field length limit for the @@ -296,6 +298,10 @@ function Wrapped({ undefined ); + const showSeries = + table.name === 'CollectionObject' && + state.fields.some((field) => field.mappingPath[0] === 'catalogNumber'); + return treeRanksLoaded ? ( @@ -556,6 +562,8 @@ function Wrapped({ /> runQuery('count')} @@ -570,6 +578,12 @@ function Wrapped({ selectDistinct: !(query.selectDistinct ?? false), }) } + onToggleSeries={(): void => + setQuery({ + ...query, + selectSeries: !(query.selectSeries ?? false), + }) + } onToggleHidden={setShowHiddenFields} /> diff --git a/specifyweb/frontend/js_src/lib/components/QueryBuilder/index.tsx b/specifyweb/frontend/js_src/lib/components/QueryBuilder/index.tsx index 37e36803e15..b9ef427a5ef 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryBuilder/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/QueryBuilder/index.tsx @@ -97,6 +97,7 @@ export function createQuery( query.set('contextName', table.name); query.set('contextTableId', table.tableId); query.set('selectDistinct', false); + query.set('selectSeries', false); query.set('countOnly', false); query.set('formatAuditRecIds', false); query.set('specifyUser', userInformation.resource_uri); diff --git a/specifyweb/frontend/js_src/lib/components/QueryComboBox/helpers.ts b/specifyweb/frontend/js_src/lib/components/QueryComboBox/helpers.ts index 7e64bdf7240..bcdef308ba7 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryComboBox/helpers.ts +++ b/specifyweb/frontend/js_src/lib/components/QueryComboBox/helpers.ts @@ -35,6 +35,7 @@ export function makeComboBoxQuery({ query.set('contextName', table.name); query.set('contextTableId', table.tableId); query.set('selectDistinct', false); + query.set('selectSeries', false); query.set('countOnly', false); query.set('specifyUser', userInformation.resource_uri); query.set('isFavorite', false); diff --git a/specifyweb/frontend/js_src/lib/localization/query.ts b/specifyweb/frontend/js_src/lib/localization/query.ts index 6ddad842103..28aa820a049 100644 --- a/specifyweb/frontend/js_src/lib/localization/query.ts +++ b/specifyweb/frontend/js_src/lib/localization/query.ts @@ -303,6 +303,9 @@ export const queryText = createDictionary({ 'uk-ua': 'Виразний', 'de-ch': 'Unterscheidbar', }, + series: { + 'en-us': 'Series', + }, createCsv: { 'en-us': 'Create CSV', 'ru-ru': 'Создать CSV-файл',