2019-06-19 14:40:52 +00:00
import Typography from "@material-ui/core/Typography" ;
2019-08-09 10:26:22 +00:00
import React from "react" ;
2019-08-26 14:51:47 +00:00
import { FormattedMessage , useIntl } from "react-intl" ;
2019-06-19 14:40:52 +00:00
import AppHeader from "@saleor/components/AppHeader" ;
import CardSpacer from "@saleor/components/CardSpacer" ;
import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton" ;
import Container from "@saleor/components/Container" ;
import Form from "@saleor/components/Form" ;
import Grid from "@saleor/components/Grid" ;
import SaveButtonBar from "@saleor/components/SaveButtonBar" ;
2019-08-26 14:51:47 +00:00
import { sectionNames } from "@saleor/intl" ;
2019-06-19 14:40:52 +00:00
import { maybe } from "../../../misc" ;
import { MenuDetails_menu } from "../../types/MenuDetails" ;
import { MenuItemType } from "../MenuItemDialog" ;
import MenuItems , { TreeOperation } from "../MenuItems" ;
import MenuProperties from "../MenuProperties" ;
import { computeTree } from "./tree" ;
export interface MenuDetailsFormData {
name : string ;
}
export interface MenuDetailsSubmitData extends MenuDetailsFormData {
operations : TreeOperation [ ] ;
}
export interface MenuDetailsPageProps {
saveButtonState : ConfirmButtonTransitionState ;
disabled : boolean ;
menu : MenuDetails_menu ;
onBack : ( ) = > void ;
onDelete : ( ) = > void ;
onItemAdd : ( ) = > void ;
onItemClick : ( id : string , type : MenuItemType ) = > void ;
onItemEdit : ( id : string ) = > void ;
onSubmit : ( data : MenuDetailsSubmitData ) = > Promise < boolean > ;
}
const MenuDetailsPage : React.StatelessComponent < MenuDetailsPageProps > = ( {
disabled ,
menu ,
saveButtonState ,
onBack ,
onDelete ,
onItemAdd ,
onItemClick ,
onItemEdit ,
onSubmit
} ) = > {
2019-08-26 14:51:47 +00:00
const intl = useIntl ( ) ;
2019-06-19 14:40:52 +00:00
const initialForm : MenuDetailsFormData = {
name : maybe ( ( ) = > menu . name , "" )
} ;
const [ treeOperations , setTreeOperations ] = React . useState < TreeOperation [ ] > (
[ ]
) ;
const handleSubmit = async ( data : MenuDetailsFormData ) = > {
if (
await onSubmit ( {
name : data.name ,
operations : treeOperations
} )
) {
setTreeOperations ( [ ] ) ;
}
} ;
const handleChange = ( operation : TreeOperation ) = > {
if ( ! ! operation ) {
setTreeOperations ( [ . . . treeOperations , operation ] ) ;
}
} ;
return (
< Form initial = { initialForm } onSubmit = { handleSubmit } >
{ ( { change , data , hasChanged , submit } ) = > (
< Container >
2019-08-26 14:51:47 +00:00
< AppHeader onBack = { onBack } >
{ intl . formatMessage ( sectionNames . navigation ) }
< / AppHeader >
2019-06-19 14:40:52 +00:00
< Grid variant = "inverted" >
< div >
2019-08-26 14:51:47 +00:00
< Typography variant = "h5" >
{ intl . formatMessage ( sectionNames . navigation ) }
< / Typography >
2019-06-19 14:40:52 +00:00
< Typography >
2019-08-26 14:51:47 +00:00
< FormattedMessage
defaultMessage = "Creating the navigation structure is done by dragging and dropping. Simply create a new menu item and then drag it into its destined place. You can move items inside one another to create a tree structure and drag items up and down to create a hierarchy"
id = "menuDetailsPageHelperText"
/ >
2019-06-19 14:40:52 +00:00
< / Typography >
< / div >
< div >
< MenuProperties
data = { data }
disabled = { disabled }
onChange = { change }
/ >
< CardSpacer / >
< MenuItems
canUndo = { treeOperations . length > 0 }
items = { maybe ( ( ) = >
computeTree ( menu . items , [ . . . treeOperations ] )
) }
onChange = { handleChange }
onItemAdd = { onItemAdd }
onItemClick = { onItemClick }
onItemEdit = { onItemEdit }
onUndo = { ( ) = >
setTreeOperations (
treeOperations . slice ( 0 , treeOperations . length - 1 )
)
}
/ >
< / div >
< / Grid >
< SaveButtonBar
disabled = { disabled || ( ! hasChanged && treeOperations . length === 0 ) }
onCancel = { onBack }
onDelete = { onDelete }
onSave = { submit }
state = { saveButtonState }
/ >
< / Container >
) }
< / Form >
) ;
} ;
MenuDetailsPage . displayName = "MenuDetailsPage" ;
export default MenuDetailsPage ;