Our blazing fast Grid component built with pure JavaScript


Post by postman »

"use strict";


import Vue from "/static/js/vue.esm.browser.min.js";
import { Mask, Panel, Toolbar, Widget, Combo } from "/static/js/grid.module.js";
import mixins from "./mixins.js";
import "./MediabuyersReport.js";
import "./TeamLeadersReport.js";


const ALL_BUYERS = "All buyers";
const ALL_GROUPS = "All groups";


new Vue({
	el: "#app",
	mixins: [mixins],
	data: {
		filtersPanel: {"instance": null},
		filters: {
			user: ALL_BUYERS,
			group: ALL_GROUPS
		},
		buyersNames: [],
		groups: [],
	},
	methods: {
		/**
         * Add date range picker to element.
         */
        setDateRangePicker() {
            const d = moment();
            const that = this;
            $(`#${that.dateRangePickerElementId}`).daterangepicker({
                startDate: d,
                endDate: d,
                ranges: {
                    'Today': [d, d],
                    'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
                    'Last 7 Days': [moment().subtract(6, 'days'), d],
                    'Last 14 Days': [moment().subtract(13, 'days'), d],
                    'Last 30 Days': [moment().subtract(29, 'days'), d],
                    'This Week': [moment().startOf("week"), moment().endOf("week")],
                    'Last Week': [moment().subtract(1, 'weeks').startOf('isoWeek'),
                        moment().subtract(1, 'weeks').endOf('isoWeek')],
                    'This Month': [moment().startOf('month'), moment().endOf('month')],
                    'Last Month': [moment().subtract(1, 'month').startOf('month'),
                        moment().subtract(1, 'month').endOf('month')]
                }
            }, that.period_cb);
            that.period_cb(d, d);
        },
        /**
         * Show selected date range.
         * @param {Date} start - Start date.
         * @param {Date} end - End date.
         */
        async period_cb(start, end){
            this.startDate = start.format('MM-DD-YYYY');
            this.endDate = end.format('MM-DD-YYYY');
			$(`#${this.dateRangePickerElementId} span`).html(start.format('MMMM D, YYYY') + ' - ' + end.format('MMMM D, YYYY'));
			await this.getData();
		},
		/**
         * Set bryntum grid filters panel.
         */
        async setFiltersPanel() {
            let buyersFilterField = new Combo({
                items: this.buyersNames,
                placeholder: "Buyer",
                style: "margin-right: 10px;",
                value: this.filters.user,
                cls: "filter-by-buyer",
                listeners: {
                    action: (elem) => {
                        this.filters.user = elem.value;
                        this.getData();
                    }
                }
            });
            let teamsFilterField = new Combo({
                items: this.groups,
                placeholder: "Team",
                style: "margin-right: 10px;",
                value: this.filters.group,
                cls: "filter-by-team",
                listeners: {
                    action: (elem) => {
                        this.filters.group = elem.value;
                        this.getData();
                    }
                }
            });
            let dateRangeFilter = new Widget({
                cls: "filter-by-date-range-field",
                html: "<div id=\"period\" style=\"background: #fff; display: inline-block;\" class=\"ml-2 border pointer p-3\">" +
                    "<i class=\"fa fa-calendar\"></i>&nbsp;" +
                    "<span class=\"range\"></span> <i class=\"fa fa-caret-down\"></i>" +
                    "</div>"
            })
            let toolbar = new Toolbar({
                items: [
                    buyersFilterField,
                    teamsFilterField,
                    dateRangeFilter
                ]
            });
            this.filtersPanel.instance = new Panel({
                adopt: "filters",
                floating: true,
                centered: true,
                cls: "filters-panel",
                items: [
                    toolbar,
                ],
                tbar: []
            });
        }
		// /**
		//  * Set handlers to tabs.
		//  */
		// setTabs() {
		// 	let tabs = document.getElementsByClassName('js-tabs');
		// 	if( tabs.length > 0 ) {
		// 		for( let index = 0; index < tabs.length; index++ ) {
		// 			(function(i){new Tab(tabs[index]);})(index);
		// 		}
		// 	}
		// },
	},
	computed: {
	},
	async created() {
		Mask.mask("Loading");
		await this.setFiltersPanel();
		Mask.unmask();
		// setTimeout(this.setTabs, 1);
	}

});
<div class="col-12" v-cloak id="app">{% verbatim %}
	<div class="filters"></div>
<!--	<mediabuyers-report ref="mediabuyers-report"></mediabuyers-report>-->
<!--	<team-leaders-report ref="team-leaders-report"></team-leaders-report>-->
</div>

I try to set filter panel, i am using "Panel" widget.

vue.esm.browser.min.js:6 TypeError: Cannot read property 'childNodes' of null
    at Panel.startConfigure (grid.module.js:10)
    at Panel.startConfigure (grid.module.js:10)
    at Panel.setConfig (grid.module.js:10)
    at Panel.setConfig (grid.module.js:10)
    at Panel.configure (grid.module.js:10)
    at Panel.construct (grid.module.js:10)
    at Panel.construct (grid.module.js:10)
    at Panel.construct (grid.module.js:10)
    at Panel.construct (grid.module.js:10)
    at new Base (grid.module.js:10
    )

Post by mats »

Can you please upload a full clean test case?


Post by postman »

What files do you need?


Post by postman »

<div class="col-12" v-cloak id="app">{% verbatim %}
	<div class="filters"></div>
</div>{% endverbatim %}
"use strict";


import Vue from "/static/js/vue.esm.browser.min.js";
import { Mask, Panel, Toolbar, Widget, Combo } from "/static/js/grid.module.js";
import mixins from "./mixins.js";


const ALL_BUYERS = "All buyers";
const ALL_GROUPS = "All groups";


new Vue({
	el: "#app",
	mixins: [mixins],
	data: {
		filtersPanel: {"instance": null},
		filters: {
			user: ALL_BUYERS,
			group: ALL_GROUPS
		},
		buyersNames: [],
		groups: [],
	},
	methods: {
		/**
         * Set bryntum grid filters panel.
         */
        async setFiltersPanel() {
            let buyersFilterField = new Combo({
                items: this.buyersNames,
                placeholder: "Buyer",
                style: "margin-right: 10px;",
                value: this.filters.user,
                cls: "filter-by-buyer",
                listeners: {
                    action: (elem) => {
                        this.filters.user = elem.value;
                        this.getData();
                    }
                }
            });
            let teamsFilterField = new Combo({
                items: this.groups,
                placeholder: "Team",
                style: "margin-right: 10px;",
                value: this.filters.group,
                cls: "filter-by-team",
                listeners: {
                    action: (elem) => {
                        this.filters.group = elem.value;
                        this.getData();
                    }
                }
            });
            let dateRangeFilter = new Widget({
                cls: "filter-by-date-range-field",
                html: "<div id=\"period\" style=\"background: #fff; display: inline-block;\" class=\"ml-2 border pointer p-3\">" +
                    "<i class=\"fa fa-calendar\"></i>&nbsp;" +
                    "<span class=\"range\"></span> <i class=\"fa fa-caret-down\"></i>" +
                    "</div>"
            })
            let toolbar = new Toolbar({
                items: [
                    buyersFilterField,
                    teamsFilterField,
                    dateRangeFilter
                ]
            });
            this.filtersPanel.instance = new Panel({
                adopt: "filters",
                floating: true,
                centered: true,
                cls: "filters-panel",
                items: [
                    toolbar,
                ],
                tbar: []
            });
        }
	},
	computed: {
	},
	async created() {
		Mask.mask("Loading");
		await this.setFiltersPanel();
		Mask.unmask();
	}

});

Post by alex.l »

postman wrote: Tue Jun 23, 2020 2:14 pm

What files do you need?

Hi postman,

We need a runnable demo to be able to reproduce your issue. It's also possible to adapt one of our Vue examples and attach it here.

All best,
Alex

All the best,
Alex


Post by postman »

Hello, i posted the code. There is vue js code and template code without grid and vue js modules. Is that enough?


Post by mats »

No, please provide a full runnable solution as a zip and upload.


Post by postman »

I uploaded what you requested. https://yadi.sk/d/IW-gRP5Kegk-SQ


Post by mats »

Looks like your mistake is this:

	<div class="filters"></div>

should be

	<div id="filters"></div>

Post by postman »

OU. It's my fault, sorry for such a silly mistake.


Post Reply