@@ -2,7 +2,7 @@ import CasePaths
22import SharingGRDB
33import SwiftUI
44
5- struct RemindersListDetailView : View {
5+ struct RemindersDetailView : View {
66 @FetchAll private var reminderStates : [ ReminderState ]
77 @AppStorage private var ordering : Ordering
88 @AppStorage private var showCompleted : Bool
@@ -46,6 +46,9 @@ struct RemindersListDetailView: View {
4646 tags: reminderState. tags
4747 )
4848 }
49+ . onMove { indexSet, index in
50+ move ( from: indexSet, to: index)
51+ }
4952 }
5053 . onScrollGeometryChange ( for: Bool . self) { geometry in
5154 geometry. contentOffset. y + geometry. contentInsets. top > navigationTitleHeight
@@ -126,13 +129,38 @@ struct RemindersListDetailView: View {
126129 }
127130 }
128131
132+ func move( from source: IndexSet , to destination: Int ) {
133+ withErrorReporting {
134+ try database. write { db in
135+ var ids = reminderStates. map ( \. reminder. id)
136+ ids. move ( fromOffsets: source, toOffset: destination)
137+ try Reminder
138+ . where { $0. id. in ( ids) }
139+ . update {
140+ let ids = Array ( ids. enumerated ( ) )
141+ let ( first, rest) = ( ids. first!, ids. dropFirst ( ) )
142+ $0. position =
143+ rest
144+ . reduce ( Case ( $0. id) . when ( first. element, then: first. offset) ) { cases, id in
145+ cases. when ( id. element, then: id. offset)
146+ }
147+ . else ( $0. position)
148+ }
149+ . execute ( db)
150+ }
151+ }
152+ ordering = . manual
153+ }
154+
129155 private enum Ordering : String , CaseIterable {
130156 case dueDate = " Due Date "
157+ case manual = " Manual "
131158 case priority = " Priority "
132159 case title = " Title "
133160 var icon : Image {
134161 switch self {
135162 case . dueDate: Image ( systemName: " calendar " )
163+ case . manual: Image ( systemName: " hand.draw " )
136164 case . priority: Image ( systemName: " chart.bar.fill " )
137165 case . title: Image ( systemName: " textformat.characters " )
138166 }
@@ -157,7 +185,7 @@ struct RemindersListDetailView: View {
157185
158186 fileprivate var remindersQuery : some StructuredQueriesCore . Statement < ReminderState > {
159187 let query =
160- Reminder
188+ Reminder
161189 . where {
162190 if !showCompleted {
163191 !$0. isCompleted
@@ -167,6 +195,7 @@ struct RemindersListDetailView: View {
167195 . order {
168196 switch ordering {
169197 case . dueDate: $0. dueDate
198+ case . manual: $0. position
170199 case . priority: ( $0. priority. desc ( ) , $0. isFlagged. desc ( ) )
171200 case . title: $0. title
172201 }
@@ -208,7 +237,7 @@ struct RemindersListDetailView: View {
208237 }
209238}
210239
211- extension RemindersListDetailView . DetailType {
240+ extension RemindersDetailView . DetailType {
212241 fileprivate var id : String {
213242 switch self {
214243 case . all: " all "
@@ -249,7 +278,7 @@ extension RemindersListDetailView.DetailType {
249278 }
250279}
251280
252- struct RemindersListDetailPreview : PreviewProvider {
281+ struct RemindersDetailPreview : PreviewProvider {
253282 static var previews : some View {
254283 let ( remindersList, tag) = try ! prepareDependencies {
255284 $0. defaultDatabase = try Reminders . appDatabase ( )
@@ -260,14 +289,14 @@ struct RemindersListDetailPreview: PreviewProvider {
260289 )
261290 }
262291 }
263- let detailTypes : [ RemindersListDetailView . DetailType ] = [
292+ let detailTypes : [ RemindersDetailView . DetailType ] = [
264293 . all,
265294 . list( remindersList) ,
266295 . tags( [ tag] ) ,
267296 ]
268297 ForEach ( detailTypes, id: \. self) { detailType in
269298 NavigationStack {
270- RemindersListDetailView ( detailType: detailType)
299+ RemindersDetailView ( detailType: detailType)
271300 }
272301 . previewDisplayName ( detailType. navigationTitle)
273302 }
0 commit comments