{(isSelectedShow || (isOptional && isMust)) && selectedIcon()}
@@ -199,7 +249,7 @@ export const IBizGanttSetting = defineComponent({
): JSX.Element => {
const isOptional = type === 'optional';
const searchVal = isOptional ? optionalInput.value : selectedInput.value;
- const values: IColumnState[] = [];
+ let values: IColumnState[] = [];
listData.forEach(
item => item.caption?.includes(searchVal) && values.push(item),
);
@@ -210,25 +260,43 @@ export const IBizGanttSetting = defineComponent({
const caption = isOptional
? ibiz.i18n.t('component.ganttSetting.optionalAttribute')
: ibiz.i18n.t('component.ganttSetting.selectedAttribute');
-
+ const limitsizeLag = ibiz.i18n.t('component.ganttSetting.limitsize', {
+ max: props.limitsize + props.mustShowColumns.length,
+ });
return (
- {`${caption} · ${lengthNum}`}
+ {`${caption} · ${lengthNum} ${
+ !isOptional && props.limitsize > 0 ? `(${limitsizeLag})` : ''
+ }`}
{isOptional ? renderLeftSearch() : renderRightSearch()}
- {values.map((item: IColumnState) => {
- return renderListItem(item, type);
- })}
+
+ {{
+ item: ({ element: state }: { element: IColumnState }) => {
+ return renderListItem(state, type);
+ },
+ }}
+
);
};
+
return {
ns,
optionalInput,
diff --git a/src/common/grid-setting/grid-setting.tsx b/src/common/grid-setting/grid-setting.tsx
index b311c28aba14873f6dae91ffda54569579e4dc79..af10f77e70fc72f8987ed605f81fcc3676b05f1c 100644
--- a/src/common/grid-setting/grid-setting.tsx
+++ b/src/common/grid-setting/grid-setting.tsx
@@ -35,7 +35,11 @@ export const IBizGridSetting = defineComponent({
});
const isDraggable = computed(() => {
- return !!c.controlParams.enablecolumnsort;
+ let enablesort = ibiz.config.grid.enableColumnSort;
+ if (c.controlParams.enablecolumnsort) {
+ enablesort = Object.is(c.controlParams.enablecolumnsort, 'true');
+ }
+ return enablesort;
});
// 点击后控制显隐
diff --git a/src/control/form/form-detail/form-item/form-item.tsx b/src/control/form/form-detail/form-item/form-item.tsx
index 7e1ad2f8e3cdce7fc3767e1fcb3978ff7b68de47..6bf86be7aa13c4d98a100fdcd861c4835290b367 100644
--- a/src/control/form/form-detail/form-item/form-item.tsx
+++ b/src/control/form/form-detail/form-item/form-item.tsx
@@ -1,4 +1,4 @@
-import { defineComponent, h, PropType, resolveComponent } from 'vue';
+import { defineComponent, h, PropType, ref, resolveComponent } from 'vue';
import { useNamespace } from '@ibiz-template/vue3-util';
import './form-item.scss';
import { IDEFormItem } from '@ibiz/model-core';
@@ -27,7 +27,31 @@ export const FormItem = defineComponent({
props.controller.setDataValue(val, name);
};
- return { ns, c, onValueChange };
+ // 额外参数
+ const extraParams = ref({});
+
+ // 是否隐藏无值的单位
+ let emptyHiddenUnit = ibiz.config.form.emptyHiddenUnit;
+ const emptyhiddenunit =
+ props.controller.form?.controlParams?.emptyhiddenunit;
+
+ if (emptyhiddenunit) {
+ emptyHiddenUnit = Object.is(emptyhiddenunit, 'true');
+ }
+
+ // 编辑器参数优先级最高
+ const editorParams = props.controller.editor?.model?.editorParams || {};
+ const { EMPTYHIDDENUNIT } = editorParams;
+
+ if (EMPTYHIDDENUNIT) {
+ emptyHiddenUnit = Object.is(EMPTYHIDDENUNIT, 'true');
+ }
+
+ Object.assign(extraParams.value, {
+ emptyHiddenUnit,
+ });
+
+ return { ns, c, extraParams, onValueChange };
},
render() {
if (
@@ -47,6 +71,7 @@ export const FormItem = defineComponent({
disabled: this.controller.state.disabled,
readonly: this.controller.state.readonly,
onChange: this.onValueChange,
+ extraParams: this.extraParams,
controlParams: editMode
? { ...this.controller.form.controlParams, editmode: editMode }
: this.controller.form.controlParams,
@@ -80,6 +105,7 @@ export const FormItem = defineComponent({
this.ns.m(this.modelData.id),
...this.controller.containerClass,
]}
+ controller={this.controller.editor}
style={this.modelData.cssStyle}
required={this.c.state.required}
error={this.c.state.error}
diff --git a/src/control/gantt/gantt.tsx b/src/control/gantt/gantt.tsx
index d6abd0326d42b452fac9c1353417fa9ffedfcfad..f9f327027f6667ff42cb9ac68deac8834baa996e 100644
--- a/src/control/gantt/gantt.tsx
+++ b/src/control/gantt/gantt.tsx
@@ -350,12 +350,18 @@ export const GanttControl = defineComponent({
* 表格列设置点击
*/
const onSettingClick = async (): Promise
=> {
+ // 最大限制数(除去必须显示列之外的其他列),默认值为0,表示无限制
+ let limitsize = 0;
+ if (c.controlParams.limitsize) {
+ limitsize = Number(c.controlParams.limitsize);
+ }
const res: IModalData = await ibiz.overlay.modal(
(modal: IModal): VNode => {
const comp = resolveComponent('IBizGanttSetting') as string;
const options: IData = {
modal,
columnStates: c.state.columnStates,
+ limitsize,
};
if (c.state.mustShowColumns) {
options.mustShowColumns = c.state.mustShowColumns;
@@ -528,11 +534,24 @@ export const GanttControl = defineComponent({
const renderColumn = (model: IDETreeColumn, index: number): VNode => {
const { caption, codeName, width, headerSysCss, align } = model;
const columnC = c.columns[codeName!];
+ const columnState: IColumnState | undefined = c.state.columnStates.find(
+ (item: IColumnState) => {
+ return item.key === codeName;
+ },
+ );
+
+ let tempWidth = 30;
+ if (columnState && columnState.columnWidth) {
+ tempWidth = columnState.columnWidth > 30 ? columnState.columnWidth : 30;
+ } else if (width && width > 30) {
+ tempWidth = width;
+ }
+
return (
30 ? width : 30}
+ width={tempWidth}
center={align?.toLowerCase() === 'center'}
>
{{
@@ -728,6 +747,20 @@ export const GanttControl = defineComponent({
);
};
+ /**
+ * 左侧表格列宽度拖动
+ *
+ * @param {IData} column
+ * @param {number} width
+ */
+ const onHeaderDragend = (index: number, width: number) => {
+ const columnState = c.state.columnStates[index];
+ if (columnState) {
+ columnState.columnWidth = width;
+ c.saveColumnState();
+ }
+ };
+
return {
c,
ns,
@@ -750,6 +783,7 @@ export const GanttControl = defineComponent({
allowDrop,
allowDrag,
handleDrop,
+ onHeaderDragend,
};
},
render() {
@@ -785,6 +819,7 @@ export const GanttControl = defineComponent({
onRowClick={this.onNodeClick}
onRowDblClick={this.onNodeDbClick}
onRowChecked={this.onCheck}
+ onHeaderDragend={this.onHeaderDragend}
onMoveSlider={this.onSliderMove}
primaryColor={this.ganttStyle.primaryColor}
headerStyle={{
diff --git a/src/control/grid/grid-column/grid-field-column/grid-field-column.tsx b/src/control/grid/grid-column/grid-field-column/grid-field-column.tsx
index c084865b4a156679e08117741d1dccb8641c714e..bf5bdb0317baed5fea215f8572b31201b597c7df 100644
--- a/src/control/grid/grid-column/grid-field-column/grid-field-column.tsx
+++ b/src/control/grid/grid-column/grid-field-column/grid-field-column.tsx
@@ -25,6 +25,13 @@ export const GridFieldColumn = defineComponent({
},
setup(props) {
const ns = useNamespace('grid-field-column');
+ // 是否隐藏无值的单位
+ let emptyHiddenUnit = ibiz.config.grid.emptyHiddenUnit;
+ const { emptyhiddenunit } = props.controller.grid.controlParams;
+
+ if (emptyhiddenunit) {
+ emptyHiddenUnit = Object.is(emptyhiddenunit, 'true');
+ }
const zIndex = props.controller.grid.state.zIndex;
/**
@@ -94,6 +101,20 @@ export const GridFieldColumn = defineComponent({
return '';
});
+ // 无值隐藏单位
+ const hiddenEmpty = computed(() => {
+ if (fieldValue.value) {
+ if (emptyHiddenUnit) {
+ if (formatValue.value) {
+ return true;
+ }
+ return false;
+ }
+ return true;
+ }
+ return false;
+ });
+
/**
* 代码表值
* - 根据valueType计算当前列的代码表值,之后再传递给代码表翻译
@@ -184,6 +205,7 @@ export const GridFieldColumn = defineComponent({
tooltip,
zIndex,
codeListItems,
+ hiddenEmpty,
findLayoutPanel,
renderPanelItemLayout,
};
@@ -239,7 +261,7 @@ export const GridFieldColumn = defineComponent({
onClick={this.onTextClick}
>
{this.formatValue}
- {this.fieldValue != null && c.model.unitName}
+ {this.hiddenEmpty && c.model.unitName}
{this.percent && `(${this.percent})`}
);
diff --git a/src/control/grid/grid/grid-control.util.ts b/src/control/grid/grid/grid-control.util.ts
index 90c73903b818b48393a773dbf33c31e3f8bca01c..8d4ffb86af445399be7f89de4920e79aecc6a6d7 100644
--- a/src/control/grid/grid/grid-control.util.ts
+++ b/src/control/grid/grid/grid-control.util.ts
@@ -5,6 +5,7 @@ import {
ControlVO,
GridController,
GridRowState,
+ IColumnState,
IControlProvider,
IGridRowState,
Srfuf,
@@ -660,6 +661,16 @@ export function useAppGridBase(
});
c.hasAdaptiveColumn = index !== -1;
}
+
+ // 列宽持久化
+ const columnState = c.state.columnStates.find((item: IColumnState) => {
+ return item.key === property;
+ });
+
+ if (columnState) {
+ columnState.columnWidth = newWidth;
+ c.saveColumnStates();
+ }
};
return {
diff --git a/src/control/grid/grid/grid.tsx b/src/control/grid/grid/grid.tsx
index 9ac65a8e6190659a953aa0d04a15e9be4d564c9c..797c9f9a7489da68d3460228430132c458a02682 100644
--- a/src/control/grid/grid/grid.tsx
+++ b/src/control/grid/grid/grid.tsx
@@ -62,6 +62,8 @@ export function renderColumn(
index: number,
): VNode | null {
const { codeName: columnName, width } = model;
+
+ // 查缓存,有缓存用缓存,没缓存的用模型
const columnC = c.columns[columnName!];
const columnState = c.state.columnStates.find(
item => item.key === columnName,
@@ -73,12 +75,14 @@ export function renderColumn(
(!c.hasAdaptiveColumn && index === renderColumns.length - 1);
const widthName = widthFlexGrow ? 'min-width' : 'width';
+
+ const tempWidth = columnState?.columnWidth || width;
// 表格列自定义
return (
{
// 非实体节点行的第一列显示文本值
@@ -61,11 +68,18 @@ export const TreeGridExFieldColumn = defineComponent({
return codeListText.value;
}
+ let text = nodeColumnC.formatValue(fieldValue.value);
+ if (emptyHiddenUnit) {
+ if (text) {
+ text +=
+ nodeColumnC.unitName || nodeColumnC.nodeColumn?.unitName || '';
+ }
+ } else {
+ text +=
+ nodeColumnC.unitName || nodeColumnC.nodeColumn?.unitName || '';
+ }
// 格式化的值
- return (
- nodeColumnC.formatValue(fieldValue.value) +
- (nodeColumnC.unitName || '')
- );
+ return text;
}
return fieldValue.value;
});
diff --git a/src/editor/span/span-editor.controller.ts b/src/editor/span/span-editor.controller.ts
index b98fddc079dbc4117bc912193650d49f7fcd1921..b3cb6ddde3819295c4166a6ea3313451a055eec5 100644
--- a/src/editor/span/span-editor.controller.ts
+++ b/src/editor/span/span-editor.controller.ts
@@ -17,6 +17,14 @@ export class SpanEditorController extends CodeListEditorController {
*/
public valueItem = '';
+ /**
+ * 无值隐藏单位
+ *
+ * @type {boolean}
+ * @memberof SpanEditorController
+ */
+ public emptyHiddenUnit: boolean = true;
+
/**
* 代码表模型
* @return {*}
@@ -36,6 +44,9 @@ export class SpanEditorController extends CodeListEditorController {
const app = await ibiz.hub.getApp(this.context.srfappid);
this.codeList = app.codeList.getCodeList(this.model.appCodeListId);
}
+ if (this.extraParams) {
+ this.emptyHiddenUnit = this.extraParams.emptyHiddenUnit;
+ }
}
/**
diff --git a/src/editor/span/span/span.tsx b/src/editor/span/span/span.tsx
index 75711dda24ae681cf1975b7946d154d52fcfeacf..0bebda29b7ff8e6cee1d1f9891691a46af62baf1 100644
--- a/src/editor/span/span/span.tsx
+++ b/src/editor/span/span/span.tsx
@@ -121,7 +121,13 @@ export const IBizSpan = defineComponent({
text.value = `${newVal}`;
}
if (unitName) {
- text.value += unitName;
+ if (c.emptyHiddenUnit) {
+ if (text.value) {
+ text.value += unitName;
+ }
+ } else {
+ text.value += unitName;
+ }
}
}
},
diff --git a/src/editor/text-box/ibiz-input-number/ibiz-input-number.scss b/src/editor/text-box/ibiz-input-number/ibiz-input-number.scss
index 90f7484c28ab66e7aefcd94a165222dd1cb27aff..5f5c75421f7f7bf9c8e1b207de6834f53d163a62 100644
--- a/src/editor/text-box/ibiz-input-number/ibiz-input-number.scss
+++ b/src/editor/text-box/ibiz-input-number/ibiz-input-number.scss
@@ -65,6 +65,11 @@
@include when(show-default){
// 悬浮显示编辑器
&:hover{
+
+ @include e('unit'){
+ display: block;
+ }
+
@include b(input-number-form-default-content){
display: none;
}
@@ -76,8 +81,10 @@
top: getCssVar('spacing', 'super-tight');
}
}
+
}
+
// 不悬浮时显示信息态
@include b(input-number-form-default-content){
display: flex;
@@ -92,9 +99,18 @@
@include b(input-number-input){
display: none;
}
+
+ .#{bem('input-number','unit')}{
+ display: none;
+ }
+
// 输入态
@include when(editable){
+ .#{bem('input-number','unit')}{
+ display: block;
+ }
+
@include b(input-number-form-default-content){
display: none;
}
diff --git a/src/editor/text-box/ibiz-input-number/ibiz-input-number.tsx b/src/editor/text-box/ibiz-input-number/ibiz-input-number.tsx
index ad6ca1edc59ecbf6ecf40bf452821adf53e9db08..17f4057144bdfefa16f671a291f29509a601c091 100644
--- a/src/editor/text-box/ibiz-input-number/ibiz-input-number.tsx
+++ b/src/editor/text-box/ibiz-input-number/ibiz-input-number.tsx
@@ -205,8 +205,14 @@ export const IBizInputNumber = defineComponent({
// 只读显示
content = isNilOrEmpty(this.currentVal) ? '' : `${this.currentFormatVal}`;
// 当有值且单位存在时才显示单位
- if (content && unitName) {
- content += unitName;
+ if (unitName) {
+ if (this.c.emptyHiddenUnit) {
+ if (content) {
+ content += unitName;
+ }
+ } else {
+ content += unitName;
+ }
}
} else {
// 编辑态显示
@@ -249,11 +255,25 @@ export const IBizInputNumber = defineComponent({
}
// 表单默认内容
- const formDefaultContent = (
-
- {this.currentVal || this.currentVal === 0 ? this.currentFormatVal : '-'}
-
- );
+ const formDefaultContent = () => {
+ let unit = '';
+ if (unitName) {
+ if (this.c.emptyHiddenUnit) {
+ if (this.currentFormatVal) {
+ unit = unitName;
+ }
+ } else {
+ unit = unitName;
+ }
+ }
+ return (
+
+ {this.currentVal || this.currentVal === 0
+ ? this.currentFormatVal + unit
+ : '-'}
+
+ );
+ };
return (
- {this.showFormDefaultContent && formDefaultContent}
+ {this.showFormDefaultContent && formDefaultContent()}
{content}
);
diff --git a/src/editor/text-box/input/input.tsx b/src/editor/text-box/input/input.tsx
index 0c37bbda71f18415a8aacf7eb485198cab36afc5..19fa7c8f0e0eb020788f501677cea8c0110c04fb 100644
--- a/src/editor/text-box/input/input.tsx
+++ b/src/editor/text-box/input/input.tsx
@@ -101,10 +101,22 @@ export const IBizInput = defineComponent({
// 当前格式化文本值
const currentFormatVal = computed(() => {
+ let text = '';
+ const { unitName } = props.controller.parent;
if (currentVal.value) {
- return props.controller.formatValue(currentVal.value);
+ text = props.controller.formatValue(currentVal.value);
}
- return '';
+
+ if (unitName) {
+ if (c.emptyHiddenUnit) {
+ if (text) {
+ text += unitName;
+ }
+ } else {
+ text += unitName;
+ }
+ }
+ return text;
});
const onEmit = (
@@ -299,8 +311,14 @@ export const IBizInput = defineComponent({
// 只读显示
let text = `${props.controller.formatValue(currentVal.value)}`;
// 当有值且单位存在时才显示单位
- if (text && unitName) {
- text += unitName;
+ if (unitName) {
+ if (c.emptyHiddenUnit) {
+ if (text) {
+ text += unitName;
+ }
+ } else {
+ text += unitName;
+ }
}
return text;
});
@@ -388,7 +406,15 @@ export const IBizInput = defineComponent({
const slots: IData = {};
if (unitName) {
slots.suffix = () => {
- return {unitName};
+ let unitText = '';
+ if (this.c.emptyHiddenUnit) {
+ if (this.currentVal) {
+ unitText = unitName;
+ }
+ } else {
+ unitText = unitName;
+ }
+ return {unitText};
};
}
if (predefinedType === 'AUTH_USERID') {
diff --git a/src/editor/text-box/text-box-editor.controller.ts b/src/editor/text-box/text-box-editor.controller.ts
index 99d1660f7def05c09e756d6ee15d84bedaaf38fb..7ad655f6678ea08ab5de9d3c957f7698efc49084 100644
--- a/src/editor/text-box/text-box-editor.controller.ts
+++ b/src/editor/text-box/text-box-editor.controller.ts
@@ -101,6 +101,14 @@ export class TextBoxEditorController extends CodeListEditorController
*/
public codeList: IAppCodeList | undefined = undefined;
+ /**
+ * 无值隐藏单位
+ *
+ * @type {boolean}
+ * @memberof TextBoxEditorController
+ */
+ public emptyHiddenUnit: boolean = true;
+
protected async onInit(): Promise {
await super.onInit();
this.precision = this.editorParams.precision
@@ -164,5 +172,8 @@ export class TextBoxEditorController extends CodeListEditorController
const app = await ibiz.hub.getApp(this.context.srfappid);
this.codeList = app.codeList.getCodeList(this.model.appCodeListId);
}
+ if (this.extraParams) {
+ this.emptyHiddenUnit = this.extraParams.emptyHiddenUnit;
+ }
}
}
diff --git a/src/locale/en/index.ts b/src/locale/en/index.ts
index d7d477c849b597af386c1e4d33699c064946de20..6882b16669323937a01792b0087003abfaa4109d 100644
--- a/src/locale/en/index.ts
+++ b/src/locale/en/index.ts
@@ -543,6 +543,7 @@ export default {
headerCaption: 'Header display attributes',
optionalAttribute: 'Optional attributes',
selectedAttribute: 'Selected attributes',
+ limitsize: 'Maximum limit {max}',
},
actionToolbar: {
more: 'More',
diff --git a/src/locale/zh-CN/index.ts b/src/locale/zh-CN/index.ts
index abe60b637d5957fad8884520ad05d0bb125824e1..b186268e8b1c6cd96053acb4c65346eb8f36e522 100644
--- a/src/locale/zh-CN/index.ts
+++ b/src/locale/zh-CN/index.ts
@@ -505,6 +505,7 @@ export default {
headerCaption: '表头显示属性',
optionalAttribute: '可选择属性',
selectedAttribute: '已选择属性',
+ limitsize: '上限{max}个',
},
actionToolbar: {
more: '更多',
diff --git a/src/util/fullscreen/fullscreen-util.ts b/src/util/fullscreen/fullscreen-util.ts
index 564d5bd89fab5e8920701cb33e807816ee326db8..4969f6dcb8d65853217ad77e71fd5d18d8923b27 100644
--- a/src/util/fullscreen/fullscreen-util.ts
+++ b/src/util/fullscreen/fullscreen-util.ts
@@ -52,7 +52,7 @@ export class FullscreenUtil {
if (this.FullscreenClass) {
div.classList.toggle(this.FullscreenClass);
}
- div.style.background = `var(--${defaultNamespace}-bg-1)`;
+ div.style.background = `var(--${defaultNamespace}-color-bg-1)`;
const content = document.createElement('div');
content.id = 'fullscreen';
content.style.position = 'absolute';