}
- closedByDefault
+ open={isConsortialAccOpen}
+ onToggle={() => setConsortialAccOpen(prevState => !prevState)}
>
{!memberTenants.length
?
diff --git a/src/Instance/InstanceDetails/MemberTenantHoldings/MemberTenantHoldings.js b/src/Instance/InstanceDetails/MemberTenantHoldings/MemberTenantHoldings.js
index 0ada3eff2..47fc6aa2f 100644
--- a/src/Instance/InstanceDetails/MemberTenantHoldings/MemberTenantHoldings.js
+++ b/src/Instance/InstanceDetails/MemberTenantHoldings/MemberTenantHoldings.js
@@ -16,6 +16,7 @@ import { InstanceNewHolding } from '../InstanceNewHolding';
import { MoveItemsContext } from '../../MoveItemsContext';
import { useInstanceHoldingsQuery } from '../../../providers';
+import { useHoldingsAccordionState } from '../../../hooks';
import css from './MemberTenantHoldings.css';
@@ -27,7 +28,13 @@ const MemberTenantHoldings = ({
name,
id,
} = memberTenant;
+ const instanceId = instance?.id;
const stripes = useStripes();
+
+ const pathToAccordion = ['consortialHoldings', id, '_state'];
+ const pathToHoldingsAccordion = ['consortialHoldings', id];
+ const [isMemberTenantAccOpen, setMemberTenantAccOpen] = useHoldingsAccordionState({ instanceId, pathToAccordion });
+
const { holdingsRecords, isLoading } = useInstanceHoldingsQuery(instance?.id, { tenantId: id });
const isUserInCentralTenant = checkIfUserInCentralTenant(stripes);
@@ -38,7 +45,8 @@ const MemberTenantHoldings = ({
className={css.memberTenantHoldings}
id={`${name}-holdings`}
label={name}
- closedByDefault
+ open={isMemberTenantAccOpen}
+ onToggle={() => setMemberTenantAccOpen(prevValue => !prevValue)}
>
{isLoading
@@ -51,6 +59,7 @@ const MemberTenantHoldings = ({
tenantId={id}
draggable={false}
droppable={false}
+ pathToAccordionsState={pathToHoldingsAccordion}
/>
)}
diff --git a/src/Instance/InstanceDetails/utils.js b/src/Instance/InstanceDetails/utils.js
index 3b8082097..b97ad2555 100644
--- a/src/Instance/InstanceDetails/utils.js
+++ b/src/Instance/InstanceDetails/utils.js
@@ -48,13 +48,13 @@ export const getAccordionState = (instance = {}, accordions = {}) => {
return ({
[accordions.administrative]: !areAllFieldsEmpty(values(instanceData)),
[accordions.title]: !areAllFieldsEmpty(values(titleData)),
- [accordions.identifiers]: !areAllFieldsEmpty([instance.identifiers ?? []]),
- [accordions.contributors]: !areAllFieldsEmpty([instance.contributors ?? []]),
+ [accordions.identifiers]: !areAllFieldsEmpty([instance?.identifiers ?? []]),
+ [accordions.contributors]: !areAllFieldsEmpty([instance?.contributors ?? []]),
[accordions.descriptiveData]: !areAllFieldsEmpty(values(descriptiveData)),
[accordions.notes]: !areAllFieldsEmpty([instance?.notes ?? []]),
- [accordions.electronicAccess]: !areAllFieldsEmpty([instance.electronicAccess ?? []]),
- [accordions.subjects]: !areAllFieldsEmpty([instance.subjects ?? []]),
- [accordions.classifications]: !areAllFieldsEmpty([instance.classifications ?? []]),
+ [accordions.electronicAccess]: !areAllFieldsEmpty([instance?.electronicAccess ?? []]),
+ [accordions.subjects]: !areAllFieldsEmpty([instance?.subjects ?? []]),
+ [accordions.classifications]: !areAllFieldsEmpty([instance?.classifications ?? []]),
[accordions.relationship]: !areAllFieldsEmpty(values(instanceRelationship)),
});
};
diff --git a/src/Instance/InstanceMovement/HoldingMovementList/HoldingsListMovement.js b/src/Instance/InstanceMovement/HoldingMovementList/HoldingsListMovement.js
index 5c0788920..b582a23fb 100644
--- a/src/Instance/InstanceMovement/HoldingMovementList/HoldingsListMovement.js
+++ b/src/Instance/InstanceMovement/HoldingMovementList/HoldingsListMovement.js
@@ -23,6 +23,7 @@ const HoldingsListMovement = ({
draggable,
droppable,
tenantId,
+ pathToAccordionsState,
}) => {
const {
selectItemsForDrag,
@@ -58,6 +59,7 @@ const HoldingsListMovement = ({
holdingIndex={index}
draggingHoldingsCount={draggingHoldingsCount}
tenantId={tenantId}
+ pathToAccordionsState={pathToAccordionsState}
/>
))
) : (
@@ -80,6 +82,7 @@ HoldingsListMovement.propTypes = {
draggable: PropTypes.bool,
droppable: PropTypes.bool,
tenantId: PropTypes.string,
+ pathToAccordionsState: PropTypes.arrayOf(PropTypes.string),
};
HoldingsListMovement.defaultProps = {
diff --git a/src/ViewInstance.js b/src/ViewInstance.js
index 676336d2c..f085b903e 100644
--- a/src/ViewInstance.js
+++ b/src/ViewInstance.js
@@ -860,6 +860,7 @@ class ViewInstance extends React.Component {
},
];
const isInstanceLoading = this.state.isLoading || !instance || isCentralTenantPermissionsLoading;
+ const keyInStorageToHoldingsAccsState = ['holdings'];
return (
@@ -887,6 +888,7 @@ class ViewInstance extends React.Component {
instance={instance}
draggable={this.state.isItemsMovement}
tenantId={okapi.tenant}
+ pathToAccordionsState={keyInStorageToHoldingsAccsState}
droppable
/>
diff --git a/src/hooks/index.js b/src/hooks/index.js
index 8d61406b9..51310d19e 100644
--- a/src/hooks/index.js
+++ b/src/hooks/index.js
@@ -3,6 +3,7 @@ export { default as useBrowseValidation } from './useBrowseValidation';
export { default as useCallout } from './useCallout';
export { default as useHoldingItemsQuery } from './useHoldingItemsQuery';
export { default as useHoldingMutation } from './useHoldingMutation';
+export { default as useHoldingsAccordionState } from './useHoldingsAccordionState';
export { default as useInstanceMutation } from './useInstanceMutation';
export { default as useHoldingsQueryByHrids } from './useHoldingsQueryByHrids';
export { default as useInventoryBrowse } from './useInventoryBrowse';
diff --git a/src/hooks/useHoldingsAccordionState/index.js b/src/hooks/useHoldingsAccordionState/index.js
new file mode 100644
index 000000000..83af4d1a1
--- /dev/null
+++ b/src/hooks/useHoldingsAccordionState/index.js
@@ -0,0 +1 @@
+export { default } from './useHoldingsAccordionState';
diff --git a/src/hooks/useHoldingsAccordionState/useHoldingsAccordionState.js b/src/hooks/useHoldingsAccordionState/useHoldingsAccordionState.js
new file mode 100644
index 000000000..e4fd30aae
--- /dev/null
+++ b/src/hooks/useHoldingsAccordionState/useHoldingsAccordionState.js
@@ -0,0 +1,42 @@
+import {
+ useEffect,
+ useState,
+} from 'react';
+import {
+ cloneDeep,
+ get,
+ set,
+} from 'lodash';
+
+import { useNamespace } from '@folio/stripes/core';
+
+import {
+ getItem,
+ setItem,
+} from '../../storage';
+
+const useHoldingsAccordionState = ({ instanceId, pathToAccordion = [] }) => {
+ const [namespace] = useNamespace();
+ const key = `${namespace}.instanceHoldingsAccordionsState`;
+
+ const instanceHoldingsAccordionsState = getItem(key) ?? {};
+ const currentAccState = get(instanceHoldingsAccordionsState, [instanceId, ...pathToAccordion], false);
+
+ const [isOpen, setOpen] = useState(currentAccState);
+
+ useEffect(() => {
+ let newState = {
+ [instanceId]: {
+ ...cloneDeep(instanceHoldingsAccordionsState[instanceId]),
+ }
+ };
+
+ newState = set(newState, [instanceId, ...pathToAccordion], isOpen);
+
+ setItem(key, newState);
+ }, [instanceHoldingsAccordionsState, isOpen, instanceId]);
+
+ return [isOpen, setOpen];
+};
+
+export default useHoldingsAccordionState;