From b11aa3309fec378e2b1bc573cdb5ceeb59f9fd20 Mon Sep 17 00:00:00 2001
From: zhujiamin <1147570162@qq.com>
Date: Thu, 25 May 2023 18:45:00 +0800
Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=E5=90=84?=
=?UTF-8?q?=E7=B1=BB=E7=BC=96=E8=BE=91=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/common/app-rawitem/app-rawitem.tsx | 13 +-
src/common/index.ts | 6 +-
src/common/rawitem/rawitem.tsx | 181 ++++++++++++++++++
.../autocomplete-editor.controller.ts | 92 ++++++---
.../ibiz-autocomplete/ibiz-autocomplete.tsx | 91 +++++----
.../ibiz-picker-dropdown.tsx | 23 ++-
.../ibiz-picker-select-view.tsx | 21 +-
.../data-picker/ibiz-picker/ibiz-picker.tsx | 23 ++-
.../data-picker/picker-editor.controller.ts | 94 ++++++---
.../date-range-editor.controller.ts | 53 +++++
.../date-range/date-range-editor.provider.ts | 28 +++
.../ibiz-date-range-picker.scss | 5 +
.../ibiz-date-range-picker.tsx | 149 ++++++++++++++
src/editor/date-range/index.ts | 3 +
src/editor/index.ts | 18 ++
.../list-box-picker-editor.controller.ts | 54 +++---
.../ibiz-number-range-picker.scss | 8 +
.../ibiz-number-range-picker.tsx | 151 +++++++++++++++
src/editor/number-range/index.ts | 3 +
.../number-range-editor.controller.ts | 11 ++
.../number-range-editor.provider.ts | 28 +++
src/editor/raw/ibiz-raw/ibiz-raw.tsx | 4 +-
src/editor/span/span-editor.controller.ts | 17 +-
.../stepper/stepper-editor.controller.ts | 10 +-
src/editor/upload/upload-editor.controller.ts | 26 ++-
25 files changed, 931 insertions(+), 181 deletions(-)
create mode 100644 src/common/rawitem/rawitem.tsx
create mode 100644 src/editor/date-range/date-range-editor.controller.ts
create mode 100644 src/editor/date-range/date-range-editor.provider.ts
create mode 100644 src/editor/date-range/ibiz-date-range-picker/ibiz-date-range-picker.scss
create mode 100644 src/editor/date-range/ibiz-date-range-picker/ibiz-date-range-picker.tsx
create mode 100644 src/editor/date-range/index.ts
create mode 100644 src/editor/number-range/ibiz-number-range-picker/ibiz-number-range-picker.scss
create mode 100644 src/editor/number-range/ibiz-number-range-picker/ibiz-number-range-picker.tsx
create mode 100644 src/editor/number-range/index.ts
create mode 100644 src/editor/number-range/number-range-editor.controller.ts
create mode 100644 src/editor/number-range/number-range-editor.provider.ts
diff --git a/src/common/app-rawitem/app-rawitem.tsx b/src/common/app-rawitem/app-rawitem.tsx
index 356ce3076..f7e311dd7 100644
--- a/src/common/app-rawitem/app-rawitem.tsx
+++ b/src/common/app-rawitem/app-rawitem.tsx
@@ -57,18 +57,7 @@ export const AppRawItem = defineComponent({
].includes(props.type)
) {
if (props.content && typeof props.content === 'string') {
- const items = props.content.match(/\{{(.+?)\}}/g);
- if (items) {
- items.forEach((item: string) => {
- rawItemText.value = (props.content as string).replace(
- /\{{(.+?)\}}/,
- // eslint-disable-next-line no-eval
- eval(item.substring(2, item.length - 2)),
- );
- });
- } else {
- rawItemText.value = props.content;
- }
+ rawItemText.value = props.content;
rawItemText.value = rawItemText.value.replaceAll('<', '<');
rawItemText.value = rawItemText.value.replaceAll('>', '>');
rawItemText.value = rawItemText.value.replaceAll(' ', ' ');
diff --git a/src/common/index.ts b/src/common/index.ts
index 27256c728..f46693211 100644
--- a/src/common/index.ts
+++ b/src/common/index.ts
@@ -8,7 +8,7 @@ import { IBizRow } from './row/row';
import { IBizControlBase } from './control-base/control-base';
import { IBizControlShell } from './control-shell/control-shell';
import { IBizViewShell } from './view-shell/view-shell';
-import { AppRawItem } from './app-rawitem/app-rawitem';
+import { IBizRawItem } from './rawitem/rawitem';
export * from './icon/icon';
export * from './keep-alive/keep-alive';
@@ -19,7 +19,7 @@ export * from './action-toolbar/action-toolbar';
export * from './control-base/control-base';
export * from './control-shell/control-shell';
export * from './view-shell/view-shell';
-export * from './app-rawitem/app-rawitem';
+export * from './rawitem/rawitem';
export const IBizCommonComponents = {
install: (v: App) => {
@@ -32,7 +32,7 @@ export const IBizCommonComponents = {
v.component(IBizActionToolbar.name, IBizActionToolbar);
v.component(IBizViewShell.name, IBizViewShell);
v.component(IBizControlShell.name, IBizControlShell);
- v.component(AppRawItem.name, AppRawItem);
+ v.component(IBizRawItem.name, IBizRawItem);
},
};
diff --git a/src/common/rawitem/rawitem.tsx b/src/common/rawitem/rawitem.tsx
new file mode 100644
index 000000000..235d05043
--- /dev/null
+++ b/src/common/rawitem/rawitem.tsx
@@ -0,0 +1,181 @@
+import { useNamespace } from '@ibiz-template/vue3-util';
+import { defineComponent, ref } from 'vue';
+import { createUUID } from 'qx-util';
+
+export const IBizRawItem = defineComponent({
+ name: 'IBizRawItem',
+ props: {
+ type: {
+ type: String,
+ required: true,
+ },
+ content: {
+ type: [String, Object],
+ },
+ },
+ setup(props) {
+ const ns = useNamespace('rawitem');
+
+ // 视频类型内容参数
+ const playerParams = ref({
+ id: createUUID(),
+ path: '',
+ mute: true,
+ autoplay: true,
+ replay: false,
+ showcontrols: true,
+ });
+
+ // 分割线类型参数
+ const dividerParams = ref({
+ contentPosition: 'center',
+ html: '',
+ });
+
+ // 类型参数
+ const alertParams = ref({
+ type: 'info',
+ title: '',
+ closeabled: true,
+ showIcon: false,
+ });
+
+ // 文本类型显示值
+ const rawItemText = ref('');
+
+ if (
+ [
+ 'TEXT',
+ 'HEADING1',
+ 'HEADING2',
+ 'HEADING3',
+ 'HEADING4',
+ 'HEADING5',
+ 'HEADING6',
+ 'PARAGRAPH',
+ 'HTML',
+ ].includes(props.type)
+ ) {
+ if (props.content && typeof props.content === 'string') {
+ rawItemText.value = props.content;
+ rawItemText.value = rawItemText.value.replaceAll('<', '<');
+ rawItemText.value = rawItemText.value.replaceAll('>', '>');
+ rawItemText.value = rawItemText.value.replaceAll(' ', ' ');
+ rawItemText.value = rawItemText.value.replaceAll(' ', ' ');
+ }
+ }
+
+ if (['VIDEO', 'DIVIDER', 'INFO', 'WARNING', 'ERROR'].includes(props.type)) {
+ if (props.content) {
+ let rawConfig = {};
+ try {
+ if (typeof props.content === 'string') {
+ // eslint-disable-next-line no-new-func
+ const func = new Function(`return (${props.content});`);
+ rawConfig = func();
+ switch (props.type) {
+ case 'VIDEO':
+ Object.assign(playerParams.value, rawConfig);
+ break;
+ case 'DIVIDER':
+ Object.assign(dividerParams.value, rawConfig);
+ break;
+ case 'INFO':
+ case 'WARNING':
+ case 'ERROR':
+ alertParams.value.type = props.type.toLocaleLowerCase();
+ Object.assign(alertParams.value, rawConfig);
+ break;
+ default:
+ break;
+ }
+ }
+ } catch {
+ ibiz.log.error(`${props.type}类型自定义参数配置错误`);
+ }
+ }
+ }
+
+ return { ns, rawItemText, playerParams, dividerParams, alertParams };
+ },
+ render() {
+ if (this.type === 'IMAGE') {
+ return (
+
+ );
+ }
+ if (this.type === 'TEXT') {
+ return {this.rawItemText};
+ }
+ if (this.type === 'HEADING1') {
+ return
{this.rawItemText}
;
+ }
+ if (this.type === 'HEADING2') {
+ return {this.rawItemText}
;
+ }
+ if (this.type === 'HEADING3') {
+ return {this.rawItemText}
;
+ }
+ if (this.type === 'HEADING4') {
+ return {this.rawItemText}
;
+ }
+ if (this.type === 'HEADING5') {
+ return {this.rawItemText}
;
+ }
+ if (this.type === 'HEADING6') {
+ return {this.rawItemText}
;
+ }
+ if (this.type === 'PARAGRAPH') {
+ return {this.rawItemText}
;
+ }
+ if (this.type === 'HTML') {
+ return (
+
+ );
+ }
+ if (this.type === 'VIDEO') {
+ return (
+
+
+
+ );
+ }
+ if (this.type === 'DIVIDER') {
+ return (
+
+
+
+ );
+ }
+ if (
+ this.type === 'INFO' ||
+ this.type === 'WARNING' ||
+ this.type === 'ERROR'
+ ) {
+ return (
+
+ );
+ }
+ if (['MARKDOWN', 'PLACEHOLDER'].includes(this.type)) {
+ return {this.type}类型暂未支持
;
+ }
+ return null;
+ },
+});
diff --git a/src/editor/autocomplete/autocomplete-editor.controller.ts b/src/editor/autocomplete/autocomplete-editor.controller.ts
index 1df93ef0a..945f9b92b 100644
--- a/src/editor/autocomplete/autocomplete-editor.controller.ts
+++ b/src/editor/autocomplete/autocomplete-editor.controller.ts
@@ -1,6 +1,11 @@
import { IHttpResponse, RuntimeModelError } from '@ibiz-template/core';
import { EditorController } from '@ibiz-template/runtime';
-import { IAppDataEntity, IAutoComplete } from '@ibiz/model-core';
+import {
+ IAppDataEntity,
+ IAppDEACMode,
+ IAutoComplete,
+ IDEACModeDataItem,
+} from '@ibiz/model-core';
/**
* 自动完成编辑器控制器
@@ -17,20 +22,15 @@ export class AutoCompleteEditorController extends EditorController {
super.onInit();
- this.valueItem = this.parent.valueItemName?.toLowerCase() || '';
if (this.model.appDataEntityId) {
this.appDataEntity = await ibiz.hub.getAppDataEntity(
this.model.appDataEntityId,
this.context.srfappid,
)!;
if (this.appDataEntity) {
- this.keyName = this.appDataEntity?.keyAppDEFieldId || '';
- this.textName = this.appDataEntity?.majorAppDEFieldId || '';
+ this.keyName = this.appDataEntity.keyAppDEFieldId!;
+ this.textName = this.appDataEntity.majorAppDEFieldId!;
this.getAcParams();
this.sort = this.getAcSort();
}
@@ -79,23 +88,34 @@ export class AutoCompleteEditorController extends EditorController {
+ if (dataItem.id !== 'value' && dataItem.id !== 'text') {
+ this.dataItems.push(dataItem);
+ }
+ });
+ }
+ }
}
/**
* 获取自填模式sort排序
*/
public getAcSort() {
- // if (this.model.deACMode) {
- // const { sortField, sortDir } = this.model.deACMode;
- // if (sortField && sortDir) {
- // return `${sortField},${sortDir}`;
- // }
- // }
+ if (this.deACMode) {
+ const { minorSortAppDEFieldId, minorSortDir } = this.deACMode;
+ if (minorSortAppDEFieldId && minorSortDir) {
+ return `${minorSortAppDEFieldId.toLowerCase()},${minorSortDir.toLowerCase()}`;
+ }
+ }
return undefined;
}
@@ -136,15 +156,31 @@ export class AutoCompleteEditorController extends EditorController>}
+ * @returns {*} {Promise>}
*/
async calcFillDataItems(
- _data: IData,
+ data: IData,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
- ): Promise> {
- // if (this.model.deACMode) {
- // return DEACModeUtil.calcFillDataItems(data, this.model.deACMode);
- // }
+ ): Promise> {
+ if (this.deACMode) {
+ if (this.dataItems.length === 0) {
+ return [];
+ }
+ const result = await Promise.all(
+ this.dataItems.map(item => {
+ const value = data[item.appDEFieldId!];
+ if (item.format) {
+ // todo 值格式化
+ } else if (item.convertToCodeItemText && item.codeListId) {
+ // todo 代码表转换为文本值
+ } else if (item.customCode) {
+ // todo 脚本代码
+ }
+ return { id: item.id!, value };
+ }),
+ );
+ return result;
+ }
return [];
}
}
diff --git a/src/editor/autocomplete/ibiz-autocomplete/ibiz-autocomplete.tsx b/src/editor/autocomplete/ibiz-autocomplete/ibiz-autocomplete.tsx
index d3ff1d4a8..ec77c44af 100644
--- a/src/editor/autocomplete/ibiz-autocomplete/ibiz-autocomplete.tsx
+++ b/src/editor/autocomplete/ibiz-autocomplete/ibiz-autocomplete.tsx
@@ -5,7 +5,7 @@ import {
useNamespace,
} from '@ibiz-template/vue3-util';
import './ibiz-autocomplete.scss';
-import { isEmpty } from 'ramda';
+import { debounce } from 'lodash-es';
import { AutoCompleteEditorController } from '../autocomplete-editor.controller';
export const IBizAutoComplete = defineComponent({
@@ -25,6 +25,18 @@ export const IBizAutoComplete = defineComponent({
// 实体数据集
const items: Ref = ref([]);
+ // 获取实体数据后,需要判断一次当前值是否在返回数据中
+ watch(items, (newVal, oldVal) => {
+ if (oldVal.length === 0 && newVal.length > 0) {
+ const index = newVal.findIndex((item: IData) =>
+ Object.is(item[c.keyName], props.value),
+ );
+ if (index !== -1) {
+ curValue.value = newVal[index][c.textName];
+ }
+ }
+ });
+
// 是否显示所有数据
const isShowAll = ref(true);
@@ -35,21 +47,16 @@ export const IBizAutoComplete = defineComponent({
() => props.value,
newVal => {
if (newVal || newVal === null) {
- curValue.value = newVal;
if (newVal === null) {
curValue.value = '';
}
- const value = props.data[c.valueItem];
const index = items.value.findIndex((item: IData) =>
- Object.is(item[c.keyName], value),
+ Object.is(item[c.keyName], newVal),
);
if (index !== -1) {
- return;
- }
- // items里匹配不到当前值项值时,生成自身的选项
- items.value = [];
- if (!isEmpty(newVal) && !isEmpty(value)) {
- items.value.push({ [c.textName]: newVal, [c.keyName]: value });
+ curValue.value = items.value[index][c.textName];
+ } else {
+ curValue.value = newVal;
}
}
},
@@ -62,15 +69,12 @@ export const IBizAutoComplete = defineComponent({
const dataItems = await c.calcFillDataItems(data);
if (dataItems.length) {
dataItems.forEach(dataItem => {
- emit('change', dataItem.value, dataItem.name);
+ emit('change', dataItem.value, dataItem.id);
});
}
- // 处理值项和本身的值
- if (c.valueItem) {
- emit('change', data[c.keyName], c.valueItem);
- }
- emit('change', data[c.textName]);
+ // 处理本身的值
+ emit('change', data[c.keyName]);
};
// 往外抛值
@@ -92,21 +96,19 @@ export const IBizAutoComplete = defineComponent({
}
}
};
+ // 开始时搜索一次拿items
+ onSearch('');
// 清除
const onClear = () => {
- // zjm todo 实体自填模式相关
// 清空回填数据
- // const dataItems = c.model.deACMode?.dataItems;
- // if (dataItems?.length) {
- // dataItems.forEach(dataItem => {
- // emit('change', null, dataItem.name);
- // });
- // }
- // if (c.valueItem) {
- // emit('change', null, c.valueItem);
- // }
- // emit('change', null);
+ const dataItems = c.dataItems;
+ if (dataItems.length > 0) {
+ dataItems.forEach(dataItem => {
+ emit('change', null, dataItem.id);
+ });
+ }
+ emit('change', null);
};
// 聚焦
@@ -140,6 +142,29 @@ export const IBizAutoComplete = defineComponent({
);
});
+ let isDebounce = false;
+ let blurCacheValue: string | undefined;
+ // 防抖值变更回调
+ const debounceChange = debounce(
+ (val: string | number) => {
+ // 拦截掉blur触发后change
+ if (blurCacheValue !== val) {
+ emit('change', val);
+ }
+ blurCacheValue = undefined;
+ isDebounce = false;
+ },
+ 300,
+ { leading: true },
+ );
+ // 输入完成后抛值
+ const handleInput = (val: string | number) => {
+ if (editorType !== 'AC_FS' && editorType !== 'AC_FS_NOBUTTON') {
+ isDebounce = true;
+ debounceChange(val);
+ }
+ };
+
return {
ns,
c,
@@ -151,6 +176,9 @@ export const IBizAutoComplete = defineComponent({
onClear,
onFocus,
onACSelect,
+ items,
+ handleInput,
+ isDebounce,
};
},
render() {
@@ -167,16 +195,13 @@ export const IBizAutoComplete = defineComponent({
fetch-suggestions={this.onSearch}
onClear={this.onClear}
disabled={this.disabled || this.readonly}
+ onSelect={this.onACSelect}
+ onInput={this.handleInput}
>
{{
default: ({ item }: { item: IData }) => {
return (
- {
- this.onACSelect(item);
- }}
- >
+
{item[this.c.textName]}
);
diff --git a/src/editor/data-picker/ibiz-picker-dropdown/ibiz-picker-dropdown.tsx b/src/editor/data-picker/ibiz-picker-dropdown/ibiz-picker-dropdown.tsx
index 4de698eca..7eee183c0 100644
--- a/src/editor/data-picker/ibiz-picker-dropdown/ibiz-picker-dropdown.tsx
+++ b/src/editor/data-picker/ibiz-picker-dropdown/ibiz-picker-dropdown.tsx
@@ -71,7 +71,7 @@ export const IBizPickerDropDown = defineComponent({
const dataItems = await c.calcFillDataItems(item);
if (dataItems.length) {
dataItems.forEach(dataItem => {
- emit('change', dataItem.value, dataItem.name);
+ emit('change', dataItem.value, dataItem.id);
});
}
@@ -129,18 +129,17 @@ export const IBizPickerDropDown = defineComponent({
// 清除
const onClear = () => {
- // zjm todo 实体自填模式相关
// 清空回填数据
- // const dataItems = c.model.deACMode?.dataItems;
- // if (dataItems?.length) {
- // dataItems.forEach(dataItem => {
- // emit('change', null, dataItem.name);
- // });
- // }
- // if (c.valueItem) {
- // emit('change', null, c.valueItem);
- // }
- // emit('change', null);
+ const dataItems = c.dataItems;
+ if (dataItems?.length) {
+ dataItems.forEach(dataItem => {
+ emit('change', null, dataItem.id);
+ });
+ }
+ if (c.valueItem) {
+ emit('change', null, c.valueItem);
+ }
+ emit('change', null);
};
return {
ns,
diff --git a/src/editor/data-picker/ibiz-picker-select-view/ibiz-picker-select-view.tsx b/src/editor/data-picker/ibiz-picker-select-view/ibiz-picker-select-view.tsx
index ad121378d..a84fb2c6b 100644
--- a/src/editor/data-picker/ibiz-picker-select-view/ibiz-picker-select-view.tsx
+++ b/src/editor/data-picker/ibiz-picker-select-view/ibiz-picker-select-view.tsx
@@ -143,18 +143,17 @@ export const IBizPickerSelectView = defineComponent({
// 清除
const onClear = () => {
- // zjm todo 实体自填模式相关
// 清空回填数据
- // const dataItems = c.model.deACMode?.dataItems;
- // if (dataItems?.length) {
- // dataItems.forEach(dataItem => {
- // emit('change', null, dataItem.name);
- // });
- // }
- // if (c.valueItem) {
- // emit('change', null, c.valueItem);
- // }
- // emit('change', null);
+ const dataItems = c.dataItems;
+ if (dataItems?.length) {
+ dataItems.forEach(dataItem => {
+ emit('change', null, dataItem.id);
+ });
+ }
+ if (c.valueItem) {
+ emit('change', null, c.valueItem);
+ }
+ emit('change', null);
};
// 视图数据改变
diff --git a/src/editor/data-picker/ibiz-picker/ibiz-picker.tsx b/src/editor/data-picker/ibiz-picker/ibiz-picker.tsx
index a5e5e0e6a..99a396498 100644
--- a/src/editor/data-picker/ibiz-picker/ibiz-picker.tsx
+++ b/src/editor/data-picker/ibiz-picker/ibiz-picker.tsx
@@ -60,7 +60,7 @@ export const IBizPicker = defineComponent({
const dataItems = await c.calcFillDataItems(data);
if (dataItems.length) {
dataItems.forEach(dataItem => {
- emit('change', dataItem.value, dataItem.name);
+ emit('change', dataItem.value, dataItem.id);
});
}
@@ -111,18 +111,17 @@ export const IBizPicker = defineComponent({
// 清除
const onClear = () => {
- // zjm todo 实体自填模式相关
// 清空回填数据
- // const dataItems = c.model.deACMode?.dataItems;
- // if (dataItems?.length) {
- // dataItems.forEach(dataItem => {
- // emit('change', null, dataItem.name);
- // });
- // }
- // if (c.valueItem) {
- // emit('change', null, c.valueItem);
- // }
- // emit('change', null);
+ const dataItems = c.dataItems;
+ if (dataItems?.length) {
+ dataItems.forEach(dataItem => {
+ emit('change', null, dataItem.id);
+ });
+ }
+ if (c.valueItem) {
+ emit('change', null, c.valueItem);
+ }
+ emit('change', null);
};
// 聚焦
diff --git a/src/editor/data-picker/picker-editor.controller.ts b/src/editor/data-picker/picker-editor.controller.ts
index cdaa2b5fc..62203de71 100644
--- a/src/editor/data-picker/picker-editor.controller.ts
+++ b/src/editor/data-picker/picker-editor.controller.ts
@@ -1,6 +1,12 @@
import { IHttpResponse, RuntimeModelError } from '@ibiz-template/core';
import { EditorController, OpenAppViewCommand } from '@ibiz-template/runtime';
-import { IAppDataEntity, IAppView, IPicker } from '@ibiz/model-core';
+import {
+ IAppDataEntity,
+ IAppDEACMode,
+ IAppView,
+ IDEACModeDataItem,
+ IPicker,
+} from '@ibiz/model-core';
/**
* 数据选择编辑器控制器
@@ -37,12 +43,12 @@ export class PickerEditorController extends EditorController
{
/**
* 主键属性名称
*/
- public keyName: string = '';
+ public keyName: string = 'srfkey';
/**
* 主文本属性名称
*/
- public textName: string = '';
+ public textName: string = 'srfmajortext';
/**
* 实体codeName
@@ -74,19 +80,28 @@ export class PickerEditorController extends EditorController {
*/
public appDataEntity: IAppDataEntity | null = null;
+ /**
+ * 实体自填模式模型
+ */
+ public deACMode: IAppDEACMode | null = null;
+
+ /**
+ * 自填数据项集合(已排除了value和text)
+ */
+ public dataItems: IDEACModeDataItem[] = [];
+
protected async onInit(): Promise {
super.onInit();
this.initParams();
- // zjm todo 值项名称父模型没有valueItemName
- this.valueItem = this.parent.valueItemName?.toLowerCase() || '';
+ this.valueItem = this.model.valueItemName?.toLowerCase() || '';
if (this.model.appDataEntityId) {
this.appDataEntity = await ibiz.hub.getAppDataEntity(
this.model.appDataEntityId,
this.context.srfappid,
)!;
if (this.appDataEntity) {
- this.keyName = this.appDataEntity?.keyAppDEFieldId || '';
- this.textName = this.appDataEntity?.majorAppDEFieldId || '';
+ this.keyName = this.appDataEntity.keyAppDEFieldId!;
+ this.textName = this.appDataEntity.majorAppDEFieldId!;
this.getAcParams();
this.sort = this.getAcSort();
}
@@ -141,23 +156,34 @@ export class PickerEditorController extends EditorController {
if (this.model.appDEDataSetId) {
this.interfaceName = this.model.appDEDataSetId;
}
- // zjm todo 实体自填模式模型
- // if (this.model.deACMode) {
- // this.textName = this.model.deACMode.textFieldName || this.textName;
- // this.keyName = this.model.deACMode.valueFieldName || this.keyName;
- // }
+ if (this.appDataEntity?.appDEACModes) {
+ this.deACMode = this.appDataEntity.appDEACModes[0];
+ if (this.deACMode.textAppDEFieldId) {
+ this.textName = this.deACMode.textAppDEFieldId;
+ }
+ if (this.deACMode.valueAppDEFieldId) {
+ this.keyName = this.deACMode.valueAppDEFieldId;
+ }
+ if (this.deACMode.deacmodeDataItems) {
+ this.deACMode.deacmodeDataItems.forEach(dataItem => {
+ if (dataItem.id !== 'value' && dataItem.id !== 'text') {
+ this.dataItems.push(dataItem);
+ }
+ });
+ }
+ }
}
/**
* 获取自填模式sort排序
*/
public getAcSort() {
- // if (this.model.deACMode) {
- // const { sortField, sortDir } = this.model.deACMode;
- // if (sortField && sortDir) {
- // return `${sortField},${sortDir}`;
- // }
- // }
+ if (this.deACMode) {
+ const { minorSortAppDEFieldId, minorSortDir } = this.deACMode;
+ if (minorSortAppDEFieldId && minorSortDir) {
+ return `${minorSortAppDEFieldId.toLowerCase()},${minorSortDir.toLowerCase()}`;
+ }
+ }
return undefined;
}
@@ -232,7 +258,9 @@ export class PickerEditorController extends EditorController {
this.context,
this.params,
);
- context.srfkey = data[this.valueItem];
+ if (data[this.valueItem]) {
+ context.srfkey = data[this.valueItem];
+ }
const { linkAppViewId } = this.model;
if (!linkAppViewId) {
throw new RuntimeModelError(this.model, '请配置数据链接视图');
@@ -251,15 +279,31 @@ export class PickerEditorController extends EditorController {
* @author lxm
* @date 2022-10-24 16:10:24
* @param {IData} data 选中数据
- * @returns {*} {Promise>}
+ * @returns {*} {Promise>}
*/
async calcFillDataItems(
- _data: IData,
+ data: IData,
// eslint-disable-next-line @typescript-eslint/no-explicit-any
- ): Promise> {
- // if (this.model.deACMode) {
- // return DEACModeUtil.calcFillDataItems(data, this.model.deACMode);
- // }
+ ): Promise> {
+ if (this.deACMode) {
+ if (this.dataItems.length === 0) {
+ return [];
+ }
+ const result = await Promise.all(
+ this.dataItems.map(item => {
+ const value = data[item.appDEFieldId!];
+ if (item.format) {
+ // todo 值格式化
+ } else if (item.convertToCodeItemText && item.codeListId) {
+ // todo 代码表转换为文本值
+ } else if (item.customCode) {
+ // todo 脚本代码
+ }
+ return { id: item.id!, value };
+ }),
+ );
+ return result;
+ }
return [];
}
}
diff --git a/src/editor/date-range/date-range-editor.controller.ts b/src/editor/date-range/date-range-editor.controller.ts
new file mode 100644
index 000000000..03f0bface
--- /dev/null
+++ b/src/editor/date-range/date-range-editor.controller.ts
@@ -0,0 +1,53 @@
+import { EditorController } from '@ibiz-template/runtime';
+import { IDateRange } from '@ibiz/model-core';
+
+/**
+ * 时间范围编辑器控制器
+ *
+ * @export
+ * @class DateRangeEditorController
+ * @extends {EditorController}
+ */
+export class DateRangeEditorController extends EditorController {
+ /**
+ * 占位
+ * @return {*}
+ * @author: zhujiamin
+ * @Date: 2022-08-25 14:33:14
+ */
+ public placeHolder = '请选择日期';
+
+ /**
+ * 根据编辑器类型获取格式化
+ *
+ * @author lxm
+ * @date 2022-11-03 16:11:21
+ * @public
+ * @returns {*} {string}
+ */
+ public getFormatByType(): string {
+ switch (this.model.editorType) {
+ // 时间范围选择器
+ case 'DATERANGE':
+ return 'YYYY-MM-DD HH:mm:ss';
+ // 时间范围选择器(YYYY-MM-DD)
+ case 'DATERANGE_NOTIME':
+ return 'YYYY-MM-DD';
+ default:
+ return 'YYYY-MM-DD HH:mm:ss';
+ }
+ }
+
+ /**
+ * 值格式化
+ * @return {*}
+ * @author: zhujiamin
+ * @Date: 2022-08-25 14:33:14
+ */
+ public valueFormat: string | undefined;
+
+ protected async onInit(): Promise {
+ super.onInit();
+ this.valueFormat = this.getFormatByType();
+ }
+}
diff --git a/src/editor/date-range/date-range-editor.provider.ts b/src/editor/date-range/date-range-editor.provider.ts
new file mode 100644
index 000000000..11a252a3f
--- /dev/null
+++ b/src/editor/date-range/date-range-editor.provider.ts
@@ -0,0 +1,28 @@
+import {
+ IEditorContainerController,
+ IEditorProvider,
+} from '@ibiz-template/runtime';
+import { IDateRange } from '@ibiz/model-core';
+import { DateRangeEditorController } from './date-range-editor.controller';
+
+/**
+ * 数值范围编辑器适配器
+ *
+ * @export
+ * @class DateRangeEditorProvider
+ * @implements {EditorProvider}
+ */
+export class DateRangeEditorProvider implements IEditorProvider {
+ formEditor: string = 'IBizDateRangePicker';
+
+ gridEditor: string = 'IBizDateRangePicker';
+
+ async createController(
+ editorModel: IDateRange,
+ parentController: IEditorContainerController,
+ ): Promise {
+ const c = new DateRangeEditorController(editorModel, parentController);
+ await c.init();
+ return c;
+ }
+}
diff --git a/src/editor/date-range/ibiz-date-range-picker/ibiz-date-range-picker.scss b/src/editor/date-range/ibiz-date-range-picker/ibiz-date-range-picker.scss
new file mode 100644
index 000000000..c709f7d67
--- /dev/null
+++ b/src/editor/date-range/ibiz-date-range-picker/ibiz-date-range-picker.scss
@@ -0,0 +1,5 @@
+@include b(date-range-picker) {
+ .el-date-editor {
+ width: 100%;
+ }
+}
diff --git a/src/editor/date-range/ibiz-date-range-picker/ibiz-date-range-picker.tsx b/src/editor/date-range/ibiz-date-range-picker/ibiz-date-range-picker.tsx
new file mode 100644
index 000000000..4f48650eb
--- /dev/null
+++ b/src/editor/date-range/ibiz-date-range-picker/ibiz-date-range-picker.tsx
@@ -0,0 +1,149 @@
+import { computed, defineComponent, Ref, ref } from 'vue';
+import {
+ getEditorEmits,
+ getDateRangeProps,
+ useNamespace,
+} from '@ibiz-template/vue3-util';
+import './ibiz-date-range-picker.scss';
+import { DateRangeEditorController } from '../date-range-editor.controller';
+
+export const IBizDateRangePicker = defineComponent({
+ name: 'IBizDateRangePicker',
+ props: getDateRangeProps(),
+ emits: getEditorEmits(),
+ setup(props, { emit }) {
+ const ns = useNamespace('date-range-picker');
+
+ const c = props.controller;
+
+ const editorModel = c.model;
+
+ // 值分割符
+ let valueSeparator = '-';
+ // 在范围选择器里取消两个日期面板之间的联动
+ let unlinkPanels = false;
+ // 开始占位提示
+ let startPlaceHolder = '开始时间';
+ // 结束占位提示
+ let endPlaceHolder = '结束时间';
+ // 选择范围时的分隔符
+ let rangeSeparator = '至';
+ if (editorModel.editorParams) {
+ if (editorModel.editorParams.valueseparator) {
+ valueSeparator = editorModel.editorParams.valueseparator;
+ }
+ if (editorModel.editorParams.startplaceholder) {
+ startPlaceHolder = editorModel.editorParams.startplaceholder;
+ }
+ if (editorModel.editorParams.endplaceholder) {
+ endPlaceHolder = editorModel.editorParams.endplaceholder;
+ }
+ if (editorModel.editorParams.rangeseparator) {
+ rangeSeparator = editorModel.editorParams.rangeseparator;
+ }
+ if (editorModel.editorParams.unlinkpanels) {
+ unlinkPanels = c.handleStringToBoolean(
+ editorModel.editorParams.unlinkpanels,
+ );
+ }
+ }
+
+ // 类型
+ const type = ref('daterange');
+ switch (editorModel.editorType) {
+ case 'DATERANGE':
+ type.value = 'datetimerange';
+ break;
+ case 'DATERANGE_NOTIME':
+ type.value = 'daterange';
+ break;
+ default:
+ type.value = 'datetimerange';
+ }
+
+ // 格式
+ const format = ref('YYYY-MM-DD');
+ // 值格式化
+ const valueFormat = c!.valueFormat;
+ if (valueFormat) {
+ format.value = valueFormat;
+ }
+
+ // 关系表单项集合
+ const refFormItem: Ref = ref([]);
+ const editorItems = editorModel.editorItems;
+ if (editorItems && editorItems.length > 0) {
+ const editorItemNames: string[] = editorItems.map(
+ (item: IData) => item.id,
+ );
+ refFormItem.value = editorItemNames;
+ }
+
+ // 当前值
+ const curValue = computed({
+ get() {
+ let value: string[] = [];
+ if (refFormItem.value) {
+ refFormItem.value.forEach((name: string) => {
+ if (props.data[name]) {
+ value.push(props.data[name]);
+ }
+ });
+ } else if (props.value && typeof props.value === 'string') {
+ value = props.value.split(valueSeparator);
+ }
+ return value;
+ },
+ set(dates: string[]) {
+ if (dates && dates.length > 0) {
+ emit('change', dates.join(valueSeparator));
+ if (refFormItem.value) {
+ dates.forEach((date: string, index: number) => {
+ emit('change', date, refFormItem.value[index]);
+ });
+ }
+ } else {
+ emit('change', null);
+ if (refFormItem.value) {
+ refFormItem.value.forEach((date: string, index: number) => {
+ emit('change', null, refFormItem.value[index]);
+ });
+ }
+ }
+ },
+ });
+
+ return {
+ ns,
+ c,
+ refFormItem,
+ curValue,
+ type,
+ format,
+ valueSeparator,
+ startPlaceHolder,
+ endPlaceHolder,
+ rangeSeparator,
+ unlinkPanels,
+ };
+ },
+ render() {
+ return (
+
+
+
+ );
+ },
+});
diff --git a/src/editor/date-range/index.ts b/src/editor/date-range/index.ts
new file mode 100644
index 000000000..313dfa995
--- /dev/null
+++ b/src/editor/date-range/index.ts
@@ -0,0 +1,3 @@
+export { IBizDateRangePicker } from './ibiz-date-range-picker/ibiz-date-range-picker';
+export * from './date-range-editor.controller';
+export * from './date-range-editor.provider';
diff --git a/src/editor/index.ts b/src/editor/index.ts
index 6503166dc..a9ebb02c3 100644
--- a/src/editor/index.ts
+++ b/src/editor/index.ts
@@ -53,6 +53,11 @@ import {
IBizPickerSelectView,
DataPickerEditorProvider,
} from './data-picker';
+import {
+ IBizNumberRangePicker,
+ NumberRangeEditorProvider,
+} from './number-range';
+import { IBizDateRangePicker, DateRangeEditorProvider } from './date-range';
export const IBizEditor = {
install: (v: App) => {
@@ -90,6 +95,8 @@ export const IBizEditor = {
v.component(IBizPickerLink.name, IBizPickerLink);
v.component(IBizPickerEmbedView.name, IBizPickerEmbedView);
v.component(IBizPickerSelectView.name, IBizPickerSelectView);
+ v.component(IBizNumberRangePicker.name, IBizNumberRangePicker);
+ v.component(IBizDateRangePicker.name, IBizDateRangePicker);
// 标签
registerEditorProvider('SPAN', () => new SpanEditorProvider());
@@ -237,6 +244,17 @@ export const IBizEditor = {
'PICKUPVIEW',
() => new DataPickerEditorProvider('PICKUPVIEW'),
);
+ // 数值范围
+ registerEditorProvider(
+ 'NUMBERRANGE',
+ () => new NumberRangeEditorProvider(),
+ );
+ // 时间范围
+ registerEditorProvider('DATERANGE', () => new DateRangeEditorProvider());
+ registerEditorProvider(
+ 'DATERANGE_NOTIME',
+ () => new DateRangeEditorProvider(),
+ );
},
};
diff --git a/src/editor/list-box/list-box-picker-editor.controller.ts b/src/editor/list-box/list-box-picker-editor.controller.ts
index 31eb524e8..e030c0ed9 100644
--- a/src/editor/list-box/list-box-picker-editor.controller.ts
+++ b/src/editor/list-box/list-box-picker-editor.controller.ts
@@ -1,4 +1,4 @@
-import { IHttpResponse } from '@ibiz-template/core';
+import { IHttpResponse, RuntimeModelError } from '@ibiz-template/core';
import { EditorController } from '@ibiz-template/runtime';
import { IAppDataEntity, IListBoxPicker } from '@ibiz/model-core';
@@ -12,12 +12,12 @@ export class ListBoxPickerEditorController extends EditorController {
super.onInit();
if (this.model.editorType === 'LISTBOXPICKUP') {
- // zjm todo 列表框选择模型缺少实体请求相关的,如appDataEntityId
- // this.appDataEntity = await ibiz.hub.getAppDataEntity(
- // this.model.appDataEntityId!,
- // this.context.srfappid,
- // )!;
-
+ this.appDataEntity = await ibiz.hub.getAppDataEntity(
+ this.model.appDataEntityId!,
+ this.context.srfappid,
+ );
if (this.appDataEntity) {
- this.keyName = this.appDataEntity?.keyAppDEFieldId || '';
- this.textName = this.appDataEntity?.majorAppDEFieldId || '';
+ this.keyName = this.appDataEntity.keyAppDEFieldId!;
+ this.textName = this.appDataEntity.majorAppDEFieldId!;
this.getAcParams();
}
}
@@ -58,9 +56,9 @@ export class ListBoxPickerEditorController extends EditorController>}
* @memberof PickerEditorController
*/
- public async getServiceData(_data: IData): Promise> {
- // const { context, params } = this.handlePublicParams(
- // data,
- // this.context,
- // this.params,
- // );
- // Object.assign(params, { size: 1000 });
- // if (this.serviceName && this.interfaceName) {
- // const deService = await this.app.es.getService(this.serviceName);
- // const res = await deService.exec(this.interfaceName, context, params);
- // return res as IHttpResponse;
- // }
- // throw new DefectModelError(this.model.source, '请配置实体和实体数据集');
- return {} as IHttpResponse;
+ public async getServiceData(data: IData): Promise> {
+ const { context, params } = this.handlePublicParams(
+ data,
+ this.context,
+ this.params,
+ );
+ Object.assign(params, { size: 1000 });
+ if (this.serviceName && this.interfaceName) {
+ const app = ibiz.hub.getApp(this.appDataEntity!.appId);
+ const deService = await app.deService.getService(this.serviceName);
+ const res = await deService.exec(this.interfaceName, context, params);
+ return res as IHttpResponse;
+ }
+ throw new RuntimeModelError(this.model, '请配置实体和实体数据集');
}
}
diff --git a/src/editor/number-range/ibiz-number-range-picker/ibiz-number-range-picker.scss b/src/editor/number-range/ibiz-number-range-picker/ibiz-number-range-picker.scss
new file mode 100644
index 000000000..354c292aa
--- /dev/null
+++ b/src/editor/number-range/ibiz-number-range-picker/ibiz-number-range-picker.scss
@@ -0,0 +1,8 @@
+@include b(number-range-picker) {
+ width: 100%;
+ @include flex(row);
+
+ .el-input-number {
+ flex: 1;
+ }
+}
diff --git a/src/editor/number-range/ibiz-number-range-picker/ibiz-number-range-picker.tsx b/src/editor/number-range/ibiz-number-range-picker/ibiz-number-range-picker.tsx
new file mode 100644
index 000000000..311d2cf61
--- /dev/null
+++ b/src/editor/number-range/ibiz-number-range-picker/ibiz-number-range-picker.tsx
@@ -0,0 +1,151 @@
+import { defineComponent, Ref, ref, watch } from 'vue';
+import {
+ getEditorEmits,
+ getNumberRangeProps,
+ useNamespace,
+} from '@ibiz-template/vue3-util';
+import './ibiz-number-range-picker.scss';
+import { NumberRangeEditorController } from '../number-range-editor.controller';
+
+export const IBizNumberRangePicker = defineComponent({
+ name: 'IBizNumberRangePicker',
+ props: getNumberRangeProps(),
+ emits: getEditorEmits(),
+ setup(props, { emit }) {
+ const ns = useNamespace('number-range-picker');
+
+ const c = props.controller;
+
+ const editorModel = c.model;
+
+ // 最大值
+ let max = Infinity;
+ // 最小值
+ let min = -Infinity;
+ // 数值精度
+ let precision = 0;
+ // 值分割符
+ let valueSeparator = '-';
+ // 开始占位提示
+ let startPlaceHolder = '请输入开始数字';
+ // 结束占位提示
+ let endPlaceHolder = '请输入结束数字';
+ // 选择范围时的分隔符
+ let rangeSeparator = '~';
+ if (editorModel.editorParams) {
+ if (editorModel.editorParams.maxvalue) {
+ max = c.handleStringToNumber(editorModel.editorParams.maxvalue);
+ }
+ if (editorModel.editorParams.minvalue) {
+ min = c.handleStringToNumber(editorModel.editorParams.minvalue);
+ }
+ if (editorModel.editorParams.precision) {
+ precision = c.handleStringToNumber(editorModel.editorParams.precision);
+ }
+ if (editorModel.editorParams.valueseparator) {
+ valueSeparator = editorModel.editorParams.valueseparator;
+ }
+ if (editorModel.editorParams.startplaceholder) {
+ startPlaceHolder = editorModel.editorParams.startplaceholder;
+ }
+ if (editorModel.editorParams.endplaceholder) {
+ endPlaceHolder = editorModel.editorParams.endplaceholder;
+ }
+ if (editorModel.editorParams.rangeseparator) {
+ rangeSeparator = editorModel.editorParams.rangeseparator;
+ }
+ }
+
+ // 数据
+ const items: number[] = [];
+
+ // 关系表单项集合
+ const refFormItem: Ref = ref([]);
+ const editorItems = editorModel.editorItems;
+ if (editorItems && editorItems.length > 0) {
+ const editorItemNames: string[] = editorItems.map(
+ (item: IData) => item.id,
+ );
+ refFormItem.value = editorItemNames;
+ }
+
+ // 范围最小值
+ const minValue = ref(null);
+
+ // 范围最大值
+ const maxValue = ref(null);
+
+ watch(
+ () => props.value,
+ (newVal, oldVal) => {
+ if (newVal !== oldVal && typeof newVal === 'string') {
+ minValue.value = newVal.split(valueSeparator)[0]
+ ? Number(newVal.split(valueSeparator)[0])
+ : null;
+ maxValue.value = newVal.split(valueSeparator)[1]
+ ? Number(newVal.split(valueSeparator)[1])
+ : null;
+ }
+ },
+ { immediate: true },
+ );
+
+ // 处理值变化
+ const handleChange = (value: number, index: number) => {
+ items[index] = value;
+ if (items.length === 2) {
+ emit('change', items.join(valueSeparator));
+ }
+ if (refFormItem.value) {
+ const valueName = refFormItem.value[index];
+ emit('change', value, valueName);
+ }
+ };
+
+ return {
+ ns,
+ c,
+ refFormItem,
+ minValue,
+ maxValue,
+ handleChange,
+ max,
+ min,
+ precision,
+ valueSeparator,
+ startPlaceHolder,
+ endPlaceHolder,
+ rangeSeparator,
+ };
+ },
+ render() {
+ return (
+
+
this.handleChange(val, 0)}
+ >
+
{this.rangeSeparator}
+
this.handleChange(val, 1)}
+ >
+
+ );
+ },
+});
diff --git a/src/editor/number-range/index.ts b/src/editor/number-range/index.ts
new file mode 100644
index 000000000..ce262868b
--- /dev/null
+++ b/src/editor/number-range/index.ts
@@ -0,0 +1,3 @@
+export { IBizNumberRangePicker } from './ibiz-number-range-picker/ibiz-number-range-picker';
+export * from './number-range-editor.controller';
+export * from './number-range-editor.provider';
diff --git a/src/editor/number-range/number-range-editor.controller.ts b/src/editor/number-range/number-range-editor.controller.ts
new file mode 100644
index 000000000..0f21ca6b9
--- /dev/null
+++ b/src/editor/number-range/number-range-editor.controller.ts
@@ -0,0 +1,11 @@
+import { EditorController } from '@ibiz-template/runtime';
+import { INumberRange } from '@ibiz/model-core';
+
+/**
+ * 数值范围编辑器控制器
+ *
+ * @export
+ * @class NumberRangeEditorController
+ * @extends {EditorController}
+ */
+export class NumberRangeEditorController extends EditorController {}
diff --git a/src/editor/number-range/number-range-editor.provider.ts b/src/editor/number-range/number-range-editor.provider.ts
new file mode 100644
index 000000000..02695c6c7
--- /dev/null
+++ b/src/editor/number-range/number-range-editor.provider.ts
@@ -0,0 +1,28 @@
+import {
+ IEditorContainerController,
+ IEditorProvider,
+} from '@ibiz-template/runtime';
+import { INumberRange } from '@ibiz/model-core';
+import { NumberRangeEditorController } from './number-range-editor.controller';
+
+/**
+ * 数值范围编辑器适配器
+ *
+ * @export
+ * @class NumberRangeEditorProvider
+ * @implements {EditorProvider}
+ */
+export class NumberRangeEditorProvider implements IEditorProvider {
+ formEditor: string = 'IBizNumberRangePicker';
+
+ gridEditor: string = 'IBizNumberRangePicker';
+
+ async createController(
+ editorModel: INumberRange,
+ parentController: IEditorContainerController,
+ ): Promise {
+ const c = new NumberRangeEditorController(editorModel, parentController);
+ await c.init();
+ return c;
+ }
+}
diff --git a/src/editor/raw/ibiz-raw/ibiz-raw.tsx b/src/editor/raw/ibiz-raw/ibiz-raw.tsx
index 3f2c232b8..f96692164 100644
--- a/src/editor/raw/ibiz-raw/ibiz-raw.tsx
+++ b/src/editor/raw/ibiz-raw/ibiz-raw.tsx
@@ -39,11 +39,11 @@ export const IBizRaw = defineComponent({
this.readonly ? this.ns.m('readonly') : '',
]}
>
-
+ >
);
},
diff --git a/src/editor/span/span-editor.controller.ts b/src/editor/span/span-editor.controller.ts
index a7af2e7cb..b9aa1a9e9 100644
--- a/src/editor/span/span-editor.controller.ts
+++ b/src/editor/span/span-editor.controller.ts
@@ -1,4 +1,4 @@
-import { ISpan, IAppView, IAppCodeList } from '@ibiz/model-core';
+import { ISpan, IAppCodeList } from '@ibiz/model-core';
import {
CodeListEditorController,
OpenAppViewCommand,
@@ -17,11 +17,6 @@ export class SpanEditorController extends CodeListEditorController {
*/
public valueItem = '';
- /**
- *链接视图相关参数
- */
- public linkView: IAppView | null = null;
-
/**
* 代码表模型
* @return {*}
@@ -32,8 +27,10 @@ export class SpanEditorController extends CodeListEditorController {
protected async onInit(): Promise {
super.onInit();
- // zjm todo 值项名称父没有valueItemName
- this.valueItem = this.parent.valueItemName?.toLowerCase() || '';
+ // span-link临时用editorItems
+ if (this.model?.editorItems?.[0]) {
+ this.valueItem = this.model.editorItems[0].id!;
+ }
// 初始化代码表
if (this.model.appCodeListId) {
const app = await ibiz.hub.getApp(this.context.srfappid);
@@ -50,7 +47,9 @@ export class SpanEditorController extends CodeListEditorController {
this.context,
this.params,
);
- context.srfkey = data[this.valueItem];
+ if (data[this.valueItem]) {
+ context.srfkey = data[this.valueItem];
+ }
const { linkAppViewId } = this.model;
if (!linkAppViewId) {
throw new RuntimeModelError(this.model, '请配置数据链接视图');
diff --git a/src/editor/stepper/stepper-editor.controller.ts b/src/editor/stepper/stepper-editor.controller.ts
index 4ca70e331..be31f108a 100644
--- a/src/editor/stepper/stepper-editor.controller.ts
+++ b/src/editor/stepper/stepper-editor.controller.ts
@@ -8,4 +8,12 @@ import { IStepper } from '@ibiz/model-core';
* @class StepperEditorController
* @extends {EditorController}
*/
-export class StepperEditorController extends EditorController {}
+export class StepperEditorController extends EditorController {
+ /**
+ * 占位
+ * @return {*}
+ * @author: zhujiamin
+ * @Date: 2022-08-25 14:33:14
+ */
+ public placeHolder = '请输入';
+}
diff --git a/src/editor/upload/upload-editor.controller.ts b/src/editor/upload/upload-editor.controller.ts
index 8098ef292..26a6b4a46 100644
--- a/src/editor/upload/upload-editor.controller.ts
+++ b/src/editor/upload/upload-editor.controller.ts
@@ -1,4 +1,8 @@
-import { downloadFileFromBlob, RuntimeError } from '@ibiz-template/core';
+import {
+ downloadFileFromBlob,
+ RuntimeError,
+ RuntimeModelError,
+} from '@ibiz-template/core';
import { convertNavData, EditorController } from '@ibiz-template/runtime';
import { IFileUploader } from '@ibiz/model-core';
import qs from 'qs';
@@ -63,12 +67,24 @@ export class UploadEditorController extends EditorController {
this.accept = accept;
}
if (uploadparams) {
- // eslint-disable-next-line no-eval
- this.uploadParams = eval(`(${uploadparams})`);
+ try {
+ this.uploadParams = JSON.parse(uploadparams);
+ } catch (error) {
+ throw new RuntimeModelError(
+ uploadparams,
+ `配置uploadparams没有按标准JSON格式`,
+ );
+ }
}
if (exportparams) {
- // eslint-disable-next-line no-eval
- this.exportParams = eval(`(${exportparams})`);
+ try {
+ this.exportParams = JSON.parse(exportparams);
+ } catch (error) {
+ throw new RuntimeModelError(
+ exportparams,
+ `配置exportparams没有按标准JSON格式`,
+ );
+ }
}
}
}
--
Gitee
From a5541d90702a4ffb91e95aa99cfc66fbebdeb816 Mon Sep 17 00:00:00 2001
From: zhujiamin <1147570162@qq.com>
Date: Fri, 26 May 2023 18:35:05 +0800
Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E8=A1=A8?=
=?UTF-8?q?=E5=8D=95=E5=A4=9A=E6=95=B0=E6=8D=AE=E9=83=A8=E4=BB=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../form/edit-form/edit-form.controller.ts | 2 +-
.../form/edit-form/edit-form.service.ts | 34 ++---
src/control/form/edit-form/edit-form.tsx | 15 ++-
.../form-mdctrl/form-mdctrl.controller.ts | 119 ++++++++++++++++++
.../form-mdctrl/form-mdctrl.provider.ts | 27 ++++
.../form-detail/form-mdctrl/form-mdctrl.scss | 29 +++++
.../form-mdctrl/form-mdctrl.state.ts | 16 +++
.../form-detail/form-mdctrl/form-mdctrl.tsx | 111 ++++++++++++++++
.../form/form-detail/form-mdctrl/index.ts | 17 +++
src/control/form/form-detail/index.ts | 1 +
src/control/form/form/form.controller.ts | 14 ++-
src/control/form/form/index.ts | 2 +
12 files changed, 368 insertions(+), 19 deletions(-)
create mode 100644 src/control/form/form-detail/form-mdctrl/form-mdctrl.controller.ts
create mode 100644 src/control/form/form-detail/form-mdctrl/form-mdctrl.provider.ts
create mode 100644 src/control/form/form-detail/form-mdctrl/form-mdctrl.scss
create mode 100644 src/control/form/form-detail/form-mdctrl/form-mdctrl.state.ts
create mode 100644 src/control/form/form-detail/form-mdctrl/form-mdctrl.tsx
create mode 100644 src/control/form/form-detail/form-mdctrl/index.ts
diff --git a/src/control/form/edit-form/edit-form.controller.ts b/src/control/form/edit-form/edit-form.controller.ts
index eb8f2d5e4..a046d2781 100644
--- a/src/control/form/edit-form/edit-form.controller.ts
+++ b/src/control/form/edit-form/edit-form.controller.ts
@@ -62,7 +62,7 @@ export class EditFormController
* @author lxm
* @date 2022-08-19 14:08:50
*/
- async load(): Promise {
+ async load(): Promise {
this.isNewData = !hasDeCodeName(this.context, this.model.appDataEntityId!);
const queryParams = { ...this.params };
diff --git a/src/control/form/edit-form/edit-form.service.ts b/src/control/form/edit-form/edit-form.service.ts
index e7a69ec06..cadeb06c1 100644
--- a/src/control/form/edit-form/edit-form.service.ts
+++ b/src/control/form/edit-form/edit-form.service.ts
@@ -87,17 +87,17 @@ export class EditFormService<
* @author lxm
* @date 2022-09-07 19:09:11
* @param {IParams} context 上下文
- * @param {ControlVO} data 数据
+ * @param {IData} data 数据
* @returns {*}
*/
async create(
context: IParams,
- data: ControlVO,
+ data: IData,
): Promise> {
let res = await this.exec(
this.model.createControlAction!.appDEMethodId!,
context,
- data.getOrigin(),
+ data instanceof ControlVO ? data.getOrigin() : data,
);
res = this.handleResponse(res);
return res as IHttpResponse;
@@ -109,17 +109,17 @@ export class EditFormService<
* @author lxm
* @date 2022-09-07 19:09:11
* @param {IParams} context 上下文
- * @param {ControlVO} data 数据
+ * @param {IData} data 数据
* @returns {*}
*/
async update(
context: IParams,
- data: ControlVO,
+ data: IData,
): Promise> {
let res = await this.exec(
this.model.updateControlAction!.appDEMethodId!,
context,
- data.getOrigin(),
+ data instanceof ControlVO ? data.getOrigin() : data,
);
res = this.handleResponse(res);
return res as IHttpResponse;
@@ -131,19 +131,23 @@ export class EditFormService<
* @author lxm
* @date 2022-09-07 19:09:11
* @param {IParams} context 上下文
- * @param {ControlVO} data 数据
+ * @param {IData} data 数据
* @returns {*}
*/
async goBack(
context: IParams,
- data: ControlVO,
+ data: IData,
): Promise> {
const wizardForm = this.model as IDEWizardEditForm;
const methodName = wizardForm.goBackControlAction?.appDEMethodId;
if (!methodName) {
throw new RuntimeModelError(this.model, '缺少返回操作实体行为');
}
- let res = await this.exec(methodName, context, data.getOrigin());
+ let res = await this.exec(
+ methodName,
+ context,
+ data instanceof ControlVO ? data.getOrigin() : data,
+ );
res = this.handleResponse(res);
return res as IHttpResponse;
}
@@ -174,14 +178,14 @@ export class EditFormService<
* @author lxm
* @date 2022-09-07 19:09:11
* @param {IParams} context 上下文
- * @param {ControlVO} data 数据
+ * @param {IData} data 数据
* @param {IParams} [params={}] 视图参数
* @returns {*}
*/
async wfStart(
context: IParams,
params: IParams,
- data: ControlVO,
+ data: IData,
): Promise> {
const wfForm = this.model as IWFEditForm;
const methodName = wfForm.wfstartControlAction?.appDEMethodId;
@@ -192,7 +196,7 @@ export class EditFormService<
methodName,
context,
params,
- data.getOrigin(),
+ data instanceof ControlVO ? data.getOrigin() : data,
);
}
@@ -202,14 +206,14 @@ export class EditFormService<
* @author lxm
* @date 2022-09-07 19:09:11
* @param {IParams} context 上下文
- * @param {ControlVO} data 数据
+ * @param {IData} data 数据
* @param {IParams} [params={}] 视图参数
* @returns {*}
*/
async wfSubmit(
context: IParams,
params: IParams,
- data: ControlVO,
+ data: IData,
): Promise> {
const wfForm = this.model as IWFEditForm;
const methodName = wfForm.wfsubmitControlAction?.appDEMethodId;
@@ -220,7 +224,7 @@ export class EditFormService<
methodName,
context,
params,
- data.getOrigin(),
+ data instanceof ControlVO ? data.getOrigin() : data,
);
}
diff --git a/src/control/form/edit-form/edit-form.tsx b/src/control/form/edit-form/edit-form.tsx
index ce5860f25..61cc82f23 100644
--- a/src/control/form/edit-form/edit-form.tsx
+++ b/src/control/form/edit-form/edit-form.tsx
@@ -1,7 +1,7 @@
/* eslint-disable no-param-reassign */
import { useControlController, useNamespace } from '@ibiz-template/vue3-util';
import { IDEEditForm } from '@ibiz/model-core';
-import { defineComponent, PropType, reactive } from 'vue';
+import { defineComponent, PropType, reactive, watch } from 'vue';
import { EditFormController } from './edit-form.controller';
export const EditFormControl = defineComponent({
@@ -13,11 +13,24 @@ export const EditFormControl = defineComponent({
},
context: { type: Object as PropType, required: true },
params: { type: Object as PropType, default: () => ({}) },
+ isSimple: { type: Boolean, required: false },
+ data: { type: Object as PropType, required: false },
},
setup() {
const c = useControlController(
(...args) => new EditFormController(...args),
);
+
+ watch(
+ () => c.state.data,
+ (newVal, oldVal) => {
+ if (newVal && newVal !== oldVal) {
+ c.state.isLoaded = true;
+ }
+ },
+ { immediate: true },
+ );
+
const ns = useNamespace(`control-${c.model.controlType!.toLowerCase()}`);
c.evt.on('onCreated', () => {
diff --git a/src/control/form/form-detail/form-mdctrl/form-mdctrl.controller.ts b/src/control/form/form-detail/form-mdctrl/form-mdctrl.controller.ts
new file mode 100644
index 000000000..cf3f86f3f
--- /dev/null
+++ b/src/control/form/form-detail/form-mdctrl/form-mdctrl.controller.ts
@@ -0,0 +1,119 @@
+import {
+ EventBase,
+ getControlProvider,
+ IControlProvider,
+} from '@ibiz-template/runtime';
+import { IControl, IDEFormMDCtrl } from '@ibiz/model-core';
+import { FormDetailController } from '../form-detail';
+import { FormMDCtrlState } from './form-mdctrl.state';
+
+/**
+ * 表单多数据部件控制器
+ *
+ * @author lxm
+ * @date 2022-09-04 15:09:52
+ * @export
+ * @class FormMDCtrlController
+ * @extends {FormDetailController}
+ */
+export class FormMDCtrlController extends FormDetailController {
+ declare state: FormMDCtrlState;
+
+ protected createState(): FormMDCtrlState {
+ return new FormMDCtrlState(this.parent?.state);
+ }
+
+ /**
+ * 所有部件的适配器
+ *
+ * @author lxm
+ * @date 2022-08-24 20:08:07
+ * @type {{ [key: string]: IControlProvider }}
+ */
+ providers: { [key: string]: IControlProvider } = {};
+
+ /**
+ * 嵌入表单模型
+ * @return {*}
+ * @author: zhujiamin
+ * @Date: 2023-05-26 10:44:10
+ */
+ formModel: IControl | null = null;
+
+ protected async onInit(): Promise {
+ await super.onInit();
+ // 编辑表单适配器
+ const mdCtrl = this.model.contentControl;
+ if (mdCtrl && this.model.contentType === 'FORM') {
+ this.formModel = mdCtrl;
+ const formProvider = await getControlProvider(this.formModel);
+ if (formProvider) {
+ this.providers[this.formModel.id!] = formProvider;
+ }
+ }
+ }
+
+ /**
+ * 内部表单数据发生改变,同步contentCtrlData并设置外部表单值
+ * @param {EventBase} arg
+ * @param {number} index
+ * @return {*}
+ * @author: zhujiamin
+ * @Date: 2023-05-26 14:38:42
+ */
+ onFormDataChange(arg: EventBase, index: number) {
+ this.state.contentCtrlData[index] = arg.data[0];
+ this.setFormDataValue();
+ }
+
+ /**
+ * 手动通知外部表单值变更
+ * @return {*}
+ * @author: zhujiamin
+ * @Date: 2023-05-26 14:49:39
+ */
+ setFormDataValue() {
+ if (this.model.appDEFieldId) {
+ this.form.setDataValue(
+ this.model.appDEFieldId,
+ this.state.contentCtrlData,
+ );
+ }
+ }
+
+ /**
+ * 加载数据,要在表单加载完成之后再去加载
+ * @return {*}
+ * @author: zhujiamin
+ * @Date: 2023-05-06 14:50:11
+ */
+ async loadData() {
+ if (this.model.appDEFieldId) {
+ this.state.contentCtrlData = this.data[this.model.appDEFieldId] || [];
+ }
+ }
+
+ /**
+ * 处理删除
+ * @param {IData} args
+ * @param {number} index
+ * @return {*}
+ * @author: zhujiamin
+ * @Date: 2023-05-06 14:54:55
+ */
+ async handleRemove(args: IData, index: number) {
+ this.state.contentCtrlData.splice(index, 1);
+ this.setFormDataValue();
+ }
+
+ /**
+ * 处理添加
+ * @return {*}
+ * @author: zhujiamin
+ * @Date: 2023-05-06 14:59:24
+ */
+ async handleAdd() {
+ this.state.contentCtrlData.push({});
+ this.setFormDataValue();
+ }
+}
diff --git a/src/control/form/form-detail/form-mdctrl/form-mdctrl.provider.ts b/src/control/form/form-detail/form-mdctrl/form-mdctrl.provider.ts
new file mode 100644
index 000000000..f0b0150f8
--- /dev/null
+++ b/src/control/form/form-detail/form-mdctrl/form-mdctrl.provider.ts
@@ -0,0 +1,27 @@
+import { IFormDetailProvider } from '@ibiz-template/runtime';
+import { IDEFormMDCtrl } from '@ibiz/model-core';
+import { FormController } from '../../form/form.controller';
+import { FormGroupPanelController } from '../form-group-panel';
+import { FormMDCtrlController } from './form-mdctrl.controller';
+/**
+ * 表单多数据部件适配器
+ *
+ * @author lxm
+ * @date 2022-09-19 22:09:03
+ * @export
+ * @class FormMDCtrlProvider
+ * @implements {EditorProvider}
+ */
+export class FormMDCtrlProvider implements IFormDetailProvider {
+ component: string = 'IBizFormMDCtrl';
+
+ async createController(
+ detailModel: IDEFormMDCtrl,
+ form: FormController,
+ parent: FormGroupPanelController | undefined,
+ ): Promise {
+ const c = new FormMDCtrlController(detailModel, form, parent);
+ await c.init();
+ return c;
+ }
+}
diff --git a/src/control/form/form-detail/form-mdctrl/form-mdctrl.scss b/src/control/form/form-detail/form-mdctrl/form-mdctrl.scss
new file mode 100644
index 000000000..2751fae3d
--- /dev/null
+++ b/src/control/form/form-detail/form-mdctrl/form-mdctrl.scss
@@ -0,0 +1,29 @@
+@include b(form-mdctrl) {
+ @include b(form-mdctrl-main) {
+ @include b(form-mdctrl-form-content) {
+ @include flex(row);
+ }
+
+ @include b(form-mdctrl-btn) {
+ cursor: pointer;
+ @include flex(column, flex-start, center);
+ }
+
+ @include b(form-mdctrl-title) {
+ @include flex(row, space-between, center);
+ }
+
+ @include b(form-mdctrl-remove-btn) {
+ color: getCssVar('color', 'danger');
+ text-align: right;
+ cursor: pointer;
+ box-shadow: none;
+ }
+
+ @include b(form-mdctrl-add-btn) {
+ color: getCssVar('color', 'primary');
+ cursor: pointer;
+ box-shadow: none;
+ }
+ }
+}
diff --git a/src/control/form/form-detail/form-mdctrl/form-mdctrl.state.ts b/src/control/form/form-detail/form-mdctrl/form-mdctrl.state.ts
new file mode 100644
index 000000000..30613bc2b
--- /dev/null
+++ b/src/control/form/form-detail/form-mdctrl/form-mdctrl.state.ts
@@ -0,0 +1,16 @@
+import { FormDetailState } from '../form-detail';
+
+/**
+ * 表单多数据部件状态
+ * @return {*}
+ * @author: zhujiamin
+ * @Date: 2023-01-04 10:26:34
+ */
+export class FormMDCtrlState extends FormDetailState {
+ /**
+ * 多数据内容数据
+ *
+ * @type {Array}
+ */
+ contentCtrlData: Array = [];
+}
diff --git a/src/control/form/form-detail/form-mdctrl/form-mdctrl.tsx b/src/control/form/form-detail/form-mdctrl/form-mdctrl.tsx
new file mode 100644
index 000000000..41ff9971c
--- /dev/null
+++ b/src/control/form/form-detail/form-mdctrl/form-mdctrl.tsx
@@ -0,0 +1,111 @@
+/* eslint-disable prefer-const */
+import { defineComponent, h, PropType, resolveComponent, watch } from 'vue';
+import { useController, useNamespace } from '@ibiz-template/vue3-util';
+import './form-mdctrl.scss';
+import { IDEFormMDCtrl } from '@ibiz/model-core';
+import { EventBase } from '@ibiz-template/runtime';
+import { FormMDCtrlController } from './form-mdctrl.controller';
+
+export const FormMDCtrl = defineComponent({
+ name: 'IBizFormMDCtrl',
+ props: {
+ modelData: {
+ type: Object as PropType,
+ required: true,
+ },
+ controller: {
+ type: FormMDCtrlController,
+ required: true,
+ },
+ },
+ setup(props) {
+ const ns = useNamespace('form-mdctrl');
+
+ useController(props.controller);
+
+ const c = props.controller;
+
+ watch(
+ () => c.form.state.isLoaded,
+ (n, o) => {
+ if (n !== o && n === true) {
+ c.loadData();
+ }
+ },
+ );
+
+ return { ns, c };
+ },
+ render() {
+ const renderFormContent = () => {
+ return (
+ this.c.state.contentCtrlData.length > 0 &&
+ this.c.state.contentCtrlData.map((data: IData, index: number) => {
+ let formComponent = null;
+ const { formModel } = this.c;
+ if (formModel && this.c.providers[formModel.id!]) {
+ const tempContext = this.c.form.context.clone();
+ formComponent = h(
+ resolveComponent(this.c.providers[formModel.id!].component),
+ {
+ modelData: formModel,
+ context: tempContext,
+ params: this.c.form.params,
+ isSimple: true,
+ data,
+ onFormDataChange: (arg: EventBase) =>
+ this.c.onFormDataChange(arg, index),
+ },
+ );
+ }
+ return (
+
+ {formComponent}
+
+ this.c.handleRemove(data, index)}
+ >
+ {{
+ reference: () => {
+ return (
+
+ 删除
+
+ );
+ },
+ }}
+
+
+
+ );
+ })
+ );
+ };
+
+ const renderMainContent = () => {
+ return (
+
+ {[
+
+ {this.modelData.caption}
+ this.c.handleAdd()}
+ >
+ 添加
+
+
,
+ renderFormContent(),
+ ]}
+
+ );
+ };
+
+ return {renderMainContent()}
;
+ },
+});
+
+export default FormMDCtrl;
diff --git a/src/control/form/form-detail/form-mdctrl/index.ts b/src/control/form/form-detail/form-mdctrl/index.ts
new file mode 100644
index 000000000..5ced077c0
--- /dev/null
+++ b/src/control/form/form-detail/form-mdctrl/index.ts
@@ -0,0 +1,17 @@
+import { registerFormDetailProvider } from '@ibiz-template/runtime';
+import { withInstall } from '@ibiz-template/vue3-util';
+import { App } from 'vue';
+import FormMDCtrl from './form-mdctrl';
+import { FormMDCtrlProvider } from './form-mdctrl.provider';
+
+export * from './form-mdctrl.provider';
+export * from './form-mdctrl.state';
+export * from './form-mdctrl.controller';
+
+export const IBizFormMDCtrl = withInstall(FormMDCtrl, function (v: App) {
+ v.component(FormMDCtrl.name, FormMDCtrl);
+ // 表单按钮
+ registerFormDetailProvider('MDCTRL', () => new FormMDCtrlProvider());
+});
+
+export default IBizFormMDCtrl;
diff --git a/src/control/form/form-detail/index.ts b/src/control/form/form-detail/index.ts
index 6f750b617..737e972a9 100644
--- a/src/control/form/form-detail/index.ts
+++ b/src/control/form/form-detail/index.ts
@@ -4,3 +4,4 @@ export * from './form-item/index';
export * from './form-page/index';
export * from './form-button/index';
export * from './form-druipart/index';
+export * from './form-mdctrl/index';
diff --git a/src/control/form/form/form.controller.ts b/src/control/form/form/form.controller.ts
index 1fe55b953..a3a74d799 100644
--- a/src/control/form/form/form.controller.ts
+++ b/src/control/form/form/form.controller.ts
@@ -2,6 +2,7 @@
import { RuntimeError, debounceAndAsyncMerge } from '@ibiz-template/core';
import {
ControlController,
+ ControllerEvent,
ControlVO,
FormNotifyState,
getFormDetailProvider,
@@ -33,6 +34,10 @@ export abstract class FormController<
extends ControlController
implements IFormController
{
+ protected get _evt(): ControllerEvent {
+ return this.evt;
+ }
+
/**
* 所有表单项成员的控制器
*
@@ -66,9 +71,9 @@ export abstract class FormController<
* @author chitanda
* @date 2023-01-04 10:01:46
* @readonly
- * @type {ControlVO}
+ * @type {IData}
*/
- get data(): ControlVO {
+ get data(): IData {
return this.state.data;
}
@@ -233,6 +238,11 @@ export abstract class FormController<
// 设置正在处理状态
this.state.processing = true;
+
+ // 如果是简易模式需要直接抛出去
+ if (this.state.isSimple) {
+ await this._evt.emit('onFormDataChange', undefined);
+ }
try {
await this.dataChangeNotify([name]);
} finally {
diff --git a/src/control/form/form/index.ts b/src/control/form/form/index.ts
index cdf0265ad..a08726135 100644
--- a/src/control/form/form/index.ts
+++ b/src/control/form/form/index.ts
@@ -7,6 +7,7 @@ import {
IBizFormGroupPanel,
IBizFormItem,
IBizFormPage,
+ IBizFormMDCtrl,
} from '../form-detail';
export * from './form.controller';
@@ -18,6 +19,7 @@ export const IBizFormControl = withInstall(FormControl, function (v: App) {
v.use(IBizFormGroupPanel);
v.use(IBizFormButton);
v.use(IBizFormDRUIPart);
+ v.use(IBizFormMDCtrl);
// 表单直接内容
// registerFormDetailProvider('RAWITEM', new FormRawItemProvider());
--
Gitee
From 34e70b4493fd03e67ff041af4ea17783f96d89e0 Mon Sep 17 00:00:00 2001
From: zhujiamin <1147570162@qq.com>
Date: Tue, 30 May 2023 18:08:19 +0800
Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=E8=A7=A3=E5=86=B3=E7=BC=96?=
=?UTF-8?q?=E8=BE=91=E5=99=A8=E4=B8=80=E7=B3=BB=E5=88=97=E9=97=AE=E9=A2=98?=
=?UTF-8?q?=E4=BB=A5=E5=8F=8A=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/common/app-rawitem/app-rawitem.tsx | 181 ------------------
.../form-item-container.scss | 15 +-
.../ibiz-autocomplete/ibiz-autocomplete.scss | 4 +
.../ibiz-autocomplete/ibiz-autocomplete.tsx | 1 +
.../ibiz-picker-embed-view.tsx | 2 +-
.../ibiz-picker-select-view.tsx | 2 +-
.../data-picker/ibiz-picker/ibiz-picker.tsx | 9 +-
.../data-picker/picker-editor.controller.ts | 3 +-
.../list-box/ibiz-list-box/ibiz-list-box.scss | 2 +
src/editor/slider/ibiz-slider/ibiz-slider.tsx | 8 +-
10 files changed, 25 insertions(+), 202 deletions(-)
delete mode 100644 src/common/app-rawitem/app-rawitem.tsx
diff --git a/src/common/app-rawitem/app-rawitem.tsx b/src/common/app-rawitem/app-rawitem.tsx
deleted file mode 100644
index f7e311dd7..000000000
--- a/src/common/app-rawitem/app-rawitem.tsx
+++ /dev/null
@@ -1,181 +0,0 @@
-import { useNamespace } from '@ibiz-template/vue3-util';
-import { defineComponent, ref } from 'vue';
-import { createUUID } from 'qx-util';
-
-export const AppRawItem = defineComponent({
- name: 'AppRawItem',
- props: {
- type: {
- type: String,
- required: true,
- },
- content: {
- type: [String, Object],
- },
- },
- setup(props) {
- const ns = useNamespace('rawitem');
-
- // 视频类型内容参数
- const playerParams = ref({
- id: createUUID(),
- path: '',
- mute: true,
- autoplay: true,
- replay: false,
- showcontrols: true,
- });
-
- // 分割线类型参数
- const dividerParams = ref({
- contentPosition: 'center',
- html: '',
- });
-
- // 类型参数
- const alertParams = ref({
- type: 'info',
- title: '',
- closeabled: true,
- showIcon: false,
- });
-
- // 文本类型显示值
- const rawItemText = ref('');
-
- if (
- [
- 'TEXT',
- 'HEADING1',
- 'HEADING2',
- 'HEADING3',
- 'HEADING4',
- 'HEADING5',
- 'HEADING6',
- 'PARAGRAPH',
- 'HTML',
- ].includes(props.type)
- ) {
- if (props.content && typeof props.content === 'string') {
- rawItemText.value = props.content;
- rawItemText.value = rawItemText.value.replaceAll('<', '<');
- rawItemText.value = rawItemText.value.replaceAll('>', '>');
- rawItemText.value = rawItemText.value.replaceAll(' ', ' ');
- rawItemText.value = rawItemText.value.replaceAll(' ', ' ');
- }
- }
-
- if (['VIDEO', 'DIVIDER', 'INFO', 'WARNING', 'ERROR'].includes(props.type)) {
- if (props.content) {
- let rawConfig = {};
- try {
- if (typeof props.content === 'string') {
- // eslint-disable-next-line no-new-func
- const func = new Function(`return (${props.content});`);
- rawConfig = func();
- switch (props.type) {
- case 'VIDEO':
- Object.assign(playerParams.value, rawConfig);
- break;
- case 'DIVIDER':
- Object.assign(dividerParams.value, rawConfig);
- break;
- case 'INFO':
- case 'WARNING':
- case 'ERROR':
- alertParams.value.type = props.type.toLocaleLowerCase();
- Object.assign(alertParams.value, rawConfig);
- break;
- default:
- break;
- }
- }
- } catch {
- ibiz.log.error(`${props.type}类型自定义参数配置错误`);
- }
- }
- }
-
- return { ns, rawItemText, playerParams, dividerParams, alertParams };
- },
- render() {
- if (this.type === 'IMAGE') {
- return (
-
- );
- }
- if (this.type === 'TEXT') {
- return {this.rawItemText};
- }
- if (this.type === 'HEADING1') {
- return {this.rawItemText}
;
- }
- if (this.type === 'HEADING2') {
- return {this.rawItemText}
;
- }
- if (this.type === 'HEADING3') {
- return {this.rawItemText}
;
- }
- if (this.type === 'HEADING4') {
- return {this.rawItemText}
;
- }
- if (this.type === 'HEADING5') {
- return {this.rawItemText}
;
- }
- if (this.type === 'HEADING6') {
- return {this.rawItemText}
;
- }
- if (this.type === 'PARAGRAPH') {
- return {this.rawItemText}
;
- }
- if (this.type === 'HTML') {
- return (
-
- );
- }
- if (this.type === 'VIDEO') {
- return (
-
-
-
- );
- }
- if (this.type === 'DIVIDER') {
- return (
-
-
-
- );
- }
- if (
- this.type === 'INFO' ||
- this.type === 'WARNING' ||
- this.type === 'ERROR'
- ) {
- return (
-
- );
- }
- if (['MARKDOWN', 'PLACEHOLDER'].includes(this.type)) {
- return {this.type}类型暂未支持
;
- }
- return null;
- },
-});
diff --git a/src/control/form/form-detail/form-item/form-item-container/form-item-container.scss b/src/control/form/form-detail/form-item/form-item-container/form-item-container.scss
index 3ddbf9fc8..fbd76afa8 100644
--- a/src/control/form/form-detail/form-item/form-item-container/form-item-container.scss
+++ b/src/control/form/form-detail/form-item/form-item-container/form-item-container.scss
@@ -10,18 +10,14 @@
padding-top: calc(
(
- getCssVar('form-item-container', 'line-height') - getCssVar(
- 'form-item',
- 'font-size'
- )
+ getCssVar('form-item-container', 'line-height') -
+ getCssVar('form-item', 'font-size')
) / 2
);
padding-bottom: calc(
(
- getCssVar('form-item-container', 'line-height') - getCssVar(
- 'form-item',
- 'font-size'
- )
+ getCssVar('form-item-container', 'line-height') -
+ getCssVar('form-item', 'font-size')
) / 2
);
line-height: getCssVar('form-item', 'font-size');
@@ -40,6 +36,7 @@
}
@include e(editor) {
+ position: relative;
flex-grow: 1;
}
}
@@ -78,6 +75,8 @@
.#{bem('form-item-container', '', 'right')} {
.#{bem('form-item-container-content')} {
@include flex;
+
+ height: 100%;
}
}
diff --git a/src/editor/autocomplete/ibiz-autocomplete/ibiz-autocomplete.scss b/src/editor/autocomplete/ibiz-autocomplete/ibiz-autocomplete.scss
index 94bb482ab..f283e9308 100644
--- a/src/editor/autocomplete/ibiz-autocomplete/ibiz-autocomplete.scss
+++ b/src/editor/autocomplete/ibiz-autocomplete/ibiz-autocomplete.scss
@@ -1,3 +1,7 @@
@include b(autocomplete) {
width: 100%;
+
+ @include e(transfer) {
+ width: 100%;
+ }
}
diff --git a/src/editor/autocomplete/ibiz-autocomplete/ibiz-autocomplete.tsx b/src/editor/autocomplete/ibiz-autocomplete/ibiz-autocomplete.tsx
index ec77c44af..e838f0482 100644
--- a/src/editor/autocomplete/ibiz-autocomplete/ibiz-autocomplete.tsx
+++ b/src/editor/autocomplete/ibiz-autocomplete/ibiz-autocomplete.tsx
@@ -192,6 +192,7 @@ export const IBizAutoComplete = defineComponent({
placement='bottom'
clearable={this.autoCompleteClearable}
popper-class={this.ns.e('transfer')}
+ teleported={false}
fetch-suggestions={this.onSearch}
onClear={this.onClear}
disabled={this.disabled || this.readonly}
diff --git a/src/editor/data-picker/ibiz-picker-embed-view/ibiz-picker-embed-view.tsx b/src/editor/data-picker/ibiz-picker-embed-view/ibiz-picker-embed-view.tsx
index af2c0bb15..1f08b7c4c 100644
--- a/src/editor/data-picker/ibiz-picker-embed-view/ibiz-picker-embed-view.tsx
+++ b/src/editor/data-picker/ibiz-picker-embed-view/ibiz-picker-embed-view.tsx
@@ -75,7 +75,7 @@ export const IBizPickerEmbedView = defineComponent({
const viewShell = resolveComponent('ViewShell');
return (
- {this.c.pickupView ? (
+ {this.c.model.pickupAppViewId ? (
[
{h(viewShell, {
diff --git a/src/editor/data-picker/ibiz-picker-select-view/ibiz-picker-select-view.tsx b/src/editor/data-picker/ibiz-picker-select-view/ibiz-picker-select-view.tsx
index a84fb2c6b..6e4f91900 100644
--- a/src/editor/data-picker/ibiz-picker-select-view/ibiz-picker-select-view.tsx
+++ b/src/editor/data-picker/ibiz-picker-select-view/ibiz-picker-select-view.tsx
@@ -305,7 +305,7 @@ export const IBizPickerSelectView = defineComponent({
name='clear'
>
),
- this.c.linkView && (
+ this.c.model.linkAppViewId && (
) : null,
- this.c.linkView ? (
+ this.c.model.linkAppViewId ? (
{{
@@ -242,13 +241,13 @@ export const IBizPicker = defineComponent({
return;
}
return [
- this.c.pickupView ? (
+ this.c.model.pickupAppViewId ? (
) : null,
- this.c.linkView ? (
+ this.c.model.linkAppViewId ? (
{
this.sort = this.getAcSort();
}
}
- await this.initPickupViewParams();
- await this.initLinkViewParams();
}
/**
@@ -231,6 +229,7 @@ export class PickerEditorController extends EditorController {
data: IData,
selectedData?: string,
): Promise {
+ await this.initPickupViewParams();
const { context, params } = this.handlePublicParams(
data,
this.context,
diff --git a/src/editor/list-box/ibiz-list-box/ibiz-list-box.scss b/src/editor/list-box/ibiz-list-box/ibiz-list-box.scss
index 050f0af53..7cef0d32d 100644
--- a/src/editor/list-box/ibiz-list-box/ibiz-list-box.scss
+++ b/src/editor/list-box/ibiz-list-box/ibiz-list-box.scss
@@ -1,4 +1,6 @@
@include b(list-box) {
+ height: 100%;
+ overflow: auto;
@include b(list-box-radio) {
@include flex(column, flex-start, flex-start);
}
diff --git a/src/editor/slider/ibiz-slider/ibiz-slider.tsx b/src/editor/slider/ibiz-slider/ibiz-slider.tsx
index 834a411d4..73432686c 100644
--- a/src/editor/slider/ibiz-slider/ibiz-slider.tsx
+++ b/src/editor/slider/ibiz-slider/ibiz-slider.tsx
@@ -18,9 +18,9 @@ export const IBizSlider = defineComponent({
// 步长
let step = 1;
// 设置滑动输入条允许的最大值
- let max = Infinity;
+ let max = 100;
// 设置滑动输入条允许的最小值
- let min = -Infinity;
+ let min = 0;
// 是否显示间断点
let showStops = false;
// 是否开启选择范围
@@ -54,7 +54,7 @@ export const IBizSlider = defineComponent({
() => props.value,
(newVal, oldVal) => {
if (newVal !== oldVal) {
- if (!newVal) {
+ if (newVal === null || newVal === undefined) {
// 如果是范围给数组
if (range) {
currentVal.value = [0, 1];
@@ -67,7 +67,7 @@ export const IBizSlider = defineComponent({
if (range) {
currentVal.value = JSON.parse(newVal as string);
} else {
- currentVal.value = newVal as number;
+ currentVal.value = Number(newVal) as number;
}
}
}
--
Gitee