@@ -137,42 +137,15 @@ const multiTags = (function () {
137137 color: inherit;
138138 ` ;
139139
140- const TagIcon = styled . span `
141- display: inline-flex;
142- align-items: center;
143- margin-right: 4px;
144-
145- &.icon-right {
146- margin-right: 0;
147- margin-left: 4px;
148- }
149- ` ;
150-
151- const TagContent = styled . span `
152- display: inline-flex;
153- align-items: center;
154- ` ;
155-
156-
157-
158140const childrenMap = {
159- options :TagsCompOptionsControl , // initial tags (PropertyView)
141+ options :TagsCompOptionsControl ,
160142style :styleControl ( InputLikeStyle , "style" ) ,
161143onEvent :ButtonEventHandlerControl ,
162- editable :BoolControl , // editable switch field
163- preventDuplicates :BoolCodeControl , // runtime de-dupe
164- allowEmptyEdits :BoolCodeControl , // allow blank labels on edit
165- maxTags :BoolCodeControl , // truthy => 50 (or provide number if your control supports)
166- selectedTagIndex :stateComp < number > ( - 1 ) , // tracks which tag was clicked (-1 = none)
167- runtimeOptions :stateComp < JSONValue > ( [ ] ) , // runtime tags array for CRUD and saving
144+ editable :BoolControl ,
145+ selectedTagIndex :stateComp < number > ( - 1 ) ,
146+ runtimeOptions :stateComp < JSONValue > ( [ ] ) ,
168147} ;
169148
170- const toMax = ( val :any ) :number | undefined => {
171- if ( val === false || val === undefined || val === null ) return undefined ;
172- if ( typeof val === "number" && ! Number . isNaN ( val ) && val > 0 ) return val ;
173- if ( val === true ) return 50 ;
174- return undefined ;
175- } ;
176149
177150return new UICompBuilder ( childrenMap , ( props , dispatch ) => {
178151const { message} = App . useApp ?.( ) || { message :{ warning :( ) => { } } as any } ;
@@ -183,10 +156,7 @@ const multiTags = (function () {
183156const [ editValue , setEditValue ] = useState < string > ( "" ) ;
184157const [ draft , setDraft ] = useState < string > ( "" ) ; // typing buffer for creating a new tag
185158const containerRef = useRef < HTMLDivElement > ( null ) ;
186-
187- const preventDuplicates = ! ! props . preventDuplicates ;
188- const allowEmptyEdits = ! ! props . allowEmptyEdits ;
189- const maxTags = toMax ( props . maxTags ) ;
159+
190160
191161
192162const displayOptions = ( props as any ) . runtimeOptions ?. length && props . editable
@@ -215,14 +185,6 @@ const multiTags = (function () {
215185const addTag = ( raw :string ) => {
216186const label = normalize ( raw ) ;
217187if ( ! label ) return ;
218- if ( maxTags && displayOptions . length >= maxTags ) {
219- message ?. warning ?.( `Maximum${ maxTags } tags allowed.` ) ;
220- return ;
221- }
222- if ( preventDuplicates && exists ( label ) ) {
223- message ?. warning ?.( "Duplicate tag." ) ;
224- return ;
225- }
226188const newTag :TagOption = {
227189 label,
228190colorType :"default" ,
@@ -250,14 +212,6 @@ const multiTags = (function () {
250212
251213const confirmEdit = ( index :number ) => {
252214const val = normalize ( editValue ) ;
253- if ( ! val && ! allowEmptyEdits ) {
254- cancelEdit ( ) ;
255- return ;
256- }
257- if ( preventDuplicates && exists ( val , index ) ) {
258- message ?. warning ?.( "Duplicate tag." ) ;
259- return ;
260- }
261215const prev = displayOptions [ index ] ?. label ?? "" ;
262216const next = displayOptions . map ( ( t , i ) => ( i === index ?{ ...t , label :val } :t ) ) ;
263217dispatch ( changeChildAction ( "runtimeOptions" , next , false ) ) ;
@@ -386,22 +340,12 @@ const multiTags = (function () {
386340< >
387341< Section name = { sectionNames . basic } >
388342{ children . options . propertyView ( { label :"Initial Tags (PropertyView)" } ) }
389- { children . editable . propertyView ( { label :"Editable" } ) }
390- { children . preventDuplicates . propertyView ( { label :"Prevent Duplicates (Runtime)" } ) }
391- { children . allowEmptyEdits . propertyView ( { label :"Allow Empty Edit (Runtime)" } ) }
392- { children . maxTags . propertyView ( { label :"Set Max Tags (Runtime) — true=50" } ) }
343+ { children . editable . propertyView ( { label :"Editable" } ) }
393344</ Section >
394345
395346{ [ "logic" , "both" ] . includes ( useContext ( EditorContext ) . editorModeStatus ) && (
396347< Section name = { sectionNames . interaction } >
397- { children . onEvent . getPropertyView ( {
398- // Events:
399- // "change" (payload.value = TagOption[]),
400- // "add" (label, value),
401- // "edit" (from, to, index, value),
402- // "delete" (removed, index, value),
403- // "click" (tag, index, value)
404- } ) }
348+ { children . onEvent . getPropertyView ( ) }
405349{ hiddenPropertyView ( children ) }
406350{ showDataLoadingIndicatorsPropertyView ( children ) }
407351</ Section >
@@ -432,25 +376,6 @@ export const MultiTagsComp = withExposingConfigs(
432376return null ;
433377}
434378} ) ,
435- depsConfig ( {
436- name :"selectedTagIndex" ,
437- desc :"Index of currently selected tag (-1 if none)" ,
438- depKeys :[ "selectedTagIndex" ] ,
439- func :( input ) => input . selectedTagIndex
440- } ) ,
441- depsConfig ( {
442- name :"selectedTagLabel" ,
443- desc :"Label of currently selected tag" ,
444- depKeys :[ "selectedTagIndex" , "runtimeOptions" ] ,
445- func :( input ) => {
446- const index = input . selectedTagIndex ;
447- const options = Array . isArray ( input . runtimeOptions ) ?( input . runtimeOptions as any [ ] ) :[ ] ;
448- if ( index >= 0 && index < options . length ) {
449- return options [ index ] ?. label || "" ;
450- }
451- return "" ;
452- }
453- } ) ,
454379depsConfig ( {
455380name :"options" ,
456381desc :"Current tags array (updates based on editable prop)" ,