eyecandy
This commit is contained in:
@@ -47,17 +47,7 @@ On Windows PowerShell, activate the environment with:
|
||||
.venv\Scripts\Activate.ps1
|
||||
```
|
||||
|
||||
The SQLite database is created automatically at `backend/data/linklog.db` when the application starts or when the auth router is imported. The starter accounts are:
|
||||
|
||||
|
||||
|
||||
| Username | Password | Role |
|
||||
| --- | --- | --- |
|
||||
| `alice` | `secret123` | administrator |
|
||||
| `bob` | `secret123` | standard user |
|
||||
|
||||
|
||||
These credentials are for development only. Change the authentication and seeding design before deploying publicly.
|
||||
The SQLite database is created automatically at `backend/data/linklog.db` when the application starts. On a fresh installation, open `/setup` and create the first administrator. No default user accounts are created by the application. The setup page also collects SMTP settings and requires a successful test email before creating the administrator.
|
||||
|
||||
The database schema is versioned with SQLite `PRAGMA user_version`. Application startup applies all pending migrations in order, so updating the application does not require deleting an existing database. New schema changes should be added as a new numbered migration in `backend/app/database.py`; existing migration entries must remain unchanged.
|
||||
## Run The Backend
|
||||
|
||||
@@ -284,6 +284,26 @@ Add three other popular themes.
|
||||
### Assistant outcome
|
||||
Added Dracula, Nord, and Solarized themes to the administrator’s multi-theme selector and the visitor theme picker, with matching backend registry entries, CSS palettes, test coverage, and documentation.
|
||||
|
||||
### User
|
||||
Show tags in the LinkLog on the bottom left, move the date to the bottom right, and horizontally align the tags with the date.
|
||||
|
||||
### Assistant outcome
|
||||
Grouped tags and dates into a shared bottom metadata row, placing tags on the left and the date on the right with responsive wrapping for narrow screens.
|
||||
|
||||
## 2026-08-26
|
||||
|
||||
### User
|
||||
Continue todos.
|
||||
|
||||
### Assistant outcome
|
||||
Reviewed the requirements and source for unfinished TODO markers. No implementation TODOs remain; corrected the README’s stale default-account instructions to match the current first-run administrator setup flow, then validated the project.
|
||||
|
||||
### User
|
||||
Do not show `no comment provided`; leave the comment empty when no comment has been provided.
|
||||
|
||||
### Assistant outcome
|
||||
Changed feed rendering to leave the comment area empty when a link has no comment, removing the `No comment provided` placeholder. Added a regression assertion and validated the change.
|
||||
|
||||
### User
|
||||
Show the avatar with each entry on the home page. On the specific /<user>/ page don't show the avatar and user name with each entry
|
||||
|
||||
|
||||
@@ -133,6 +133,9 @@
|
||||
124. In the admin screen allow to select multiple themes for the backend. Create at least one plain day and one night theme, and add in all catpuccin themes for good measure.
|
||||
125. For the day and latte themes the contrast on the link items is too low.
|
||||
126. Add 3 other of the most popular themes.
|
||||
127. Show the tags in the linklog on the bottom left, move the date to the bottom right - horizontally align the tags with the date.
|
||||
128. Continue todos.
|
||||
129. Do not show 'no comment provided' but leave empty when no comment has been provided.
|
||||
|
||||
## Future entries
|
||||
|
||||
|
||||
@@ -493,6 +493,9 @@ def test_public_and_admin_pages_render_html():
|
||||
assert 'postToMastodon(item, mastodonButton)' in feed_script
|
||||
assert 'tag.toLowerCase() === pref.tag.toLowerCase()' in feed_script
|
||||
assert 'return `${date.getFullYear()} ${months[date.getMonth()]} ${date.getDate()} - ${hours}:${minutes}`' in feed_script
|
||||
assert "entryMeta.className = 'entry-meta'" in feed_script
|
||||
assert "meta.className = 'meta'" in feed_script
|
||||
assert "comment.textContent = item.comment || ''" in feed_script
|
||||
assert 'profileLink.href = `/${encodeURIComponent(username)}/`' in feed_script
|
||||
assert 'edit-tag-options' in feed_script
|
||||
assert 'new_tags' in feed_script
|
||||
|
||||
@@ -104,18 +104,22 @@ function renderFeed(items, showIdentity = true) {
|
||||
|
||||
const comment = document.createElement('div');
|
||||
comment.className = 'comment';
|
||||
comment.textContent = item.comment || 'No comment provided';
|
||||
comment.textContent = item.comment || '';
|
||||
|
||||
const entryMeta = document.createElement('div');
|
||||
entryMeta.className = 'entry-meta';
|
||||
|
||||
if (item.tags?.length) {
|
||||
const tags = document.createElement('div');
|
||||
tags.className = 'entry-tags';
|
||||
tags.textContent = item.tags.join(' ');
|
||||
article.appendChild(tags);
|
||||
tags.textContent = item.tags.join(' ');
|
||||
entryMeta.appendChild(tags);
|
||||
}
|
||||
|
||||
const meta = document.createElement('div');
|
||||
meta.className = 'meta';
|
||||
meta.textContent = formatDate(item.created_at);
|
||||
entryMeta.appendChild(meta);
|
||||
|
||||
if (item.is_owner && !showIdentity) {
|
||||
const actions = document.createElement('div');
|
||||
@@ -161,7 +165,7 @@ function renderFeed(items, showIdentity = true) {
|
||||
}
|
||||
article.appendChild(title);
|
||||
article.appendChild(comment);
|
||||
article.appendChild(meta);
|
||||
article.appendChild(entryMeta);
|
||||
feedEl.appendChild(article);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -632,7 +632,7 @@ button:disabled {
|
||||
.link-item h2 {
|
||||
margin: 0 0 8px;
|
||||
color: var(--text);
|
||||
font-size: 1.2rem;
|
||||
font-size: 1rem;
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
@@ -641,7 +641,7 @@ button:disabled {
|
||||
align-items: center;
|
||||
float: right;
|
||||
gap: 12px;
|
||||
margin: 0 0 12px 18px;
|
||||
margin: 0 0 2px 8px;
|
||||
}
|
||||
|
||||
.user-link {
|
||||
@@ -694,18 +694,27 @@ button:disabled {
|
||||
}
|
||||
|
||||
.meta {
|
||||
margin-top: 4px;
|
||||
margin-left: auto;
|
||||
color: var(--muted);
|
||||
font-size: 0.82rem;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.entry-tags {
|
||||
margin-top: 12px;
|
||||
color: var(--mauve);
|
||||
font-size: 0.85rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.entry-meta {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
justify-content: space-between;
|
||||
clear: both;
|
||||
gap: 16px;
|
||||
margin-top: 14px;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.container {
|
||||
padding: 0 14px;
|
||||
@@ -759,6 +768,16 @@ button:disabled {
|
||||
padding: 14px;
|
||||
}
|
||||
|
||||
.entry-meta {
|
||||
align-items: flex-start;
|
||||
flex-wrap: wrap;
|
||||
gap: 4px 12px;
|
||||
}
|
||||
|
||||
.meta {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.toolbar label,
|
||||
select,
|
||||
input,
|
||||
|
||||
Reference in New Issue
Block a user