WholeProcessPlatform/frontend/src/components/SidePanelItem/index.vue

267 lines
7.6 KiB
Vue
Raw Normal View History

<!-- SidePanelItem.vue -->
<template>
<div class="qgc-side-pannel-item">
<div class="qgc_title">
<div class="title_left">
2026-05-09 17:04:48 +08:00
<span class="texttitle">{{ title }}</span>
<span v-if="prompt.show" class="title_icon">
<a-tooltip placement="top" :title="prompt.value" :get-popup-container="getPopupContainer">
<QuestionCircleOutlined />
</a-tooltip>
</span>
<span v-if="clickprompt.show" class="title_icon">
<a-tooltip placement="top" trigger="click" :title="clickprompt.value"
:get-popup-container="getPopupContainer">
<InfoCircleOutlined />
</a-tooltip>
</span>
</div>
<div class="title_right">
<div v-if="select.show">
2026-05-09 17:04:48 +08:00
<a-select v-model:value="selectValue" show-search placeholder="请选择" :size="'small'"
:options="select.options" :filter-option="filterOption" @focus="handleFocus" @blur="handleBlur"
@change="handleChange"></a-select>
</div>
<div v-if="shrink" class="title_shrink" @click="isExpand = !isExpand">
<img v-if="isExpand" src="@/assets/components/arrow-up.png" alt="">
<img v-else src="@/assets/components/arrow-down.png" alt="">
</div>
<div v-if="moreSelect.show">
2026-05-09 17:04:48 +08:00
<a-tree-select v-model:value="moreSelectValue" show-search
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }" placeholder="Please select"
allow-clear tree-default-expand-all :tree-data="moreSelect.options"
tree-node-filter-prop="label">
</a-tree-select>
</div>
<div v-if="datetimePicker.show">
<!-- 添加 locale 属性来设置语言 -->
<a-date-picker v-model:value="datetimeValue" show-time
:format="datetimePicker.format !== null ? datetimePicker.format : undefined"
2026-05-09 17:04:48 +08:00
:picker="datetimePicker.picker" placeholder="请选择时间"
@change="handleDateTimeChange" :size="'small'" />
<!-- 修改为 locale 变量 -->
</div>
<div v-if="scopeDate.show">
2026-04-20 16:57:54 +08:00
<a-range-picker v-model:value="scopeDateValue" :picker="scopeDate.picker"
:format="'YYYY-MM-DD'" :range-separator="' 至 '" style="width: 200px" />
</div>
</div>
</div>
<div class="body">
<slot v-if="isExpand" />
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted } from 'vue';
import {
QuestionCircleOutlined,
InfoCircleOutlined
} from '@ant-design/icons-vue';
import type { SelectProps } from 'ant-design-vue';
// 导入 dayjs
import dayjs, { Dayjs } from 'dayjs';
// 定义类型接口
interface PromptConfig {
show: boolean;
value: string;
}
interface SelectConfig {
picker: any;
format: any;
show: boolean;
value: string | undefined;
options: SelectProps['options'];
}
// 定义组件名(便于调试和递归)
defineOptions({
name: 'SidePanelItem'
});
// 定义props
const props = defineProps({
title: { // 标题
type: String,
default: ''
},
shrink: { // 是否显示收缩
type: Boolean,
default: false
},
prompt: { // 浮动提示
type: Object as () => PromptConfig,
default: () => ({
show: false,
value: '',
})
},
clickprompt: { // 点击提示
type: Object as () => PromptConfig,
default: () => ({
show: false,
value: '',
})
},
select: { // 选择框
type: Object as () => SelectConfig,
default: () => ({
show: false,
value: undefined,
options: []
})
},
moreSelect: {//树选择框
type: Object as () => SelectConfig,
default: () => ({
show: false,
value: undefined,
options: []
})
},
datetimePicker: { // 时间选择框
type: Object as () => SelectConfig,
default: () => ({
show: false,
value: undefined,
format: null, //YYYY-MM-DD HH
picker: 'date' //date | week | month | quarter | year
})
},
scopeDate: { // 时间选择框
type: Object as () => SelectConfig,
default: () => ({
show: false,
value: undefined,
picker: 'month' //date | week | month | quarter | year
})
},
});
const isExpand = ref(true);
const selectValue = ref(props.select.value)
const moreSelectValue = ref(props.select.value)
const datetimeValue = ref<Dayjs | null>(props.datetimePicker.value ? dayjs(props.datetimePicker.value) : null);
const scopeDateValue = ref(props.scopeDate.value);
// // 定义 locale 变量
// const locale = zhCN;
// console.log(locale, "zhCN");
// 下拉选择框事件处理
const handleChange = (value: string) => {
console.log(`selected ${value}`);
};
const handleBlur = () => {
console.log('blur');
};
const handleFocus = () => {
console.log('focus');
};
const filterOption = (input: string, option?: { value: string }) => {
if (!option) return false;
return option.value.toLowerCase().includes(input.toLowerCase());
};
// 文字提示容器
const getPopupContainer = (trigger: HTMLElement) => {
return trigger.parentElement;
};
//时间选择框事件处理
const handleDateTimeChange = (date: any | null, dateString: string) => {
console.log('Selected DateTime:', date, dateString);
};
// 页面加载时执行的逻辑
onMounted(() => {
console.log(props.select);
});
</script>
<style lang="scss">
.qgc-side-pannel-item {
width: 100%;
display: flex;
justify-content: space-between;
flex-direction: column;
.qgc_title {
width: 100%;
background-color: #e5edf3;
border-radius: 2px;
font-size: 16px;
color: #2f6b98;
line-height: 36px;
padding-left: 16px;
padding-right: 8px;
display: flex;
justify-content: space-between;
position: relative;
font-weight: 500;
.title_shrink {
cursor: pointer;
}
.title_left {
display: flex;
align-items: center;
2026-05-09 17:04:48 +08:00
.texttitle{
display: inline-block;
width:180px;
}
.title_icon {
display: inline-block;
margin-left: 5px;
cursor: pointer;
}
2026-05-09 17:04:48 +08:00
}
.title_right {
display: flex;
align-items: center;
2026-05-09 17:04:48 +08:00
div{
margin-right: 2px;
}
}
}
.qgc_title:before {
position: absolute;
content: "";
display: inline-block;
left: 0;
width: 2px;
background-color: #005293;
top: 2px;
height: 32px;
border-radius: 3px;
}
.body {
width: 100%;
font-size: 14px;
line-height: 22px;
padding: 16px 0 0;
margin-bottom: 16px;
text-overflow: ellipsis;
overflow: hidden;
height: calc(100% - 36px);
box-sizing: border-box;
p {
text-indent: 2em;
}
}
}
2026-04-20 16:57:54 +08:00
</style>