@@ -10,6 +10,8 @@ import SwiftUI
1010/// Full-tab favorites view with folder hierarchy and bottom toolbar
1111struct FavoritesTabView : View {
1212 @State private var viewModel : FavoritesSidebarViewModel
13+ @State private var folderToDelete : SQLFavoriteFolder ?
14+ @State private var showDeleteFolderAlert = false
1315 let searchText : String
1416 private weak var coordinator : MainContentCoordinator ?
1517
@@ -48,6 +50,18 @@ struct FavoritesTabView: View {
4850 folderId: viewModel. editingFolderId
4951 )
5052 }
53+ . alert (
54+ String ( localized: " Delete Folder? " ) ,
55+ isPresented: $showDeleteFolderAlert,
56+ presenting: folderToDelete
57+ ) { folder in
58+ Button ( String ( localized: " Cancel " ) , role: . cancel) { }
59+ Button ( String ( localized: " Delete " ) , role: . destructive) {
60+ viewModel. deleteFolder ( folder)
61+ }
62+ } message: { folder in
63+ Text ( " The folder \" \( folder. name) \" will be deleted. Items inside will be moved to the parent level. " )
64+ }
5165 }
5266
5367 // MARK: - List
@@ -58,7 +72,11 @@ struct FavoritesTabView: View {
5872 FavoriteTreeItemRow (
5973 item: item,
6074 viewModel: viewModel,
61- coordinator: coordinator
75+ coordinator: coordinator,
76+ onDeleteFolder: { folder in
77+ folderToDelete = folder
78+ showDeleteFolderAlert = true
79+ }
6280 )
6381 }
6482 }
@@ -82,6 +100,15 @@ struct FavoritesTabView: View {
82100 . font ( . system( size: 11 ) )
83101 . foregroundStyle ( Color ( nsColor: . tertiaryLabelColor) )
84102 . multilineTextAlignment ( . center)
103+
104+ Button {
105+ viewModel. createFavorite ( )
106+ } label: {
107+ Label ( String ( localized: " New Favorite " ) , systemImage: " plus " )
108+ . font ( . system( size: 12 ) )
109+ }
110+ . buttonStyle ( . borderless)
111+ . padding ( . top, 4 )
85112 }
86113 . frame ( maxWidth: . infinity, maxHeight: . infinity)
87114 }
@@ -134,6 +161,7 @@ struct FavoriteTreeItemRow: View {
134161 let item : FavoriteTreeItem
135162 let viewModel : FavoritesSidebarViewModel
136163 weak var coordinator : MainContentCoordinator ?
164+ var onDeleteFolder : ( ( SQLFavoriteFolder ) -> Void ) ?
137165 @FocusState private var isRenameFocused : Bool
138166
139167 var body : some View {
@@ -167,7 +195,8 @@ struct FavoriteTreeItemRow: View {
167195 FavoriteTreeItemRow (
168196 item: child,
169197 viewModel: viewModel,
170- coordinator: coordinator
198+ coordinator: coordinator,
199+ onDeleteFolder: onDeleteFolder
171200 )
172201 }
173202 } label: {
@@ -198,7 +227,8 @@ struct FavoriteTreeItemRow: View {
198227 . contextMenu {
199228 FolderContextMenu (
200229 folder: folder,
201- viewModel: viewModel
230+ viewModel: viewModel,
231+ onDelete: onDeleteFolder ?? { _ in }
202232 )
203233 }
204234 }
@@ -215,7 +245,7 @@ private struct FavoriteItemContextMenu: View {
215245 weak var coordinator : MainContentCoordinator ?
216246
217247 var body : some View {
218- Button ( " Edit... " ) {
248+ Button ( String ( localized : " Edit... " ) ) {
219249 viewModel. editFavorite ( favorite)
220250 }
221251
@@ -251,24 +281,25 @@ private struct FavoriteItemContextMenu: View {
251281private struct FolderContextMenu : View {
252282 let folder : SQLFavoriteFolder
253283 let viewModel : FavoritesSidebarViewModel
284+ var onDelete : ( SQLFavoriteFolder ) -> Void
254285
255286 var body : some View {
256- Button ( " Rename " ) {
287+ Button ( String ( localized : " Rename " ) ) {
257288 viewModel. startRenameFolder ( folder)
258289 }
259290
260- Button ( " New Favorite... " ) {
291+ Button ( String ( localized : " New Favorite... " ) ) {
261292 viewModel. createFavorite ( folderId: folder. id)
262293 }
263294
264- Button ( " New Subfolder " ) {
295+ Button ( String ( localized : " New Subfolder " ) ) {
265296 viewModel. createFolder ( parentId: folder. id)
266297 }
267298
268299 Divider ( )
269300
270301 Button ( role: . destructive) {
271- viewModel . deleteFolder ( folder)
302+ onDelete ( folder)
272303 } label: {
273304 Label ( String ( localized: " Delete Folder " ) , systemImage: " trash " )
274305 }
0 commit comments