UNPKG

@uifabric/experiments

Version:

Experimental React components for building experiences for Microsoft 365.

98 lines 6.01 kB
var _this = this; import { __assign } from "tslib"; import * as React from 'react'; import { styled, classNamesFunction, css, EventGroup, } from 'office-ui-fabric-react/lib/Utilities'; import { Persona, PersonaSize } from 'office-ui-fabric-react/lib/Persona'; import { getStyles } from './SelectedPersona.styles'; import { IconButton } from 'office-ui-fabric-react/lib/Button'; import { useId } from '@uifabric/react-hooks'; var getClassNames = classNamesFunction(); var DEFAULT_DROPPING_CSS_CLASS = 'is-dropping'; /** * A selected persona with support for item removal and expansion. * * To use the removal / expansion, bind isValid / canExpand / getExpandedItems * when passing the onRenderItem to your SelectedItemsList */ var SelectedPersonaInner = React.memo(function (props) { var item = props.item, onRemoveItem = props.onRemoveItem, onItemChange = props.onItemChange, removeButtonAriaLabel = props.removeButtonAriaLabel, index = props.index, selected = props.selected, isValid = props.isValid, canExpand = props.canExpand, getExpandedItems = props.getExpandedItems, styles = props.styles, theme = props.theme, dragDropHelper = props.dragDropHelper, dragDropEvents = props.dragDropEvents, eventsToRegister = props.eventsToRegister; var itemId = useId(); var _a = React.useState(false), isDropping = _a[0], setIsDropping = _a[1]; var _b = React.useState(''), droppingClassNames = _b[0], setDroppingClassNames = _b[1]; var rootRef = React.useRef(null); React.useEffect(function () { var _a; var _updateDroppingState = function (newValue, event) { if (!newValue) { if (dragDropEvents.onDragLeave) { dragDropEvents.onDragLeave(item, event); } } else if (dragDropEvents.onDragEnter) { setDroppingClassNames(dragDropEvents.onDragEnter(item, event)); } if (isDropping !== newValue) { setIsDropping(newValue); } }; var dragDropOptions = __assign(__assign({ eventMap: eventsToRegister, selectionIndex: index, context: { data: item, index: index } }, dragDropEvents), { updateDropState: _updateDroppingState }); var events = new EventGroup(_this); var subscription = (_a = dragDropHelper) === null || _a === void 0 ? void 0 : _a.subscribe(rootRef.current, events, dragDropOptions); return function () { var _a; (_a = subscription) === null || _a === void 0 ? void 0 : _a.dispose(); events.dispose(); }; }, // eslint-disable-next-line react-hooks/exhaustive-deps -- this is the only dependency which matters [dragDropHelper]); var isDraggable = React.useMemo(function () { return (dragDropEvents && dragDropEvents.canDrag ? !!dragDropEvents.canDrag() : undefined); }, [dragDropEvents]); var droppingClassName = React.useMemo(function () { return (isDropping ? droppingClassNames || DEFAULT_DROPPING_CSS_CLASS : ''); }, [isDropping, droppingClassNames]); var onExpandClicked = React.useCallback(function (ev) { ev.stopPropagation(); ev.preventDefault(); if (onItemChange && getExpandedItems) { getExpandedItems(item) .then(function (value) { onItemChange(value, index); }) .catch(function (error) { // No op }); } }, [onItemChange, getExpandedItems, item, index]); var onRemoveClicked = React.useCallback(function (ev) { ev.stopPropagation(); ev.preventDefault(); onRemoveItem && onRemoveItem(); }, [onRemoveItem]); var classNames = React.useMemo(function () { return getClassNames(styles, { isSelected: selected || false, isValid: isValid ? isValid(item) : true, theme: theme, droppingClassName: droppingClassName, }); }, // TODO: evaluate whether to add deps on `item` and `styles` // eslint-disable-next-line react-hooks/exhaustive-deps [selected, isValid, theme]); var coinProps = {}; return (React.createElement("div", __assign({ ref: rootRef }, (typeof isDraggable === 'boolean' ? { 'data-is-draggable': isDraggable, draggable: isDraggable, } : {}), { onContextMenu: props.onContextMenu, onClick: props.onClick, className: css('ms-PickerPersona-container', classNames.personaContainer), "data-is-focusable": true, "data-is-sub-focuszone": true, "data-selection-index": index, role: 'listitem', "aria-labelledby": 'selectedItemPersona-' + itemId }), React.createElement("div", { hidden: !canExpand || !canExpand(item) || !getExpandedItems }, React.createElement(IconButton, { onClick: onExpandClicked, iconProps: { iconName: 'Add', style: { fontSize: '14px' } }, className: css('ms-PickerItem-removeButton', classNames.expandButton), styles: classNames.subComponentStyles.actionButtonStyles(), ariaLabel: removeButtonAriaLabel })), React.createElement("div", { className: css(classNames.personaWrapper) }, React.createElement("div", { className: css('ms-PickerItem-content', classNames.itemContentWrapper), id: 'selectedItemPersona-' + itemId }, React.createElement(Persona, __assign({}, item, { size: PersonaSize.size32, styles: classNames.subComponentStyles.personaStyles, coinProps: coinProps }))), React.createElement(IconButton, { onClick: onRemoveClicked, iconProps: { iconName: 'Cancel', style: { fontSize: '14px' } }, className: css('ms-PickerItem-removeButton', classNames.removeButton), styles: classNames.subComponentStyles.actionButtonStyles(), ariaLabel: removeButtonAriaLabel })))); }); // export casting back to typeof inner to preserve generics. export var SelectedPersona = styled(SelectedPersonaInner, getStyles, undefined, { scope: 'SelectedPersona', }); //# sourceMappingURL=SelectedPersona.js.map