@pnp/spfx-property-controls
Version:
Reusable property pane controls for SharePoint Framework solutions
90 lines • 5.6 kB
JavaScript
import * as React from 'react';
import styles from './FolderPicker.module.scss';
import { IconButton, PrimaryButton, DefaultButton } from '@fluentui/react/lib/Button';
import { Label } from '@fluentui/react/lib/Label';
import { Link } from '@fluentui/react/lib/Link';
import { getId } from '@fluentui/react/lib/Utilities';
import { Panel, PanelType } from '@fluentui/react/lib/Panel';
import { FolderExplorer } from './controls/FolderExplorer';
import * as telemetry from '../../common/telemetry';
import { getPropertyValue, setPropertyValue } from '../../helpers/GeneralHelper';
export default class PropertyFieldFolderPickerHost extends React.Component {
constructor(props) {
super(props);
this._folderLinkId = getId('folderLink');
this._showPanel = () => {
this.setState({ showPanel: true });
};
this._hidePanel = () => {
this.setState({ showPanel: false });
};
this._onRenderFooterContent = () => {
return (React.createElement("div", { className: styles.actions },
React.createElement(PrimaryButton, { iconProps: { iconName: 'Save' }, onClick: this._onFolderSave }, "Save"),
React.createElement(DefaultButton, { iconProps: { iconName: 'Cancel' }, onClick: this._hidePanel }, "Cancel")));
};
this._onFolderSelect = (folder) => {
this._selectedFolder = folder;
};
this._onFolderSave = () => {
this.props.onSelect(this._selectedFolder);
setPropertyValue(this.props.properties, this.props.targetProperty, this._selectedFolder);
this.props.onPropertyChange(this.props.targetProperty, this.props.selectedFolder, this._selectedFolder);
if (typeof this.props.onChange !== 'undefined' && this.props.onChange !== null) {
this.props.onChange(this.props.targetProperty, this._selectedFolder);
}
this.setState({
selectedFolder: this._selectedFolder,
showPanel: false,
});
};
this._resetSelection = () => {
this._selectedFolder = null;
this.setState({
selectedFolder: this._selectedFolder,
});
this.props.onSelect(this._selectedFolder);
setPropertyValue(this.props.properties, this.props.targetProperty, this._selectedFolder);
this.props.onPropertyChange(this.props.targetProperty, this.props.selectedFolder, this._selectedFolder);
if (typeof this.props.onChange !== 'undefined' && this.props.onChange !== null) {
this.props.onChange(this.props.targetProperty, this._selectedFolder);
}
};
telemetry.track('PropertyFieldFolderPicker', {
disabled: props.disabled
});
this.state = {
showPanel: false,
selectedFolder: getPropertyValue(props.properties, props.targetProperty) || this.props.defaultFolder
};
}
UNSAFE_componentWillReceiveProps(nextProps) {
const currentValue = getPropertyValue(this.props.properties, this.props.targetProperty);
const nextValue = getPropertyValue(nextProps.properties, nextProps.targetProperty);
if (currentValue !== nextValue) {
this.setState({
selectedFolder: nextValue
});
}
}
render() {
return (React.createElement("div", null,
this.props.label &&
React.createElement(Label, { className: this.props.required ? styles.required : '', htmlFor: this._folderLinkId }, this.props.label),
React.createElement("div", { className: styles.folderPicker },
React.createElement("div", { className: styles.selection },
!this.state.selectedFolder &&
React.createElement("span", { className: styles.selectFolderLabel }, "Select a folder"),
this.state.selectedFolder &&
React.createElement("div", { className: styles.selectFolder },
React.createElement(Link, { className: styles.selectedLink, target: '_blank', "data-interception": "off", id: this._folderLinkId, href: this.state.selectedFolder.ServerRelativeUrl },
React.createElement("span", { title: this.state.selectedFolder.Name }, this.state.selectedFolder.Name)),
React.createElement(IconButton, { iconProps: { iconName: 'Cancel' }, title: "Delete selection", ariaLabel: "Delete selection", onClick: this._resetSelection, disabled: this.props.disabled }))),
React.createElement("div", { className: styles.selectButton },
React.createElement(IconButton, { iconProps: { iconName: 'FolderList' }, title: "Select folder", ariaLabel: "Select folder", disabled: this.props.disabled, onClick: this._showPanel }))),
React.createElement(Panel, { isOpen: this.state.showPanel, type: PanelType.medium, onDismiss: this._hidePanel, headerText: "Select folder", closeButtonAriaLabel: "Close", onRenderFooterContent: this._onRenderFooterContent },
React.createElement("div", null,
React.createElement(FolderExplorer, { context: this.props.context, rootFolder: this.props.rootFolder, defaultFolder: this.state.selectedFolder, onSelect: this._onFolderSelect, canCreateFolders: this.props.canCreateFolders, siteAbsoluteUrl: this.props.siteAbsoluteUrl })))));
}
}
//# sourceMappingURL=PropertyFieldFolderPickerHost.js.map