Compare commits

...

3 Commits

Author SHA1 Message Date
ae
75483db66a
docs: readme with features & usage 2025-05-06 15:54:44 +03:00
ae
b455c3dfee
fix: expiration logging & display 2025-05-06 15:36:11 +03:00
ae
6a4754b1ea
fix: sidebar user menu button width 2025-05-06 14:35:30 +03:00
5 changed files with 42 additions and 9 deletions

31
README.md Normal file
View File

@ -0,0 +1,31 @@
<div align="center" style="text:align:center">
<img src="docs/media/logo.png" width="60%">
</div>
## Features
Available:
- Markdown support (Github flavored)
- Note version history
- Automatic note expiration via `@exp:` title prefixes
- Keyboard navigation support
- User account administration
Waiting to be implemented:
- (Bulk) import/export (Markdown, PDF)
- Webhooks
## Usage
The Dockerized app can be run in fullstack (`docker-compose-full.yml`) and backend (`docker-compose-back.yml`) modes. In backend mode only the Golang server (and the Postgres database) are containerized and the frontend can be run separately for quicker development (`npm run dev`). The default fullstack setup defaults to exposing port 3000.
The `./scripts/run_dev.sh -h` output can be used as reference of running each of the available modes (or purging data from previous test runs with `-p` or `-q`):
```
[?] usage: ./scripts/run_dev.sh [-h|-f|-p]
-f run both frontend and backend (default: false)
-p purge any existing database artifacts (default: false)
-q only purge old data without building/spawning any new containers (default: false)
```

BIN
docs/media/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -225,6 +225,7 @@ func parseTitleExpiration(title *string) (*time.Time, error) {
// Set midnight at the end of the specified day (+0000 UTC)
expiresAt = time.Date(expiresAt.Year(), expiresAt.Month(), expiresAt.Day(), 23, 59, 59, 0, time.UTC)
log.Debug().Msgf("Parsed absolute expiration date '%s' from input '%s'", expiresAt, dateStr)
return &expiresAt, nil
}
@ -261,6 +262,7 @@ func parseTitleExpiration(title *string) (*time.Time, error) {
// Set midnight at the end of the specified day (+0000 UTC)
expiresAt = time.Date(expiresAt.Year(), expiresAt.Month(), expiresAt.Day(), 23, 59, 59, 0, time.UTC)
log.Debug().Msgf("Parsed relative expiration date '%s' from input '%s%s'", expiresAt, amount, unit)
return &expiresAt, nil
}

View File

@ -224,7 +224,7 @@
>
<button
on:click={toggleUserMenu}
class="sidebar-action-button flex-wrap justify-between px-4 py-4"
class="sidebar-action-button w-full flex-wrap justify-between px-4 py-4"
>
<div class="sidebar-user-button-content-container">
<User classString="h-6 w-6 flex-shrink-0" />

View File

@ -17,17 +17,17 @@ export const formatDateLong = (dateString: string | Date): string => {
})
}
export const formatDateShort = (dateString: string | Date): string => {
if (!dateString) {
export const formatDateShort = (input: string | Date): string => {
console.log(input)
if (!input) {
return ""
}
const d = new Date(dateString)
return d.toLocaleDateString(undefined, {
weekday: "short",
year: "2-digit",
month: "short"
})
const d = input instanceof Date ? input : new Date(input)
const utcDate = new Date(d.getTime())
return `${utcDate.toLocaleString("en", { weekday: "short", day: "numeric", month: "short", year: "2-digit", timeZone: "UTC" })} UTC`
}
export const parseExpirationPrefix = (title: string): [string, string] => {