From 09256f0f2a76aacd0bf8085384c4891ca2aae0a9 Mon Sep 17 00:00:00 2001 From: alesan99 Date: Fri, 3 Jan 2025 15:07:56 -0600 Subject: [PATCH 1/7] Add default Record ID property to QCBX --- .../js_src/lib/components/FormEditor/viewSpec.ts | 1 + .../js_src/lib/components/FormFields/index.tsx | 2 ++ .../js_src/lib/components/FormParse/fields.ts | 2 ++ .../lib/components/Forms/generateFormDefinition.ts | 1 + .../js_src/lib/components/Merging/CompareField.tsx | 1 + .../js_src/lib/components/QueryComboBox/index.tsx | 12 ++++++++++++ 6 files changed, 19 insertions(+) diff --git a/specifyweb/frontend/js_src/lib/components/FormEditor/viewSpec.ts b/specifyweb/frontend/js_src/lib/components/FormEditor/viewSpec.ts index 9a4a6ac76e9..ffbb78ae55a 100644 --- a/specifyweb/frontend/js_src/lib/components/FormEditor/viewSpec.ts +++ b/specifyweb/frontend/js_src/lib/components/FormEditor/viewSpec.ts @@ -862,6 +862,7 @@ const queryComboBoxSpec = ( syncers.maybe(syncers.toBoolean), syncers.default(true) ), + defaultRecordId: syncers.xmlAttribute('initialize defaultRecordId', 'skip'), legacyHelpContext: syncers.xmlAttribute('initialize hc', 'skip'), // Make query compatible with multiple ORMs legacyAdjustQuery: pipe( diff --git a/specifyweb/frontend/js_src/lib/components/FormFields/index.tsx b/specifyweb/frontend/js_src/lib/components/FormFields/index.tsx index 8326cf87091..6ee106c1f82 100644 --- a/specifyweb/frontend/js_src/lib/components/FormFields/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/FormFields/index.tsx @@ -151,6 +151,7 @@ const fieldRenderers: { hasEditButton, hasSearchButton, hasViewButton, + defaultRecordId, }, }) { return field === undefined || !field.isRelationship ? null : ( @@ -168,6 +169,7 @@ const fieldRenderers: { resource={resource} searchView={searchView} typeSearch={typeSearch} + defaultRecordId={defaultRecordId} /> ); }, diff --git a/specifyweb/frontend/js_src/lib/components/FormParse/fields.ts b/specifyweb/frontend/js_src/lib/components/FormParse/fields.ts index 958e4940379..58ee831a7cd 100644 --- a/specifyweb/frontend/js_src/lib/components/FormParse/fields.ts +++ b/specifyweb/frontend/js_src/lib/components/FormParse/fields.ts @@ -61,6 +61,7 @@ export type FieldTypes = { readonly hasViewButton: boolean; readonly typeSearch: string | undefined; readonly searchView: string | undefined; + readonly defaultRecordId: string | undefined; } >; readonly Text: State< @@ -246,6 +247,7 @@ const processFieldType: { : getProperty('viewBtn')?.toLowerCase() === 'true', typeSearch: getProperty('name'), searchView: getProperty('searchView'), + defaultRecordId: getProperty('defaultRecordId'), }; } else { console.error('QueryComboBox can only be used to display a relationship'); diff --git a/specifyweb/frontend/js_src/lib/components/Forms/generateFormDefinition.ts b/specifyweb/frontend/js_src/lib/components/Forms/generateFormDefinition.ts index 26f9963353b..cb76ec68088 100644 --- a/specifyweb/frontend/js_src/lib/components/Forms/generateFormDefinition.ts +++ b/specifyweb/frontend/js_src/lib/components/Forms/generateFormDefinition.ts @@ -218,6 +218,7 @@ function generateForm( typeSearch: undefined, searchView: undefined, isReadOnly: mode === 'view', + defaultRecordId: undefined, }, isRequired: false, viewName: undefined, diff --git a/specifyweb/frontend/js_src/lib/components/Merging/CompareField.tsx b/specifyweb/frontend/js_src/lib/components/Merging/CompareField.tsx index 933815f7548..2a896e885a3 100644 --- a/specifyweb/frontend/js_src/lib/components/Merging/CompareField.tsx +++ b/specifyweb/frontend/js_src/lib/components/Merging/CompareField.tsx @@ -130,6 +130,7 @@ function fieldToDefinition( hasViewButton: false, typeSearch: undefined, searchView: undefined, + defaultRecordId: undefined, }; else if (field.type === 'java.lang.Boolean') return { diff --git a/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx b/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx index 91c764d589d..eab98e834eb 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx @@ -71,6 +71,7 @@ export function QueryComboBox({ typeSearch: initialTypeSearch, forceCollection, searchView, + defaultRecordId, relatedTable: initialRelatedTable, }: { readonly id: string | undefined; @@ -86,10 +87,21 @@ export function QueryComboBox({ readonly typeSearch: TypeSearch | string | undefined; readonly forceCollection: number | undefined; readonly searchView?: string; + readonly defaultRecordId?: string | undefined; readonly relatedTable?: SpecifyTable | undefined; }): JSX.Element { React.useEffect(() => { if (resource === undefined || !resource.isNew()) return; + // TODO: Add special ids CURRENT_AGENT and CURRENT_USER + if (defaultRecordId !== undefined) { + resource.set( + field.name, + resource.get(field.name) ?? getResourceApiUrl(field.relatedTable.name, defaultRecordId), + { + silent: true, + } + ); + } if (field.name === 'cataloger') { const record = toTable(resource, 'CollectionObject'); record?.set( From ffe34d9cfb77ea8ea04a40abb9827aa467dcfd07 Mon Sep 17 00:00:00 2001 From: alesan99 Date: Fri, 3 Jan 2025 21:11:54 +0000 Subject: [PATCH 2/7] Lint code with ESLint and Prettier Triggered by 09256f0f2a76aacd0bf8085384c4891ca2aae0a9 on branch refs/heads/issue-3994-2 --- specifyweb/frontend/js_src/lib/components/FormFields/index.tsx | 2 +- .../frontend/js_src/lib/components/QueryComboBox/index.tsx | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/FormFields/index.tsx b/specifyweb/frontend/js_src/lib/components/FormFields/index.tsx index 6ee106c1f82..2c7a1ad08b9 100644 --- a/specifyweb/frontend/js_src/lib/components/FormFields/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/FormFields/index.tsx @@ -156,6 +156,7 @@ const fieldRenderers: { }) { return field === undefined || !field.isRelationship ? null : ( ); }, diff --git a/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx b/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx index eab98e834eb..62e8b34700a 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx @@ -96,7 +96,8 @@ export function QueryComboBox({ if (defaultRecordId !== undefined) { resource.set( field.name, - resource.get(field.name) ?? getResourceApiUrl(field.relatedTable.name, defaultRecordId), + resource.get(field.name) ?? + getResourceApiUrl(field.relatedTable.name, defaultRecordId), { silent: true, } From 54183958605db695dfab081ee77fd767878e4bb3 Mon Sep 17 00:00:00 2001 From: alesan99 Date: Fri, 3 Jan 2025 15:47:47 -0600 Subject: [PATCH 3/7] Add CURRENT_AGENT, CURRENT_USER, and BLANK --- .../lib/components/QueryComboBox/index.tsx | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx b/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx index eab98e834eb..cd80aa8431e 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx @@ -92,17 +92,27 @@ export function QueryComboBox({ }): JSX.Element { React.useEffect(() => { if (resource === undefined || !resource.isNew()) return; - // TODO: Add special ids CURRENT_AGENT and CURRENT_USER if (defaultRecordId !== undefined) { + let defaultUri: string | null; + if (defaultRecordId === 'CURRENT_AGENT') { + defaultUri = userInformation.agent.resource_uri; + } else if (defaultRecordId === 'CURRENT_USER') { + defaultUri = userInformation.resource_uri; + } else if (defaultRecordId === 'BLANK') { + defaultUri = null; + } else { + defaultUri = getResourceApiUrl(field.relatedTable.name, defaultRecordId); + } + resource.set( field.name, - resource.get(field.name) ?? getResourceApiUrl(field.relatedTable.name, defaultRecordId), + resource.get(field.name) ?? defaultUri, { silent: true, } ); - } - if (field.name === 'cataloger') { + // The following cases can be technically be covered by the above code, but need to be kept for outdated forms + } else if (field.name === 'cataloger') { const record = toTable(resource, 'CollectionObject'); record?.set( 'cataloger', @@ -111,8 +121,7 @@ export function QueryComboBox({ silent: true, } ); - } - if (field.name === 'specifyUser') { + } else if (field.name === 'specifyUser') { const record = toTable(resource, 'RecordSet'); record?.set( 'specifyUser', @@ -121,8 +130,7 @@ export function QueryComboBox({ silent: true, } ); - } - if (field.name === 'receivedBy') { + } else if (field.name === 'receivedBy') { const record = toTable(resource, 'LoanReturnPreparation'); record?.set( 'receivedBy', From b1c2a52142beeb94da16c88e6bb05af47865b508 Mon Sep 17 00:00:00 2001 From: alesan99 Date: Mon, 6 Jan 2025 18:41:27 +0000 Subject: [PATCH 4/7] Lint code with ESLint and Prettier Triggered by b480976fa67dc50978508d389c42d05f7bb5d768 on branch refs/heads/issue-3994-2 --- .../js_src/lib/components/DataModel/resourceApi.ts | 2 +- .../FormSliders/RecordSelectorFromCollection.tsx | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/DataModel/resourceApi.ts b/specifyweb/frontend/js_src/lib/components/DataModel/resourceApi.ts index 3a34f75d87f..6d59163f094 100644 --- a/specifyweb/frontend/js_src/lib/components/DataModel/resourceApi.ts +++ b/specifyweb/frontend/js_src/lib/components/DataModel/resourceApi.ts @@ -902,7 +902,7 @@ export const ResourceBase = Backbone.Model.extend({ }); // Check added to avoid infinite loop in following forEach for collectionRelationship see https://github.com/specify/specify7/issues/6025 - if (self.specifyTable.name === 'CollectionRelationship') return json + if (self.specifyTable.name === 'CollectionRelationship') return json; Object.entries(self.independentResources).forEach( ([fieldName, related]) => { diff --git a/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSelectorFromCollection.tsx b/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSelectorFromCollection.tsx index f00c8ab3ac6..aa2c572b570 100644 --- a/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSelectorFromCollection.tsx +++ b/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSelectorFromCollection.tsx @@ -86,11 +86,11 @@ export function RecordSelectorFromCollection({ isLazy && collection.related?.isNew() !== true && collection.models[index] === undefined - ){ - if (typeof handleFetch === 'function' ) { - handleFetch?.() + ) { + if (typeof handleFetch === 'function') { + handleFetch?.(); } else { - void collection.fetch() + void collection.fetch(); } } }, [collection, isLazy, index, records.length, isToOne, handleFetch]); From 41f21fe0f79beef37119bf4a596ca11efc5f7e6e Mon Sep 17 00:00:00 2001 From: alesan99 Date: Mon, 13 Jan 2025 12:43:30 -0600 Subject: [PATCH 5/7] Change "DefaultRecordId" to "default" (now a Record API Url) Separated Default QCBX logic --- .../lib/components/FormEditor/viewSpec.ts | 2 +- .../lib/components/FormFields/index.tsx | 4 +- .../js_src/lib/components/FormParse/fields.ts | 4 +- .../Forms/generateFormDefinition.ts | 2 +- .../lib/components/Merging/CompareField.tsx | 2 +- .../lib/components/QueryComboBox/helpers.ts | 61 +++++++++++++++++++ .../lib/components/QueryComboBox/index.tsx | 59 ++---------------- 7 files changed, 73 insertions(+), 61 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/FormEditor/viewSpec.ts b/specifyweb/frontend/js_src/lib/components/FormEditor/viewSpec.ts index ffbb78ae55a..4a822a4af41 100644 --- a/specifyweb/frontend/js_src/lib/components/FormEditor/viewSpec.ts +++ b/specifyweb/frontend/js_src/lib/components/FormEditor/viewSpec.ts @@ -862,7 +862,7 @@ const queryComboBoxSpec = ( syncers.maybe(syncers.toBoolean), syncers.default(true) ), - defaultRecordId: syncers.xmlAttribute('initialize defaultRecordId', 'skip'), + defaultRecord: syncers.xmlAttribute('initialize default', 'skip'), legacyHelpContext: syncers.xmlAttribute('initialize hc', 'skip'), // Make query compatible with multiple ORMs legacyAdjustQuery: pipe( diff --git a/specifyweb/frontend/js_src/lib/components/FormFields/index.tsx b/specifyweb/frontend/js_src/lib/components/FormFields/index.tsx index 2c7a1ad08b9..59a527a3e9a 100644 --- a/specifyweb/frontend/js_src/lib/components/FormFields/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/FormFields/index.tsx @@ -151,12 +151,12 @@ const fieldRenderers: { hasEditButton, hasSearchButton, hasViewButton, - defaultRecordId, + defaultRecord, }, }) { return field === undefined || !field.isRelationship ? null : ( ; readonly Text: State< @@ -247,7 +247,7 @@ const processFieldType: { : getProperty('viewBtn')?.toLowerCase() === 'true', typeSearch: getProperty('name'), searchView: getProperty('searchView'), - defaultRecordId: getProperty('defaultRecordId'), + defaultRecord: getProperty('default'), }; } else { console.error('QueryComboBox can only be used to display a relationship'); diff --git a/specifyweb/frontend/js_src/lib/components/Forms/generateFormDefinition.ts b/specifyweb/frontend/js_src/lib/components/Forms/generateFormDefinition.ts index cb76ec68088..3967409274a 100644 --- a/specifyweb/frontend/js_src/lib/components/Forms/generateFormDefinition.ts +++ b/specifyweb/frontend/js_src/lib/components/Forms/generateFormDefinition.ts @@ -218,7 +218,7 @@ function generateForm( typeSearch: undefined, searchView: undefined, isReadOnly: mode === 'view', - defaultRecordId: undefined, + defaultRecord: undefined, }, isRequired: false, viewName: undefined, diff --git a/specifyweb/frontend/js_src/lib/components/Merging/CompareField.tsx b/specifyweb/frontend/js_src/lib/components/Merging/CompareField.tsx index 2a896e885a3..5d09ed540bf 100644 --- a/specifyweb/frontend/js_src/lib/components/Merging/CompareField.tsx +++ b/specifyweb/frontend/js_src/lib/components/Merging/CompareField.tsx @@ -130,7 +130,7 @@ function fieldToDefinition( hasViewButton: false, typeSearch: undefined, searchView: undefined, - defaultRecordId: undefined, + defaultRecord: undefined, }; else if (field.type === 'java.lang.Boolean') return { diff --git a/specifyweb/frontend/js_src/lib/components/QueryComboBox/helpers.ts b/specifyweb/frontend/js_src/lib/components/QueryComboBox/helpers.ts index 5b5d8f78d29..5201dd56f4e 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryComboBox/helpers.ts +++ b/specifyweb/frontend/js_src/lib/components/QueryComboBox/helpers.ts @@ -230,3 +230,64 @@ export function pendingValueToResource( typeof fieldName === 'string' ? { [fieldName]: pendingValue } : {} ); } + +const DEFAULT_RECORD_PRESETS = { + CURRENT_AGENT: () => userInformation.agent.resource_uri, + CURRENT_USER: () => userInformation.resource_uri, + BLANK: () => null, +} as const; +type DefaultRecordPreset = keyof typeof DEFAULT_RECORD_PRESETS; + +export function useQueryComboBoxDefaults({ + resource, + field, + defaultRecord, +}: { + readonly resource: SpecifyResource | undefined; + readonly field: Relationship; + readonly defaultRecord?: string | undefined; +}): void { + if (resource === undefined || !resource.isNew()) return; + + if (defaultRecord !== undefined) { + let defaultUri: string | null = (defaultRecord in DEFAULT_RECORD_PRESETS) + ? DEFAULT_RECORD_PRESETS[defaultRecord as DefaultRecordPreset]() + : defaultRecord; + + resource.set( + field.name, + resource.get(field.name) ?? defaultUri, + { + silent: true, + } + ); + // The following cases need to be kept for outdated forms that do not use the defaultRecord property. + } else if (field.name === 'cataloger') { + const record = toTable(resource, 'CollectionObject'); + record?.set( + 'cataloger', + record?.get('cataloger') ?? userInformation.agent.resource_uri, + { + silent: true, + } + ); + } else if (field.name === 'specifyUser') { + const record = toTable(resource, 'RecordSet'); + record?.set( + 'specifyUser', + record?.get('specifyUser') ?? userInformation.resource_uri, + { + silent: true, + } + ); + } else if (field.name === 'receivedBy') { + const record = toTable(resource, 'LoanReturnPreparation'); + record?.set( + 'receivedBy', + record?.get('receivedBy') ?? userInformation.agent.resource_uri, + { + silent: true, + } + ); + } +}; \ No newline at end of file diff --git a/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx b/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx index cd80aa8431e..4601806695d 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx @@ -12,7 +12,7 @@ import type { RA } from '../../utils/types'; import { filterArray, localized } from '../../utils/types'; import { DataEntry } from '../Atoms/DataEntry'; import { LoadingContext, ReadOnlyContext } from '../Core/Contexts'; -import { backboneFieldSeparator, toTable } from '../DataModel/helpers'; +import { backboneFieldSeparator } from '../DataModel/helpers'; import type { AnySchema } from '../DataModel/helperTypes'; import type { SpecifyResource } from '../DataModel/legacyTypes'; import { @@ -47,6 +47,7 @@ import { getRelatedCollectionId, makeComboBoxQuery, pendingValueToResource, + useQueryComboBoxDefaults, } from './helpers'; import type { TypeSearch } from './spec'; import { useCollectionRelationships } from './useCollectionRelationships'; @@ -71,7 +72,7 @@ export function QueryComboBox({ typeSearch: initialTypeSearch, forceCollection, searchView, - defaultRecordId, + defaultRecord, relatedTable: initialRelatedTable, }: { readonly id: string | undefined; @@ -87,60 +88,10 @@ export function QueryComboBox({ readonly typeSearch: TypeSearch | string | undefined; readonly forceCollection: number | undefined; readonly searchView?: string; - readonly defaultRecordId?: string | undefined; + readonly defaultRecord?: string | undefined; readonly relatedTable?: SpecifyTable | undefined; }): JSX.Element { - React.useEffect(() => { - if (resource === undefined || !resource.isNew()) return; - if (defaultRecordId !== undefined) { - let defaultUri: string | null; - if (defaultRecordId === 'CURRENT_AGENT') { - defaultUri = userInformation.agent.resource_uri; - } else if (defaultRecordId === 'CURRENT_USER') { - defaultUri = userInformation.resource_uri; - } else if (defaultRecordId === 'BLANK') { - defaultUri = null; - } else { - defaultUri = getResourceApiUrl(field.relatedTable.name, defaultRecordId); - } - - resource.set( - field.name, - resource.get(field.name) ?? defaultUri, - { - silent: true, - } - ); - // The following cases can be technically be covered by the above code, but need to be kept for outdated forms - } else if (field.name === 'cataloger') { - const record = toTable(resource, 'CollectionObject'); - record?.set( - 'cataloger', - record?.get('cataloger') ?? userInformation.agent.resource_uri, - { - silent: true, - } - ); - } else if (field.name === 'specifyUser') { - const record = toTable(resource, 'RecordSet'); - record?.set( - 'specifyUser', - record?.get('specifyUser') ?? userInformation.resource_uri, - { - silent: true, - } - ); - } else if (field.name === 'receivedBy') { - const record = toTable(resource, 'LoanReturnPreparation'); - record?.set( - 'receivedBy', - record?.get('receivedBy') ?? userInformation.agent.resource_uri, - { - silent: true, - } - ); - } - }, [resource, field]); + useQueryComboBoxDefaults({resource, field, defaultRecord}); const treeData = useTreeData(resource, field); const collectionRelationships = useCollectionRelationships(resource); From 3036c93b38a23fa098a8d4b8fd9600cb539c0a15 Mon Sep 17 00:00:00 2001 From: alesan99 Date: Mon, 13 Jan 2025 18:51:04 +0000 Subject: [PATCH 6/7] Lint code with ESLint and Prettier Triggered by 007ce675525e447552defa1cd98bb78becef2074 on branch refs/heads/issue-3994-2 --- .../Preferences/UserDefinitions.tsx | 41 ++++++++----------- .../lib/components/QueryComboBox/index.tsx | 2 +- .../js_src/lib/components/TreeView/Row.tsx | 14 ++++--- 3 files changed, 28 insertions(+), 29 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx index d925e9f3c7b..f3856c2fee4 100644 --- a/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx +++ b/specifyweb/frontend/js_src/lib/components/Preferences/UserDefinitions.tsx @@ -1103,8 +1103,7 @@ export const userPreferenceDefinitions = { }, }, recordSet: { - title: () => - tableLabel('RecordSet'), + title: () => tableLabel('RecordSet'), items: { recordToOpen: definePref<'first' | 'last'>({ title: preferencesText.recordSetRecordToOpen(), @@ -1348,7 +1347,9 @@ export const userPreferenceDefinitions = { defaultValue: false, type: 'java.lang.Boolean', }), - orderByField: definePref<'fullName' | 'name' | 'nodeNumber' | 'rankId'>({ + orderByField: definePref< + 'fullName' | 'name' | 'nodeNumber' | 'rankId' + >({ title: preferencesText.sortByField(), requiresReload: false, visible: true, @@ -1413,8 +1414,7 @@ export const userPreferenceDefinitions = { * This would be replaced with labels from schema once * schema is loaded */ - title: () => - tableLabel('Geography'), + title: () => tableLabel('Geography'), items: { treeAccentColor: definePref({ title: preferencesText.treeAccentColor(), @@ -1435,8 +1435,7 @@ export const userPreferenceDefinitions = { }, }, taxon: { - title: () => - tableLabel('Taxon'), + title: () => tableLabel('Taxon'), items: { treeAccentColor: definePref({ title: preferencesText.treeAccentColor(), @@ -1457,8 +1456,7 @@ export const userPreferenceDefinitions = { }, }, storage: { - title: () => - tableLabel('Storage'), + title: () => tableLabel('Storage'), items: { treeAccentColor: definePref({ title: preferencesText.treeAccentColor(), @@ -1479,8 +1477,7 @@ export const userPreferenceDefinitions = { }, }, geologicTimePeriod: { - title: () => - tableLabel('GeologicTimePeriod'), + title: () => tableLabel('GeologicTimePeriod'), items: { treeAccentColor: definePref({ title: preferencesText.treeAccentColor(), @@ -1501,8 +1498,7 @@ export const userPreferenceDefinitions = { }, }, lithoStrat: { - title: () => - tableLabel('LithoStrat'), + title: () => tableLabel('LithoStrat'), items: { treeAccentColor: definePref({ title: preferencesText.treeAccentColor(), @@ -1523,8 +1519,7 @@ export const userPreferenceDefinitions = { }, }, tectonicUnit: { - title: () => - tableLabel('TectonicUnit'), + title: () => tableLabel('TectonicUnit'), items: { treeAccentColor: definePref({ title: preferencesText.treeAccentColor(), @@ -2052,10 +2047,7 @@ import('../DataModel/tables') ), 'Unable to find tree full name value' ); - overwriteReadOnly( - name, - 'title', - getField(tables.Taxon, 'name').label); + overwriteReadOnly(name, 'title', getField(tables.Taxon, 'name').label); overwriteReadOnly( fullName, 'title', @@ -2067,7 +2059,8 @@ import('../DataModel/tables') // Update titles for orderByField const treeOrderByBehavior = - userPreferenceDefinitions.treeEditor.subCategories.behavior.items.orderByField; + userPreferenceDefinitions.treeEditor.subCategories.behavior.items + .orderByField; if ('values' in treeOrderByBehavior) { const orderByValues = treeOrderByBehavior.values as RA<{ readonly value: string; @@ -2112,7 +2105,7 @@ import('../DataModel/tables') overwriteReadOnly( rankId, 'title', - getField(tables.Taxon,'rankId').label + getField(tables.Taxon, 'rankId').label ); overwriteReadOnly( nodeNumber, @@ -2120,11 +2113,13 @@ import('../DataModel/tables') getField(tables.Taxon, 'nodeNumber').label ); } else { - softError('Unable to replace the tree preferences item title for orderByField'); + softError( + 'Unable to replace the tree preferences item title for orderByField' + ); } }) ) - + // Not using softFail here to avoid circular dependency .catch(console.error); diff --git a/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx b/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx index 9f5da46039e..bbaf4bd0915 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/QueryComboBox/index.tsx @@ -91,7 +91,7 @@ export function QueryComboBox({ readonly defaultRecord?: string | undefined; readonly relatedTable?: SpecifyTable | undefined; }): JSX.Element { - useQueryComboBoxDefaults({resource, field, defaultRecord}); + useQueryComboBoxDefaults({ resource, field, defaultRecord }); const treeData = useTreeData(resource, field); const collectionRelationships = useCollectionRelationships(resource); diff --git a/specifyweb/frontend/js_src/lib/components/TreeView/Row.tsx b/specifyweb/frontend/js_src/lib/components/TreeView/Row.tsx index 5e33a25ea64..0d6c06b08c8 100644 --- a/specifyweb/frontend/js_src/lib/components/TreeView/Row.tsx +++ b/specifyweb/frontend/js_src/lib/components/TreeView/Row.tsx @@ -87,11 +87,15 @@ export function TreeRow({ void getRows(row.nodeId).then((fetchedRows: RA) => { const sortedRows = Array.from(fetchedRows).sort( sortFunction( - orderByField === 'rankId' ? (row) => row.rankId : - orderByField === 'nodeNumber' ? (row) => row.nodeNumber : - orderByField === 'name' ? (row) => row.name : - orderByField === 'fullName' ? (row) => row.fullName : - () => 0 + orderByField === 'rankId' + ? (row) => row.rankId + : orderByField === 'nodeNumber' + ? (row) => row.nodeNumber + : orderByField === 'name' + ? (row) => row.name + : orderByField === 'fullName' + ? (row) => row.fullName + : () => 0 ) ); destructorCalled ? undefined : setRows(sortedRows); From ed6c17ba081c5dd83d3e6ed9ec1b7598f289cb17 Mon Sep 17 00:00:00 2001 From: alec_dev Date: Fri, 24 Jan 2025 15:36:36 +0000 Subject: [PATCH 7/7] Lint code with ESLint and Prettier Triggered by d644da792abd0c524a1d21ad3e6c2ef2cfc9b90b on branch refs/heads/issue-3994-2 --- .../lib/components/QueryComboBox/helpers.ts | 93 +++++++++---------- 1 file changed, 45 insertions(+), 48 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/QueryComboBox/helpers.ts b/specifyweb/frontend/js_src/lib/components/QueryComboBox/helpers.ts index dea08e876df..7c8b51bde90 100644 --- a/specifyweb/frontend/js_src/lib/components/QueryComboBox/helpers.ts +++ b/specifyweb/frontend/js_src/lib/components/QueryComboBox/helpers.ts @@ -239,55 +239,52 @@ const DEFAULT_RECORD_PRESETS = { type DefaultRecordPreset = keyof typeof DEFAULT_RECORD_PRESETS; export function useQueryComboBoxDefaults({ - resource, - field, - defaultRecord, + resource, + field, + defaultRecord, }: { - readonly resource: SpecifyResource | undefined; - readonly field: Relationship; - readonly defaultRecord?: string | undefined; + readonly resource: SpecifyResource | undefined; + readonly field: Relationship; + readonly defaultRecord?: string | undefined; }): void { - if (resource === undefined || !resource.isNew()) return; + if (resource === undefined || !resource.isNew()) return; - if (defaultRecord !== undefined) { - let defaultUri: string | null = (defaultRecord in DEFAULT_RECORD_PRESETS) - ? DEFAULT_RECORD_PRESETS[defaultRecord as DefaultRecordPreset]() - : defaultRecord; + if (defaultRecord !== undefined) { + const defaultUri: string | null = + defaultRecord in DEFAULT_RECORD_PRESETS + ? DEFAULT_RECORD_PRESETS[defaultRecord as DefaultRecordPreset]() + : defaultRecord; - resource.set( - field.name, - resource.get(field.name) ?? defaultUri, - { - silent: true, - } - ); - // The following cases need to be kept for outdated forms that do not use the defaultRecord property. - } else if (field.name === 'cataloger') { - const record = toTable(resource, 'CollectionObject'); - record?.set( - 'cataloger', - record?.get('cataloger') ?? userInformation.agent.resource_uri, - { - silent: true, - } - ); - } else if (field.name === 'specifyUser') { - const record = toTable(resource, 'RecordSet'); - record?.set( - 'specifyUser', - record?.get('specifyUser') ?? userInformation.resource_uri, - { - silent: true, - } - ); - } else if (field.name === 'receivedBy') { - const record = toTable(resource, 'LoanReturnPreparation'); - record?.set( - 'receivedBy', - record?.get('receivedBy') ?? userInformation.agent.resource_uri, - { - silent: true, - } - ); - } -}; \ No newline at end of file + resource.set(field.name, resource.get(field.name) ?? defaultUri, { + silent: true, + }); + // The following cases need to be kept for outdated forms that do not use the defaultRecord property. + } else if (field.name === 'cataloger') { + const record = toTable(resource, 'CollectionObject'); + record?.set( + 'cataloger', + record?.get('cataloger') ?? userInformation.agent.resource_uri, + { + silent: true, + } + ); + } else if (field.name === 'specifyUser') { + const record = toTable(resource, 'RecordSet'); + record?.set( + 'specifyUser', + record?.get('specifyUser') ?? userInformation.resource_uri, + { + silent: true, + } + ); + } else if (field.name === 'receivedBy') { + const record = toTable(resource, 'LoanReturnPreparation'); + record?.set( + 'receivedBy', + record?.get('receivedBy') ?? userInformation.agent.resource_uri, + { + silent: true, + } + ); + } +}