import padliographyStore from "./PadStore.js"; export default { setup() { const { ref, computed, watchEffect } = Vue; const columns = ["title", "overview", "categories", "date"]; const loaded = ref(false); const { padStore, currentPage, baseUrl } = padliographyStore(); const newPage = ref(""); const initPage = ref(""); const pageDescription = ref(""); const initialize = function () { fetch(`${baseUrl.value}/api/${initPage.value}/init`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ description: pageDescription.value, }), }).then((res) => (currentPage.value = initPage.value)); }; const edit = ref(false); const init = ref(false); const pads = ref([]); const currentSort = ref("date"); const currentSortDir = ref("desc"); const categories = ref([]); const selected = ref(new Set()); const toggle = function (tag) { selected.value.has(tag) ? selected.value.delete(tag) : selected.value.add(tag); }; watchEffect(() => { fetch(`${baseUrl.value}/api/${currentPage.value}/`) .then((res) => res.json()) .then((data) => { pads.value = data.pads; pads.value.map( (pad) => (pad.categories = pad.categories .split(",") .map((category) => category.trim())) ); categories.value = Array.from( new Set([...pads.value.map((pad) => pad.categories)].flat()) ).sort(); loaded.value = true; }); }); const sortedPads = computed(() => { return filteredPads.value.sort((a, b) => { let modifier = 1; if (currentSortDir.value === "desc") modifier = -1; if (currentSort.value === "date") { a[currentSort.value] = new Date(a[currentSort.value]); b[currentSort.value] = new Date(b[currentSort.value]); } if (a[currentSort.value] < b[currentSort.value]) return -1 * modifier; if (a[currentSort.value] > b[currentSort.value]) return 1 * modifier; return 0; }); }); const sort = function (s) { if (s == currentSort.value) { currentSortDir.value = currentSortDir.value === "asc" ? "desc" : "asc"; } currentSort.value = s; }; const filteredPads = computed(() => { if (selected.value.size == 0) return storedPads.value; else return storedPads.value.filter((pad) => { return pad.categories.some((category) => selected.value.has(category)); }); }); const storedPads = computed(() => { return [...padStore.value, ...pads.value]; }); const formatDate = function (date) { date = new Date(date); return `${String(date.getDate()).padStart(2, "0")}-${String( date.getMonth() + 1 ).padStart(2, "0")}-${date.getFullYear()}`; }; return { pads, columns, currentPage, loaded, filteredPads, categories, selected, sortedPads, currentSort, currentSortDir, toggle, sort, formatDate, initialize, padStore, storedPads, edit, init, newPage, initPage, pageDescription, }; }, template: `
git, CC4r
Loading loading loading loading loading loading loading loading loading loading loading loading loading loading loading loading loading loading etc

Filter Categories

Fetching pads from {{currentPage}}
{{column }} {{ currentSortDir == 'asc' ? '▼' : '▲'}}
{{pad.title}}

{{pad.overview}}

{{category}} {{formatDate(pad.date)}}
`, };