Advertisement
Guest User

Untitled

a guest
Dec 8th, 2016
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.01 KB | None | 0 0
  1. import {
  2. Directive, Input, ElementRef, Output,
  3. Renderer, OnInit, HostListener, EventEmitter
  4. } from '@angular/core';
  5.  
  6. export interface SortResult {
  7. from: number;
  8. to: number;
  9. }
  10.  
  11. export function applySort<T>(items: T[], res: SortResult): T[] {
  12. let temp = items[res.from];
  13. let ite = [
  14. ...items.slice(0, res.from),
  15. ...items.slice(res.from + 1)
  16. ];
  17. return [
  18. ...ite.slice(0, res.to),
  19. temp,
  20. ...ite.slice(res.to)
  21. ];
  22. }
  23.  
  24.  
  25. @Directive({
  26. selector: '[appSortable]'
  27. })
  28. export class SortableDirective implements OnInit {
  29.  
  30. @Input() appSortable: number;
  31. @Input() dragEnterClass: string = 'dragEnter';
  32. @Output() sorted = new EventEmitter<SortResult>();
  33.  
  34. constructor(
  35. private el: ElementRef,
  36. private rend: Renderer) { }
  37.  
  38. ngOnInit() {
  39. this.rend.setElementProperty(
  40. this.el.nativeElement, 'draggable', true);
  41. // console.log('el', this.appSortable);
  42. }
  43.  
  44. @HostListener('dragstart', ['$event'])
  45. dragStart(e) {
  46. e.dataTransfer.setData('text', '' + this.appSortable);
  47. e.stopPropagation();
  48. }
  49.  
  50. @HostListener('dragleave', ['$event'])
  51. drag(e) {
  52. e.preventDefault();
  53. }
  54.  
  55. @HostListener('dragend', ['$event'])
  56. dragEnd(e) {
  57. return false;
  58. }
  59.  
  60. // This event must exist to make working ie11
  61. @HostListener('dragenter', ['$event'])
  62. dragEnter(e) {
  63. this.addClass();
  64. e.preventDefault();
  65. }
  66.  
  67. @HostListener('dragleave', ['$event'])
  68. dragLeave(e) {
  69. this.removeClass();
  70. }
  71.  
  72. // This event must exist for element be a drop zone.
  73. @HostListener('dragover', ['$event'])
  74. dragOver(e) {
  75. return false;
  76. }
  77.  
  78. @HostListener('drop', ['$event'])
  79. drop(e) {
  80. this.removeClass();
  81. let which = parseInt(e.dataTransfer.getData('text'), 10);
  82. this.sorted.next({ from: which, to: this.appSortable });
  83. e.preventDefault();
  84. e.stopPropagation();
  85. }
  86.  
  87. private addClass() {
  88. this.rend.setElementClass(this.el.nativeElement, this.dragEnterClass, true);
  89. }
  90.  
  91. private removeClass() {
  92. this.rend.setElementClass(this.el.nativeElement, this.dragEnterClass, false);
  93. }
  94.  
  95.  
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement