@@ -152,6 +152,9 @@ private function showForm(Tui $tui, TagTuiState $state, callable $onBack): void
152152 $ settingItems [] = new SettingItem ('format_output ' , 'Output Format ' , $ state ->format_output , 'YAML or PHP ' , ['yaml ' , 'php ' ]);
153153 $ settingItems [] = new SettingItem ('output ' , 'Output Directory ' , $ state ->outputDir , 'Target directory ' , [], $ textInputCallback );
154154 $ settingItems [] = new SettingItem ('action_validate ' , 'Save ' , '✓ Confirm ' , 'Save and return to the list. ' , ['✓ Confirm ' ]);
155+ if (null !== $ state ->loadedFrom ) {
156+ $ settingItems [] = new SettingItem ('action_delete ' , 'Delete ' , '✗ Delete ' , 'Delete this tag. ' , ['✗ Delete ' ]);
157+ }
155158 $ settingItems [] = new SettingItem ('action_cancel ' , 'Cancel ' , '← Cancel ' , 'Return without saving. ' , ['← Cancel ' ]);
156159
157160 $ settingsWidget = new SettingsListWidget ($ settingItems , 12 );
@@ -180,6 +183,12 @@ private function showForm(Tui $tui, TagTuiState $state, callable $onBack): void
180183 $ tui ->getEventDispatcher ()->removeListener (CancelEvent::class, $ cancelListener );
181184 $ this ->showComponentList ($ tui , $ onBack );
182185 break ;
186+ case 'action_delete ' :
187+ $ this ->deleteComponent ($ state );
188+ $ tui ->getEventDispatcher ()->removeListener (SettingChangeEvent::class, $ changeListener );
189+ $ tui ->getEventDispatcher ()->removeListener (CancelEvent::class, $ cancelListener );
190+ $ this ->showComponentList ($ tui , $ onBack );
191+ break ;
183192 case 'action_validate ' :
184193 $ state ->name = $ settingsWidget ->getValue ('name ' ) ?? '' ;
185194 $ state ->description = $ settingsWidget ->getValue ('desc ' ) ?? '' ;
@@ -278,4 +287,24 @@ private function generateComponent(TagTuiState $state): void
278287
279288 $ this ->currentOutput ->writeln (sprintf ('<info>Tag "%s" generated successfully in %s</info> ' , $ state ->name , $ dumpLocation ));
280289 }
290+
291+ private function deleteComponent (TagTuiState $ state ): void
292+ {
293+ if (null === $ state ->loadedFrom || !file_exists ($ state ->loadedFrom )) {
294+ return ;
295+ }
296+
297+ $ existingConfig = \Symfony \Component \Yaml \Yaml::parseFile ($ state ->loadedFrom );
298+ if (!isset ($ existingConfig ['documentation ' ]['tags ' ]) || !is_array ($ existingConfig ['documentation ' ]['tags ' ])) {
299+ return ;
300+ }
301+
302+ $ existingConfig ['documentation ' ]['tags ' ] = array_values (array_filter (
303+ $ existingConfig ['documentation ' ]['tags ' ],
304+ static fn (array $ tag ): bool => isset ($ tag ['name ' ]) && $ tag ['name ' ] !== $ state ->name ,
305+ ));
306+
307+ $ this ->writeYamlFile ($ existingConfig , $ state ->loadedFrom , $ this ->currentOutput );
308+ $ this ->currentOutput ->writeln (sprintf ('<info>Tag "%s" deleted from %s</info> ' , $ state ->name , $ state ->loadedFrom ));
309+ }
281310}
0 commit comments