<template>
<div class="manage-panel">
<div class="manage-panel-search">
<tiny-search v-model="state.searchValue" clearable placeholder="搜索" @update:modelValue="searchBridgeData">
<template #prefix>
<tiny-icon-search />
</template>
</tiny-search>
</div>
<div class="list">
<div
v-for="(item, index) in list"
:key="item.name"
:class="['list-item', index === state.activeIndex ? 'active' : '']"
@click.stop="openEdit(item, index)"
>
<svg-icon name="plugin-icon-sresources"></svg-icon>
<div class="item-label">{{ item.name }}</div>
<svg-icon class="setting-icon" name="setting" @click.stop="openEdit(item, index)"></svg-icon>
</div>
<search-empty :isShow="!list.length" />
</div>
</div>
</template>
<script>
import { watchEffect, ref, reactive } from 'vue'
import { Search } from '@opentiny/vue'
import { iconSearch } from '@opentiny/vue-icon'
import { SearchEmpty } from '@opentiny/tiny-engine-common'
import {
RESOURCE_TYPE,
ACTION_TYPE,
getResourcesByType,
setType,
setActionType,
setResource,
setCategory,
getType,
setResourceNamesByType
} from './js/resource'
export default {
components: {
TinySearch: Search,
TinyIconSearch: iconSearch(),
SearchEmpty
},
props: {
name: {
type: String,
default: RESOURCE_TYPE.Util
}
},
emits: ['open'],
setup(props, { emit }) {
const list = ref([])
const state = reactive({
resourceList: [],
activeIndex: -1,
searchValue: ''
})
const filterResourceSearchValue = (resourceList = state.resourceList, searchValue = state.searchValue) =>
resourceList.filter((item) => item.name.toLowerCase().indexOf(searchValue.toLowerCase()) > -1)
const refresh = async (name) => {
state.resourceList = await getResourcesByType(name)
setResourceNamesByType(
name,
Array.isArray(state.resourceList) ? state.resourceList.map((resource) => resource.name) : []
)
list.value = filterResourceSearchValue(state.resourceList)
}
watchEffect(async () => {
refresh(props.name)
})
const add = (type) => {
setActionType('')
setType(props.name)
setResource('')
setCategory(type)
emit('open')
}
const openRead = (item, index) => {
state.activeIndex = index
setResource(item)
setActionType(ACTION_TYPE.Edit)
emit('open')
}
const openEdit = (item, index) => {
state.activeIndex = index
setResource(item)
setActionType(ACTION_TYPE.Edit)
setType(props.name)
setCategory(item.type)
emit('open')
}
const searchBridgeData = (value) => {
list.value = filterResourceSearchValue(state.resourceList, value)
}
return {
state,
list,
add,
openRead,
openEdit,
refresh,
getType,
RESOURCE_TYPE,
searchBridgeData
}
}
}
</script>
<style lang="less" scoped>
.manage-panel {
height: 100%;
display: flex;
flex-direction: column;
position: relative;
.manage-panel-search {
padding: 0 12px 12px 12px;
}
.add-button {
align-self: flex-end;
margin: 6px;
}
.list {
flex: 1;
border-top: 1px solid var(--ti-lowcode-tabs-border-color);
overflow: auto;
padding: 12px 0;
}
.list-item {
height: 24px;
line-height: 24px;
display: grid;
grid-template-columns: 16px 1fr auto;
column-gap: 8px;
align-items: center;
padding: 0 12px;
position: relative;
color: var(--ti-lowcode-bridge-list-color);
cursor: pointer;
font-size: 12px;
&:hover,
&.active {
background: var(--ti-lowcode-bridge-list-bg);
.setting-icon {
display: block;
}
}
.setting-icon {
display: none;
color: var(--ti-lowcode-toolbar-more-hover-color);
}
}
}
</style>