From 5ceb85a06a55a5833b79333699238ec41a56fd6f Mon Sep 17 00:00:00 2001
From: Gopal Goel
Date: Thu, 20 Sep 2018 10:41:58 +0530
Subject: [PATCH 01/25] feat(ContextualMenu): base implementation
---
.../Types/ContextualMenuExample.shorthand.tsx | 120 ++++++++++++++++++
.../Types/ContextualMenuExample.tsx | 114 +++++++++++++++++
.../components/ContextualMenu/Types/index.tsx | 15 +++
.../components/ContextualMenu/index.tsx | 10 ++
.../ContextualMenu/ContextualMenu.tsx | 72 +++++++++++
src/components/ContextualMenu/index.tsx | 1 +
src/index.ts | 1 +
src/themes/teams/componentStyles.ts | 2 +
src/themes/teams/componentVariables.ts | 2 +
.../ContextualMenu/ContextualMenuStyles.tsx | 22 ++++
.../ContextualMenuVariables.tsx | 15 +++
.../components/Popup/popupContentVariables.ts | 2 +-
tslint.json | 2 +-
13 files changed, 376 insertions(+), 2 deletions(-)
create mode 100644 docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
create mode 100644 docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.tsx
create mode 100644 docs/src/examples/components/ContextualMenu/Types/index.tsx
create mode 100644 docs/src/examples/components/ContextualMenu/index.tsx
create mode 100644 src/components/ContextualMenu/ContextualMenu.tsx
create mode 100644 src/components/ContextualMenu/index.tsx
create mode 100644 src/themes/teams/components/ContextualMenu/ContextualMenuStyles.tsx
create mode 100644 src/themes/teams/components/ContextualMenu/ContextualMenuVariables.tsx
diff --git a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
new file mode 100644
index 0000000000..ac3cdfadae
--- /dev/null
+++ b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
@@ -0,0 +1,120 @@
+import React from 'react'
+import { ContextualMenu, Popup, Menu, Button, Avatar, Icon } from '@stardust-ui/react'
+
+const subb_items = [
+ {
+ key: 'editorials',
+ content: 'Editorials',
+ onClick: () => {
+ alert('hel')
+ },
+ },
+ { key: 'review', content: 'Reviews' },
+ {
+ key: 'events',
+ content: (
+ gopal
} content={'jdfngkjdfbgkjdfdfjb'} />
+ ),
+ },
+]
+
+const menuItemStyle = {
+ root: { padding: '0px', margin: '0px', minHeight: '50px', borderRadius: '0%' },
+ anchor: { padding: '0px' },
+}
+
+const triggerStyle = {
+ padding: '15px',
+}
+
+const sub_items = [
+ {
+ key: 'editorials',
+ styles: { ...menuItemStyle, anchor: { padding: '15px' } },
+ content: 'Editorials',
+ onClick: () => {
+ alert('hel')
+ },
+ },
+ { key: 'review', styles: { ...menuItemStyle, anchor: { padding: '15px' } }, content: 'Reviews' },
+ {
+ key: 'events',
+ styles: menuItemStyle,
+ content: (
+ Events}
+ content={}
+ />
+ ),
+ },
+]
+
+const items = [
+ {
+ key: 'editorials',
+ styles: menuItemStyle,
+ content: (
+
+ ),
+ onClick: () => {
+ alert('hel')
+ },
+ },
+ {
+ key: 'review',
+ icon: 'search',
+ content: 'Search in channel',
+ styles: { ...menuItemStyle, anchor: { padding: '15px' } },
+ },
+ {
+ key: 'events',
+ styles: menuItemStyle,
+ content: (
+ Submenu 1}
+ content={}
+ />
+ ),
+ },
+ {
+ key: 'events',
+ styles: menuItemStyle,
+ content: (
+ Submenu 2}
+ content={}
+ />
+ ),
+ },
+]
+
+const ContextualMenuExample = () => (
+
+ }
+ content={}
+ />
+ }
+ />
+)
+
+export default ContextualMenuExample
diff --git a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.tsx b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.tsx
new file mode 100644
index 0000000000..96f2d22153
--- /dev/null
+++ b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.tsx
@@ -0,0 +1,114 @@
+import React from 'react'
+import { ContextualMenu, Popup, Menu, Button, Avatar, Icon } from '@stardust-ui/react'
+
+const subb_items = [
+ {
+ key: 'editorials',
+ content: 'Editorials',
+ onClick: () => {
+ alert('hel')
+ },
+ },
+ { key: 'review', content: 'Reviews' },
+ {
+ key: 'events',
+ content: (
+ gopal} content={'jdfngkjdfbgkjdfdfjb'} />
+ ),
+ },
+]
+
+const sub_items = [
+ {
+ key: 'editorials',
+ content: 'Editorials',
+ onClick: () => {
+ alert('hel')
+ },
+ },
+ { key: 'review', content: 'Reviews' },
+ {
+ key: 'events',
+ content: (
+ gopal}
+ content={
+ // 'jdfngkjdfbgkjdfdfjb'
+
+ }
+ />
+ ),
+ },
+]
+
+const items = [
+ {
+ key: 'editorials',
+ content: (
+
+ ),
+ onClick: () => {
+ alert('hel')
+ },
+ },
+ {
+ key: 'review',
+ content: (
+
+
+ Show in channel
+
+ ),
+ },
+ {
+ key: 'events',
+ content: (
+ gopal}
+ content={
+ // 'jdfngkjdfbgkjdfdfjb'
+
+ }
+ />
+ ),
+ },
+ {
+ key: 'events',
+ content: (
+ gopal}
+ content={
+ // 'jdfngkjdfbgkjdfdfjb'
+
+ }
+ />
+ ),
+ },
+]
+
+const ContextualMenuExample = () => (
+
+
+ }
+ content={}
+ />
+
+)
+
+export default ContextualMenuExample
diff --git a/docs/src/examples/components/ContextualMenu/Types/index.tsx b/docs/src/examples/components/ContextualMenu/Types/index.tsx
new file mode 100644
index 0000000000..8f5550520a
--- /dev/null
+++ b/docs/src/examples/components/ContextualMenu/Types/index.tsx
@@ -0,0 +1,15 @@
+import React from 'react'
+import ComponentExample from 'docs/src/components/ComponentDoc/ComponentExample'
+import ExampleSection from 'docs/src/components/ComponentDoc/ExampleSection'
+
+const Types = () => (
+
+
+
+)
+
+export default Types
diff --git a/docs/src/examples/components/ContextualMenu/index.tsx b/docs/src/examples/components/ContextualMenu/index.tsx
new file mode 100644
index 0000000000..312112f9c6
--- /dev/null
+++ b/docs/src/examples/components/ContextualMenu/index.tsx
@@ -0,0 +1,10 @@
+import React from 'react'
+import Types from './Types'
+
+const ContextualMenuExamples = () => (
+
+
+
+)
+
+export default ContextualMenuExamples
diff --git a/src/components/ContextualMenu/ContextualMenu.tsx b/src/components/ContextualMenu/ContextualMenu.tsx
new file mode 100644
index 0000000000..565fed7a20
--- /dev/null
+++ b/src/components/ContextualMenu/ContextualMenu.tsx
@@ -0,0 +1,72 @@
+import * as PropTypes from 'prop-types'
+import * as React from 'react'
+import ReactNode = React.ReactNode
+import { UIComponent, childrenExist, customPropTypes, IRenderResultConfig } from '../../lib'
+import { ComponentVariablesInput, IComponentPartStylesInput } from '../../../types/theme'
+import { Extendable, ItemShorthand, ReactChildren } from '../../../types/utils'
+import Popup from '../Popup/Popup'
+import Button from '../Button'
+import Menu from '../Menu'
+
+export interface IContextualMenuProps {
+ as?: any
+ className?: string
+ children?: ReactChildren
+ content?: ItemShorthand | ItemShorthand[]
+ styles?: IComponentPartStylesInput
+ variables?: ComponentVariablesInput
+}
+
+/**
+ * A contextualMenu.
+ * @accessibility This is example usage of the accessibility tag.
+ * This should be replaced with the actual description after the PR is merged
+ */
+class ContextualMenu extends UIComponent, any> {
+ public static displayName = 'ContextualMenu'
+
+ public static className = 'ui-contextualMenu'
+
+ public static propTypes = {
+ /** An element type to render as (string or function). */
+ as: customPropTypes.as,
+
+ /** Primary content. */
+ children: PropTypes.node,
+
+ /** Additional classes. */
+ className: PropTypes.string,
+
+ /** Shorthand for primary content. */
+ content: customPropTypes.every([
+ customPropTypes.disallow(['children']),
+ PropTypes.oneOfType([
+ PropTypes.arrayOf(customPropTypes.itemShorthand),
+ customPropTypes.itemShorthand,
+ ]),
+ ]),
+
+ /** Custom styles to be applied for component. */
+ styles: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),
+
+ /** Custom variables to be applied for component. */
+ variables: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),
+ }
+
+ public static handledProps = ['as', 'children', 'className', 'content', 'styles', 'variables']
+
+ public static defaultProps = {
+ as: 'div',
+ }
+
+ public renderComponent({ ElementType, classes, rest }: IRenderResultConfig): ReactNode {
+ const { children, content } = this.props
+ return (
+
+ {childrenExist(children) ? children : content}
+
+ )
+ }
+}
+
+export default ContextualMenu
diff --git a/src/components/ContextualMenu/index.tsx b/src/components/ContextualMenu/index.tsx
new file mode 100644
index 0000000000..578b6138c9
--- /dev/null
+++ b/src/components/ContextualMenu/index.tsx
@@ -0,0 +1 @@
+export { default } from './ContextualMenu'
diff --git a/src/index.ts b/src/index.ts
index 28c50034b1..1ab0823da8 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -10,6 +10,7 @@ export { ButtonGroup } from './components/Button'
export { default as Chat } from './components/Chat'
export { ChatItem } from './components/Chat'
export { ChatMessage } from './components/Chat'
+export { default as ContextualMenu } from './components/ContextualMenu'
export { default as Divider } from './components/Divider'
export { default as Grid } from './components/Grid'
export { default as Header } from './components/Header'
diff --git a/src/themes/teams/componentStyles.ts b/src/themes/teams/componentStyles.ts
index b136c379f4..0796825004 100644
--- a/src/themes/teams/componentStyles.ts
+++ b/src/themes/teams/componentStyles.ts
@@ -13,6 +13,8 @@ export { default as Chat } from './components/Chat/chatStyles'
export { default as ChatItem } from './components/Chat/chatItemStyles'
export { default as ChatMessage } from './components/Chat/chatMessageStyles'
+export { default as ContextualMenu } from './components/ContextualMenu/contextualMenuStyles'
+
export { default as Divider } from './components/Divider/dividerStyles'
export { default as Header } from './components/Header/headerStyles'
diff --git a/src/themes/teams/componentVariables.ts b/src/themes/teams/componentVariables.ts
index df10e0a02a..f7b2cbb975 100644
--- a/src/themes/teams/componentVariables.ts
+++ b/src/themes/teams/componentVariables.ts
@@ -13,6 +13,8 @@ export { default as ChatItem } from './components/Chat/chatItemVariables'
export { default as ChatMessage } from './components/Chat/chatMessageVariables'
+export { default as ContextualMenu } from './components/ContextualMenu/contextualMenuVariables'
+
export { default as Divider } from './components/Divider/dividerVariables'
export { default as Grid } from './components/Grid/gridVariables'
diff --git a/src/themes/teams/components/ContextualMenu/ContextualMenuStyles.tsx b/src/themes/teams/components/ContextualMenu/ContextualMenuStyles.tsx
new file mode 100644
index 0000000000..ca5410703e
--- /dev/null
+++ b/src/themes/teams/components/ContextualMenu/ContextualMenuStyles.tsx
@@ -0,0 +1,22 @@
+import { IContextualMenuVariables } from './contextualMenuVariables'
+import { IComponentPartStylesInput, ICSSInJSStyle, IProps } from '../../../../../types/theme'
+
+const contextualMenuStyles: IComponentPartStylesInput = {
+ root: ({
+ props,
+ variables: { height, width, padding },
+ }: {
+ props: IProps
+ variables: IContextualMenuVariables
+ }): ICSSInJSStyle => {
+ const styles = {
+ height,
+ width,
+ padding,
+ }
+
+ return styles
+ },
+}
+
+export default contextualMenuStyles
diff --git a/src/themes/teams/components/ContextualMenu/ContextualMenuVariables.tsx b/src/themes/teams/components/ContextualMenu/ContextualMenuVariables.tsx
new file mode 100644
index 0000000000..97847b9e68
--- /dev/null
+++ b/src/themes/teams/components/ContextualMenu/ContextualMenuVariables.tsx
@@ -0,0 +1,15 @@
+export interface IContextualMenuVariables {
+ height: string
+ width: string
+ defaultColumnCount: number
+ contextualMenuGap?: string
+ padding?: string
+}
+
+export default (): IContextualMenuVariables => ({
+ height: '100%',
+ width: '100%',
+ defaultColumnCount: 5,
+ contextualMenuGap: undefined,
+ padding: undefined,
+})
diff --git a/src/themes/teams/components/Popup/popupContentVariables.ts b/src/themes/teams/components/Popup/popupContentVariables.ts
index a5724e0e17..0009a768ef 100644
--- a/src/themes/teams/components/Popup/popupContentVariables.ts
+++ b/src/themes/teams/components/Popup/popupContentVariables.ts
@@ -13,7 +13,7 @@ export default (siteVars: any): IPopupContentVariables => {
return {
backgroundColor: siteVars.white,
borderColor: siteVars.gray06,
- padding: `${pxToRem(10)} ${pxToRem(14)}`,
+ padding: `${pxToRem(0)} ${pxToRem(0)}`,
zIndex: 1000,
}
}
diff --git a/tslint.json b/tslint.json
index 435283d1f1..dde0b7be4f 100644
--- a/tslint.json
+++ b/tslint.json
@@ -4,7 +4,7 @@
"arrow-parens": false,
"align": [false],
"import-name": [false],
- "linebreak-style": [true, "LF"],
+ "linebreak-style": [false, "LF"],
"max-line-length": [false],
"no-increment-decrement": false,
"no-unused-variable": true,
From 93d2042e7c9d97d756bc84b6250e3b2f299ba10f Mon Sep 17 00:00:00 2001
From: Gopal Goel
Date: Fri, 21 Sep 2018 13:50:25 +0530
Subject: [PATCH 02/25] temp
---
.../Types/ContextualMenuExample.shorthand.tsx | 147 +++++-------------
.../Types/ContextualMenuExample.tsx | 114 --------------
.../ContextualMenu/ContextualMenu.tsx | 142 ++++++++++++++++-
.../ContextualMenu/ContextualMenuStyles.tsx | 5 +-
.../ContextualMenuVariables.tsx | 4 +-
5 files changed, 182 insertions(+), 230 deletions(-)
delete mode 100644 docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.tsx
diff --git a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
index ac3cdfadae..3cc1df755f 100644
--- a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
+++ b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
@@ -1,120 +1,45 @@
import React from 'react'
-import { ContextualMenu, Popup, Menu, Button, Avatar, Icon } from '@stardust-ui/react'
-
-const subb_items = [
- {
- key: 'editorials',
- content: 'Editorials',
- onClick: () => {
- alert('hel')
- },
- },
- { key: 'review', content: 'Reviews' },
- {
- key: 'events',
- content: (
- gopal} content={'jdfngkjdfbgkjdfdfjb'} />
- ),
- },
-]
-
-const menuItemStyle = {
- root: { padding: '0px', margin: '0px', minHeight: '50px', borderRadius: '0%' },
- anchor: { padding: '0px' },
-}
-
-const triggerStyle = {
- padding: '15px',
-}
-
-const sub_items = [
- {
- key: 'editorials',
- styles: { ...menuItemStyle, anchor: { padding: '15px' } },
- content: 'Editorials',
- onClick: () => {
- alert('hel')
- },
- },
- { key: 'review', styles: { ...menuItemStyle, anchor: { padding: '15px' } }, content: 'Reviews' },
- {
- key: 'events',
- styles: menuItemStyle,
- content: (
- Events}
- content={}
- />
- ),
- },
-]
+import { ContextualMenu } from '@stardust-ui/react'
const items = [
{
- key: 'editorials',
- styles: menuItemStyle,
- content: (
-
- ),
- onClick: () => {
- alert('hel')
- },
- },
- {
- key: 'review',
- icon: 'search',
- content: 'Search in channel',
- styles: { ...menuItemStyle, anchor: { padding: '15px' } },
- },
- {
- key: 'events',
- styles: menuItemStyle,
- content: (
- Submenu 1}
- content={}
- />
- ),
- },
- {
- key: 'events',
- styles: menuItemStyle,
- content: (
- Submenu 2}
- content={}
- />
- ),
+ key: 'personDescription',
+ content: Gopal Goel
,
+ },
+ {
+ key: 'menuItem1',
+ content: 'Show in channel',
+ },
+ {
+ key: 'menuItem2',
+ content: 'Submenu 1',
+ submenuItems: [
+ {
+ key: 'subItem0',
+ content: 'Subitem 0',
+ },
+ {
+ key: 'subItem1',
+ content: 'Subitem 1',
+ },
+ ],
+ },
+ {
+ key: 'menuItem3',
+ content: 'Submenu 2',
+ submenuItems: [
+ {
+ key: 'subItem0',
+ content: 'Subitem 0',
+ },
+ {
+ key: 'subItem1',
+ content: 'Subitem 1',
+ },
+ ],
},
]
-const ContextualMenuExample = () => (
-
- }
- content={}
- />
- }
- />
-)
+const ContextualMenuExample = () =>
export default ContextualMenuExample
diff --git a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.tsx b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.tsx
deleted file mode 100644
index 96f2d22153..0000000000
--- a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.tsx
+++ /dev/null
@@ -1,114 +0,0 @@
-import React from 'react'
-import { ContextualMenu, Popup, Menu, Button, Avatar, Icon } from '@stardust-ui/react'
-
-const subb_items = [
- {
- key: 'editorials',
- content: 'Editorials',
- onClick: () => {
- alert('hel')
- },
- },
- { key: 'review', content: 'Reviews' },
- {
- key: 'events',
- content: (
- gopal} content={'jdfngkjdfbgkjdfdfjb'} />
- ),
- },
-]
-
-const sub_items = [
- {
- key: 'editorials',
- content: 'Editorials',
- onClick: () => {
- alert('hel')
- },
- },
- { key: 'review', content: 'Reviews' },
- {
- key: 'events',
- content: (
- gopal}
- content={
- // 'jdfngkjdfbgkjdfdfjb'
-
- }
- />
- ),
- },
-]
-
-const items = [
- {
- key: 'editorials',
- content: (
-
- ),
- onClick: () => {
- alert('hel')
- },
- },
- {
- key: 'review',
- content: (
-
-
- Show in channel
-
- ),
- },
- {
- key: 'events',
- content: (
- gopal}
- content={
- // 'jdfngkjdfbgkjdfdfjb'
-
- }
- />
- ),
- },
- {
- key: 'events',
- content: (
- gopal}
- content={
- // 'jdfngkjdfbgkjdfdfjb'
-
- }
- />
- ),
- },
-]
-
-const ContextualMenuExample = () => (
-
-
- }
- content={}
- />
-
-)
-
-export default ContextualMenuExample
diff --git a/src/components/ContextualMenu/ContextualMenu.tsx b/src/components/ContextualMenu/ContextualMenu.tsx
index 565fed7a20..119db5008a 100644
--- a/src/components/ContextualMenu/ContextualMenu.tsx
+++ b/src/components/ContextualMenu/ContextualMenu.tsx
@@ -7,6 +7,7 @@ import { Extendable, ItemShorthand, ReactChildren } from '../../../types/utils'
import Popup from '../Popup/Popup'
import Button from '../Button'
import Menu from '../Menu'
+import { Avatar, Icon } from '@stardust-ui/react'
export interface IContextualMenuProps {
as?: any
@@ -59,11 +60,150 @@ class ContextualMenu extends UIComponent, any>
as: 'div',
}
+ public renderItems = items => {
+ const menuItemStyle = {
+ root: { padding: '0px', margin: '0px', minHeight: '50px', borderRadius: '0%' },
+ anchor: { padding: '0px' },
+ }
+ const triggerStyle = {
+ padding: '15px',
+ }
+ return items.map(item => {
+ item.styles = menuItemStyle
+ })
+ }
+
public renderComponent({ ElementType, classes, rest }: IRenderResultConfig): ReactNode {
const { children, content } = this.props
+ const menuItemStyle = {
+ root: { padding: '0px', margin: '0px', borderRadius: '0%' },
+ anchor: { padding: '0px', minHeight: '50px' },
+ }
+ const triggerStyle = {
+ padding: '15px',
+ }
+ const sub_sub_items = [
+ {
+ key: 'editorials',
+ styles: { ...menuItemStyle, anchor: { padding: '15px', minHeight: '50px' } },
+ content: 'Editorials',
+ },
+ {
+ key: 'review',
+ styles: { ...menuItemStyle, anchor: { padding: '15px' } },
+ content: 'Reviews',
+ onClick: () => {
+ alert('hel')
+ },
+ },
+ {
+ key: 'events',
+ styles: menuItemStyle,
+ content: (
+ Events}
+ content={'goapl'}
+ />
+ ),
+ },
+ ]
+ const sub_items = [
+ {
+ key: 'editorials',
+ styles: { ...menuItemStyle, anchor: { padding: '15px', minHeight: '50px' } },
+ content: 'Editorials',
+ },
+ {
+ key: 'review',
+ styles: { ...menuItemStyle, anchor: { padding: '15px' } },
+ content: 'Reviews',
+ onClick: () => {
+ alert('hel')
+ },
+ },
+ {
+ key: 'events',
+ styles: menuItemStyle,
+ content: (
+ Events}
+ content={
+
+ }
+ />
+ ),
+ },
+ ]
+ const items = [
+ {
+ key: 'editorials',
+ styles: menuItemStyle,
+ content: (
+
+ ),
+ },
+ {
+ key: 'review',
+ icon: 'search',
+ content: 'Click for callback',
+ styles: { ...menuItemStyle, anchor: { padding: '15px' } },
+ onClick: () => {
+ alert('Callback clicked...')
+ },
+ },
+ {
+ key: 'events',
+ styles: menuItemStyle,
+ content: (
+ Submenu 1}
+ content={
+
+ }
+ />
+ ),
+ },
+ {
+ key: 'events',
+ styles: menuItemStyle,
+ content: (
+ Submenu 2}
+ content={
+
+ }
+ />
+ ),
+ },
+ ]
return (
- {childrenExist(children) ? children : content}
+ {/* {childrenExist(children) ? children : content} */}
+ {/*
+ }
+ content={}
+ /> */}
+
)
}
diff --git a/src/themes/teams/components/ContextualMenu/ContextualMenuStyles.tsx b/src/themes/teams/components/ContextualMenu/ContextualMenuStyles.tsx
index ca5410703e..0ca6a238eb 100644
--- a/src/themes/teams/components/ContextualMenu/ContextualMenuStyles.tsx
+++ b/src/themes/teams/components/ContextualMenu/ContextualMenuStyles.tsx
@@ -4,15 +4,16 @@ import { IComponentPartStylesInput, ICSSInJSStyle, IProps } from '../../../../..
const contextualMenuStyles: IComponentPartStylesInput = {
root: ({
props,
- variables: { height, width, padding },
+ variables: { height, maxWidth, padding },
}: {
props: IProps
variables: IContextualMenuVariables
}): ICSSInJSStyle => {
const styles = {
height,
- width,
+ maxWidth,
padding,
+ border: '1px solid #eeeeee',
}
return styles
diff --git a/src/themes/teams/components/ContextualMenu/ContextualMenuVariables.tsx b/src/themes/teams/components/ContextualMenu/ContextualMenuVariables.tsx
index 97847b9e68..f2de04d9f4 100644
--- a/src/themes/teams/components/ContextualMenu/ContextualMenuVariables.tsx
+++ b/src/themes/teams/components/ContextualMenu/ContextualMenuVariables.tsx
@@ -1,6 +1,6 @@
export interface IContextualMenuVariables {
height: string
- width: string
+ maxWidth: string
defaultColumnCount: number
contextualMenuGap?: string
padding?: string
@@ -8,7 +8,7 @@ export interface IContextualMenuVariables {
export default (): IContextualMenuVariables => ({
height: '100%',
- width: '100%',
+ maxWidth: '200px',
defaultColumnCount: 5,
contextualMenuGap: undefined,
padding: undefined,
From e9db6e346757b081e5444bd48d84a2120c535486 Mon Sep 17 00:00:00 2001
From: Gopal Goel
Date: Mon, 24 Sep 2018 11:37:45 +0530
Subject: [PATCH 03/25] Render menu from the menutree passed as a prop
---
.../Types/ContextualMenuExample.shorthand.tsx | 30 +-
.../ContextualMenu/ContextualMenu.tsx | 278 ++++++++++--------
2 files changed, 182 insertions(+), 126 deletions(-)
diff --git a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
index 3cc1df755f..e81ecc8710 100644
--- a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
+++ b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
@@ -1,13 +1,14 @@
import React from 'react'
-import { ContextualMenu } from '@stardust-ui/react'
+import { ContextualMenu, Avatar } from '@stardust-ui/react'
-const items = [
+const menuTree = [
{
- key: 'personDescription',
- content: Gopal Goel
,
+ key: 'menuItem1',
+ icon: 'search',
+ content: 'Show in channel',
},
{
- key: 'menuItem1',
+ key: 'menuItem5',
content: 'Show in channel',
},
{
@@ -17,6 +18,16 @@ const items = [
{
key: 'subItem0',
content: 'Subitem 0',
+ submenuItems: [
+ {
+ key: 'subItem0',
+ content: 'Subitem 0',
+ },
+ {
+ key: 'subItem1',
+ content: 'Subitem 1',
+ },
+ ],
},
{
key: 'subItem1',
@@ -40,6 +51,13 @@ const items = [
},
]
-const ContextualMenuExample = () =>
+const personDescription = {
+ imageUrl: 'public/images/avatar/small/matt.jpg',
+ description: 'Gopal Goel',
+}
+
+const ContextualMenuExample = () => (
+
+)
export default ContextualMenuExample
diff --git a/src/components/ContextualMenu/ContextualMenu.tsx b/src/components/ContextualMenu/ContextualMenu.tsx
index 119db5008a..7500f449f2 100644
--- a/src/components/ContextualMenu/ContextualMenu.tsx
+++ b/src/components/ContextualMenu/ContextualMenu.tsx
@@ -6,8 +6,8 @@ import { ComponentVariablesInput, IComponentPartStylesInput } from '../../../typ
import { Extendable, ItemShorthand, ReactChildren } from '../../../types/utils'
import Popup from '../Popup/Popup'
import Button from '../Button'
-import Menu from '../Menu'
-import { Avatar, Icon } from '@stardust-ui/react'
+import Menu, { MenuItem } from '../Menu'
+import Avatar from '../Avatar'
export interface IContextualMenuProps {
as?: any
@@ -18,6 +18,14 @@ export interface IContextualMenuProps {
variables?: ComponentVariablesInput
}
+const menuItemStyle = {
+ root: { padding: '0px', margin: '0px', borderRadius: '0%' },
+ anchor: { padding: '0px', minHeight: '50px' },
+}
+const triggerStyle = {
+ padding: '15px',
+}
+
/**
* A contextualMenu.
* @accessibility This is example usage of the accessibility tag.
@@ -52,6 +60,8 @@ class ContextualMenu extends UIComponent, any>
/** Custom variables to be applied for component. */
variables: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),
+
+ calllback: PropTypes.func,
}
public static handledProps = ['as', 'children', 'className', 'content', 'styles', 'variables']
@@ -60,133 +70,159 @@ class ContextualMenu extends UIComponent, any>
as: 'div',
}
- public renderItems = items => {
- const menuItemStyle = {
- root: { padding: '0px', margin: '0px', minHeight: '50px', borderRadius: '0%' },
- anchor: { padding: '0px' },
- }
- const triggerStyle = {
- padding: '15px',
+ public renderMenuPersonDetail = personDescription => {
+ const { iconOnly, pills, pointing, type, underlined, vertical } = this.props
+ const item = {
+ key: 'personDescription',
+ styles: menuItemStyle,
+ content: (
+
+
+
{personDescription.description}
+
+ ),
}
- return items.map(item => {
- item.styles = menuItemStyle
+ const index = 4
+ return MenuItem.create(item, {
+ defaultProps: {
+ iconOnly,
+ pills,
+ pointing,
+ type,
+ underlined,
+ vertical,
+ index,
+ },
+ // overrideProps: this.handleItemOverrides,
})
}
- public renderComponent({ ElementType, classes, rest }: IRenderResultConfig): ReactNode {
- const { children, content } = this.props
- const menuItemStyle = {
- root: { padding: '0px', margin: '0px', borderRadius: '0%' },
- anchor: { padding: '0px', minHeight: '50px' },
- }
- const triggerStyle = {
- padding: '15px',
- }
- const sub_sub_items = [
- {
- key: 'editorials',
- styles: { ...menuItemStyle, anchor: { padding: '15px', minHeight: '50px' } },
- content: 'Editorials',
- },
- {
- key: 'review',
- styles: { ...menuItemStyle, anchor: { padding: '15px' } },
- content: 'Reviews',
- onClick: () => {
- alert('hel')
- },
- },
- {
- key: 'events',
- styles: menuItemStyle,
- content: (
- Events}
- content={'goapl'}
- />
- ),
- },
- ]
- const sub_items = [
- {
- key: 'editorials',
- styles: { ...menuItemStyle, anchor: { padding: '15px', minHeight: '50px' } },
- content: 'Editorials',
- },
- {
- key: 'review',
- styles: { ...menuItemStyle, anchor: { padding: '15px' } },
- content: 'Reviews',
- onClick: () => {
- alert('hel')
- },
- },
- {
- key: 'events',
- styles: menuItemStyle,
- content: (
- Events}
- content={
-
- }
- />
- ),
- },
- ]
- const items = [
- {
- key: 'editorials',
- styles: menuItemStyle,
- content: (
-
- ),
- },
- {
- key: 'review',
- icon: 'search',
- content: 'Click for callback',
- styles: { ...menuItemStyle, anchor: { padding: '15px' } },
- onClick: () => {
- alert('Callback clicked...')
- },
- },
- {
- key: 'events',
- styles: menuItemStyle,
- content: (
+ public processTree = menuTree => {
+ const newMenuTree = []
+ menuTree.forEach(item => {
+ // if (item.submenuItems === undefined) {
+ // item.styles = { ...menuItemStyle, anchor: { padding: '15px' } }
+ // }
+ if (item.submenuItems !== undefined) {
+ const submenutree = this.processTree(item.submenuItems)
+ const content = item.content
+ item.content = (
Submenu 1}
+ trigger={{content}
}
content={
-
+
}
/>
- ),
- },
- {
- key: 'events',
- styles: menuItemStyle,
- content: (
- Submenu 2}
- content={
-
- }
- />
- ),
- },
- ]
+ )
+ item.submenuItems = undefined
+ item.styles = menuItemStyle
+ }
+ newMenuTree.push(item)
+ })
+ return newMenuTree
+ }
+
+ public renderMenuTree = menuTree => {
+ const newMt = this.processTree(menuTree)
+ return
+ }
+
+ public renderComponent({ ElementType, classes, rest }: IRenderResultConfig): ReactNode {
+ const { children, content, menutree, persondescription } = this.props
+ const calllback = () => {
+ alert('Callback clicked')
+ }
+ // const sub_sub_items = [
+ // {
+ // key: 'editorials',
+ // styles: { ...menuItemStyle, anchor: { padding: '15px', minHeight: '50px' } },
+ // content: 'Editorials',
+ // },
+ // {
+ // key: 'review',
+ // styles: { ...menuItemStyle, anchor: { padding: '15px' } },
+ // content: 'Reviews',
+ // onClick: calllback,
+ // },
+ // {
+ // key: 'events',
+ // styles: menuItemStyle,
+ // content: (
+ // Events}
+ // content={'goapl'}
+ // />
+ // ),
+ // },
+ // ]
+ // const sub_items = [
+ // {
+ // key: 'editorials',
+ // styles: { ...menuItemStyle, anchor: { padding: '15px', minHeight: '50px' } },
+ // content: 'Editorials',
+ // },
+ // {
+ // key: 'review',
+ // styles: { ...menuItemStyle, anchor: { padding: '15px' } },
+ // content: 'Reviews',
+ // onClick: calllback,
+ // },
+ // {
+ // key: 'events',
+ // styles: menuItemStyle,
+ // content: (
+ // Events}
+ // content={
+ //
+ // }
+ // />
+ // ),
+ // },
+ // ]
+ // const items = [
+ // {
+ // key: 'review',
+ // icon: 'plus',
+ // content: 'Click for callback',
+ // styles: { ...menuItemStyle, anchor: { padding: '15px' } },
+ // onClick: calllback,
+ // },
+ // {
+ // key: 'events',
+ // styles: menuItemStyle,
+ // content: (
+ // Submenu 1}
+ // content={
+ //
+ // }
+ // />
+ // ),
+ // },
+ // {
+ // key: 'eventgs',
+ // styles: menuItemStyle,
+ // content: (
+ // Submenu 2}
+ // content={
+ //
+ // }
+ // />
+ // ),
+ // },
+ // ]
return (
{/* {childrenExist(children) ? children : content} */}
@@ -203,7 +239,9 @@ class ContextualMenu extends UIComponent, any>
}
content={}
/> */}
-
+ {this.renderMenuPersonDetail(persondescription)}
+ {this.renderMenuTree(menutree)}
+ {/* */}
)
}
From d6f2b8f7a8d254354a12ced65799aba22788c9f4 Mon Sep 17 00:00:00 2001
From: Gopal Goel
Date: Mon, 24 Sep 2018 14:55:37 +0530
Subject: [PATCH 04/25] Render menu from the menutree passed as a prop
---
.../Types/ContextualMenuExample.shorthand.tsx | 30 ++--
.../ContextualMenu/ContextualMenu.tsx | 148 +++---------------
2 files changed, 39 insertions(+), 139 deletions(-)
diff --git a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
index e81ecc8710..2c3f9bf683 100644
--- a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
+++ b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
@@ -3,49 +3,49 @@ import { ContextualMenu, Avatar } from '@stardust-ui/react'
const menuTree = [
{
- key: 'menuItem1',
+ key: 'menuItem0',
icon: 'search',
- content: 'Show in channel',
+ title: 'Show in channel',
},
{
- key: 'menuItem5',
- content: 'Show in channel',
+ key: 'menuItem1',
+ title: 'Show in channel',
},
{
key: 'menuItem2',
- content: 'Submenu 1',
- submenuItems: [
+ title: 'Submenu 1',
+ submenuitems: [
{
key: 'subItem0',
- content: 'Subitem 0',
- submenuItems: [
+ title: 'Subitem 0',
+ submenuitems: [
{
key: 'subItem0',
- content: 'Subitem 0',
+ title: 'Subitem 0',
},
{
key: 'subItem1',
- content: 'Subitem 1',
+ title: 'Subitem 1',
},
],
},
{
key: 'subItem1',
- content: 'Subitem 1',
+ title: 'Subitem 1',
},
],
},
{
key: 'menuItem3',
- content: 'Submenu 2',
- submenuItems: [
+ title: 'Submenu 2',
+ submenuitems: [
{
key: 'subItem0',
- content: 'Subitem 0',
+ title: 'Subitem 0',
},
{
key: 'subItem1',
- content: 'Subitem 1',
+ title: 'Subitem 1',
},
],
},
diff --git a/src/components/ContextualMenu/ContextualMenu.tsx b/src/components/ContextualMenu/ContextualMenu.tsx
index 7500f449f2..460211e59a 100644
--- a/src/components/ContextualMenu/ContextualMenu.tsx
+++ b/src/components/ContextualMenu/ContextualMenu.tsx
@@ -98,150 +98,50 @@ class ContextualMenu extends UIComponent, any>
}
public processTree = menuTree => {
- const newMenuTree = []
menuTree.forEach(item => {
- // if (item.submenuItems === undefined) {
- // item.styles = { ...menuItemStyle, anchor: { padding: '15px' } }
- // }
- if (item.submenuItems !== undefined) {
- const submenutree = this.processTree(item.submenuItems)
- const content = item.content
+ if (item.submenuitems === undefined) {
+ item.content = item.title
+ item.styles = { ...menuItemStyle, anchor: { padding: '15px', minHeight: '50px' } }
+ item.onClick = () => {
+ alert('callback')
+ }
+ }
+ if (item.submenuitems !== undefined) {
+ this.processTree(item.submenuitems)
+ console.log('one')
item.content = (
{content}}
+ trigger={{item.title}
}
content={
-
+
}
/>
)
- item.submenuItems = undefined
- item.styles = menuItemStyle
+ item.styles = { ...menuItemStyle }
}
- newMenuTree.push(item)
})
- return newMenuTree
}
- public renderMenuTree = menuTree => {
- const newMt = this.processTree(menuTree)
- return
+ public renderMenuTree = menutree => {
+ this.processTree(menutree)
+ return
}
public renderComponent({ ElementType, classes, rest }: IRenderResultConfig): ReactNode {
- const { children, content, menutree, persondescription } = this.props
- const calllback = () => {
- alert('Callback clicked')
- }
- // const sub_sub_items = [
- // {
- // key: 'editorials',
- // styles: { ...menuItemStyle, anchor: { padding: '15px', minHeight: '50px' } },
- // content: 'Editorials',
- // },
- // {
- // key: 'review',
- // styles: { ...menuItemStyle, anchor: { padding: '15px' } },
- // content: 'Reviews',
- // onClick: calllback,
- // },
- // {
- // key: 'events',
- // styles: menuItemStyle,
- // content: (
- // Events}
- // content={'goapl'}
- // />
- // ),
- // },
- // ]
- // const sub_items = [
- // {
- // key: 'editorials',
- // styles: { ...menuItemStyle, anchor: { padding: '15px', minHeight: '50px' } },
- // content: 'Editorials',
- // },
- // {
- // key: 'review',
- // styles: { ...menuItemStyle, anchor: { padding: '15px' } },
- // content: 'Reviews',
- // onClick: calllback,
- // },
- // {
- // key: 'events',
- // styles: menuItemStyle,
- // content: (
- // Events}
- // content={
- //
- // }
- // />
- // ),
- // },
- // ]
- // const items = [
- // {
- // key: 'review',
- // icon: 'plus',
- // content: 'Click for callback',
- // styles: { ...menuItemStyle, anchor: { padding: '15px' } },
- // onClick: calllback,
- // },
- // {
- // key: 'events',
- // styles: menuItemStyle,
- // content: (
- // Submenu 1}
- // content={
- //
- // }
- // />
- // ),
- // },
- // {
- // key: 'eventgs',
- // styles: menuItemStyle,
- // content: (
- // Submenu 2}
- // content={
- //
- // }
- // />
- // ),
- // },
- // ]
+ const { menutree, persondescription } = this.props
+ // console.log(menutree)
return (
- {/* {childrenExist(children) ? children : content} */}
- {/*
- }
- content={}
- /> */}
{this.renderMenuPersonDetail(persondescription)}
{this.renderMenuTree(menutree)}
- {/* */}
)
}
From c85fd0d74e551186e19a616d5e8c370fbea8e7fc Mon Sep 17 00:00:00 2001
From: Gopal Goel
Date: Mon, 24 Sep 2018 15:21:25 +0530
Subject: [PATCH 05/25] Add callback prop
---
.../Types/ContextualMenuExample.shorthand.tsx | 6 ++-
.../ContextualMenu/ContextualMenu.tsx | 38 +++++++++++++------
2 files changed, 31 insertions(+), 13 deletions(-)
diff --git a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
index 2c3f9bf683..5cf7955687 100644
--- a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
+++ b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
@@ -56,8 +56,12 @@ const personDescription = {
description: 'Gopal Goel',
}
+const callback = () => {
+ alert('Callback invoked')
+}
+
const ContextualMenuExample = () => (
-
+
)
export default ContextualMenuExample
diff --git a/src/components/ContextualMenu/ContextualMenu.tsx b/src/components/ContextualMenu/ContextualMenu.tsx
index 460211e59a..31a32d2d83 100644
--- a/src/components/ContextualMenu/ContextualMenu.tsx
+++ b/src/components/ContextualMenu/ContextualMenu.tsx
@@ -40,6 +40,9 @@ class ContextualMenu extends UIComponent, any>
/** An element type to render as (string or function). */
as: customPropTypes.as,
+ /** Function passed which needs to be invoked when menuitem has no submenu */
+ callback: PropTypes.func,
+
/** Primary content. */
children: PropTypes.node,
@@ -55,16 +58,29 @@ class ContextualMenu extends UIComponent, any>
]),
]),
+ /** The tree of menu containing submenus and it's submenus and so on. */
+ menutree: PropTypes.arrayOf(PropTypes.object),
+
+ /** An object containing imageUrl and the descrioption of the person*/
+ persondescription: PropTypes.object,
+
/** Custom styles to be applied for component. */
styles: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),
/** Custom variables to be applied for component. */
variables: PropTypes.oneOfType([PropTypes.object, PropTypes.func]),
-
- calllback: PropTypes.func,
}
- public static handledProps = ['as', 'children', 'className', 'content', 'styles', 'variables']
+ public static handledProps = [
+ 'as',
+ 'children',
+ 'className',
+ 'content',
+ 'menutree',
+ 'persondescription',
+ 'styles',
+ 'variables',
+ ]
public static defaultProps = {
as: 'div',
@@ -97,17 +113,15 @@ class ContextualMenu extends UIComponent, any>
})
}
- public processTree = menuTree => {
+ public processTree = (menuTree, callback) => {
menuTree.forEach(item => {
if (item.submenuitems === undefined) {
item.content = item.title
item.styles = { ...menuItemStyle, anchor: { padding: '15px', minHeight: '50px' } }
- item.onClick = () => {
- alert('callback')
- }
+ item.onClick = callback
}
if (item.submenuitems !== undefined) {
- this.processTree(item.submenuitems)
+ this.processTree(item.submenuitems, callback)
console.log('one')
item.content = (
, any>
})
}
- public renderMenuTree = menutree => {
- this.processTree(menutree)
+ public renderMenuTree = (menutree, callback) => {
+ this.processTree(menutree, callback)
return
}
public renderComponent({ ElementType, classes, rest }: IRenderResultConfig): ReactNode {
- const { menutree, persondescription } = this.props
+ const { menutree, persondescription, callback } = this.props
// console.log(menutree)
return (
{this.renderMenuPersonDetail(persondescription)}
- {this.renderMenuTree(menutree)}
+ {this.renderMenuTree(menutree, callback)}
)
}
From c9115dbf06acce17dfe54866eec0aba71083cd51 Mon Sep 17 00:00:00 2001
From: Gopal Goel
Date: Mon, 24 Sep 2018 15:58:47 +0530
Subject: [PATCH 06/25] Make code work even if no props are passed
---
src/components/ContextualMenu/ContextualMenu.tsx | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/components/ContextualMenu/ContextualMenu.tsx b/src/components/ContextualMenu/ContextualMenu.tsx
index 31a32d2d83..02f4307ad7 100644
--- a/src/components/ContextualMenu/ContextualMenu.tsx
+++ b/src/components/ContextualMenu/ContextualMenu.tsx
@@ -87,6 +87,9 @@ class ContextualMenu extends UIComponent, any>
}
public renderMenuPersonDetail = personDescription => {
+ if (personDescription === undefined) {
+ return undefined
+ }
const { iconOnly, pills, pointing, type, underlined, vertical } = this.props
const item = {
key: 'personDescription',
@@ -145,6 +148,9 @@ class ContextualMenu extends UIComponent, any>
}
public renderMenuTree = (menutree, callback) => {
+ if (menutree === undefined) {
+ return undefined
+ }
this.processTree(menutree, callback)
return
}
From faa7a1476b82a7bc7c0f8fcf7fe054087787ba8d Mon Sep 17 00:00:00 2001
From: Gopal Goel
Date: Tue, 25 Sep 2018 10:41:24 +0530
Subject: [PATCH 07/25] Fix the breaking code introduced by pull 238
---
.../Types/ContextualMenuExample.shorthand.tsx | 23 +++++-----
.../ContextualMenu/ContextualMenu.tsx | 43 +++++++++++++------
.../ContextualMenu/ContextualMenuStyles.tsx | 16 +++----
.../ContextualMenuVariables.tsx | 10 ++---
4 files changed, 53 insertions(+), 39 deletions(-)
diff --git a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
index 5cf7955687..bf8e90402d 100644
--- a/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
+++ b/docs/src/examples/components/ContextualMenu/Types/ContextualMenuExample.shorthand.tsx
@@ -4,55 +4,54 @@ import { ContextualMenu, Avatar } from '@stardust-ui/react'
const menuTree = [
{
key: 'menuItem0',
- icon: 'search',
- title: 'Show in channel',
+ title: 'Click for callback',
},
{
key: 'menuItem1',
- title: 'Show in channel',
+ title: 'Click for callback',
},
{
key: 'menuItem2',
- title: 'Submenu 1',
+ title: 'Open Submenu 1',
submenuitems: [
{
key: 'subItem0',
- title: 'Subitem 0',
+ title: 'Open Submenu 1.1',
submenuitems: [
{
key: 'subItem0',
- title: 'Subitem 0',
+ title: 'Click for callback',
},
{
key: 'subItem1',
- title: 'Subitem 1',
+ title: 'Click for callback',
},
],
},
{
key: 'subItem1',
- title: 'Subitem 1',
+ title: 'Click for callback',
},
],
},
{
key: 'menuItem3',
- title: 'Submenu 2',
+ title: 'Open Submenu 2',
submenuitems: [
{
key: 'subItem0',
- title: 'Subitem 0',
+ title: 'Click for callback',
},
{
key: 'subItem1',
- title: 'Subitem 1',
+ title: 'Click for callback',
},
],
},
]
const personDescription = {
- imageUrl: 'public/images/avatar/small/matt.jpg',
+ imageUrl: 'public/images/avatar/small/elliot.jpg',
description: 'Gopal Goel',
}
diff --git a/src/components/ContextualMenu/ContextualMenu.tsx b/src/components/ContextualMenu/ContextualMenu.tsx
index 02f4307ad7..e5a12837da 100644
--- a/src/components/ContextualMenu/ContextualMenu.tsx
+++ b/src/components/ContextualMenu/ContextualMenu.tsx
@@ -2,24 +2,25 @@ import * as PropTypes from 'prop-types'
import * as React from 'react'
import ReactNode = React.ReactNode
import { UIComponent, childrenExist, customPropTypes, IRenderResultConfig } from '../../lib'
-import { ComponentVariablesInput, IComponentPartStylesInput } from '../../../types/theme'
+import { ComponentVariablesInput, ComponentPartStyle } from '../../../types/theme'
import { Extendable, ItemShorthand, ReactChildren } from '../../../types/utils'
import Popup from '../Popup/Popup'
import Button from '../Button'
import Menu, { MenuItem } from '../Menu'
import Avatar from '../Avatar'
+import Provider from '../Provider'
export interface IContextualMenuProps {
as?: any
className?: string
children?: ReactChildren
content?: ItemShorthand | ItemShorthand[]
- styles?: IComponentPartStylesInput
+ styles?: ComponentPartStyle
variables?: ComponentVariablesInput
}
const menuItemStyle = {
- root: { padding: '0px', margin: '0px', borderRadius: '0%' },
+ root: { padding: '0px', marginBottom: '0px', borderRadius: '0%' },
anchor: { padding: '0px', minHeight: '50px' },
}
const triggerStyle = {
@@ -93,10 +94,9 @@ class ContextualMenu extends UIComponent, any>
const { iconOnly, pills, pointing, type, underlined, vertical } = this.props
const item = {
key: 'personDescription',
- styles: menuItemStyle,
content: (
-
-
+
+
{personDescription.description}
),
@@ -119,18 +119,16 @@ class ContextualMenu extends UIComponent
, any>
public processTree = (menuTree, callback) => {
menuTree.forEach(item => {
if (item.submenuitems === undefined) {
- item.content = item.title
- item.styles = { ...menuItemStyle, anchor: { padding: '15px', minHeight: '50px' } }
+ item.content = {item.title}
item.onClick = callback
}
if (item.submenuitems !== undefined) {
this.processTree(item.submenuitems, callback)
- console.log('one')
item.content = (
{item.title} }
+ trigger={{item.title}
}
content={
)
- // return
}
+ itemProps.onClick = onItemClick
return ListItem.create(item, { defaultProps: itemProps })
})
return {children}
}
-
- // processItems = () => {
- // const { items } = this.props
- // if (items !== undefined) {
- // items.map(item => {
- // if (item.menu) {
- // item.onClick = () => {
- // this.handleClick(item)
- // }
- // // item.content =
- // }
- // })
- // }
- // }
-
- // handleClick = item => {
- // this.setState(prevState => {
- // if (prevState.subMenuOpen === false || prevState.menuItemKey !== item.menu.items) {
- // return {
- // subMenuOpen: true,
- // menuItemKey: item.menu.items,
- // }
- // }
- // return {
- // subMenuOpen: !prevState.subMenuOpen,
- // menuItemKey: item.menu.items,
- // }
- // })
- // }
}
export default ContextMenu
diff --git a/src/components/ContextMenu/PopupWithSubmenu.tsx b/src/components/ContextMenu/PopupWithSubmenu.tsx
deleted file mode 100644
index cdb023576e..0000000000
--- a/src/components/ContextMenu/PopupWithSubmenu.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import * as React from 'react'
-import * as _ from 'lodash'
-import Popup from '../Popup/Popup'
-import ContextMenu from '../ContextMenu'
-import List, { ListItem } from '../List'
-
-export class PopupWithSubmenu extends React.Component {
- state = { popupOpen: false }
- togglePopupState = () => {
- this.setState(prev => ({ popupOpen: !prev.popupOpen }))
- }
- render = () => {
- const { item, items, onItemClick } = this.props
- const itemProps = _.pick(this.props, List.itemProps)
- itemProps.onClick = this.togglePopupState
- item.selection = true
- return (
- }
- />
- )
- }
-}
diff --git a/src/themes/teams/components/ContextMenu/ContextMenuStyles.tsx b/src/themes/teams/components/ContextMenu/ContextMenuStyles.tsx
index 2ff63a55b8..207c5b6793 100644
--- a/src/themes/teams/components/ContextMenu/ContextMenuStyles.tsx
+++ b/src/themes/teams/components/ContextMenu/ContextMenuStyles.tsx
@@ -2,8 +2,9 @@ import { IContextMenuVariables } from './ContextMenuVariables'
import { IComponentPartStylesInput, ICSSInJSStyle } from '../../../../../types/theme'
import { IContextMenuProps } from '../../../../components/ContextMenu/ContextMenu'
-const contextualMenuStyles: IComponentPartStylesInput = {
- root: ({ props, variables: { height, width, padding, border } }): ICSSInJSStyle => {
+const contextMenuStyles: IComponentPartStylesInput = {
+ root: ({ variables }): ICSSInJSStyle => {
+ const { height, width, padding, border } = variables
const styles = {
height,
width,
@@ -15,4 +16,4 @@ const contextualMenuStyles: IComponentPartStylesInput {
return {
backgroundColor: siteVars.white,
borderColor: siteVars.gray06,
- padding: `${pxToRem(0)} ${pxToRem(0)}`,
+ padding: `${pxToRem(10)} ${pxToRem(14)}`,
zIndex: 1000,
}
}
diff --git a/tslint.json b/tslint.json
index dde0b7be4f..435283d1f1 100644
--- a/tslint.json
+++ b/tslint.json
@@ -4,7 +4,7 @@
"arrow-parens": false,
"align": [false],
"import-name": [false],
- "linebreak-style": [false, "LF"],
+ "linebreak-style": [true, "LF"],
"max-line-length": [false],
"no-increment-decrement": false,
"no-unused-variable": true,
From 4322aa4052708326eb9c8711aadc13f63afd6ae2 Mon Sep 17 00:00:00 2001
From: Gopal Goel
Date: Tue, 9 Oct 2018 15:11:50 +0530
Subject: [PATCH 21/25] Rename ContextMenuVariables.tsx to
contextMenuVariables.tsx
---
.../{ContextMenuVariables.tsx => contextMenuVariables.tsx} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename src/themes/teams/components/ContextMenu/{ContextMenuVariables.tsx => contextMenuVariables.tsx} (100%)
diff --git a/src/themes/teams/components/ContextMenu/ContextMenuVariables.tsx b/src/themes/teams/components/ContextMenu/contextMenuVariables.tsx
similarity index 100%
rename from src/themes/teams/components/ContextMenu/ContextMenuVariables.tsx
rename to src/themes/teams/components/ContextMenu/contextMenuVariables.tsx
From 69b0027f6224618226be020277ac003ef4f43846 Mon Sep 17 00:00:00 2001
From: Gopal Goel
Date: Tue, 9 Oct 2018 15:12:03 +0530
Subject: [PATCH 22/25] Rename ContextMenuStyles.tsx to contextMenuStyles.tsx
---
.../ContextMenu/{ContextMenuStyles.tsx => contextMenuStyles.tsx} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename src/themes/teams/components/ContextMenu/{ContextMenuStyles.tsx => contextMenuStyles.tsx} (100%)
diff --git a/src/themes/teams/components/ContextMenu/ContextMenuStyles.tsx b/src/themes/teams/components/ContextMenu/contextMenuStyles.tsx
similarity index 100%
rename from src/themes/teams/components/ContextMenu/ContextMenuStyles.tsx
rename to src/themes/teams/components/ContextMenu/contextMenuStyles.tsx
From 631df1a6841856c48b32d30776dca8fafb190c12 Mon Sep 17 00:00:00 2001
From: Gopal Goel
Date: Tue, 9 Oct 2018 15:16:05 +0530
Subject: [PATCH 23/25] fix typo
---
src/themes/teams/components/ContextMenu/contextMenuStyles.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/themes/teams/components/ContextMenu/contextMenuStyles.tsx b/src/themes/teams/components/ContextMenu/contextMenuStyles.tsx
index 207c5b6793..6d771952cd 100644
--- a/src/themes/teams/components/ContextMenu/contextMenuStyles.tsx
+++ b/src/themes/teams/components/ContextMenu/contextMenuStyles.tsx
@@ -1,4 +1,4 @@
-import { IContextMenuVariables } from './ContextMenuVariables'
+import { IContextMenuVariables } from './contextMenuVariables'
import { IComponentPartStylesInput, ICSSInJSStyle } from '../../../../../types/theme'
import { IContextMenuProps } from '../../../../components/ContextMenu/ContextMenu'
From 4916acee49c3777f513e3a687b75b7a98f395a0c Mon Sep 17 00:00:00 2001
From: Gopal Goel
Date: Tue, 13 Nov 2018 17:43:18 +0530
Subject: [PATCH 24/25] Switch back from List to Menu
---
.../Types/ContextMenuExample.shorthand.tsx | 120 ++----------------
src/components/ContextMenu/ContextMenu.tsx | 49 ++++---
.../ContextMenu/contextMenuVariables.tsx | 4 +-
3 files changed, 38 insertions(+), 135 deletions(-)
diff --git a/docs/src/examples/components/ContextMenu/Types/ContextMenuExample.shorthand.tsx b/docs/src/examples/components/ContextMenu/Types/ContextMenuExample.shorthand.tsx
index 097f0bad62..1452c253c4 100644
--- a/docs/src/examples/components/ContextMenu/Types/ContextMenuExample.shorthand.tsx
+++ b/docs/src/examples/components/ContextMenu/Types/ContextMenuExample.shorthand.tsx
@@ -1,120 +1,28 @@
import React from 'react'
-import { Avatar, ContextMenu, Icon } from '@stardust-ui/react'
+import { ContextMenu } from '@stardust-ui/react'
const items = [
{
- key: 'menuItem0',
- header: 'John Doe',
- content: 'Saved on 10/5/2018',
- media: ,
- },
- {
- key: 'menuItem1',
- media: ,
- header: 'Show in channel',
- onClick: () => {
- alert('ListItem callback invoked..')
- },
- },
- {
- key: 'menuItem2',
- media: ,
- header: 'Edit',
- },
- {
- key: 'menuItem3',
- media: ,
- header: 'Open in Word',
- },
- {
- key: 'menuItem4',
- media: ,
- header: 'Get link',
- },
- {
- key: 'menuItem5',
- media: ,
- header: 'Add to...',
- headerMedia: ,
+ key: 'show',
+ content: 'Show in channel',
+ icon: 'search',
+ divider: true,
menu: {
items: [
+ { key: '1', content: 'item1' },
{
- key: 'subItem0',
- header: 'Click for callback',
- },
- {
- key: 'subItem1',
- header: 'Click for callback',
- },
- ],
- },
- },
- {
- key: 'menuItem6',
- media: ,
- header: 'Move to collection',
- headerMedia: ,
- menu: {
- items: [
- {
- key: 'subItem0',
- header: 'Open Submenu 1.1',
- menu: {
- items: [
- {
- key: 'subItem0',
- header: 'Click for callback',
- },
- {
- key: 'subItem1',
- header: 'Click for callback',
- },
- ],
- },
- },
- {
- key: 'subItem1',
- header: 'Click for callback',
- },
- ],
- },
- },
- {
- key: 'menuItem7',
- media: ,
- header: 'Copy to collection',
- headerMedia: ,
- menu: {
- items: [
- {
- key: 'subItem0',
- header: 'Click for callback',
- },
- {
- key: 'subItem1',
- header: 'Click for callback',
- },
- ],
- },
- },
- {
- key: 'menuItem8',
- media: ,
- header: 'Remove',
- headerMedia: ,
- menu: {
- items: [
- {
- key: 'subItem0',
- header: 'Click for callback',
- },
- {
- key: 'subItem1',
- header: 'Click for callback',
+ key: '2',
+ content: 'item2',
+ menu: { items: [{ key: '1', content: 'item1' }, { key: '2', content: 'item2' }] },
},
],
},
},
+ { key: 'move', content: 'Move to collection', icon: 'arrow right' },
+ { key: 'copy', content: 'Copy to collection', icon: 'copy' },
+ { key: 'remove', content: 'Remove', icon: 'delete', divider: true },
+ { key: 'edit', content: 'Edit', icon: 'edit' },
+ { key: 'getlink', content: 'Get link', icon: 'file' },
]
const callback = () => {
diff --git a/src/components/ContextMenu/ContextMenu.tsx b/src/components/ContextMenu/ContextMenu.tsx
index 850a3e601b..a7cab138d8 100644
--- a/src/components/ContextMenu/ContextMenu.tsx
+++ b/src/components/ContextMenu/ContextMenu.tsx
@@ -5,8 +5,9 @@ import ReactNode = React.ReactNode
import { UIComponent, customPropTypes, IRenderResultConfig } from '../../lib'
import { ComponentVariablesInput, ComponentPartStyle } from '../../../types/theme'
import { Extendable } from '../../../types/utils'
-import List, { ListItem } from '../List'
-import Popup from '../Popup'
+import Menu, { MenuItem } from '../Menu'
+// import List, { ListItem } from '../List'
+// import Popup from '../Popup'
export interface IContextMenuProps {
as?: any
className?: string
@@ -51,37 +52,31 @@ class ContextMenu extends UIComponent, any> {
renderComponent({ ElementType, classes, rest }: IRenderResultConfig): ReactNode {
return (
- {this.renderItems()}
+ {this.renderItems1()}
)
}
- renderItems = () => {
- const { items, onItemClick } = this.props
- const children = _.map(items, item => {
- const itemProps = _.pick(this.props, List.itemProps)
- itemProps.selection = true
- if (item.menu !== undefined) {
- return (
- ,
+ renderItems1 = () => {
+ const { items } = this.props
+ return (
+
+ {_.map(items, (item, index) =>
+ MenuItem.create(item, {
+ defaultProps: {
+ index,
styles: {
- padding: '0px',
+ color: 'rgba(37,36,36,0.75)',
+ fontFamily: 'Segoe UI',
+ ...(item.divider && {
+ borderBottom: '2px solid #F3F2F1',
+ }),
},
- }}
- // content={}
- >
- {ListItem.create(item, { defaultProps: itemProps })}
-
- )
- }
- itemProps.onClick = onItemClick
- return ListItem.create(item, { defaultProps: itemProps })
- })
- return {children}
+ },
+ }),
+ )}
+
+ )
}
}
diff --git a/src/themes/teams/components/ContextMenu/contextMenuVariables.tsx b/src/themes/teams/components/ContextMenu/contextMenuVariables.tsx
index 71982b9e9f..d35cbe2a10 100644
--- a/src/themes/teams/components/ContextMenu/contextMenuVariables.tsx
+++ b/src/themes/teams/components/ContextMenu/contextMenuVariables.tsx
@@ -7,7 +7,7 @@ export interface IContextMenuVariables {
export default (): IContextMenuVariables => ({
height: '100%',
- width: '220px',
+ width: '100%',
padding: '0',
- border: '1px solid #eeeeee',
+ // border: '1px solid #eeeeee',
})
From 0b10e5f0021bfaae6b228d331b490d4d7830210d Mon Sep 17 00:00:00 2001
From: Gopal Goel
Date: Fri, 16 Nov 2018 14:17:36 +0530
Subject: [PATCH 25/25] typo fix
---
src/components/ContextMenu/ContextMenu.tsx | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/components/ContextMenu/ContextMenu.tsx b/src/components/ContextMenu/ContextMenu.tsx
index a7cab138d8..79081e678d 100644
--- a/src/components/ContextMenu/ContextMenu.tsx
+++ b/src/components/ContextMenu/ContextMenu.tsx
@@ -16,7 +16,7 @@ export interface IContextMenuProps {
}
/**
- * A contextualMenu.
+ * A contextMenu.
* @accessibility This is example usage of the accessibility tag.
* This should be replaced with the actual description after the PR is merged
*/
@@ -35,7 +35,7 @@ class ContextMenu extends UIComponent, any> {
/** The tree of menu containing submenus and it's submenus and so on. */
items: PropTypes.arrayOf(PropTypes.object),
- /** Function passed which needs to be invoked when menuitem has no submenu */
+ /** Function passed which needs to be invoked when the menuitem has no submenu. */
onItemClick: PropTypes.func,
/** Custom styles to be applied for component. */
@@ -52,12 +52,12 @@ class ContextMenu extends UIComponent, any> {
renderComponent({ ElementType, classes, rest }: IRenderResultConfig): ReactNode {
return (
- {this.renderItems1()}
+ {this.renderItems()}
)
}
- renderItems1 = () => {
+ renderItems = () => {
const { items } = this.props
return (