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-файл',