287 lines
7.0 KiB
TypeScript
287 lines
7.0 KiB
TypeScript
import {dict} from '@fast-crud/fast-crud';
|
|
import {shallowRef} from 'vue';
|
|
import deptFormat from '/@/components/dept-format/index.vue';
|
|
|
|
/** 1. 每个字段可选属性 */
|
|
export interface CrudFieldOption {
|
|
form?: boolean;
|
|
table?: boolean;
|
|
search?: boolean;
|
|
width?: number;
|
|
}
|
|
|
|
/** 2. 总配置接口 */
|
|
export interface CrudOptions {
|
|
create_datetime?: CrudFieldOption;
|
|
update_datetime?: CrudFieldOption;
|
|
creator_name?: CrudFieldOption;
|
|
modifier_name?: CrudFieldOption;
|
|
dept_belong_id?: CrudFieldOption;
|
|
description?: CrudFieldOption;
|
|
}
|
|
|
|
/** 3. 默认完整配置 */
|
|
const defaultOptions: Required<CrudOptions> = {
|
|
create_datetime: { form: false, table: false, search: false, width: 160 },
|
|
update_datetime: { form: false, table: false, search: false, width: 160 },
|
|
creator_name: { form: false, table: false, search: false, width: 100 },
|
|
modifier_name: { form: false, table: false, search: false, width: 100 },
|
|
dept_belong_id: { form: false, table: false, search: false, width: 300 },
|
|
description: { form: false, table: false, search: false, width: 100 },
|
|
};
|
|
|
|
/** 4. mergeOptions 函数 */
|
|
function mergeOptions(baseOptions: Required<CrudOptions>, userOptions: CrudOptions = {}): Required<CrudOptions> {
|
|
const result = { ...baseOptions };
|
|
for (const key in userOptions) {
|
|
if (Object.prototype.hasOwnProperty.call(userOptions, key)) {
|
|
const baseField = result[key as keyof CrudOptions];
|
|
const userField = userOptions[key as keyof CrudOptions];
|
|
if (baseField && userField) {
|
|
result[key as keyof CrudOptions] = { ...baseField, ...userField };
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* 最终暴露的 commonCrudConfig
|
|
* @param options 用户自定义配置(可传可不传,不传就用默认)
|
|
*/
|
|
export const commonCrudConfig = (options: CrudOptions = {}) => {
|
|
// ① 合并
|
|
const merged = mergeOptions(defaultOptions, options);
|
|
|
|
// ② 用 merged 中的值生成真正的 CRUD 配置
|
|
return {
|
|
dept_belong_id: {
|
|
title: '所属部门',
|
|
type: 'dict-tree',
|
|
search: {
|
|
show: merged.dept_belong_id.search,
|
|
},
|
|
dict: dict({
|
|
url: '/api/system/dept/all_dept/',
|
|
isTree: true,
|
|
value: 'id',
|
|
label: 'name',
|
|
children: 'children',
|
|
}),
|
|
column: {
|
|
align: 'center',
|
|
width: merged.dept_belong_id.width,
|
|
show: merged.dept_belong_id.table,
|
|
component: {
|
|
// fast-crud里自定义组件常用"component.is"
|
|
is: shallowRef(deptFormat),
|
|
vModel: 'modelValue',
|
|
},
|
|
},
|
|
form: {
|
|
show: merged.dept_belong_id.form,
|
|
component: {
|
|
multiple: false,
|
|
clearable: true,
|
|
props: {
|
|
checkStrictly: true,
|
|
props: {
|
|
label: 'name',
|
|
value: 'id',
|
|
},
|
|
},
|
|
},
|
|
helper: '默认不填则为当前创建用户的部门ID',
|
|
},
|
|
},
|
|
description: {
|
|
title: '备注',
|
|
search: {
|
|
show: merged.description.search,
|
|
},
|
|
type: 'textarea',
|
|
column: {
|
|
width: merged.description.width,
|
|
show: merged.description.table,
|
|
},
|
|
form: {
|
|
show: merged.description.form,
|
|
component: {
|
|
placeholder: '请输入内容',
|
|
showWordLimit: true,
|
|
maxlength: '200',
|
|
},
|
|
},
|
|
viewForm: {
|
|
show: true,
|
|
},
|
|
},
|
|
|
|
modifier_name: {
|
|
title: '修改人',
|
|
search: {
|
|
show: merged.modifier_name.search,
|
|
},
|
|
column: {
|
|
width: merged.modifier_name.width,
|
|
show: merged.modifier_name.table,
|
|
},
|
|
form: {
|
|
show: merged.modifier_name.form,
|
|
},
|
|
viewForm: {
|
|
show: true,
|
|
},
|
|
},
|
|
|
|
creator_name: {
|
|
title: '创建人',
|
|
search: {
|
|
show: merged.creator_name.search,
|
|
},
|
|
column: {
|
|
width: merged.creator_name.width,
|
|
show: merged.creator_name.table,
|
|
},
|
|
form: {
|
|
show: merged.creator_name.form,
|
|
},
|
|
viewForm: {
|
|
show: true,
|
|
},
|
|
},
|
|
|
|
update_datetime: {
|
|
title: '更新时间',
|
|
type: 'datetime',
|
|
search: {
|
|
show: merged.update_datetime.search,
|
|
col: { span: 8 },
|
|
component: {
|
|
type: 'datetimerange',
|
|
props: {
|
|
'start-placeholder': '开始时间',
|
|
'end-placeholder': '结束时间',
|
|
'value-format': 'YYYY-MM-DD HH:mm:ss',
|
|
'picker-options': {
|
|
shortcuts: [
|
|
{
|
|
text: '最近一周',
|
|
onClick(picker: any) {
|
|
const end = new Date();
|
|
const start = new Date();
|
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
|
|
picker.$emit('pick', [start, end]);
|
|
},
|
|
},
|
|
{
|
|
text: '最近一个月',
|
|
onClick(picker: any) {
|
|
const end = new Date();
|
|
const start = new Date();
|
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
|
|
picker.$emit('pick', [start, end]);
|
|
},
|
|
},
|
|
{
|
|
text: '最近三个月',
|
|
onClick(picker: any) {
|
|
const end = new Date();
|
|
const start = new Date();
|
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
|
|
picker.$emit('pick', [start, end]);
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
valueResolve(context: any) {
|
|
const { value } = context;
|
|
if (value) {
|
|
context.form.update_datetime_after = value[0];
|
|
context.form.update_datetime_before = value[1];
|
|
delete context.form.update_datetime;
|
|
}
|
|
},
|
|
},
|
|
column: {
|
|
width: merged.update_datetime.width,
|
|
show: merged.update_datetime.table,
|
|
},
|
|
form: {
|
|
show: merged.update_datetime.form,
|
|
},
|
|
viewForm: {
|
|
show: true,
|
|
},
|
|
},
|
|
|
|
create_datetime: {
|
|
title: '创建时间',
|
|
type: 'datetime',
|
|
search: {
|
|
show: merged.create_datetime.search,
|
|
col: { span: 8 },
|
|
component: {
|
|
type: 'datetimerange',
|
|
props: {
|
|
'start-placeholder': '开始时间',
|
|
'end-placeholder': '结束时间',
|
|
'value-format': 'YYYY-MM-DD HH:mm:ss',
|
|
'picker-options': {
|
|
shortcuts: [
|
|
{
|
|
text: '最近一周',
|
|
onClick(picker: any) {
|
|
const end = new Date();
|
|
const start = new Date();
|
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
|
|
picker.$emit('pick', [start, end]);
|
|
},
|
|
},
|
|
{
|
|
text: '最近一个月',
|
|
onClick(picker: any) {
|
|
const end = new Date();
|
|
const start = new Date();
|
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
|
|
picker.$emit('pick', [start, end]);
|
|
},
|
|
},
|
|
{
|
|
text: '最近三个月',
|
|
onClick(picker: any) {
|
|
const end = new Date();
|
|
const start = new Date();
|
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
|
|
picker.$emit('pick', [start, end]);
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
},
|
|
valueResolve(context: any) {
|
|
const { value } = context;
|
|
if (value) {
|
|
context.form.create_datetime_after = value[0];
|
|
context.form.create_datetime_before = value[1];
|
|
delete context.form.create_datetime;
|
|
}
|
|
},
|
|
},
|
|
column: {
|
|
width: merged.create_datetime.width,
|
|
show: merged.create_datetime.table,
|
|
},
|
|
form: {
|
|
show: merged.create_datetime.form,
|
|
},
|
|
viewForm: {
|
|
show: true,
|
|
},
|
|
},
|
|
};
|
|
};
|