@@ -97,61 +97,96 @@ var dlv = {
9797
9898 // (E2) ADD NEW ROW
9999 else {
100+ // (E2-1) ITEM ROW HTML
100101 let row = document . createElement ( "div" ) ;
101- row . innerHTML = `<div class= "iRow d-flex align-items-center border p-2">
102- <i class="text-danger icon-cross p-3" onclick="dlv.delItem(this, ' ${ sku } ')"></i>
103- <div class="flex-grow-1" >
104- <strong class="iSKU"> ${ sku } </strong >
105- <div class="iName ">${ name } </div >
106- </div>
107- < div class="form-floating" >
108- <input class="form-control mx-1 iQty" type="number" step="0.01" min="0.01" required value=" ${ qty } ">
109- <label class="iUnit"> ${ unit } </label >
110- </div >
111- < div class="form-floating" >
112- <input class="form-control iPrice" type="number" step="0.01" min="0" required value=" ${ price } ">
113- <label>PRICE</label >
114- </div >
102+ row . className = "iRow d-flex align-items-center border p-2" ;
103+ row . innerHTML =
104+ `<i class="text-danger icon-cross p-3" onclick="dlv.delItem(this, ' ${ sku } ')"></i >
105+ <div class="flex-grow-1" >
106+ <strong class="iSKU ">${ sku } </strong >
107+ <div class="iName"> ${ name } < /div>
108+ </ div>
109+ <div class="form-floating ">
110+ <input class="form-control mx-1 iQty" type="number" step="0.01" min="0.01" required value=" ${ qty } " >
111+ <label class="iUnit"> ${ unit } </label >
112+ </ div>
113+ <div class="form-floating ">
114+ <input class="form-control iPrice" type="number" step="0.01" min="0" required value=" ${ price } " >
115+ <label>PRICE</label >
115116 </div>` ;
117+
118+ // (E2-2) SORTABLE
119+ row . draggable = true ;
120+ row . ondragstart = ( ) => dlv . ddfrom = row ;
121+ row . ondragover = e => e . preventDefault ( ) ;
122+ row . ondrop = dlv . isort ;
123+
124+ // (E2-3) APPEND TO LIST
116125 document . getElementById ( "dlv-items" ) . appendChild ( row ) ;
117126 dlv . iList [ sku ] = 1 ;
118127 }
119128 } ,
120129
121- // (F) REMOVE ITEM ROW
130+ // (F) DRAG-N-DROP SORT ITEM
131+ ddfrom : null , // current item being dragged
132+ ddto : null , // dropped at this item
133+ ddget : r => r . classList . contains ( "iRow" ) ? r : dlv . ddget ( r . parentElement ) , // get proper drop target
134+ isort : e => {
135+ // (F1) GET ELEMENTS
136+ e . preventDefault ( ) ;
137+ let iList = document . getElementById ( "dlv-items" ) ,
138+ iAll = iList . querySelectorAll ( ".iRow" ) ;
139+ dlv . ddto = dlv . ddget ( e . target ) ;
140+
141+ // (F2) REORDER ITEM
142+ if ( iAll . length > 1 && dlv . ddfrom != dlv . ddto ) {
143+ let currentpos = 0 , droppedpos = 0 ;
144+ for ( let i = 0 ; i < iAll . length ; i ++ ) {
145+ if ( dlv . ddfrom == iAll [ i ] ) { currentpos = i ; }
146+ if ( dlv . ddto == iAll [ i ] ) { droppedpos = i ; }
147+ }
148+ if ( currentpos < droppedpos ) {
149+ iList . insertBefore ( dlv . ddfrom , dlv . ddto . nextSibling ) ;
150+ } else {
151+ iList . insertBefore ( dlv . ddfrom , dlv . ddto ) ;
152+ }
153+ }
154+ } ,
155+
156+ // (G) REMOVE ITEM ROW
122157 delItem : ( row , sku ) => {
123158 row . parentElement . remove ( ) ;
124159 delete dlv . iList [ sku ] ;
125160 } ,
126161
127- // (G ) GET ITEM FROM SERVER & ADD TO LIST
162+ // (H ) GET ITEM FROM SERVER & ADD TO LIST
128163 addGet : sku => cb . api ( {
129164 mod : "items" , act : "get" ,
130165 data : { sku : sku } ,
131166 passmsg : false ,
132167 onpass : res => {
133- // (G1 ) INVALID SKU
168+ // (H1 ) INVALID SKU
134169 if ( res . data == null ) {
135170 cb . modal ( "Invalid Item" , `${ sku } is not found in the database.` ) ;
136171 }
137172
138- // (G2 ) OK - ADD ITEM
173+ // (H2 ) OK - ADD ITEM
139174 else {
140175 let i = res . data ;
141176 dlv . addItem ( i . item_sku , i . item_name , i . item_unit , i . item_price , 1 ) ;
142177 }
143178 }
144179 } ) ,
145180
146- // (H ) ADD ITEM WITH QR CODE
181+ // (I ) ADD ITEM WITH QR CODE
147182 addQR : ( ) => {
148183 if ( qrscan . scanner == null ) { qrscan . init ( dlv . addGet ) ; }
149184 qrscan . show ( ) ;
150185 } ,
151186
152- // (I ) SAVE DELIVERY
187+ // (J ) SAVE DELIVERY
153188 save : ( ) => {
154- // (I1 ) GET DATA
189+ // (J1 ) GET DATA
155190 var data = {
156191 name : document . getElementById ( "d-name" ) . value ,
157192 tel : document . getElementById ( "d-tel" ) . value ,
@@ -166,26 +201,24 @@ var dlv = {
166201 data . stat = document . getElementById ( "d-stat" ) . value ;
167202 }
168203
169- // (I2 ) GET ITEMS
204+ // (J2 ) GET ITEMS
170205 let items = document . querySelectorAll ( "#dlv-items .iRow" ) ;
171206 if ( items . length == 0 ) {
172207 cb . modal ( "No Items" , "Please add at least one item." ) ;
173208 return false ;
174209 }
175210 data . items = [ ] ;
176- // sku | name | unit | price | qty
211+ // sku | price | qty
177212 for ( let i of items ) {
178213 data . items . push ( [
179214 i . querySelector ( ".iSKU" ) . innerHTML ,
180- i . querySelector ( ".iName" ) . innerHTML ,
181- i . querySelector ( ".iUnit" ) . innerHTML ,
182215 i . querySelector ( ".iPrice" ) . value ,
183216 i . querySelector ( ".iQty" ) . value
184217 ] ) ;
185218 }
186219 data . items = JSON . stringify ( data . items ) ;
187220
188- // (I3 ) AJAX
221+ // (J3 ) AJAX
189222 cb . api ( {
190223 mod : "delivery" , act : "save" ,
191224 data : data ,
@@ -195,22 +228,22 @@ var dlv = {
195228 return false ;
196229 } ,
197230
198- // (J ) PRINT DELIVERY ORDER
231+ // (K ) PRINT DELIVERY ORDER
199232 print : id => {
200233 document . getElementById ( "dlv-print-id" ) . value = id ;
201234 document . getElementById ( "dlv-print" ) . submit ( ) ;
202235 }
203236} ;
204237
205- // (K ) INIT MANAGE DELIVERIES
238+ // (L ) INIT MANAGE DELIVERIES
206239window . addEventListener ( "load" , ( ) => {
207- // (K1 ) EXTRA STYLES FOR "ADD/EDIT ITEMS LIST"
240+ // (L1 ) EXTRA STYLES FOR "ADD/EDIT ITEMS LIST"
208241 document . head . appendChild ( document . createElement ( "style" ) ) . innerHTML = ".iQty,.iPrice{width:80px}" ;
209242
210- // (K2 ) LIST DELIVERIES
243+ // (L2 ) LIST DELIVERIES
211244 dlv . list ( ) ;
212245
213- // (K3 ) ATTACH AUTOCOMPLETE
246+ // (L3 ) ATTACH AUTOCOMPLETE
214247 autocomplete . attach ( {
215248 target : document . getElementById ( "dlv-search" ) ,
216249 mod : "autocomplete" , act : "deliver" ,
0 commit comments