Skip to content

Commit 1bc63c6

Browse files
committed
Fix failing tests after TypeScript migration
Fix 11 failing tests that were introduced during the TypeScript migration: - Remove stub _isRelevantForRemoval() from Mode.Rotate.ts that was overriding the real implementation from Mode.Removal.ts. This was the root cause of removal mode not working - the mixin system applies mixins in order and Rotate comes after Removal, so the stub method that always returned false was preventing layers from being marked as removable. - Remove stub event fire methods from Mode.Edit, Mode.Drag, and Mode.Rotate that were potentially interfering with the EventMixin implementations. - Add explicit remove() method to L.PM.Edit.Text.ts for the removeIfEmpty functionality which was previously relying on inheritance. All 333 Cypress tests now pass.
1 parent 7e1e56b commit 1bc63c6

File tree

5 files changed

+39
-73
lines changed

5 files changed

+39
-73
lines changed

src/js/Edit/L.PM.Edit.Text.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,22 @@ const EditText = (
463463
_preventTextSelection(e: Event) {
464464
e.preventDefault();
465465
},
466+
467+
remove(this: IEditText) {
468+
const map = (this._map ||
469+
(this._layer as unknown as { _map: ExtendedMap })._map) as ExtendedMap;
470+
// Fire remove events before removing the layer
471+
this._layer.fire('pm:remove', {
472+
layer: this._layer,
473+
shape: this._shape,
474+
});
475+
map.fire('pm:remove', {
476+
layer: this._layer,
477+
shape: this._shape,
478+
});
479+
// Remove the layer from the map
480+
this._layer.remove();
481+
},
466482
});
467483

468484
// Assign to Edit class

src/js/Mixins/Modes/Mode.Drag.ts

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,8 @@ export interface IGlobalDragMode {
5858
_fireGlobalDragModeToggled(enabled: boolean): void;
5959
}
6060

61-
const GlobalDragMode: IGlobalDragMode = {
61+
const GlobalDragMode = {
6262
_globalDragModeEnabled: false,
63-
_addedLayersDrag: {},
64-
map: null as unknown as L.Map,
65-
Toolbar: null as unknown as IGlobalDragMode['Toolbar'],
6663
enableGlobalDragMode(this: IGlobalDragMode) {
6764
const layers = L.PM.Utils.findLayers(this.map);
6865

@@ -162,9 +159,6 @@ const GlobalDragMode: IGlobalDragMode = {
162159
!!layer.pm.options.draggable
163160
);
164161
},
165-
_fireGlobalDragModeToggled() {
166-
// Implemented in Events mixin
167-
},
168162
};
169163

170164
export default GlobalDragMode;

src/js/Mixins/Modes/Mode.Edit.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,8 @@ export interface IGlobalEditMode {
6868
}
6969

7070
// this mixin adds a global edit mode to the map
71-
const GlobalEditMode: IGlobalEditMode = {
71+
const GlobalEditMode = {
7272
_globalEditModeEnabled: false,
73-
_addedLayersEdit: {},
74-
map: null as unknown as L.Map,
75-
globalOptions: {},
76-
Toolbar: null as unknown as IGlobalEditMode['Toolbar'],
7773
enableGlobalEditMode(this: IGlobalEditMode, o?: GlobalOptions) {
7874
const options = {
7975
...o,
@@ -197,9 +193,6 @@ const GlobalEditMode: IGlobalEditMode = {
197193
!!layer.pm.options.allowEditing
198194
);
199195
},
200-
_fireGlobalEditModeToggled() {
201-
// Implemented in Events mixin
202-
},
203196
};
204197

205198
export default GlobalEditMode;

src/js/Mixins/Modes/Mode.Removal.ts

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ declare const L: typeof import('leaflet') & {
33
PM: {
44
optIn: boolean;
55
};
6+
stamp: (obj: object) => number;
67
Util: {
7-
stamp: (obj: object) => number;
88
throttle: <T>(fn: T, time: number, context?: unknown) => T;
99
};
1010
};
@@ -77,21 +77,17 @@ export interface IGlobalRemovalMode {
7777
_fireRemoveLayerGroup(layerOrMap: L.Layer | L.Map, layer?: L.Layer): void;
7878
}
7979

80-
const GlobalRemovalMode: IGlobalRemovalMode = {
80+
const GlobalRemovalMode = {
8181
_globalRemovalModeEnabled: false,
82-
_addedLayersRemoval: {},
83-
map: null as unknown as ExtendedMap,
84-
Toolbar: null as unknown as IGlobalRemovalMode['Toolbar'],
8582
enableGlobalRemovalMode(this: IGlobalRemovalMode) {
8683
this._globalRemovalModeEnabled = true;
8784
// handle existing layers
8885
this.map.eachLayer((layer) => {
89-
const pmLayer = layer as PMLayer;
90-
if (this._isRelevantForRemoval(pmLayer)) {
91-
if (pmLayer.pm?.enabled()) {
92-
pmLayer.pm.disable();
86+
if (this._isRelevantForRemoval(layer as PMLayer)) {
87+
if ((layer as PMLayer).pm!.enabled()) {
88+
(layer as PMLayer).pm!.disable();
9389
}
94-
pmLayer.on('click', this.removeLayer as L.LeafletEventHandlerFn, this);
90+
layer.on('click', this.removeLayer, this);
9591
}
9692
});
9793

@@ -105,16 +101,8 @@ const GlobalRemovalMode: IGlobalRemovalMode = {
105101
// save the added layers into the _addedLayersRemoval array, to read it later out
106102
this._addedLayersRemoval = {};
107103
// handle layers that are added while in removal mode
108-
this.map.on(
109-
'layeradd',
110-
this._layerAddedRemoval as L.LeafletEventHandlerFn,
111-
this
112-
);
113-
this.map.on(
114-
'layeradd',
115-
this.throttledReInitRemoval as L.LeafletEventHandlerFn,
116-
this
117-
);
104+
this.map.on('layeradd', this._layerAddedRemoval, this);
105+
this.map.on('layeradd', this.throttledReInitRemoval, this);
118106

119107
// toogle the button in the toolbar if this is called programatically
120108
this.Toolbar.toggleButton('removalMode', this.globalRemovalModeEnabled());
@@ -124,20 +112,12 @@ const GlobalRemovalMode: IGlobalRemovalMode = {
124112
disableGlobalRemovalMode(this: IGlobalRemovalMode) {
125113
this._globalRemovalModeEnabled = false;
126114
this.map.eachLayer((layer) => {
127-
layer.off('click', this.removeLayer as L.LeafletEventHandlerFn, this);
115+
layer.off('click', this.removeLayer, this);
128116
});
129117

130118
// remove map handler
131-
this.map.off(
132-
'layeradd',
133-
this._layerAddedRemoval as L.LeafletEventHandlerFn,
134-
this
135-
);
136-
this.map.off(
137-
'layeradd',
138-
this.throttledReInitRemoval as L.LeafletEventHandlerFn,
139-
this
140-
);
119+
this.map.off('layeradd', this._layerAddedRemoval, this);
120+
this.map.off('layeradd', this.throttledReInitRemoval, this);
141121

142122
// toogle the button in the toolbar if this is called programatically
143123
this.Toolbar.toggleButton('removalMode', this.globalRemovalModeEnabled());
@@ -164,7 +144,7 @@ const GlobalRemovalMode: IGlobalRemovalMode = {
164144
// only remove layer, if it's handled by leaflet-geoman,
165145
// not a tempLayer and not currently being dragged
166146
const removeable =
167-
this._isRelevantForRemoval(layer) && !layer.pm?.dragging();
147+
this._isRelevantForRemoval(layer) && !layer.pm!.dragging();
168148

169149
if (removeable) {
170150
layer.removeFrom(this.map.pm._getContainingLayer() as L.Map);
@@ -173,19 +153,19 @@ const GlobalRemovalMode: IGlobalRemovalMode = {
173153
this._fireRemoveLayerGroup(layer);
174154
this._fireRemoveLayerGroup(this.map, layer);
175155
} else {
176-
layer.pm?._fireRemove(layer);
177-
layer.pm?._fireRemove(this.map, layer);
156+
layer.pm!._fireRemove(layer);
157+
layer.pm!._fireRemove(this.map, layer);
178158
}
179159
}
180160
},
181161
_isRelevantForRemoval(layer: PMLayer) {
182162
return (
183-
!!layer.pm &&
163+
layer.pm &&
184164
!(layer instanceof L.LayerGroup) &&
185165
((!L.PM.optIn && !layer.options.pmIgnore) || // if optIn is not set / true and pmIgnore is not set / true (default)
186166
(L.PM.optIn && layer.options.pmIgnore === false)) && // if optIn is true and pmIgnore is false
187167
!layer._pmTempLayer &&
188-
!!layer.pm.options.allowRemoval
168+
layer.pm.options.allowRemoval
189169
);
190170
},
191171
handleLayerAdditionInGlobalRemovalMode(this: IGlobalRemovalMode) {
@@ -195,22 +175,16 @@ const GlobalRemovalMode: IGlobalRemovalMode = {
195175
for (const id in layers) {
196176
const layer = layers[id];
197177
if (this._isRelevantForRemoval(layer)) {
198-
if (layer.pm?.enabled()) {
199-
layer.pm.disable();
178+
if (layer.pm!.enabled()) {
179+
layer.pm!.disable();
200180
}
201-
layer.on('click', this.removeLayer as L.LeafletEventHandlerFn, this);
181+
layer.on('click', this.removeLayer, this);
202182
}
203183
}
204184
}
205185
},
206186
_layerAddedRemoval(this: IGlobalRemovalMode, { layer }: LayerAddEvent) {
207-
this._addedLayersRemoval[L.Util.stamp(layer)] = layer;
208-
},
209-
_fireGlobalRemovalModeToggled() {
210-
// Implemented in Events mixin
211-
},
212-
_fireRemoveLayerGroup() {
213-
// Implemented in Events mixin
187+
this._addedLayersRemoval[L.stamp(layer)] = layer;
214188
},
215189
};
216190

src/js/Mixins/Modes/Mode.Rotate.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,13 @@ export interface IGlobalRotateMode {
5353
globalRotateModeEnabled(): boolean;
5454
toggleGlobalRotateMode(): void;
5555
_isRelevantForRotate(layer: PMLayer): boolean;
56-
_isRelevantForRemoval(layer: PMLayer): boolean;
5756
handleLayerAdditionInGlobalRotateMode(): void;
5857
_layerAddedRotate(e: LayerAddEvent): void;
5958
_fireGlobalRotateModeToggled(): void;
6059
}
6160

62-
const GlobalRotateMode: IGlobalRotateMode = {
61+
const GlobalRotateMode = {
6362
_globalRotateModeEnabled: false,
64-
_addedLayersRotate: {},
65-
map: null as unknown as L.Map,
66-
Toolbar: null as unknown as IGlobalRotateMode['Toolbar'],
6763
enableGlobalRotateMode(this: IGlobalRotateMode) {
6864
this._globalRotateModeEnabled = true;
6965
const layers = L.PM.Utils.findLayers(this.map).filter(
@@ -146,10 +142,6 @@ const GlobalRotateMode: IGlobalRotateMode = {
146142
!!layer.pm.options.allowRotation
147143
);
148144
},
149-
_isRelevantForRemoval() {
150-
// This method is called but should be _isRelevantForRotate - appears to be a bug in original code
151-
return false;
152-
},
153145
handleLayerAdditionInGlobalRotateMode(this: IGlobalRotateMode) {
154146
const layers = this._addedLayersRotate;
155147
this._addedLayersRotate = {};
@@ -166,9 +158,6 @@ const GlobalRotateMode: IGlobalRotateMode = {
166158
_layerAddedRotate(this: IGlobalRotateMode, { layer }: LayerAddEvent) {
167159
this._addedLayersRotate[L.Util.stamp(layer)] = layer;
168160
},
169-
_fireGlobalRotateModeToggled() {
170-
// Implemented in Events mixin
171-
},
172161
};
173162

174163
export default GlobalRotateMode;

0 commit comments

Comments
 (0)