Skip to content

Commit af3c19a

Browse files
committed
Update examples and tests to use readonly array
1 parent 8f5925a commit af3c19a

File tree

8 files changed

+42
-38
lines changed

8 files changed

+42
-38
lines changed

packages/docs-app/src/examples/select-examples/multiSelectExample.tsx

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ const INTENTS = [Intent.NONE, Intent.PRIMARY, Intent.SUCCESS, Intent.DANGER, Int
4040

4141
export interface MultiSelectExampleState {
4242
allowCreate: boolean;
43-
createdItems: Film[];
43+
createdItems: readonly Film[];
4444
disabled: boolean;
4545
fill: boolean;
46-
films: Film[];
46+
films: readonly Film[];
4747
hasInitialContent: boolean;
4848
intent: boolean;
49-
items: Film[];
49+
items: readonly Film[];
5050
matchTargetWidth: boolean;
5151
openOnKeyDown: boolean;
5252
popoverMinimal: boolean;
@@ -124,7 +124,7 @@ export class MultiSelectExample extends React.PureComponent<ExampleProps, MultiS
124124

125125
return (
126126
<Example options={this.renderOptions()} {...this.props}>
127-
<MultiSelect<Film>
127+
<MultiSelect
128128
{...flags}
129129
createNewItemFromQuery={allowCreate ? createFilms : undefined}
130130
createNewItemRenderer={allowCreate ? renderCreateFilmsMenuItem : null}
@@ -251,7 +251,9 @@ export class MultiSelectExample extends React.PureComponent<ExampleProps, MultiS
251251
);
252252
}
253253

254-
private renderCustomTarget = (selectedItems: Film[]) => <MultiSelectCustomTarget count={selectedItems.length} />;
254+
private renderCustomTarget = (selectedItems: readonly Film[]) => (
255+
<MultiSelectCustomTarget count={selectedItems.length} />
256+
);
255257

256258
private renderTag = (film: Film) => film.title;
257259

@@ -287,16 +289,16 @@ export class MultiSelectExample extends React.PureComponent<ExampleProps, MultiS
287289
this.selectFilms([film]);
288290
}
289291

290-
private selectFilms(filmsToSelect: Film[]) {
292+
private selectFilms(filmsToSelect: readonly Film[]) {
291293
this.setState(({ createdItems, films, items }) => {
292294
let nextCreatedItems = createdItems.slice();
293295
let nextFilms = films.slice();
294296
let nextItems = items.slice();
295297

296298
filmsToSelect.forEach(film => {
297299
const results = maybeAddCreatedFilmToArrays(nextItems, nextCreatedItems, film);
298-
nextItems = results.items;
299-
nextCreatedItems = results.createdItems;
300+
nextItems = results.items.slice();
301+
nextCreatedItems = results.createdItems.slice();
300302
// Avoid re-creating an item that is already selected (the "Create
301303
// Item" option will be shown even if it matches an already selected
302304
// item).
@@ -336,7 +338,7 @@ export class MultiSelectExample extends React.PureComponent<ExampleProps, MultiS
336338
}
337339
};
338340

339-
private handleFilmsPaste = (films: Film[]) => {
341+
private handleFilmsPaste = (films: readonly Film[]) => {
340342
// On paste, don't bother with deselecting already selected values, just
341343
// add the new ones.
342344
this.selectFilms(films);

packages/docs-app/src/examples/select-examples/omnibarExample.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ export class OmnibarExample extends React.PureComponent<ExampleProps, OmnibarExa
9292
<KeyComboTag combo="shift + o" />
9393
</span>
9494

95-
<Omnibar<Film>
95+
<Omnibar
9696
{...this.state}
9797
createNewItemFromQuery={maybeCreateNewItemFromQuery}
9898
createNewItemRenderer={maybeCreateNewItemRenderer}

packages/docs-app/src/examples/select-examples/selectExample.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { type Film, FilmSelect, filterFilm, TOP_100_FILMS } from "@blueprintjs/s
2424
export interface SelectExampleState {
2525
allowCreate: boolean;
2626
createFirst: boolean;
27-
createdItems: Film[];
27+
createdItems: readonly Film[];
2828
disableItems: boolean;
2929
disabled: boolean;
3030
fill: boolean;
@@ -169,7 +169,7 @@ export class SelectExample extends React.PureComponent<ExampleProps, SelectExamp
169169
return /[0-9]/.test(firstLetter) ? "0-9" : firstLetter;
170170
}
171171

172-
private getGroupedItems = (filteredItems: Film[]) => {
172+
private getGroupedItems = (filteredItems: readonly Film[]) => {
173173
return filteredItems.reduce<Array<{ group: string; index: number; items: Film[]; key: number }>>(
174174
(acc, item, index) => {
175175
const group = this.getGroup(item);
@@ -193,7 +193,7 @@ export class SelectExample extends React.PureComponent<ExampleProps, SelectExamp
193193
) : undefined;
194194
};
195195

196-
private groupedItemListPredicate = (query: string, items: Film[]) => {
196+
private groupedItemListPredicate = (query: string, items: readonly Film[]) => {
197197
return items
198198
.filter((item, index) => filterFilm(query, item, index))
199199
.sort((a, b) => this.getGroup(a).localeCompare(this.getGroup(b)));
@@ -208,7 +208,7 @@ export class SelectExample extends React.PureComponent<ExampleProps, SelectExamp
208208

209209
private isItemDisabled = (film: Film) => this.state.disableItems && film.year < 2000;
210210

211-
private renderGroupedItemList = (listProps: ItemListRendererProps<Film>) => {
211+
private renderGroupedItemList = (listProps: ItemListRendererProps<Film, readonly Film[]>) => {
212212
const initialContent = this.getInitialContent();
213213
const noResults = <MenuItem disabled={true} text="No results." roleStructure="listoption" />;
214214

@@ -231,7 +231,7 @@ export class SelectExample extends React.PureComponent<ExampleProps, SelectExamp
231231
};
232232

233233
private renderGroupedMenuContent = (
234-
listProps: ItemListRendererProps<Film>,
234+
listProps: ItemListRendererProps<Film, readonly Film[]>,
235235
noResults?: React.ReactNode,
236236
initialContent?: React.ReactNode | null,
237237
) => {

packages/docs-app/src/examples/select-examples/suggestExample.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ import {
3434
export interface SuggestExampleState {
3535
allowCreate: boolean;
3636
closeOnSelect: boolean;
37-
createdItems: Film[];
37+
createdItems: readonly Film[];
3838
disabled: boolean;
3939
fill: boolean;
40-
items: Film[];
40+
items: readonly Film[];
4141
matchTargetWidth: boolean;
4242
minimal: boolean;
4343
openOnKeyDown: boolean;
@@ -92,7 +92,7 @@ export class SuggestExample extends React.PureComponent<ExampleProps, SuggestExa
9292

9393
return (
9494
<Example options={this.renderOptions()} {...this.props}>
95-
<Suggest<Film>
95+
<Suggest
9696
{...flags}
9797
createNewItemFromQuery={maybeCreateNewItemFromQuery}
9898
createNewItemRenderer={maybeCreateNewItemRenderer}

packages/select/src/__examples__/filmSelect.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import {
3535
} from "./films";
3636

3737
type FilmSelectProps = Omit<
38-
SelectProps<Film>,
38+
SelectProps<Film, readonly Film[]>,
3939
| "createNewItemFromQuery"
4040
| "createNewItemRenderer"
4141
| "itemPredicate"
@@ -49,8 +49,8 @@ type FilmSelectProps = Omit<
4949
};
5050

5151
export function FilmSelect({ allowCreate = false, fill, ...restProps }: FilmSelectProps) {
52-
const [items, setItems] = React.useState([...TOP_100_FILMS]);
53-
const [createdItems, setCreatedItems] = React.useState<Film[]>([]);
52+
const [items, setItems] = React.useState<readonly Film[]>([...TOP_100_FILMS]);
53+
const [createdItems, setCreatedItems] = React.useState<readonly Film[]>([]);
5454
const [selectedFilm, setSelectedFilm] = React.useState<Film | undefined>(undefined);
5555
const handleItemSelect = React.useCallback(
5656
(newFilm: Film) => {
@@ -82,7 +82,7 @@ export function FilmSelect({ allowCreate = false, fill, ...restProps }: FilmSele
8282
);
8383

8484
return (
85-
<Select<Film>
85+
<Select
8686
createNewItemFromQuery={allowCreate ? createFilm : undefined}
8787
createNewItemRenderer={allowCreate ? renderCreateFilmMenuItem : undefined}
8888
fill={fill}

packages/select/src/__examples__/films.tsx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export interface Film {
3030
}
3131

3232
/** Top 100 films as rated by IMDb users. http://www.imdb.com/chart/top */
33-
export const TOP_100_FILMS: Film[] = [
33+
export const TOP_100_FILMS: readonly Film[] = [
3434
{ title: "The Shawshank Redemption", year: 1994 },
3535
{ title: "The Godfather", year: 1972 },
3636
{ title: "The Godfather: Part II", year: 1974 },
@@ -270,7 +270,7 @@ export function createFilm(title: string): Film {
270270
};
271271
}
272272

273-
export function createFilms(query: string): Film[] {
273+
export function createFilms(query: string): readonly Film[] {
274274
const titles = query.split(", ");
275275
return titles.map((title, index) => ({
276276
rank: 100 + Math.floor(Math.random() * 100 + index),
@@ -288,23 +288,23 @@ export function doesFilmEqualQuery(film: Film, query: string) {
288288
return film.title.toLowerCase() === query.toLowerCase();
289289
}
290290

291-
export function arrayContainsFilm(films: Film[], filmToFind: Film): boolean {
291+
export function arrayContainsFilm(films: readonly Film[], filmToFind: Film): boolean {
292292
return films.some((film: Film) => film.title === filmToFind.title);
293293
}
294294

295-
export function addFilmToArray(films: Film[], filmToAdd: Film) {
295+
export function addFilmToArray(films: readonly Film[], filmToAdd: Film): readonly Film[] {
296296
return [...films, filmToAdd];
297297
}
298298

299-
export function deleteFilmFromArray(films: Film[], filmToDelete: Film) {
299+
export function deleteFilmFromArray(films: readonly Film[], filmToDelete: Film): readonly Film[] {
300300
return films.filter(film => film !== filmToDelete);
301301
}
302302

303303
export function maybeAddCreatedFilmToArrays(
304-
items: Film[],
305-
createdItems: Film[],
304+
items: readonly Film[],
305+
createdItems: readonly Film[],
306306
film: Film,
307-
): { createdItems: Film[]; items: Film[] } {
307+
): { createdItems: readonly Film[]; items: readonly Film[] } {
308308
const isNewlyCreatedItem = !arrayContainsFilm(items, film);
309309
return {
310310
createdItems: isNewlyCreatedItem ? addFilmToArray(createdItems, film) : createdItems,
@@ -314,10 +314,10 @@ export function maybeAddCreatedFilmToArrays(
314314
}
315315

316316
export function maybeDeleteCreatedFilmFromArrays(
317-
items: Film[],
318-
createdItems: Film[],
317+
items: readonly Film[],
318+
createdItems: readonly Film[],
319319
film: Film | undefined,
320-
): { createdItems: Film[]; items: Film[] } {
320+
): { createdItems: readonly Film[]; items: readonly Film[] } {
321321
if (film === undefined) {
322322
return {
323323
createdItems,

packages/select/test/multiSelectTests.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ describe("<MultiSelect>", () => {
3333
items: TOP_100_FILMS,
3434
popoverProps: { isOpen: true, usePortal: false },
3535
query: "",
36-
selectedItems: [] as Film[],
36+
selectedItems: [] as readonly Film[],
3737
tagRenderer: renderTag,
3838
};
3939
let handlers: {
@@ -135,7 +135,7 @@ describe("<MultiSelect>", () => {
135135
popoverProps: { usePortal: false },
136136
};
137137

138-
const wrapper = mount(<MultiSelect<Film> {...defaultProps} {...handlers} {...props} />, {
138+
const wrapper = mount(<MultiSelect {...defaultProps} {...handlers} {...props} />, {
139139
attachTo: containerElement,
140140
});
141141

@@ -167,9 +167,9 @@ describe("<MultiSelect>", () => {
167167
containerElement?.remove();
168168
});
169169

170-
function multiselect(props: Partial<MultiSelectProps<Film>> = {}, query?: string) {
170+
function multiselect(props: Partial<MultiSelectProps<Film, readonly Film[]>> = {}, query?: string) {
171171
const wrapper = mount(
172-
<MultiSelect<Film> {...defaultProps} {...handlers} {...props}>
172+
<MultiSelect {...defaultProps} {...handlers} {...props}>
173173
<article />
174174
</MultiSelect>,
175175
);

packages/select/test/queryListTests.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ describe("<QueryList>", () => {
8282
});
8383

8484
it("itemListPredicate filters entire list by query", () => {
85-
const predicate = sinon.spy((query: string, films: Film[]) => films.filter(f => f.year === +query));
85+
const predicate = sinon.spy((query: string, films: readonly Film[]) =>
86+
films.filter(f => f.year === +query),
87+
);
8688
shallow(<QueryList<Film> {...testProps} itemListPredicate={predicate} query="1994" />);
8789

8890
assert.equal(predicate.callCount, 1, "called once for entire list");

0 commit comments

Comments
 (0)