Skip to content

Commit 02a3730

Browse files
committed
fix(drop): handle nested DOM structures
1 parent 8709d82 commit 02a3730

File tree

2 files changed

+29
-11
lines changed

2 files changed

+29
-11
lines changed

projects/ng-sortgrid/src/lib/ngsg-elements.helper.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,12 @@ export class NgsgElementsHelper {
33
const allElements = element.parentNode.children;
44
return Array.prototype.indexOf.call(allElements, element);
55
}
6+
7+
public static findHost(element: Element, selector: string): Element {
8+
const parentElement = element.parentElement;
9+
if (parentElement.matches(selector)) {
10+
return parentElement;
11+
}
12+
this.findHost(parentElement, selector);
13+
}
614
}

projects/ng-sortgrid/src/lib/ngsg-item.directive.ts

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,16 @@ import {
1010
Output
1111
} from '@angular/core';
1212

13-
import { NgsgReflectService } from './ngsg-reflect.service';
14-
import { NgsgStoreService } from './ngsg-store.service';
15-
import { NgsgSortService } from './ngsg-sort.service';
16-
import { NgsgSelectionService } from './ngsg-selection.service';
17-
import { NgsgClassService } from './ngsg-class.service';
13+
import {NgsgReflectService} from './ngsg-reflect.service';
14+
import {NgsgStoreService} from './ngsg-store.service';
15+
import {NgsgSortService} from './ngsg-sort.service';
16+
import {NgsgSelectionService} from './ngsg-selection.service';
17+
import {NgsgClassService} from './ngsg-class.service';
18+
import {NgsgElementsHelper} from './ngsg-elements.helper';
1819

19-
@Directive({
20-
selector: '[ngSortgridItem]'
21-
})
20+
const selector = '[ngSortgridItem]';
21+
22+
@Directive({selector})
2223
export class NgsgItemDirective implements OnInit, AfterViewInit {
2324
private DEFAULT_GROUP = 'defaultGroup';
2425

@@ -37,7 +38,8 @@ export class NgsgItemDirective implements OnInit, AfterViewInit {
3738
private reflectService: NgsgReflectService,
3839
private classService: NgsgClassService,
3940
private ngsgStore: NgsgStoreService
40-
) {}
41+
) {
42+
}
4143

4244
ngOnInit(): void {
4345
// TODO handle classes as input
@@ -54,13 +56,16 @@ export class NgsgItemDirective implements OnInit, AfterViewInit {
5456

5557
@HostListener('dragstart', ['$event'])
5658
dragStart(event): void {
59+
if (!this.occuredOnHost(event)) {
60+
return;
61+
}
5762
this.selectionService.selectElementIfNoSelection(this.ngSortGridGroup, event.target);
5863
this.sortService.initSort(this.ngSortGridGroup);
5964
}
6065

6166
@HostListener('dragenter', ['$event'])
6267
dragEnter(event): void {
63-
if (!this.ngsgStore.hasSelectedItems(this.ngSortGridGroup)) {
68+
if (!this.ngsgStore.hasSelectedItems(this.ngSortGridGroup) || !this.occuredOnHost(event)) {
6469
return;
6570
}
6671
this.sortService.sort(event.target);
@@ -88,7 +93,12 @@ export class NgsgItemDirective implements OnInit, AfterViewInit {
8893

8994
@HostListener('click', ['$event'])
9095
clicked(event): void {
96+
const element = !this.occuredOnHost(event) ? NgsgElementsHelper.findHost(event.target, selector) : event.target;
9197
this.selected = !this.selected;
92-
this.selectionService.updateSelectedDragItem(this.ngSortGridGroup, event.target, this.selected);
98+
this.selectionService.updateSelectedDragItem(this.ngSortGridGroup, element, this.selected);
99+
}
100+
101+
private occuredOnHost(event): boolean {
102+
return event.target.matches(selector);
93103
}
94104
}

0 commit comments

Comments
 (0)