Skip to content

Commit 1ae553c

Browse files
committed
fix: use Library search results to populate container card preview
1 parent 65aca04 commit 1ae553c

3 files changed

Lines changed: 28 additions & 22 deletions

File tree

src/library-authoring/components/ContainerCard.test.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import {
66
fireEvent,
77
} from '../../testUtils';
88
import { LibraryProvider } from '../common/context/LibraryContext';
9-
import { mockContentLibrary, mockGetContainerChildren } from '../data/api.mocks';
9+
import { mockContentLibrary } from '../data/api.mocks';
1010
import { type ContainerHit, PublishStatus } from '../../search-manager';
1111
import ContainerCard from './ContainerCard';
1212
import { getLibraryContainerApiUrl, getLibraryContainerRestoreApiUrl } from '../data/api';
@@ -40,7 +40,6 @@ let axiosMock: MockAdapter;
4040
let mockShowToast;
4141

4242
mockContentLibrary.applyMock();
43-
mockGetContainerChildren.applyMock();
4443

4544
const render = (ui: React.ReactElement, showOnlyPublished: boolean = false) => baseRender(ui, {
4645
extraWrapper: ({ children }) => (
@@ -155,29 +154,33 @@ describe('<ContainerCard />', () => {
155154
it('should render no child blocks in card preview', async () => {
156155
render(<ContainerCard hit={containerHitSample} />);
157156

158-
expect(screen.queryByTitle('text block')).not.toBeInTheDocument();
157+
expect(screen.queryByTitle('lb:org1:Demo_course:html:text-0')).not.toBeInTheDocument();
159158
expect(screen.queryByText('+0')).not.toBeInTheDocument();
160159
});
161160

162161
it('should render <=5 child blocks in card preview', async () => {
163162
const containerWith5Children = {
164163
...containerHitSample,
165-
usageKey: mockGetContainerChildren.fiveChildren,
166-
};
164+
content: {
165+
childUsageKeys: Array(5).fill('').map((_child, idx) => `lb:org1:Demo_course:html:text-${idx}`),
166+
},
167+
} satisfies ContainerHit;
167168
render(<ContainerCard hit={containerWith5Children} />);
168169

169-
expect((await screen.findAllByTitle(/text block */)).length).toBe(5);
170+
expect((await screen.findAllByTitle(/lb:org1:Demo_course:html:text-*/)).length).toBe(5);
170171
expect(screen.queryByText('+0')).not.toBeInTheDocument();
171172
});
172173

173174
it('should render >5 child blocks with +N in card preview', async () => {
174175
const containerWith6Children = {
175176
...containerHitSample,
176-
usageKey: mockGetContainerChildren.sixChildren,
177-
};
177+
content: {
178+
childUsageKeys: Array(6).fill('').map((_child, idx) => `lb:org1:Demo_course:html:text-${idx}`),
179+
},
180+
} satisfies ContainerHit;
178181
render(<ContainerCard hit={containerWith6Children} />);
179182

180-
expect((await screen.findAllByTitle(/text block */)).length).toBe(4);
183+
expect((await screen.findAllByTitle(/lb:org1:Demo_course:html:text-*/)).length).toBe(4);
181184
expect(screen.queryByText('+2')).toBeInTheDocument();
182185
});
183186
});

src/library-authoring/components/ContainerCard.tsx

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ import { MoreVert } from '@openedx/paragon/icons';
1212
import { Link } from 'react-router-dom';
1313

1414
import { getItemIcon, getComponentStyleColor } from '../../generic/block-type-utils';
15+
import { getBlockType } from '../../generic/key-utils';
1516
import { ToastContext } from '../../generic/toast-context';
1617
import { type ContainerHit, PublishStatus } from '../../search-manager';
1718
import { useComponentPickerContext } from '../common/context/ComponentPickerContext';
1819
import { useLibraryContext } from '../common/context/LibraryContext';
1920
import { SidebarActions, useSidebarContext } from '../common/context/SidebarContext';
20-
import { useContainerChildren, useRemoveItemsFromCollection } from '../data/apiHooks';
21+
import { useRemoveItemsFromCollection } from '../data/apiHooks';
2122
import { useLibraryRoutes } from '../routes';
2223
import AddComponentWidget from './AddComponentWidget';
2324
import BaseCard from './BaseCard';
@@ -107,21 +108,19 @@ const ContainerMenu = ({ hit } : ContainerMenuProps) => {
107108
};
108109

109110
type ContainerCardPreviewProps = {
110-
containerId: string;
111+
hit: ContainerHit,
111112
showMaxChildren?: number;
112113
};
113114

114-
const ContainerCardPreview = ({ containerId, showMaxChildren = 5 }: ContainerCardPreviewProps) => {
115-
const { data, isLoading, isError } = useContainerChildren(containerId);
116-
if (isLoading || isError) {
117-
return null;
118-
}
119-
120-
const hiddenChildren = data.length - showMaxChildren;
115+
const ContainerCardPreview = ({ hit, showMaxChildren = 5 }: ContainerCardPreviewProps) => {
116+
const { content } = hit;
117+
const { childUsageKeys } = content ?? { childUsageKeys: [] };
118+
const hiddenChildren = childUsageKeys.length - showMaxChildren;
121119
return (
122120
<Stack direction="horizontal" gap={2}>
123121
{
124-
data.slice(0, showMaxChildren).map(({ id, blockType, displayName }, idx) => {
122+
childUsageKeys.slice(0, showMaxChildren).map((usageKey, idx) => {
123+
const blockType = getBlockType(usageKey);
125124
let blockPreview: ReactNode;
126125
let classNames;
127126

@@ -133,7 +132,7 @@ const ContainerCardPreview = ({ containerId, showMaxChildren = 5 }: ContainerCar
133132
<Icon
134133
src={getItemIcon(blockType)}
135134
screenReaderText={blockType}
136-
title={displayName}
135+
title={usageKey}
137136
/>
138137
);
139138
} else {
@@ -147,7 +146,7 @@ const ContainerCardPreview = ({ containerId, showMaxChildren = 5 }: ContainerCar
147146
}
148147
return (
149148
<div
150-
key={`container-card-preview-block-${id}`}
149+
key={`container-card-preview-block-${usageKey}`}
151150
className={classNames}
152151
>
153152
{blockPreview}
@@ -200,7 +199,7 @@ const ContainerCard = ({ hit } : ContainerCardProps) => {
200199
<BaseCard
201200
itemType={itemType}
202201
displayName={displayName}
203-
preview={<ContainerCardPreview containerId={unitId} />}
202+
preview={<ContainerCardPreview hit={hit} />}
204203
tags={tags}
205204
numChildren={numChildrenCount}
206205
actions={(

src/search-manager/data/api.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,13 +171,17 @@ export interface CollectionHit extends BaseContentHit {
171171
* Information about a single container returned in the search results
172172
* Defined in edx-platform/openedx/core/djangoapps/content/search/documents.py
173173
*/
174+
interface ContainerHitContent {
175+
childUsageKeys: string[],
176+
}
174177
export interface ContainerHit extends BaseContentHit {
175178
type: 'library_container';
176179
blockType: 'unit'; // This should be expanded to include other container types
177180
numChildren?: number;
178181
published?: ContentPublishedData;
179182
publishStatus: PublishStatus;
180183
formatted: BaseContentHit['formatted'] & { published?: ContentPublishedData, };
184+
content?: ContainerHitContent;
181185
}
182186

183187
export type HitType = ContentHit | CollectionHit | ContainerHit;

0 commit comments

Comments
 (0)