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

470 lines
13 KiB
Vue

<template>
<div class="leftMenu">
<div
class="leftMenuTitle"
:style="{
width: leftMenuShow ? '340px' : '0px',
}"
>
<div class="leftMenu_closeButton">
<a-tooltip placement="right">
<template #title> 关闭弹窗 </template>
<CloseOutlined
style="font-size: 24px; margin: 8px; color: white"
@click="closePathModal"
/>
</a-tooltip>
</div>
<a-tooltip placement="right">
<template #title> {{ props.floderName }} </template>
<div class="title">{{ props.floderName }}</div>
</a-tooltip>
</div>
<div class="leftMenuContent">
<div class="leftMenuContent_2" v-if="leftMenuShow">
<div class="leftMenuContent_search">
<a-select
v-model:value="tagSelect"
mode="multiple"
style="width: 90%"
placeholder="标签筛选"
size="small"
allowClear
maxTagCount="3"
:options="tagOptions"
@change="handleChangeImageSearch"
>
</a-select>
<a-select
v-model:value="imageTypeSelect"
mode="multiple"
style="width: 90%; margin-top: 5px"
placeholder="类型选择"
allowClear
size="small"
maxTagCount="2"
:options="imageOptions"
@change="handleChangeImageSearch"
>
</a-select>
<a-input-search
v-model:value="searchValue"
placeholder="按照媒体名称搜索"
style="width: 90%; margin-top: 5px"
@search="handleChangeImageSearch"
allowClear
size="small"
/>
</div>
<div class="leftMenuContent_list">
<!-- 列表 -->
<div v-for="show in showMenuInfoList" :key="show.id">
<div
class="showMenuInfo_image"
v-if="showMenuInfoName == '地图照片'"
:style="{
background:
props.nowShowImageData && props.nowShowImageData.id == show.id
? '#274D75'
: show.mouse
? '#393939'
: '',
}"
>
<FileImageOutlined />
<div
class="eye"
@click="funShowOnMapOrDisplay(show, 'display')"
:style="{ background: show.display ? '#2d8cf0' : '#000000' }"
>
<EyeOutlined v-if="show.display == 1" style="color: #ffffff; font-size: 16px" />
<EyeInvisibleOutlined
v-if="show.display != 1"
style="color: #ffffff; font-size: 16px"
/>
</div>
<a-tooltip placement="top">
<template #title>
<div> {{ show.name }}</div>
</template>
<div
:style="{
width: show.mouse ? '160px' : '210px',
'white-space': 'nowrap',
overflow: 'hidden',
'text-overflow': 'ellipsis',
}"
@click="setNowShowImageData(show)"
>
{{ show.name }}
</div>
</a-tooltip>
<a-tooltip placement="top">
<template #title>
<span>回中</span>
</template>
<AimOutlined @click="handlerLocation(show)" />
</a-tooltip>
<a-popconfirm
placement="right"
title="您是否将该照片在地图上取消加载?取消后照片将不在地图上显示。"
ok-text="确认"
cancel-text="取消"
@confirm="funShowOnMapOrDisplay(show, 'showOnMap')"
>
<a-tooltip placement="top">
<template #title>
<span>
{{ show.showOnMap ? '在地图上取消加载' : '在地图上加载' }}
</span>
</template>
<div style="display: flex; align-items: center">
<div v-if="show.showOnMap == 1" class="svg-container" v-html="showOnMap_1" />
<div v-if="show.showOnMap != 1" class="svg-container" v-html="showOnMap_0" />
</div>
</a-tooltip>
</a-popconfirm>
</div>
</div>
</div>
</div>
</div>
<div class="suojinButton" @click="changeLeftMenuShow">
<DoubleLeftOutlined v-if="leftMenuShow" style="font-size: 16px" />
<DoubleRightOutlined v-if="!leftMenuShow" style="font-size: 16px" />
</div>
<div class="closeButton" v-if="!leftMenuShow">
<a-tooltip placement="right">
<template #title> 关闭弹窗 </template>
<CloseOutlined style="font-size: 24px; margin: 8px; color: white" @click="closePathModal" />
</a-tooltip>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref, watch, onMounted } from 'vue';
import {
CloseOutlined,
AntDesignOutlined,
DoubleLeftOutlined,
DoubleRightOutlined,
EnvironmentOutlined,
CodeSandboxOutlined,
ExpandAltOutlined,
BorderOutlined,
LogoutOutlined,
EyeOutlined,
EyeInvisibleOutlined,
AimOutlined,
DeleteOutlined,
FileImageOutlined,
CheckCircleOutlined,
StopOutlined,
} from '@ant-design/icons-vue';
import { showOnMap_1, showOnMap_0 } from './svg';
import {
UpdatePicStatus,
Deletepic,
UpdatePicName,
UpdatePicParentKey,
} from '@/api/demo/mediaLibrary';
import { cloneDeep } from 'lodash-es';
import { useMessage } from '@/hooks/web/useMessage';
const { createMessage, createConfirm } = useMessage();
const props = defineProps(['leftMenuShow', 'floderName', 'allImageDataList', 'nowShowImageData']);
const emits = defineEmits([
'changeLeftMenuShow',
'handlerLocation',
'closePathModal',
'setNowShowImageData',
'handleSuccessPath',
'funUpdateDisplayOrShowOnMapData',
]);
const showMenuInfoList = ref(props.allImageDataList);
const showMenuInfoName = ref('地图照片');
function updateShowMenuInfoList(type) {
if (type == '地图照片') {
handleChangeImageSearch();
}
}
// 选择
function setNowShowImageData(value) {
emits('setNowShowImageData', value);
}
// 目录-隐藏或者显示
function changeLeftMenuShow() {
emits('changeLeftMenuShow');
}
// 弹窗-关闭弹窗
function closePathModal() {
emits('closePathModal');
}
// 地图图片-------------------------------------------------
// 地图图片-搜索
const filterAfterImageDataList = ref();
// 标签筛选
const tagSelect = ref([]);
const tagOptions: any = ref([]);
// 图片类型
const imageTypeSelect = ref([]);
const imageOptions: any = ref([
{
value: '广角照片',
label: '广角照片',
},
{
value: '变焦照片',
label: '变焦照片',
},
{
value: '红外照片',
label: '红外照片',
},
{
value: '全景图',
label: '全景图',
},
{
value: '码流截图',
label: '码流截图',
},
]);
// 按照媒体名称搜索
const searchValue = ref('');
function handleChangeImageSearch() {
// let filterImageData = props.allImageDataList;
let filterImageData = props.allImageDataList.filter((item) => item.showOnMap == 1);
// 标签筛选
if (tagSelect.value.length > 0) {
tagSelect.value.forEach((tag) => {
filterImageData = filterImageData.filter((item) => item.fileTags.includes(tag));
});
}
// 图片类型
// if (tagSelect.value.length > 0) {
// imageTypeSelect.value.forEach((imagetype) => {
// filterImageData = filterImageData.filter((item) => item.fileTags.includes(imagetype));
// });
// }
// 按照媒体名称搜索
if (searchValue.value) {
filterImageData = filterImageData.filter((item) => item.name.includes(searchValue.value));
}
filterAfterImageDataList.value = filterImageData;
showMenuInfoList.value = filterAfterImageDataList.value;
}
watch(
() => props.allImageDataList,
() => {
filterAfterImageDataList.value = props.allImageDataList;
// 标签选项
let tagList: any = [];
tagOptions.value = [];
props.allImageDataList.forEach((item) => {
if (item.fileTags && item.fileTags.length > 0) {
item.fileTags.forEach((tag) => {
if (!tagList.includes(tag)) {
tagList.push(tag);
}
});
}
});
tagList.forEach((tag) => {
tagOptions.value.push({
value: tag,
label: tag,
});
});
handleChangeImageSearch();
},
{
deep: true,
immediate: true,
},
);
// 加载到地图上
function funShowOnMapOrDisplay(show, type) {
if (type == 'showOnMap') {
if (show.showOnMap == 1) {
show.showOnMap = 0;
} else {
show.showOnMap = 1;
}
}
if (type == 'display') {
if (show.display == 1) {
show.display = 0;
} else {
show.display = 1;
}
}
UpdatePicStatus({
id: show.id,
fileTags: JSON.stringify(show.fileTags),
graffitiJson: JSON.stringify(show.graffitiJson),
display: show.display,
showOnMap: show.showOnMap,
}).then((res) => {
if (type == 'showOnMap') {
if (show.showOnMap) {
createMessage.success('在地图上加载成功');
} else {
createMessage.success('在地图上取消加载成功');
}
}
emits('handleSuccessPath');
emits('funUpdateDisplayOrShowOnMapData', show);
});
}
// 移动到中心位置
function handlerLocation(position) {
if (showMenuInfoName.value == '地图照片') {
emits('handlerLocation', {
lng: position.lng,
lat: position.lat,
});
}
}
defineExpose({
updateShowMenuInfoList,
});
</script>
<style lang="less" scoped>
.leftMenu {
position: relative;
width: 100%;
height: 100%;
background: #232323;
.leftMenuTitle {
position: relative;
width: 100%;
height: 50px;
padding: 10px;
border-bottom: 1px solid #ffffff55;
display: inline-flex;
align-items: center;
justify-content: flex-start;
.leftMenu_closeButton {
position: relative;
padding-top: 7px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 10px;
}
.title {
display: flex;
align-items: center;
justify-content: flex-start;
font-size: 20px;
color: #ffffff;
width: 100%;
/* 关键属性 */
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
.leftMenuContent {
position: relative;
display: flex;
width: 100%;
height: 800px;
.leftMenuContent_2 {
position: relative;
width: 100%;
height: calc(100%-50px);
.leftMenuContent_search {
margin: 10px;
gap: 5px;
}
.leftMenuContent_list {
margin-top: 5px;
overflow-y: auto;
max-height: 720px;
// 地图照片
.showMenuInfo_image {
display: flex;
align-items: center;
justify-content: flex-start;
color: #ffffff;
height: 30px;
padding-left: 15px;
gap: 10px;
.eye {
display: flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
}
.buttonRight2 {
position: absolute;
right: 35px;
}
.buttonRight1 {
position: absolute;
right: 10px;
}
}
}
}
}
}
.suojinButton {
position: absolute;
top: 45%;
right: -18px;
height: 90px;
width: 18px;
background: #ffffff;
z-index: 1000;
display: flex;
align-items: center;
justify-content: center;
border-radius: 5px;
}
.closeButton {
position: absolute;
top: 2%;
right: -25px;
width: 20px;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
display: flex;
align-items: center;
justify-content: center;
border-radius: 5px;
}
.svg-container {
display: flex;
align-items: center;
justify-content: center;
}
</style>