refactor: reorganize project structure and implement self-managed i18n/theme for components
This commit is contained in:
48
src/managers/button-group-manager.ts
Normal file
48
src/managers/button-group-manager.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
import { BimButtonGroup } from '../components/button-group';
|
||||
import type { ButtonGroupOptions } from '../components/button-group/index.type';
|
||||
import type { ThemeConfig } from '../themes/types';
|
||||
|
||||
/**
|
||||
* 通用按钮组管理器
|
||||
* 负责创建和管理除底部工具栏以外的其他按钮组。
|
||||
*/
|
||||
export class ButtonGroupManager {
|
||||
private activeGroups: BimButtonGroup[] = [];
|
||||
private container: HTMLElement;
|
||||
|
||||
constructor(container: HTMLElement) {
|
||||
this.container = container;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建一个新的按钮组
|
||||
*/
|
||||
public create(options: Omit<ButtonGroupOptions, 'container'>): BimButtonGroup {
|
||||
// 自动创建一个 div 作为容器
|
||||
const groupContainer = document.createElement('div');
|
||||
this.container.appendChild(groupContainer);
|
||||
|
||||
const group = new BimButtonGroup({
|
||||
container: groupContainer,
|
||||
...options
|
||||
});
|
||||
|
||||
// 立即初始化
|
||||
group.init();
|
||||
this.activeGroups.push(group);
|
||||
return group;
|
||||
}
|
||||
|
||||
public updateTheme(theme: ThemeConfig) {
|
||||
this.activeGroups.forEach(g => g.setTheme(theme));
|
||||
}
|
||||
|
||||
public refresh() {
|
||||
this.activeGroups.forEach(g => g.render());
|
||||
}
|
||||
|
||||
public destroy() {
|
||||
this.activeGroups.forEach(g => g.destroy());
|
||||
this.activeGroups = [];
|
||||
}
|
||||
}
|
||||
69
src/managers/dialog-manager.ts
Normal file
69
src/managers/dialog-manager.ts
Normal file
@@ -0,0 +1,69 @@
|
||||
import { BimDialog } from '../components/dialog';
|
||||
import { BimInfoDialog } from '../components/dialog/bimInfoDialog';
|
||||
import type { DialogOptions } from '../components/dialog/index.type';
|
||||
import type { ThemeConfig } from '../themes/types';
|
||||
import { themeManager } from '../services/theme'; // 修正路径
|
||||
|
||||
/**
|
||||
* 弹窗管理器
|
||||
* 负责创建和管理应用中的各类弹窗。
|
||||
*/
|
||||
export class DialogManager {
|
||||
/** 弹窗挂载的父容器 */
|
||||
private container: HTMLElement;
|
||||
/** 活跃的弹窗实例列表 */
|
||||
private activeDialogs: BimDialog[] = [];
|
||||
|
||||
/**
|
||||
* 构造函数
|
||||
* @param container 弹窗挂载的目标容器
|
||||
*/
|
||||
constructor(container: HTMLElement) {
|
||||
this.container = container;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建一个通用弹窗
|
||||
* @param options 弹窗配置选项(不需要传 container,自动使用管理器绑定的容器)
|
||||
* @returns BimDialog 实例
|
||||
*/
|
||||
public create(options: Omit<DialogOptions, 'container'>): BimDialog {
|
||||
const dialog = new BimDialog({
|
||||
container: this.container,
|
||||
...options,
|
||||
onClose: () => {
|
||||
// 从活跃列表中移除
|
||||
this.activeDialogs = this.activeDialogs.filter(d => d !== dialog);
|
||||
if (options.onClose) options.onClose();
|
||||
}
|
||||
});
|
||||
|
||||
// 应用当前主题
|
||||
dialog.setTheme(themeManager.getTheme());
|
||||
|
||||
this.activeDialogs.push(dialog);
|
||||
return dialog;
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示二次封装的模型信息弹窗
|
||||
* 演示如何调用特定的业务弹窗组件
|
||||
*/
|
||||
public showInfoDialog() {
|
||||
// 最佳实践:所有弹窗应通过 create 统一管理,或者手动加入管理。
|
||||
new BimInfoDialog(this.container);
|
||||
// 暂时不做主题追踪,作为遗留逻辑保留
|
||||
}
|
||||
|
||||
/**
|
||||
* 响应全局主题变更
|
||||
* @param theme 全局主题配置
|
||||
*/
|
||||
public updateTheme(theme: ThemeConfig) {
|
||||
this.activeDialogs.forEach(dialog => {
|
||||
if (dialog.setTheme) {
|
||||
dialog.setTheme(theme);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
63
src/managers/toolbar-manager.ts
Normal file
63
src/managers/toolbar-manager.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
import type { ButtonGroupColors, ButtonConfig } from '../components/button-group/index.type';
|
||||
import { Toolbar } from '../components/button-group/toolbar';
|
||||
import type { ThemeConfig } from '../themes/types';
|
||||
|
||||
/**
|
||||
* 底部工具栏管理器 (ToolbarManager)
|
||||
* 仅负责管理底部工具栏实例。
|
||||
*/
|
||||
export class ToolbarManager {
|
||||
private toolbar: Toolbar | null = null;
|
||||
private toolbarContainer: HTMLElement | null = null;
|
||||
private container: HTMLElement;
|
||||
|
||||
constructor(container: HTMLElement) {
|
||||
this.container = container;
|
||||
this.init();
|
||||
}
|
||||
|
||||
private init() {
|
||||
// 创建底部工具栏专用容器
|
||||
this.toolbarContainer = document.createElement('div');
|
||||
this.toolbarContainer.id = 'opt-btn-groups';
|
||||
this.toolbarContainer.className = 'bim-engine-opt-btn-container is-bottom-toolbar';
|
||||
this.container.appendChild(this.toolbarContainer);
|
||||
|
||||
this.toolbar = new Toolbar({
|
||||
container: this.toolbarContainer,
|
||||
showLabel: true,
|
||||
direction: 'row',
|
||||
position: 'bottom-center', // 底部居中
|
||||
align: 'vertical', // 图标在上
|
||||
expand: 'up' // 向上展开
|
||||
});
|
||||
|
||||
this.toolbar.init();
|
||||
}
|
||||
|
||||
public updateTheme(theme: ThemeConfig) {
|
||||
this.toolbar?.setTheme(theme);
|
||||
}
|
||||
|
||||
public refresh() {
|
||||
this.toolbar?.render();
|
||||
}
|
||||
|
||||
public destroy() {
|
||||
this.toolbar?.destroy();
|
||||
this.toolbar = null;
|
||||
}
|
||||
|
||||
// --- 转发 API ---
|
||||
public addGroup(groupId: string, beforeGroupId?: string) { this.toolbar?.addGroup(groupId, beforeGroupId); this.toolbar?.render(); }
|
||||
public addButton(config: ButtonConfig) { this.toolbar?.addButton(config); this.toolbar?.render(); }
|
||||
public setButtonVisibility(id: string, v: boolean) { this.toolbar?.updateButtonVisibility(id, v); }
|
||||
public setShowLabel(show: boolean) { this.toolbar?.setShowLabel(show); }
|
||||
public setVisible(visible: boolean) {
|
||||
if (this.toolbarContainer) {
|
||||
this.toolbarContainer.style.visibility = visible ? 'visible' : 'hidden';
|
||||
}
|
||||
}
|
||||
public setBackgroundColor(color: string) { this.toolbar?.setBackgroundColor(color); }
|
||||
public setColors(colors: ButtonGroupColors) { this.toolbar?.setColors(colors); }
|
||||
}
|
||||
Reference in New Issue
Block a user