Vue.js Grid Component

You can study basics over screencast.

Vue is one the most popular JavaScript framework.
Almost all JavaScript libraries do some component wrapper for frameworks (React, Angular, Vue), we either.
To do component for Vue is simple thing.
For simplicity let us start from live sample of wrapper for FancyGrid.
Link on sample Vue Grid Component
The sample above does not suit well for production.
Next we will study production approach.

Add FancyGrid to Your Project

For the purposes of this tutorial, we are going to scaffold an Vue app with Vue CLI. Don't worry if your project has a different configuration. FancyGrid and its Vue wrapper are distributed as NPM packages, which should work with any common Vue project module bundler setup. Let's follow the Vue CLI instructions - run the following in your terminal:


npm install -g @vue/cli
vue create my-project
cd my-project
npm run serve

If everything goes well, npm run serve has started the web server. You can open the default app at localhost:8080.

As a next step, let's add the FancyGrid NPM packages. run the following command in my-project (you may need a new instance of the terminal):


npm install --save fancygrid fancy-grid-vue

After a few seconds of waiting, you should be good to go. Let's get to the actual coding!

As this will be a simple example we can delete the src/components directory. Our example application will live in src/App.vue.

Let's add the component definition to our template. Edit src/App.vue and replace the scaffold code:


<template>
  <div id="app">
	<fancy-grid-vue :config="gridConfig"></fancy-grid-vue>
  </div>
</template>

In code above you see that we provide only one param config.
It is the simplest way to provide component with grid config.

Next, let's declare the basic grid configuration. Edit src/App.vue:


<script>
import FancyGridVue from 'fancy-grid-vue';

let data = [{
  name: 'Ted',
  surname: 'Smith',
  position: 'Java Developer',
  email: '[email protected]',
  company: 'Electrical Systems',
  age: 30,
  knownledge: 'Java, Ruby'
}, {
  name: 'Ed',
  surname: 'Johnson',
  position: 'C/C++ Market Data Developer',
  email: '[email protected]',
  company: 'Energy and Oil',
  age: 35,
  knownledge: 'C++'
}, {
  name: 'Sam',
  surname: 'Williams',
  position: 'Technical Analyst',
  email: '[email protected]',
  company: 'Airbus',
  age: 38,
  knownledge: ''
}, {
  name: 'Alexander',
  surname: 'Brown',
  position: 'Project Manager',
  email: '[email protected]',
  company: 'Renault',
  age: 24,
  knownledge: ''
}, {
  name: 'Nicholas',
  surname: 'Miller',
  position: 'Senior Software Engineer',
  email: '[email protected]',
  company: 'Adobe',
  age: 33,
  knownledge: 'Unix, C/C++'
}, {
  name: 'Andrew',
  surname: 'Thompson',
  position: 'Agile Project Manager',
  email: '[email protected]',
  company: 'Google',
  age: 28,
  knownledge: ''
}, {
  name: 'Ryan',
  surname: 'Walker',
  position: 'Application Support Engineer',
  email: '[email protected]',
  company: 'Siemens',
  age: 39,
  knownledge: 'ActionScript'
}, {
  name: 'John',
  surname: 'Scott',
  position: 'Flex Developer',
  email: '[email protected]',
  company: 'Cargo',
  age: 45,
  knownledge: 'Flex'
}];

export default {
  name: 'app',
  data: function() {
    return {   
      gridConfig: {
        title: 'Vue with FancyGrid',
        theme: 'gray',
        width: 700,
        height: 400,
        data: data,
        resizable: true,
        defaults: {
          type: 'string',
          width: 100,
          sortable: true,
          editable: true,
          resizable: true
        },
        selModel: 'rows',
        trackOver: true,
        columns: [{
          type: 'select'
        },{
          index: 'company',
          title: 'Company'
        },{
          index: 'name',
          title: 'Name'
        },{
          index: 'surname',
          title: 'Sur Name'
        },{
          index: 'age',
          title: 'Age',
          type: 'number',
          width: 80
        },{
          index: 'email',
          title: 'Email',
          width: 160
        }]
      }
    }
  },
  components: {
    FancyGridVue
  }
}
</script>

It could be needed to re-run npm run serve.
Also check the terminal on errors.
If everything works as expected, you should see a simple grid.

The code above is the simplest way to use FancyGrid with Vue.
Let us change it to Vue code style that your app looks better.
In FancyGrid you can define properties, events and use reactivity like in Vue.

Let's change the component template. Edit app/App.vue and replace the code to:


<template>
  <div id="app">
	<fancy-grid-vue 
	  :title="title"
      :theme="'gray'"
      :width="width"
      :height="height"
      :data="data"
      :resizable="true"
      :defaults="defaults"
      :sel-model="'rows'"
      :trackOver="true"
      :columns="columns">
	</fancy-grid-vue>
  </div>
</template>

Almost all properties from grid API are available for Vue wrapper.
Except: renderTo, renderOuter.
Also you need to remember that camelCase properties should be replaced with kebab code style.
selModel to sel-model

Next, let's change the grid configuration. Edit src/App.vue:


<script>
import FancyGridVue from 'fancy-grid-vue';
export default {
  name: 'app',
  data: function(){
    return {
	  title: "Vue with FancyGrid",
	  theme: "gray",
	  width: 700,
	  height: 400,
	  data: this.getData(),
	  defaults: this.getDefaults(),
	  columns: this.getColumns()
    };
  },
  methods: {
    getColumns: function(){
	  return [{
	    type: 'select'
	  },{
	    index: 'company',
	    title: 'Company'
	  },{
	    index: 'name',
	    title: 'Name'
	  },{
	    index: 'surname',
	    title: 'Sur Name'
	  },{
	    index: 'age',
	    title: 'Age',
	    type: 'number',
	    width: 80
	  },{
  	    index: 'email',
	    title: 'Email',
	    width: 160
	  }];
    },
    getDefaults: function(){
	  return {
  	    type: 'string',
	    width: 100,
	    sortable: true,
	    editable: true,
	    resizable: true
	  };
    },
    getData: function(){
	  return [{
	    name: 'Ted',
	    surname: 'Smith',
	    position: 'Java Developer',
	    email: '[email protected]',
	    company: 'Electrical Systems',
	    age: 30,
	    knownledge: 'Java, Ruby'
	  }, {
	    name: 'Ed',
	    surname: 'Johnson',
	    position: 'C/C++ Market Data Developer',
	    email: '[email protected]',
	    company: 'Energy and Oil',
	    age: 35,
	    knownledge: 'C++'
	  }, {
	    name: 'Sam',
	    surname: 'Williams',
	    position: 'Technical Analyst',
	    email: '[email protected]',
	    company: 'Airbus',
	    age: 38,
	    knownledge: ''
	  }, {
	    name: 'Alexander',
	    surname: 'Brown',
	    position: 'Project Manager',
	    email: '[email protected]',
	    company: 'Renault',
	    age: 24,
	    knownledge: ''
	  }, {
	    name: 'Nicholas',
	    surname: 'Miller',
	    position: 'Senior Software Engineer',
	    email: '[email protected]',
	    company: 'Adobe',
	    age: 33,
	    knownledge: 'Unix, C/C++'
	  }, {
	    name: 'Andrew',
	    surname: 'Thompson',
	    position: 'Agile Project Manager',
	    email: '[email protected]',
	    company: 'Google',
	    age: 28,
	    knownledge: ''
	  }, {
	    name: 'Ryan',
	    surname: 'Walker',
	    position: 'Application Support Engineer',
	    email: '[email protected]',
	    company: 'Siemens',
	    age: 39,
	    knownledge: 'ActionScript'
	  }, {
	    name: 'John',
	    surname: 'Scott',
	    position: 'Flex Developer',
	    email: '[email protected]',
	    company: 'Cargo',
	    age: 45,
	    knownledge: 'Flex'
	  }];
    }
  },
  components: {
    FancyGridVue
  }
}
</script>

We got the same grid but with nicer code.
In code above we change data and adding methods to that code looks cleaner.

Events

There are 2 approaches to add events for grid:
1 - FancyGrid approach adding events properties to configs.
2 - Vue approach.
It needs to choose only one approach, we can not mix them.
Let us study Vue approach.
First we will change template code.


<template>
  <div id="app">
	<fancy-grid-vue 
	  :title="title"
      :theme="'gray'"
      :width="width"
      :height="height"
      :data="data"
      :resizable="true"
      :defaults="defaults"
      :sel-model="'rows'"
      :trackOver="true"
	  @init="onInit"
	  @select="onSelect"
      :columns="columns">
	</fancy-grid-vue>
  </div>
</template>

In grid config code we will add methods(handlers) for events.


methods:{
  ...
  onInit: function(grid){
    
  },
  onSelect: function(grid, selection){
    
  },

Reactive properties

There are several properties that you can use for reactive change like Vue does.
They are: data, title, height, width, page, subTitle.
Let us view how they work, add this in code.


mounted: function(){
  var me = this;
  
  setTimeout(function(){
    me.title = 'New ';
    me.height = 350;
    me.width = 800;
  }, 2000);
},

Methods

To use all methods of grid from API, it needs to get link on grid.
You can do this over event init and store link on grid or define id
and use method Fancy.getWidget.
Learn more about Methods.

Production

FancyGrid consists of modules. It helps much to keep bundle size small.
But for production it requires to execute extra complex steps.

If you installed FancyGrid over npm and uses ES6/TypeScript than this section is for you.
By default FancyGrid includes core small module that auto-detects which modules will be used.
Than modules will be loaded from path that was provided in Fancy.MODULESDIR.
By default Fancy.MODULESDIR is equal to https://cdn.fancygrid.com/modules/ You can study about modules by this link Modules.

JavaScript Modules

You would need to get list of all modules that are used. For that open run open Web Console in browser and run this.
Fancy.getModulesList();
You would get something like that: ["paging", "server-data", "sort", "grouping", "filter", "tree", "dom", "ajax", "menu", "form", "grid"]. Now, open src/App.vue and import modules.


import FancyGridVue from 'fancy-grid-vue';
import Fancy from 'fancygrid';
import 'fancygrid/client/modules/paging.min';
import 'fancygrid/client/modules/server-data.min';
import 'fancygrid/client/modules/sort.min';
import 'fancygrid/client/modules/grouping.min';
import 'fancygrid/client/modules/filter.min';
import 'fancygrid/client/modules/dom.min';
import 'fancygrid/client/modules/menu.min';
import 'fancygrid/client/modules/form.min';
import 'fancygrid/client/modules/grid.min';

If you would need to debug the code, than remove .min from modules.

i18n

On case you use localization that you would need to include lang module.
Add this line.


import 'fancygrid/client/modules/i18n/de';

CSS file

The next thing to do is including css file.
For that after including modules add this lines.


import 'fancygrid/client/fancy.min.css';
Fancy.stylesLoaded = true;

The first line is including css file.
The second one is stoping FancyGrid from loading styles file by self.

That's it.

`