@@ -24,6 +24,7 @@ class MapUndoManager {
2424
2525 func undo( for id: Int64 , type: ElementType ) {
2626 MapUndoManager . shared. isUndoInProgress = true
27+
2728 switch type {
2829 case . way:
2930 guard let original = DatabaseConnector . shared. getWay ( id: Int ( id) , version: . original) ,
@@ -32,15 +33,26 @@ class MapUndoManager {
3233 return
3334 }
3435
35- try ? realm. write {
36- edited. tags. removeAll ( )
37- original. tags. forEach { edited. tags [ $0. key] = $0. value }
36+ do {
37+ try realm. write {
38+ edited. tags. removeAll ( )
39+
40+ for entry in original. tags {
41+ let key = entry. key
42+ let value = entry. value
43+ if key != " ext:gig_complete " , key != " ext:gig_last_updated " {
44+ edited. tags [ key] = value
45+ }
46+ }
3847
39- edited. polyline. removeAll ( )
40- edited. polyline. append ( objectsIn: original. polyline)
48+ edited. polyline. removeAll ( )
49+ edited. polyline. append ( objectsIn: original. polyline)
4150
42- edited. nodes. removeAll ( )
43- edited. nodes. append ( objectsIn: original. nodes)
51+ edited. nodes. removeAll ( )
52+ edited. nodes. append ( objectsIn: original. nodes)
53+ }
54+ } catch {
55+ print ( " ❌ Realm write failed during undo (way): \( error) " )
4456 }
4557
4658 updateTagsHandler ? ( id, edited. tags. toDictionary ( ) , . way)
@@ -52,10 +64,25 @@ class MapUndoManager {
5264 return
5365 }
5466
55- try ? realm. write {
56- edited. tags. removeAll ( )
57- original. tags. forEach { edited. tags [ $0. key] = $0. value }
58- edited. point = original. point
67+ do {
68+ try realm. write {
69+ // Step 1: Clear all tags in edited
70+ edited. tags. removeAll ( )
71+
72+ // Step 2: Copy original tags except gig tags
73+ for entry in original. tags {
74+ let key = entry. key
75+ let value = entry. value
76+ if key != " ext:gig_complete " , key != " ext:gig_last_updated " {
77+ edited. tags [ key] = value
78+ }
79+ }
80+
81+ // Step 3: Restore location
82+ edited. point = original. point
83+ }
84+ } catch {
85+ print ( " ❌ Realm write failed during undo (node): \( error) " )
5986 }
6087
6188 updateTagsHandler ? ( id, edited. tags. toDictionary ( ) , . node)
@@ -66,53 +93,40 @@ class MapUndoManager {
6693 }
6794
6895
96+
97+
98+ func fetchUndoItems( ) -> [ UndoItem ] {
99+ var items : [ UndoItem ] = [ ]
100+
101+
102+
103+
104+ return items
105+
106+ }
107+
69108
70109 func getUndoItems( ) -> [ UndoItem ] {
71- let excludedKeys : Set < String > = [ " ext:gig_complete " , " ext:gig_last_updated " ]
72110 var items : [ UndoItem ] = [ ]
73111
74- let editedNodes = realm. objects ( StoredNode . self)
112+ let editedNodes = realm. objects ( StoredNode . self) . filter ( " isOriginal == false " )
75113 for edited in editedNodes {
76- guard let original = DatabaseConnector . shared. getNode ( id: edited. id, version: . original) else {
77- print ( " ⚠️ Original node not found for id: \( edited. id) " )
78- continue
79- }
80-
81- let changedKeys = Set ( edited. tags. keys)
82- . union ( original. tags. keys)
83- . filter { key in
84- edited. tags [ key] != original. tags [ key] && !excludedKeys. contains ( key)
85- }
86-
87- if !changedKeys. isEmpty {
88- items. append ( UndoItem ( elementId: edited. id, type: . node, changedKeys: Array ( changedKeys) ) )
114+ let keys = Array ( edited. tags. keys)
115+ if !keys. isEmpty {
116+ items. append ( UndoItem ( elementId: edited. id, type: . node, changedKeys: keys) )
89117 }
90118 }
91119
92- let editedWays = realm. objects ( StoredWay . self)
120+ let editedWays = realm. objects ( StoredWay . self) . filter ( " isOriginal == false " )
93121 for edited in editedWays {
94- guard let original = DatabaseConnector . shared. getWay ( id: edited. id, version: . original) else {
95- print ( " ⚠️ Original way not found for id: \( edited. id) " )
96- continue
97- }
98-
99- let changedKeys = Set ( edited. tags. keys)
100- . union ( original. tags. keys)
101- . filter { key in
102- edited. tags [ key] != original. tags [ key] && !excludedKeys. contains ( key)
103- }
104-
105- if !changedKeys. isEmpty {
106- items. append ( UndoItem ( elementId: edited. id, type: . way, changedKeys: Array ( changedKeys) ) )
122+ let keys = Array ( edited. tags. keys)
123+ if !keys. isEmpty {
124+ items. append ( UndoItem ( elementId: edited. id, type: . way, changedKeys: keys) )
107125 }
108126 }
109127
110128 return items
111129 }
112-
113-
114-
115-
116130}
117131
118132extension MapUndoManager {
0 commit comments