Skip to content

Commit

Permalink
Refactor #4602 - For ContextMenu
Browse files Browse the repository at this point in the history
  • Loading branch information
ulasturann committed Jul 27, 2023
1 parent 9b2f59d commit 8118900
Show file tree
Hide file tree
Showing 6 changed files with 99 additions and 78 deletions.
45 changes: 0 additions & 45 deletions components/lib/contextmenu/ContextMenu.css

This file was deleted.

19 changes: 9 additions & 10 deletions components/lib/contextmenu/ContextMenu.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { Portal } from '../portal/Portal';
import { DomHandler, UniqueComponentId, ZIndexUtils, classNames, mergeProps } from '../utils/Utils';
import { ContextMenuBase } from './ContextMenuBase';
import { ContextMenuSub } from './ContextMenuSub';
import { useHandleStyle } from '../componentbase/ComponentBase';

export const ContextMenu = React.memo(
React.forwardRef((inProps, ref) => {
Expand All @@ -16,7 +17,7 @@ export const ContextMenu = React.memo(
const [reshowState, setReshowState] = React.useState(false);
const [resetMenuState, setResetMenuState] = React.useState(false);
const [attributeSelectorState, setAttributeSelectorState] = React.useState(null);
const { ptm } = ContextMenuBase.setMetaData({
const { ptm, cx, isUnstyled } = ContextMenuBase.setMetaData({
props,
state: {
visible: visibleState,
Expand All @@ -25,6 +26,8 @@ export const ContextMenu = React.memo(
attributeSelector: attributeSelectorState
}
});

useHandleStyle(ContextMenuBase.css.styles, isUnstyled, { name: 'contextmenu' });
const menuRef = React.useRef(null);
const currentEvent = React.useRef(null);
const styleElementRef = React.useRef(null);
Expand Down Expand Up @@ -128,6 +131,8 @@ export const ContextMenu = React.memo(
};

const onEnter = () => {
DomHandler.addStyles(menuRef.current, { position: 'absolute' });

if (props.autoZIndex) {
ZIndexUtils.set('menu', menuRef.current, (context && context.autoZIndex) || PrimeReact.autoZIndex, props.baseZIndex || (context && context.zIndex['menu']) || PrimeReact.zIndex['menu']);
}
Expand Down Expand Up @@ -251,16 +256,10 @@ export const ContextMenu = React.memo(
}));

const createContextMenu = () => {
const className = classNames('p-contextmenu p-component', props.className, {
'p-input-filled': (context && context.inputStyle === 'filled') || PrimeReact.inputStyle === 'filled',
'p-ripple-disabled': (context && context.ripple === false) || PrimeReact.ripple === false
});

const rootProps = mergeProps(
{
id: props.id,
ref: menuRef,
className,
className: cx('root', { context }),
style: props.style,
onClick: (e) => onMenuClick(e),
onMouseEnter: (e) => onMenuMouseEnter(e)
Expand All @@ -282,8 +281,8 @@ export const ContextMenu = React.memo(
onExit={onExit}
onExited={onExited}
>
<div {...rootProps}>
<ContextMenuSub menuProps={props} model={props.model} root resetMenu={resetMenuState} onLeafClick={onLeafClick} isMobileMode={isMobileMode} submenuIcon={props.submenuIcon} ptm={ptm} />
<div ref={menuRef} {...rootProps}>
<ContextMenuSub menuProps={props} model={props.model} root resetMenu={resetMenuState} onLeafClick={onLeafClick} isMobileMode={isMobileMode} submenuIcon={props.submenuIcon} ptm={ptm} cx={cx} />
</div>
</CSSTransition>
);
Expand Down
68 changes: 68 additions & 0 deletions components/lib/contextmenu/ContextMenuBase.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,68 @@
import PrimeReact from '../api/Api';
import { ComponentBase } from '../componentbase/ComponentBase';
import { classNames } from '../utils/Utils';

const styles = `
.p-contextmenu ul {
margin: 0;
padding: 0;
list-style: none;
}
.p-contextmenu .p-submenu-list {
position: absolute;
min-width: 100%;
z-index: 1;
}
.p-contextmenu .p-menuitem-link {
cursor: pointer;
display: flex;
align-items: center;
text-decoration: none;
overflow: hidden;
position: relative;
}
.p-contextmenu .p-menuitem-text {
line-height: 1;
}
.p-contextmenu .p-menuitem {
position: relative;
}
.p-contextmenu .p-menuitem-link .p-submenu-icon {
margin-left: auto;
}
.p-contextmenu-enter {
opacity: 0;
}
.p-contextmenu-enter-active {
opacity: 1;
transition: opacity 250ms;
}
`;

const classes = {
root: ({ props, context }) =>
classNames('p-contextmenu p-component', props.className, {
'p-input-filled': (context && context.inputStyle === 'filled') || PrimeReact.inputStyle === 'filled',
'p-ripple-disabled': (context && context.ripple === false) || PrimeReact.ripple === false
}),
menu: ({ menuProps: props }) =>
classNames({
'p-submenu-list': !props.root
}),
menuitem: ({ item, active }) => classNames('p-menuitem', { 'p-menuitem-active': active }, item.className),
action: ({ item }) => classNames('p-menuitem-link', { 'p-disabled': item.disabled }),
icon: 'p-menuitem-icon',
submenuIcon: 'p-submenu-icon',
label: 'p-menuitem-text',
separator: 'p-menu-separator'
};

export const ContextMenuBase = ComponentBase.extend({
defaultProps: {
Expand All @@ -18,5 +82,9 @@ export const ContextMenuBase = ComponentBase.extend({
onHide: null,
submenuIcon: null,
children: undefined
},
css: {
classes,
styles
}
});
39 changes: 17 additions & 22 deletions components/lib/contextmenu/ContextMenuSub.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@ import * as React from 'react';
import { CSSTransition } from '../csstransition/CSSTransition';
import { useUpdateEffect } from '../hooks/Hooks';
import { Ripple } from '../ripple/Ripple';
import { classNames, DomHandler, IconUtils, mergeProps, ObjectUtils } from '../utils/Utils';
import { DomHandler, IconUtils, mergeProps, ObjectUtils } from '../utils/Utils';
import { AngleRightIcon } from '../icons/angleright';

export const ContextMenuSub = React.memo((props) => {
const [activeItemState, setActiveItemState] = React.useState(null);
const submenuRef = React.useRef(null);
const active = props.root || !props.resetMenu;
const { ptm, cx } = props;

const getPTOptions = (item, key) => {
return props.ptm(key, {
return ptm(key, {
context: {
active: activeItemState === item
}
Expand Down Expand Up @@ -96,17 +97,17 @@ export const ContextMenuSub = React.memo((props) => {
{
role: 'separator',
key: 'separator_' + index,
className: 'p-menu-separator'
className: cx('separator')
},
props.ptm('separator')
ptm('separator')
);

return <li {...separatorProps}></li>;
};

const createSubmenu = (item) => {
if (item.items) {
return <ContextMenuSub menuProps={props.menuProps} model={item.items} resetMenu={item !== activeItemState} onLeafClick={props.onLeafClick} isMobileMode={props.isMobileMode} submenuIcon={props.submenuIcon} ptm={props.ptm} />;
return <ContextMenuSub menuProps={props.menuProps} model={item.items} resetMenu={item !== activeItemState} onLeafClick={props.onLeafClick} isMobileMode={props.isMobileMode} submenuIcon={props.submenuIcon} ptm={ptm} cx={cx} />;
}

return null;
Expand All @@ -119,27 +120,23 @@ export const ContextMenuSub = React.memo((props) => {

const active = activeItemState === item;
const key = item.label + '_' + index;
const className = classNames('p-menuitem', { 'p-menuitem-active': active }, item.className);
const linkClassName = classNames('p-menuitem-link', { 'p-disabled': item.disabled });
const iconClassName = 'p-menuitem-icon';
const iconProps = mergeProps(
{
className: iconClassName
className: cx('icon')
},
getPTOptions(item, 'icon')
);
const icon = IconUtils.getJSXIcon(item.icon, { ...iconProps }, { props: props.menuProps });
const submenuIconClassName = 'p-submenu-icon';
const submenuIconProps = mergeProps(
{
className: submenuIconClassName
className: cx('submenuIcon')
},
getPTOptions(item, 'submenuIcon')
);

const labelProps = mergeProps(
{
className: 'p-menuitem-text'
className: cx('label')
},
getPTOptions(item, 'label')
);
Expand All @@ -149,7 +146,7 @@ export const ContextMenuSub = React.memo((props) => {
const actionProps = mergeProps(
{
href: item.url || '#',
className: linkClassName,
className: cx('action', { item }),
target: item.target,
onClick: (event) => onItemClick(event, item, index),
role: 'menuitem',
Expand All @@ -173,7 +170,7 @@ export const ContextMenuSub = React.memo((props) => {
onClick: (event) => onItemClick(event, item, index),
className: 'p-menuitem-link',
labelClassName: 'p-menuitem-text',
iconClassName,
iconClassName: 'p-menuitem-icon',
submenuIconClassName,
element: content,
props,
Expand All @@ -187,7 +184,7 @@ export const ContextMenuSub = React.memo((props) => {
{
id: item.id,
role: 'none',
className,
className: cx('menuitem', { item, active }),
style: item.style,
key,
onMouseEnter: (event) => onItemMouseEnter(event, item)
Expand All @@ -211,21 +208,19 @@ export const ContextMenuSub = React.memo((props) => {
return props.model ? props.model.map(createItem) : null;
};

const className = classNames({
'p-submenu-list': !props.root
});
const submenu = createMenu();
const menuProps = mergeProps(
{
ref: submenuRef,
className
className: cx('menu', { menuProps: props })
},
props.ptm('menu')
ptm('menu')
);

return (
<CSSTransition nodeRef={submenuRef} classNames="p-contextmenusub" in={active} timeout={{ enter: 0, exit: 0 }} unmountOnExit onEnter={onEnter}>
<ul {...menuProps}>{submenu}</ul>
<ul ref={submenuRef} {...menuProps}>
{submenu}
</ul>
</CSSTransition>
);
});
Expand Down
5 changes: 5 additions & 0 deletions components/lib/contextmenu/contextmenu.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,11 @@ export interface ContextMenuProps extends Omit<React.DetailedHTMLProps<React.HTM
* @type {ContextMenuPassThroughOptions}
*/
pt?: ContextMenuPassThroughOptions;
/**
* When enabled, it removes component related styles in the core.
* @defaultValue false
*/
unstyled?: boolean;
}

/**
Expand Down
1 change: 0 additions & 1 deletion styles/primereact.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
@import "../components/lib/button/Button.css";
@import "../components/lib/carousel/Carousel.css";
@import "../components/lib/galleria/Galleria.css";
@import "../components/lib/contextmenu/ContextMenu.css";
@import "../components/lib/datascroller/DataScroller.css";
@import "../components/lib/dataview/DataView.css";
@import "../components/lib/datatable/DataTable.css";
Expand Down

0 comments on commit 8118900

Please sign in to comment.