@@ -66,6 +66,9 @@ export default {
6666     */  
6767    selectable:  { 
6868      type:  Boolean  
69+     }, 
70+     details:  { 
71+       type:  Object  
6972    } 
7073  }, 
7174  data () { 
@@ -92,8 +95,8 @@ export default {
9295    } 
9396  }, 
9497  created () { 
95-     const  vm  =  this  
96-     const  jq  =  vm .jq  
98+     const  vm    =  this  
99+     const  jq    =  vm .jq  
97100
98101    //  allow user to override default options 
99102    if  (vm .opts ) { 
@@ -133,21 +136,7 @@ export default {
133136        } 
134137
135138        if  (field .template ) { 
136-           //  must be string template 
137-           const  res  =  Vue .compile (` <div>${ field .template } `  
138-           field .render  =  (data , type , row , meta ) =>  { 
139-             const  comp  =  new  Vue ({ 
140-               data:  { 
141-                   data:  data, 
142-                   type:  type, 
143-                   row:  row, 
144-                   meta:  meta 
145-               }, 
146-               render:  res .render , 
147-               staticRenderFns:  res .staticRenderFns  
148-             }).$mount () 
149-             return  jq (comp .$el ).html () 
150-           } 
139+           field .render  =  vm .compileTemplate (field .template ) 
151140        } 
152141
153142        if  (field .render ) { 
@@ -161,27 +150,33 @@ export default {
161150
162151    if  (vm .selectable ) { 
163152      //  expand column 
164-       vm . options . columns   =  [ { 
153+       const   col   =   { 
165154        orderable:  false , 
166155        className:  ' select-checkbox'  
167156        data:  null , 
168157        defaultContent:  ' '  
169-         title:  ' <input type="checkbox" class="select-all-checkbox">' ,  
170-         targets :   0  
171-       }]. concat ( vm .options .columns ) 
158+         title:  ' <input type="checkbox" class="select-all-checkbox">'  
159+       }  
160+       vm .options .columns . splice ( 1 ,  0 , col ) 
172161
173162      //  console.log(vm.options.columns) 
174163      vm .options .select  =  jq .extend ( 
175164        vm .options .select  ||  {}, 
176165        { 
177166          style:  ' os'  
178-           selector:  ' td:first-child '  
167+           selector:  ' td.select-checkbox '  
179168        } 
180169      ) 
170+     } 
181171
182-       if  (! vm .options .order ) { 
183-         vm .options .order  =  [[1 , ' asc'  
172+     if  (vm .details ) { 
173+       const  col  =  { 
174+         orderable:  false , 
175+         className:  ' details-control'  
176+         data:  null , 
177+         defaultContent:  vm .details .icons  ||  ' <span class="details-control-plus" title="Show Details">+</span><span class="details-control-minus" title="Hide Details">-</span>'  
184178      } 
179+       vm .options .columns .splice (1 , 0 , col) 
185180    } 
186181  }, 
187182  mounted () { 
@@ -238,7 +233,7 @@ export default {
238233        //  detect if row action 
239234        let  tr =  that .closest (' tr'  
240235        if  (tr) { 
241-           if  (tr .hasClass ( ' child ' ) ) { 
236+           if  (tr .attr ( ' role ' )  !==   ' row '  
242237            tr =  tr .prev () 
243238          } 
244239          const  row   =  vm .dataTable .row (tr) 
@@ -251,6 +246,59 @@ export default {
251246        } 
252247      } 
253248    }) 
249+ 
250+     if  (vm .details ) { 
251+       //  must be string template 
252+       const  renderFunc  =  vm .compileTemplate (vm .details .template ) 
253+ 
254+       //  handle master/details 
255+       //  Add event listener for opening and closing details 
256+       $el .on (' click' ' td.details-control' e ) =>  { 
257+         e .preventDefault () 
258+         e .stopPropagation () 
259+         const  target  =  jq (e .target ) 
260+         let  that     =  target 
261+         let  tr       =  that .closest (' tr'  
262+         if  (tr .attr (' role' !==  ' row'  
263+           tr =  tr .prev () 
264+         } 
265+         const  row  =  vm .dataTable .row ( tr ) 
266+ 
267+         if  ( row .child .isShown () ) { 
268+           //  This row is already open - close it 
269+           row .child .hide () 
270+           tr .removeClass (' shown'  
271+         } 
272+         else  { 
273+           //  Open this row 
274+           const  data  =  row .data () 
275+           row .child ( renderFunc (data, ' child' show () 
276+           tr .addClass (' shown'  
277+         } 
278+       }) 
279+     } 
280+   }, 
281+   methods:  { 
282+     compileTemplate (template ) { 
283+       const  vm   =  this  
284+       const  jq   =  vm .jq  
285+       const  res  =  Vue .compile (` <div>${ template} `  
286+       const  renderFunc  =  (data , type , row , meta ) =>  { 
287+         const  comp  =  new  Vue ({ 
288+           data:  { 
289+               data:  data, 
290+               type:  type, 
291+               row:  row, 
292+               meta:  meta 
293+           }, 
294+           render:  res .render , 
295+           staticRenderFns:  res .staticRenderFns  
296+         }).$mount () 
297+         return  jq (comp .$el ).html () 
298+       } 
299+ 
300+       return  renderFunc 
301+     } 
254302  } 
255303} 
256304script >
@@ -262,4 +310,23 @@ export default {
262310  float left ; 
263311  padding-right 10px  ; 
264312} 
313+ .shown  .details-control-plus 
314+ { 
315+   cursor pointer ; 
316+   display none ; 
317+ } 
318+ .details-control-minus 
319+ { 
320+   cursor pointer ; 
321+   display none ; 
322+ } 
323+ .shown  .details-control-minus 
324+ { 
325+   cursor pointer ; 
326+   display inline ; 
327+ } 
328+ .details-control  {
329+   cursor pointer ; 
330+   font-weight 700 ; 
331+ } 
265332style >
0 commit comments