1+ 'use strict' ;
2+ angular . module ( 'ui.sortable' , [ ] ) . value ( 'uiSortableConfig' , { } ) . directive ( 'uiSortable' , [
3+ 'uiSortableConfig' ,
4+ '$log' ,
5+ function ( uiSortableConfig , log ) {
6+ return {
7+ require : '?ngModel' ,
8+ link : function ( scope , element , attrs , ngModel ) {
9+ function combineCallbacks ( first , second ) {
10+ if ( second && typeof second === 'function' ) {
11+ return function ( e , ui ) {
12+ first ( e , ui ) ;
13+ second ( e , ui ) ;
14+ } ;
15+ }
16+ return first ;
17+ }
18+ var opts = { } ;
19+ var callbacks = {
20+ receive : null ,
21+ remove : null ,
22+ start : null ,
23+ stop : null ,
24+ update : null
25+ } ;
26+ var apply = function ( e , ui ) {
27+ if ( ui . item . sortable . resort || ui . item . sortable . relocate ) {
28+ scope . $apply ( ) ;
29+ }
30+ } ;
31+ angular . extend ( opts , uiSortableConfig ) ;
32+ if ( ngModel ) {
33+ ngModel . $render = function ( ) {
34+ element . sortable ( 'refresh' ) ;
35+ } ;
36+ callbacks . start = function ( e , ui ) {
37+ ui . item . sortable = { index : ui . item . index ( ) } ;
38+ } ;
39+ callbacks . update = function ( e , ui ) {
40+ ui . item . sortable . resort = ngModel ;
41+ } ;
42+ callbacks . receive = function ( e , ui ) {
43+ ui . item . sortable . relocate = true ;
44+ ngModel . $modelValue . splice ( ui . item . index ( ) , 0 , ui . item . sortable . moved ) ;
45+ } ;
46+ callbacks . remove = function ( e , ui ) {
47+ if ( ngModel . $modelValue . length === 1 ) {
48+ ui . item . sortable . moved = ngModel . $modelValue . splice ( 0 , 1 ) [ 0 ] ;
49+ } else {
50+ ui . item . sortable . moved = ngModel . $modelValue . splice ( ui . item . sortable . index , 1 ) [ 0 ] ;
51+ }
52+ } ;
53+ callbacks . stop = function ( e , ui ) {
54+ if ( ui . item . sortable . resort && ! ui . item . sortable . relocate ) {
55+ var end , start ;
56+ start = ui . item . sortable . index ;
57+ end = ui . item . index ( ) ;
58+ ui . item . sortable . resort . $modelValue . splice ( end , 0 , ui . item . sortable . resort . $modelValue . splice ( start , 1 ) [ 0 ] ) ;
59+ }
60+ } ;
61+ scope . $watch ( attrs . uiSortable , function ( newVal ) {
62+ angular . forEach ( newVal , function ( value , key ) {
63+ if ( callbacks [ key ] ) {
64+ value = combineCallbacks ( callbacks [ key ] , value ) ;
65+ if ( key === 'stop' ) {
66+ value = combineCallbacks ( value , apply ) ;
67+ }
68+ }
69+ element . sortable ( 'option' , key , value ) ;
70+ } ) ;
71+ } , true ) ;
72+ angular . forEach ( callbacks , function ( value , key ) {
73+ opts [ key ] = combineCallbacks ( value , opts [ key ] ) ;
74+ } ) ;
75+ opts . stop = combineCallbacks ( opts . stop , apply ) ;
76+ } else {
77+ log . info ( 'ui.sortable: ngModel not provided!' , element ) ;
78+ }
79+ element . sortable ( opts ) ;
80+ }
81+ } ;
82+ }
83+ ] ) ;
0 commit comments