diff --git a/Modules/Package.swift b/Modules/Package.swift
index 02e73fbad4e3..4df8b818864f 100644
--- a/Modules/Package.swift
+++ b/Modules/Package.swift
@@ -45,7 +45,7 @@ let package = Package(
.package(url: "https://github.com/wordpress-mobile/MediaEditor-iOS", branch: "task/spm-support"),
.package(url: "https://github.com/wordpress-mobile/NSObject-SafeExpectations", from: "0.0.6"),
.package(url: "https://github.com/wordpress-mobile/NSURL-IDN", branch: "trunk"),
- .package(url: "https://github.com/wordpress-mobile/WordPressKit-iOS", branch: "wpios-edition"),
+ .package(url: "https://github.com/wordpress-mobile/WordPressKit-iOS", branch: "parse-page-order-property"),
.package(url: "https://github.com/zendesk/support_sdk_ios", from: "8.0.3"),
// We can't use wordpress-rs branches nor commits here. Only tags work.
.package(url: "https://github.com/Automattic/wordpress-rs", revision: "alpha-20250127"),
diff --git a/WordPress.xcworkspace/xcshareddata/swiftpm/Package.resolved b/WordPress.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 9b9551386cf0..daaa1a817a89 100644
--- a/WordPress.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/WordPress.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -1,5 +1,5 @@
{
- "originHash" : "b048f2348f14b6f12b4a4b8588355abe499af3f8f4e91cacc054e98187a7746c",
+ "originHash" : "22d0c1b3f7e39812921cdd883dd43d6502abbb0b8d294779f4db4f79c6ce80fb",
"pins" : [
{
"identity" : "alamofire",
@@ -391,8 +391,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/wordpress-mobile/WordPressKit-iOS",
"state" : {
- "branch" : "wpios-edition",
- "revision" : "ba542bae62a1d9b80b0baee44d610bfac55936ea"
+ "branch" : "parse-page-order-property",
+ "revision" : "7c2c1d0f2851eb6744376b4d61f03211826ed7f0"
}
},
{
diff --git a/WordPress/Classes/Models/AbstractPost.h b/WordPress/Classes/Models/AbstractPost.h
index 41ed30bc1b4d..6178226e463b 100644
--- a/WordPress/Classes/Models/AbstractPost.h
+++ b/WordPress/Classes/Models/AbstractPost.h
@@ -34,6 +34,7 @@ typedef NS_ENUM(NSUInteger, AbstractPostRemoteStatus) {
@property (weak, readonly) AbstractPost *revision;
@property (nonatomic, strong) NSSet *comments;
@property (nonatomic, strong, nullable) Media *featuredImage;
+@property (nonatomic, assign) NSInteger order;
/// This array will contain a list of revision IDs.
@property (nonatomic, strong, nullable) NSArray *revisions;
diff --git a/WordPress/Classes/Models/AbstractPost.m b/WordPress/Classes/Models/AbstractPost.m
index 55d68a55515b..966afe533af6 100644
--- a/WordPress/Classes/Models/AbstractPost.m
+++ b/WordPress/Classes/Models/AbstractPost.m
@@ -23,6 +23,7 @@ @implementation AbstractPost
@dynamic autosaveModifiedDate;
@dynamic autosaveIdentifier;
@dynamic foreignID;
+@dynamic order;
@synthesize voiceContent;
#pragma mark - Life Cycle Methods
diff --git a/WordPress/Classes/Services/PostHelper.m b/WordPress/Classes/Services/PostHelper.m
index e6b659aa0be4..fd85123cdc40 100644
--- a/WordPress/Classes/Services/PostHelper.m
+++ b/WordPress/Classes/Services/PostHelper.m
@@ -30,6 +30,7 @@ + (void)updatePost:(AbstractPost *)post withRemotePost:(RemotePost *)remotePost
post.content = remotePost.content;
post.status = remotePost.status;
post.password = remotePost.password;
+ post.order = remotePost.order;
if (remotePost.postThumbnailID != nil) {
post.featuredImage = [Media existingOrStubMediaWithMediaID: remotePost.postThumbnailID inBlog:post.blog];
diff --git a/WordPress/Classes/Utility/PageTree.swift b/WordPress/Classes/Utility/PageTree.swift
index 1c92e1613480..049cead400bd 100644
--- a/WordPress/Classes/Utility/PageTree.swift
+++ b/WordPress/Classes/Utility/PageTree.swift
@@ -2,10 +2,6 @@ final class PageTree {
// A node in a tree, which of course is also a tree itself.
private class TreeNode {
- struct PageData {
- var postID: NSNumber?
- var parentID: NSNumber?
- }
let page: Page
var children = [TreeNode]()
var parentNode: TreeNode?
@@ -16,7 +12,7 @@ final class PageTree {
func dfsList() -> [Page] {
var pages = [Page]()
- _ = depthFirstSearch { level, node in
+ _ = depthFirstSearch(sortByPageOrder: true) { level, node in
let page = node.page
page.hierarchyIndex = level
page.hasVisibleParent = node.parentNode != nil
@@ -32,18 +28,19 @@ final class PageTree {
/// a boolean value indicate whether the search should be stopped.
/// - Returns: `true` if search has been stopped by the closure.
@discardableResult
- func depthFirstSearch(using closure: (Int, TreeNode) -> Bool) -> Bool {
- depthFirstSearch(level: 0, using: closure)
+ func depthFirstSearch(sortByPageOrder: Bool, using closure: (Int, TreeNode) -> Bool) -> Bool {
+ depthFirstSearch(level: 0, sortByPageOrder: sortByPageOrder, using: closure)
}
- private func depthFirstSearch(level: Int, using closure: (Int, TreeNode) -> Bool) -> Bool {
+ private func depthFirstSearch(level: Int, sortByPageOrder: Bool, using closure: (Int, TreeNode) -> Bool) -> Bool {
let shouldStop = closure(level, self)
if shouldStop {
return true
}
- for child in children {
- let shouldStop = child.depthFirstSearch(level: level + 1, using: closure)
+ let pages = sortByPageOrder ? children.sorted(using: KeyPathComparator(\TreeNode.page.order)) : children
+ for child in pages {
+ let shouldStop = child.depthFirstSearch(level: level + 1, sortByPageOrder: sortByPageOrder, using: closure)
if shouldStop {
return true
}
diff --git a/WordPress/Classes/WordPress.xcdatamodeld/.xccurrentversion b/WordPress/Classes/WordPress.xcdatamodeld/.xccurrentversion
index 3d6139808000..80f88276341c 100644
--- a/WordPress/Classes/WordPress.xcdatamodeld/.xccurrentversion
+++ b/WordPress/Classes/WordPress.xcdatamodeld/.xccurrentversion
@@ -3,6 +3,6 @@
_XCCurrentVersionName
- WordPress 154.xcdatamodel
+ WordPress 155.xcdatamodel
diff --git a/WordPress/Classes/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents b/WordPress/Classes/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents
new file mode 100644
index 000000000000..b90e23b2197c
--- /dev/null
+++ b/WordPress/Classes/WordPress.xcdatamodeld/WordPress 155.xcdatamodel/contents
@@ -0,0 +1,883 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file