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
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,18 @@ struct SiteSwitcherView: View {
SiteSwitcherToolbarView(viewModel: viewModel)
}
}
.searchable(text: $viewModel.searchText, placement: .navigationBarDrawer(displayMode: .always))
.searchable(text: $viewModel.searchText, placement: searchPlacemenet)
.navigationTitle(Strings.navigationTitle)
.navigationBarTitleDisplayMode(.inline)
}

private var searchPlacemenet: SearchFieldPlacement {
if #available(iOS 26, *) {
.automatic
} else {
.navigationBarDrawer(displayMode: .always)
}
}
}

private struct SiteSwitcherToolbarView: View {
Expand All @@ -108,12 +116,19 @@ private struct SiteSwitcherToolbarView: View {
Spacer()
button
.padding(.trailing, 20)
.padding(.bottom, UIDevice.current.userInterfaceIdiom == .pad ? 20 : 0)
.padding(.bottom, bottomOffset)
.accessibilityIdentifier("add-site-button")
}
}
}

private var bottomOffset: CGFloat {
if #available(iOS 26, *) {
return 20
}
return UIDevice.current.userInterfaceIdiom == .pad ? 20 : 0
}

@ViewBuilder
private var button: some View {
let viewModel = AddSiteMenuViewModel(onSelection: viewModel.onAddSiteTapped)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ struct BooleanUserDefaultsDebugView: View {
}
}
.navigationTitle(Strings.title)
.searchable(text: $viewModel.searchQuery, placement: .navigationBarDrawer(displayMode: .always))
.searchable(text: $viewModel.searchQuery)
.onAppear {
viewModel.load()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ struct DebugFeatureFlagsView: View {
}
.tint(Color(UIAppColor.jetpackGreen))
.listStyle(.plain)
.searchable(text: $viewModel.filterTerm, placement: .navigationBarDrawer(displayMode: .always))
.searchable(text: $viewModel.filterTerm)
.navigationTitle(navigationTitle)
.navigationBarTitleDisplayMode(.inline)
.toolbarTitleMenu {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ struct RemoteConfigDebugView: View {
listContent
}
.listStyle(.plain)
.searchable(text: $viewModel.searchText, placement: .navigationBarDrawer(displayMode: .always))
.searchable(text: $viewModel.searchText)
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button(Strings.reset, action: viewModel.resetAll)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,12 @@ final class SiteMediaCollectionViewController: UIViewController, NSFetchedResult
didMove(toParent: parentViewController)

parentViewController.navigationItem.searchController = searchController

#if compiler(>=6.2)
if #available(iOS 26, *) {
parentViewController.navigationItem.preferredSearchBarPlacement = traitCollection.horizontalSizeClass == .regular ? .integrated : .integratedButton
}
#endif
}

override func viewDidLoad() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import UIKit
import WordPressData

struct SiteMediaFilter {
struct SiteMediaFilter: Equatable {
let mediaType: MediaType?
let title: String
let imageName: String?
Expand All @@ -18,7 +18,7 @@ struct SiteMediaFilter {
}

private enum Strings {
static let filterAll = NSLocalizedString("mediaLibrary.filterAll", value: "All", comment: "The name of the media filter")
static let filterAll = NSLocalizedString("mediaLibrary.filterDefault", value: "Default (All)", comment: "The name of the media filter")
static let filterImages = NSLocalizedString("mediaLibrary.filterImages", value: "Images", comment: "The name of the media filter")
static let filterVideos = NSLocalizedString("mediaLibrary.filterVideos", value: "Videos", comment: "The name of the media filter")
static let filterDocuments = NSLocalizedString("mediaLibrary.filterDocuments", value: "Documents", comment: "The name of the media filter")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,19 @@ final class SiteMediaViewController: UIViewController, SiteMediaCollectionViewCo
private lazy var collectionViewController = SiteMediaCollectionViewController(blog: blog)
private lazy var buttonAddMedia = UIButton(type: .custom)
private lazy var buttonAddMediaMenuController = SiteMediaAddMediaMenuController(blog: blog, coordinator: coordinator)
private var buttonFilter: UIButton?

private lazy var toolbarItemDelete = UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(buttonDeleteTapped))
private lazy var toolbarItemTitle = SiteMediaSelectionTitleView()
private lazy var toolbarItemShare = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(buttonShareTapped))

var searchBarButtonItem: UIBarButtonItem? {
didSet { refreshNavigationItems() }
}

private var isPreparingToShare = false
private var isFirstAppearance = true
private var showPicker = false
private var selectedFilter: SiteMediaFilter?

@objc init(blog: Blog, showPicker: Bool = false) {
self.blog = blog
Expand Down Expand Up @@ -71,30 +75,7 @@ final class SiteMediaViewController: UIViewController, SiteMediaCollectionViewCo
// MARK: - Configuration

private func configureNavigationTitle() {
let menu = UIMenu(children: [
UIMenu(options: [.displayInline], children: SiteMediaFilter.allFilters.map { filter in
UIAction(title: filter.title, image: filter.image) { [weak self] _ in
self?.didUpdateFilter(filter)
}
}),
UIDeferredMenuElement.uncached { [weak self] in
let isAspect = UserDefaults.standard.isMediaAspectRatioModeEnabled
let action = UIAction(
title: isAspect ? Strings.squareGrid : Strings.aspectRatioGrid,
image: UIImage(systemName: isAspect ? "rectangle.arrowtriangle.2.outward" : "rectangle.arrowtriangle.2.inward")) { [weak self] _ in
self?.collectionViewController.toggleAspectRatioMode()
}
$0([action])
}
])

let button = UIButton.makeMenu(title: Strings.title, menu: menu)
self.buttonFilter = button
if traitCollection.horizontalSizeClass == .regular {
navigationItem.leftBarButtonItem = UIBarButtonItem(customView: button)
} else {
navigationItem.titleView = button
}
title = Strings.title
}

private func configureAddMediaButton() {
Expand All @@ -111,30 +92,65 @@ final class SiteMediaViewController: UIViewController, SiteMediaCollectionViewCo
private func refreshNavigationItems() {
navigationItem.hidesBackButton = isEditing

navigationItem.rightBarButtonItems = {
var rightBarButtonItems: [UIBarButtonItem] = []
var groups: [UIBarButtonItemGroup] = []

if !isEditing {
let selectButton = UIBarButtonItem(title: Strings.select, style: .plain, target: self, action: #selector(buttonSelectTapped))
groups.append(UIBarButtonItemGroup(barButtonItems: [selectButton], representativeItem: nil))
}

groups.append(UIBarButtonItemGroup(barButtonItems: {
var items: [UIBarButtonItem] = []

if !isEditing {
items.append(makeFiltersBarButtonItem())
}

if !isEditing, blog.userCanUploadMedia {
configureAddMediaButton()
rightBarButtonItems.append(UIBarButtonItem(customView: buttonAddMedia))

items.append(UIBarButtonItem(customView: buttonAddMedia))
}

if isEditing {
let doneButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(buttonDoneTapped))
rightBarButtonItems.append(doneButton)
} else {
let selectButton = UIBarButtonItem(title: Strings.select, style: .plain, target: self, action: #selector(buttonSelectTapped))
rightBarButtonItems.append(selectButton)
items.append(doneButton)
}
return items
}(), representativeItem: nil))

return rightBarButtonItems
}()
navigationItem.trailingItemGroups = groups
}

private func makeFiltersBarButtonItem() -> UIBarButtonItem {
let menu = UIMenu(children: [
UIMenu(options: [.displayInline], children: SiteMediaFilter.allFilters.map { filter in
let action = UIAction(title: filter.title, image: filter.image) { [weak self] _ in
self?.didUpdateFilter(filter)
}
if selectedFilter?.mediaType == filter.mediaType {
action.state = .on
}
return action
}),
UIDeferredMenuElement.uncached { [weak self] in
let isAspect = UserDefaults.standard.isMediaAspectRatioModeEnabled
let action = UIAction(
title: isAspect ? Strings.squareGrid : Strings.aspectRatioGrid,
image: UIImage(systemName: isAspect ? "rectangle.arrowtriangle.2.outward" : "rectangle.arrowtriangle.2.inward")) { [weak self] _ in
self?.collectionViewController.toggleAspectRatioMode()
}
$0([action])
}
])

return UIBarButtonItem(image: UIImage(systemName: "line.3.horizontal.decrease"), menu: menu)
}

private func didUpdateFilter(_ filter: SiteMediaFilter) {
buttonFilter?.setTitle(filter.title, for: .normal)
buttonFilter?.sizeToFit() // Important!
collectionViewController.setMediaType(filter.mediaType)
selectedFilter = filter
refreshNavigationItems()
}

// MARK: - Actions
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,12 @@ class AbstractPostListViewController: UIViewController,

searchResultsViewController.configure(searchController, self as? InteractivePostViewDelegate)

#if compiler(>=6.2)
if #available(iOS 26, *) {
navigationItem.preferredSearchBarPlacement = traitCollection.horizontalSizeClass == .regular ? .integrated : .integratedButton
}
#endif

definesPresentationContext = true
navigationItem.searchController = searchController
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ final class AuthorFilterButton: UIControl {
private func commonInit() {
addSubview(authorImageView)
NSLayoutConstraint.activate([
authorImageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: Metrics.leadingPadding),
authorImageView.centerXAnchor.constraint(equalTo: centerXAnchor),
authorImageView.centerYAnchor.constraint(equalTo: centerYAnchor),
authorImageView.widthAnchor.constraint(equalToConstant: Metrics.gravatarSize.width),
authorImageView.heightAnchor.constraint(equalToConstant: Metrics.gravatarSize.height),
Expand All @@ -82,7 +82,6 @@ final class AuthorFilterButton: UIControl {
private enum Metrics {
static let contentSize = CGSize(width: 44.0, height: 44.0)
static let gravatarSize = CGSize(width: 28.0, height: 28.0)
static let leadingPadding: CGFloat = 12.0
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ class AuthorFilterViewController: UITableViewController {
}

private enum Metrics {
static let rowHeight: CGFloat = 44.0
static let rowHeight: CGFloat = if #available(iOS 26, *) { 60.0 } else { 44.0 }
static let preferredWidth: CGFloat = 220.0
static let topinset: CGFloat = 13.0
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ struct TimeZoneSelectorView: View {
}
}
.listStyle(.plain)
.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
.searchable(text: $searchText)
.navigationTitle(Strings.title)
.navigationBarTitleDisplayMode(.inline)
.overlay {
Expand Down