UNPKG

@pnp/spfx-controls-react

Version:

Reusable React controls for SharePoint Framework solutions

120 lines 7.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var React = tslib_1.__importStar(require("react")); var GeneralHelper_1 = require("../../../common/utilities/GeneralHelper"); var Button_1 = require("@fluentui/react/lib/Button"); var TextField_1 = require("@fluentui/react/lib/TextField"); var Utilities_1 = require("@fluentui/react/lib/Utilities"); var strings = tslib_1.__importStar(require("ControlStrings")); var LinkFilePickerTab_module_scss_1 = tslib_1.__importDefault(require("./LinkFilePickerTab.module.scss")); var LinkFilePickerTab = /** @class */ (function (_super) { tslib_1.__extends(LinkFilePickerTab, _super); function LinkFilePickerTab(props) { var _this = _super.call(this, props) || this; /** * Called as user types in a new value */ _this._handleChange = function (fileUrl) { var filePickerResult = fileUrl ? { fileAbsoluteUrl: fileUrl, fileName: GeneralHelper_1.GeneralHelper.getFileNameFromUrl(fileUrl), fileNameWithoutExtension: GeneralHelper_1.GeneralHelper.getFileNameWithoutExtension(fileUrl), downloadFileContent: function () { return _this.props.fileSearchService.downloadBingContent(fileUrl, GeneralHelper_1.GeneralHelper.getFileNameFromUrl(fileUrl)); } } : null; _this.setState({ filePickerResult: filePickerResult }); }; /** * Verifies the url that was typed in * @param value */ _this._getErrorMessagePromise = function (value) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var fileExists, strResult; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: // DOn't give an error for blank or placeholder value, but don't make it a valid entry either if (value === undefined || value === '') { this.setState({ isValid: false }); return [2 /*return*/, '']; } // Make sure that user is typing a valid URL format if (!this._isUrl(value)) { this.setState({ isValid: false }); return [2 /*return*/, strings.InvalidUrlError]; } // If we don't allow external links, verify that we're in the same domain if (!this.props.allowExternalLinks && !this._isSameDomain(value)) { this.setState({ isValid: false }); return [2 /*return*/, strings.NoExternalLinksValidationMessage]; } if (!this.props.checkIfFileExists) { this.setState({ isValid: true }); return [2 /*return*/, '']; } return [4 /*yield*/, this.props.fileSearchService.checkFileExists(value)]; case 1: fileExists = _a.sent(); this.setState({ isValid: fileExists }); strResult = fileExists ? '' : strings.ProvidedValueIsInvalid; return [2 /*return*/, strResult]; } }); }); }; /** * Handles when user saves */ _this._handleSave = function () { _this.props.onSave([_this.state.filePickerResult]); }; /** * HAndles when user closes without saving */ _this._handleClose = function () { _this.props.onClose(); }; /** * Is this a URL ? * (insert guy holding a butterfly meme) */ _this._isUrl = function (fileUrl) { try { var myURL = new URL(fileUrl.toLowerCase()); return myURL.host !== undefined; } catch (_a) { return false; } }; _this._isSameDomain = function (fileUrl) { if (fileUrl) { return true; } var siteUrl = _this.props.context.pageContext.web.absoluteUrl; var siteDomainParts = GeneralHelper_1.GeneralHelper.getDomain(siteUrl).split('.'); var fileDomainParts = GeneralHelper_1.GeneralHelper.getDomain(fileUrl).split('.'); return siteDomainParts[0] === fileDomainParts[0] || "".concat(siteDomainParts[0], "-my") === fileDomainParts[0]; }; _this.state = { isValid: false }; return _this; } LinkFilePickerTab.prototype.render = function () { var _this = this; var fileUrl = this.state.filePickerResult ? this.state.filePickerResult.fileAbsoluteUrl : null; return (React.createElement("div", { className: LinkFilePickerTab_module_scss_1.default.tabContainer }, React.createElement("div", { className: LinkFilePickerTab_module_scss_1.default.tabHeaderContainer }, React.createElement("h2", { className: LinkFilePickerTab_module_scss_1.default.tabHeader }, strings.LinkHeader)), React.createElement("div", { className: (0, Utilities_1.css)(LinkFilePickerTab_module_scss_1.default.tab, LinkFilePickerTab_module_scss_1.default.tabOffset) }, React.createElement(TextField_1.TextField, { multiline: true, required: true, resizable: false, deferredValidationTime: 300, className: LinkFilePickerTab_module_scss_1.default.linkTextField, label: strings.LinkFileInstructions, ariaLabel: strings.LinkFileInstructions, placeholder: "https://", onGetErrorMessage: function (value) { return _this._getErrorMessagePromise(value); }, autoAdjustHeight: false, underlined: false, borderless: false, validateOnFocusIn: false, validateOnFocusOut: false, validateOnLoad: true, value: fileUrl, onChange: function (e, newValue) { return _this._handleChange(newValue); } }), this.props.renderCustomLinkTabContent && this.props.renderCustomLinkTabContent(this.state.filePickerResult)), React.createElement("div", { className: LinkFilePickerTab_module_scss_1.default.actionButtonsContainer }, React.createElement("div", { className: LinkFilePickerTab_module_scss_1.default.actionButtons }, React.createElement(Button_1.PrimaryButton, { disabled: !this.state.isValid, onClick: function () { return _this._handleSave(); }, className: LinkFilePickerTab_module_scss_1.default.actionButton }, strings.OpenButtonLabel), React.createElement(Button_1.DefaultButton, { onClick: function () { return _this._handleClose(); }, className: LinkFilePickerTab_module_scss_1.default.actionButton }, strings.CancelButtonLabel))))); }; return LinkFilePickerTab; }(React.Component)); exports.default = LinkFilePickerTab; //# sourceMappingURL=LinkFilePickerTab.js.map