UNPKG

@pnp/spfx-controls-react

Version:

Reusable React controls for SharePoint Framework solutions

193 lines 8.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ViewPicker = void 0; var tslib_1 = require("tslib"); var React = tslib_1.__importStar(require("react")); var cloneDeep_1 = tslib_1.__importDefault(require("lodash/cloneDeep")); var Dropdown_1 = require("@fluentui/react/lib/Dropdown"); var Utilities_1 = require("@fluentui/react/lib/Utilities"); var telemetry = tslib_1.__importStar(require("../../common/telemetry")); var SPServiceFactory_1 = require("../../services/SPServiceFactory"); var ViewPicker_module_scss_1 = tslib_1.__importDefault(require("./ViewPicker.module.scss")); // Empty view value var EMPTY_VIEW_KEY = 'NO_VIEW_SELECTED'; var ViewPicker = /** @class */ (function (_super) { tslib_1.__extends(ViewPicker, _super); function ViewPicker(props) { var _this = _super.call(this, props) || this; _this.selectedKey = null; /** * Fires when a view has been selected from the dropdown. * @param option The new selection. * @param index Index of the selection. */ _this.onChange = function (event, option, index) { var _a = _this.props, multiSelect = _a.multiSelect, onSelectionChanged = _a.onSelectionChanged; var selectedViews = null; if (multiSelect) { selectedViews = _this.state.selectedView ? (0, cloneDeep_1.default)(_this.state.selectedView) : []; if (option.selected) { selectedViews.push(option.key.toString()); } else { selectedViews = selectedViews.filter(function (view) { return view !== option.key; }); } } else { selectedViews = option.key.toString(); } _this.setState({ selectedView: selectedViews }); if (onSelectionChanged) { onSelectionChanged((0, cloneDeep_1.default)(selectedViews)); } }; telemetry.track('ViewPicker'); _this.state = { results: [] }; _this.async = new Utilities_1.Async(_this); return _this; } ViewPicker.prototype.componentDidMount = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: // Start retrieving the list views return [4 /*yield*/, this.loadViews()]; case 1: // Start retrieving the list views _a.sent(); return [2 /*return*/]; } }); }); }; /** * componentDidUpdate lifecycle hook * @param prevProps * @param prevState */ ViewPicker.prototype.componentDidUpdate = function (prevProps, _prevState) { return tslib_1.__awaiter(this, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (!(this.props.listId !== prevProps.listId || this.props.webAbsoluteUrl !== prevProps.webAbsoluteUrl || this.props.orderBy !== prevProps.orderBy)) return [3 /*break*/, 2]; return [4 /*yield*/, this.loadViews()]; case 1: _a.sent(); _a.label = 2; case 2: if (prevProps.selectedView !== this.props.selectedView) { this.setSelectedViews(); } return [2 /*return*/]; } }); }); }; /** * Called when the component will unmount */ ViewPicker.prototype.componentWillUnmount = function () { if (typeof this.async !== 'undefined') { this.async.dispose(); } }; ViewPicker.prototype.loadViews = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var viewsToExclude, options, service, results; var _this = this; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: viewsToExclude = this.props.viewsToExclude || []; options = []; service = SPServiceFactory_1.SPServiceFactory.createService(this.props.context, true, 5000, this.props.webAbsoluteUrl); return [4 /*yield*/, service.getViews(this.props.listId, this.props.orderBy, this.props.filter)]; case 1: results = _a.sent(); // Start mapping the views that are selected results.value.forEach(function (view) { if (_this.props.selectedView === view.Id) { _this.selectedKey = view.Id; } // Make sure that the current view is NOT in the 'viewsToExclude' array if (viewsToExclude.indexOf(view.Title) === -1 && viewsToExclude.indexOf(view.Id) === -1) { options.push({ key: view.Id, text: view.Title }); } }); if (this.props.showBlankOption) { // Provide empty option options.unshift({ key: EMPTY_VIEW_KEY, text: '', }); } else { // Option to unselect the view options.unshift({ key: EMPTY_VIEW_KEY, text: EMPTY_VIEW_KEY }); } this.setSelectedViews(); // Update the current component state this.setState({ results: options }); return [2 /*return*/]; } }); }); }; /** * Set the currently selected views(s); */ ViewPicker.prototype.setSelectedViews = function () { var _selectedView = (0, cloneDeep_1.default)(this.props.selectedView); this.setState({ selectedView: _selectedView }); }; /** * Renders the ViewPicker controls with Office UI Fabric */ ViewPicker.prototype.render = function () { var _a = this.state, results = _a.results, selectedView = _a.selectedView; var _b = this.props, className = _b.className, disabled = _b.disabled, multiSelect = _b.multiSelect, label = _b.label, placeholder = _b.placeholder; var options = results.map(function (v) { return ({ key: v.key, text: v.text }); }); var dropdownProps = { className: className, options: options, disabled: disabled, label: label, placeholder: placeholder, onChange: this.onChange, }; if (multiSelect) { dropdownProps.multiSelect = true; dropdownProps.selectedKeys = selectedView; } else { dropdownProps.selectedKey = selectedView; } // Renders content return (React.createElement("div", { className: ViewPicker_module_scss_1.default.viewPicker }, React.createElement(Dropdown_1.Dropdown, tslib_1.__assign({}, dropdownProps)))); }; return ViewPicker; }(React.Component)); exports.ViewPicker = ViewPicker; //# sourceMappingURL=ViewPicker.js.map