fix: bug#16210

This commit is contained in:
XieYongHong 2023-07-12 15:45:29 +08:00
parent 5832c94fde
commit 22888abd5f
8 changed files with 120 additions and 22 deletions

View File

@ -21,7 +21,8 @@ export const useMetadataStore = defineStore({
action: 'add', action: 'add',
import: false, import: false,
importMetadata: false, importMetadata: false,
} as MetadataModelType } as MetadataModelType,
tabActiveKey: 'properties',
}), }),
actions: { actions: {
set(key: string, value: any) { set(key: string, value: any) {

View File

@ -145,3 +145,41 @@ export const ArrayToTree = (list: any[]): any[] => {
// 返回出去 // 返回出去
return treeList; return treeList;
}; };
export const EventEmitter = {
list: {},
subscribe: function(events: string[], fn: Function) {
const list = this.list
events.forEach(event => {
(list[event] || (list[event] = [])).push(fn)
})
return this
},
emit: function(events:string, data?: any) {
const list = this.list
const fns: Function[] = list[events] ? [...list[events]] : []
if (!fns.length) return false;
fns.forEach(fn => {
fn(data)
})
return this
},
unSubscribe: function(events:string[], fn: Function) {
const list = this.list
events.forEach(key => {
if (key in list) {
const fns = list[key]
for (let i = 0; i < fns.length; i++) {
if (fns[i] === fn) {
fns.splice(i, 1)
break;
}
}
}
})
return this
}
}

View File

@ -128,6 +128,7 @@ import { getImage, onlyMessage } from '@/utils/comm';
import { getWebSocket } from '@/utils/websocket'; import { getWebSocket } from '@/utils/websocket';
import { useMenuStore } from '@/store/menu'; import { useMenuStore } from '@/store/menu';
import { useRouterParams } from '@/utils/hooks/useParams'; import { useRouterParams } from '@/utils/hooks/useParams';
import { EventEmitter } from '@/utils/utils'
const menuStory = useMenuStore(); const menuStory = useMenuStore();
@ -297,7 +298,13 @@ onMounted(() => {
}); });
const onTabChange = (e: string) => { const onTabChange = (e: string) => {
if (instanceStore.tabActiveKey === 'Metadata') {
EventEmitter.emit('MetadataTabs', () => {
instanceStore.tabActiveKey = e; instanceStore.tabActiveKey = e;
})
} else {
instanceStore.tabActiveKey = e;
}
}; };
const handleAction = async () => { const handleAction = async () => {

View File

@ -123,6 +123,7 @@ import {
import { getImage, handleParamsToString, onlyMessage } from '@/utils/comm'; import { getImage, handleParamsToString, onlyMessage } from '@/utils/comm';
import { useMenuStore } from '@/store/menu'; import { useMenuStore } from '@/store/menu';
import { useRouterParams } from '@/utils/hooks/useParams'; import { useRouterParams } from '@/utils/hooks/useParams';
import {EventEmitter} from "@/utils/utils";
const menuStory = useMenuStore(); const menuStory = useMenuStore();
const route = useRoute(); const route = useRoute();
@ -187,7 +188,13 @@ const onBack = () => {
}; };
const onTabChange = (e: string) => { const onTabChange = (e: string) => {
if (productStore.tabActiveKey === 'Metadata') {
EventEmitter.emit('MetadataTabs', () => {
productStore.tabActiveKey = e; productStore.tabActiveKey = e;
})
} else {
productStore.tabActiveKey = e;
}
}; };
/** /**

View File

@ -8,6 +8,7 @@
placeholder: '请输入搜索名称' placeholder: '请输入搜索名称'
}" }"
serial serial
@editStatus="editStatusChange"
> >
<template #expand> <template #expand>
<PermissionButton <PermissionButton
@ -16,12 +17,12 @@
:hasPermission="`${permission}:update`" :hasPermission="`${permission}:update`"
key="add" key="add"
:disabled="hasOperate('add', type)" :disabled="hasOperate('add', type) || !editStatus"
:tooltip="{ :tooltip="{
placement: hasOperate('add', type) ? 'topRight' : 'top', placement: hasOperate('add', type) ? 'topRight' : 'top',
title: hasOperate('add', type) title: hasOperate('add', type)
? '当前的存储方式不支持新增' ? '当前的存储方式不支持新增'
: '新增', : !editStatus ? '暂无改动数据': '新增',
}" }"
@click="handleAddClick()" @click="handleAddClick()"
> >
@ -34,11 +35,11 @@
v-else v-else
:loading="loading" :loading="loading"
:disabled="hasOperate('add', type)" :disabled="hasOperate('add', type) || !editStatus"
:tooltip="{ :tooltip="{
title: hasOperate('add', type) title: hasOperate('add', type)
? '当前的存储方式不支持新增' ? '当前的存储方式不支持新增'
: '保存', : !editStatus ? '暂无改动数据': '保存',
placement: hasOperate('add', type) ? 'topRight' : 'top', placement: hasOperate('add', type) ? 'topRight' : 'top',
}" }"
@click="handleSaveClick" @click="handleSaveClick"
@ -190,10 +191,10 @@ import type {
ProductItem, ProductItem,
} from '@/views/device/Product/typings'; } from '@/views/device/Product/typings';
import type { PropType } from 'vue'; import type { PropType } from 'vue';
import { onBeforeRouteLeave } from 'vue-router'
import { useMetadata, useOperateLimits } from './hooks'; import { useMetadata, useOperateLimits } from './hooks';
import {TypeStringMap, useColumns} from './columns'; import {TypeStringMap, useColumns} from './columns';
import { levelMap, sourceMap, expandsType, limitsMap } from './utils'; import { levelMap, sourceMap, expandsType, limitsMap } from './utils';
import Rule from '@/components/Metadata/Rule';
import { Source, OtherSetting, InputParams, ConfigParams } from './components'; import { Source, OtherSetting, InputParams, ConfigParams } from './components';
import { saveProductVirtualProperty } from '@/api/device/product'; import { saveProductVirtualProperty } from '@/api/device/product';
import { saveDeviceVirtualProperty } from '@/api/device/instance'; import { saveDeviceVirtualProperty } from '@/api/device/instance';
@ -204,8 +205,9 @@ import { useMetadataStore } from '@/store/metadata';
import { DeviceInstance } from '@/views/device/Instance/typings'; import { DeviceInstance } from '@/views/device/Instance/typings';
import { onlyMessage } from '@/utils/comm'; import { onlyMessage } from '@/utils/comm';
import {omit} from "lodash-es"; import {omit} from "lodash-es";
import {useAction} from "@/views/device/components/Metadata/Base/hooks/useAction";
import { PropertiesModal, FunctionModal, EventModal, TagsModal } from './DetailModal' import { PropertiesModal, FunctionModal, EventModal, TagsModal } from './DetailModal'
import { Modal } from 'jetlinks-ui-components'
import {EventEmitter} from "@/utils/utils";
const props = defineProps({ const props = defineProps({
target: { target: {
@ -234,6 +236,7 @@ const productStore = useProductStore()
const dataSource = ref<MetadataItem[]>(metadata.value || []); const dataSource = ref<MetadataItem[]>(metadata.value || []);
const tableRef = ref(); const tableRef = ref();
const loading = ref(false) const loading = ref(false)
const editStatus = ref(false) //
// const columns = computed(() => MetadataMapping.get(props.type!)); // const columns = computed(() => MetadataMapping.get(props.type!));
const {columns} = useColumns(props.type, _target, noEdit, productNoEdit) const {columns} = useColumns(props.type, _target, noEdit, productNoEdit)
@ -247,8 +250,6 @@ const showSave = ref(metadata.value.length !== 0)
const showLastDelete = ref(false) const showLastDelete = ref(false)
const { addAction, copyAction, removeAction } = useAction(tableRef)
provide('_dataSource', dataSource.value) provide('_dataSource', dataSource.value)
const showDetail = (data: any) => { const showDetail = (data: any) => {
@ -377,7 +378,11 @@ const removeItem = (index: number) => {
} }
} }
const handleSaveClick = async () => { const editStatusChange = (status: boolean) => {
editStatus.value = status
}
const handleSaveClick = async (next?: Function) => {
let resp = await tableRef.value.getData().finally(() => { let resp = await tableRef.value.getData().finally(() => {
}); });
@ -430,9 +435,41 @@ const handleSaveClick = async () => {
dataSource.value = resp dataSource.value = resp
tableRef.value.cleanEditStatus() tableRef.value.cleanEditStatus()
onlyMessage('操作成功!') onlyMessage('操作成功!')
next?.()
} }
} }
}; };
const tabsChange = inject('tabsChange')
const parentTabsChange = (next?: Function) => {
if (editStatus.value) {
Modal.confirm({
content: '页面改动数据未保存',
okText: '保存',
cancelText: '不保存',
onOk: () => {
handleSaveClick(next as Function)
},
onCancel: () => {
(next as Function)?.()
}
})
} else {
(next as Function)?.()
}
}
EventEmitter.subscribe(['MetadataTabs'], parentTabsChange)
onUnmounted(() => {
EventEmitter.unSubscribe(['MetadataTabs'], parentTabsChange)
})
onBeforeRouteLeave((to, from, next) => {
parentTabsChange(next as Function)
})
</script> </script>
<style scoped> <style scoped>

View File

@ -14,7 +14,7 @@
<!-- </div>--> <!-- </div>-->
<!-- </j-tooltip>--> <!-- </j-tooltip>-->
<!-- </div>--> <!-- </div>-->
<j-tabs class="metadataNav" destroyInactiveTabPane type="card"> <j-tabs class="metadataNav" :activeKey="metadataStore.tabActiveKey" destroyInactiveTabPane type="card" @change="tabsChange">
<template #rightExtra> <template #rightExtra>
<j-space> <j-space>
<PermissionButton v-if="type === 'device' && instanceStore.detail?.independentMetadata" <PermissionButton v-if="type === 'device' && instanceStore.detail?.independentMetadata"
@ -54,6 +54,7 @@ import Cat from './Cat/index.vue'
// import BaseMetadata from './Base/index.vue' // import BaseMetadata from './Base/index.vue'
import BaseMetadata from './Base/Base.vue' import BaseMetadata from './Base/Base.vue'
import { useMetadataStore } from '@/store/metadata' import { useMetadataStore } from '@/store/metadata'
import {EventEmitter} from "@/utils/utils";
const route = useRoute() const route = useRoute()
const instanceStore = useInstanceStore() const instanceStore = useInstanceStore()
@ -85,6 +86,13 @@ const resetMetadata = async () => {
// }, 400) // }, 400)
} }
} }
const tabsChange = (e: string) => {
EventEmitter.emit('MetadataTabs', () => {
metadataStore.tabActiveKey = e;
})
}
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
.device-detail-metadata { .device-detail-metadata {

View File

@ -35,22 +35,22 @@ const filterProductMetadata = (data: any[], productMetaData: any[]) => {
if (productMetaData) { if (productMetaData) {
if (productMetaData.properties && productMetaData.properties.length) { if (productMetaData.properties && productMetaData.properties.length) {
metadata.properties = filterProductMetadata(metadata.properties, productMetaData.properties) metadata.properties = filterProductMetadata(item, productMetaData.properties)
} }
if (productMetaData.functions && productMetaData.functions.length) { if (productMetaData.functions && productMetaData.functions.length) {
metadata.functions = filterProductMetadata(metadata.functions, productMetaData.functions) metadata.functions = filterProductMetadata(item, productMetaData.functions)
} }
if (productMetaData.events && productMetaData.events.length) { if (productMetaData.events && productMetaData.events.length) {
metadata.events = filterProductMetadata(metadata.events, productMetaData.events) metadata.events = filterProductMetadata(item, productMetaData.events)
} }
if (productMetaData.tags && productMetaData.tags.length) { if (productMetaData.tags && productMetaData.tags.length) {
metadata.tags = filterProductMetadata(metadata.tags, productMetaData.tags) metadata.tags = filterProductMetadata(item, productMetaData.tags)
} }
} else {
metadata[type] = item as any
} }
console.log(metadata, type)
console.log(metadata)
metadata[type] = metadata[type].sort((a, b) => b?.sortsIndex - a?.sortsIndex) as any[] metadata[type] = metadata[type].sort((a, b) => b?.sortsIndex - a?.sortsIndex) as any[]
console.log('updateMetadata',metadata)
data.metadata = JSON.stringify(metadata); data.metadata = JSON.stringify(metadata);
onEvent?.(data.metadata) onEvent?.(data.metadata)
return data; return data;

View File

@ -3837,8 +3837,8 @@ jetlinks-ui-components@^1.0.23:
jetlinks-ui-components@^1.0.24: jetlinks-ui-components@^1.0.24:
version "1.0.24" version "1.0.24"
resolved "http://registry.jetlinks.cn/jetlinks-ui-components/-/jetlinks-ui-components-1.0.24.tgz#33f59962062e023d6f10907bd941aef183db6dc5" resolved "http://registry.jetlinks.cn/jetlinks-ui-components/-/jetlinks-ui-components-1.0.24.tgz#42eea061b08a87f9bb58cb6a2f2dd94daa17499b"
integrity sha512-/Bch0MnW/aWSc1r62423eOFQS+lbLMPdKpb4hryXTZ5c+oBryBWzRXsXOYMyI1zqBJoVdxdJTfs7Q77N6Y4J4w== integrity sha512-+QWKtOqAFs8TneJSE5dGswT3qZ/OHAz6U8AVzRAAict2r6FIYmSJ90CF4a3JTCRbF9yQ3rnhGnmUAMbyGR9BBQ==
dependencies: dependencies:
"@vueuse/core" "^9.12.0" "@vueuse/core" "^9.12.0"
"@vueuse/router" "^9.13.0" "@vueuse/router" "^9.13.0"