UNPKG

@mirrormedia/lilith-draft-editor

Version:
314 lines (275 loc) 11.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PostSelector = PostSelector; var _react = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireDefault(require("styled-components")); var _modals = require("@keystone-ui/modals"); var _apollo = require("@keystone-6/core/admin-ui/apollo"); var _searchBox = require("./search-box"); var _pagination = require("./pagination"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } const postsQuery = (0, _apollo.gql)` query Posts($searchText: String!, $take: Int, $skip: Int) { postsCount(where: { name: { contains: $searchText } }) posts( where: { name: { contains: $searchText } } orderBy: { id: desc } take: $take skip: $skip ) { id slug name subtitle heroImage { id name imageFile { url } resized { original } } ogImage { id name imageFile { url } resized { original } } } } `; const PostSearchBox = (0, _styledComponents.default)(_searchBox.SearchBox)` margin-top: 10px; `; const PostSelectionWrapper = _styledComponents.default.div` overflow: auto; margin-top: 10px; `; const PostGridsWrapper = _styledComponents.default.div` display: flex; flex-wrap: wrap; overflow: auto; `; const PostGridWrapper = _styledComponents.default.div` flex: 0 0 33.3333%; cursor: pointer; padding: 0 10px 10px; `; const PostMetaGridsWrapper = _styledComponents.default.div` display: flex; flex-wrap: wrap; overflow: auto; `; const PostMetaGridWrapper = _styledComponents.default.div` flex: 0 0 33.3333%; cursor: pointer; padding: 0 10px 10px; `; const Post = _styledComponents.default.div` width: 100%; `; const SeparationLine = _styledComponents.default.div` border: #e1e5e9 1px solid; margin-top: 10px; margin-bottom: 10px; `; const ErrorHint = _styledComponents.default.span` color: red; `; const PostSelected = _styledComponents.default.div` height: 1.4rem; `; const PostImage = _styledComponents.default.img` display: block; width: 100%; aspect-ratio: 2; object-fit: cover; `; const PostTitle = _styledComponents.default.div` padding: 0 5px; `; const ErrorWrapper = _styledComponents.default.div` & * { margin: 0; } `; function PostGrids(props) { const { posts, selected, onSelect } = props; return /*#__PURE__*/_react.default.createElement(PostGridsWrapper, null, posts.map(post => { return /*#__PURE__*/_react.default.createElement(PostGrid, { key: post.id, isSelected: selected === null || selected === void 0 ? void 0 : selected.includes(post), onSelect: () => onSelect(post), post: post }); })); } function PostGrid(props) { var _post$heroImage, _post$heroImage$resiz; const { post, onSelect, isSelected } = props; return /*#__PURE__*/_react.default.createElement(PostGridWrapper, { key: post === null || post === void 0 ? void 0 : post.id, onClick: () => onSelect(post) }, /*#__PURE__*/_react.default.createElement(PostSelected, null, isSelected ? /*#__PURE__*/_react.default.createElement("i", { className: "fas fa-check-circle" }) : null), /*#__PURE__*/_react.default.createElement(Post, null, /*#__PURE__*/_react.default.createElement(PostImage, { src: (_post$heroImage = post.heroImage) === null || _post$heroImage === void 0 ? void 0 : (_post$heroImage$resiz = _post$heroImage.resized) === null || _post$heroImage$resiz === void 0 ? void 0 : _post$heroImage$resiz.original, onError: e => { var _post$heroImage2, _post$heroImage2$imag; return e.currentTarget.src = (_post$heroImage2 = post.heroImage) === null || _post$heroImage2 === void 0 ? void 0 : (_post$heroImage2$imag = _post$heroImage2.imageFile) === null || _post$heroImage2$imag === void 0 ? void 0 : _post$heroImage2$imag.url; } }), /*#__PURE__*/_react.default.createElement(PostTitle, null, post.name))); } function PostMetaGrids(props) { const { postMetas } = props; return /*#__PURE__*/_react.default.createElement(PostMetaGridsWrapper, null, postMetas.map(postMetas => { var _postMetas$post; return /*#__PURE__*/_react.default.createElement(PostMetaGrid, { key: postMetas === null || postMetas === void 0 ? void 0 : (_postMetas$post = postMetas.post) === null || _postMetas$post === void 0 ? void 0 : _postMetas$post.id, postMeta: postMetas }); })); } function PostMetaGrid(props) { var _post$heroImage3, _post$heroImage3$resi; const { postMeta } = props; const { post } = postMeta; return /*#__PURE__*/_react.default.createElement(PostMetaGridWrapper, null, /*#__PURE__*/_react.default.createElement(Post, null, /*#__PURE__*/_react.default.createElement(PostImage, { src: post === null || post === void 0 ? void 0 : (_post$heroImage3 = post.heroImage) === null || _post$heroImage3 === void 0 ? void 0 : (_post$heroImage3$resi = _post$heroImage3.resized) === null || _post$heroImage3$resi === void 0 ? void 0 : _post$heroImage3$resi.original, onError: e => { var _post$heroImage4, _post$heroImage4$imag; return e.currentTarget.src = post === null || post === void 0 ? void 0 : (_post$heroImage4 = post.heroImage) === null || _post$heroImage4 === void 0 ? void 0 : (_post$heroImage4$imag = _post$heroImage4.imageFile) === null || _post$heroImage4$imag === void 0 ? void 0 : _post$heroImage4$imag.url; } }), /*#__PURE__*/_react.default.createElement(PostTitle, null, post === null || post === void 0 ? void 0 : post.name))); } function PostSelector(props) { const [queryPosts, { loading, error, data: { posts = [], postsCount = 0 } = {} }] = (0, _apollo.useLazyQuery)(postsQuery, { fetchPolicy: 'no-cache' }); const [currentPage, setCurrentPage] = (0, _react.useState)(0); // page starts with 1, 0 is used to detect initialization const [searchText, setSearchText] = (0, _react.useState)(''); const [selected, setSelected] = (0, _react.useState)([]); const [showErrorHint, setShowErrorHint] = (0, _react.useState)(false); const pageSize = 6; const { onChange, enableMultiSelect = false, minSelectCount = 1 } = props; const onSave = () => { if (enableMultiSelect && minSelectCount && selected.length < minSelectCount) { setShowErrorHint(true); return; } onChange(selected); }; const onCancel = () => { onChange([]); }; const onSearchBoxChange = async searchInput => { setSearchText(searchInput); setCurrentPage(1); }; const onPostsGridSelect = postEntity => { setSelected(selected => { const filterdSelected = selected.filter(ele => { var _ele$post; return ((_ele$post = ele.post) === null || _ele$post === void 0 ? void 0 : _ele$post.id) !== postEntity.id; }); // deselect the post if (filterdSelected.length !== selected.length) { return filterdSelected; } // add new selected one and check shrink the array if there is a limit if (enableMultiSelect) { return selected.concat([{ post: postEntity }]); } // single select return [{ post: postEntity }]; }); }; const selectedPosts = selected.map(ele => { return ele.post; }); (0, _react.useEffect)(() => { if (currentPage !== 0) { queryPosts({ variables: { searchText: searchText, skip: (currentPage - 1) * pageSize, take: pageSize } }); } }, [currentPage, searchText]); let searchResult = /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement(PostGrids, { posts: posts, selected: selectedPosts, onSelect: onPostsGridSelect }), /*#__PURE__*/_react.default.createElement(_pagination.Pagination, { currentPage: currentPage, total: postsCount, pageSize: pageSize, onChange: pageIndex => { setCurrentPage(pageIndex); } })); if (loading) { searchResult = /*#__PURE__*/_react.default.createElement("p", null, "searching..."); } if (error) { var _postsQuery$loc; searchResult = /*#__PURE__*/_react.default.createElement(ErrorWrapper, null, /*#__PURE__*/_react.default.createElement("h3", null, "Errors occurs in the `posts` query"), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("b", null, "Message:"), /*#__PURE__*/_react.default.createElement("div", null, error.message), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("b", null, "Stack:"), /*#__PURE__*/_react.default.createElement("div", null, error.stack), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("b", null, "Query:"), /*#__PURE__*/_react.default.createElement("pre", null, (_postsQuery$loc = postsQuery.loc) === null || _postsQuery$loc === void 0 ? void 0 : _postsQuery$loc.source.body))); } return /*#__PURE__*/_react.default.createElement(_modals.DrawerController, { isOpen: true }, /*#__PURE__*/_react.default.createElement(_modals.Drawer, { title: "Select post", actions: { cancel: { label: 'Cancel', action: onCancel }, confirm: { label: 'Confirm', action: onSave } } }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(PostSearchBox, { onChange: onSearchBoxChange }), /*#__PURE__*/_react.default.createElement(PostSelectionWrapper, null, /*#__PURE__*/_react.default.createElement("div", null, searchResult, " "), !!selected.length && /*#__PURE__*/_react.default.createElement(SeparationLine, null), /*#__PURE__*/_react.default.createElement(PostMetaGrids, { postMetas: selected }), showErrorHint && /*#__PURE__*/_react.default.createElement(ErrorHint, null, "\u8ACB\u81F3\u5C11\u9078\u64C7", minSelectCount, "\u5247\u6587\u7AE0"))))); }