Add File
This commit is contained in:
163
frontend/src/components/drawer-main/src/DrawerMain.vue
Normal file
163
frontend/src/components/drawer-main/src/DrawerMain.vue
Normal file
@@ -0,0 +1,163 @@
|
||||
<script lang="ts" setup>
|
||||
import { ref, reactive, computed } from 'vue'
|
||||
import { ElDrawer, ElButton } from 'element-plus-secondary'
|
||||
import { propTypes } from '@/utils/propTypes'
|
||||
import DrawerFilter from '@/components/drawer-filter/src/DrawerFilter.vue'
|
||||
import DrawerEnumFilter from '@/components/drawer-filter/src/DrawerEnumFilter.vue'
|
||||
import { useEmitt } from '@/utils/useEmitt'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
const { t } = useI18n()
|
||||
const props = defineProps({
|
||||
filterOptions: propTypes.arrayOf(
|
||||
propTypes.shape({
|
||||
type: propTypes.string,
|
||||
field: propTypes.string,
|
||||
option: propTypes.array,
|
||||
title: propTypes.string,
|
||||
property: propTypes.shape({}),
|
||||
})
|
||||
),
|
||||
title: propTypes.string,
|
||||
})
|
||||
|
||||
const componentList = computed(() => {
|
||||
return props.filterOptions as any[]
|
||||
})
|
||||
|
||||
const state = reactive<{ conditions: any[] }>({
|
||||
conditions: [],
|
||||
})
|
||||
const userDrawer = ref(false)
|
||||
|
||||
const init = () => {
|
||||
userDrawer.value = true
|
||||
}
|
||||
|
||||
const clear = (index: any) => {
|
||||
useEmitt().emitter.emit('clear-drawer_main', index)
|
||||
}
|
||||
const cleanrInnerValue = (index: number) => {
|
||||
const field = componentList.value[index]?.field
|
||||
if (!field) {
|
||||
return
|
||||
}
|
||||
clear(index)
|
||||
for (let i = 0; i < state.conditions.length; i++) {
|
||||
if (state.conditions[i].field === field) {
|
||||
state.conditions[i].value = []
|
||||
}
|
||||
}
|
||||
}
|
||||
const clearInnerTag = (index?: number) => {
|
||||
if (isNaN(index as number)) {
|
||||
for (let i = 0; i < componentList.value.length; i++) {
|
||||
clear(i)
|
||||
}
|
||||
return
|
||||
}
|
||||
const condition = state.conditions[index as number]
|
||||
const field = condition?.field
|
||||
for (let i = 0; i < componentList.value.length; i++) {
|
||||
if (componentList.value[i].field === field) {
|
||||
clear(i)
|
||||
}
|
||||
}
|
||||
}
|
||||
const clearFilter = (id?: number) => {
|
||||
clearInnerTag(id)
|
||||
if (isNaN(id as number)) {
|
||||
const len = state.conditions.length
|
||||
state.conditions.splice(0, len)
|
||||
} else {
|
||||
state.conditions.splice(id as number, 1)
|
||||
}
|
||||
trigger()
|
||||
}
|
||||
const filterChange = (value: any, field: any, operator: any) => {
|
||||
let exits = false
|
||||
let len = state.conditions.length
|
||||
while (len--) {
|
||||
const condition = state.conditions[len]
|
||||
if (condition.field === field) {
|
||||
exits = true
|
||||
condition['value'] = value
|
||||
}
|
||||
if (!condition?.value?.length) {
|
||||
state.conditions.splice(len, 1)
|
||||
}
|
||||
}
|
||||
if (!exits && value?.length) {
|
||||
state.conditions.push({ field, value, operator })
|
||||
}
|
||||
treeFilterChange(value, field, operator)
|
||||
}
|
||||
const reset = () => {
|
||||
clearFilter()
|
||||
userDrawer.value = false
|
||||
}
|
||||
const close = () => {
|
||||
userDrawer.value = false
|
||||
}
|
||||
const emits = defineEmits(['trigger-filter', 'tree-filter-change'])
|
||||
const trigger = () => {
|
||||
emits('trigger-filter', state.conditions)
|
||||
}
|
||||
const treeFilterChange = (value: any, field: any, operator: any) => {
|
||||
emits('tree-filter-change', {
|
||||
value,
|
||||
field,
|
||||
operator,
|
||||
})
|
||||
}
|
||||
defineExpose({
|
||||
init,
|
||||
clearFilter,
|
||||
close,
|
||||
cleanrInnerValue,
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-drawer
|
||||
v-model="userDrawer"
|
||||
:title="t('user.filter_conditions')"
|
||||
size="600px"
|
||||
modal-class="drawer-main-container"
|
||||
direction="rtl"
|
||||
>
|
||||
<div v-for="(component, index) in componentList" :key="index">
|
||||
<drawer-filter
|
||||
v-if="component.type === 'select'"
|
||||
:option-list="component.option"
|
||||
:title="component.title"
|
||||
:index="index"
|
||||
:property="component.property"
|
||||
@filter-change="(v) => filterChange(v, component.field, 'in')"
|
||||
/>
|
||||
<drawer-enum-filter
|
||||
v-if="component.type === 'enum'"
|
||||
:option-list="component.option"
|
||||
:title="component.title"
|
||||
:index="index"
|
||||
@filter-change="(v) => filterChange(v, component.field, 'in')"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<template #footer>
|
||||
<el-button secondary @click="reset">{{ t('common.reset') }}</el-button>
|
||||
<el-button type="primary" @click="trigger">{{ t('common.search') }}</el-button>
|
||||
</template>
|
||||
</el-drawer>
|
||||
</template>
|
||||
|
||||
<style lang="less">
|
||||
.drawer-main-container {
|
||||
.ed-drawer__body {
|
||||
padding: 16px 24px 80px !important;
|
||||
}
|
||||
.ed-drawer__footer {
|
||||
padding: 16px 24px;
|
||||
height: 64px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user