Eyecandy on admin page and fix of functionality on that page
Build LinkLog Development Image / development-image (push) Successful in 11s
Build LinkLog Development Image / development-image (push) Successful in 11s
This commit is contained in:
@@ -6,6 +6,11 @@
|
|||||||
* Administrators can edit labels from the admin interface
|
* Administrators can edit labels from the admin interface
|
||||||
* Filter label visibility so logged-in users only see default/admin-created labels and their own
|
* Filter label visibility so logged-in users only see default/admin-created labels and their own
|
||||||
* Grandfather tags with unknown ownership as default/admin interface labels
|
* Grandfather tags with unknown ownership as default/admin interface labels
|
||||||
|
* Ability to minimize settings panels to only show headers in the Admin and Profile interfaces for easy navigation
|
||||||
|
* Styled settings panel headers with distinct theme accent colors for visual distinction
|
||||||
|
* Settings panels are collapsed by default when opening the Admin and Profile pages
|
||||||
|
### Fixed
|
||||||
|
* Fixed element ID conflict on the Admin page so Available Themes load correctly
|
||||||
|
|
||||||
## Version v0.1.1
|
## Version v0.1.1
|
||||||
### Features
|
### Features
|
||||||
|
|||||||
@@ -1298,3 +1298,45 @@ Update Changelog too
|
|||||||
|
|
||||||
### Assistant outcome
|
### Assistant outcome
|
||||||
Updated `CHANGELOG.MD` with the recent feature additions (user label CRUD, label visibility isolation, grandfathering unknown label ownership, and administrator label editing), and updated `VIBE/PROMPTS.md` and `VIBE/CHAT_LOG.md`.
|
Updated `CHANGELOG.MD` with the recent feature additions (user label CRUD, label visibility isolation, grandfathering unknown label ownership, and administrator label editing), and updated `VIBE/PROMPTS.md` and `VIBE/CHAT_LOG.md`.
|
||||||
|
|
||||||
|
### User
|
||||||
|
In the Admin interface allow to minimize each settings pannel to only show its header, In order to easely navigate the page.
|
||||||
|
|
||||||
|
### Assistant outcome
|
||||||
|
Added collapsible minimize/expand toggle buttons to all settings panels (`.settings-panel`) in the Admin interface. Clicking a panel header toggles its `.minimized` state and `aria-expanded` attribute, hiding the panel body content to show only the header and toggle icon. Added CSS rules and updated tests.
|
||||||
|
|
||||||
|
### User
|
||||||
|
Clicking on the collapse button doesn't toggle
|
||||||
|
|
||||||
|
### Assistant outcome
|
||||||
|
Fixed panel toggle initialization in `admin.js` to attach click handlers immediately on page load and `DOMContentLoaded` rather than waiting for async session validation calls to finish. Added `pointer-events: none` to button child elements in `style.css` and bound event listeners to target headers/buttons with event prevention to guarantee reliable click toggling.
|
||||||
|
|
||||||
|
### User
|
||||||
|
Give the header of each setting-panel a somewhat differing color
|
||||||
|
|
||||||
|
### Assistant outcome
|
||||||
|
Applied distinct theme accent colors (`var(--mauve)`, `var(--teal)`, `var(--peach)`, `var(--blue)`, `var(--lavender)`) to settings panel headers via `:nth-of-type` CSS rules, allowing panel toggle buttons to inherit the accent colors cleanly across all themes.
|
||||||
|
|
||||||
|
### User
|
||||||
|
change the background of the header too
|
||||||
|
|
||||||
|
### Assistant outcome
|
||||||
|
Added soft, translucent accent backgrounds (`color-mix` with `var(--surface-1)`) and accent left borders to each settings panel header in `style.css`. Updated `admin.js` to ensure clicking anywhere on the header bar toggles the panel minimize state cleanly. Passed all 55 tests.
|
||||||
|
|
||||||
|
### User
|
||||||
|
Make sure all setting-panels are collapsed when opening the page
|
||||||
|
|
||||||
|
### Assistant outcome
|
||||||
|
Updated `admin.html` and `admin.js` so all settings panels start with the `minimized` class and `aria-expanded="false"` by default, collapsing all panels on page open. Passed all 55 tests.
|
||||||
|
|
||||||
|
### User
|
||||||
|
Apply exactly the same functionality to the profile page
|
||||||
|
|
||||||
|
### Assistant outcome
|
||||||
|
Applied collapsible minimizable settings panels to the profile page (`user_profile.html` and `profile.js`), starting all panels collapsed by default with toggle buttons, distinct header colors/backgrounds, and aria-expanded state management. Passed all 55 tests.
|
||||||
|
|
||||||
|
### User
|
||||||
|
On the admin page under Available Themes, the page does not load available themes
|
||||||
|
|
||||||
|
### Assistant outcome
|
||||||
|
Fixed element ID conflict on `admin.html` where both the header theme submenu and the admin form container used `id="theme-options"`. Renamed the admin form container to `id="admin-theme-options"` and updated `admin.js` to target `#admin-theme-options`. Available themes now load correctly on the admin page. Passed all 55 tests.
|
||||||
|
|||||||
@@ -228,6 +228,17 @@
|
|||||||
215. Make sure that in the admin interface the labels can be edited
|
215. Make sure that in the admin interface the labels can be edited
|
||||||
216. Make sure that the logs in VIBE are updated
|
216. Make sure that the logs in VIBE are updated
|
||||||
217. Update Changelog too
|
217. Update Changelog too
|
||||||
|
218. In the Admin interface allow to minimize each settings pannel to only show its header, In order to easely navigate the page.
|
||||||
|
219. Make sure all setting-panels are collapsed when opening the page
|
||||||
|
218. In the Admin interface allow to minimize each settings pannel to only show its header, In order to easely navigate the page.
|
||||||
|
219. Give the header of each setting-panel a somewhat differing color.
|
||||||
|
220. Change the background of the header too.
|
||||||
|
221. Apply exactly the same functionality to the profile page
|
||||||
|
222. On the admin page under Available Themes, the page does not load available themes
|
||||||
|
218. Give the header of each setting-panel a somewhat differing color
|
||||||
|
218. In the Admin interface allow to minimize each settings pannel to only show its header, In order to easely navigate the page.
|
||||||
|
219. Clicking on the collapse button doesn't toggle
|
||||||
|
218. In the Admin interface allow to minimize each settings pannel to only show its header, In order to easely navigate the page.
|
||||||
|
|
||||||
## Future entries
|
## Future entries
|
||||||
|
|
||||||
|
|||||||
@@ -815,7 +815,14 @@ def test_public_and_admin_pages_render_html():
|
|||||||
assert 'id="auth-menu" class="auth-menu hidden"' in admin_page
|
assert 'id="auth-menu" class="auth-menu hidden"' in admin_page
|
||||||
assert 'id="auth-home-link" href="/">Home</a>' in admin_page
|
assert 'id="auth-home-link" href="/">Home</a>' in admin_page
|
||||||
assert '<a id="auth-username" class="user-name" href="/">' in admin_page
|
assert '<a id="auth-username" class="user-name" href="/">' in admin_page
|
||||||
assert 'admin.js?v=5' in admin_page
|
assert 'class="panel-toggle-btn"' in admin_page
|
||||||
|
assert 'admin.js?v=7' in admin_page
|
||||||
|
assert client.get('/profile').status_code == 200
|
||||||
|
profile_page = client.get('/profile').text
|
||||||
|
assert 'Profile' in profile_page
|
||||||
|
assert 'class="link-item settings-panel minimized"' in profile_page
|
||||||
|
assert 'class="panel-toggle-btn"' in profile_page
|
||||||
|
assert 'profile.js?v=6' in profile_page
|
||||||
feed_script = client.get('/static/feed.js?v=7').text
|
feed_script = client.get('/static/feed.js?v=7').text
|
||||||
assert 'if (item.is_owner && !showIdentity)' in feed_script
|
assert 'if (item.is_owner && !showIdentity)' in feed_script
|
||||||
assert 'deleteEntry(item, deleteButton)' in feed_script
|
assert 'deleteEntry(item, deleteButton)' in feed_script
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ const smtpForm = document.querySelector('#smtp-form');
|
|||||||
const smtpTestButton = document.querySelector('#smtp-test-button');
|
const smtpTestButton = document.querySelector('#smtp-test-button');
|
||||||
const smtpStatus = document.querySelector('#smtp-status');
|
const smtpStatus = document.querySelector('#smtp-status');
|
||||||
const themesForm = document.querySelector('#themes-form');
|
const themesForm = document.querySelector('#themes-form');
|
||||||
const themeOptions = document.querySelector('#theme-options');
|
const themeOptions = document.querySelector('#admin-theme-options');
|
||||||
const themeStatus = document.querySelector('#theme-status');
|
const themeStatus = document.querySelector('#theme-status');
|
||||||
let smtpNextAllowedAt = null;
|
let smtpNextAllowedAt = null;
|
||||||
let smtpTimerHandle = null;
|
let smtpTimerHandle = null;
|
||||||
@@ -259,9 +259,51 @@ async function loadUsers() {
|
|||||||
renderUsers(await response.json());
|
renderUsers(await response.json());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function initPanelToggles() {
|
||||||
|
const panels = document.querySelectorAll('#admin-controls .settings-panel');
|
||||||
|
panels.forEach((panel) => {
|
||||||
|
panel.classList.add('minimized');
|
||||||
|
const h2 = panel.querySelector('h2');
|
||||||
|
if (!h2) return;
|
||||||
|
let btn = h2.querySelector('.panel-toggle-btn');
|
||||||
|
if (!btn) {
|
||||||
|
const titleText = h2.textContent.trim();
|
||||||
|
h2.replaceChildren();
|
||||||
|
btn = document.createElement('button');
|
||||||
|
btn.type = 'button';
|
||||||
|
btn.className = 'panel-toggle-btn';
|
||||||
|
btn.setAttribute('aria-expanded', 'false');
|
||||||
|
const textSpan = document.createElement('span');
|
||||||
|
textSpan.textContent = titleText;
|
||||||
|
const iconSpan = document.createElement('span');
|
||||||
|
iconSpan.className = 'panel-toggle-icon';
|
||||||
|
iconSpan.setAttribute('aria-hidden', 'true');
|
||||||
|
iconSpan.textContent = '▼';
|
||||||
|
btn.append(textSpan, iconSpan);
|
||||||
|
h2.appendChild(btn);
|
||||||
|
} else {
|
||||||
|
btn.setAttribute('aria-expanded', 'false');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (h2.dataset.initialized) return;
|
||||||
|
h2.dataset.initialized = 'true';
|
||||||
|
|
||||||
|
h2.addEventListener('click', (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
const isMinimized = panel.classList.toggle('minimized');
|
||||||
|
if (btn) {
|
||||||
|
btn.setAttribute('aria-expanded', String(!isMinimized));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function showAdminState(isAdmin) {
|
function showAdminState(isAdmin) {
|
||||||
adminControls.classList.toggle('hidden', !isAdmin);
|
adminControls.classList.toggle('hidden', !isAdmin);
|
||||||
adminAuthNotice.classList.toggle('hidden', isAdmin);
|
adminAuthNotice.classList.toggle('hidden', isAdmin);
|
||||||
|
if (isAdmin) {
|
||||||
|
initPanelToggles();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function showSignedOutState() {
|
function showSignedOutState() {
|
||||||
@@ -446,4 +488,7 @@ loadAdminState().catch((error) => {
|
|||||||
smtpForm.reset();
|
smtpForm.reset();
|
||||||
themesForm.reset();
|
themesForm.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', initPanelToggles);
|
||||||
|
initPanelToggles();
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -310,6 +310,48 @@ passwordForm.addEventListener('submit', async (event) => {
|
|||||||
if (response.ok) passwordForm.reset();
|
if (response.ok) passwordForm.reset();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function initPanelToggles() {
|
||||||
|
const panels = document.querySelectorAll('.settings-panel');
|
||||||
|
panels.forEach((panel) => {
|
||||||
|
panel.classList.add('minimized');
|
||||||
|
const h2 = panel.querySelector('h2');
|
||||||
|
if (!h2) return;
|
||||||
|
let btn = h2.querySelector('.panel-toggle-btn');
|
||||||
|
if (!btn) {
|
||||||
|
const titleText = h2.textContent.trim();
|
||||||
|
h2.replaceChildren();
|
||||||
|
btn = document.createElement('button');
|
||||||
|
btn.type = 'button';
|
||||||
|
btn.className = 'panel-toggle-btn';
|
||||||
|
btn.setAttribute('aria-expanded', 'false');
|
||||||
|
const textSpan = document.createElement('span');
|
||||||
|
textSpan.textContent = titleText;
|
||||||
|
const iconSpan = document.createElement('span');
|
||||||
|
iconSpan.className = 'panel-toggle-icon';
|
||||||
|
iconSpan.setAttribute('aria-hidden', 'true');
|
||||||
|
iconSpan.textContent = '▼';
|
||||||
|
btn.append(textSpan, iconSpan);
|
||||||
|
h2.appendChild(btn);
|
||||||
|
} else {
|
||||||
|
btn.setAttribute('aria-expanded', 'false');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (h2.dataset.initialized) return;
|
||||||
|
h2.dataset.initialized = 'true';
|
||||||
|
|
||||||
|
h2.addEventListener('click', (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
const isMinimized = panel.classList.toggle('minimized');
|
||||||
|
if (btn) {
|
||||||
|
btn.setAttribute('aria-expanded', String(!isMinimized));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
document.addEventListener('DOMContentLoaded', initPanelToggles);
|
||||||
|
initPanelToggles();
|
||||||
|
|
||||||
Promise.all([loadProfile(), loadMastodonConfig(), loadOtp(), loadEmailAddresses()]).catch((error) => {
|
Promise.all([loadProfile(), loadMastodonConfig(), loadOtp(), loadEmailAddresses()]).catch((error) => {
|
||||||
setStatus('#profile-status', accessToken ? error.message : 'Please sign in first.', true);
|
setStatus('#profile-status', accessToken ? error.message : 'Please sign in first.', true);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -451,6 +451,108 @@ main.container {
|
|||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#admin-controls {
|
||||||
|
display: grid;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-panel + .settings-panel {
|
||||||
|
margin-top: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-panel h2 {
|
||||||
|
margin: 0 0 12px;
|
||||||
|
padding: 10px 14px;
|
||||||
|
border-radius: 8px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background-color 0.2s ease, margin 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-panel h2:hover {
|
||||||
|
filter: brightness(1.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-panel:nth-of-type(5n+1) h2 {
|
||||||
|
color: var(--mauve);
|
||||||
|
background: var(--surface-1);
|
||||||
|
background: color-mix(in srgb, var(--mauve) 14%, transparent);
|
||||||
|
border-left: 4px solid var(--mauve);
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-panel:nth-of-type(5n+2) h2 {
|
||||||
|
color: var(--teal);
|
||||||
|
background: var(--surface-1);
|
||||||
|
background: color-mix(in srgb, var(--teal) 14%, transparent);
|
||||||
|
border-left: 4px solid var(--teal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-panel:nth-of-type(5n+3) h2 {
|
||||||
|
color: var(--peach);
|
||||||
|
background: var(--surface-1);
|
||||||
|
background: color-mix(in srgb, var(--peach) 14%, transparent);
|
||||||
|
border-left: 4px solid var(--peach);
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-panel:nth-of-type(5n+4) h2 {
|
||||||
|
color: var(--blue);
|
||||||
|
background: var(--surface-1);
|
||||||
|
background: color-mix(in srgb, var(--blue) 14%, transparent);
|
||||||
|
border-left: 4px solid var(--blue);
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-panel:nth-of-type(5n+5) h2 {
|
||||||
|
color: var(--lavender);
|
||||||
|
background: var(--surface-1);
|
||||||
|
background: color-mix(in srgb, var(--lavender) 14%, transparent);
|
||||||
|
border-left: 4px solid var(--lavender);
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-panel.minimized h2 {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-toggle-btn {
|
||||||
|
display: flex !important;
|
||||||
|
align-items: center !important;
|
||||||
|
justify-content: space-between !important;
|
||||||
|
width: 100% !important;
|
||||||
|
min-width: 0 !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
border: none !important;
|
||||||
|
background: transparent !important;
|
||||||
|
color: inherit !important;
|
||||||
|
font: inherit !important;
|
||||||
|
font-size: 1rem !important;
|
||||||
|
font-weight: inherit !important;
|
||||||
|
cursor: pointer !important;
|
||||||
|
text-align: left !important;
|
||||||
|
box-shadow: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-toggle-btn > * {
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-toggle-btn:focus-visible {
|
||||||
|
outline: 2px solid var(--lavender) !important;
|
||||||
|
outline-offset: 2px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-toggle-icon {
|
||||||
|
font-size: 0.75rem;
|
||||||
|
transition: transform 0.2s ease;
|
||||||
|
margin-left: 8px;
|
||||||
|
color: var(--subtext);
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-panel.minimized .panel-toggle-icon {
|
||||||
|
transform: rotate(-90deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-panel.minimized > *:not(h2) {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
.toolbar label,
|
.toolbar label,
|
||||||
.settings-panel label {
|
.settings-panel label {
|
||||||
display: grid;
|
display: grid;
|
||||||
|
|||||||
@@ -44,8 +44,13 @@
|
|||||||
<main class="container">
|
<main class="container">
|
||||||
<p id="admin-auth-notice" class="auth-notice hidden"></p>
|
<p id="admin-auth-notice" class="auth-notice hidden"></p>
|
||||||
<div id="admin-controls" class="hidden">
|
<div id="admin-controls" class="hidden">
|
||||||
<section class="link-item settings-panel">
|
<section class="link-item settings-panel minimized">
|
||||||
<h2>Users</h2>
|
<h2>
|
||||||
|
<button type="button" class="panel-toggle-btn" aria-expanded="false">
|
||||||
|
<span>Users</span>
|
||||||
|
<span class="panel-toggle-icon" aria-hidden="true">▼</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
<form id="user-form">
|
<form id="user-form">
|
||||||
<label>
|
<label>
|
||||||
Username
|
Username
|
||||||
@@ -69,16 +74,31 @@
|
|||||||
<div id="user-list" class="plugin-list" aria-live="polite">Loading users...</div>
|
<div id="user-list" class="plugin-list" aria-live="polite">Loading users...</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="link-item settings-panel">
|
<section class="link-item settings-panel minimized">
|
||||||
<h2>Plugins</h2>
|
<h2>
|
||||||
|
<button type="button" class="panel-toggle-btn" aria-expanded="false">
|
||||||
|
<span>Plugins</span>
|
||||||
|
<span class="panel-toggle-icon" aria-hidden="true">▼</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
<div id="plugin-list" class="plugin-list" aria-live="polite">Loading plugins...</div>
|
<div id="plugin-list" class="plugin-list" aria-live="polite">Loading plugins...</div>
|
||||||
</section>
|
</section>
|
||||||
<section class="link-item settings-panel">
|
<section class="link-item settings-panel minimized">
|
||||||
<h2>Labels</h2>
|
<h2>
|
||||||
|
<button type="button" class="panel-toggle-btn" aria-expanded="false">
|
||||||
|
<span>Labels</span>
|
||||||
|
<span class="panel-toggle-icon" aria-hidden="true">▼</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
<div id="admin-label-list" class="plugin-list" aria-live="polite">Loading labels...</div>
|
<div id="admin-label-list" class="plugin-list" aria-live="polite">Loading labels...</div>
|
||||||
</section>
|
</section>
|
||||||
<section class="link-item settings-panel">
|
<section class="link-item settings-panel minimized">
|
||||||
<h2>SMTP settings</h2>
|
<h2>
|
||||||
|
<button type="button" class="panel-toggle-btn" aria-expanded="false">
|
||||||
|
<span>SMTP settings</span>
|
||||||
|
<span class="panel-toggle-icon" aria-hidden="true">▼</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
<form id="smtp-form">
|
<form id="smtp-form">
|
||||||
<label>
|
<label>
|
||||||
SMTP host
|
SMTP host
|
||||||
@@ -109,11 +129,16 @@
|
|||||||
|
|
||||||
</form>
|
</form>
|
||||||
</section>
|
</section>
|
||||||
<section class="link-item settings-panel">
|
<section class="link-item settings-panel minimized">
|
||||||
<h2>Available themes</h2>
|
<h2>
|
||||||
|
<button type="button" class="panel-toggle-btn" aria-expanded="false">
|
||||||
|
<span>Available themes</span>
|
||||||
|
<span class="panel-toggle-icon" aria-hidden="true">▼</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
<p>Choose the themes visitors may use.</p>
|
<p>Choose the themes visitors may use.</p>
|
||||||
<form id="themes-form">
|
<form id="themes-form">
|
||||||
<div id="theme-options" class="theme-options" aria-live="polite">Loading themes...</div>
|
<div id="admin-theme-options" class="theme-options" aria-live="polite">Loading themes...</div>
|
||||||
<button type="submit">Save themes</button>
|
<button type="submit">Save themes</button>
|
||||||
<p id="theme-status" class="status" role="status"></p>
|
<p id="theme-status" class="status" role="status"></p>
|
||||||
</form>
|
</form>
|
||||||
@@ -124,6 +149,6 @@
|
|||||||
<script src="/static/auth-header.js?v=3"></script>
|
<script src="/static/auth-header.js?v=3"></script>
|
||||||
<script src="/static/logout.js?v=2"></script>
|
<script src="/static/logout.js?v=2"></script>
|
||||||
<script src="/static/theme.js?v=1"></script>
|
<script src="/static/theme.js?v=1"></script>
|
||||||
<script src="/static/admin.js?v=5"></script>
|
<script src="/static/admin.js?v=7"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -43,8 +43,13 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<main class="container">
|
<main class="container">
|
||||||
<section class="link-item settings-panel">
|
<section class="link-item settings-panel minimized">
|
||||||
<h2>Profile Settings</h2>
|
<h2>
|
||||||
|
<button type="button" class="panel-toggle-btn" aria-expanded="false">
|
||||||
|
<span>Profile Settings</span>
|
||||||
|
<span class="panel-toggle-icon" aria-hidden="true">▼</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
<form id="profile-form">
|
<form id="profile-form">
|
||||||
<label>
|
<label>
|
||||||
Username
|
Username
|
||||||
@@ -69,8 +74,13 @@
|
|||||||
</form>
|
</form>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="link-item settings-panel">
|
<section class="link-item settings-panel minimized">
|
||||||
<h2>Email addresses</h2>
|
<h2>
|
||||||
|
<button type="button" class="panel-toggle-btn" aria-expanded="false">
|
||||||
|
<span>Email addresses</span>
|
||||||
|
<span class="panel-toggle-icon" aria-hidden="true">▼</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
<div id="email-address-list" class="email-address-list" aria-live="polite">Loading email addresses...</div>
|
<div id="email-address-list" class="email-address-list" aria-live="polite">Loading email addresses...</div>
|
||||||
<form id="additional-email-form">
|
<form id="additional-email-form">
|
||||||
<label>
|
<label>
|
||||||
@@ -82,8 +92,13 @@
|
|||||||
</form>
|
</form>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="link-item settings-panel">
|
<section class="link-item settings-panel minimized">
|
||||||
<h2>Password</h2>
|
<h2>
|
||||||
|
<button type="button" class="panel-toggle-btn" aria-expanded="false">
|
||||||
|
<span>Password</span>
|
||||||
|
<span class="panel-toggle-icon" aria-hidden="true">▼</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
<form id="password-form">
|
<form id="password-form">
|
||||||
<label>
|
<label>
|
||||||
Current password
|
Current password
|
||||||
@@ -102,8 +117,13 @@
|
|||||||
</form>
|
</form>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="link-item settings-panel">
|
<section class="link-item settings-panel minimized">
|
||||||
<h2>One-time password</h2>
|
<h2>
|
||||||
|
<button type="button" class="panel-toggle-btn" aria-expanded="false">
|
||||||
|
<span>One-time password</span>
|
||||||
|
<span class="panel-toggle-icon" aria-hidden="true">▼</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
<p>Use an authenticator app to add a second sign-in step.</p>
|
<p>Use an authenticator app to add a second sign-in step.</p>
|
||||||
<div id="otp-disabled">
|
<div id="otp-disabled">
|
||||||
<button id="otp-setup" type="button">Set up one-time password</button>
|
<button id="otp-setup" type="button">Set up one-time password</button>
|
||||||
@@ -131,8 +151,13 @@
|
|||||||
<p id="otp-status" class="status" role="status"></p>
|
<p id="otp-status" class="status" role="status"></p>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="link-item settings-panel">
|
<section class="link-item settings-panel minimized">
|
||||||
<h2>Mastodon</h2>
|
<h2>
|
||||||
|
<button type="button" class="panel-toggle-btn" aria-expanded="false">
|
||||||
|
<span>Mastodon</span>
|
||||||
|
<span class="panel-toggle-icon" aria-hidden="true">▼</span>
|
||||||
|
</button>
|
||||||
|
</h2>
|
||||||
<form id="mastodon-form">
|
<form id="mastodon-form">
|
||||||
<label>
|
<label>
|
||||||
Mastodon server
|
Mastodon server
|
||||||
@@ -155,7 +180,7 @@
|
|||||||
<script src="/static/auth-header.js?v=3"></script>
|
<script src="/static/auth-header.js?v=3"></script>
|
||||||
<script src="/static/logout.js?v=2"></script>
|
<script src="/static/logout.js?v=2"></script>
|
||||||
<script src="/static/theme.js?v=1"></script>
|
<script src="/static/theme.js?v=1"></script>
|
||||||
<script src="/static/profile.js?v=5"></script>
|
<script src="/static/profile.js?v=6"></script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
Reference in New Issue
Block a user