From 7b04909a2301250c6ae6412c155ad07ad2b3cb19 Mon Sep 17 00:00:00 2001 From: Sabrina Tardio Date: Fri, 5 May 2023 15:32:11 +0200 Subject: [PATCH 1/9] Add Login export links to settings and Autofill 3 dot menu --- DuckDuckGo/Common/Localizables/UserText.swift | 4 +++ .../Model/AutofillPreferencesModel.swift | 4 +++ .../View/PreferencesAutofillView.swift | 6 +++++ .../PasswordManagementViewController.swift | 18 ++++++++++++- .../View/PasswordManager.storyboard | 27 ++++++++++++++++--- 5 files changed, 55 insertions(+), 4 deletions(-) diff --git a/DuckDuckGo/Common/Localizables/UserText.swift b/DuckDuckGo/Common/Localizables/UserText.swift index 52c6a2f60e..31db81ba63 100644 --- a/DuckDuckGo/Common/Localizables/UserText.swift +++ b/DuckDuckGo/Common/Localizables/UserText.swift @@ -203,6 +203,10 @@ struct UserText { static let passwordManagementUnlock = NSLocalizedString("passsword.management.unlock", value: "Unlock", comment: "Unlock Logins Vault menu") static let importBrowserData = NSLocalizedString("import.browser.data", value: "Import Bookmarks and Passwords…", comment: "Opens Import Browser Data dialog") + static let exportLogins = NSLocalizedString("export.logins.data", value: "Export Logins", comment: "Opens Export Logins Data dialog") + static let exportMenuItem = NSLocalizedString("export.menu.item", value: "Export", comment: "Export menu item") + static let exportLoginsMenuItem = NSLocalizedString("export.logins.menu.item", value: "Logins", comment: "Export logins menu item") + static let exportBookmarksMenuItem = NSLocalizedString("export.bookmarks.menu.item", value: "Bookmarks", comment: "Export bookmarks menu item") static let bookmarks = NSLocalizedString("bookmarks", value: "Bookmarks", comment: "Button for bookmarks") static let favorites = NSLocalizedString("favorites", value: "Favorites", comment: "Title text for the Favorites menu item") diff --git a/DuckDuckGo/Preferences/Model/AutofillPreferencesModel.swift b/DuckDuckGo/Preferences/Model/AutofillPreferencesModel.swift index 7e555894d7..2e0f8bfc40 100644 --- a/DuckDuckGo/Preferences/Model/AutofillPreferencesModel.swift +++ b/DuckDuckGo/Preferences/Model/AutofillPreferencesModel.swift @@ -102,6 +102,10 @@ final class AutofillPreferencesModel: ObservableObject { NSApp.sendAction(#selector(AppDelegate.openImportBrowserDataWindow(_:)), to: nil, from: nil) } + func openExportLogins() { + NSApp.sendAction(#selector(AppDelegate.openExportLogins(_:)), to: nil, from: nil) + } + @MainActor func showAutofillPopover() { guard let parentWindowController = WindowControllersManager.shared.lastKeyMainWindowController else { return } diff --git a/DuckDuckGo/Preferences/View/PreferencesAutofillView.swift b/DuckDuckGo/Preferences/View/PreferencesAutofillView.swift index 8a85d80e8d..14a0a136c9 100644 --- a/DuckDuckGo/Preferences/View/PreferencesAutofillView.swift +++ b/DuckDuckGo/Preferences/View/PreferencesAutofillView.swift @@ -74,6 +74,9 @@ extension Preferences { Button(UserText.importBrowserData) { model.openImportBrowserDataWindow() } + Button(UserText.exportLogins) { + model.openExportLogins() + } #endif } @@ -97,6 +100,9 @@ extension Preferences { Button(UserText.importBrowserData) { model.openImportBrowserDataWindow() } + Button(UserText.exportLogins) { + model.openExportLogins() + } } #endif diff --git a/DuckDuckGo/SecureVault/View/PasswordManagementViewController.swift b/DuckDuckGo/SecureVault/View/PasswordManagementViewController.swift index 9ec8cf7e66..98a2af4907 100644 --- a/DuckDuckGo/SecureVault/View/PasswordManagementViewController.swift +++ b/DuckDuckGo/SecureVault/View/PasswordManagementViewController.swift @@ -53,7 +53,9 @@ final class PasswordManagementViewController: NSViewController { @IBOutlet var emptyStateTitle: NSTextField! @IBOutlet var emptyStateMessage: NSTextField! @IBOutlet var emptyStateButton: NSButton! - + @IBOutlet weak var exportItem: NSMenuItem! + @IBOutlet weak var exportBookmarksItem: NSMenuItem! + @IBOutlet weak var exportLoginsItem: NSMenuItem! @IBOutlet var lockScreen: NSView! @IBOutlet var lockScreenIconImageView: NSImageView! { didSet { @@ -161,6 +163,10 @@ final class PasswordManagementViewController: NSViewController { addVaultItemButton.sendAction(on: .leftMouseDown) moreButton.sendAction(on: .leftMouseDown) + exportItem.title = UserText.exportMenuItem + exportLoginsItem.title = UserText.exportLoginsMenuItem + exportBookmarksItem.title = UserText.exportBookmarksMenuItem + NotificationCenter.default.addObserver(forName: .deviceBecameLocked, object: nil, queue: .main) { [weak self] _ in self?.displayLockScreen() } @@ -258,6 +264,16 @@ final class PasswordManagementViewController: NSViewController { NSApp.sendAction(#selector(openImportBrowserDataWindow(_:)), to: nil, from: sender) } + @IBAction func openExportLogins(_ sender: Any) { + self.dismiss() + NSApp.sendAction(#selector(AppDelegate.openExportLogins(_:)), to: nil, from: sender) + } + + @IBAction func openExportBookmarksWindow(_ sender: Any) { + self.dismiss() + NSApp.sendAction(#selector(AppDelegate.openExportBookmarks(_:)), to: nil, from: nil) + } + @IBAction func onImportClicked(_ sender: NSButton) { self.dismiss() DataImportViewController.show() diff --git a/DuckDuckGo/SecureVault/View/PasswordManager.storyboard b/DuckDuckGo/SecureVault/View/PasswordManager.storyboard index 88ecd60936..5b7ad39eb6 100644 --- a/DuckDuckGo/SecureVault/View/PasswordManager.storyboard +++ b/DuckDuckGo/SecureVault/View/PasswordManager.storyboard @@ -1,8 +1,7 @@ - + - - + @@ -353,6 +352,9 @@ + + + @@ -378,6 +380,25 @@ + + + + + + + + + + + + + + + + + + + From 681ddfd27eb6f793d487896244c25319c5c411fd Mon Sep 17 00:00:00 2001 From: Sabrina Tardio Date: Tue, 9 May 2023 13:52:09 +0200 Subject: [PATCH 2/9] add export bookmarks links --- .../View/BookmarkOutlineViewCell.xib | 5 ++-- DuckDuckGo/Common/Localizables/UserText.swift | 4 +-- DuckDuckGo/HomePage/View/HomePage.storyboard | 4 +-- DuckDuckGo/Menus/MainMenu.storyboard | 13 +++++++++- DuckDuckGo/Menus/MainMenu.swift | 1 + .../NavigationBar/View/MoreOptionsMenu.swift | 8 ++++++ .../View/NavigationBarViewController.swift | 4 +++ .../PasswordManagementViewController.swift | 13 ++-------- .../View/PasswordManager.storyboard | 25 ++++--------------- 9 files changed, 37 insertions(+), 40 deletions(-) diff --git a/DuckDuckGo/Bookmarks/View/BookmarkOutlineViewCell.xib b/DuckDuckGo/Bookmarks/View/BookmarkOutlineViewCell.xib index 0a2684801a..5f156db026 100644 --- a/DuckDuckGo/Bookmarks/View/BookmarkOutlineViewCell.xib +++ b/DuckDuckGo/Bookmarks/View/BookmarkOutlineViewCell.xib @@ -1,8 +1,7 @@ - + - - + diff --git a/DuckDuckGo/Common/Localizables/UserText.swift b/DuckDuckGo/Common/Localizables/UserText.swift index 31db81ba63..ddee47092f 100644 --- a/DuckDuckGo/Common/Localizables/UserText.swift +++ b/DuckDuckGo/Common/Localizables/UserText.swift @@ -204,9 +204,7 @@ struct UserText { static let importBrowserData = NSLocalizedString("import.browser.data", value: "Import Bookmarks and Passwords…", comment: "Opens Import Browser Data dialog") static let exportLogins = NSLocalizedString("export.logins.data", value: "Export Logins", comment: "Opens Export Logins Data dialog") - static let exportMenuItem = NSLocalizedString("export.menu.item", value: "Export", comment: "Export menu item") - static let exportLoginsMenuItem = NSLocalizedString("export.logins.menu.item", value: "Logins", comment: "Export logins menu item") - static let exportBookmarksMenuItem = NSLocalizedString("export.bookmarks.menu.item", value: "Bookmarks", comment: "Export bookmarks menu item") + static let exportBookmarks = NSLocalizedString("export.bookmarks.menu.item", value: "Export Bookmarks", comment: "Export bookmarks menu item") static let bookmarks = NSLocalizedString("bookmarks", value: "Bookmarks", comment: "Button for bookmarks") static let favorites = NSLocalizedString("favorites", value: "Favorites", comment: "Title text for the Favorites menu item") diff --git a/DuckDuckGo/HomePage/View/HomePage.storyboard b/DuckDuckGo/HomePage/View/HomePage.storyboard index 7c0909b0db..fec70fd10a 100644 --- a/DuckDuckGo/HomePage/View/HomePage.storyboard +++ b/DuckDuckGo/HomePage/View/HomePage.storyboard @@ -1,7 +1,7 @@ - + - + diff --git a/DuckDuckGo/Menus/MainMenu.storyboard b/DuckDuckGo/Menus/MainMenu.storyboard index 5712a37f37..cea57c0da4 100644 --- a/DuckDuckGo/Menus/MainMenu.storyboard +++ b/DuckDuckGo/Menus/MainMenu.storyboard @@ -7,7 +7,11 @@ - + + + + + @@ -550,6 +554,12 @@ CA + + + + + + @@ -823,6 +833,7 @@ CQ + diff --git a/DuckDuckGo/Menus/MainMenu.swift b/DuckDuckGo/Menus/MainMenu.swift index ac8453ca10..05bf853e67 100644 --- a/DuckDuckGo/Menus/MainMenu.swift +++ b/DuckDuckGo/Menus/MainMenu.swift @@ -65,6 +65,7 @@ final class MainMenu: NSMenu { @IBOutlet weak var manageBookmarksMenuItem: NSMenuItem! @IBOutlet weak var bookmarksMenuToggleBookmarksBarMenuItem: NSMenuItem? @IBOutlet weak var importBookmarksMenuItem: NSMenuItem! + @IBOutlet weak var exportBookmarksMenuItem: NSMenuItem! @IBOutlet weak var bookmarksMenuItem: NSMenuItem? @IBOutlet weak var bookmarkThisPageMenuItem: NSMenuItem? @IBOutlet weak var favoritesMenuItem: NSMenuItem? diff --git a/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift b/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift index c1de8881f0..624f2a36da 100644 --- a/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift +++ b/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift @@ -28,6 +28,7 @@ protocol OptionsButtonMenuDelegate: AnyObject { func optionsButtonMenuRequestedToggleBookmarksBar(_ menu: NSMenu) func optionsButtonMenuRequestedBookmarkManagementInterface(_ menu: NSMenu) func optionsButtonMenuRequestedBookmarkImportInterface(_ menu: NSMenu) + func optionsButtonMenuRequestedBookmarkExportInterface(_ menu: NSMenu) func optionsButtonMenuRequestedLoginsPopover(_ menu: NSMenu, selectedCategory: SecureVaultSorting.Category) func optionsButtonMenuRequestedOpenExternalPasswordManager(_ menu: NSMenu) func optionsButtonMenuRequestedDownloadsPopover(_ menu: NSMenu) @@ -145,6 +146,10 @@ final class MoreOptionsMenu: NSMenu { actionDelegate?.optionsButtonMenuRequestedBookmarkImportInterface(self) } + @objc func openBookmarkExportInterface(_ sender: NSMenuItem) { + actionDelegate?.optionsButtonMenuRequestedBookmarkExportInterface(self) + } + @objc func openDownloads(_ sender: NSMenuItem) { actionDelegate?.optionsButtonMenuRequestedDownloadsPopover(self) } @@ -441,6 +446,9 @@ final class BookmarksSubMenu: NSMenu { addItem(withTitle: UserText.importBrowserData, action: #selector(MoreOptionsMenu.openBookmarkImportInterface(_:)), keyEquivalent: "") .targetting(target) + + addItem(withTitle: UserText.exportBookmarks, action: #selector(MoreOptionsMenu.openBookmarkExportInterface(_:)), keyEquivalent: "") + .targetting(target) } private func bookmarkMenuItems(from bookmarkViewModels: [BookmarkViewModel], topLevel: Bool = true) -> [NSMenuItem] { diff --git a/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift b/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift index 16a24d44be..5f562905f4 100644 --- a/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift +++ b/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift @@ -703,6 +703,10 @@ extension NavigationBarViewController: OptionsButtonMenuDelegate { DataImportViewController.show() } + func optionsButtonMenuRequestedBookmarkExportInterface(_ menu: NSMenu) { + NSApp.sendAction(#selector(AppDelegate.openExportBookmarks(_:)), to: nil, from: nil) + } + func optionsButtonMenuRequestedLoginsPopover(_ menu: NSMenu, selectedCategory: SecureVaultSorting.Category) { popovers.showPasswordManagementPopover(selectedCategory: selectedCategory, usingView: passwordManagementButton, diff --git a/DuckDuckGo/SecureVault/View/PasswordManagementViewController.swift b/DuckDuckGo/SecureVault/View/PasswordManagementViewController.swift index 98a2af4907..1147ca4b03 100644 --- a/DuckDuckGo/SecureVault/View/PasswordManagementViewController.swift +++ b/DuckDuckGo/SecureVault/View/PasswordManagementViewController.swift @@ -53,9 +53,7 @@ final class PasswordManagementViewController: NSViewController { @IBOutlet var emptyStateTitle: NSTextField! @IBOutlet var emptyStateMessage: NSTextField! @IBOutlet var emptyStateButton: NSButton! - @IBOutlet weak var exportItem: NSMenuItem! - @IBOutlet weak var exportBookmarksItem: NSMenuItem! - @IBOutlet weak var exportLoginsItem: NSMenuItem! + @IBOutlet weak var exportLoginItem: NSMenuItem! @IBOutlet var lockScreen: NSView! @IBOutlet var lockScreenIconImageView: NSImageView! { didSet { @@ -163,9 +161,7 @@ final class PasswordManagementViewController: NSViewController { addVaultItemButton.sendAction(on: .leftMouseDown) moreButton.sendAction(on: .leftMouseDown) - exportItem.title = UserText.exportMenuItem - exportLoginsItem.title = UserText.exportLoginsMenuItem - exportBookmarksItem.title = UserText.exportBookmarksMenuItem + exportLoginItem.title = UserText.exportLogins NotificationCenter.default.addObserver(forName: .deviceBecameLocked, object: nil, queue: .main) { [weak self] _ in self?.displayLockScreen() @@ -269,11 +265,6 @@ final class PasswordManagementViewController: NSViewController { NSApp.sendAction(#selector(AppDelegate.openExportLogins(_:)), to: nil, from: sender) } - @IBAction func openExportBookmarksWindow(_ sender: Any) { - self.dismiss() - NSApp.sendAction(#selector(AppDelegate.openExportBookmarks(_:)), to: nil, from: nil) - } - @IBAction func onImportClicked(_ sender: NSButton) { self.dismiss() DataImportViewController.show() diff --git a/DuckDuckGo/SecureVault/View/PasswordManager.storyboard b/DuckDuckGo/SecureVault/View/PasswordManager.storyboard index 5b7ad39eb6..3216cb8ced 100644 --- a/DuckDuckGo/SecureVault/View/PasswordManager.storyboard +++ b/DuckDuckGo/SecureVault/View/PasswordManager.storyboard @@ -352,9 +352,7 @@ - - - + @@ -380,24 +378,11 @@ - + - - - - - - - - - - - - - - - - + + + From 198d4cc51269fa7b97d7a128243a592dfa74b0be Mon Sep 17 00:00:00 2001 From: Sabrina Tardio Date: Tue, 9 May 2023 14:51:08 +0200 Subject: [PATCH 3/9] remove space --- DuckDuckGo/Common/Localizables/UserText.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/DuckDuckGo/Common/Localizables/UserText.swift b/DuckDuckGo/Common/Localizables/UserText.swift index ddee47092f..2d6758ba4c 100644 --- a/DuckDuckGo/Common/Localizables/UserText.swift +++ b/DuckDuckGo/Common/Localizables/UserText.swift @@ -205,7 +205,6 @@ struct UserText { static let importBrowserData = NSLocalizedString("import.browser.data", value: "Import Bookmarks and Passwords…", comment: "Opens Import Browser Data dialog") static let exportLogins = NSLocalizedString("export.logins.data", value: "Export Logins", comment: "Opens Export Logins Data dialog") static let exportBookmarks = NSLocalizedString("export.bookmarks.menu.item", value: "Export Bookmarks", comment: "Export bookmarks menu item") - static let bookmarks = NSLocalizedString("bookmarks", value: "Bookmarks", comment: "Button for bookmarks") static let favorites = NSLocalizedString("favorites", value: "Favorites", comment: "Title text for the Favorites menu item") static let bookmarksOpenInNewTabs = NSLocalizedString("bookmarks.open.in.new.tabs", value: "Open in New Tabs", comment: "Open all bookmarks in folder in new tabs") From 8bb35dbba252ff4007faec60b7c5f26c1c542f96 Mon Sep 17 00:00:00 2001 From: Sabrina Tardio Date: Wed, 10 May 2023 11:47:56 +0200 Subject: [PATCH 4/9] use the word passwords and ellipses --- DuckDuckGo/Common/Localizables/UserText.swift | 10 +++++----- DuckDuckGo/Menus/MainMenu.storyboard | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/DuckDuckGo/Common/Localizables/UserText.swift b/DuckDuckGo/Common/Localizables/UserText.swift index 2d6758ba4c..5671e747da 100644 --- a/DuckDuckGo/Common/Localizables/UserText.swift +++ b/DuckDuckGo/Common/Localizables/UserText.swift @@ -203,8 +203,8 @@ struct UserText { static let passwordManagementUnlock = NSLocalizedString("passsword.management.unlock", value: "Unlock", comment: "Unlock Logins Vault menu") static let importBrowserData = NSLocalizedString("import.browser.data", value: "Import Bookmarks and Passwords…", comment: "Opens Import Browser Data dialog") - static let exportLogins = NSLocalizedString("export.logins.data", value: "Export Logins", comment: "Opens Export Logins Data dialog") - static let exportBookmarks = NSLocalizedString("export.bookmarks.menu.item", value: "Export Bookmarks", comment: "Export bookmarks menu item") + static let exportLogins = NSLocalizedString("export.logins.data", value: "Export Passwords…", comment: "Opens Export Logins Data dialog") + static let exportBookmarks = NSLocalizedString("export.bookmarks.menu.item", value: "Export Bookmarks…", comment: "Export bookmarks menu item") static let bookmarks = NSLocalizedString("bookmarks", value: "Bookmarks", comment: "Button for bookmarks") static let favorites = NSLocalizedString("favorites", value: "Favorites", comment: "Title text for the Favorites menu item") static let bookmarksOpenInNewTabs = NSLocalizedString("bookmarks.open.in.new.tabs", value: "Open in New Tabs", comment: "Open all bookmarks in folder in new tabs") @@ -493,12 +493,12 @@ struct UserText { static let downloadsActiveAlertMessageFormat = NSLocalizedString("downloads.active.alert.message.format", value: "Are you sure you want to quit? DuckDuckGo Privacy Browser is currently downloading “%@”%@. If you quit now DuckDuckGo Privacy Browser won’t finish downloading this file.", comment: "Alert text format when trying to quit application while file “filename”[, and others] are being downloaded") static let downloadsActiveAlertMessageAndOthers = NSLocalizedString("downloads.active.alert.message.and.others", value: ", and other files", comment: "Alert text format element for “, and other files”") - static let exportLoginsFailedMessage = NSLocalizedString("export.logins.failed.message", value: "Failed to Export Logins", comment: "Alert title when exporting login data fails") + static let exportLoginsFailedMessage = NSLocalizedString("export.logins.failed.message", value: "Failed to Export Passwords", comment: "Alert title when exporting login data fails") static let exportLoginsFailedInformative = NSLocalizedString("export.logins.failed.informative", value: "Please check that no file exists at the location you selected.", comment: "Alert message when exporting login data fails") - static let exportBookmarksFailedMessage = NSLocalizedString("export.bookmarks.failed.message", value: "Failed to Export Bookmarks", comment: "Alert title when exporting login data fails") + static let exportBookmarksFailedMessage = NSLocalizedString("export.bookmarks.failed.message", value: "Failed to Export Bookmarks…", comment: "Alert title when exporting login data fails") static let exportBookmarksFailedInformative = NSLocalizedString("export.bookmarks.failed.informative", value: "Please check that no file exists at the location you selected.", comment: "Alert message when exporting bookmarks fails") - static let exportLoginsFileNameSuffix = NSLocalizedString("export.logins.file.name.suffix", value: "Logins", comment: "The last part of the suggested file name for exporting logins") + static let exportLoginsFileNameSuffix = NSLocalizedString("export.logins.file.name.suffix", value: "Passwords", comment: "The last part of the suggested file name for exporting logins") static let exportBookmarksFileNameSuffix = NSLocalizedString("export.bookmarks.file.name.suffix", value: "Bookmarks", comment: "The last part of the suggested file for exporting bookmarks") static let exportLoginsWarning = NSLocalizedString("export.logins.warning", value: "This file contains your passwords in plain text and should be saved in a secure location and deleted when you are done.\nAnyone with access to this file will be able to read your passwords.", comment: "Warning text presented when exporting logins.") diff --git a/DuckDuckGo/Menus/MainMenu.storyboard b/DuckDuckGo/Menus/MainMenu.storyboard index cea57c0da4..a5c8793281 100644 --- a/DuckDuckGo/Menus/MainMenu.storyboard +++ b/DuckDuckGo/Menus/MainMenu.storyboard @@ -548,13 +548,13 @@ CA - + - + From 02f4235e478eedf0d04e2c965590d7566cfb4359 Mon Sep 17 00:00:00 2001 From: Sabrina Tardio Date: Wed, 10 May 2023 11:50:48 +0200 Subject: [PATCH 5/9] add func to mock class --- .../Menus/Mocks/CapturingOptionsButtonMenuDelegate.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/UnitTests/Menus/Mocks/CapturingOptionsButtonMenuDelegate.swift b/UnitTests/Menus/Mocks/CapturingOptionsButtonMenuDelegate.swift index 872a327c5b..f607b26560 100644 --- a/UnitTests/Menus/Mocks/CapturingOptionsButtonMenuDelegate.swift +++ b/UnitTests/Menus/Mocks/CapturingOptionsButtonMenuDelegate.swift @@ -20,6 +20,7 @@ import Foundation @testable import DuckDuckGo_Privacy_Browser class CapturingOptionsButtonMenuDelegate: OptionsButtonMenuDelegate { + var optionsButtonMenuRequestedPreferencesCalled = false var optionsButtonMenuRequestedAppearancePreferencesCalled = false @@ -67,4 +68,8 @@ class CapturingOptionsButtonMenuDelegate: OptionsButtonMenuDelegate { optionsButtonMenuRequestedAppearancePreferencesCalled = true } + func optionsButtonMenuRequestedBookmarkExportInterface(_ menu: NSMenu) { + + } + } From 597368647c9eec785f8e6c7fec5da82936900b31 Mon Sep 17 00:00:00 2001 From: Sabrina Tardio Date: Thu, 11 May 2023 09:45:12 +0200 Subject: [PATCH 6/9] update import text --- DuckDuckGo/Common/Localizables/UserText.swift | 4 +++- DuckDuckGo/Menus/MainMenu.storyboard | 2 +- DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift | 2 +- DuckDuckGo/NavigationBar/View/NavigationBar.storyboard | 4 ++-- DuckDuckGo/Preferences/View/PreferencesAutofillView.swift | 2 +- DuckDuckGo/SecureVault/View/PasswordManager.storyboard | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/DuckDuckGo/Common/Localizables/UserText.swift b/DuckDuckGo/Common/Localizables/UserText.swift index 5671e747da..7df3e8ef7e 100644 --- a/DuckDuckGo/Common/Localizables/UserText.swift +++ b/DuckDuckGo/Common/Localizables/UserText.swift @@ -202,7 +202,9 @@ struct UserText { static let passwordManagementLock = NSLocalizedString("passsword.management.lock", value: "Lock", comment: "Lock Logins Vault menu") static let passwordManagementUnlock = NSLocalizedString("passsword.management.unlock", value: "Unlock", comment: "Unlock Logins Vault menu") - static let importBrowserData = NSLocalizedString("import.browser.data", value: "Import Bookmarks and Passwords…", comment: "Opens Import Browser Data dialog") +// static let importBrowserData = NSLocalizedString("import.browser.data", value: "Import Bookmarks and Passwords…", comment: "Opens Import Browser Data dialog") + static let importBookmarks = NSLocalizedString("import.browser.data", value: "Import Bookmarks…", comment: "Opens Import Browser Data dialog") + static let importPasswords = NSLocalizedString("import.browser.data", value: "Import Passwords…", comment: "Opens Import Browser Data dialog") static let exportLogins = NSLocalizedString("export.logins.data", value: "Export Passwords…", comment: "Opens Export Logins Data dialog") static let exportBookmarks = NSLocalizedString("export.bookmarks.menu.item", value: "Export Bookmarks…", comment: "Export bookmarks menu item") static let bookmarks = NSLocalizedString("bookmarks", value: "Bookmarks", comment: "Button for bookmarks") diff --git a/DuckDuckGo/Menus/MainMenu.storyboard b/DuckDuckGo/Menus/MainMenu.storyboard index a5c8793281..0a55d9e350 100644 --- a/DuckDuckGo/Menus/MainMenu.storyboard +++ b/DuckDuckGo/Menus/MainMenu.storyboard @@ -548,7 +548,7 @@ CA - + diff --git a/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift b/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift index 624f2a36da..28a958ed3b 100644 --- a/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift +++ b/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift @@ -444,7 +444,7 @@ final class BookmarksSubMenu: NSMenu { addItem(NSMenuItem.separator()) - addItem(withTitle: UserText.importBrowserData, action: #selector(MoreOptionsMenu.openBookmarkImportInterface(_:)), keyEquivalent: "") + addItem(withTitle: UserText.importBookmarks, action: #selector(MoreOptionsMenu.openBookmarkImportInterface(_:)), keyEquivalent: "") .targetting(target) addItem(withTitle: UserText.exportBookmarks, action: #selector(MoreOptionsMenu.openBookmarkExportInterface(_:)), keyEquivalent: "") diff --git a/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard b/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard index d90015d5c5..aca4a16d11 100644 --- a/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard +++ b/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard @@ -1,7 +1,7 @@ - + - + diff --git a/DuckDuckGo/Preferences/View/PreferencesAutofillView.swift b/DuckDuckGo/Preferences/View/PreferencesAutofillView.swift index 14a0a136c9..0118ff1bf8 100644 --- a/DuckDuckGo/Preferences/View/PreferencesAutofillView.swift +++ b/DuckDuckGo/Preferences/View/PreferencesAutofillView.swift @@ -97,7 +97,7 @@ extension Preferences { } } Spacer() - Button(UserText.importBrowserData) { + Button(UserText.importPasswords) { model.openImportBrowserDataWindow() } Button(UserText.exportLogins) { diff --git a/DuckDuckGo/SecureVault/View/PasswordManager.storyboard b/DuckDuckGo/SecureVault/View/PasswordManager.storyboard index 3216cb8ced..74fbb94bf7 100644 --- a/DuckDuckGo/SecureVault/View/PasswordManager.storyboard +++ b/DuckDuckGo/SecureVault/View/PasswordManager.storyboard @@ -372,7 +372,7 @@ - + From 1f010c8192d1110d5345489c5f9670df0bf0adfe Mon Sep 17 00:00:00 2001 From: Sabrina Tardio Date: Fri, 12 May 2023 12:50:50 +0200 Subject: [PATCH 7/9] disable export when nothing to export --- DuckDuckGo/AppDelegate/AppDelegate.swift | 3 +- .../Bookmarks/View/Bookmarks.storyboard | 5 ++- DuckDuckGo/Menus/MainMenu.storyboard | 2 +- DuckDuckGo/Menus/MainMenuActions.swift | 32 +++++++++++++++++++ .../NavigationBar/View/MoreOptionsMenu.swift | 9 ++++-- .../View/PasswordManager.storyboard | 4 +-- 6 files changed, 45 insertions(+), 10 deletions(-) diff --git a/DuckDuckGo/AppDelegate/AppDelegate.swift b/DuckDuckGo/AppDelegate/AppDelegate.swift index 0832cbb564..73450674f0 100644 --- a/DuckDuckGo/AppDelegate/AppDelegate.swift +++ b/DuckDuckGo/AppDelegate/AppDelegate.swift @@ -59,6 +59,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, FileDownloadManagerDel private var appIconChanger: AppIconChanger! private(set) var syncService: DDGSyncing! private(set) var syncPersistence: SyncDataPersistor! + let bookmarksManager = LocalBookmarkManager.shared #if !APPSTORE var updateController: UpdateController! @@ -156,7 +157,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, FileDownloadManagerDel HistoryCoordinator.shared.loadHistory() PrivacyFeatures.httpsUpgrade.loadDataAsync() - LocalBookmarkManager.shared.loadBookmarks() + bookmarksManager.loadBookmarks() FaviconManager.shared.loadFavicons() ConfigurationManager.shared.start() FileDownloadManager.shared.delegate = self diff --git a/DuckDuckGo/Bookmarks/View/Bookmarks.storyboard b/DuckDuckGo/Bookmarks/View/Bookmarks.storyboard index b22407017e..cc99e43e63 100644 --- a/DuckDuckGo/Bookmarks/View/Bookmarks.storyboard +++ b/DuckDuckGo/Bookmarks/View/Bookmarks.storyboard @@ -1,8 +1,7 @@ - + - - + diff --git a/DuckDuckGo/Menus/MainMenu.storyboard b/DuckDuckGo/Menus/MainMenu.storyboard index 0a55d9e350..02fb1da1cf 100644 --- a/DuckDuckGo/Menus/MainMenu.storyboard +++ b/DuckDuckGo/Menus/MainMenu.storyboard @@ -554,7 +554,7 @@ CA - + diff --git a/DuckDuckGo/Menus/MainMenuActions.swift b/DuckDuckGo/Menus/MainMenuActions.swift index 5050760827..847b9db8a1 100644 --- a/DuckDuckGo/Menus/MainMenuActions.swift +++ b/DuckDuckGo/Menus/MainMenuActions.swift @@ -803,11 +803,43 @@ extension AppDelegate: NSMenuItemValidation { case #selector(AppDelegate.reopenAllWindowsFromLastSession(_:)): return stateRestorationManager.canRestoreLastSessionState + // Enables and disables export bookmarks itemz + case #selector(AppDelegate.openExportBookmarks(_:)): + return bookmarksManager.list?.totalBookmarks != 0 + + // Enables and disables export passwords items + case #selector(AppDelegate.openExportLogins(_:)): + return areTherePasswords + default: return true } } + private var areTherePasswords: Bool { + let vault = try? SecureVaultFactory.default.makeVault(errorReporter: SecureVaultErrorReporter.shared) + guard let vault else { + return false + } + let accounts = (try? vault.accounts()) ?? [] + if !accounts.isEmpty { + return true + } + let cards = (try? vault.creditCards()) ?? [] + if !cards.isEmpty { + return true + } + let notes = (try? vault.notes()) ?? [] + if !notes.isEmpty { + return true + } + let identities = (try? vault.identities()) ?? [] + if !identities.isEmpty { + return true + } + return false + } + } extension MainViewController: FindInPageDelegate { diff --git a/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift b/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift index 28a958ed3b..401010d566 100644 --- a/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift +++ b/DuckDuckGo/NavigationBar/View/MoreOptionsMenu.swift @@ -433,7 +433,8 @@ final class BookmarksSubMenu: NSMenu { addItem(NSMenuItem.separator()) } - guard let entities = LocalBookmarkManager.shared.list?.topLevelEntities else { + let bookmarkManager = LocalBookmarkManager.shared + guard let entities = bookmarkManager.list?.topLevelEntities else { return } @@ -447,8 +448,10 @@ final class BookmarksSubMenu: NSMenu { addItem(withTitle: UserText.importBookmarks, action: #selector(MoreOptionsMenu.openBookmarkImportInterface(_:)), keyEquivalent: "") .targetting(target) - addItem(withTitle: UserText.exportBookmarks, action: #selector(MoreOptionsMenu.openBookmarkExportInterface(_:)), keyEquivalent: "") - .targetting(target) + let exportBookmarItem = NSMenuItem(title: UserText.exportBookmarks, action: #selector(MoreOptionsMenu.openBookmarkExportInterface(_:)), keyEquivalent: "") + exportBookmarItem.isEnabled = bookmarkManager.list?.totalBookmarks != 0 + addItem(exportBookmarItem) + } private func bookmarkMenuItems(from bookmarkViewModels: [BookmarkViewModel], topLevel: Bool = true) -> [NSMenuItem] { diff --git a/DuckDuckGo/SecureVault/View/PasswordManager.storyboard b/DuckDuckGo/SecureVault/View/PasswordManager.storyboard index 74fbb94bf7..02099f612e 100644 --- a/DuckDuckGo/SecureVault/View/PasswordManager.storyboard +++ b/DuckDuckGo/SecureVault/View/PasswordManager.storyboard @@ -378,10 +378,10 @@ - + - + From 40b0692fa49165b861fa882dff2485b52361fdab Mon Sep 17 00:00:00 2001 From: Sabrina Tardio Date: Fri, 12 May 2023 13:06:28 +0200 Subject: [PATCH 8/9] fix app store build --- DuckDuckGo/Preferences/View/PreferencesAutofillView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DuckDuckGo/Preferences/View/PreferencesAutofillView.swift b/DuckDuckGo/Preferences/View/PreferencesAutofillView.swift index 0118ff1bf8..9fb9276f70 100644 --- a/DuckDuckGo/Preferences/View/PreferencesAutofillView.swift +++ b/DuckDuckGo/Preferences/View/PreferencesAutofillView.swift @@ -71,7 +71,7 @@ extension Preferences { model.showAutofillPopover() } #if APPSTORE - Button(UserText.importBrowserData) { + Button(UserText.importPasswords) { model.openImportBrowserDataWindow() } Button(UserText.exportLogins) { From 29625497c24b69194d7aa2809d1c667575a1e470 Mon Sep 17 00:00:00 2001 From: Sabrina Tardio Date: Tue, 16 May 2023 13:24:36 +0200 Subject: [PATCH 9/9] change login to passwords in file menu --- DuckDuckGo/Menus/MainMenu.storyboard | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DuckDuckGo/Menus/MainMenu.storyboard b/DuckDuckGo/Menus/MainMenu.storyboard index 02fb1da1cf..49c660ae00 100644 --- a/DuckDuckGo/Menus/MainMenu.storyboard +++ b/DuckDuckGo/Menus/MainMenu.storyboard @@ -130,7 +130,7 @@ - +