Search code examples
javascripttwitter-bootstrapvue.jsvuejs2bootstrap-vue

Bootstrap-vue - Setting table variant dynamically


So I'm using Bootstrap Vue with this test app. I'm trying to change the variant of a table cell depending on the value of it. Unfortunately, the variant parameter will not take a function, so I'm out of ideas on how to achieve this.

This is my code:

var app = new Vue({
    el: '#app',
    data: {    
        items: [],      //Will be populated through AJAX
        fields: [
        {              
            key: 'Vendedor',
            label: 'Vendedor'                 
        },       
        {              
            key: 'OBJETIVO',
            label: 'Objetivo',
            formatter: (value) => { return parseFloat(value).toFixed(2)},
            variant: estiloObjetivo //THIS IS NOT WORKING
        }
      ]
    },
    methods: {
        Cargar: function () {
            var salesperson = getCookie('salespersonCode');
            var url_servicio = 'http://MywebService/';
            var self = this;
            $.ajax({
                type: 'GET',
                url: url_servicio + 'ventas/' + salesperson,
                dataType: "json", // data type of response                  
                success: function(data){            
                    self.items = data           
                }
            });
        },
        estiloObjetivo (value) {
                if value > 0 //I need my cell variant to change depeding on this value
                 return 'danger'
                else 
                 return 'success'

        }
    }
})

This is my HTML part:

<div id="app">  
    <button v-on:click="Cargar">Cargar</button>
    <b-table striped hover :fields="fields" :items="items"></b-table>
</div>

Any ideas on how to style a Bootstrap-vue cell dynamically?

This is the way it's done in the docs, it's actually set in the "items" array, but how is this useful in cases like mine where I get the data from a web service?:

{
    salesperson: 'John',
    Objetivo: 2000,
    _cellVariants: { salesperson: 'success', Objetivo: 'danger'}
  },

So I guess what I need is a way to set the I need is to set the _cellVariants parameter of each element in the 'items' array.


Solution

  • If you want to add variant to items you could use a computed property called cptItems and define it as follows:

    computed:{
         cptItems(){
            return this.items.map((item)=>{
                   let tmp=item;
                    item.OBJETIVO>0?tmp.variant='danger':tmp.variant='success';
                    return tmp;
    
            })  
            }
    

    and use that property inside your template like :

    <b-table .... :items="cptItems"></b-table>