Skip to content

Commit

Permalink
Merge pull request #4030 from specify/issue-3297
Browse files Browse the repository at this point in the history
Add warning dialog when no preparations available in disposal and show list of catalog # without preparations in interactions dialog
  • Loading branch information
CarolineDenis committed Sep 28, 2023
2 parents b2a96e6 + d207aa1 commit 5729536
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import { H3 } from '../Atoms';
import { Button } from '../Atoms/Button';
import { Link } from '../Atoms/Link';
import { LoadingContext } from '../Core/Contexts';
import { toTable } from '../DataModel/helpers';
import type { SerializedResource } from '../DataModel/helperTypes';
import { getResourceViewUrl } from '../DataModel/resource';
import { schema } from '../DataModel/schema';
Expand Down Expand Up @@ -133,47 +132,35 @@ export function InteractionDialog({
else if (typeof recordSet === 'object')
loading(
getPrepsAvailableForLoanRs(recordSet.id).then((data) =>
availablePrepsReady(undefined, recordSet, data)
availablePrepsReady(undefined, data)
)
);
else
loading(
(catalogNumbers.length === 0
? Promise.resolve([])
: getPrepsAvailableForLoanCoIds('CatalogNumber', catalogNumbers)
).then((data) => availablePrepsReady(catalogNumbers, undefined, data))
).then((data) => availablePrepsReady(catalogNumbers, data))
);
}

const [prepsData, setPrepsData] = React.useState<RA<PreparationRow>>();

function availablePrepsReady(
entries: RA<string> | undefined,
recordSet: SerializedResource<RecordSet> | undefined,
prepsData: RA<PreparationRow>
) {
if (
prepsData.length === 0 &&
recordSet === undefined &&
typeof itemCollection === 'object'
) {
const item = new itemCollection.model.specifyModel.Resource();
f.maybe(toTable(item, 'LoanPreparation'), (loanPreparation) => {
loanPreparation.set('quantityReturned', 0);
loanPreparation.set('quantityResolved', 0);
});
itemCollection.add(item);
handleClose();
return;
}
const catalogNumbers = prepsData.map(([catalogNumber]) => catalogNumber);
const missing =
typeof entries === 'object'
? catalogNumbers.filter(
(catalogNumber) => !entries.includes(catalogNumber)
? entries.filter(
(entry) => !catalogNumbers.some((data) => data.includes(entry))
)
: [];

if (missing.length > 0) {
setState({ type: 'MissingState', missing });
setPrepsData(prepsData);
} else showPrepSelectDlg(prepsData);
}

Expand Down Expand Up @@ -237,14 +224,47 @@ export function InteractionDialog({
})}
</Dialog>
) : state.type === 'PreparationSelectState' ? (
<PrepDialog
action={action}
// BUG: make this readOnly if don't have necessary permissions
isReadOnly={false}
itemCollection={itemCollection}
preparations={state.entries}
onClose={handleClose}
/>
state.entries.length > 0 ? (
<PrepDialog
action={action}
// BUG: make this readOnly if don't have necessary permissions
isReadOnly={false}
itemCollection={itemCollection}
preparations={state.entries}
onClose={handleClose}
/>
) : (
<Dialog
buttons={
<>
<Button.DialogClose>{commonText.cancel()}</Button.DialogClose>
{typeof itemCollection === 'object' ? (
<Button.Info
onClick={() => {
itemCollection?.add(
new itemCollection.model.specifyModel.Resource()
);
handleClose();
}}
>
{interactionsText.continueWithoutPreparations()}
</Button.Info>
) : (
<Link.Blue href={getResourceViewUrl('Loan')}>
{interactionsText.continueWithoutPreparations()}
</Link.Blue>
)}
{}
</>
}
header={interactionsText.returnedPreparations({
tablePreparation: schema.models.Preparation.label,
})}
onClose={handleClose}
>
{interactionsText.noPreparationsWarning()}
</Dialog>
)
) : (
<RecordSetsDialog
isReadOnly
Expand All @@ -260,17 +280,31 @@ export function InteractionDialog({
{typeof itemCollection === 'object' ? (
<Button.Info
onClick={(): void => {
availablePrepsReady(undefined, undefined, []);
itemCollection?.add(
new itemCollection.model.specifyModel.Resource()
);
handleClose();
}}
>
{interactionsText.addUnassociated()}
</Button.Info>
) : model.name === 'Loan' || action.model.name === 'Loan' ? (
) : model.name === 'Loan' ||
(action.model.name === 'Loan' && prepsData?.length === 0) ? (
<Link.Blue href={getResourceViewUrl('Loan')}>
{interactionsText.withoutPreparations()}
</Link.Blue>
) : undefined}
{state.type === 'MissingState' &&
prepsData?.length !== 0 &&
prepsData ? (
<Button.Info
onClick={(): void => {
showPrepSelectDlg(prepsData);
}}
>
{interactionsText.continue()}
</Button.Info>
) : null}
</>
}
header={
Expand Down
10 changes: 10 additions & 0 deletions specifyweb/frontend/js_src/lib/localization/interactions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,9 @@ export const interactionsText = createDictionary({
'uk-ua': 'Без препаратів',
'de-ch': 'Ohne Präparate',
},
continueWithoutPreparations: {
'en-us': 'Continue without preparations',
},
addUnassociated: {
'en-us': 'Add unassociated item',
'ru-ru': 'Добавить несвязанный элемент',
Expand Down Expand Up @@ -381,4 +384,11 @@ export const interactionsText = createDictionary({
'uk-ua': 'Редагувати {table:string}',
'de-ch': 'Bearbeiten {table:string}',
},
noPreparationsWarning: {
'en-us':
'None of these objects have preparations. Would you like to continue?',
},
continue: {
'en-us': 'Continue',
},
} as const);

0 comments on commit 5729536

Please sign in to comment.