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
29 changes: 23 additions & 6 deletions Sources/WordPressData/Swift/Page.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,9 @@ public class Page: AbstractPost {

@objc public var isSiteHomepage: Bool {
guard let postID,
let homepageID = blog.homepagePageID,
let homepageType = blog.homepageType,
homepageType == .page else {
let homepageID = blog.homepagePageID,
let homepageType = blog.homepageType,
homepageType == .page else {
return false
}

Expand All @@ -56,12 +56,29 @@ public class Page: AbstractPost {

@objc public var isSitePostsPage: Bool {
guard let postID,
let postsPageID = blog.homepagePostsPageID,
let homepageType = blog.homepageType,
homepageType == .page else {
let postsPageID = blog.homepagePostsPageID,
let homepageType = blog.homepageType,
homepageType == .page else {
return false
}

return postsPageID == postID.intValue
}

// MARK: - Parent Page

/// Returns the display text for the parent page
public static func parentPageText(in context: NSManagedObjectContext, parentID: NSNumber) -> String? {
guard parentID.intValue > 0 else {
return nil
}
let request = NSFetchRequest<Page>(entityName: Page.entityName())
request.fetchLimit = 1
request.predicate = NSPredicate(format: "postID == %@", parentID)

guard let parent = try? context.fetch(request).first else {
return nil
}
return parent.titleForDisplay()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ class ParentPageSettingsViewController: UIViewController {
private var filteredRows: [ImmuTableSection]!
private var selectedPage: Page!

/// Called when the parent page selection changes
var onSelectionChanged: ((Page?) -> Void)?

override func viewDidLoad() {
super.viewDidLoad()

Expand Down Expand Up @@ -205,7 +208,16 @@ extension ParentPageSettingsViewController: UITableViewDelegate {
guard let row = sections[indexPath.section].rows[indexPath.row] as? Row else {
return
}
selectedPage.parentID = row.page?.postID

// Call the new closure if available
onSelectionChanged?(row.page)

// Maintain backward compatibility: update the page's parentID directly
// if onSelectionChanged is not set
if onSelectionChanged == nil {
selectedPage.parentID = row.page?.postID
}

tableView.reloadData()
}
}
Expand Down
110 changes: 110 additions & 0 deletions WordPress/Classes/ViewRelated/Post/ParentPagePicker.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import SwiftUI
import CoreData
import WordPressData
import WordPressShared
import WordPressUI

@MainActor
struct ParentPagePicker: View {
private let blog: Blog
private let currentPage: Page
private let onSelection: (Page?) -> Void

@State private var isLoading = true
@State private var pages: [Page] = []
@State private var error: Error?

init(blog: Blog, currentPage: Page, onSelection: @escaping (Page?) -> Void) {
self.blog = blog
self.currentPage = currentPage
self.onSelection = onSelection
}

var body: some View {
Group {
if isLoading {
ProgressView()
} else if let error {
EmptyStateView.failure(error: error) {
Task { await loadPages() }
}
} else {
ParentPageSettingsViewControllerWrapper(
pages: pages,
selectedPage: currentPage,
onSelection: onSelection
)
.ignoresSafeArea()
}
}
.navigationTitle(Strings.title)
.navigationBarTitleDisplayMode(.inline)
.task {
await loadPages()
}
}

private func loadPages() async {
do {
let request = NSFetchRequest<Page>(entityName: Page.entityName())
let filter = PostListFilter.publishedFilter()
request.predicate = filter.predicate(for: blog, author: .everyone)
request.sortDescriptors = filter.sortDescriptors

let context = ContextManager.shared.mainContext
var pages = try await PostRepository().buildPageTree(request: request)
.map { pageID, hierarchyIndex in
let page = try context.existingObject(with: pageID)
page.hierarchyIndex = hierarchyIndex
return page
}

// Remove the current page from the list (can't be its own parent)
if let index = pages.firstIndex(of: currentPage) {
pages = pages.remove(from: index)
}

self.pages = pages
self.isLoading = false
} catch {
wpAssertionFailure("Failed to fetch pages", userInfo: ["error": "\(error)"]) // This should never happen
self.error = error
self.isLoading = false
}
}
}

// MARK: - UIViewControllerRepresentable Wrapper

private struct ParentPageSettingsViewControllerWrapper: UIViewControllerRepresentable {
let pages: [Page]
let selectedPage: Page
let onSelection: (Page?) -> Void

func makeUIViewController(context: Context) -> ParentPageSettingsViewController {
guard let viewController = ParentPageSettingsViewController.make(
with: pages,
selectedPage: selectedPage
) as? ParentPageSettingsViewController else {
fatalError("Expected ParentPageSettingsViewController")
}
viewController.onSelectionChanged = { selectedParentPage in
onSelection(selectedParentPage)
}
return viewController
}

func updateUIViewController(_ uiViewController: ParentPageSettingsViewController, context: Context) {
// No updates needed
}
}

// MARK: - Localized Strings

private enum Strings {
static let title = NSLocalizedString(
"parentPagePicker.title",
value: "Parent Page",
comment: "Title for the parent page picker screen"
)
}
20 changes: 20 additions & 0 deletions WordPress/Classes/ViewRelated/Post/PostSettings/PostSettings.swift
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,9 @@ struct PostSettings: Hashable {
/// Applies the settings to an AbstractPost instance.
/// Only updates properties that have actually changed.
func apply(to post: AbstractPost) {
if post.mt_excerpt != excerpt {
post.mt_excerpt = excerpt
}
if post.wp_slug != slug {
post.wp_slug = slug
}
Expand Down Expand Up @@ -116,6 +119,23 @@ struct PostSettings: Hashable {
}
post.categories = Set(selectedCategories)
}

// Update post format
if post.postFormat != postFormat {
post.postFormat = postFormat
}

// Update sticky post setting
if post.isStickyPost != isStickyPost {
post.isStickyPost = isStickyPost
}
}

// Apply page-specific settings
if let page = post as? Page {
if page.parentID?.intValue != parentPageID {
page.parentID = parentPageID.map { NSNumber(value: $0) }
}
}
}

Expand Down
Loading