UNPKG

@pnp/spfx-controls-react

Version:

Reusable React controls for SharePoint Framework solutions

125 lines • 7.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DocumentList = void 0; var tslib_1 = require("tslib"); /* eslint-disable no-undef */ /* eslint-disable @typescript-eslint/explicit-function-return-type */ /* eslint-disable @typescript-eslint/no-explicit-any */ var React = tslib_1.__importStar(require("react")); var ControlStrings_1 = tslib_1.__importDefault(require("ControlStrings")); var jotai_1 = require("jotai"); var lodash_1 = require("lodash"); var Button_1 = require("@fluentui/react/lib/Button"); var Stack_1 = require("@fluentui/react/lib/Stack"); var ScrollablePane_1 = require("@fluentui/react/lib/ScrollablePane"); var dragDropFiles_1 = require("../../../dragDropFiles"); var atoms_1 = require("../../jotai/atoms"); var FileInfo_1 = require("../File/FileInfo"); var FileCommandBar_1 = require("../FileCommandBar/FileCommandBar"); var NoDocuments_1 = require("../NoDocuments/NoDocuments"); var useDocumentListStyles_1 = require("./useDocumentListStyles"); var DocumentList = function (props) { var _a = (0, useDocumentListStyles_1.useDocumentListStyles)(), documentListStyles = _a.documentListStyles, scollableContainerStyles = _a.scollableContainerStyles, bootomContainerStyles = _a.bootomContainerStyles; var _b = (0, jotai_1.useAtom)(atoms_1.globalState), appGlobalState = _b[0], setGlobalState = _b[1]; var _c = React.useState([]), renderFiles = _c[0], setRenderFiles = _c[1]; var selectedFiles = appGlobalState.selectedFiles, files = appGlobalState.files, containerWidth = appGlobalState.containerWidth; var currentPage = React.useRef(0); var currentFiles = React.useRef([]); var onUploadFiles = props.onUploadFiles; var currentDivWidth = React.useRef(0); var divRef = React.useRef(); var isSelected = React.useCallback(function (file) { return selectedFiles.some(function (selectedFile) { return (0, lodash_1.isEqual)(selectedFile, file); }); }, [selectedFiles]); var onFileSelected = React.useCallback(function (isChecked, file) { var copySelectedFiles = selectedFiles.slice(); if (!isChecked) { var newFiles_1 = (0, lodash_1.pullAllWith)(copySelectedFiles, [file], lodash_1.isEqual); setGlobalState(function (prevState) { return tslib_1.__assign(tslib_1.__assign({}, prevState), { selectedFiles: newFiles_1 }); }); } else { setGlobalState(function (prevState) { return tslib_1.__assign(tslib_1.__assign({}, prevState), { selectedFiles: tslib_1.__spreadArray(tslib_1.__spreadArray([], copySelectedFiles, true), [file], false) }); }); } }, [setGlobalState, selectedFiles]); var renderFilesPerPage = React.useCallback(function () { var renderfiles = []; for (var i = 0; i < files.length; i++) { var file = files[i]; renderfiles.push(React.createElement(FileInfo_1.FileInfo, { key: "".concat(file.name, "-").concat(i), fileInfo: file, onSelected: onFileSelected, isSelected: isSelected(file) })); } setRenderFiles(renderfiles); }, [files, onFileSelected, isSelected]); var onDrop = React.useCallback(function (acceptedFiles) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { var copyFiles, newsFiles; return tslib_1.__generator(this, function (_a) { copyFiles = files.slice(); newsFiles = tslib_1.__spreadArray(tslib_1.__spreadArray([], copyFiles, true), acceptedFiles, true); currentFiles.current = newsFiles; setGlobalState(function (prevState) { return tslib_1.__assign(tslib_1.__assign({}, prevState), { files: newsFiles }); }); return [2 /*return*/]; }); }); }, [files, setGlobalState]); var onDelete = React.useCallback(function () { currentPage.current = 0; var newFiles = (0, lodash_1.pullAllWith)(files, selectedFiles, lodash_1.isEqual); setGlobalState(function (prevState) { return tslib_1.__assign(tslib_1.__assign({}, prevState), { files: newFiles, selectedFiles: [] }); }); }, [files, selectedFiles, setGlobalState]); var onUpload = React.useCallback(function (file) { var newFiles = tslib_1.__spreadArray(tslib_1.__spreadArray([], currentFiles.current, true), [file], false); setGlobalState(function (prevState) { return tslib_1.__assign(tslib_1.__assign({}, prevState), { files: newFiles }); }); }, [setGlobalState]); var onSelectAll = React.useCallback(function (isAllSelected) { if (isAllSelected) { setGlobalState(function (prevState) { return tslib_1.__assign(tslib_1.__assign({}, prevState), { selectedFiles: files }); }); } else { setGlobalState(function (prevState) { return tslib_1.__assign(tslib_1.__assign({}, prevState), { selectedFiles: [] }); }); } }, [files, setGlobalState]); var getContainerWidth = React.useCallback(function () { var _a, _b, _c, _d; if (currentDivWidth.current !== ((_a = divRef.current) === null || _a === void 0 ? void 0 : _a.offsetWidth) && ((_b = divRef.current) === null || _b === void 0 ? void 0 : _b.offsetWidth) !== undefined) { currentDivWidth.current = (_d = (_c = divRef.current) === null || _c === void 0 ? void 0 : _c.offsetWidth) !== null && _d !== void 0 ? _d : 0; setGlobalState(function (prevState) { return tslib_1.__assign(tslib_1.__assign({}, prevState), { containerWidth: currentDivWidth.current }); }); } }, [setGlobalState]); React.useEffect(function () { renderFilesPerPage(); document.addEventListener("change", function () { getContainerWidth(); }); window.addEventListener("resize", function () { getContainerWidth(); }); }, [files, selectedFiles, containerWidth, renderFilesPerPage, getContainerWidth]); getContainerWidth(); return (React.createElement(React.Fragment, null, React.createElement("div", { ref: divRef }, React.createElement(FileCommandBar_1.FileCommandBar, { onDelete: onDelete, onSelectedAll: onSelectAll, onUpload: onUpload }), React.createElement(ScrollablePane_1.ScrollablePane, { scrollbarVisibility: ScrollablePane_1.ScrollbarVisibility.auto, styles: scollableContainerStyles }, React.createElement("div", { className: documentListStyles.documentList }, React.createElement(dragDropFiles_1.DragDropFiles, { enable: true, onDrop: onDrop }, React.createElement(Stack_1.Stack, { tokens: { padding: 20 } }, renderFiles.length ? (React.createElement("div", { className: documentListStyles.filesContainerGrid }, renderFiles)) : (React.createElement(NoDocuments_1.NoDocuments, null)))))), React.createElement(Stack_1.Stack, { styles: bootomContainerStyles, horizontalAlign: "end", tokens: { childrenGap: 20 } }, React.createElement("div", { className: documentListStyles.separator }), React.createElement(React.Fragment, null, React.createElement(Button_1.PrimaryButton, { disabled: !selectedFiles.length, iconProps: { iconName: "upload" }, text: ControlStrings_1.default.UploadFilesUploadButtonLabel, onClick: function () { return onUploadFiles(selectedFiles); } })))))); }; exports.DocumentList = DocumentList; //# sourceMappingURL=DocumentList.js.map