Skip to content

Commit fdc2301

Browse files
Merge pull request #4952 from specify/issue-2000
Add series tool in query builder
2 parents be17b84 + 23b9f0f commit fdc2301

File tree

22 files changed

+807
-445
lines changed

22 files changed

+807
-445
lines changed

config/specify_datamodel.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4169,6 +4169,7 @@
41694169
<field column="Remarks" name="remarks" type="text" length="4096" updatable="true" required="false" unique="false" indexed="false" partialDate="false"/>
41704170
<field column="SearchSynonymy" name="searchSynonymy" type="java.lang.Boolean" updatable="true" required="false" unique="false" indexed="false" partialDate="false"/>
41714171
<field column="SelectDistinct" name="selectDistinct" type="java.lang.Boolean" updatable="true" required="false" unique="false" indexed="false" partialDate="false"/>
4172+
<field column="SelectSeries" name="SelectSeries" type="java.lang.Boolean" updatable="true" required="false" unique="false" indexed="false" partialDate="false"/>
41724173
<field column="Smushed" name="smushed" type="java.lang.Boolean" updatable="true" required="false" unique="false" indexed="false" partialDate="false"/>
41734174
<field column="SqlStr" name="sqlStr" type="text" length="4096" updatable="true" required="false" unique="false" indexed="false" partialDate="false"/>
41744175
<field column="TimestampCreated" name="timestampCreated" type="java.sql.Timestamp" updatable="false" required="true" unique="false" indexed="false" partialDate="false"/>

specifyweb/frontend/js_src/lib/components/DataModel/__tests__/helpers.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ describe('serializeResource', () => {
123123
remarks: null,
124124
searchSynonymy: null,
125125
selectDistinct: null,
126+
selectSeries: null,
126127
smushed: null,
127128
specifyUser: null,
128129
sqlStr: null,

specifyweb/frontend/js_src/lib/components/DataModel/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5299,6 +5299,7 @@ export type SpQuery = {
52995299
readonly remarks: string | null;
53005300
readonly searchSynonymy: boolean | null;
53015301
readonly selectDistinct: boolean | null;
5302+
readonly selectSeries: boolean | null;
53025303
readonly smushed: boolean | null;
53035304
readonly sqlStr: string | null;
53045305
readonly timestampCreated: string;

specifyweb/frontend/js_src/lib/components/Forms/__tests__/DeleteButton.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ overrideAjax(
105105
resource_uri: undefined,
106106
searchsynonymy: null,
107107
selectdistinct: false,
108+
selectseries: false,
108109
smushed: null,
109110
specifyuser: '/api/specify/specifyuser/2/',
110111
sqlstr: null,

specifyweb/frontend/js_src/lib/components/QueryBuilder/Toolbar.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,22 @@ export function QueryToolbar({
1313
showHiddenFields,
1414
tableName,
1515
isDistinct,
16+
isSeries,
17+
showSeries,
1618
onToggleHidden: handleToggleHidden,
1719
onToggleDistinct: handleToggleDistinct,
20+
onToggleSeries: handleToggleSeries,
1821
onRunCountOnly: handleRunCountOnly,
1922
onSubmitClick: handleSubmitClick,
2023
}: {
2124
readonly showHiddenFields: boolean;
2225
readonly tableName: keyof Tables;
2326
readonly isDistinct: boolean;
27+
readonly isSeries: boolean;
28+
readonly showSeries: boolean;
2429
readonly onToggleHidden: (value: boolean) => void;
2530
readonly onToggleDistinct: () => void;
31+
readonly onToggleSeries: () => void;
2632
readonly onRunCountOnly: () => void;
2733
readonly onSubmitClick: () => void;
2834
}): JSX.Element {
@@ -38,6 +44,16 @@ export function QueryToolbar({
3844
<span className="-ml-2 flex-1" />
3945
{hasPermission('/querybuilder/query', 'execute') && (
4046
<>
47+
{showSeries && (
48+
<Label.Inline>
49+
<Input.Checkbox
50+
checked={isSeries}
51+
isReadOnly={isDistinct}
52+
onChange={handleToggleSeries}
53+
/>
54+
{queryText.series()}
55+
</Label.Inline>
56+
)}
4157
{/*
4258
* Query Distinct for trees is disabled because of
4359
* https://github.com/specify/specify7/pull/1019#issuecomment-973525594
@@ -46,6 +62,7 @@ export function QueryToolbar({
4662
<Label.Inline>
4763
<Input.Checkbox
4864
checked={isDistinct}
65+
isReadOnly={isSeries}
4966
onChange={handleToggleDistinct}
5067
/>
5168
{queryText.distinct()}

specifyweb/frontend/js_src/lib/components/QueryBuilder/Wrapped.tsx

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ function Wrapped({
9696
readonly onChange?: (props: {
9797
readonly fields: RA<SerializedResource<SpQueryField>>;
9898
readonly isDistinct: boolean | null;
99+
readonly isSeries: boolean | null;
99100
}) => void;
100101
}): JSX.Element {
101102
const [query, setQuery] = useResource(queryResource);
@@ -160,8 +161,9 @@ function Wrapped({
160161
handleChange?.({
161162
fields: unParseQueryFields(state.baseTableName, state.fields),
162163
isDistinct: query.selectDistinct,
164+
isSeries: query.selectSeries,
163165
});
164-
}, [state, query.selectDistinct]);
166+
}, [state, query.selectDistinct, query.selectSeries]);
165167

166168
/**
167169
* If tried to save a query, enforce the field length limit for the
@@ -299,6 +301,23 @@ function Wrapped({
299301
undefined
300302
);
301303

304+
const showSeries = React.useMemo(
305+
() =>
306+
table.name === 'CollectionObject' &&
307+
state.fields.some(
308+
(field) => field.mappingPath[0] === 'catalogNumber' && field.isDisplay
309+
),
310+
[state, table.name]
311+
);
312+
313+
React.useEffect(() => {
314+
if (!showSeries)
315+
setQuery({
316+
...query,
317+
selectSeries: false,
318+
});
319+
}, [showSeries]);
320+
302321
return treeRanksLoaded ? (
303322
<ReadOnlyContext.Provider value={isReadOnly}>
304323
<IsQueryBasicContext.Provider value={isBasic}>
@@ -559,7 +578,9 @@ function Wrapped({
559578
/>
560579
<QueryToolbar
561580
isDistinct={query.selectDistinct ?? false}
581+
isSeries={query.selectSeries ?? false}
562582
showHiddenFields={showHiddenFields}
583+
showSeries={showSeries}
563584
tableName={table.name}
564585
onRunCountOnly={(): void => runQuery('count')}
565586
onSubmitClick={(): void =>
@@ -574,6 +595,12 @@ function Wrapped({
574595
})
575596
}
576597
onToggleHidden={setShowHiddenFields}
598+
onToggleSeries={(): void =>
599+
setQuery({
600+
...query,
601+
selectSeries: !(query.selectSeries ?? false),
602+
})
603+
}
577604
/>
578605
</div>
579606
{hasPermission('/querybuilder/query', 'execute') && (

specifyweb/frontend/js_src/lib/components/QueryBuilder/__tests__/__snapshots__/fromTree.test.ts.snap

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ exports[`queryFromTree 1`] = `
8686
"name": "Collection Object using \\"Los Angeles County\\"",
8787
"ordinal": 32767,
8888
"selectdistinct": false,
89+
"selectseries": false,
8990
"specifyuser": "/api/specify/specifyuser/2/",
9091
},
9192
{
@@ -160,6 +161,7 @@ exports[`queryFromTree 1`] = `
160161
"name": "Collection Object using \\"Cabinet 1\\"",
161162
"ordinal": 32767,
162163
"selectdistinct": false,
164+
"selectseries": false,
163165
"specifyuser": "/api/specify/specifyuser/2/",
164166
},
165167
{
@@ -234,6 +236,7 @@ exports[`queryFromTree 1`] = `
234236
"name": "Collection Object using \\"Carpiodes velifer\\"",
235237
"ordinal": 32767,
236238
"selectdistinct": false,
239+
"selectseries": false,
237240
"specifyuser": "/api/specify/specifyuser/2/",
238241
},
239242
{
@@ -308,6 +311,7 @@ exports[`queryFromTree 1`] = `
308311
"name": "Collection Object using \\"Paleocene\\"",
309312
"ordinal": 32767,
310313
"selectdistinct": false,
314+
"selectseries": false,
311315
"specifyuser": "/api/specify/specifyuser/2/",
312316
},
313317
{
@@ -382,6 +386,7 @@ exports[`queryFromTree 1`] = `
382386
"name": "Collection Object using \\"Cretaceous\\"",
383387
"ordinal": 32767,
384388
"selectdistinct": false,
389+
"selectseries": false,
385390
"specifyuser": "/api/specify/specifyuser/2/",
386391
},
387392
{
@@ -456,6 +461,7 @@ exports[`queryFromTree 1`] = `
456461
"name": "Collection Object using \\"Plate\\"",
457462
"ordinal": 32767,
458463
"selectdistinct": false,
464+
"selectseries": false,
459465
"specifyuser": "/api/specify/specifyuser/2/",
460466
},
461467
]

specifyweb/frontend/js_src/lib/components/QueryBuilder/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ export function createQuery(
9797
query.set('contextName', table.name);
9898
query.set('contextTableId', table.tableId);
9999
query.set('selectDistinct', false);
100+
query.set('selectSeries', false);
100101
query.set('countOnly', false);
101102
query.set('formatAuditRecIds', false);
102103
query.set('specifyUser', userInformation.resource_uri);

specifyweb/frontend/js_src/lib/components/QueryComboBox/helpers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export function makeComboBoxQuery({
3535
query.set('contextName', table.name);
3636
query.set('contextTableId', table.tableId);
3737
query.set('selectDistinct', false);
38+
query.set('selectSeries', false);
3839
query.set('countOnly', false);
3940
query.set('specifyUser', userInformation.resource_uri);
4041
query.set('isFavorite', false);

specifyweb/frontend/js_src/lib/localization/query.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,9 @@ export const queryText = createDictionary({
303303
'uk-ua': 'Виразний',
304304
'de-ch': 'Unterscheidbar',
305305
},
306+
series: {
307+
'en-us': 'Series',
308+
},
306309
createCsv: {
307310
'en-us': 'Create CSV',
308311
'ru-ru': 'Создать CSV-файл',

0 commit comments

Comments
 (0)