fix permissions and teacher attendance workflows

This commit is contained in:
2026-07-10 20:40:52 +08:00
parent 247879f276
commit 8ed1682b90
95 changed files with 4745 additions and 1237 deletions

View File

@@ -0,0 +1,15 @@
import { useEffect } from 'react';
import useMessage from 'antd/es/message/useMessage';
import { bindMessageApi } from './app-message';
const AppMessageBridge: React.FC = () => {
const [messageApi, contextHolder] = useMessage();
useEffect(() => {
bindMessageApi(messageApi);
}, [messageApi]);
return contextHolder;
};
export default AppMessageBridge;

View File

@@ -0,0 +1,21 @@
import { describe, expect, it, vi } from 'vitest';
import { bindMessageApi, message } from './app-message';
describe('app message bridge', () => {
it('delegates messages to the Ant Design App context instance', () => {
const api = {
success: vi.fn(),
error: vi.fn(),
warning: vi.fn(),
};
bindMessageApi(api as never);
message.success('保存成功');
message.error('保存失败');
message.warning('请检查');
expect(api.success).toHaveBeenCalledWith('保存成功');
expect(api.error).toHaveBeenCalledWith('保存失败');
expect(api.warning).toHaveBeenCalledWith('请检查');
});
});

View File

@@ -0,0 +1,20 @@
import type { MessageInstance } from 'antd/es/message/interface';
let messageApi: MessageInstance | undefined;
export function bindMessageApi(api: MessageInstance): void {
messageApi = api;
}
function requireMessageApi(): MessageInstance {
if (!messageApi) {
throw new Error('Ant Design message API has not been initialized');
}
return messageApi;
}
export const message: Pick<MessageInstance, 'success' | 'error' | 'warning'> = {
success: (...args) => requireMessageApi().success(...args),
error: (...args) => requireMessageApi().error(...args),
warning: (...args) => requireMessageApi().warning(...args),
};