forked from rc/aircox
work on lists filters + nav items
This commit is contained in:
@ -13,6 +13,7 @@ export const defaultConfig = {
|
||||
export default class AppBuilder {
|
||||
constructor(config={}) {
|
||||
this._config = config;
|
||||
this.title = null;
|
||||
this.app = null;
|
||||
}
|
||||
|
||||
@ -46,7 +47,7 @@ export default class AppBuilder {
|
||||
})
|
||||
}
|
||||
|
||||
load({async=false,content=null, title=null, url=null}={}) {
|
||||
load({async=false,content=null,title=null}={}) {
|
||||
var self = this;
|
||||
return new Promise((resolve, reject) => {
|
||||
let func = () => {
|
||||
@ -60,9 +61,6 @@ export default class AppBuilder {
|
||||
el.innerHTML = content
|
||||
if(title)
|
||||
document.title = title;
|
||||
if(url && content)
|
||||
history.pushState({ content: content, title: title }, '', url)
|
||||
|
||||
this.app = new Vue(config);
|
||||
resolve(self.app)
|
||||
} catch(error) {
|
||||
@ -73,7 +71,22 @@ export default class AppBuilder {
|
||||
});
|
||||
}
|
||||
|
||||
loadFromState(state) {
|
||||
/// Save application state into browser history
|
||||
historySave(url,replace=false) {
|
||||
const el = document.querySelector(this.config.el);
|
||||
const state = {
|
||||
content: el.innerHTML,
|
||||
title: document.title,
|
||||
};
|
||||
|
||||
if(replace)
|
||||
history.replaceState(state, '', url)
|
||||
else
|
||||
history.pushState(state, '', url)
|
||||
}
|
||||
|
||||
/// Load application from browser history's state
|
||||
historyLoad(state) {
|
||||
return this.load({ content: state.content, title: state.title });
|
||||
}
|
||||
}
|
||||
|
@ -40,6 +40,7 @@ window.aircox = {
|
||||
get playerApp() { return this.playerBuilder && this.playerBuilder.app },
|
||||
get player() { return this.playerApp && this.playerApp.$refs.player },
|
||||
|
||||
// Handle hot-reload (link click and form submits).
|
||||
onPageFetch(event) {
|
||||
let submit = event.type == 'submit';
|
||||
let target = submit || event.target.tagName == 'A'
|
||||
@ -62,7 +63,9 @@ window.aircox = {
|
||||
options['body'] = formData;
|
||||
}
|
||||
}
|
||||
this.appBuilder.fetch(url, options);
|
||||
this.appBuilder.fetch(url, options).then(app => {
|
||||
this.appBuilder.historySave(url);
|
||||
});
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
},
|
||||
@ -76,12 +79,16 @@ aircox.playerBuilder = new AppBuilder({el: '#player'});
|
||||
aircox.playerBuilder.load({async:true});
|
||||
aircox.appBuilder = new AppBuilder(x => window.aircox.appConfig);
|
||||
aircox.appBuilder.load({async:true}).then(app => {
|
||||
aircox.appBuilder.historySave(document.location, true);
|
||||
|
||||
//-- load page hooks
|
||||
window.addEventListener('click', event => aircox.onPageFetch(event), true);
|
||||
window.addEventListener('submit', event => aircox.onPageFetch(event), true);
|
||||
window.addEventListener('popstate', event => {
|
||||
if(event.state && event.state.content)
|
||||
aircox.appBuilder.loadFromState(event.state);
|
||||
if(event.state && event.state.content) {
|
||||
document.title = aircox.appBuilder.title;
|
||||
aircox.appBuilder.historyLoad(event.state);
|
||||
}
|
||||
});
|
||||
})
|
||||
|
||||
|
Reference in New Issue
Block a user