Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Add schema versioning to SQLite databases (query history, favorites) for future migrations
- Use semantic selected-text color instead of hardcoded white in selected rows
- Use proper CommandGroup for full-screen shortcut instead of event monitor
- Use sheet presentation for all file open/save panels instead of free-floating dialogs

### Added

Expand Down
7 changes: 5 additions & 2 deletions TablePro/ViewModels/WelcomeViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -377,8 +377,11 @@ final class WelcomeViewModel {
panel.allowedContentTypes = [.tableproConnectionShare]
panel.allowsMultipleSelection = false
panel.canChooseDirectories = false
guard panel.runModal() == .OK, let url = panel.url else { return }
activeSheet = .importFile(url)
guard let window = NSApp.keyWindow else { return }
panel.beginSheetModal(for: window) { response in
guard response == .OK, let url = panel.url else { return }
self.activeSheet = .importFile(url)
}
}

func showImportResultAlert(count: Int) {
Expand Down
35 changes: 19 additions & 16 deletions TablePro/Views/Connection/ConnectionExportOptionsSheet.swift
Original file line number Diff line number Diff line change
Expand Up @@ -104,24 +104,27 @@ struct ConnectionExportOptionsSheet: View {
: "Connections.tablepro"
panel.nameFieldStringValue = defaultName
panel.canCreateDirectories = true
guard panel.runModal() == .OK, let url = panel.url else { return }

do {
if shouldEncrypt {
try ConnectionExportService.exportConnectionsEncrypted(
capturedConnections,
to: url,
passphrase: capturedPassphrase
guard let window = NSApp.keyWindow else { return }
panel.beginSheetModal(for: window) { response in
guard response == .OK, let url = panel.url else { return }

do {
if shouldEncrypt {
try ConnectionExportService.exportConnectionsEncrypted(
capturedConnections,
to: url,
passphrase: capturedPassphrase
)
} else {
try ConnectionExportService.exportConnections(capturedConnections, to: url)
}
} catch {
AlertHelper.showErrorSheet(
title: String(localized: "Export Failed"),
message: error.localizedDescription,
window: window
)
} else {
try ConnectionExportService.exportConnections(capturedConnections, to: url)
}
} catch {
AlertHelper.showErrorSheet(
title: String(localized: "Export Failed"),
message: error.localizedDescription,
window: NSApp.keyWindow
)
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion TablePro/Views/Export/ExportDialog.swift
Original file line number Diff line number Diff line change
Expand Up @@ -714,7 +714,9 @@ struct ExportDialog: View {
savePanel.message = String(format: String(localized: "Export %d table(s) to %@"), exportableCount, formatName)
}

savePanel.begin { response in
guard let keyWindow = NSApp.keyWindow else { return }
let window = keyWindow.sheetParent ?? keyWindow
savePanel.beginSheetModal(for: window) { response in
guard response == .OK, let url = savePanel.url else { return }

Task {
Expand Down
8 changes: 5 additions & 3 deletions TablePro/Views/Import/ImportDialog.swift
Original file line number Diff line number Diff line change
Expand Up @@ -294,11 +294,13 @@ struct ImportDialog: View {
panel.allowsMultipleSelection = false
panel.message = "Select file to import"

panel.begin { response in
guard let keyWindow = NSApp.keyWindow else { return }
let window = keyWindow.sheetParent ?? keyWindow
panel.beginSheetModal(for: window) { response in
guard response == .OK, let url = panel.url else { return }

loadFileTask = Task {
await loadFile(url)
self.loadFileTask = Task {
await self.loadFile(url)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,8 @@ extension MainContentCoordinator {
panel.allowsMultipleSelection = false
panel.message = "Select SQL file to import"

panel.begin { [weak self] response in
guard let window = contentWindow else { return }
panel.beginSheetModal(for: window) { [weak self] response in
guard response == .OK, let url = panel.url else { return }
self?.importFileURL = url
self?.activeSheet = .importDialog
Expand Down
24 changes: 15 additions & 9 deletions TablePro/Views/Settings/Appearance/ThemeListView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -173,26 +173,32 @@ internal struct ThemeListView: View {
}

private func exportActiveTheme() {
guard let window = NSApp.keyWindow else { return }
let panel = NSSavePanel()
panel.allowedContentTypes = [.json]
panel.nameFieldStringValue = engine.activeTheme.name + ".json"
panel.canCreateDirectories = true
guard panel.runModal() == .OK, let url = panel.url else { return }
try? engine.exportTheme(engine.activeTheme, to: url)
panel.beginSheetModal(for: window) { response in
guard response == .OK, let url = panel.url else { return }
try? engine.exportTheme(engine.activeTheme, to: url)
}
}

private func importTheme() {
guard let window = NSApp.keyWindow else { return }
let panel = NSOpenPanel()
panel.allowedContentTypes = [.json]
panel.allowsMultipleSelection = false
panel.canChooseDirectories = false
guard panel.runModal() == .OK, let url = panel.url else { return }
do {
let imported = try engine.importTheme(from: url)
selectedThemeId = imported.id
} catch {
errorMessage = error.localizedDescription
showError = true
panel.beginSheetModal(for: window) { response in
guard response == .OK, let url = panel.url else { return }
do {
let imported = try self.engine.importTheme(from: url)
self.selectedThemeId = imported.id
} catch {
self.errorMessage = error.localizedDescription
self.showError = true
}
}
}
}
7 changes: 4 additions & 3 deletions TablePro/Views/Settings/LinkedFoldersSection.swift
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,16 @@ struct LinkedFoldersSection: View {
panel.allowsMultipleSelection = false
panel.message = String(localized: "Choose a folder to watch for .tablepro connection files")

panel.begin { response in
guard let window = NSApp.keyWindow else { return }
panel.beginSheetModal(for: window) { response in
guard response == .OK, let url = panel.url else { return }
let path = PathPortability.contractHome(url.path)

guard !folders.contains(where: { $0.path == path }) else { return }
guard !self.folders.contains(where: { $0.path == path }) else { return }

let folder = LinkedFolder(path: path)
LinkedFolderStorage.shared.addFolder(folder)
folders = LinkedFolderStorage.shared.loadFolders()
self.folders = LinkedFolderStorage.shared.loadFolders()
LinkedFolderWatcher.shared.reload()
}
}
Expand Down
8 changes: 5 additions & 3 deletions TablePro/Views/Settings/Plugins/InstalledPluginsView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -297,9 +297,11 @@ struct InstalledPluginsView: View {
panel.canChooseDirectories = false
panel.treatsFilePackagesAsDirectories = false

guard panel.runModal() == .OK, let url = panel.url else { return }

installPlugin(from: url)
guard let window = NSApp.keyWindow else { return }
panel.beginSheetModal(for: window) { response in
guard response == .OK, let url = panel.url else { return }
self.installPlugin(from: url)
}
}

private func installPlugin(from url: URL) {
Expand Down
3 changes: 2 additions & 1 deletion TablePro/Views/Structure/TableStructureView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -979,7 +979,8 @@ struct TableStructureView: View {
}
savePanel.nameFieldStringValue = "\(tableName).sql"

savePanel.begin { response in
guard let window = NSApp.keyWindow else { return }
savePanel.beginSheetModal(for: window) { response in
guard response == .OK, let url = savePanel.url else { return }
do {
try ddlStatement.write(to: url, atomically: true, encoding: .utf8)
Expand Down
Loading