|
|
@ -6,52 +6,82 @@ |
|
|
|
<span :style="`width:${27 * props.level}px;`"></span> |
|
|
|
<!--展开按钮--> |
|
|
|
<q-btn |
|
|
|
v-if="data.children && data.children.length > 0" |
|
|
|
v-if="props_.row.children && props_.row.children.length > 0" |
|
|
|
flat |
|
|
|
size="16px" |
|
|
|
dense |
|
|
|
padding="0px 0px" |
|
|
|
:icon="data.expand ? 'bi-dash' : 'bi-plus'" |
|
|
|
@click="data.expand = !data.expand" |
|
|
|
:icon="props_.row.expand ? 'bi-dash' : 'bi-plus'" |
|
|
|
@click="props_.row.expand = !props_.row.expand" |
|
|
|
/> |
|
|
|
<!--展开按钮占位符--> |
|
|
|
<span v-else style="width: 27px"></span> |
|
|
|
<!--选择框--> |
|
|
|
<q-checkbox v-model="data.selected" flat size="40px" dense /> |
|
|
|
<q-checkbox v-model="props_.row.selected" flat size="40px" dense /> |
|
|
|
<!--文件夹图标--> |
|
|
|
<q-icon v-if="data.children && data.children.length > 0" :name="data.expand ? 'folder_open' : 'folder'" color="amber" size="20px" class="px-1"></q-icon> |
|
|
|
<q-icon v-if="props_.row.children && props_.row.children.length > 0" :name="'folder'" color="amber" size="20px" class="px-1"></q-icon> |
|
|
|
<!--文件图标--> |
|
|
|
<q-icon v-else name="bi-file-earmark" size="16px" class="px-1"></q-icon> |
|
|
|
<q-icon v-else name="note" size="20px" class="px-1"></q-icon> |
|
|
|
</div> |
|
|
|
</q-td> |
|
|
|
<q-td v-for="col in cols" :key="col.name" :style="{ 'padding-left': '7px' }"> |
|
|
|
<q-td v-for="(col, index) in props_.cols" :key="col.name" :style="{ 'padding-left': '7px' }"> |
|
|
|
<div class="flex flex-nowrap items-center"> |
|
|
|
<div v-dompurify-html="col.format ? col.format(data[col.name], data) : col.value"></div> |
|
|
|
<template v-if="col.name === '_sortNo_'"> |
|
|
|
{{ index + 1 }} |
|
|
|
</template> |
|
|
|
<template v-else-if="col.value && typeof col.value === 'object' && col.value.componentType"> |
|
|
|
<component :is="col.value.componentType" v-bind="col.value.attrs"></component> |
|
|
|
</template> |
|
|
|
<template v-else> |
|
|
|
{{ col.value }} |
|
|
|
</template> |
|
|
|
</div> |
|
|
|
</q-td> |
|
|
|
</q-tr> |
|
|
|
<template v-for="child in data.children" :key="child.id"> |
|
|
|
<TreeGridRow v-if="data.expand" :cols="cols" :data="child" :level="props.level + 1"></TreeGridRow> |
|
|
|
<template v-for="child in props_.row.children" :key="child.id"> |
|
|
|
<TreeGridRow v-if="props_.row.expand" :props="propsHandler(child)" :columns-map="columnsMap" :level="props.level + 1"></TreeGridRow> |
|
|
|
</template> |
|
|
|
</template> |
|
|
|
<script setup lang="ts"> |
|
|
|
const props = defineProps({ |
|
|
|
level: { type: Number, default: 0 }, |
|
|
|
cols: { |
|
|
|
type: Array, |
|
|
|
props: { |
|
|
|
type: Object, |
|
|
|
default: () => { |
|
|
|
return []; |
|
|
|
return {}; |
|
|
|
}, |
|
|
|
}, |
|
|
|
data: { |
|
|
|
type: Object, |
|
|
|
columnsMap: { |
|
|
|
type: Map, |
|
|
|
default: () => { |
|
|
|
return {}; |
|
|
|
return new Map(); |
|
|
|
}, |
|
|
|
}, |
|
|
|
}); |
|
|
|
const cols = props.cols; |
|
|
|
const data = props.data; |
|
|
|
|
|
|
|
console.info('cols===============', cols); |
|
|
|
const props_ = { ...props.props }; |
|
|
|
const propsHandler = (child) => { |
|
|
|
const cols = <any>[]; |
|
|
|
props_.cols.forEach((col) => { |
|
|
|
if (props.columnsMap.get(col.name) && props.columnsMap.get(col.name).format) { |
|
|
|
cols.push({ ...col, value: props.columnsMap.get(col.name).format(child[col.name]) }); |
|
|
|
} else { |
|
|
|
cols.push({ ...col, value: child[col.name] }); |
|
|
|
} |
|
|
|
}); |
|
|
|
return { |
|
|
|
key: child.id, |
|
|
|
row: child, |
|
|
|
pageIndex: props.props.pageIndex, |
|
|
|
__trClass: props.props.__trClass, |
|
|
|
cols: cols, |
|
|
|
colsMap: props.props.colsMap, |
|
|
|
rowIndex: props.props.rowIndex, |
|
|
|
color: props.props.color, |
|
|
|
dark: props.props.dark, |
|
|
|
dense: props.props.dense, |
|
|
|
selected: props.props.selected, |
|
|
|
expand: props.props.expand, |
|
|
|
}; |
|
|
|
}; |
|
|
|
</script> |
|
|
|