mirror of
https://github.com/go-gitea/gitea.git
synced 2026-02-21 22:18:23 +01:00
refactor: Refactor instance notice banner to remove level and icon handling
This commit is contained in:
parent
dacd1941f1
commit
824d846f79
@ -78,22 +78,7 @@ type pageGlobalDataType struct {
|
||||
}
|
||||
|
||||
type InstanceNoticeBannerTmplInfo struct {
|
||||
Message string
|
||||
Level string
|
||||
IconName string
|
||||
}
|
||||
|
||||
func instanceNoticeIconName(level string) string {
|
||||
switch level {
|
||||
case setting.InstanceNoticeLevelSuccess:
|
||||
return "octicon-check"
|
||||
case setting.InstanceNoticeLevelWarning:
|
||||
return "octicon-alert"
|
||||
case setting.InstanceNoticeLevelDanger:
|
||||
return "octicon-alert"
|
||||
default:
|
||||
return "octicon-info"
|
||||
}
|
||||
Message string
|
||||
}
|
||||
|
||||
func getInstanceNoticeBanner(ctx *context.Context) *InstanceNoticeBannerTmplInfo {
|
||||
@ -102,9 +87,7 @@ func getInstanceNoticeBanner(ctx *context.Context) *InstanceNoticeBannerTmplInfo
|
||||
return nil
|
||||
}
|
||||
return &InstanceNoticeBannerTmplInfo{
|
||||
Message: notice.Message,
|
||||
Level: notice.Level,
|
||||
IconName: instanceNoticeIconName(notice.Level),
|
||||
Message: notice.Message,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -283,15 +283,6 @@
|
||||
<label>{{ctx.Locale.Tr "admin.config.instance_notice.message"}}</label>
|
||||
<textarea name="message" rows="4" maxlength="{{.InstanceNoticeMessageMaxLength}}" placeholder="{{ctx.Locale.Tr "admin.config.instance_notice.message_placeholder"}}">{{.InstanceNotice.Message}}</textarea>
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>{{ctx.Locale.Tr "admin.config.instance_notice.level"}}</label>
|
||||
<select class="ui dropdown" name="level">
|
||||
<option value="info" {{if eq .InstanceNotice.Level "info"}}selected{{end}}>{{ctx.Locale.Tr "admin.config.instance_notice.level.info"}}</option>
|
||||
<option value="success" {{if eq .InstanceNotice.Level "success"}}selected{{end}}>{{ctx.Locale.Tr "admin.config.instance_notice.level.success"}}</option>
|
||||
<option value="warning" {{if eq .InstanceNotice.Level "warning"}}selected{{end}}>{{ctx.Locale.Tr "admin.config.instance_notice.level.warning"}}</option>
|
||||
<option value="danger" {{if eq .InstanceNotice.Level "danger"}}selected{{end}}>{{ctx.Locale.Tr "admin.config.instance_notice.level.danger"}}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="two fields">
|
||||
<div class="field">
|
||||
<label>{{ctx.Locale.Tr "admin.config.instance_notice.start_time"}}</label>
|
||||
@ -304,20 +295,11 @@
|
||||
</div>
|
||||
<div class="field">
|
||||
<label>{{ctx.Locale.Tr "admin.config.instance_notice.preview"}}</label>
|
||||
<div id="instance-notice-preview" class="ui {{if eq .InstanceNotice.Level "success"}}positive{{else if eq .InstanceNotice.Level "warning"}}warning{{else if eq .InstanceNotice.Level "danger"}}negative{{else}}info{{end}} message tw-mt-2">
|
||||
<div class="tw-flex tw-items-start tw-justify-center tw-gap-2">
|
||||
<div id="instance-notice-preview-icon" class="tw-leading-6">
|
||||
{{if eq .InstanceNotice.Level "success"}}{{svg "octicon-check"}}{{else if eq .InstanceNotice.Level "warning"}}{{svg "octicon-alert"}}{{else if eq .InstanceNotice.Level "danger"}}{{svg "octicon-alert"}}{{else}}{{svg "octicon-info"}}{{end}}
|
||||
</div>
|
||||
<div id="instance-notice-preview" class="ui info message tw-mt-2">
|
||||
<div class="tw-flex tw-items-center tw-justify-center">
|
||||
<div id="instance-notice-preview-content" class="render-content markup tw-text-center">{{ctx.RenderUtils.MarkdownToHtml .InstanceNotice.Message}}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="instance-notice-preview-icons" class="tw-hidden">
|
||||
<span data-level="info">{{svg "octicon-info"}}</span>
|
||||
<span data-level="success">{{svg "octicon-check"}}</span>
|
||||
<span data-level="warning">{{svg "octicon-alert"}}</span>
|
||||
<span data-level="danger">{{svg "octicon-alert"}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button class="ui tiny primary button">{{ctx.Locale.Tr "admin.config.instance_notice.save"}}</button>
|
||||
|
||||
@ -178,9 +178,8 @@
|
||||
</nav>
|
||||
{{if and .PageGlobalData .PageGlobalData.InstanceNoticeBanner}}
|
||||
{{$banner := .PageGlobalData.InstanceNoticeBanner}}
|
||||
<div class="ui {{if eq $banner.Level "success"}}positive{{else if eq $banner.Level "warning"}}warning{{else if eq $banner.Level "danger"}}negative{{else}}info{{end}} attached message tw-m-0 tw-rounded-none">
|
||||
<div class="tw-flex tw-items-start tw-justify-center tw-gap-2">
|
||||
<span class="tw-leading-6">{{svg $banner.IconName}}</span>
|
||||
<div class="ui info attached message tw-m-0 tw-rounded-none">
|
||||
<div class="tw-flex tw-items-center tw-justify-center">
|
||||
<div class="render-content markup tw-text-center">{{ctx.RenderUtils.MarkdownToHtml $banner.Message}}</div>
|
||||
</div>
|
||||
{{if .PageGlobalData.IsSiteAdmin}}
|
||||
|
||||
@ -15,23 +15,10 @@ function createPreviewDOM() {
|
||||
<div class="page-content admin config">
|
||||
<form class="ui form" action="/-/admin/config/instance_notice" method="post">
|
||||
<textarea name="message">Initial message</textarea>
|
||||
<select name="level">
|
||||
<option value="info" selected>Info</option>
|
||||
<option value="success">Success</option>
|
||||
<option value="warning">Warning</option>
|
||||
<option value="danger">Danger</option>
|
||||
</select>
|
||||
</form>
|
||||
<div id="instance-notice-preview" class="ui info message">
|
||||
<div id="instance-notice-preview-icon"></div>
|
||||
<div id="instance-notice-preview-content"></div>
|
||||
</div>
|
||||
<div id="instance-notice-preview-icons" class="tw-hidden">
|
||||
<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="warning"></svg></span>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
@ -68,19 +55,6 @@ describe('Admin Instance Notice Preview', () => {
|
||||
expect(previewContent.innerHTML).toContain('Rendered message');
|
||||
});
|
||||
|
||||
test('updates preview class and icon when level changes', () => {
|
||||
initAdminConfigs();
|
||||
|
||||
const levelSelect = document.querySelector<HTMLSelectElement>('select[name="level"]')!;
|
||||
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="warning"');
|
||||
});
|
||||
|
||||
test('queues a second render while first request is in flight and re-renders with latest text', async () => {
|
||||
let firstResolve: ((value: Response) => void) | undefined;
|
||||
const firstPending = new Promise<Response>((resolve) => {
|
||||
|
||||
@ -9,30 +9,8 @@ function initInstanceNoticePreview(elAdminConfig: HTMLDivElement): void {
|
||||
if (!form) return;
|
||||
|
||||
const inputMessage = form.querySelector<HTMLTextAreaElement>('textarea[name="message"]');
|
||||
const selectLevel = form.querySelector<HTMLSelectElement>('select[name="level"]');
|
||||
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 || !preview || !previewIcon || !previewContent || !iconContainer) return;
|
||||
|
||||
const iconHTMLByLevel = new Map<string, string>();
|
||||
for (const el of iconContainer.querySelectorAll<HTMLElement>('[data-level]')) {
|
||||
iconHTMLByLevel.set(el.getAttribute('data-level')!, el.innerHTML);
|
||||
}
|
||||
|
||||
const classByLevel: Record<string, string> = {
|
||||
info: 'info',
|
||||
success: 'positive',
|
||||
warning: 'warning',
|
||||
danger: 'negative',
|
||||
};
|
||||
|
||||
const updateStyle = () => {
|
||||
preview.classList.remove('info', 'positive', 'warning', 'negative');
|
||||
preview.classList.add(classByLevel[selectLevel.value] || 'info');
|
||||
previewIcon.innerHTML = iconHTMLByLevel.get(selectLevel.value) || iconHTMLByLevel.get('info') || '';
|
||||
};
|
||||
if (!inputMessage || !previewContent) return;
|
||||
|
||||
let renderRequesting = false;
|
||||
let pendingRender = false;
|
||||
@ -65,9 +43,6 @@ function initInstanceNoticePreview(elAdminConfig: HTMLDivElement): void {
|
||||
inputMessage.addEventListener('input', () => {
|
||||
renderPreviewMarkdown();
|
||||
});
|
||||
selectLevel.addEventListener('change', updateStyle);
|
||||
|
||||
updateStyle();
|
||||
}
|
||||
|
||||
export function initAdminConfigs(): void {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user