You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
7.4 KiB

6 months ago
<!-- @format -->
<template>
<div :key="'table_' + $route.name">
<page-title :title="getTitle" v-if="showTitle" />
<ns-table ref="nsTableRef" v-bind="getBindValue">
<template #[item]="data" v-for="item in Object.keys($slots)" :key="item">
<slot :name="item" v-bind="data"> </slot>
</template>
</ns-table>
</div>
</template>
<script lang="ts">
import { computed, defineComponent, unref, ref } from 'vue';
import { tableProps } from '/nerv-lib/component/table/props';
import { PropTypes } from '/nerv-lib/util/type';
import { cloneDeep, isArray, isUndefined } from 'lodash-es';
import { useRoute } from 'vue-router';
export default defineComponent({
name: 'NsViewListTable',
props: {
...tableProps,
title: PropTypes.string,
tableTitle: PropTypes.func,
showTitle: {
type: Boolean,
default: true,
},
},
setup(props, { attrs }) {
const nsTableRef = ref();
const route = useRoute();
const formatFilterSearch = (key, filter) => {
let selector = filter.filter((item) => {
return item.name.startsWith(key);
});
let selectorValue = selector.map((item) => {
item.name = item.name.replace(key, '');
console.log('item.value', item.value);
if (item.name) return `${item.name}=${item.value.join('|')}`;
return `${item.value.join('|')}`;
});
return selectorValue.join(',');
};
const getFormConfig = computed(() => {
const formConfig = cloneDeep(props.formConfig);
if (formConfig) {
if (isUndefined(formConfig.showAction)) {
formConfig.showAction = false;
}
if (!isArray(formConfig.schemas)) {
formConfig.schemas = [];
}
formConfig['formLayout'] = 'flex';
//过滤标签搜索组件
if (formConfig.keyFilter === true) {
formConfig.schemas.push(
{
field: 'selector',
component: 'NsInputText',
show: false,
},
{
field: 'labels',
component: 'NsInputText',
show: false,
},
{
field: 'search',
component: 'NsInputText',
show: false,
},
);
formConfig.schemas.push({
field: 'filter',
label: '关键字',
component: 'NsInputFilter',
rules: [],
componentProps: {
maxlength: 50,
allowClear: true,
api: formConfig.api,
terraceType:
typeof formConfig.terraceType != 'undefined'
? formConfig.terraceType
: 'dataSource',
isNeedHttpGet:
typeof formConfig.isNeedHttpGet != 'undefined' ? formConfig.isNeedHttpGet : true,
filterList: formConfig.filterList ? formConfig.filterList : [],
type: typeof formConfig.type != 'undefined' ? formConfig.type : '',
defaultFilterList:
typeof formConfig.defaultFilterList != 'undefined'
? formConfig.defaultFilterList
: false,
onSearch: () => {
let filter = unref(nsTableRef)?.formElRef.model.filter;
if (!filter) {
let list = ['selector', 'labels', 'search'];
list.map((elem) => {
unref(nsTableRef).formElRef.setFormModel(elem, null);
});
unref(nsTableRef)?.formElRef?.triggerSubmit();
return;
}
filter = JSON.parse(decodeURIComponent(filter));
let selectorValue = formatFilterSearch('selector=', filter);
let labelValue = formatFilterSearch('labels=', filter);
let searchValue = formatFilterSearch('search=', filter);
unref(nsTableRef).formElRef.model.selector = selectorValue || null;
unref(nsTableRef).formElRef.model.labels = labelValue || null;
unref(nsTableRef).formElRef.model.search = searchValue || null;
unref(nsTableRef).formElRef.model.filter = null;
console.log('www',unref(nsTableRef))
unref(nsTableRef)?.formElRef?.triggerSubmit();
},
onChange: (text) => {},
placeholder: '请输入关键字',
},
});
} else if (formConfig.keySearch !== false) {
formConfig.schemas.push({
field: 'search',
label: '关键字',
component: 'NsInputSearch',
rules: [
{
message: '请输入关键字',
trigger: 'change',
},
],
componentProps: {
maxlength: 50,
onSearch: () => {
unref(nsTableRef)?.formElRef?.triggerSubmit();
},
onKeydown: (event: KeyboardEvent) => {
//fix 单个input回车会提交表单 造成重复提交
if (event.key === 'Enter' || event.code === 'Enter') {
event.preventDefault();
}
},
placeholder: '请输入关键字',
},
});
}
}
return formConfig;
});
const getBindValue = computed(() => ({
// scroll: { x: 1000 },
...attrs,
...props,
enableTableSession: true,
formLayout: 'flex',
title: null,
formConfig: getFormConfig.value,
}));
const getTitle = computed(() => {
const {
params: { pageTitle },
} = route;
if (pageTitle) return pageTitle;
const { title } = props;
if (title) return title;
});
return { getBindValue, nsTableRef, getTitle };
},
methods: {
onBack() {
this.$router.go(-1);
},
},
});
</script>
<style lang="less" scoped>
:deep(.ns-form-item) {
min-width: 220px !important;
}
:deep(.ns-operate-expand) {
display: inline-block;
padding: 4px 2px !important;
border: unset !important;
}
:deep(.ns-table) {
position: relative;
.ns-table-main {
padding: 0 24px;
}
.ns-table-search {
padding: 18px 24px 0 24px;
}
//tableList组件
.ns-table-header {
width: auto;
min-width: 100px;
user-select: none;
margin-bottom: 12px;
margin-top: 18px;
text-align: left;
position: absolute !important;
left: 0;
top: -80px;
.ant-btn {
margin-left: 0;
margin-right: 6px;
}
}
.ns-form-item label {
display: none;
}
&.ns-table-no-search {
.ns-table-search {
display: none;
}
.ns-table-header {
position: relative !important;
top: 0;
}
}
}
:deep(.ns-line) {
display: none;
}
:deep(
.ant-table-thead
> tr
> th:not(:last-child):not(.ant-table-selection-column):not(
.ant-table-row-expand-icon-cell
):not([colspan])::before
) {
display: none;
}
</style>