UNPKG

@blueprintjs/select

Version:

Components related to selecting items from a list

52 lines 3.49 kB
/* * Copyright 2021 Palantir Technologies, Inc. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { __assign, __rest, __spreadArray } from "tslib"; import classNames from "classnames"; import * as React from "react"; import { Button, Classes, MenuItem } from "@blueprintjs/core"; import { Select } from "../components/select/select"; import { areFilmsEqual, createFilm, filterFilm, getFilmItemProps, maybeAddCreatedFilmToArrays, maybeDeleteCreatedFilmFromArrays, renderCreateFilmMenuItem, TOP_100_FILMS, } from "./films"; export function FilmSelect(_a) { var _b; var _c; var _d = _a.allowCreate, allowCreate = _d === void 0 ? false : _d, fill = _a.fill, restProps = __rest(_a, ["allowCreate", "fill"]); var _e = React.useState(__spreadArray([], TOP_100_FILMS, true)), items = _e[0], setItems = _e[1]; var _f = React.useState([]), createdItems = _f[0], setCreatedItems = _f[1]; var _g = React.useState(undefined), selectedFilm = _g[0], setSelectedFilm = _g[1]; var handleItemSelect = React.useCallback(function (newFilm) { // Delete the old film from the list if it was newly created. var step1Result = maybeDeleteCreatedFilmFromArrays(items, createdItems, selectedFilm); // Add the new film to the list if it is newly created. var step2Result = maybeAddCreatedFilmToArrays(step1Result.items, step1Result.createdItems, newFilm); setCreatedItems(step2Result.createdItems); setSelectedFilm(newFilm); setItems(step2Result.items); }, [createdItems, items, selectedFilm]); var itemRenderer = React.useCallback(function (film, props) { if (!props.modifiers.matchesPredicate) { return null; } return (React.createElement(MenuItem, __assign({}, getFilmItemProps(film, props), { roleStructure: "listoption", selected: film === selectedFilm }))); }, [selectedFilm]); return (React.createElement(Select, __assign({ createNewItemFromQuery: allowCreate ? createFilm : undefined, createNewItemRenderer: allowCreate ? renderCreateFilmMenuItem : undefined, fill: fill, itemPredicate: filterFilm, itemRenderer: itemRenderer, items: items, itemsEqual: areFilmsEqual, menuProps: { "aria-label": "films" }, noResults: React.createElement(MenuItem, { disabled: true, text: "No results.", roleStructure: "listoption" }), onItemSelect: handleItemSelect }, restProps), React.createElement(Button, { alignText: "left", disabled: restProps.disabled, fill: fill, icon: "film", rightIcon: "caret-down", text: (_c = maybeRenderSelectedFilm(selectedFilm)) !== null && _c !== void 0 ? _c : "(No selection)", textClassName: classNames((_b = {}, _b[Classes.TEXT_MUTED] = selectedFilm === undefined, _b)) }))); } function maybeRenderSelectedFilm(selectedFilm) { return selectedFilm ? "".concat(selectedFilm.title, " (").concat(selectedFilm.year, ")") : undefined; } //# sourceMappingURL=filmSelect.js.map