Merge branch 'dev' of github.com:jetlinks/jetlinks-ui-vue into dev
This commit is contained in:
commit
189f056c22
|
@ -8,34 +8,34 @@
|
|||
</span>
|
||||
<span>
|
||||
<a-dropdown>
|
||||
<!-- <AIcon type="MoreOutline" /> -->
|
||||
<more-outlined />
|
||||
<template #overlay>
|
||||
<a-menu>
|
||||
<a-menu-item v-for="item in symbolList.filter((t: SymbolType, i: number) => i > 6)" :key="item.key"
|
||||
<j-menu>
|
||||
<j-menu-item v-for="item in symbolList.filter((t: SymbolType, i: number) => i > 6)" :key="item.key"
|
||||
@click="addOperatorValue(item.value)">
|
||||
{{ item.value }}
|
||||
</a-menu-item>
|
||||
</a-menu>
|
||||
</j-menu-item>
|
||||
</j-menu>
|
||||
</template>
|
||||
</a-dropdown>
|
||||
</span>
|
||||
</div>
|
||||
<div class="right">
|
||||
<span v-if="mode !== 'advance'">
|
||||
<a-tooltip :title="!id ? '请先输入标识' : '设置属性规则'">
|
||||
<fullscreen-outlined :class="!id ? 'disabled' : ''" @click="fullscreenClick" />
|
||||
</a-tooltip>
|
||||
<j-tooltip :title="!id ? '请先输入标识' : '设置属性规则'">
|
||||
<AIcon type="FullscreenOutlined" :class="!id ? 'disabled' : ''" @click="fullscreenClick" />
|
||||
<!-- <fullscreen-outlined :class="!id ? 'disabled' : ''" @click="fullscreenClick" /> -->
|
||||
</j-tooltip>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="editor">
|
||||
<MonacoEditor v-if="loading" v-model:model-value="_value" theme="vs" ref="editor" />
|
||||
<JMonacoEditor v-if="loading" v-model:model-value="_value" theme="vs" ref="editor" lang="javascript"/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts" name="Editor">
|
||||
import { FullscreenOutlined, MoreOutlined } from '@ant-design/icons-vue';
|
||||
import MonacoEditor from '@/components/MonacoEditor/index.vue';
|
||||
|
||||
interface Props {
|
||||
mode?: 'advance' | 'simple';
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
]">
|
||||
<j-input v-model:value="_value[index].name" size="small"></j-input>
|
||||
</j-form-item>
|
||||
<value-type-form v-model:value="_value[index].valueType" :name="name.concat([index, 'valueType'])" isSub
|
||||
<value-type-form v-model:value="_value[index].valueType" :name="name.concat([index, 'valueType'])" :isSub="isSub"
|
||||
key="json_sub"></value-type-form>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -69,6 +69,10 @@ const props = defineProps({
|
|||
name: {
|
||||
type: Array as PropType<(string | number)[]>,
|
||||
default: () => ([])
|
||||
},
|
||||
isSub: {
|
||||
type: Boolean,
|
||||
default: true
|
||||
}
|
||||
})
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<j-form-item label="输入参数" name="inputs" :rules="[
|
||||
{ validator: (_rule: Rule, val: Record<any, any>[]) => validateJson(_rule, val, '输入参数', false) },
|
||||
]">
|
||||
<JsonParam v-model:value="value.inputs" :name="['inputs']"></JsonParam>
|
||||
<JsonParam v-model:value="value.inputs" :name="['inputs']" :is-sub="false"></JsonParam>
|
||||
</j-form-item>
|
||||
<value-type-form :name="['output']" v-model:value="value.output" key="function" title="输出参数" :required="false"></value-type-form>
|
||||
</template>
|
||||
|
|
|
@ -109,7 +109,7 @@ const save = reactive({
|
|||
if (props?.type === 'device') {
|
||||
instanceStore.refresh(id as string)
|
||||
} else {
|
||||
productStore.refresh(id as string)
|
||||
productStore.getDetail(id as string)
|
||||
}
|
||||
// Store.set(SystemConst.REFRESH_METADATA_TABLE, true);
|
||||
if (deploy) {
|
||||
|
@ -125,7 +125,7 @@ const save = reactive({
|
|||
}
|
||||
// Store.set('product-deploy', deploy);
|
||||
} else {
|
||||
save.resetMetadata();
|
||||
// save.resetMetadata();
|
||||
message.success({
|
||||
key: 'metadata',
|
||||
content: '操作成功!',
|
||||
|
@ -133,9 +133,9 @@ const save = reactive({
|
|||
}
|
||||
metadataStore.set('edit', false)
|
||||
metadataStore.set('item', {})
|
||||
if (instanceStore.detail) {
|
||||
instanceStore.detail.independentMetadata = true;
|
||||
}
|
||||
// if (props?.type === 'device' && instanceStore.detail) {
|
||||
// instanceStore.detail.independentMetadata = true;
|
||||
// }
|
||||
}
|
||||
} else {
|
||||
message.error('操作失败!');
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
}">
|
||||
<AIcon type="EditOutlined" />
|
||||
</PermissionButton>
|
||||
<PermissionButton :has-permission="`${permission}:delete`" type="link" key="delete" style="padding: 0"
|
||||
<PermissionButton :has-permission="`${permission}:delete`" type="link" key="delete" style="padding: 0" danger
|
||||
:pop-confirm="{
|
||||
title: '确认删除?', onConfirm: async () => {
|
||||
await removeItem(record);
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
<j-tabs @change="handleConvertMetadata" destroy-inactive-tab-pane>
|
||||
<j-tab-pane v-for="item in codecs" :key="item.id" :tab="item.name">
|
||||
<div class="cat-panel">
|
||||
<MonacoEditor v-model="value" theme="vs" style="height: 100%"></MonacoEditor>
|
||||
<JMonacoEditor v-model="value" theme="vs" style="height: 100%" lang="javascript"></JMonacoEditor>
|
||||
</div>
|
||||
</j-tab-pane>
|
||||
</j-tabs>
|
||||
|
|
|
@ -17,8 +17,7 @@
|
|||
<j-form-item label="选择产品" v-bind="validateInfos.copy" v-if="formModel.type === 'copy'">
|
||||
<j-select :options="productList" v-model:value="formModel.copy" option-filter-prop="label"></j-select>
|
||||
</j-form-item>
|
||||
<j-form-item label="物模型类型" v-bind="validateInfos.metadata"
|
||||
v-if="type === 'device' || formModel.type === 'import'">
|
||||
<j-form-item label="物模型类型" v-bind="validateInfos.metadata" v-if="type === 'device' || formModel.type === 'import'">
|
||||
<j-select v-model:value="formModel.metadata">
|
||||
<j-select-option value="jetlinks">Jetlinks物模型</j-select-option>
|
||||
<j-select-option value="alink">阿里云物模型TSL</j-select-option>
|
||||
|
@ -34,16 +33,23 @@
|
|||
<j-form-item label="文件上传" v-bind="validateInfos.upload" v-if="formModel.metadataType === 'file'">
|
||||
<j-input v-model:value="formModel.upload">
|
||||
<template #addonAfter>
|
||||
<j-upload v-model:file-list="fileList" :before-upload="beforeUpload" accept=".json"
|
||||
:show-upload-list="false" :action="FILE_UPLOAD" @change="fileChange"
|
||||
:headers="{ 'X-Access-Token': getToken()}">
|
||||
<j-upload v-model:file-list="fileList" :before-upload="beforeUpload" accept=".json" :show-upload-list="false"
|
||||
:action="FILE_UPLOAD" @change="fileChange" :headers="{ 'X-Access-Token': getToken() }">
|
||||
<AIcon type="UploadOutlined" class="upload-button" />
|
||||
</j-upload>
|
||||
</template>
|
||||
</j-input>
|
||||
</j-form-item>
|
||||
<j-form-item label="物模型" v-bind="validateInfos.import" v-if="formModel.metadataType === 'script'">
|
||||
<MonacoEditor v-model="formModel.import" theme="vs" style="height: 300px"></MonacoEditor>
|
||||
<j-form-item v-bind="validateInfos.import" v-if="formModel.metadataType === 'script'">
|
||||
<template #label>
|
||||
<j-space>
|
||||
物模型
|
||||
<j-tooltip title="在线编辑器中编写物模型脚本">
|
||||
<AIcon type="QuestionCircleOutlined" style="color: rgb(136, 136, 136);"/>
|
||||
</j-tooltip>
|
||||
</j-space>
|
||||
</template>
|
||||
<JMonacoEditor v-model="formModel.import" theme="vs" style="height: 300px" lang="javascript"></JMonacoEditor>
|
||||
</j-form-item>
|
||||
</j-form>
|
||||
</j-modal>
|
||||
|
@ -60,7 +66,6 @@ import { useInstanceStore } from '@/store/instance'
|
|||
import { useProductStore } from '@/store/product';
|
||||
import { FILE_UPLOAD } from '@/api/comm';
|
||||
import { getToken } from '@/utils/comm';
|
||||
import MonacoEditor from '@/components/MonacoEditor/index.vue'
|
||||
import { useMetadataStore } from '@/store/metadata';
|
||||
|
||||
const route = useRoute()
|
||||
|
@ -250,7 +255,7 @@ const handleImport = async () => {
|
|||
resp = await modify(id as string, params)
|
||||
}
|
||||
loading.value = false
|
||||
if (resp.status === 200) {
|
||||
if (resp.success) {
|
||||
if (props?.type === 'device') {
|
||||
const detail = instanceStore.current
|
||||
detail.metadata = paramsDevice
|
||||
|
@ -290,6 +295,7 @@ const handleImport = async () => {
|
|||
padding: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
.upload-button {
|
||||
width: 37px;
|
||||
height: 30px;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<j-card>
|
||||
<div class='device-detail-metadata' style="position: relative;">
|
||||
<div class="tips">
|
||||
<j-tooltip v-if="type === 'device'" :title="instanceStore.detail?.independentMetadata && type === 'device'
|
||||
<j-tooltip :title="instanceStore.detail?.independentMetadata && type === 'device'
|
||||
? '该设备已脱离产品物模型,修改产品物模型对该设备无影响'
|
||||
: '设备会默认继承产品的物模型,修改设备物模型后将脱离产品物模型'">
|
||||
<div class="ellipsis">
|
||||
|
@ -84,11 +84,11 @@ const resetMetadata = async () => {
|
|||
<style scoped lang="less">
|
||||
.device-detail-metadata {
|
||||
.tips {
|
||||
width: calc(100% - 670px);
|
||||
// width: calc(100% - 670px);
|
||||
position: absolute;
|
||||
top: 12px;
|
||||
z-index: 1;
|
||||
margin-left: 380px;
|
||||
margin-left: 420px;
|
||||
font-weight: 100;
|
||||
}
|
||||
|
||||
|
|
|
@ -38,8 +38,7 @@
|
|||
:params="params"
|
||||
:rowSelection="{
|
||||
selectedRowKeys: _selectedRowKeys,
|
||||
onSelect: onSelectChange,
|
||||
onSelectAll: onSelectAllChange,
|
||||
onChange: onSelectChange,
|
||||
}"
|
||||
@cancelSelect="_selectedRowKeys = []"
|
||||
:pagination="{
|
||||
|
@ -165,32 +164,9 @@ const handleSearch = (e: any) => {
|
|||
const listRef = ref();
|
||||
const _selectedRowKeys = ref<string[]>([]);
|
||||
|
||||
const onSelectChange = (
|
||||
record: any[],
|
||||
selected: boolean,
|
||||
selectedRows: any[],
|
||||
) => {
|
||||
_selectedRowKeys.value = selected
|
||||
? [...getSetRowKey(selectedRows)]
|
||||
: _selectedRowKeys.value.filter((item: any) => item !== record?.id);
|
||||
const onSelectChange = (keys: string[]) => {
|
||||
_selectedRowKeys.value = [...keys];
|
||||
};
|
||||
const onSelectAllChange = (
|
||||
selected: boolean,
|
||||
selectedRows: any[],
|
||||
changeRows: any[],
|
||||
) => {
|
||||
const unRowsKeys = getSelectedRowsKey(changeRows);
|
||||
_selectedRowKeys.value = selected
|
||||
? [...getSetRowKey(selectedRows)]
|
||||
: _selectedRowKeys.value
|
||||
.concat(unRowsKeys)
|
||||
.filter((item) => !unRowsKeys.includes(item));
|
||||
};
|
||||
const getSelectedRowsKey = (selectedRows: any[]) =>
|
||||
selectedRows.map((item) => item?.id).filter((i) => !!i);
|
||||
|
||||
const getSetRowKey = (selectedRows: any[]) =>
|
||||
new Set([..._selectedRowKeys.value, ...getSelectedRowsKey(selectedRows)]);
|
||||
|
||||
const loading = ref(false);
|
||||
const handleSave = async () => {
|
||||
|
|
|
@ -15,8 +15,7 @@
|
|||
:params="params"
|
||||
:rowSelection="{
|
||||
selectedRowKeys: _selectedRowKeys,
|
||||
onSelect: onSelectChange,
|
||||
onSelectAll: onSelectAllChange,
|
||||
onChange: onSelectChange,
|
||||
}"
|
||||
@cancelSelect="_selectedRowKeys = []"
|
||||
:pagination="{
|
||||
|
@ -242,32 +241,9 @@ const listRef = ref();
|
|||
const _selectedRowKeys = ref<string[]>([]);
|
||||
const bindVis = ref(false);
|
||||
|
||||
const onSelectChange = (
|
||||
record: any[],
|
||||
selected: boolean,
|
||||
selectedRows: any[],
|
||||
) => {
|
||||
_selectedRowKeys.value = selected
|
||||
? [...getSetRowKey(selectedRows)]
|
||||
: _selectedRowKeys.value.filter((item: any) => item !== record?.id);
|
||||
const onSelectChange = (keys: string[]) => {
|
||||
_selectedRowKeys.value = [...keys];
|
||||
};
|
||||
const onSelectAllChange = (
|
||||
selected: boolean,
|
||||
selectedRows: any[],
|
||||
changeRows: any[],
|
||||
) => {
|
||||
const unRowsKeys = getSelectedRowsKey(changeRows);
|
||||
_selectedRowKeys.value = selected
|
||||
? [...getSetRowKey(selectedRows)]
|
||||
: _selectedRowKeys.value
|
||||
.concat(unRowsKeys)
|
||||
.filter((item) => !unRowsKeys.includes(item));
|
||||
};
|
||||
const getSelectedRowsKey = (selectedRows: any[]) =>
|
||||
selectedRows.map((item) => item?.id).filter((i) => !!i);
|
||||
|
||||
const getSetRowKey = (selectedRows: any[]) =>
|
||||
new Set([..._selectedRowKeys.value, ...getSelectedRowsKey(selectedRows)]);
|
||||
|
||||
/**
|
||||
* 表格操作按钮
|
||||
|
|
|
@ -123,7 +123,11 @@
|
|||
</j-form-item>
|
||||
</j-col>
|
||||
<j-col :span="24">
|
||||
<j-form-item name="address" label="安装地址">
|
||||
<j-form-item
|
||||
name="address"
|
||||
label="安装地址"
|
||||
:rules="{ max: 64, message: '最多可输入64个字符' }"
|
||||
>
|
||||
<j-input
|
||||
v-model:value="formData.address"
|
||||
placeholder="请输入安装地址"
|
||||
|
|
|
@ -234,6 +234,8 @@ watch(
|
|||
if (val) {
|
||||
getGatewayList();
|
||||
} else {
|
||||
_selectedRowKeys.value = []
|
||||
extendFormItem.value = []
|
||||
emit('close');
|
||||
}
|
||||
},
|
||||
|
|
|
@ -69,7 +69,7 @@ const getDeviceList = async () => {
|
|||
const res = await cascadeApi.getMediaTree({ paging: false });
|
||||
if (res.success) {
|
||||
treeData.value = res.result
|
||||
.sort((a: any, b: any) => a.createTime - b.createTime)
|
||||
.sort((a: any, b: any) => b.createTime - a.createTime)
|
||||
.map((m: any) => {
|
||||
const extra: any = {};
|
||||
extra.isLeaf = isLeaf(m);
|
||||
|
|
Loading…
Reference in New Issue