UNPKG

@pnp/spfx-controls-react

Version:

Reusable React controls for SharePoint Framework solutions

324 lines • 18.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FilePicker = void 0; var tslib_1 = require("tslib"); var React = tslib_1.__importStar(require("react")); var strings = tslib_1.__importStar(require("ControlStrings")); var Button_1 = require("@fluentui/react/lib/Button"); var Label_1 = require("@fluentui/react/lib/Label"); var Panel_1 = require("@fluentui/react/lib/Panel"); var Nav_1 = require("@fluentui/react/lib/Nav"); var Utilities_1 = require("@fluentui/react/lib/Utilities"); var telemetry = tslib_1.__importStar(require("../../common/telemetry")); var FileBrowserService_1 = require("../../services/FileBrowserService"); var FilesSearchService_1 = require("../../services/FilesSearchService"); var OneDriveService_1 = require("../../services/OneDriveService"); var OrgAssetsService_1 = require("../../services/OrgAssetsService"); var FilePicker_module_scss_1 = tslib_1.__importDefault(require("./FilePicker.module.scss")); var LinkFilePickerTab_1 = tslib_1.__importDefault(require("./LinkFilePickerTab/LinkFilePickerTab")); var OneDriveFilesTab_1 = require("./OneDriveFilesTab/OneDriveFilesTab"); var RecentFilesTab_1 = tslib_1.__importDefault(require("./RecentFilesTab/RecentFilesTab")); var SiteFilePickerTab_1 = tslib_1.__importDefault(require("./SiteFilePickerTab/SiteFilePickerTab")); var StockImages_1 = require("./StockImagesTab/StockImages"); var UploadFilePickerTab_1 = tslib_1.__importDefault(require("./UploadFilePickerTab/UploadFilePickerTab")); var MultipleUploadFilePickerTab_1 = tslib_1.__importDefault(require("./MultipleUploadFilePickerTab/MultipleUploadFilePickerTab")); var WebSearchTab_1 = tslib_1.__importDefault(require("./WebSearchTab/WebSearchTab")); var FilePickerTab_1 = require("./FilePickerTab"); var FilePicker = /** @class */ (function (_super) { tslib_1.__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: (0, Utilities_1.css)("ms-Panel-headerText", FilePicker_module_scss_1.default.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: FilePickerTab_1.FilePickerTab.Recent, }); } if (!_this.props.hideStockImages) { links.push({ name: strings.StockImagesLinkLabel, url: addUrl ? "#stockImages" : undefined, key: FilePickerTab_1.FilePickerTab.StockImages, icon: "ImageSearch", }); } if (_this.props.bingAPIKey && !_this.props.hideWebSearchTab) { links.push({ name: strings.WebSearchLinkLabel, url: addUrl ? "#search" : undefined, key: FilePickerTab_1.FilePickerTab.Web, icon: "Search", }); } if (!_this.props.hideOrganisationalAssetTab && _this.state.organisationAssetsEnabled) { links.push({ name: strings.OrgAssetsLinkLabel, url: addUrl ? "#orgAssets" : undefined, icon: "FabricFolderConfirm", key: FilePickerTab_1.FilePickerTab.OrgAssets, }); } if (!_this.props.hideOneDriveTab) { links.push({ name: "OneDrive", url: addUrl ? "#onedrive" : undefined, key: FilePickerTab_1.FilePickerTab.OneDrive, icon: "OneDrive", }); } if (!_this.props.hideSiteFilesTab) { links.push({ name: strings.SiteLinkLabel, url: addUrl ? "#globe" : undefined, key: FilePickerTab_1.FilePickerTab.Site, icon: "Globe", }); } if (!_this.props.hideLocalUploadTab) { links.push({ name: strings.UploadLinkLabel, url: addUrl ? "#upload" : undefined, key: FilePickerTab_1.FilePickerTab.Upload, icon: "System", }); } if (!_this.props.hideLocalMultipleUploadTab) { links.push({ name: strings.UploadLinkLabel + " " + strings.OneDriveRootFolderName, url: addUrl ? "#Multipleupload" : undefined, key: FilePickerTab_1.FilePickerTab.MultipleUpload, icon: "BulkUpload", }); } if (!_this.props.hideLinkUploadTab) { links.push({ name: strings.FromLinkLinkLabel, url: addUrl ? "#link" : undefined, key: FilePickerTab_1.FilePickerTab.Link, icon: "Link", }); } if (_this.props.tabOrder) { links = _this._getTabOrder(links); } var groups = [{ links: links }]; return groups; }; /** * Sorts navigation tabs based on the tabOrder prop */ _this._getTabOrder = function (links) { var sortedKeys = tslib_1.__spreadArray(tslib_1.__spreadArray([], _this.props.tabOrder, true), links.map(function (l) { return l.key; }).filter(function (key) { return !_this.props.tabOrder.includes(key); }), true); links.sort(function (a, b) { return sortedKeys.indexOf(a.key) - sortedKeys.indexOf(b.key); }); return links; }; /** * Returns the default selected tab key */ _this._getDefaultSelectedTabKey = function (props, orgAssetsEnabled) { var tabsConfig = [ { isTabVisible: !props.hideRecentTab, tabKey: FilePickerTab_1.FilePickerTab.Recent }, { isTabVisible: !props.hideStockImages, tabKey: FilePickerTab_1.FilePickerTab.StockImages }, { isTabVisible: props.bingAPIKey && !props.hideWebSearchTab, tabKey: FilePickerTab_1.FilePickerTab.Web }, { isTabVisible: !props.hideOrganisationalAssetTab && orgAssetsEnabled, tabKey: FilePickerTab_1.FilePickerTab.OrgAssets }, { isTabVisible: !props.hideOneDriveTab, tabKey: FilePickerTab_1.FilePickerTab.OneDrive }, { isTabVisible: !props.hideSiteFilesTab, tabKey: FilePickerTab_1.FilePickerTab.Site }, { isTabVisible: !props.hideLocalUploadTab, tabKey: FilePickerTab_1.FilePickerTab.Upload }, { isTabVisible: !props.hideLinkUploadTab, tabKey: FilePickerTab_1.FilePickerTab.Link }, { isTabVisible: !props.hideLocalMultipleUploadTab, tabKey: FilePickerTab_1.FilePickerTab.MultipleUpload } ]; var visibleTabs = tabsConfig.filter(function (tab) { return tab.isTabVisible; }); var visibleTabKeys = visibleTabs.map(function (tab) { return tab.tabKey; }); // If defaultSelectedTab is provided and is visible, then return tabKey if (_this.props.defaultSelectedTab && visibleTabKeys.includes(_this.props.defaultSelectedTab)) { return _this.props.defaultSelectedTab; } // If no valid default tab is provided, find the first visible tab in the order if (_this.props.tabOrder) { var visibleTabSet_1 = new Set(visibleTabKeys); return _this.props.tabOrder.find(function (key) { return visibleTabSet_1.has(key); }); } else { return visibleTabKeys[0]; // first visible tab from default order } }; telemetry.track("ReactFilePicker", {}); // Initialize file browser services _this.fileBrowserService = new FileBrowserService_1.FileBrowserService(props.context, _this.props.itemsCountQueryLimit, _this.props.webAbsoluteUrl); _this.oneDriveService = new OneDriveService_1.OneDriveService(props.context, _this.props.itemsCountQueryLimit); _this.orgAssetsService = new OrgAssetsService_1.OrgAssetsService(props.context, _this.props.itemsCountQueryLimit); _this.fileSearchService = new FilesSearchService_1.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 tslib_1.__awaiter(this, void 0, void 0, function () { var orgAssetsEnabled, orgAssetsLibraries, _a, title, id; return tslib_1.__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_1.Label, { required: this.props.required }, this.props.label)), !this.props.hidden && (this.props.buttonIcon || this.props.buttonIconProps) ? (React.createElement(Button_1.ActionButton, tslib_1.__assign({ iconProps: buttonIconProps }, buttonProps))) : (!this.props.hidden && React.createElement(Button_1.PrimaryButton, tslib_1.__assign({}, buttonProps))), React.createElement(Panel_1.Panel, { isOpen: this.state.panelOpen, isBlocking: true, hasCloseButton: true, className: "pnp__file-picker__panel ".concat(FilePicker_module_scss_1.default.filePicker, " ").concat(panelClassName), onDismiss: this._handleClosePanel, type: Panel_1.PanelType.extraLarge, isFooterAtBottom: true, onRenderNavigation: function () { return undefined; }, headerText: strings.FilePickerHeader, isLightDismiss: true, onRenderHeader: function () { return _this._renderHeader(); } }, React.createElement("div", { className: FilePicker_module_scss_1.default.nav }, React.createElement(Nav_1.Nav, { groups: this._getNavPanelOptions(), selectedKey: this.state.selectedTab, onLinkClick: function (ev, item) { return _this._handleLinkClick(ev, item); } })), React.createElement("div", { className: FilePicker_module_scss_1.default.tabsContainer }, this.state.selectedTab === FilePickerTab_1.FilePickerTab.Link && (React.createElement(LinkFilePickerTab_1.default, tslib_1.__assign({ fileSearchService: this.fileSearchService, renderCustomLinkTabContent: this.props.renderCustomLinkTabContent, allowExternalLinks: this.props.allowExternalLinks, checkIfFileExists: this.props.checkIfFileExists !== false }, linkTabProps))), this.state.selectedTab === FilePickerTab_1.FilePickerTab.Upload && (React.createElement(UploadFilePickerTab_1.default, tslib_1.__assign({ renderCustomUploadTabContent: this.props.renderCustomUploadTabContent }, linkTabProps, { onChange: this._handleOnChange }))), this.state.selectedTab === FilePickerTab_1.FilePickerTab.MultipleUpload && (React.createElement(MultipleUploadFilePickerTab_1.default, tslib_1.__assign({ renderCustomMultipleUploadTabContent: this.props.renderCustomMultipleUploadTabContent }, linkTabProps, { onChange: this._handleOnChange }))), this.state.selectedTab === FilePickerTab_1.FilePickerTab.Site && (React.createElement(SiteFilePickerTab_1.default, tslib_1.__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 === FilePickerTab_1.FilePickerTab.OrgAssets && (React.createElement(SiteFilePickerTab_1.default, tslib_1.__assign({ breadcrumbFirstNode: { isCurrentItem: true, text: strings.OrgAssetsTabLabel, key: FilePickerTab_1.FilePickerTab.OrgAssets, }, fileBrowserService: this.orgAssetsService, webTitle: this.state.webTitle }, linkTabProps))), this.state.selectedTab === FilePickerTab_1.FilePickerTab.Web && (React.createElement(WebSearchTab_1.default, tslib_1.__assign({ bingSearchService: this.fileSearchService }, linkTabProps))), this.state.selectedTab === FilePickerTab_1.FilePickerTab.OneDrive && (React.createElement(OneDriveFilesTab_1.OneDriveFilesTab, tslib_1.__assign({ oneDriveService: this.oneDriveService }, linkTabProps))), this.state.selectedTab === FilePickerTab_1.FilePickerTab.Recent && (React.createElement(RecentFilesTab_1.default, tslib_1.__assign({ fileSearchService: this.fileSearchService }, linkTabProps))), this.state.selectedTab === FilePickerTab_1.FilePickerTab.StockImages && (React.createElement(StockImages_1.StockImages, tslib_1.__assign({ language: this.props.context.pageContext.cultureInfo.currentCultureName, fileSearchService: this.fileSearchService }, linkTabProps))))))); }; return FilePicker; }(React.Component)); exports.FilePicker = FilePicker; //# sourceMappingURL=FilePicker.js.map