fixup! feat: implement instance-wide informational banner

This commit is contained in:
Nicolas
2026-02-19 18:51:25 +01:00
parent b53ba46a26
commit dacd1941f1
9 changed files with 61 additions and 69 deletions
+3 -9
View File
@@ -21,7 +21,6 @@ function createPreviewDOM() {
<option value="warning">Warning</option>
<option value="danger">Danger</option>
</select>
<input type="checkbox" name="show_icon" value="true" checked>
</form>
<div id="instance-notice-preview" class="ui info message">
<div id="instance-notice-preview-icon"></div>
@@ -31,7 +30,7 @@ function createPreviewDOM() {
<span data-level="info"><svg data-icon="info"></svg></span>
<span data-level="success"><svg data-icon="success"></svg></span>
<span data-level="warning"><svg data-icon="warning"></svg></span>
<span data-level="danger"><svg data-icon="danger"></svg></span>
<span data-level="danger"><svg data-icon="warning"></svg></span>
</div>
</div>
`;
@@ -69,22 +68,17 @@ describe('Admin Instance Notice Preview', () => {
expect(previewContent.innerHTML).toContain('Rendered message');
});
test('updates preview class and icon when level and icon toggle change', () => {
test('updates preview class and icon when level changes', () => {
initAdminConfigs();
const levelSelect = document.querySelector<HTMLSelectElement>('select[name="level"]')!;
const showIcon = document.querySelector<HTMLInputElement>('input[name="show_icon"]')!;
const preview = document.querySelector<HTMLDivElement>('#instance-notice-preview')!;
const previewIcon = document.querySelector<HTMLDivElement>('#instance-notice-preview-icon')!;
levelSelect.value = 'danger';
levelSelect.dispatchEvent(new Event('change'));
expect(preview.classList.contains('negative')).toBe(true);
expect(previewIcon.innerHTML).toContain('data-icon="danger"');
showIcon.checked = false;
showIcon.dispatchEvent(new Event('change'));
expect(previewIcon.classList.contains('tw-hidden')).toBe(true);
expect(previewIcon.innerHTML).toContain('data-icon="warning"');
});
test('queues a second render while first request is in flight and re-renders with latest text', async () => {
+1 -4
View File
@@ -10,12 +10,11 @@ function initInstanceNoticePreview(elAdminConfig: HTMLDivElement): void {
const inputMessage = form.querySelector<HTMLTextAreaElement>('textarea[name="message"]');
const selectLevel = form.querySelector<HTMLSelectElement>('select[name="level"]');
const inputShowIcon = form.querySelector<HTMLInputElement>('input[name="show_icon"]');
const preview = elAdminConfig.querySelector<HTMLDivElement>('#instance-notice-preview');
const previewIcon = elAdminConfig.querySelector<HTMLDivElement>('#instance-notice-preview-icon');
const previewContent = elAdminConfig.querySelector<HTMLDivElement>('#instance-notice-preview-content');
const iconContainer = elAdminConfig.querySelector<HTMLDivElement>('#instance-notice-preview-icons');
if (!inputMessage || !selectLevel || !inputShowIcon || !preview || !previewIcon || !previewContent || !iconContainer) return;
if (!inputMessage || !selectLevel || !preview || !previewIcon || !previewContent || !iconContainer) return;
const iconHTMLByLevel = new Map<string, string>();
for (const el of iconContainer.querySelectorAll<HTMLElement>('[data-level]')) {
@@ -33,7 +32,6 @@ function initInstanceNoticePreview(elAdminConfig: HTMLDivElement): void {
preview.classList.remove('info', 'positive', 'warning', 'negative');
preview.classList.add(classByLevel[selectLevel.value] || 'info');
previewIcon.innerHTML = iconHTMLByLevel.get(selectLevel.value) || iconHTMLByLevel.get('info') || '';
previewIcon.classList.toggle('tw-hidden', !inputShowIcon.checked);
};
let renderRequesting = false;
@@ -68,7 +66,6 @@ function initInstanceNoticePreview(elAdminConfig: HTMLDivElement): void {
renderPreviewMarkdown();
});
selectLevel.addEventListener('change', updateStyle);
inputShowIcon.addEventListener('change', updateStyle);
updateStyle();
}