TreeNode.vue 3,1 КБ
Newer Older
avathar's avatar
avathar включено в состав коммита
1
2
3
4
5
6
<template>
  <q-card flat style="border: tomato 2px solid; padding: 10px; margin: 10px">
    <!-- Отображаем текущий узел -->
    <q-card-section horizontal>
      <div>
        <div>
avathar's avatar
avathar включено в состав коммита
7
          <!-- {{ node.nomo.enhavo }} -->
avathar's avatar
avathar включено в состав коммита
8
9
          {{ node.name }}
          <span class="text-green">{{ node.childrens.length }}</span>
avathar's avatar
avathar включено в состав коммита
10
11
          <span v-if="isAdmin">
            <q-icon
avathar's avatar
avathar включено в состав коммита
12
              v-if="node.isPublished"
avathar's avatar
avathar включено в состав коммита
13
14
15
16
17
18
19
              color="blue"
              name="published_with_changes"
            />
            <q-icon v-else color="grey" name="unpublished" />
          </span>

          <span v-if="isAdmin">
avathar's avatar
avathar включено в состав коммита
20
            <q-icon
avathar's avatar
avathar включено в состав коммита
21
              v-if="node.isDeleted"
avathar's avatar
avathar включено в состав коммита
22
23
24
              color="orange"
              name="delete_forever"
            />
avathar's avatar
avathar включено в состав коммита
25
26
27
28
            <q-icon v-else color="grey" name="delete_forever" />
          </span>
        </div>
        <div class="text-subtitle1">
avathar's avatar
avathar включено в состав коммита
29
          {{ node.description }}
avathar's avatar
avathar включено в состав коммита
30
31
32
        </div>

        <div class="text-subtitle2 text-brown">
avathar's avatar
avathar включено в состав коммита
33
          {{ node.uuid }}
avathar's avatar
avathar включено в состав коммита
34
35
        </div>
        <div class="text-subtitle2 text-green">
avathar's avatar
avathar включено в состав коммита
36
          {{ node.type }}
avathar's avatar
avathar включено в состав коммита
37
38
39
40
41
42
43
44
45
46
47
48
49
50
        </div>
      </div>
      <!-- <pre class="text-caption text-brown">{{ node }}</pre> -->
      <q-card-actions align="right" vertical>
        <q-btn
          flat
          round
          color="primary"
          icon="edit"
          @click="emitEvent('edit', node)"
        >
          <q-tooltip> Редактирование </q-tooltip>
        </q-btn>
        <q-btn
avathar's avatar
avathar включено в состав коммита
51
          v-if="node.typeId < 4"
avathar's avatar
avathar включено в состав коммита
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
          flat
          round
          color="teal"
          icon="add"
          @click="emitEvent('add', node)"
        >
          <q-tooltip> Добавить потомка </q-tooltip>
        </q-btn>
        <q-btn
          flat
          round
          color="red"
          icon="delete"
          @click="emitEvent('delete', node)"
        >
          <q-tooltip> Удалить </q-tooltip>
        </q-btn>
      </q-card-actions>
    </q-card-section>

    <!-- Рекурсивно отображаем дочерние узлы -->
    <q-card-section
avathar's avatar
avathar включено в состав коммита
74
      v-if="node && node.childrens.length"
avathar's avatar
avathar включено в состав коммита
75
76
      class="q-pa-md row items-start q-gutter-md"
    >
avathar's avatar
avathar включено в состав коммита
77
      <template v-for="child in node.childrens" :key="child.uuid">
avathar's avatar
avathar включено в состав коммита
78
79
80
81
82
83
84
85
86
87
88
89
90
        <tree-node
          :node="child"
          @edit="$emit('edit', $event)"
          @add="$emit('add', $event)"
          @delete="$emit('delete', $event)"
        ></tree-node>
      </template>
    </q-card-section>
  </q-card>
</template>

<script lang="ts">
import { defineComponent, PropType } from 'vue';
avathar's avatar
avathar включено в состав коммита
91
import { mapState } from 'pinia';
avathar's avatar
avathar включено в состав коммита
92
93
94
95
96
97
import { useCurrentUserStore } from '../stores/current-user';
import { debugLog } from '../utils';
export default defineComponent({
  name: 'TreeNode',
  props: {
    node: {
avathar's avatar
avathar включено в состав коммита
98
      type: Object,
avathar's avatar
avathar включено в состав коммита
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
      required: true,
    },
  },
  components: {
    // Рекурсивное подключение компонента
    TreeNode: () => import('./TreeNode.vue'),
  },
  methods: {
    emitEvent(action, node) {
      this.$emit(action, node);
    },
  },
  computed: {
    ...mapState(useCurrentUserStore, ['isAdmin']),
  },
});
</script>