export default function(selector, dataPath) { Vue.use(VueMarkdown); new Vue({ el: selector, data: { filteredResources: [], allResources: [], projectCats: {}, educationCats: {}, filterVals: ['category'], activeMenu: 'all', selected: null, loading: false }, computed: { resources() { return this.filteredResources.sort((a, b) => a.id.localeCompare(b.id)); }, categories() { return Object.assign({}, this.projectCats, this.educationCats); } }, beforeMount() { this.loading = true; window.addEventListener('popstate', this.$_init); fetch(dataPath) .then(res => res.json()) .then(({ resources, projectCats, educationCats }) => { this.allResources = resources || []; this.filteredResources = resources || []; this.projectCats = projectCats || {}; this.educationCats = educationCats || {}; this.$_init(); this.loading = false; }); }, updated() { if (window.Prism) Prism.highlightAll(); // make sure scroll positions for progress bar etc. are recalculated window.dispatchEvent(new Event('resize')); }, methods: { getAuthorLink(id, link) { if (id == 'twitter') return `https://twitter.com/${link}`; else if (id == 'github') return `https://github.com/${link}`; return link; }, filterBy(id, selector = 'category') { window.scrollTo(0, 0); if (!this.filterVals.includes(selector)) { return; } const resources = this.$_filterResources(id, selector); if (!resources.length) return; this.selected = null; this.activeMenu = id; this.filteredResources = resources; }, viewResource(id) { const res = this.allResources.find(r => r.id == id); if (!res) return; this.selected = res; this.activeMenu = null; if (this.$_getQueryVar('id') != res.id) { this.$_updateUrl({ id: res.id }); } window.scrollTo(0, 0); }, $_filterResources(id, selector) { if (id == 'all') { if (window.location.search != '') { this.$_updateUrl({}); } return this.allResources; } const resources = this.allResources .filter(res => (res[selector] || []).includes(id)); if (resources.length && this.$_getQueryVar(selector) != id) { this.$_updateUrl({ [selector]: id }); } return resources; }, $_init() { const current = this.$_getQueryVar('id'); if (current) { this.viewResource(current); return; } for (let filterVal of this.filterVals) { const queryVar = this.$_getQueryVar(filterVal); if (queryVar) { this.filterBy(queryVar, filterVal); return; } } this.filterBy('all'); }, $_getQueryVar(key) { const query = window.location.search.substring(1); const params = query.split('&').map(param => param.split('=')); for(let param of params) { if (param[0] == key) { return decodeURIComponent(param[1]); } } return false; }, $_updateUrl(params) { const loc = Object.keys(params) .map(param => `${param}=${encodeURIComponent(params[param])}`); const url = loc.length ? '?' + loc.join('&') : window.location.origin + window.location.pathname; window.history.pushState(params, null, url); } } }) }