From 62c52e1023be6b627a5373e639ee78bcb233d568 Mon Sep 17 00:00:00 2001 From: Caroline D <108160931+CarolineDenis@users.noreply.github.com> Date: Fri, 10 May 2024 14:21:53 -0400 Subject: [PATCH 1/3] Display create RC and Gallery tool only for fictious RC with same resource type Fixes #4898 --- .../FormSliders/RecordSelectorFromIds.tsx | 8 +++++--- .../lib/components/FormSliders/RecordSet.tsx | 19 +++++++++++++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSelectorFromIds.tsx b/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSelectorFromIds.tsx index d21186d8de6..84f59163ad8 100644 --- a/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSelectorFromIds.tsx +++ b/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSelectorFromIds.tsx @@ -48,6 +48,7 @@ export function RecordSelectorFromIds({ onClone: handleClone, onDelete: handleDelete, onFetch: handleFetch, + hasSeveralResourceType, ...rest }: Omit, 'index' | 'records'> & { /* @@ -74,6 +75,7 @@ export function RecordSelectorFromIds({ readonly onFetch?: ( index: number ) => Promise | undefined>; + readonly hasSeveralResourceType?: boolean; }): JSX.Element | null { const [records, setRecords] = React.useState< RA | undefined> @@ -183,8 +185,6 @@ export function RecordSelectorFromIds({ const hasAttachments = tablesWithAttachments().includes(table); - const isNewRecordSet = isInRecordSet && title === undefined; - return ( <> ({ className={`flex-1 ${dialog === false ? '-ml-2' : '-ml-4'}`} /> )} - {hasAttachments && !isNewRecordSet ? ( + {hasAttachments && + !hasSeveralResourceType && + !resource?.isNew() ? ( ) : undefined} {specifyNetworkBadge} diff --git a/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSet.tsx b/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSet.tsx index c2164d47d06..00ce8e2cbfa 100644 --- a/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSet.tsx +++ b/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSet.tsx @@ -27,7 +27,7 @@ import { } from '../DataModel/resource'; import { serializeResource } from '../DataModel/serializers'; import { tables } from '../DataModel/tables'; -import type { RecordSet as RecordSetSchema } from '../DataModel/types'; +import type { RecordSet as RecordSetSchema, Tables } from '../DataModel/types'; import { softFail } from '../Errors/Crash'; import { recordSetView } from '../FormParse/webOnlyViews'; import { ResourceView } from '../Forms/ResourceView'; @@ -290,6 +290,12 @@ function RecordSet({ const [hasDuplicate, handleHasDuplicate, handleDismissDuplicate] = useBooleanState(); + const [hasSeveralResourceType, setHasSeveralResourceType] = + React.useState(false); + const [resourceType, setResourceType] = React.useState< + keyof Tables | undefined + >(undefined); + async function handleAdd( resources: RA>, wasNew: boolean @@ -297,6 +303,12 @@ function RecordSet({ if (!recordSet.isNew()) await addIdsToRecordSet(resources.map(({ id }) => id)); go(totalCount, resources[0].id, undefined, wasNew); + if (resourceType === undefined) { + setResourceType(resources[0].specifyTable.name); + } else if (resourceType !== resources.at(-1)?.specifyTable.name) { + setHasSeveralResourceType(true); + setResourceType(resources.at(-1)?.specifyTable.name); + } setIds((oldIds = []) => updateIds( oldIds, @@ -338,7 +350,9 @@ function RecordSet({ dialog={dialog} headerButtons={ recordSet.isNew() ? ( - ids.length > 1 && !currentRecord.isNew() ? ( + ids.length > 1 && + !currentRecord.isNew() && + !hasSeveralResourceType ? ( ({ ) } + hasSeveralResourceType={hasSeveralResourceType} ids={ids} isDependent={false} isInRecordSet From d226da676f29b9d69070589153060a994b2f6304 Mon Sep 17 00:00:00 2001 From: Caroline D <108160931+CarolineDenis@users.noreply.github.com> Date: Fri, 10 May 2024 18:27:50 +0000 Subject: [PATCH 2/3] Lint code with ESLint and Prettier Triggered by 62c52e1023be6b627a5373e639ee78bcb233d568 on branch refs/heads/issue-4898 --- .../frontend/js_src/lib/components/FormSliders/RecordSet.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSet.tsx b/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSet.tsx index 00ce8e2cbfa..31a9120031d 100644 --- a/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSet.tsx +++ b/specifyweb/frontend/js_src/lib/components/FormSliders/RecordSet.tsx @@ -348,6 +348,7 @@ function RecordSet({ {...rest} defaultIndex={currentIndex} dialog={dialog} + hasSeveralResourceType={hasSeveralResourceType} headerButtons={ recordSet.isNew() ? ( ids.length > 1 && @@ -363,7 +364,6 @@ function RecordSet({ ) } - hasSeveralResourceType={hasSeveralResourceType} ids={ids} isDependent={false} isInRecordSet From 15d2cb3cd8a3b91659a7c5ff8bdac8b15aba8c13 Mon Sep 17 00:00:00 2001 From: Grant Fitzsimmons <37256050+grantfitzsimmons@users.noreply.github.com> Date: Thu, 6 Jun 2024 20:49:35 +0000 Subject: [PATCH 3/3] Lint code with ESLint and Prettier Triggered by 3165c9ab8fb5e8bb9342f42b285dbaaac46feddb on branch refs/heads/issue-4898 --- .../js_src/lib/components/DataModel/businessRules.ts | 8 ++++---- .../js_src/lib/components/DataModel/resourceApi.ts | 2 +- .../frontend/js_src/lib/components/Merging/index.tsx | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/specifyweb/frontend/js_src/lib/components/DataModel/businessRules.ts b/specifyweb/frontend/js_src/lib/components/DataModel/businessRules.ts index af6617de781..53622f481d2 100644 --- a/specifyweb/frontend/js_src/lib/components/DataModel/businessRules.ts +++ b/specifyweb/frontend/js_src/lib/components/DataModel/businessRules.ts @@ -483,12 +483,12 @@ export const runAllFieldChecks = async ( ): Promise => { const relationships = resource.specifyTable.relationships; await Promise.all( - relationships.map(({ name }) => + relationships.map(async ({ name }) => resource.businessRuleManager?.checkField(name) ) ); const mapResource = ( - result?: SpecifyResource | Collection | null + result?: Collection | SpecifyResource | null ): RA> => (result === undefined || result === null ? [] @@ -497,10 +497,10 @@ export const runAllFieldChecks = async ( : (result as Collection).models) as unknown as RA< SpecifyResource >; - // running only on dependent resources. the order shouldn't matter..... + // Running only on dependent resources. the order shouldn't matter..... await Promise.all( Object.values(resource.dependentResources) .flatMap(mapResource) - .map((next) => runAllFieldChecks(next)) + .map(async (next) => runAllFieldChecks(next)) ); }; diff --git a/specifyweb/frontend/js_src/lib/components/DataModel/resourceApi.ts b/specifyweb/frontend/js_src/lib/components/DataModel/resourceApi.ts index 74be3f1bf1a..67b1c07982b 100644 --- a/specifyweb/frontend/js_src/lib/components/DataModel/resourceApi.ts +++ b/specifyweb/frontend/js_src/lib/components/DataModel/resourceApi.ts @@ -75,7 +75,7 @@ function eventHandlerForToMany(_related, field) { }; } -// always returns a resource +// Always returns a resource const maybeMakeResource = (value, relatedTable) => value instanceof ResourceBase ? value diff --git a/specifyweb/frontend/js_src/lib/components/Merging/index.tsx b/specifyweb/frontend/js_src/lib/components/Merging/index.tsx index 365cf7b32d5..c04b1603428 100644 --- a/specifyweb/frontend/js_src/lib/components/Merging/index.tsx +++ b/specifyweb/frontend/js_src/lib/components/Merging/index.tsx @@ -22,6 +22,7 @@ import { icons } from '../Atoms/Icons'; import { Link } from '../Atoms/Link'; import { Submit } from '../Atoms/Submit'; import { LoadingContext } from '../Core/Contexts'; +import { runAllFieldChecks } from '../DataModel/businessRules'; import type { AnySchema, SerializedResource } from '../DataModel/helperTypes'; import type { SpecifyResource } from '../DataModel/legacyTypes'; import { fetchResource, resourceEvents } from '../DataModel/resource'; @@ -39,7 +40,6 @@ import { recordMergingTableSpec } from './definitions'; import { InvalidMergeRecordsDialog } from './InvalidMergeRecords'; import { mergingQueryParameter } from './queryString'; import { Status } from './Status'; -import { runAllFieldChecks } from '../DataModel/businessRules'; export function RecordMergingLink({ table,