kanvaso.ts 8,7 КБ
Newer Older
kv880888's avatar
kv880888 включено в состав коммита
1
2
import { defineStore, acceptHMRUpdate } from 'pinia';
import { apollo } from 'src/boot/apollo';
avathar's avatar
avathar включено в состав коммита
3
import { debugLog, copy } from 'src/utils';
avathar's avatar
avathar включено в состав коммита
4
import {
avathar's avatar
avathar включено в состав коммита
5
6
  kanvaso,
  kanvasojKanvasoFull,
avathar's avatar
avathar включено в состав коммита
7
  kanvasoObjekto,
avathar's avatar
avathar включено в состав коммита
8
9
10
} from '../queries/queries.js';
import {
  kanvasoEdit,
avathar's avatar
avathar включено в состав коммита
11
  kanvasoObjektoLigilo,
avathar's avatar
avathar включено в состав коммита
12
  redaktuKanvasojKanvasoObjekto,
avathar's avatar
avathar включено в состав коммита
13
} from 'src/queries/mutations.js';
avathar's avatar
avathar включено в состав коммита
14
15
16
17
18
import {
  TreeNode,
  KanvasoEventoj as KanvasoEvento,
} from 'src/types/stores/kanvaso';
import { KanvasoEventoj } from 'src/queries/subscriptions.js';
avathar's avatar
avathar включено в состав коммита
19

avathar's avatar
avathar включено в состав коммита
20
class ObjectWrapper {
avathar's avatar
avathar включено в состав коммита
21
  private _wrappingObject: any;
avathar's avatar
avathar включено в состав коммита
22
  constructor(wrappingObject: TreeNode) {
avathar's avatar
avathar включено в состав коммита
23
24
    this._wrappingObject = wrappingObject;
    this._wrappingObject.childrens = [];
avathar's avatar
avathar включено в состав коммита
25
  }
avathar's avatar
avathar включено в состав коммита
26

avathar's avatar
avathar включено в состав коммита
27
  get name(): string {
avathar's avatar
avathar включено в состав коммита
28
    return this._wrappingObject.nomo?.enhavo || 'Без имени';
avathar's avatar
avathar включено в состав коммита
29
  }
avathar's avatar
avathar включено в состав коммита
30
  get isPublished(): boolean {
avathar's avatar
avathar включено в состав коммита
31
    return this._wrappingObject.publikigo || true;
avathar's avatar
avathar включено в состав коммита
32
  }
avathar's avatar
avathar включено в состав коммита
33
  get isDeleted(): boolean {
avathar's avatar
avathar включено в состав коммита
34
    return this._wrappingObject.forigo || false;
avathar's avatar
avathar включено в состав коммита
35
  }
avathar's avatar
avathar включено в состав коммита
36
  get description(): string {
avathar's avatar
avathar включено в состав коммита
37
    return this._wrappingObject.priskribo?.enhavo || 'Нет описания';
avathar's avatar
avathar включено в состав коммита
38
  }
avathar's avatar
avathar включено в состав коммита
39
  get id(): number {
avathar's avatar
avathar включено в состав коммита
40
    return this._wrappingObject.objId || 0;
avathar's avatar
avathar включено в состав коммита
41
  }
avathar's avatar
avathar включено в состав коммита
42
  get uuid(): string {
avathar's avatar
avathar включено в состав коммита
43
    return this._wrappingObject.uuid || null;
avathar's avatar
avathar включено в состав коммита
44
  }
avathar's avatar
avathar включено в состав коммита
45
  get type(): string {
avathar's avatar
avathar включено в состав коммита
46
    return this._wrappingObject.tipo?.nomo?.enhavo || 'Без типа';
avathar's avatar
avathar включено в состав коммита
47
  }
avathar's avatar
avathar включено в состав коммита
48
  get typeId(): number {
avathar's avatar
avathar включено в состав коммита
49
    return this._wrappingObject.tipo?.objId || 0;
avathar's avatar
avathar включено в состав коммита
50
  }
avathar's avatar
avathar включено в состав коммита
51
  get parentUuid(): string {
avathar's avatar
avathar включено в состав коммита
52
    return (
avathar's avatar
avathar включено в состав коммита
53
      this._wrappingObject.kanvasojKanvasoobjektoligiloLigilo?.posedanto
avathar's avatar
avathar включено в состав коммита
54
        ?.uuid || ''
avathar's avatar
avathar включено в состав коммита
55
56
    );
  }
avathar's avatar
avathar включено в состав коммита
57
58
  get childrens(): ObjectWrapper[] {
    return this._wrappingObject.childrens || [];
avathar's avatar
avathar включено в состав коммита
59
  }
avathar's avatar
avathar включено в состав коммита
60
61
  setChildrens(childrens: ObjectWrapper | ObjectWrapper[]) {
    this._wrappingObject.childrens.push(childrens);
avathar's avatar
avathar включено в состав коммита
62
63
  }
  get hasParent() {
avathar's avatar
avathar включено в состав коммита
64
    return !!this._wrappingObject.kanvasojKanvasoobjektoligiloLigilo;
avathar's avatar
avathar включено в состав коммита
65
66
67
  }
}

kv880888's avatar
kv880888 включено в состав коммита
68
69
70
export const useKanvasoStore = defineStore('Kanvaso', {
  state: () => ({
    kanvaso: null,
avathar's avatar
avathar включено в состав коммита
71
    kanvasoObjektoMap: new Map(),
kv880888's avatar
kv880888 включено в состав коммита
72
73
  }),
  getters: {
avathar's avatar
avathar включено в состав коммита
74
    getMap: (state) => {
avathar's avatar
avathar включено в состав коммита
75
      return Array.from(state.kanvasoObjektoMap.values()) || [];
avathar's avatar
avathar включено в состав коммита
76
    },
avathar's avatar
avathar включено в состав коммита
77
    getTree: (state) => {
avathar's avatar
avathar включено в состав коммита
78
79
80
81
      //преобразуем Map в массив из значений
      const kanvasoObjektoArrFromMap = Array.from(
        state.kanvasoObjektoMap.values(),
      );
avathar's avatar
avathar включено в состав коммита
82
83
84
85
86
87

      /**
       * Преобразует плоский массив в древовидную структуру.
       * @param flatArray Плоский массив объектов.
       * @returns Древовидная структура.
       */
avathar's avatar
avathar включено в состав коммита
88
      function convertToTree(nodes: ObjectWrapper[]): ObjectWrapper[] {
avathar's avatar
avathar включено в состав коммита
89
        // Создаем объект для быстрого доступа к каждому узлу по его UUID.
avathar's avatar
avathar включено в состав коммита
90
        const nodeMap: Record<string, ObjectWrapper> = {};
avathar's avatar
avathar включено в состав коммита
91
        // Инициализируем nodeMap и добавляем каждому узлу пустой массив children и геттеры для получения свойств
avathar's avatar
avathar включено в состав коммита
92
        nodes.forEach((node) => {
avathar's avatar
avathar включено в состав коммита
93
          nodeMap[node.uuid] = node;
avathar's avatar
avathar включено в состав коммита
94
95
96
        });

        // Фильтруем узлы, чтобы сохранить только корневые узлы в результирующем массиве.
avathar's avatar
avathar включено в состав коммита
97
        const tree: ObjectWrapper[] = nodes.filter((node) => {
avathar's avatar
avathar включено в состав коммита
98
99
100
          // Если у узла есть uuid родителя, добавляем его в children его родителя.
          if (node.hasParent) {
            const parent = nodeMap[node.parentUuid];
avathar's avatar
avathar включено в состав коммита
101
            if (parent) {
avathar's avatar
avathar включено в состав коммита
102
              parent.setChildrens(node);
avathar's avatar
avathar включено в состав коммита
103
104
105
106
107
108
109
110
111
            }
            // Узел не является корневым, поэтому исключаем его из результирующего массива.
            return false;
          }
          // Узел является корневым.
          return true;
        });
        return tree;
      }
avathar's avatar
avathar включено в состав коммита
112
      return convertToTree(kanvasoObjektoArrFromMap);
avathar's avatar
avathar включено в состав коммита
113
    },
kv880888's avatar
kv880888 включено в состав коммита
114
115
116
117
118
119
120
121
    getKanvaso: (state) => {
      return state.kanvaso;
    },
    getKanvasoLength: (state) => {
      return state.kanvaso ? state.kanvaso.length : 0;
    },
  },
  actions: {
122
    async onGetKanvaso(payload) {
kv880888's avatar
kv880888 включено в состав коммита
123
124
125
126
      debugLog('on get kanvaso');
      try {
        const response = await apollo.default.query({
          query: kanvaso,
127
          variables: payload,
kv880888's avatar
kv880888 включено в состав коммита
128
129
130
          errorPolicy: 'all',
          fetchPolicy: 'network-only',
        });
avathar's avatar
avathar включено в состав коммита
131
        debugLog('get kanvaso response: ', response);
kv880888's avatar
kv880888 включено в состав коммита
132
133
134
135
136
137
        this.kanvaso = response.data.kanvasojKanvaso.edges;
        return Promise.resolve(response);
      } catch (err) {
        return Promise.reject(err);
      }
    },
avathar's avatar
avathar включено в состав коммита
138
139
140
141
142
143
144
145
146
    async onGetKanvasoFull(payload) {
      debugLog('on get kanvaso full');
      try {
        const response = await apollo.default.query({
          query: kanvasojKanvasoFull,
          variables: payload,
          errorPolicy: 'all',
          fetchPolicy: 'network-only',
        });
avathar's avatar
avathar включено в состав коммита
147
        debugLog('get kanvaso full response: ', response);
avathar's avatar
avathar включено в состав коммита
148
149
150
151
152
153
        this.kanvaso = response.data.kanvasojKanvaso.edges;
        return Promise.resolve(response);
      } catch (err) {
        return Promise.reject(err);
      }
    },
avathar's avatar
avathar включено в состав коммита
154
155
156
157
158
159
160
161
162
    async onGetKanvasoObjekto(payload) {
      debugLog('on get kanvaso objekto');
      try {
        const response = await apollo.default.query({
          query: kanvasoObjekto,
          variables: payload,
          errorPolicy: 'all',
          fetchPolicy: 'network-only',
        });
avathar's avatar
avathar включено в состав коммита
163
        debugLog('get kanvaso objekto response: ', response);
avathar's avatar
avathar включено в состав коммита
164
165
        const kanvasoObjektoArr =
          response.data.kanvasojKanvasoObjekto?.edges || [];
avathar's avatar
avathar включено в состав коммита
166
        this.kanvasoObjektoMap.clear();
avathar's avatar
avathar включено в состав коммита
167
        kanvasoObjektoArr.forEach((item) => {
avathar's avatar
#88 fix    
avathar включено в состав коммита
168
          if (item.node?.uuid) {
avathar's avatar
avathar включено в состав коммита
169
170
            this.kanvasoObjektoMap.set(
              item.node.uuid,
avathar's avatar
avathar включено в состав коммита
171
              new ObjectWrapper(JSON.parse(JSON.stringify(item.node))),
avathar's avatar
avathar включено в состав коммита
172
            );
avathar's avatar
#88 fix    
avathar включено в состав коммита
173
          }
avathar's avatar
avathar включено в состав коммита
174
        });
avathar's avatar
avathar включено в состав коммита
175
176
177
178
179
        return Promise.resolve(response);
      } catch (err) {
        return Promise.reject(err);
      }
    },
kv880888's avatar
kv880888 включено в состав коммита
180

avathar's avatar
avathar включено в состав коммита
181
    async onEditKanvaso(payload) {
kv880888's avatar
kv880888 включено в состав коммита
182
183
184
185
186
187
188
189
      debugLog('on edit kanvaso');
      try {
        const response = await apollo.default.mutate({
          mutation: kanvasoEdit,
          variables: payload,
          errorPolicy: 'all',
          fetchPolicy: 'network-only',
        });
avathar's avatar
avathar включено в состав коммита
190
        debugLog('edit kanvaso response: ', response);
avathar's avatar
avathar включено в состав коммита
191
192
193
194
195
        if (response.data?.redaktuKanvasojKanvaso?.status) {
          return Promise.resolve(true);
        } else {
          return Promise.reject(response);
        }
kv880888's avatar
kv880888 включено в состав коммита
196
197
198
199
      } catch (err) {
        return Promise.reject(err);
      }
    },
avathar's avatar
avathar включено в состав коммита
200
201
202
203
    async onEditKanvasoObjekto(payload) {
      debugLog('on edit kanvaso objekto');
      try {
        const response = await apollo.default.mutate({
avathar's avatar
avathar включено в состав коммита
204
          mutation: redaktuKanvasojKanvasoObjekto,
avathar's avatar
avathar включено в состав коммита
205
206
207
208
          variables: payload,
          errorPolicy: 'all',
          fetchPolicy: 'network-only',
        });
avathar's avatar
avathar включено в состав коммита
209
        debugLog('edit kanvaso objekto response: ', response);
avathar's avatar
avathar включено в состав коммита
210
211
212
213
214
        if (response.data?.redaktuKanvasojKanvasoObjekto?.status) {
          return Promise.resolve(true);
        } else {
          return Promise.reject(response);
        }
avathar's avatar
avathar включено в состав коммита
215
216
217
218
219
220
221
222
223
224
225
226
227
      } catch (err) {
        return Promise.reject(err);
      }
    },
    async onEditKanvasoLigilo(payload) {
      debugLog('on edit kanvaso ligilo');
      try {
        const response = await apollo.default.mutate({
          mutation: kanvasoObjektoLigilo,
          variables: payload,
          errorPolicy: 'all',
          fetchPolicy: 'network-only',
        });
avathar's avatar
avathar включено в состав коммита
228
        debugLog('edit kanvaso ligilo response: ', response);
avathar's avatar
avathar включено в состав коммита
229
230
231
232
233
234
        // this.kanvaso = response.data.kanvasojKanvaso.edges;
        return Promise.resolve(response);
      } catch (err) {
        return Promise.reject(err);
      }
    },
avathar's avatar
avathar включено в состав коммита
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
    async onKanvasoSubscribe(payload) {
      debugLog('on kanvaso subscribe');
      try {
        const _this = this;
        const response = await apollo.default
          .subscribe({
            query: KanvasoEventoj,
            variables: payload,
          })
          .subscribe({
            next(data) {
              const evento: KanvasoEvento = data.data.KanvasoEventoj;
              if (evento) {
                const { objekto } = evento;
                if (objekto) {
                  if (objekto.forigo === true) {
                    _this.kanvasoObjektoMap.delete(objekto.uuid);
avathar's avatar
avathar включено в состав коммита
252
253
254
                  } else
                    _this.kanvasoObjektoMap.set(
                      objekto.uuid,
avathar's avatar
avathar включено в состав коммита
255
                      new ObjectWrapper(JSON.parse(JSON.stringify(objekto))),
avathar's avatar
avathar включено в состав коммита
256
                    );
avathar's avatar
avathar включено в состав коммита
257
258
259
260
261
262
263
264
265
                }
              }
            },
          });
        return response;
      } catch {
        console.log('KanvasoEventoj subscribe error');
      }
    },
kv880888's avatar
kv880888 включено в состав коммита
266
267
  },
});
avathar's avatar
avathar включено в состав коммита
268
//@ts-ignore
kv880888's avatar
kv880888 включено в состав коммита
269
if (import.meta.hot) {
avathar's avatar
avathar включено в состав коммита
270
  //@ts-ignore
kv880888's avatar
kv880888 включено в состав коммита
271
272
  import.meta.hot.accept(acceptHMRUpdate(useKanvasoStore, import.meta.hot));
}