11import { NameConfig , NameConfigHidden , withExposingConfigs } from "comps/generators/withExposing" ;
2+ import { MultiCompBuilder } from "comps/generators/multi" ;
23import { UICompBuilder , withDefault } from "comps/generators" ;
34import { Section , sectionNames } from "lowcoder-design" ;
45import styled from "styled-components" ;
56import { clickEvent , eventHandlerControl } from "comps/controls/eventHandlerControl" ;
6- import { StringControl } from "comps/controls/codeControl" ;
7+ import { BoolCodeControl , StringControl } from "comps/controls/codeControl" ;
78import { alignWithJustifyControl } from "comps/controls/alignControl" ;
89import { navListComp } from "./navItemComp" ;
910import { menuPropertyView } from "./components/MenuItemList" ;
@@ -22,6 +23,8 @@ import { trans } from "i18n";
2223
2324import { useContext } from "react" ;
2425import { EditorContext } from "comps/editorState" ;
26+ import { controlItem } from "lowcoder-design" ;
27+ import { createNavItemsControl } from "./components/NavItemsControl" ;
2528
2629type IProps = {
2730$justify :boolean ;
@@ -63,11 +66,12 @@ const Item = styled.div<{
6366$padding :string ;
6467$textTransform :string ;
6568$textDecoration :string ;
69+ $disabled ?:boolean ;
6670} > `
6771 height: 30px;
6872 line-height: 30px;
6973 padding:${ ( props ) => props . $padding ?props . $padding :'0 16px' } ;
70- color:${ ( props ) => ( props . $active ?props . $activeColor :props . $color ) } ;
74+ color:${ ( props ) => props . $disabled ? ` ${ props . $color } 80` : ( props . $active ?props . $activeColor :props . $color ) } ;
7175 font-weight:${ ( props ) => ( props . $textWeight ?props . $textWeight :500 ) } ;
7276 font-family:${ ( props ) => ( props . $fontFamily ?props . $fontFamily :'sans-serif' ) } ;
7377 font-style:${ ( props ) => ( props . $fontStyle ?props . $fontStyle :'normal' ) } ;
@@ -77,8 +81,8 @@ const Item = styled.div<{
7781 margin:${ ( props ) => props . $margin ?props . $margin :'0px' } ;
7882
7983 &:hover {
80- color:${ ( props ) => props . $activeColor } ;
81- cursor: pointer;
84+ color:${ ( props ) => props . $disabled ? ( props . $active ? props . $activeColor : props . $color ) : props . $ activeColor} ;
85+ cursor:${ ( props ) => props . $disabled ? 'not-allowed' : ' pointer' } ;
8286 }
8387
8488 .anticon {
@@ -131,41 +135,74 @@ function fixOldStyleData(oldData: any) {
131135return oldData ;
132136}
133137
138+ function fixOldItemsData ( oldData :any ) {
139+ if ( Array . isArray ( oldData ) ) {
140+ return {
141+ optionType :"manual" ,
142+ manual :oldData ,
143+ } ;
144+ }
145+ if ( oldData && ! oldData . optionType && Array . isArray ( oldData . manual ) ) {
146+ return {
147+ optionType :"manual" ,
148+ manual :oldData . manual ,
149+ } ;
150+ }
151+ return oldData ;
152+ }
153+
134154const childrenMap = {
135155logoUrl :StringControl ,
136156logoEvent :withDefault ( eventHandlerControl ( logoEventHandlers ) , [ { name :"click" } ] ) ,
137157horizontalAlignment :alignWithJustifyControl ( ) ,
138158style :migrateOldData ( styleControl ( NavigationStyle , 'style' ) , fixOldStyleData ) ,
139159animationStyle :styleControl ( AnimationStyle , 'animationStyle' ) ,
140- items :withDefault ( navListComp ( ) , [
141- {
142- label :trans ( "menuItem" ) + " 1" ,
143- } ,
144- ] ) ,
160+ items :withDefault ( migrateOldData ( createNavItemsControl ( ) , fixOldItemsData ) , {
161+ optionType :"manual" ,
162+ manual :[
163+ {
164+ label :trans ( "menuItem" ) + " 1" ,
165+ } ,
166+ ] ,
167+ } ) ,
145168} ;
146169
147170const NavCompBase = new UICompBuilder ( childrenMap , ( props ) => {
148171const data = props . items ;
149172const items = (
150173< >
151- { data . map ( ( menuItem , idx ) => {
152- const { hidden, label, items, active, onEvent} = menuItem . getView ( ) ;
174+ { data . map ( ( menuItem :any , idx :number ) => {
175+ const isCompItem = typeof menuItem ?. getView === "function" ;
176+ const view = isCompItem ?menuItem . getView ( ) :menuItem ;
177+ const hidden = ! ! view ?. hidden ;
153178if ( hidden ) {
154179return null ;
155180}
156- const subMenuItems :Array < { key :string ; label :string } > = [ ] ;
181+
182+ const label = view ?. label ;
183+ const active = ! ! view ?. active ;
184+ const onEvent = view ?. onEvent ;
185+ const disabled = ! ! view ?. disabled ;
186+ const subItems = isCompItem ?view ?. items :[ ] ;
187+
188+ const subMenuItems :Array < { key :string ; label :any ; disabled ?:boolean } > = [ ] ;
157189const subMenuSelectedKeys :Array < string > = [ ] ;
158- items . forEach ( ( subItem , originalIndex ) => {
159- if ( subItem . children . hidden . getView ( ) ) {
160- return ;
161- }
162- const key = originalIndex + "" ;
163- subItem . children . active . getView ( ) && subMenuSelectedKeys . push ( key ) ;
164- subMenuItems . push ( {
165- key :key ,
166- label :subItem . children . label . getView ( ) ,
190+
191+ if ( Array . isArray ( subItems ) ) {
192+ subItems . forEach ( ( subItem :any , originalIndex :number ) => {
193+ if ( subItem . children . hidden . getView ( ) ) {
194+ return ;
195+ }
196+ const key = originalIndex + "" ;
197+ subItem . children . active . getView ( ) && subMenuSelectedKeys . push ( key ) ;
198+ subMenuItems . push ( {
199+ key :key ,
200+ label :subItem . children . label . getView ( ) ,
201+ disabled :! ! subItem . children . disabled . getView ( ) ,
202+ } ) ;
167203} ) ;
168- } ) ;
204+ }
205+
169206const item = (
170207< Item
171208key = { idx }
@@ -180,18 +217,23 @@ const NavCompBase = new UICompBuilder(childrenMap, (props) => {
180217$textTransform = { props . style . textTransform }
181218$textDecoration = { props . style . textDecoration }
182219$margin = { props . style . margin }
183- onClick = { ( ) => onEvent ( "click" ) }
220+ $disabled = { disabled }
221+ onClick = { ( ) => { if ( ! disabled && onEvent ) onEvent ( "click" ) ; } }
184222>
185223{ label }
186- { items . length > 0 && < DownOutlined /> }
224+ { Array . isArray ( subItems ) && subItems . length > 0 && < DownOutlined /> }
187225</ Item >
188226) ;
189227if ( subMenuItems . length > 0 ) {
190228const subMenu = (
191229< StyledMenu
192230onClick = { ( e ) => {
193- const { onEvent :onSubEvent } = items [ Number ( e . key ) ] ?. getView ( ) ;
194- onSubEvent ( "click" ) ;
231+ if ( disabled ) return ;
232+ const subItem = subItems [ Number ( e . key ) ] ;
233+ const isSubDisabled = ! ! subItem ?. children ?. disabled ?. getView ?.( ) ;
234+ if ( isSubDisabled ) return ;
235+ const onSubEvent = subItem ?. getView ( ) ?. onEvent ;
236+ onSubEvent && onSubEvent ( "click" ) ;
195237} }
196238selectedKeys = { subMenuSelectedKeys }
197239items = { subMenuItems }
@@ -201,6 +243,7 @@ const NavCompBase = new UICompBuilder(childrenMap, (props) => {
201243< Dropdown
202244key = { idx }
203245popupRender = { ( ) => subMenu }
246+ disabled = { disabled }
204247>
205248{ item }
206249</ Dropdown >
@@ -237,7 +280,7 @@ const NavCompBase = new UICompBuilder(childrenMap, (props) => {
237280return (
238281< >
239282< Section name = { sectionNames . basic } >
240- { menuPropertyView ( children . items ) }
283+ { children . items . propertyView ( ) }
241284</ Section >
242285
243286{ ( useContext ( EditorContext ) . editorModeStatus === "logic" || useContext ( EditorContext ) . editorModeStatus === "both" ) && (