@pnp/spfx-controls-react
Version:
Reusable React controls for SharePoint Framework solutions
324 lines • 18.4 kB
JavaScript
"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