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