Skip to content

Commit 530ad6f

Browse files
committed
source
1 parent 25bc4d7 commit 530ad6f

File tree

3 files changed

+113
-0
lines changed

3 files changed

+113
-0
lines changed

src/draggable.directive.ts

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import { Directive, ElementRef, Renderer, OnDestroy, OnInit, AfterViewInit, Input } from '@angular/core';
2+
3+
4+
@Directive({
5+
selector: '[draggable]',
6+
host: {
7+
'(dragstart)': 'onDragStart($event)',
8+
'(dragend)': 'onDragEnd($event)',
9+
'(drag)': 'onDrag($event)'
10+
}
11+
})
12+
export class DraggableDirecrtive implements OnDestroy, OnInit, AfterViewInit {
13+
private Δx: number = 0;
14+
private Δy: number = 0;
15+
16+
private canDrag:boolean = true;
17+
18+
@Input('draggable')
19+
set draggable(val:any){
20+
if(val === undefined || val === null || val === '' ) return;
21+
this.canDrag = !!val;
22+
}
23+
private mustBePosition: Array<string> = ['absolute', 'fixed', 'relative'];
24+
constructor(
25+
private el: ElementRef, private renderer: Renderer
26+
) {
27+
28+
}
29+
30+
ngOnInit(): void {
31+
this.renderer.setElementAttribute(this.el.nativeElement, 'draggable', 'true');
32+
}
33+
ngAfterViewInit(){
34+
try {
35+
let position = window.getComputedStyle(this.el.nativeElement).position;
36+
if (this.mustBePosition.indexOf(position) === -1) {
37+
console.warn( this.el.nativeElement, 'Must be having position attribute set to ' + this.mustBePosition.join('|'));
38+
}
39+
} catch (ex) {
40+
console.error(ex);
41+
}
42+
}
43+
ngOnDestroy(): void {
44+
this.renderer.setElementAttribute(this.el.nativeElement, 'draggable', 'false');
45+
}
46+
47+
onDragStart(event: MouseEvent) {
48+
this.Δx = event.x - this.el.nativeElement.offsetLeft;
49+
this.Δy = event.y - this.el.nativeElement.offsetTop;
50+
}
51+
52+
onDrag(event: MouseEvent) {
53+
this.doTranslation(event.x, event.y);
54+
}
55+
56+
onDragEnd(event: MouseEvent) {
57+
this.Δx = 0;
58+
this.Δy = 0;
59+
}
60+
61+
doTranslation(x: number, y: number) {
62+
if (!x || !y) return;
63+
this.renderer.setElementStyle(this.el.nativeElement, 'top', (y - this.Δy) + 'px');
64+
this.renderer.setElementStyle(this.el.nativeElement, 'left', (x - this.Δx) + 'px');
65+
}
66+
67+
68+
}

src/draggable.module.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { NgModule } from '@angular/core';
2+
3+
import { DraggableDirecrtive } from './draggable.directive';
4+
@NgModule({
5+
imports: [],
6+
declarations: [ DraggableDirecrtive ],
7+
exports: [ DraggableDirecrtive ],
8+
providers: []
9+
})
10+
export class Ng2DraggableModule { }

src/tsconfig.json

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"compilerOptions": {
3+
"noImplicitAny": true,
4+
"module": "commonjs",
5+
"target": "es5",
6+
"emitDecoratorMetadata": true,
7+
"experimentalDecorators": true,
8+
"inlineSourceMap": true,
9+
"inlineSources": true,
10+
"declaration": true,
11+
"suppressImplicitAnyIndexErrors": true,
12+
"removeComments": true,
13+
"moduleResolution": "node",
14+
"lib": [
15+
"dom",
16+
"es6"
17+
],
18+
"outDir": "../dist",
19+
"typeRoots": [
20+
"../node_modules/@types"
21+
]
22+
},
23+
"exclude": [
24+
"../node_modules",
25+
"../dist"
26+
],
27+
"awesomeTypescriptLoaderOptions": {
28+
"forkChecker": true,
29+
"useWebpackText": true
30+
},
31+
"angularCompilerOptions": {
32+
"genDir": "../dist",
33+
"debug": false
34+
}
35+
}

0 commit comments

Comments
 (0)