From 590ae01055cd396ecccf734a2db6e69b202b8649 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 28 Oct 2026 11:54:19 -0700 Subject: [PATCH] Big update to deploy scripts, and deploy prosecss --- buildAndUpdateProd.sh | 31 - client/.gitignore | 30 +- .../.vscode/extensions.json | 0 client/README.md | 20 +- client/babel.config.js | 5 - {v2client-vite-vue3 => client}/index.html | 0 client/jsconfig.json | 19 - client/package-lock.json | 17745 ---------------- client/package.json | 44 +- {v2client-vite-vue3 => client}/pnpm-lock.yaml | 0 .../pnpm-workspace.yaml | 0 client/public/favicon.ico | Bin 0 -> 41662 bytes .../img/icons/android-chrome-192x192.png | Bin 9416 -> 0 bytes .../img/icons/android-chrome-512x512.png | Bin 29808 -> 0 bytes .../icons/android-chrome-maskable-192x192.png | Bin 6401 -> 0 bytes .../icons/android-chrome-maskable-512x512.png | Bin 23038 -> 0 bytes .../img/icons/apple-touch-icon-120x120.png | Bin 3369 -> 0 bytes .../img/icons/apple-touch-icon-152x152.png | Bin 4046 -> 0 bytes .../public/img/icons/apple-touch-icon-180.png | Bin 0 -> 4795 bytes .../img/icons/apple-touch-icon-180x180.png | Bin 4678 -> 0 bytes .../img/icons/apple-touch-icon-60x60.png | Bin 1491 -> 0 bytes .../img/icons/apple-touch-icon-76x76.png | Bin 1823 -> 0 bytes client/public/img/icons/apple-touch-icon.png | Bin 4678 -> 0 bytes client/public/img/icons/favicon-16x16.png | Bin 799 -> 0 bytes client/public/img/icons/favicon-32x32.png | Bin 1271 -> 0 bytes client/public/img/icons/icon-192.png | Bin 0 -> 5382 bytes client/public/img/icons/icon-512.png | Bin 0 -> 13032 bytes client/public/img/icons/logo-maskable.svg | 12 + client/public/img/icons/logo.svg | 9 + client/public/img/icons/maskable-192.png | Bin 0 -> 4964 bytes client/public/img/icons/maskable-512.png | Bin 0 -> 11727 bytes .../img/icons/msapplication-icon-144x144.png | Bin 1169 -> 0 bytes client/public/img/icons/mstile-150x150.png | Bin 4282 -> 0 bytes client/public/img/icons/safari-pinned-tab.svg | 3 - client/public/index.html | 70 - client/public/manifest.json | 78 + client/public/robots.txt | 2 - client/src/App.vue | 83 +- client/src/EventBus.js | 18 +- client/src/Helpers.js | 9 +- client/src/LaunchPage.js | 81 + client/src/assets/semantic-helper.css | 5 + .../src/assets/vue.svg | 0 client/src/components/FileUploadButton.vue | 3 +- client/src/components/GlobalSiteMenu.vue | 9 +- client/src/components/LoginFormComponent.vue | 6 +- client/src/components/LogoComponent.vue | 12 - .../components/Metrictracking/LineGraph.vue | 0 .../Metrictracking/MetricGraphsComponent.vue | 183 +- .../Metrictracking/PillCalendarGraph.vue | 102 +- client/src/components/NoteInputPanel.vue | 267 +- .../src/components/NoteTitleDisplayCard.vue | 7 +- client/src/components/SearchInput.vue | 3 +- .../src/components/SideSlideMenuComponent.vue | 5 +- client/src/components/SvgDisplayer.vue | 86 +- .../components/TextColorTooltipComponent.vue | 3 +- client/src/components/UpdatePrompt.vue | 62 + client/src/main.js | 86 +- client/src/mixins/SquireButtonFunctions.js | 10 +- client/src/pages/AttachmentsPage.vue | 9 +- client/src/pages/BookmarkletPage.vue | 4 +- client/src/pages/CycletrackingPage.vue | 593 +- client/src/pages/HelpPage.vue | 2 +- client/src/pages/HomePage.vue | 13 +- client/src/pages/LoginPage.vue | 3 +- client/src/pages/MetrictrackingPage.vue | 3435 +-- client/src/pages/NotesPage.vue | 208 +- client/src/pages/OverviewPage.vue | 1523 +- client/src/pages/QuickPage.vue | 2 +- client/src/pages/SettingsPage.vue | 54 +- client/src/pages/ShareTargetPage.vue | 148 + client/src/registerServiceWorker.js | 48 + client/src/router/index.js | 168 +- client/src/store/index.js | 15 - client/src/stores/mainStore.js | 7 +- {v2client-vite-vue3 => client}/src/style.css | 0 .../src/tailwind.css | 0 {v2client-vite-vue3 => client}/vite.config.js | 2 +- client/vue.config.js | 23 - configs/nginx-nixos.nix | 90 + deploy.sh | 86 + package-lock.json | 10729 ---------- pnpm-lock.yaml | 4322 ++++ server/ecosystem.config.js | 15 +- startLocalDev.sh | 10 +- v2client-vite-vue3/.gitignore | 24 - v2client-vite-vue3/README.md | 5 - v2client-vite-vue3/package-lock.json | 1766 -- v2client-vite-vue3/package.json | 32 - v2client-vite-vue3/src/App.vue | 242 - v2client-vite-vue3/src/EventBus.js | 12 - v2client-vite-vue3/src/Helpers.js | 68 - .../src/assets/roboto-latin-bold.woff2 | Bin 11020 -> 0 bytes .../src/assets/roboto-latin.woff2 | Bin 11016 -> 0 bytes .../src/assets/semantic-helper.css | 1008 - v2client-vite-vue3/src/assets/squire.js | 5015 ----- .../components/AnimatedCounterComponent.vue | 112 - .../src/components/AttachmentDisplayCard.vue | 245 - .../src/components/ColorPicker.vue | 175 - .../src/components/FastFilters.vue | 93 - .../src/components/FileUploadButton.vue | 94 - .../GlobalNotificationComponent.vue | 171 - .../src/components/GlobalSiteMenu.vue | 541 - .../src/components/HelloWorld.vue | 60 - .../src/components/LoadingIconComponent.vue | 55 - .../src/components/LoginFormComponent.vue | 243 - .../src/components/LogoComponent.vue | 88 - .../Metrictracking/MetricGraphsComponent.vue | 348 - .../Metrictracking/PillCalendarGraph.vue | 636 - .../src/components/ModalComponent.vue | 164 - .../components/NoteDeleteButtonComponent.vue | 43 - .../src/components/NoteInputPanel.vue | 1799 -- .../components/NoteMenuButtonComponent.vue | 43 - .../src/components/NoteTagEdit.vue | 339 - .../src/components/NoteTitleDisplayCard.vue | 768 - .../src/components/PasteButton.vue | 116 - .../src/components/SearchInput.vue | 222 - .../src/components/ShareNoteComponent.vue | 176 - .../src/components/SideSlideMenuComponent.vue | 162 - .../SimpleAttachmentNoteComponent.vue | 123 - .../src/components/SvgDisplayer.vue | 44 - .../src/components/TagDisplayComponent.vue | 148 - .../components/TextColorTooltipComponent.vue | 121 - v2client-vite-vue3/src/main.js | 51 - .../src/mixins/SquireButtonFunctions.js | 443 - .../src/pages/AttachmentsPage.vue | 256 - .../src/pages/BookmarkletPage.vue | 66 - .../src/pages/CycletrackingPage.vue | 298 - v2client-vite-vue3/src/pages/HelpPage.vue | 24 - v2client-vite-vue3/src/pages/HomePage.vue | 622 - v2client-vite-vue3/src/pages/LoginPage.vue | 54 - .../src/pages/MetrictrackingPage.vue | 1747 -- v2client-vite-vue3/src/pages/NotFoundPage.vue | 30 - v2client-vite-vue3/src/pages/NotesPage.vue | 1140 - v2client-vite-vue3/src/pages/OverviewPage.vue | 764 - v2client-vite-vue3/src/pages/QuickPage.vue | 171 - v2client-vite-vue3/src/pages/SettingsPage.vue | 333 - v2client-vite-vue3/src/pages/SharePage.vue | 122 - v2client-vite-vue3/src/pages/TermsPage.vue | 17 - v2client-vite-vue3/src/router/index.js | 41 - v2client-vite-vue3/src/stores/mainStore.js | 196 - 141 files changed, 8483 insertions(+), 53810 deletions(-) delete mode 100755 buildAndUpdateProd.sh rename {v2client-vite-vue3 => client}/.vscode/extensions.json (100%) delete mode 100644 client/babel.config.js rename {v2client-vite-vue3 => client}/index.html (100%) delete mode 100644 client/jsconfig.json delete mode 100644 client/package-lock.json rename {v2client-vite-vue3 => client}/pnpm-lock.yaml (100%) rename {v2client-vite-vue3 => client}/pnpm-workspace.yaml (100%) create mode 100755 client/public/favicon.ico delete mode 100644 client/public/img/icons/android-chrome-192x192.png delete mode 100644 client/public/img/icons/android-chrome-512x512.png delete mode 100644 client/public/img/icons/android-chrome-maskable-192x192.png delete mode 100644 client/public/img/icons/android-chrome-maskable-512x512.png delete mode 100644 client/public/img/icons/apple-touch-icon-120x120.png delete mode 100644 client/public/img/icons/apple-touch-icon-152x152.png create mode 100644 client/public/img/icons/apple-touch-icon-180.png delete mode 100644 client/public/img/icons/apple-touch-icon-180x180.png delete mode 100644 client/public/img/icons/apple-touch-icon-60x60.png delete mode 100644 client/public/img/icons/apple-touch-icon-76x76.png delete mode 100644 client/public/img/icons/apple-touch-icon.png delete mode 100644 client/public/img/icons/favicon-16x16.png delete mode 100644 client/public/img/icons/favicon-32x32.png create mode 100644 client/public/img/icons/icon-192.png create mode 100644 client/public/img/icons/icon-512.png create mode 100644 client/public/img/icons/logo-maskable.svg create mode 100644 client/public/img/icons/logo.svg create mode 100644 client/public/img/icons/maskable-192.png create mode 100644 client/public/img/icons/maskable-512.png delete mode 100644 client/public/img/icons/msapplication-icon-144x144.png delete mode 100644 client/public/img/icons/mstile-150x150.png delete mode 100644 client/public/img/icons/safari-pinned-tab.svg delete mode 100644 client/public/index.html create mode 100644 client/public/manifest.json delete mode 100644 client/public/robots.txt create mode 100644 client/src/LaunchPage.js rename {v2client-vite-vue3 => client}/src/assets/vue.svg (100%) rename {v2client-vite-vue3 => client}/src/components/Metrictracking/LineGraph.vue (100%) create mode 100644 client/src/components/UpdatePrompt.vue create mode 100644 client/src/pages/ShareTargetPage.vue create mode 100644 client/src/registerServiceWorker.js delete mode 100644 client/src/store/index.js rename {v2client-vite-vue3 => client}/src/style.css (100%) rename {v2client-vite-vue3 => client}/src/tailwind.css (100%) rename {v2client-vite-vue3 => client}/vite.config.js (98%) delete mode 100644 client/vue.config.js create mode 100644 configs/nginx-nixos.nix create mode 100755 deploy.sh delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml delete mode 100644 v2client-vite-vue3/.gitignore delete mode 100644 v2client-vite-vue3/README.md delete mode 100644 v2client-vite-vue3/package-lock.json delete mode 100644 v2client-vite-vue3/package.json delete mode 100644 v2client-vite-vue3/src/App.vue delete mode 100644 v2client-vite-vue3/src/EventBus.js delete mode 100644 v2client-vite-vue3/src/Helpers.js delete mode 100644 v2client-vite-vue3/src/assets/roboto-latin-bold.woff2 delete mode 100644 v2client-vite-vue3/src/assets/roboto-latin.woff2 delete mode 100644 v2client-vite-vue3/src/assets/semantic-helper.css delete mode 100644 v2client-vite-vue3/src/assets/squire.js delete mode 100644 v2client-vite-vue3/src/components/AnimatedCounterComponent.vue delete mode 100644 v2client-vite-vue3/src/components/AttachmentDisplayCard.vue delete mode 100644 v2client-vite-vue3/src/components/ColorPicker.vue delete mode 100644 v2client-vite-vue3/src/components/FastFilters.vue delete mode 100644 v2client-vite-vue3/src/components/FileUploadButton.vue delete mode 100644 v2client-vite-vue3/src/components/GlobalNotificationComponent.vue delete mode 100644 v2client-vite-vue3/src/components/GlobalSiteMenu.vue delete mode 100644 v2client-vite-vue3/src/components/HelloWorld.vue delete mode 100644 v2client-vite-vue3/src/components/LoadingIconComponent.vue delete mode 100644 v2client-vite-vue3/src/components/LoginFormComponent.vue delete mode 100644 v2client-vite-vue3/src/components/LogoComponent.vue delete mode 100644 v2client-vite-vue3/src/components/Metrictracking/MetricGraphsComponent.vue delete mode 100644 v2client-vite-vue3/src/components/Metrictracking/PillCalendarGraph.vue delete mode 100644 v2client-vite-vue3/src/components/ModalComponent.vue delete mode 100644 v2client-vite-vue3/src/components/NoteDeleteButtonComponent.vue delete mode 100644 v2client-vite-vue3/src/components/NoteInputPanel.vue delete mode 100644 v2client-vite-vue3/src/components/NoteMenuButtonComponent.vue delete mode 100644 v2client-vite-vue3/src/components/NoteTagEdit.vue delete mode 100644 v2client-vite-vue3/src/components/NoteTitleDisplayCard.vue delete mode 100644 v2client-vite-vue3/src/components/PasteButton.vue delete mode 100644 v2client-vite-vue3/src/components/SearchInput.vue delete mode 100644 v2client-vite-vue3/src/components/ShareNoteComponent.vue delete mode 100644 v2client-vite-vue3/src/components/SideSlideMenuComponent.vue delete mode 100644 v2client-vite-vue3/src/components/SimpleAttachmentNoteComponent.vue delete mode 100644 v2client-vite-vue3/src/components/SvgDisplayer.vue delete mode 100644 v2client-vite-vue3/src/components/TagDisplayComponent.vue delete mode 100644 v2client-vite-vue3/src/components/TextColorTooltipComponent.vue delete mode 100644 v2client-vite-vue3/src/main.js delete mode 100644 v2client-vite-vue3/src/mixins/SquireButtonFunctions.js delete mode 100644 v2client-vite-vue3/src/pages/AttachmentsPage.vue delete mode 100644 v2client-vite-vue3/src/pages/BookmarkletPage.vue delete mode 100644 v2client-vite-vue3/src/pages/CycletrackingPage.vue delete mode 100644 v2client-vite-vue3/src/pages/HelpPage.vue delete mode 100644 v2client-vite-vue3/src/pages/HomePage.vue delete mode 100644 v2client-vite-vue3/src/pages/LoginPage.vue delete mode 100644 v2client-vite-vue3/src/pages/MetrictrackingPage.vue delete mode 100644 v2client-vite-vue3/src/pages/NotFoundPage.vue delete mode 100644 v2client-vite-vue3/src/pages/NotesPage.vue delete mode 100644 v2client-vite-vue3/src/pages/OverviewPage.vue delete mode 100644 v2client-vite-vue3/src/pages/QuickPage.vue delete mode 100644 v2client-vite-vue3/src/pages/SettingsPage.vue delete mode 100644 v2client-vite-vue3/src/pages/SharePage.vue delete mode 100644 v2client-vite-vue3/src/pages/TermsPage.vue delete mode 100644 v2client-vite-vue3/src/router/index.js delete mode 100644 v2client-vite-vue3/src/stores/mainStore.js diff --git a/buildAndUpdateProd.sh b/buildAndUpdateProd.sh deleted file mode 100755 index cc773c2..0000000 --- a/buildAndUpdateProd.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - - -# -# Push built release files to production server -# - -echo -e "\e[32m\nStarting Build. \n\e[0m" - -# Build out new release -cd client -npm run build -cd .. - -# only compress client/dist and server with node_modules -echo -e "\e[32m\nCompressing client and server code... \n\e[0m" -tar -czf release.tar.gz server node_modules client/dist staticFiles/assets - -#send compressed release to remote machine -echo -e "\e[32m\nMoving compressed release to production... \n\e[0m" -rsync -e 'ssh -p 13328' -havzC --update release.tar.gz mab@45.79.41.75:/home/mab/pi/ - -# Remove Release from local after its been uploaded -rm release.tar.gz - -#uncompress release on server -echo -e "\e[32m\nExtracting release on production... \n\e[0m" -ssh mab@45.79.41.75 -p 13328 "cd /home/mab/pi/; rm -r server node_modules client; tar -xzf *.tar.gz --overwrite; rm *.tar.gz; pm2 reload all" - -#Congratulate how awesome you are -echo -e "\e[32m\nRelease Complete! Nice Work! \n\e[0m" \ No newline at end of file diff --git a/client/.gitignore b/client/.gitignore index 078b834..9769e79 100644 --- a/client/.gitignore +++ b/client/.gitignore @@ -1,26 +1,28 @@ -.DS_Store -node_modules -/dist - - -# local env files -.env.local -.env.*.local -*.pem -*.crt -*.key - -# Log files +# Logs +logs +*.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local # Editor directories and files +.vscode/* +!.vscode/extensions.json .idea -.vscode +.DS_Store *.suo *.ntvs* *.njsproj *.sln *.sw? + +# Local dev TLS certs (mkcert) +*.pem +certs/ diff --git a/v2client-vite-vue3/.vscode/extensions.json b/client/.vscode/extensions.json similarity index 100% rename from v2client-vite-vue3/.vscode/extensions.json rename to client/.vscode/extensions.json diff --git a/client/README.md b/client/README.md index 2dae4fc..1511959 100644 --- a/client/README.md +++ b/client/README.md @@ -1,19 +1,5 @@ -# client +# Vue 3 + Vite -## Project setup -``` -npm install -``` +This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` \ No newline at end of file diff --git a/client/src/components/Metrictracking/PillCalendarGraph.vue b/client/src/components/Metrictracking/PillCalendarGraph.vue index a18aa17..0d4c46e 100644 --- a/client/src/components/Metrictracking/PillCalendarGraph.vue +++ b/client/src/components/Metrictracking/PillCalendarGraph.vue @@ -81,6 +81,13 @@ } + .days-since { + padding: 0.75em 0.5em 0.25em 0.5em; + font-size: 0.95em; + } + .days-since-row { + padding: 0.15em 0; + } .pill-container { width: 100%; } @@ -229,36 +236,47 @@ - + + +
+
+ + Days Since {{ entry.label }} - no entries yet + Days Since {{ entry.label }} - {{ entry.days }} {{ entry.days === 1 ? 'day' : 'days' }}. +
+
@@ -269,6 +287,7 @@ // let chartData = {} export default { + inject: ['getFieldColor', 'getFieldIcon', 'getFieldLabel'], props: [ 'graph', // options associated with this graph 'userFields', // all field attributes @@ -309,6 +328,53 @@ this.setupCalendar(new Date()) }, computed: { + // "Days Since - days" for every field on this graph. + // Counts a day as recorded only if it passes the same + // showZeroValuesCheck the pills use, so the "Show/Hide Lowest Value" + // toggle moves these numbers too. + daysSince(){ + + // showZeroValuesCheck reads lowestGraphValue, which getChartData + // assigns as a side effect -- touch it so the threshold is current + // and so this recomputes whenever the chart data does. + void this.getChartData + + const dayMs = 86400000 + const midnight = (time) => { + const date = new Date(time) + date.setHours(0, 0, 0, 0) + return date.getTime() + } + const today = midnight(Date.now()) + + return (this.graph?.fieldIds || []).map(fieldId => { + + let latest = null + + Object.keys(this.cycleData || {}).forEach(dateCode => { + + const value = this.cycleData[dateCode]?.[fieldId] + if(value === undefined || value === null || value === ''){ return } + + // honour the Lowest Value toggle + if(!this.showZeroValuesCheck(value, fieldId)){ return } + + const time = this.dateCodeToTime(dateCode) + // ignore unparseable codes and anything dated ahead of today + if(time === null || time > today){ return } + + if(latest === null || time > latest){ latest = time } + }) + + return { + fieldId, + label: this.getFieldLabel(fieldId), + icon: this.getFieldIcon(fieldId), + color: this.getFieldColor(fieldId), + days: latest === null ? null : Math.round((today - latest) / dayMs), + } + }) + }, getChartData(){ let chartData = {} @@ -389,11 +455,26 @@ }, }, methods: { + // Date codes are stored unpadded as D.M.YYYY + dateCodeToTime(dateCode){ + + const parts = String(dateCode).split('.').map(Number) + if(parts.length !== 3 || parts.some(isNaN)){ return null } + + const [day, month, year] = parts + const date = new Date(year, month - 1, day) + date.setHours(0, 0, 0, 0) + + return isNaN(date.getTime()) ? null : date.getTime() + }, showZeroValuesCheck(dayValue, fieldId){ + // Optional chaining: a graph can reference a default field (BT, + // CM, ...) that was never customised, so it has no userFields + // entry and the bare lookup threw. // if graph type is boolean or there are two options - let isBooleanField = this.userFields[fieldId].type == 'boolean' - if(this.userFields[fieldId].customOptions){ + let isBooleanField = this.userFields[fieldId]?.type == 'boolean' + if(this.userFields[fieldId]?.customOptions){ let options = this.userFields[fieldId].customOptions isBooleanField = options.split(',').length == 2 @@ -411,6 +492,13 @@ } + // lowestGraphValue comes from Math.min of the charted values, so + // it is Infinity when the window holds no data -- without the + // finite guard nothing would ever clear the threshold. + if(!isFinite(this.lowestGraphValue)){ + return true + } + return this.showZeroValues || dayValue > this.lowestGraphValue }, getDayValue(fieldId, value){ diff --git a/client/src/components/NoteInputPanel.vue b/client/src/components/NoteInputPanel.vue index 1cb9210..89d162e 100644 --- a/client/src/components/NoteInputPanel.vue +++ b/client/src/components/NoteInputPanel.vue @@ -62,7 +62,7 @@