Trim frontend build for lightweight AI agent admin

This commit is contained in:
Codex
2026-06-08 19:48:47 +08:00
parent e164840f43
commit 2e7099cb6d
15 changed files with 1336 additions and 270 deletions
@@ -0,0 +1,81 @@
<script setup lang="ts">
import type { DesignPreviewData } from './types';
import { computed, ref, watch } from 'vue';
import { ElButton, ElDialog, ElInput, ElMessage } from 'element-plus';
const props = defineProps<{
preview?: DesignPreviewData;
title?: string;
visible: boolean;
}>();
const emit = defineEmits<{
(e: 'close'): void;
(e: 'confirm', data: Record<string, any>): void;
(e: 'update:visible', visible: boolean): void;
}>();
const draftText = ref('{}');
const dialogTitle = computed(
() => props.preview?.title || props.title || '确认内容',
);
watch(
() => [props.visible, props.preview] as const,
() => {
if (props.visible) {
draftText.value = JSON.stringify(props.preview?.data || {}, null, 2);
}
},
{ immediate: true },
);
function handleClose() {
emit('update:visible', false);
emit('close');
}
function handleConfirm() {
try {
const data = JSON.parse(draftText.value || '{}');
emit('confirm', data && typeof data === 'object' ? data : { value: data });
emit('update:visible', false);
} catch {
ElMessage.error('JSON 格式不正确');
}
}
function handleVisibleChange(visible: boolean) {
if (!visible) handleClose();
}
</script>
<template>
<ElDialog
:model-value="visible"
:title="dialogTitle"
width="720px"
append-to-body
destroy-on-close
@update:model-value="handleVisibleChange"
>
<div class="space-y-3">
<div class="text-muted-foreground text-sm">
{{ preview?.type || 'design_preview' }}
</div>
<ElInput
v-model="draftText"
type="textarea"
:rows="18"
resize="vertical"
/>
</div>
<template #footer>
<ElButton @click="handleClose">取消</ElButton>
<ElButton type="primary" @click="handleConfirm">确认</ElButton>
</template>
</ElDialog>
</template>
@@ -0,0 +1,23 @@
import DesignPreviewDialog from './DesignPreviewDialog.vue';
type PreviewData = {
data?: Record<string, any>;
[key: string]: any;
};
export type AppDesignData = PreviewData;
export type AppSettingsData = PreviewData;
export type DashboardBasicInfoData = PreviewData;
export type DashboardDesignData = PreviewData;
export type DashboardPublishData = PreviewData;
export type DesignData = PreviewData;
export type DesignType = string;
export type SystemSummaryData = PreviewData;
export const AppDesignPanel = DesignPreviewDialog;
export const AppSettingsPanel = DesignPreviewDialog;
export const DashboardBasicInfoConfirmPanel = DesignPreviewDialog;
export const DashboardDesignConfirmPanel = DesignPreviewDialog;
export const DashboardPublishConfirmPanel = DesignPreviewDialog;
export const DesignEditorPanel = DesignPreviewDialog;
export const SystemSummaryConfirmPanel = DesignPreviewDialog;
@@ -1,45 +1,34 @@
import type { Component } from 'vue';
import DesignPreviewDialog from '#/components/ai-chat-panel/DesignPreviewDialog.vue';
import { defineComponent, h } from 'vue';
type PreviewData = {
data?: Record<string, any>;
[key: string]: any;
};
export type DesignEditorData = Record<string, any>;
export type AppDesignData = Record<string, any>;
export type DashboardBasicInfoData = Record<string, any>;
export type DashboardDesignData = Record<string, any>;
export type DashboardPublishData = Record<string, any>;
export type SystemSummaryData = Record<string, any>;
export type AppDesignData = PreviewData;
export type AppSettingsData = PreviewData;
export type BasicFormData = PreviewData;
export type DashboardBasicInfoData = PreviewData;
export type DashboardDesignData = PreviewData;
export type DashboardPublishData = PreviewData;
export type DesignData = PreviewData;
export type DesignType = string;
export type FormBasicData = PreviewData;
export type FormEditorData = PreviewData;
export type PageBasicInfo = PreviewData;
export type PageEditorData = PreviewData;
export type PagePublishInfo = PreviewData;
export type SystemSummaryData = PreviewData;
export interface FormEditorProps {
readonly?: boolean;
schema?: Record<string, any>;
}
export interface PageEditorProps {
readonly?: boolean;
schema?: Record<string, any>;
}
export const FORM_EDITOR_LIGHTWEIGHT = true;
function createLitePanel(name: string): Component {
return defineComponent({
name,
setup(_, { slots }) {
return () => h('div', { class: 'form-editor-lite-placeholder' }, slots.default?.());
},
});
}
export const BasicInfoEditor = createLitePanel('BasicInfoEditor');
export const PublishInfoEditor = createLitePanel('PublishInfoEditor');
export const PageBasicInfoEditor = createLitePanel('PageBasicInfoEditor');
export const PagePublishInfoEditor = createLitePanel('PagePublishInfoEditor');
export const FormEditorContent = createLitePanel('FormEditorContent');
export const PageEditorContent = createLitePanel('PageEditorContent');
export const DesignEditorPanel = createLitePanel('DesignEditorPanel');
export const AppDesignPanel = createLitePanel('AppDesignPanel');
export const AppSettingsPanel = createLitePanel('AppSettingsPanel');
export const DashboardBasicInfoConfirmPanel = createLitePanel('DashboardBasicInfoConfirmPanel');
export const DashboardDesignConfirmPanel = createLitePanel('DashboardDesignConfirmPanel');
export const DashboardPublishConfirmPanel = createLitePanel('DashboardPublishConfirmPanel');
export const SystemSummaryConfirmPanel = createLitePanel('SystemSummaryConfirmPanel');
export const AppDesignPanel = DesignPreviewDialog;
export const AppSettingsPanel = DesignPreviewDialog;
export const BasicInfoEditor = DesignPreviewDialog;
export const DashboardBasicInfoConfirmPanel = DesignPreviewDialog;
export const DashboardDesignConfirmPanel = DesignPreviewDialog;
export const DashboardPublishConfirmPanel = DesignPreviewDialog;
export const DesignEditorPanel = DesignPreviewDialog;
export const FormEditorContent = DesignPreviewDialog;
export const PageBasicInfoEditor = DesignPreviewDialog;
export const PageEditorContent = DesignPreviewDialog;
export const PagePublishInfoEditor = DesignPreviewDialog;
export const SystemSummaryConfirmPanel = DesignPreviewDialog;
@@ -53,9 +53,7 @@ import {
import draggable from 'vuedraggable';
import { DeptSelector } from '../zq-form/dept-selector';
import { FormSelector } from '../zq-form/form-selector';
import { PostSelector } from '../zq-form/post-selector';
import { TableSelector } from '../zq-form/table-selector';
import { UserSelector } from '../zq-form/user-selector';
import { useTableForm } from './init';
@@ -619,11 +617,9 @@ function isDialogFilterComponent(componentType: string): boolean {
'department-selector',
'dept-select',
'dept-selector',
'form-selector',
'position-selector',
'post-select',
'post-selector',
'table-selector',
'user-select',
'user-selector',
].includes(componentType);
@@ -1291,35 +1287,6 @@ function getSummaryMethod(param: { columns: any[]; data: any[] }) {
:placeholder="$t('common.select')"
@change="handleSelectorFilterChange"
/>
<FormSelector
v-else-if="
activeFilterComponentType === 'form-selector'
"
:model-value="tempFilterValues"
:form-code="col.formCode"
:value-field="col.formSelectorValueField || 'id'"
:label-field="col.formSelectorLabelField || 'name'"
multiple
:placeholder="$t('common.select')"
@change="handleSelectorFilterChange"
/>
<TableSelector
v-else-if="
activeFilterComponentType === 'table-selector'
"
:model-value="tempFilterValues"
:data-source-type="col.tableSelectorDataSourceType"
:form-code="col.formCode"
:dict-code="col.tableSelectorDictCode"
:data-source-code="col.tableSelectorDataSourceCode"
:value-field="col.formSelectorValueField || 'id'"
:label-field="col.formSelectorLabelField || 'name'"
:columns="col.tableSelectorColumns"
:search-fields="col.tableSelectorSearchFields"
multiple
:placeholder="$t('common.select')"
@change="handleSelectorFilterChange"
/>
</div>
<!-- 操作按钮 -->
<div class="mt-2 flex justify-end gap-2">