jQuery(function() { gamutable(); //onAjaxLoad(gamutable); function gamutable() { $('#app').on('click', '.url_action', function(e) { e.preventDefault(); e.stopPropagation(); let url = $(this).attr('href'); $.ajax({ url: url, async: true }).done(function() { app.rechargerJson(); }); }); } }); function recupJson(d) { try { return JSON.parse(d); } catch (e) { return []; } } const orderBy = (arr, props, orders) => arr.sort((a, b) => props.reduce((acc, prop, i) => { if (acc === 0) { let [p1, p2] = orders && orders[i] === 'desc' ? [b[prop], a[prop]] : [a[prop], b[prop]]; // passe en lowercase les String p1 = typeof p1 === 'string' ? p1.toLowerCase() : p1; p2 = typeof p2 === 'string' ? p2.toLowerCase() : p2; // Gestion du format de date // transforme 03/11/2000 en 20001103 let re = /^(\d{2,4})\/(\d{2})\/(\d{2,4})$/; let r1 = p1.match(re); if (Array.isArray(r1)) { p1 = r1[3] + r1[2] + r1[1]; } let r2 = p2.match(re); if (Array.isArray(r2)) { p2 = r2[3] + r2[2] + r2[1]; } acc = p1 > p2 ? 1 : p1 < p2 ? -1 : 0; } return acc; }, 0) ); console.time('Chargement de VueJS AVANT Ajax'); console.time('Chargement de VueJs APRES Ajax'); Vue.nextTick(function() { console.timeEnd('Chargement de VueJS AVANT Ajax'); }); let monTableau = { props: { tparpage: { type: Array, default: function() { return [10, 20, 50, 'Tous']; } }, apiuri: { type: String, required: true }, objet: { type: String } }, data: function() { return { message: `Hello Vue ! `, table: [], header: [], crayons: [], search: '', page: 1, parPage: this.tparpage[0], parPageSelect: this.tparpage[0], pages: [], triOrders: [], triProps: [] }; }, mounted() { this.chargerJson(); }, computed: { tableau: function() { console.log('computed tableau'); return this.pagination( this.table.filter(ligne => { if (this.search) { if (!Object.values(ligne).every(el => el.indexOf(this.search))) { return ligne; } } else { return ligne; } }) ); } }, watch: { tableau() { this.setPages(); }, parPageSelect(e) { if (!parseInt(e)) { this.parPage = this.table.length; } else { this.parPage = e; } } }, methods: { chargerJson() { fetch(this.apiuri) .then(response => response.json()) .then(data => { let config = data.shift(); this.header = config.header; this.crayons = config.crayons; this.table = data; Vue.nextTick(function() { console.timeEnd('Chargement de VueJs APRES Ajax'); }); }) .catch(error => console.log(error)); }, setPages() { let nombreDePages = Math.ceil(this.table.length / this.parPage); this.pages = []; for (let index = 1; index <= nombreDePages; index++) { this.pages.push(index); } }, pagination(tableau) { let page = this.page; let parPage = this.parPage; let from = page * parPage - parPage; let to = page * parPage; return tableau.slice(from, to); }, afficher_crayons(name, id) { if (Object.keys(this.crayons).indexOf(name) !== -1) { return `crayon ${this.crayons[name]}-${name}-${id}`; } }, tri(col, sens) { const i = this.triProps.indexOf(col); if (i !== -1) { this.triOrders[i] = sens; } else { this.triProps.push(col); this.triOrders.push(sens); } this.table = orderBy(this.table, this.triProps, this.triOrders); }, ordreActif(col, sens) { const i = this.triProps.indexOf(col); if (i !== -1) { if (this.triOrders[i] === sens) { return 'active'; } } }, resetTri() { this.table = orderBy(this.table, ['id']); this.triOrders = []; this.triProps = []; } }, template: `

{{ message }}

{{head}}
{{td}}
{{table.length}} éléments
` }; let app = new Vue({ el: '#app', components: { monTableau }, methods: { rechargerJson() { this.$refs.montableau.chargerJson(); } } });