123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- <template>
- <div
- class="scene-group"
- >
- <div
- class="top-bar"
- :class="{
- highlight: targetId === folderInfo.id,
- disabled: isDisabled,
- }"
- @click="onClickTopBar"
- :style="{
- paddingLeft: topBarPaddingLeft,
- }"
- >
- <i class="iconfont icon-edit_input_arrow icon-expand" :class="isExpanded ? '' : 'collapsed'"></i>
- <img v-show="!isExpanded" class="folder collapsed" src="@/assets/images/icons/folder-blue-small-close.png" alt="" draggable="false">
- <img v-show="isExpanded" class="folder opened" src="@/assets/images/icons/folder-blue-small-open.png" alt="" draggable="false">
- <span class="group-name">{{folderInfo.id === 1 ? $i18n.t('gather.root_dir') : folderInfo.name}}</span>
- </div>
- <div class="group-content" v-if="isExpanded">
- <div
- v-for="(item, index) of folderInfo.children"
- :key=item.id
- >
- <component
- :is="'NestedFolder'"
- :folderInfo="item"
- :level="level + 1"
- :targetId="targetId"
- :disabledFolderList=disabledFolderList
- @targeted="onSonTargeted"
- />
- </div>
- </div>
- </div>
- </template>
- <script>
- import { mapGetters } from "vuex";
- export default {
- name: 'NestedFolder',
- components: {
- },
- props: {
- folderInfo: {
- type: Object,
- required: true,
- },
- level: {
- type: Number,
- default: 1,
- },
- disabledFolderList: {
- type: Array,
- default: () => {
- return []
- },
- },
- targetId: {
- required: true,
- }
- },
- data() {
- return {
- isExpanded: this.level === 1 ? true : false,
- }
- },
- computed: {
- topBarPaddingLeft() {
- return 12 + (this.level - 1) * 12 + 'px'
- },
- sceneItemPaddingLeft() {
- return 18 + this.level * 12 + 'px'
- },
- isDisabled() {
- return this.disabledFolderList.some((item) => {
- return item.id === this.folderInfo.id
- })
- },
- },
- methods: {
- onClickTopBar() {
- if (!this.isDisabled) {
- this.isExpanded = !this.isExpanded
- this.$emit('targeted', this.folderInfo.id)
- }
- },
- onSonTargeted(id) {
- this.$emit('targeted', id)
- }
- },
- mounted() {
- },
- destroyed() {
- }
- }
- </script>
- <style lang="less" scoped>
- .scene-group {
- user-select: none;
- .top-bar {
- position: relative;
- height: 40px;
- border-radius: 4px;
- display: flex;
- align-items: center;
- padding-right: 10px;
- &:hover {
- }
- &.highlight {
- background: #ebedf0;
- }
- &.disabled {
- opacity: 0.5;
- }
- > .icon-expand {
- display: inline-block;
- font-size: 12px;
- transform: scale(0.7);
- color: rgba(130, 134, 142, 1);
- flex: 0 0 auto;
- &.collapsed {
- display: inline-block;
- transform: scale(0.7) rotate(-90deg);
- }
- }
- > img.folder {
- margin-left: 7px;
- flex: 0 0 auto;
- width: 16px;
- &.collapsed {
- height: 16px;
- }
- &.opened {
- height: 14px;
- }
- }
- > .group-name {
- margin-left: 6px;
- display: inline-block;
- text-overflow: ellipsis;
- overflow: hidden;
- white-space: nowrap;
- flex: 1 1 auto;
- font-size: 14px;
- color: #323233;
- cursor: default;
- }
- }
- }
- </style>
|