diff --git a/phpmon/Modules/Domain List/UI/DomainListVC+Actions.swift b/phpmon/Modules/Domain List/UI/DomainListVC+Actions.swift index 16aa9a9..ba2dfb2 100644 --- a/phpmon/Modules/Domain List/UI/DomainListVC+Actions.swift +++ b/phpmon/Modules/Domain List/UI/DomainListVC+Actions.swift @@ -110,6 +110,22 @@ extension DomainListVC { } } + @objc func toggleExtension(sender: ExtensionMenuItem) { + Task { + self.setUIBusy() + + await sender.phpExtension?.toggle() + + if Preferences.isEnabled(.autoServiceRestartAfterExtensionToggle) { + await Actions.restartPhpFpm() + } + + reloadContextMenu() + + self.setUINotBusy() + } + } + @objc func isolateSite(sender: PhpMenuItem) { guard let site = selectedSite else { return diff --git a/phpmon/Modules/Domain List/UI/DomainListVC+ContextMenu.swift b/phpmon/Modules/Domain List/UI/DomainListVC+ContextMenu.swift index dbcccb2..ba00710 100644 --- a/phpmon/Modules/Domain List/UI/DomainListVC+ContextMenu.swift +++ b/phpmon/Modules/Domain List/UI/DomainListVC+ContextMenu.swift @@ -42,7 +42,20 @@ extension DomainListVC { addDisabledIsolation(to: menu) } + addSeparator(to: menu) + + if let extensions = site.isolatedPhpVersion?.extensions ?? PhpEnvironments.phpInstall?.extensions, + let version = site.isolatedPhpVersion?.versionNumber.short ?? PhpEnvironments.phpInstall?.version.short { + menu.addItem(HeaderView.asMenuItem(text: "mi_detected_extensions".localized)) + addMenuItemsForExtensions( + to: menu, + for: extensions, + version: version + ) + } + menu.addItem(HeaderView.asMenuItem(text: "domain_list.actions".localized)) + addToggleSecure(to: menu, secured: site.secured) addUnlink(to: menu, with: site) @@ -150,6 +163,28 @@ extension DomainListVC { ) } + private func addMenuItemsForExtensions(to menu: NSMenu, for extensions: [PhpExtension], version: String) { + var items: [NSMenuItem] = [ + NSMenuItem(title: "domain_list.applies_to".localized(version)) + ] + + for phpExtension in extensions { + let item = ExtensionMenuItem( + title: "\(phpExtension.name) (\(phpExtension.fileNameOnly))", + action: #selector(self.toggleExtension), + keyEquivalent: "" + ) + + item.state = phpExtension.enabled ? .on : .off + item.phpExtension = phpExtension + + items.append(item) + } + + menu.addItem(NSMenuItem(title: "domain_list.extensions".localized, submenu: items)) + menu.addItem(NSMenuItem.separator()) + } + // MARK: - Menu Items for Proxy private func addMenuItemsForProxy(_ proxy: ValetProxy) { diff --git a/phpmon/en.lproj/Localizable.strings b/phpmon/en.lproj/Localizable.strings index 1d5aee1..99b0223 100644 --- a/phpmon/en.lproj/Localizable.strings +++ b/phpmon/en.lproj/Localizable.strings @@ -264,6 +264,9 @@ You may be asked for your password during the uninstallation process if file per "domain_list.columns.kind" = "Kind"; "domain_list.columns.project_type" = "Project Type"; +"domain_list.extensions" = "Toggle Extensions"; +"domain_list.applies_to" = "Applies to PHP %@"; + // CHOOSE WHAT TO ADD "selection.title" = "What kind of domain would you like to set up?";