diff --git a/io.sc.platform.core.frontend/src/platform/components/form/FormField.ts b/io.sc.platform.core.frontend/src/platform/components/form/FormField.ts
index 8b563392..303c4456 100644
--- a/io.sc.platform.core.frontend/src/platform/components/form/FormField.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/form/FormField.ts
@@ -105,7 +105,11 @@ export const getDefaultValue = (field) => {
} else if (field.type === 'w-checkbox-group') {
return [];
} else if (
- (field.type === 'w-select' || field.type === 'w-user-select' || field.type === 'w-org-select' || field.type === 'w-grid-select') &&
+ (field.type === 'w-select' ||
+ field.type === 'w-user-select' ||
+ field.type === 'w-org-select' ||
+ field.type === 'w-grid-select' ||
+ field.type === 'w-role-select') &&
field.multiple
) {
return [];
diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/Header.vue b/io.sc.platform.core.frontend/src/platform/components/grid/Header.vue
index 3cb937ae..86e68053 100644
--- a/io.sc.platform.core.frontend/src/platform/components/grid/Header.vue
+++ b/io.sc.platform.core.frontend/src/platform/components/grid/Header.vue
@@ -26,7 +26,7 @@
:class="thClassHandle(c)"
:props="tools.titleFM.multiTitleThPropsHandle(c, props.scope)"
style="font-weight: bold"
- :title="c.title"
+ :title="c.label"
>
@@ -56,7 +56,7 @@
:style="col.style + (col.name === '_sortNo_' ? 'padding: 0; min-width: 50px;width: 50px;max-width:50px' : '')"
:class="thClassHandle(col)"
style="font-weight: bold"
- :title="col.title"
+ :title="col.label"
>
diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/Top.vue b/io.sc.platform.core.frontend/src/platform/components/grid/Top.vue
index b507b0cc..ff764f2b 100644
--- a/io.sc.platform.core.frontend/src/platform/components/grid/Top.vue
+++ b/io.sc.platform.core.frontend/src/platform/components/grid/Top.vue
@@ -25,7 +25,7 @@
-
+
@@ -35,9 +35,9 @@
diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/extra/group/GroupTr.vue b/io.sc.platform.core.frontend/src/platform/components/grid/extra/group/GroupTr.vue
index 5222fe71..ea9e5fd4 100644
--- a/io.sc.platform.core.frontend/src/platform/components/grid/extra/group/GroupTr.vue
+++ b/io.sc.platform.core.frontend/src/platform/components/grid/extra/group/GroupTr.vue
@@ -1,7 +1,7 @@
-
+
{
- this.tools?.reqApiFM.fetchData({ pagination: this.table.store.pagination });
this.table.store.headerTicked = false;
+ this.tools?.opFM.resetStripeStyle();
});
}
diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/Criteria.ts b/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/Criteria.ts
index 7d94b099..e8046200 100644
--- a/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/Criteria.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/Criteria.ts
@@ -80,14 +80,17 @@ export class Criteria extends Base {
*/
buildURLSearchParams(reqParams) {
const urlSearchParams = new URLSearchParams(reqParams);
+ reqParams['criteria'] = [];
// 处理默认查询条件
if (Object.keys(this.table.queryCriteria).length > 0) {
urlSearchParams.append('criteria', JSON.stringify(this.table.queryCriteria));
+ reqParams['criteria'].push(this.table.queryCriteria);
}
if (this.table.advancedQueryStatus) {
const conditions = this.advancedQueryConditions();
if (conditions && conditions.criteria.length > 0) {
urlSearchParams.append('criteria', JSON.stringify(conditions));
+ reqParams['criteria'].push(conditions);
}
} else {
const queryForm = this.table.componentRef.getTopRef()?.getQueryForm();
@@ -106,6 +109,7 @@ export class Criteria extends Base {
// 根据数据进行operator处理
const criteria = this.buildCriteria(queryFormData[item], item);
urlSearchParams.append('criteria', JSON.stringify(criteria));
+ reqParams['criteria'].push(criteria);
}
}
});
diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/DragAndDrop.ts b/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/DragAndDrop.ts
index c7de8e41..6b352d95 100644
--- a/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/DragAndDrop.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/DragAndDrop.ts
@@ -1,5 +1,5 @@
import { Tools } from '@/platform';
-import { toRaw, Ref, ref } from 'vue';
+import { toRaw, Ref, ref, nextTick } from 'vue';
import { Constant, GridTools, PropsType, TableType } from '../index';
import { Base } from '../Base';
@@ -241,6 +241,9 @@ export class DragAndDrop extends Base {
}
this.tools?.em.afterDragAndDrop(this.updateOrderData);
+ nextTick(() => {
+ this.tools?.opFM.resetStripeStyle();
+ });
}
private updateDataResetOrder(waitHandleData: any) {
diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/Operator.ts b/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/Operator.ts
index a581e12d..55fae7e0 100644
--- a/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/Operator.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/Operator.ts
@@ -98,6 +98,76 @@ export class Operator extends Base {
}
}
+ /**
+ * 设置斑马纹样式
+ * @param trArr
+ */
+ private setStripeStyle(trArr: any) {
+ if (trArr.length > 0) {
+ for (let i = 0; i < trArr.length; i++) {
+ if (i % 2 !== 0) {
+ trArr[i].style['background-color'] = typeof this.props.stripe === 'boolean' ? '#fafafa' : this.props.stripe;
+ } else {
+ trArr[i].style['background-color'] = '';
+ }
+ }
+ }
+ }
+
+ private getTbodyDom() {
+ const tableElement = this.instance.getHtmlElement();
+ const tableDom = tableElement.getElementsByTagName('table')[0];
+ const tbodyDom = tableDom.getElementsByTagName('tbody')[0];
+ return tbodyDom;
+ }
+
+ private getStripeTrArr() {
+ const tbodyDom = this.getTbodyDom();
+ const result = [];
+ for (let i = 0; i < tbodyDom.children.length; i++) {
+ if (!tbodyDom.children[i].classList.contains('groupTr')) {
+ result.push(tbodyDom.children[i]);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * 重新设置斑马纹样式(用于拖拽排序后等场景导致的斑马纹样式错乱)
+ */
+ resetStripeStyle() {
+ if (!Tools.isEmpty(this.props.stripe) && this.props.stripe !== false) {
+ this.setStripeStyle(this.getStripeTrArr());
+ }
+ }
+
+ /**
+ * 设置斑马纹
+ */
+ setStripe() {
+ if (!Tools.isEmpty(this.props.stripe) && this.props.stripe !== false) {
+ const trArr = this.getStripeTrArr();
+ // 初始化时设置一遍样式
+ this.setStripeStyle(trArr);
+ let previousRowCount = trArr.length;
+ // 创建观察者
+ const observer = new MutationObserver((mutations) => {
+ const currentTrArr = this.getStripeTrArr();
+ const currentRowCount = currentTrArr.length;
+ if (currentRowCount !== previousRowCount) {
+ previousRowCount = currentRowCount;
+ this.setStripeStyle(currentTrArr);
+ }
+ });
+ // 启动监听
+ const tbodyDom = this.getTbodyDom();
+ observer.observe(tbodyDom, {
+ childList: true, // 监视子节点增删
+ subtree: false, // 若tr嵌套在更深层级需启用
+ });
+ }
+ }
+
/**
* 表格大小变化触发函数
* @returns
diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/RequestApi.ts b/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/RequestApi.ts
index 5560379c..fb7c3907 100644
--- a/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/RequestApi.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/RequestApi.ts
@@ -234,11 +234,24 @@ export class RequestApi extends Base {
operator: Constant.CRITERIA_OPERATOR.isNull,
};
urlSearchParams.append('criteria', JSON.stringify(criteria));
+ reqParams['criteria'].push(criteria);
+ }
+
+ let resp: any = undefined;
+ if (this.props.customFetch && urlSearchParams) {
+ // 用户自定义加载函数
+ try {
+ resp = await this.props.customFetch(urlSearchParams, reqParams);
+ } catch (error) {
+ console.error('[w-grid]custom fetch data error:', error);
+ this.table.store.loading = false;
+ }
+ } else {
+ resp = await axios.get(url, { params: urlSearchParams }).catch((error) => {
+ console.error('[w-grid]fetch data error:', error);
+ this.table.store.loading = false;
+ });
}
- const resp = await axios.get(url, { params: urlSearchParams }).catch((error) => {
- console.error('[w-grid]fetch data error:', error);
- this.table.store.loading = false;
- });
return resp;
}
diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/RowData.ts b/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/RowData.ts
index ab2e34bb..158f7828 100644
--- a/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/RowData.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/grid/ts/function/RowData.ts
@@ -9,6 +9,7 @@ import { Constant, GridTools, PropsType, TableType } from '../index';
*/
export class RowData extends Base {
private aloneGroupRowIndex: number = 0;
+ private rowIndex: number = 0;
constructor(props: PropsType, table: TableType) {
super(props, table);
@@ -137,6 +138,7 @@ export class RowData extends Base {
this.table.configStore.aloneGroupRecords = [];
// 重置分组行下标
this.aloneGroupRowIndex = 0;
+ this.rowIndex = 0;
if (this.props.groupMode === Constant.GROUP_MODE.MERGE && !this.props.tree) {
// 如果存在需要合并的字段,并且不是树表格,重新对数据进行排序
this.table.store.mergeGroupRecords = {};
@@ -392,6 +394,7 @@ export class RowData extends Base {
rowData[this.props.selectedField] = this.getInitRowSelected(rowData);
rowData[Constant.FIELD_NAMES.ROW_OLD_VALUE] = {};
rowData[Constant.FIELD_NAMES.SELECTABLE] = this.getInitSelectable(rowData);
+ rowData[Constant.FIELD_NAMES.ROW_INDEX] = this.rowIndex;
if (this.props.tree) {
rowData[Constant.FIELD_NAMES.TREE_TICKABLE] = this.getInitTreeTickable(rowData);
}
@@ -406,6 +409,7 @@ export class RowData extends Base {
rowData[Constant.FIELD_NAMES.LAZYLOAD_NO_CHILDREN] = true;
}
}
+ this.rowIndex += 1;
}
/**
diff --git a/io.sc.platform.core.frontend/src/platform/components/grid/ts/types/PropsType.ts b/io.sc.platform.core.frontend/src/platform/components/grid/ts/types/PropsType.ts
index 9556335f..4bda03f2 100644
--- a/io.sc.platform.core.frontend/src/platform/components/grid/ts/types/PropsType.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/grid/ts/types/PropsType.ts
@@ -55,6 +55,10 @@ export type PropsType = {
* 删除数据url
*/
removeDataUrl: string,
+ /**
+ * 自定义获取数据函数,若表格内置的查询参数或方式(GET、POST)等不满足使用场景,可使用该函数自定义进行查询,只需返回的结果结构与内置查询一致即可。
+ */
+ customFetch: Function | undefined,
/**
* 表格整体紧凑模式
*/
@@ -83,6 +87,10 @@ export type PropsType = {
* 从左侧开始冻结列数,复选框与排序列不计算在内,支持1-10列。
*/
stickyNum: number,
+ /**
+ * 斑马纹,当传入布尔值时斑马纹颜色默认,当传入字符串颜色时使用传入的颜色,支持rgb颜色。
+ */
+ stripe: boolean | string,
/**
* checkbox选择模式,默认启用
*/
diff --git a/io.sc.platform.core.frontend/src/platform/components/html/WHtmlA.vue b/io.sc.platform.core.frontend/src/platform/components/html/WHtmlA.vue
index 27be06c3..e38c2004 100644
--- a/io.sc.platform.core.frontend/src/platform/components/html/WHtmlA.vue
+++ b/io.sc.platform.core.frontend/src/platform/components/html/WHtmlA.vue
@@ -1,5 +1,5 @@
- {{ label }}
+ {{ label }}
diff --git a/io.sc.platform.core.frontend/src/platform/components/index.ts b/io.sc.platform.core.frontend/src/platform/components/index.ts
index 9dcbdbc0..5581ee9a 100644
--- a/io.sc.platform.core.frontend/src/platform/components/index.ts
+++ b/io.sc.platform.core.frontend/src/platform/components/index.ts
@@ -22,6 +22,7 @@ import WInputSelect from './select/WInputSelect.vue';
import WGridSelect from './select/WGridSelect.vue';
import WUserSelect from './select/WUserSelect.vue';
import WOrgSelect from './select/WOrgSelect.vue';
+import WRoleSelect from './select/WRoleSelect.vue';
import WDate from './date/WDate.vue';
import WDateRange from './date/WDateRange.vue';
import WCheckbox from './checkbox/WCheckbox.vue';
@@ -87,6 +88,7 @@ export default {
app.component('WGridSelect', WGridSelect);
app.component('WUserSelect', WUserSelect);
app.component('WOrgSelect', WOrgSelect);
+ app.component('WRoleSelect', WRoleSelect);
app.component('WDate', WDate);
app.component('WDateRange', WDateRange);
app.component('WCheckbox', WCheckbox);
@@ -148,6 +150,7 @@ export {
WGridSelect,
WUserSelect,
WOrgSelect,
+ WRoleSelect,
WLabel,
WDate,
WCheckbox,
diff --git a/io.sc.platform.core.frontend/src/platform/components/select/WGridSelect.vue b/io.sc.platform.core.frontend/src/platform/components/select/WGridSelect.vue
index d4029405..724f258d 100644
--- a/io.sc.platform.core.frontend/src/platform/components/select/WGridSelect.vue
+++ b/io.sc.platform.core.frontend/src/platform/components/select/WGridSelect.vue
@@ -313,7 +313,7 @@ const rowClick = (args) => {
watch(
() => modelValue.value,
async (newVal, oldVal) => {
- if (Tools.isEmpty(newVal)) {
+ if (Tools.isEmpty(newVal) || (Array.isArray(modelValue.value) && modelValue.value.length === 0)) {
fieldMethodsClass.clearObjectValue();
} else if (newVal !== oldVal && needFetchData.value) {
await fetchData(newVal);
diff --git a/io.sc.platform.core.frontend/src/platform/components/select/WOrgSelect.vue b/io.sc.platform.core.frontend/src/platform/components/select/WOrgSelect.vue
index 1294590b..98007354 100644
--- a/io.sc.platform.core.frontend/src/platform/components/select/WOrgSelect.vue
+++ b/io.sc.platform.core.frontend/src/platform/components/select/WOrgSelect.vue
@@ -34,8 +34,10 @@
:dense="true"
:tree="true"
:fetch-data-url="orgGridFetchDataUrl"
+ :tree-default-expand-all="props.defaultExpandAll"
:config-button="false"
:toolbar-actions="['expand']"
+ :query-criteria="props.queryCriteria"
:columns="[
{ name: 'name', label: $t('name'), sortable: false },
{ name: 'code', label: $t('code'), width: 100, sortable: false },
@@ -82,6 +84,8 @@ interface FieldProps extends FormFieldProps {
counter?: boolean;
valueUseId?: boolean;
displayValue?: string | ((args: object) => '');
+ defaultExpandAll?: boolean;
+ queryCriteria?: object;
}
const props = withDefaults(defineProps(), {
showIf: true,
@@ -103,6 +107,11 @@ const props = withDefaults(defineProps(), {
* }
*/
displayValue: 'name',
+ /**
+ * 机构树默认展开所有节点
+ */
+ defaultExpandAll: true,
+ queryCriteria: undefined,
});
class FieldMethods extends FormFieldMethods {
updateValue = (value_) => {
@@ -218,7 +227,7 @@ watch(
if (newVal !== oldVal) {
fieldMethodsClass.updateValue(newVal);
}
- if (Tools.isEmpty(newVal)) {
+ if (Tools.isEmpty(newVal) || (Array.isArray(modelValue.value) && modelValue.value.length === 0)) {
fieldMethodsClass.clearObjectValue();
} else if (newVal !== oldVal) {
if (modelObjectValue.value.length > 0) {
diff --git a/io.sc.platform.core.frontend/src/platform/components/select/WRoleSelect.vue b/io.sc.platform.core.frontend/src/platform/components/select/WRoleSelect.vue
new file mode 100644
index 00000000..ce7a5939
--- /dev/null
+++ b/io.sc.platform.core.frontend/src/platform/components/select/WRoleSelect.vue
@@ -0,0 +1,295 @@
+
+
+
{
+ textSelectRef?.blur();
+ }
+ "
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ modelValue?.length }}
+
+
+
+
+
+
diff --git a/io.sc.platform.core.frontend/src/platform/components/toolbar/Buttons.vue b/io.sc.platform.core.frontend/src/platform/components/toolbar/Buttons.vue
index 6063854d..57a4d677 100644
--- a/io.sc.platform.core.frontend/src/platform/components/toolbar/Buttons.vue
+++ b/io.sc.platform.core.frontend/src/platform/components/toolbar/Buttons.vue
@@ -16,6 +16,7 @@
outline
no-wrap
no-caps
+ color="primary"
v-bind="btn.data[0]"
:label="toolbar.props.dense ? '' : toolbar.getLabel(btn.data[0].label)"
:icon="toolbar.props.dense ? undefined : toolbar.getIcon(btn.data[0].icon)"
@@ -31,7 +32,7 @@
{{ toolbar.getLabel(btn.data[0].label) }}
-
+
@@ -64,6 +65,7 @@
no-wrap
no-caps
outline
+ color="primary"
v-bind="btn.data"
align="center"
:icon="toolbar.props.dense ? undefined : toolbar.getIcon(btn.data.icon)"
@@ -86,6 +88,7 @@
label=""
no-wrap
no-caps
+ color="primary"
:icon="undefined"
:dense="toolbar.props.dense"
class="class-more-action"
@@ -96,7 +99,7 @@
{{ $t('more') }}
-
+
diff --git a/io.sc.platform.core.frontend/src/platform/components/toolbar/ChildrenBtn.vue b/io.sc.platform.core.frontend/src/platform/components/toolbar/ChildrenBtn.vue
index 7b038453..d3559aae 100644
--- a/io.sc.platform.core.frontend/src/platform/components/toolbar/ChildrenBtn.vue
+++ b/io.sc.platform.core.frontend/src/platform/components/toolbar/ChildrenBtn.vue
@@ -6,11 +6,12 @@
>
-
+
+
-
-
+