mirror of
https://github.com/dreamhunter2333/cloudflare_temp_email.git
synced 2026-09-05 23:47:50 +08:00
fix: prevent Admin password dialog flash (#1134)
* fix: wait for admin access settings before rendering * test: use frontend route for admin loading check * test: always release delayed admin settings request * test: track Admin password dialog during loading
This commit is contained in:
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
||||||
|
- fix: |Admin| 修复权限设置加载完成前短暂显示管理员密码输入框的问题
|
||||||
- fix: |Admin| 修复切换一级标签页时二级标签页偶发无选中项、内容不显示及指示条偏移的问题
|
- fix: |Admin| 修复切换一级标签页时二级标签页偶发无选中项、内容不显示及指示条偏移的问题
|
||||||
- fix: |发信页面| 统一邮箱与名称字段顺序,并修复空正文输入框的光标与占位文字错位
|
- fix: |发信页面| 统一邮箱与名称字段顺序,并修复空正文输入框的光标与占位文字错位
|
||||||
- fix: |用户发信| 用户地址发信接口支持角色无限额度
|
- fix: |用户发信| 用户地址发信接口支持角色无限额度
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
||||||
|
- fix: |Admin| Avoid briefly showing the Admin password dialog before access settings finish loading
|
||||||
- fix: |Admin| Fix secondary tabs occasionally losing their active item, hiding content, and leaving the indicator offset after switching primary tabs
|
- fix: |Admin| Fix secondary tabs occasionally losing their active item, hiding content, and leaving the indicator offset after switching primary tabs
|
||||||
- fix: |Send Mail| Use a consistent address/name field order and align the empty content editor caret with its placeholder
|
- fix: |Send Mail| Use a consistent address/name field order and align the empty content editor caret with its placeholder
|
||||||
- fix: |User Send Mail| Apply role-based unlimited sending to user-address APIs
|
- fix: |User Send Mail| Apply role-based unlimited sending to user-address APIs
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
import { expect, test } from '@playwright/test';
|
||||||
|
|
||||||
|
import { FRONTEND_URL } from '../../fixtures/test-helpers';
|
||||||
|
|
||||||
|
test('waits for access settings before showing the Admin password dialog', async ({ page }) => {
|
||||||
|
await page.addInitScript(() => {
|
||||||
|
const testWindow = window as Window & { __adminPasswordRendered?: boolean };
|
||||||
|
testWindow.__adminPasswordRendered = false;
|
||||||
|
|
||||||
|
const detectAdminPassword = () => {
|
||||||
|
const textNodes = document.createTreeWalker(document, NodeFilter.SHOW_TEXT);
|
||||||
|
while (textNodes.nextNode()) {
|
||||||
|
if (textNodes.currentNode.textContent?.trim() === '管理员密码') {
|
||||||
|
testWindow.__adminPasswordRendered = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
new MutationObserver(detectAdminPassword).observe(document, {
|
||||||
|
childList: true,
|
||||||
|
subtree: true,
|
||||||
|
characterData: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
let releaseSettings!: () => void;
|
||||||
|
const settingsPending = new Promise<void>((resolve) => {
|
||||||
|
releaseSettings = resolve;
|
||||||
|
});
|
||||||
|
let markSettingsRequested!: () => void;
|
||||||
|
const settingsRequested = new Promise<void>((resolve) => {
|
||||||
|
markSettingsRequested = resolve;
|
||||||
|
});
|
||||||
|
|
||||||
|
await page.route('**/open_api/settings', async (route) => {
|
||||||
|
markSettingsRequested();
|
||||||
|
await settingsPending;
|
||||||
|
await route.continue();
|
||||||
|
});
|
||||||
|
|
||||||
|
await page.goto(`${FRONTEND_URL}/zh/admin`);
|
||||||
|
await settingsRequested;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await expect(page.getByText('管理员密码', { exact: true })).toHaveCount(0);
|
||||||
|
} finally {
|
||||||
|
releaseSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
await expect(page.getByText('快速设置', { exact: true })).toBeVisible();
|
||||||
|
await expect(page.getByText('管理员密码', { exact: true })).toHaveCount(0);
|
||||||
|
expect(await page.evaluate(() => (
|
||||||
|
window as Window & { __adminPasswordRendered?: boolean }
|
||||||
|
).__adminPasswordRendered)).toBe(false);
|
||||||
|
});
|
||||||
@@ -106,7 +106,7 @@ onMounted(async () => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div v-if="userSettings.fetched">
|
<div v-if="openSettings.fetched && userSettings.fetched">
|
||||||
<n-modal v-model:show="showAdminPasswordModal" :closable="false" :closeOnEsc="false" :maskClosable="false"
|
<n-modal v-model:show="showAdminPasswordModal" :closable="false" :closeOnEsc="false" :maskClosable="false"
|
||||||
preset="dialog" :title="t('accessHeader')">
|
preset="dialog" :title="t('accessHeader')">
|
||||||
<p>{{ t('accessTip') }}</p>
|
<p>{{ t('accessTip') }}</p>
|
||||||
|
|||||||
Reference in New Issue
Block a user