UNPKG

@pnp/spfx-controls-react

Version:

Reusable React controls for SharePoint Framework solutions

367 lines • 18.9 kB
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; import * as React from "react"; import * as strings from "ControlStrings"; import { ActionButton, PrimaryButton } from "@fluentui/react/lib/Button"; import { Label } from "@fluentui/react/lib/Label"; import { Panel, PanelType } from "@fluentui/react/lib/Panel"; import { Nav } from "@fluentui/react/lib/Nav"; import { css } from "@fluentui/react/lib/Utilities"; import * as telemetry from "../../common/telemetry"; import { FileBrowserService } from "../../services/FileBrowserService"; import { FilesSearchService } from "../../services/FilesSearchService"; import { OneDriveService } from "../../services/OneDriveService"; import { OrgAssetsService } from "../../services/OrgAssetsService"; import styles from "./FilePicker.module.scss"; import LinkFilePickerTab from "./LinkFilePickerTab/LinkFilePickerTab"; import { OneDriveFilesTab } from "./OneDriveFilesTab/OneDriveFilesTab"; import RecentFilesTab from "./RecentFilesTab/RecentFilesTab"; import SiteFilePickerTab from "./SiteFilePickerTab/SiteFilePickerTab"; import { StockImages } from "./StockImagesTab/StockImages"; import UploadFilePickerTab from "./UploadFilePickerTab/UploadFilePickerTab"; import MultipleUploadFilePickerTab from "./MultipleUploadFilePickerTab/MultipleUploadFilePickerTab"; import WebSearchTab from "./WebSearchTab/WebSearchTab"; var FilePicker = /** @class */ (function (_super) { __extends(FilePicker, _super); function FilePicker(props) { var _this = _super.call(this, props) || this; /** * Renders the panel header */ _this._renderHeader = function () { return (React.createElement("div", { className: "ms-Panel-header" }, React.createElement("p", { className: css("ms-Panel-headerText", styles.header), role: "heading" }, strings.FilePickerHeader))); }; /** * Open the panel */ _this._handleOpenPanel = function () { _this.setState({ panelOpen: true, selectedTab: _this.getDefaultSelectedTabKey(_this.props, _this.state.organisationAssetsEnabled), }); }; /** * Closes the panel */ _this._handleClosePanel = function () { if (_this.props.onCancel) { _this.props.onCancel(); } _this.setState({ panelOpen: false, }); }; /** * On save action */ _this._handleSave = function (filePickerResult) { _this.props.onSave(filePickerResult); _this.setState({ panelOpen: false, }); }; _this._handleOnChange = function (filePickerResult) { if (_this.props.onChange) { _this.props.onChange(filePickerResult); } }; /** * Changes the selected tab when a link is selected */ _this._handleLinkClick = function (ev, item) { _this.setState({ selectedTab: item.key }); }; /** * Prepares navigation panel options */ _this._getNavPanelOptions = function () { var addUrl = _this.props.storeLastActiveTab !== false; var links = []; if (!_this.props.hideRecentTab) { links.push({ name: strings.RecentLinkLabel, url: addUrl ? "#recent" : undefined, icon: "Recent", key: "keyRecent", }); } if (!_this.props.hideStockImages) { links.push({ name: strings.StockImagesLinkLabel, url: addUrl ? "#stockImages" : undefined, key: "keyStockImages", icon: "ImageSearch", }); } if (_this.props.bingAPIKey && !_this.props.hideWebSearchTab) { links.push({ name: strings.WebSearchLinkLabel, url: addUrl ? "#search" : undefined, key: "keyWeb", icon: "Search", }); } if (!_this.props.hideOrganisationalAssetTab && _this.state.organisationAssetsEnabled) { links.push({ name: strings.OrgAssetsLinkLabel, url: addUrl ? "#orgAssets" : undefined, icon: "FabricFolderConfirm", key: "keyOrgAssets", }); } if (!_this.props.hideOneDriveTab) { links.push({ name: "OneDrive", url: addUrl ? "#onedrive" : undefined, key: "keyOneDrive", icon: "OneDrive", }); } if (!_this.props.hideSiteFilesTab) { links.push({ name: strings.SiteLinkLabel, url: addUrl ? "#globe" : undefined, key: "keySite", icon: "Globe", }); } if (!_this.props.hideLocalUploadTab) { links.push({ name: strings.UploadLinkLabel, url: addUrl ? "#upload" : undefined, key: "keyUpload", icon: "System", }); } if (!_this.props.hideLocalMultipleUploadTab) { links.push({ name: strings.UploadLinkLabel + " " + strings.OneDriveRootFolderName, url: addUrl ? "#Multipleupload" : undefined, key: "keyMultipleUpload", icon: "BulkUpload", }); } if (!_this.props.hideLinkUploadTab) { links.push({ name: strings.FromLinkLinkLabel, url: addUrl ? "#link" : undefined, key: "keyLink", icon: "Link", }); } var groups = [{ links: links }]; return groups; }; _this.getDefaultSelectedTabKey = function (props, orgAssetsEnabled) { if (!props.hideRecentTab) { return "keyRecent"; } if (!props.hideStockImages) { return "keyStockImages"; } if (props.bingAPIKey && !props.hideWebSearchTab) { return "keyWeb"; } if (!props.hideOrganisationalAssetTab && orgAssetsEnabled) { return "keyOrgAssets"; } if (!props.hideOneDriveTab) { return "keyOneDrive"; } if (!props.hideSiteFilesTab) { return "keySite"; } if (!props.hideLocalUploadTab) { return "keyUpload"; } if (!props.hideLinkUploadTab) { return "keyLink"; } if (!props.hideLocalMultipleUploadTab) { return "keyMultipleUpload"; } }; telemetry.track("ReactFilePicker", {}); // Initialize file browser services _this.fileBrowserService = new FileBrowserService(props.context, _this.props.itemsCountQueryLimit, _this.props.webAbsoluteUrl); _this.oneDriveService = new OneDriveService(props.context, _this.props.itemsCountQueryLimit); _this.orgAssetsService = new OrgAssetsService(props.context, _this.props.itemsCountQueryLimit); _this.fileSearchService = new FilesSearchService(props.context, _this.props.bingAPIKey, _this.props.webAbsoluteUrl); _this.state = { panelOpen: _this.props.isPanelOpen || false, organisationAssetsEnabled: false, showFullNav: true, }; return _this; } FilePicker.prototype.componentDidMount = function () { return __awaiter(this, void 0, void 0, function () { var orgAssetsEnabled, orgAssetsLibraries, _a, title, id; return __generator(this, function (_b) { switch (_b.label) { case 0: orgAssetsEnabled = false; if (!!this.props.hideOrganisationalAssetTab) return [3 /*break*/, 2]; return [4 /*yield*/, this.orgAssetsService.getSiteMediaLibraries()]; case 1: orgAssetsLibraries = _b.sent(); orgAssetsEnabled = orgAssetsLibraries ? true : false; _b.label = 2; case 2: this.setState({ organisationAssetsEnabled: orgAssetsEnabled, selectedTab: this.getDefaultSelectedTabKey(this.props, orgAssetsEnabled), }); if (!(!!this.props.context && !!this.props.webAbsoluteUrl)) return [3 /*break*/, 4]; return [4 /*yield*/, this.fileBrowserService.getSiteTitleAndId()]; case 3: _a = _b.sent(), title = _a.title, id = _a.id; this.setState({ webTitle: title, webId: id }); _b.label = 4; case 4: return [2 /*return*/]; } }); }); }; /** * componentWillReceiveProps lifecycle hook * * @param nextProps */ FilePicker.prototype.UNSAFE_componentWillReceiveProps = function (nextProps) { if (nextProps.isPanelOpen || nextProps.isPanelOpen !== this.props.isPanelOpen) { this.setState({ panelOpen: nextProps.isPanelOpen }); } }; FilePicker.prototype.render = function () { var _this = this; // If no acceptable file type was passed, and we're expecting images, set the default image filter var accepts = this.props.accepts; var buttonClassName = this.props.buttonClassName ? this.props.buttonClassName : ""; var panelClassName = this.props.panelClassName ? this.props.panelClassName : ""; var linkTabProps = { accepts: accepts, context: this.props.context, onClose: function () { return _this._handleClosePanel(); }, onSave: function (value) { _this._handleSave(value); }, }; var buttonProps = { text: this.props.buttonLabel, disabled: this.props.disabled, onClick: this._handleOpenPanel, className: "pnp__file-picker__button ".concat(buttonClassName), }; /** * Test if button Icon or buttonIconProps were specified */ var buttonIconProps = {}; if (this.props.buttonIconProps) { buttonIconProps = this.props.buttonIconProps; buttonIconProps.iconName = this.props.buttonIcon ? this.props.buttonIcon : this.props.buttonIconProps.iconName; } else if (this.props.buttonIcon) { buttonIconProps.iconName = this.props.buttonIcon; } return (React.createElement("div", { className: "pnp__file-picker" }, !this.props.hidden && this.props.label && (React.createElement(Label, { required: this.props.required }, this.props.label)), !this.props.hidden && (this.props.buttonIcon || this.props.buttonIconProps) ? (React.createElement(ActionButton, __assign({ iconProps: buttonIconProps }, buttonProps))) : (!this.props.hidden && React.createElement(PrimaryButton, __assign({}, buttonProps))), React.createElement(Panel, { isOpen: this.state.panelOpen, isBlocking: true, hasCloseButton: true, className: "pnp__file-picker__panel ".concat(styles.filePicker, " ").concat(panelClassName), onDismiss: this._handleClosePanel, type: PanelType.extraLarge, isFooterAtBottom: true, onRenderNavigation: function () { return undefined; }, headerText: strings.FilePickerHeader, isLightDismiss: true, onRenderHeader: function () { return _this._renderHeader(); } }, React.createElement("div", { className: styles.nav }, React.createElement(Nav, { groups: this._getNavPanelOptions(), selectedKey: this.state.selectedTab, onLinkClick: function (ev, item) { return _this._handleLinkClick(ev, item); } })), React.createElement("div", { className: styles.tabsContainer }, this.state.selectedTab === "keyLink" && (React.createElement(LinkFilePickerTab, __assign({ fileSearchService: this.fileSearchService, renderCustomLinkTabContent: this.props.renderCustomLinkTabContent, allowExternalLinks: this.props.allowExternalLinks, checkIfFileExists: this.props.checkIfFileExists !== false }, linkTabProps))), this.state.selectedTab === "keyUpload" && (React.createElement(UploadFilePickerTab, __assign({ renderCustomUploadTabContent: this.props.renderCustomUploadTabContent }, linkTabProps, { onChange: this._handleOnChange }))), this.state.selectedTab === "keyMultipleUpload" && (React.createElement(MultipleUploadFilePickerTab, __assign({ renderCustomMultipleUploadTabContent: this.props.renderCustomMultipleUploadTabContent }, linkTabProps, { onChange: this._handleOnChange }))), this.state.selectedTab === "keySite" && (React.createElement(SiteFilePickerTab, __assign({ fileBrowserService: this.fileBrowserService, includePageLibraries: this.props.includePageLibraries, defaultFolderAbsolutePath: this.props.defaultFolderAbsolutePath, webTitle: this.state.webTitle, webId: this.state.webId, webAbsoluteUrl: this.props.webAbsoluteUrl }, linkTabProps))), this.state.selectedTab === "keyOrgAssets" && (React.createElement(SiteFilePickerTab, __assign({ breadcrumbFirstNode: { isCurrentItem: true, text: strings.OrgAssetsTabLabel, key: "keyOrgAssets", }, fileBrowserService: this.orgAssetsService, webTitle: this.state.webTitle }, linkTabProps))), this.state.selectedTab === "keyWeb" && (React.createElement(WebSearchTab, __assign({ bingSearchService: this.fileSearchService }, linkTabProps))), this.state.selectedTab === "keyOneDrive" && (React.createElement(OneDriveFilesTab, __assign({ oneDriveService: this.oneDriveService }, linkTabProps))), this.state.selectedTab === "keyRecent" && (React.createElement(RecentFilesTab, __assign({ fileSearchService: this.fileSearchService }, linkTabProps))), this.state.selectedTab === "keyStockImages" && (React.createElement(StockImages, __assign({ language: this.props.context.pageContext.cultureInfo.currentCultureName, fileSearchService: this.fileSearchService }, linkTabProps))))))); }; return FilePicker; }(React.Component)); export { FilePicker }; //# sourceMappingURL=FilePicker.js.map