From bfd117ff205a249acbc4337799b4e29bc2b33c7a Mon Sep 17 00:00:00 2001 From: thepaperpilot Date: Mon, 29 Apr 2024 21:54:54 -0500 Subject: [PATCH] Implement snoozing items --- bun.lockb | Bin 120689 -> 144763 bytes index.html | 1 + package.json | 1 + src/components/CategoryHeader.vue | 4 +- src/components/Item.vue | 179 +++++++++++++++++++++++----- src/components/ItemGroup.vue | 16 ++- src/components/SnoozeModal.vue | 122 +++++++++++++++++++ src/components/pages/Snoozed.vue | 102 ++++++++++++++++ src/components/{ => pages}/Todo.vue | 46 +++++-- src/main.ts | 4 +- src/state.ts | 35 +++++- vite.config.ts | 6 +- 12 files changed, 461 insertions(+), 55 deletions(-) create mode 100644 src/components/SnoozeModal.vue create mode 100644 src/components/pages/Snoozed.vue rename src/components/{ => pages}/Todo.vue (65%) diff --git a/bun.lockb b/bun.lockb index 7ca304abe18b7f6fe8912c354113efada496856b..a17bfd4e859bab7be6b34547c07f5099353155a4 100644 GIT binary patch delta 34746 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 z zc)zh%V2LrmcHmokrbZ?u!YFBusY!!VBDIdtLX7r~;s z-((Ax;J0LQwz9v;o=z%DPA{6v<;TgUO&k)Nl9ZSLdpHh>O^yA*#i9o%MhgCwSmKRR zUt*H*ZCb}6nv_^gM7%b&dA)CSPmYgGbJPx_S?n04jf~g8f#In9j8U8oKW7hTVt@^Y zEAMg?E996A&WhLYoNeHLBty>>KWT+J%vZ_g?EJnRo$qum5%gVwI3^zak_@i)w`1~+ zK}za>lTEeVgr3zB`yS#baUz#KZ&A_^!h^ zYcZ}i`I<>8$qagR@x|J-q=ERtGF7sw@s$Mo*Lz2IzHk~>r-txIla!!Go0!`4gA2{` znw@yT$LlcHzKn;H2dQq$uQ-gX8K=4Wyx$?Nks-}>55CF-&bthrTJobN;msWTah!D- zJX;jv1D^tl-#&+{-TK>sDa8?~C*qP&N+ESko-_`k0lx-GRQ!4`nm~xS6wTuJylI>b zf*000q3gitp~vh^oSn74@1=fiJyj6F_vbmgaD5JWp(=^3U#t9BL^9~FOM0Uyb}bd_ z99BC`WTZA#7#nNJ9preXUtZF{H`PR2h|cuw^xTu$CpStp7`>Gh~>8UB&f(E;GX$v%%zb@8%^Lbo7et!mM=q(79cT4*F0r3B{ zj5a{zckbVKmHrl|q)Ym_qKXtZ|F?tf%4d$?8U%=%$t%-$`<$F>7Z&tt@}Eml zL%!wD@8{}O|GKN9e#kp4J~NN2S0hs1d77-r4x7$lcn%fDnsjv<{WUp7}+lic_#XcRo&(y)#f_*0;bzp3=xc$bCjy5TJ z4G&GhrWrL5JNO>MIE(0SM(sbTSz?R-gqv*Qisg;=1mDiQZ+lQ8_1pZC;p+UY0e)tt z5rBPVz97Nd9*|k}qy#Brla*=ldy9BJcYWeGPfv#azWK?ho!B$J?Ff mtg`TXVr-c#pB-F7E^FvcE~pZ3dzh=iKbed&&0(%`)&B=QG91VN delta 19244 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 + diff --git a/package.json b/package.json index 60bb06d..48dda25 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@fortawesome/fontawesome-svg-core": "^6.5.1", "@fortawesome/free-solid-svg-icons": "^6.5.1", "@fortawesome/vue-fontawesome": "latest-3", + "@vitejs/plugin-vue-jsx": "^3.1.0", "autoprefixer": "^10.4.19", "flowbite": "^2.3.0", "postcss": "^8.4.38", diff --git a/src/components/CategoryHeader.vue b/src/components/CategoryHeader.vue index e309b27..385b858 100644 --- a/src/components/CategoryHeader.vue +++ b/src/components/CategoryHeader.vue @@ -1,10 +1,10 @@ \ No newline at end of file diff --git a/src/components/ItemGroup.vue b/src/components/ItemGroup.vue index c69257b..3b99a73 100644 --- a/src/components/ItemGroup.vue +++ b/src/components/ItemGroup.vue @@ -1,9 +1,12 @@ @@ -12,11 +15,14 @@ import type { Item as StateItem, ThreadRef } from "../state"; import Item from "./Item.vue"; const emits = defineEmits<{ - selectItem: [source: number, sourceItem: number, thread: number] + selectItem: [source: number, sourceItem: number, thread: number]; + snoozeItem: [source: number, sourceItem: number, thread: number]; + deselect: []; }>(); defineProps<{ - items: StateItem[], - selectedThread?: ThreadRef + items: StateItem[]; + selectedThread?: ThreadRef; + showSnoozed?: boolean; }>(); \ No newline at end of file diff --git a/src/components/SnoozeModal.vue b/src/components/SnoozeModal.vue new file mode 100644 index 0000000..78f16d9 --- /dev/null +++ b/src/components/SnoozeModal.vue @@ -0,0 +1,122 @@ + + + diff --git a/src/components/pages/Snoozed.vue b/src/components/pages/Snoozed.vue new file mode 100644 index 0000000..d797485 --- /dev/null +++ b/src/components/pages/Snoozed.vue @@ -0,0 +1,102 @@ + + + diff --git a/src/components/Todo.vue b/src/components/pages/Todo.vue similarity index 65% rename from src/components/Todo.vue rename to src/components/pages/Todo.vue index 05dfea2..27690c6 100644 --- a/src/components/Todo.vue +++ b/src/components/pages/Todo.vue @@ -1,10 +1,16 @@ diff --git a/src/main.ts b/src/main.ts index ab6708c..fe674ce 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,11 +3,13 @@ import { createMemoryHistory, createRouter } from "vue-router"; import type { RouteRecordRaw } from "vue-router"; import "./style.css"; import App from "./App.vue"; -import Todo from "./components/Todo.vue"; +import Todo from "./components/pages/Todo.vue"; +import Snoozed from "./components/pages/Snoozed.vue"; const routes: RouteRecordRaw[] = [ { path: '/', component: Todo, name: 'home' }, { path: '/todo/:source(\\d+)?/:sourceItem(\\d+)?/:thread(\\d+)?', component: Todo, name: 'todo' }, + { path: '/snoozed/:source(\\d+)?/:sourceItem(\\d+)?/:thread(\\d+)?', component: Snoozed, name: 'snoozed' }, ]; const router = createRouter({ diff --git a/src/state.ts b/src/state.ts index 57550fb..ef2e460 100644 --- a/src/state.ts +++ b/src/state.ts @@ -86,6 +86,7 @@ export interface Category { name: string; priority: Priority; activeItems: Item[]; + snoozedItems: Item[]; } export interface ThreadRef { @@ -231,19 +232,22 @@ export const items = ref([ } ]); export const unsortedItems = ref([]); +export const unsortedItemsSnoozed = ref([]); export const rules = ref<{ category?: string; rules: Rule[] }[]>([]); export const categories = ref([ { id: 0, name: "Urgent", priority: "urgent", - activeItems: [] + activeItems: [], + snoozedItems: [] }, { id: 1, name: "DMs", priority: "notify", - activeItems: [] + activeItems: [], + snoozedItems: [] } ]); export const favorites = ref([ @@ -260,35 +264,54 @@ export const todoItems = computed(() => todoCategories.value .reduce((acc, curr) => mergeSortedLists(acc, curr.activeItems), [] as Item[]) ); -export const todoCategories = computed(() => categories.value.filter(c => ["urgent", "notify", "todo"].includes(c.priority))); +export const todoCategories = computed(() => categories.value.filter(c => ["urgent", "notify", "todo"].includes(c.priority) && Object.keys(c.activeItems).length > 0)); +export const snoozedCategories = computed(() => categories.value.filter(c => Object.keys(c.snoozedItems).length > 0)); watch( items, items => { const mappedItems: Record = {}; + const mappedItemsSnoozed: Record = {}; const unsorted: Item[] = []; + const unsortedSnoozed: Item[] = []; items.forEach(item => { let includeInUnsorted = false; + let includeInUnsortedSnoozed = false; const includeInCategories = new Set(); + const includeInCategoriesSnoozed = new Set(); Object.values(item.threads).forEach(t => { - if (t.category == null) { - includeInUnsorted = true; + if (t.snoozedUntil != null && Date.now() < t.snoozedUntil) { + if (t.category == null) { + includeInUnsortedSnoozed = true; + } else { + includeInCategoriesSnoozed.add(t.category); + } } else { - includeInCategories.add(t.category); + if (t.category == null) { + includeInUnsorted = true; + } else { + includeInCategories.add(t.category); + } } }); if (includeInUnsorted) { unsorted.push(item); } + if (includeInUnsortedSnoozed) { + unsortedSnoozed.push(item); + } includeInCategories.forEach(cat => mappedItems[cat] = [...(mappedItems[cat] ?? []), item]); + includeInCategoriesSnoozed.forEach(cat => mappedItemsSnoozed[cat] = [...(mappedItemsSnoozed[cat] ?? []), item]); }); categories.value.forEach(cat => { // Noting here that activeItems must be sorted by most recently updated cat.activeItems = mappedItems[cat.id]?.sort((a, b) => a.updatedAt - b.updatedAt) ?? []; + cat.snoozedItems = mappedItemsSnoozed[cat.id]?.sort((a, b) => a.updatedAt - b.updatedAt) ?? []; }); unsortedItems.value = unsorted; + unsortedItemsSnoozed.value = unsortedSnoozed; }, { immediate: true } ); diff --git a/vite.config.ts b/vite.config.ts index 35966e0..d148dba 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,8 +1,12 @@ import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [vue()], + plugins: [ + vue(), + vueJsx() + ], base: "/" })