@coopenomics/desktop 2025.6.19 → 2025.6.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,156 +1,198 @@
1
1
  <template lang="pug">
2
- q-dialog(:model-value="modelValue" @update:model-value="$emit('update:modelValue', $event)" persistent)
3
- q-card(style="min-width: 500px")
2
+ q-dialog(
3
+ :model-value='modelValue',
4
+ @update:model-value='$emit("update:modelValue", $event)',
5
+ persistent
6
+ )
7
+ q-card(style='min-width: 500px')
4
8
  q-card-section.row.items-center
5
- div.text-h6 Создать общее собрание {{ isChairman ? '(Председатель)' : '(Член совета)' }}
9
+ .text-h6 Создать общее собрание {{ isChairman ? '(Председатель)' : '(Член совета)' }}
6
10
  q-space
7
- q-btn(icon="close" flat round dense v-close-popup @click="$emit('update:modelValue', false)")
11
+ q-btn(
12
+ icon='close',
13
+ flat,
14
+ round,
15
+ dense,
16
+ v-close-popup,
17
+ @click='$emit("update:modelValue", false)'
18
+ )
8
19
 
9
20
  q-card-section
10
- q-form(@submit="handleSubmit")
21
+ q-form(@submit='handleSubmit')
11
22
  // Выбор типа собрания
12
23
  q-select(
13
- v-model="formData.type"
14
- :options="meetTypeOptions"
15
- label="Тип собрания"
16
- emit-value
17
- map-options
18
- :rules="[val => !!val || 'Обязательное поле']"
24
+ v-model='formData.type',
25
+ :options='meetTypeOptions',
26
+ label='Тип собрания',
27
+ emit-value,
28
+ map-options,
29
+ :rules='[(val) => !!val || "Обязательное поле"]',
19
30
  dense
20
31
  )
21
32
 
22
- q-input(
23
- v-model="formData.presider"
24
- label="Имя аккаунта председателя собрания"
25
- :rules="[val => !!val || 'Обязательное поле']"
33
+ UserSearchSelector(
34
+ v-model='formData.presider',
35
+ label='Председатель собрания',
36
+ :rules='[(val) => !!val || "Обязательное поле"]',
26
37
  dense
27
38
  )
28
- q-input(
29
- v-model="formData.secretary"
30
- label="Имя аккаунта секретаря собрания"
31
- :rules="[val => !!val || 'Обязательное поле']"
39
+
40
+ UserSearchSelector(
41
+ v-model='formData.secretary',
42
+ label='Секретарь собрания',
43
+ :rules='[(val) => !!val || "Обязательное поле"]',
32
44
  dense
33
45
  )
34
46
  q-input(
35
- v-model="formData.open_at"
36
- :label="env.NODE_ENV === 'development' ? `Дата и время открытия (мин. через 1 минуту, ${timezoneLabel})` : `Дата и время открытия (мин. через 15 дней, ${timezoneLabel})`"
37
- type="datetime-local"
38
- :rules="[val => !!val || 'Обязательное поле']"
47
+ v-model='formData.open_at',
48
+ :label='env.NODE_ENV === "development" ? `Дата и время открытия (мин. через 1 минуту, ${timezoneLabel})` : `Дата и время открытия (мин. через 15 дней, ${timezoneLabel})`',
49
+ type='datetime-local',
50
+ :rules='[(val) => !!val || "Обязательное поле"]',
39
51
  dense
40
52
  )
41
53
  q-input(
42
- v-model="formData.close_at"
43
- :label="`Дата и время закрытия (${timezoneLabel})`"
44
- type="datetime-local"
45
- :rules="[val => !!val || 'Обязательное поле']"
54
+ v-model='formData.close_at',
55
+ :label='`Дата и время закрытия (${timezoneLabel})`',
56
+ type='datetime-local',
57
+ :rules='[(val) => !!val || "Обязательное поле"]',
46
58
  dense
47
59
  )
48
60
 
61
+ .text-h6.q-mt-md Повестка собрания
49
62
 
50
- div.text-h6.q-mt-md Повестка собрания
51
-
52
- q-card(flat bordered v-for="(point, index) in formData.agenda_points" :key="index").q-mb-lg.q-pa-sm
53
- div.row.items-center.q-mb-sm
54
- div.text-subtitle1.q-mr-md № {{ index + 1 }}
55
- div.col-auto
56
- q-btn(flat icon="delete" size="sm" color="grey" @click="removeAgendaPoint(index)")
57
-
58
- div.q-mb-sm
63
+ q-card.q-mb-lg.q-pa-sm(
64
+ flat,
65
+ bordered,
66
+ v-for='(point, index) in formData.agenda_points',
67
+ :key='index'
68
+ )
69
+ .row.items-center.q-mb-sm
70
+ .text-subtitle1.q-mr-md № {{ index + 1 }}
71
+ .col-auto
72
+ q-btn(
73
+ flat,
74
+ icon='delete',
75
+ size='sm',
76
+ color='grey',
77
+ @click='removeAgendaPoint(index)'
78
+ )
79
+
80
+ .q-mb-sm
59
81
  q-input(
60
- v-model="point.title"
61
- label="Вопрос"
62
- :rules="[val => !!val || 'Обязательное поле']"
63
- dense
64
- type="textarea"
82
+ v-model='point.title',
83
+ label='Вопрос',
84
+ :rules='[(val) => !!val || "Обязательное поле"]',
85
+ dense,
86
+ type='textarea',
65
87
  autogrow
66
88
  )
67
89
 
68
- div.q-mb-sm
90
+ .q-mb-sm
69
91
  q-input(
70
- v-model="point.decision"
71
- label="Проект Решения"
72
- :rules="[val => !!val || 'Обязательное поле']"
73
- dense
74
- type="textarea"
92
+ v-model='point.decision',
93
+ label='Проект Решения',
94
+ :rules='[(val) => !!val || "Обязательное поле"]',
95
+ dense,
96
+ type='textarea',
75
97
  autogrow
76
98
  )
77
99
 
78
- div.q-mb-sm
100
+ .q-mb-sm
79
101
  q-input(
80
- v-model="point.context"
81
- label="Приложения"
82
- :rules="[val => !!val || 'Обязательное поле']"
83
- dense
84
- type="textarea"
102
+ v-model='point.context',
103
+ label='Приложения',
104
+ :rules='[(val) => !!val || "Обязательное поле"]',
105
+ dense,
106
+ type='textarea',
85
107
  autogrow
86
108
  )
87
109
 
88
- q-separator(v-if="index < formData.agenda_points.length - 1")
110
+ q-separator(v-if='index < formData.agenda_points.length - 1')
89
111
 
90
- div.text-center.q-mb-md
91
- q-btn(outline label="Добавить пункт повестки" @click="addAgendaPoint")
112
+ .text-center.q-mb-md
113
+ q-btn(
114
+ outline,
115
+ label='Добавить пункт повестки',
116
+ @click='addAgendaPoint'
117
+ )
92
118
 
93
119
  q-card-section.q-pt-none
94
- div.text-caption.text-grey При создании собрания будет сгенерирован документ повестки.
95
-
96
- q-card-actions(align="right")
97
- q-btn(flat label="Отмена" v-close-popup @click="$emit('update:modelValue', false)" :disable="loading")
98
- q-btn(color="primary" label="Создать" type="submit" @click="handleSubmit" :loading="loading" )
120
+ .text-caption.text-grey При создании собрания будет сгенерирован документ повестки.
121
+
122
+ q-card-actions(align='right')
123
+ q-btn(
124
+ flat,
125
+ label='Отмена',
126
+ v-close-popup,
127
+ @click='$emit("update:modelValue", false)',
128
+ :disable='loading'
129
+ )
130
+ q-btn(
131
+ color='primary',
132
+ label='Создать',
133
+ type='submit',
134
+ @click='handleSubmit',
135
+ :loading='loading'
136
+ )
99
137
  </template>
100
138
 
101
139
  <script setup lang="ts">
102
- import { reactive, computed, onMounted } from 'vue'
103
- import { useAgendaPoints } from 'src/shared/hooks/useAgendaPoints'
104
- import { getCurrentLocalDateForForm, convertLocalDateToUTC, getTimezoneLabel, getFutureDateForForm } from 'src/shared/lib/utils/dates/timezone'
105
- import { env } from 'src/shared/config/Environment'
140
+ import { reactive, computed, onMounted } from 'vue';
141
+ import { useAgendaPoints } from 'src/shared/hooks/useAgendaPoints';
142
+ import {
143
+ getCurrentLocalDateForForm,
144
+ convertLocalDateToUTC,
145
+ getTimezoneLabel,
146
+ getFutureDateForForm,
147
+ } from 'src/shared/lib/utils/dates/timezone';
148
+ import { env } from 'src/shared/config/Environment';
106
149
  import { useSessionStore } from 'src/entities/Session';
107
150
  import { useSystemStore } from 'src/entities/System/model';
151
+ import { UserSearchSelector } from 'src/shared/ui';
108
152
 
109
153
  // Определяем пропсы один раз
110
154
  const props = defineProps<{
111
- modelValue: boolean,
112
- loading?: boolean,
113
- isChairman: boolean
114
- }>()
155
+ modelValue: boolean;
156
+ loading?: boolean;
157
+ isChairman: boolean;
158
+ }>();
115
159
 
116
160
  // Отладочная информация при монтировании
117
161
  onMounted(() => {
118
- console.log('CreateMeetForm mounted, isChairman:', props.isChairman)
119
- })
162
+ console.log('CreateMeetForm mounted, isChairman:', props.isChairman);
163
+ });
120
164
 
121
165
  const emit = defineEmits<{
122
- (e: 'update:modelValue', value: boolean): void
123
- (e: 'create', data: any): void
124
- }>()
166
+ (e: 'update:modelValue', value: boolean): void;
167
+ (e: 'create', data: any): void;
168
+ }>();
125
169
 
126
170
  // Название часового пояса для отображения в лейблах
127
- const timezoneLabel = getTimezoneLabel()
128
- const session = useSessionStore()
129
- const system = useSystemStore()
171
+ const timezoneLabel = getTimezoneLabel();
172
+ const session = useSessionStore();
173
+ const system = useSystemStore();
130
174
 
131
175
  // Делаем isChairman доступным в шаблоне напрямую для отладки
132
176
  const isChairman = computed(() => {
133
- console.log('Вычисляемое свойство isChairman:', props.isChairman)
134
- return props.isChairman
135
- })
177
+ console.log('Вычисляемое свойство isChairman:', props.isChairman);
178
+ return props.isChairman;
179
+ });
136
180
 
137
181
  // Опции для выбора типа собрания в зависимости от роли
138
182
  const meetTypeOptions = computed(() => {
139
183
  // Выведем отладочную информацию, чтобы увидеть значение флага
140
- console.log('isChairman в форме для опций:', props.isChairman)
184
+ console.log('isChairman в форме для опций:', props.isChairman);
141
185
 
142
186
  // Председатель может выбирать любой тип
143
187
  if (props.isChairman) {
144
188
  return [
145
189
  { label: 'Очередное собрание', value: 'regular' },
146
- { label: 'Внеочередное собрание', value: 'extra' }
147
- ]
190
+ { label: 'Внеочередное собрание', value: 'extra' },
191
+ ];
148
192
  }
149
193
  // Члены совета могут создавать только внеочередное
150
- return [
151
- { label: 'Внеочередное собрание', value: 'extra' }
152
- ]
153
- })
194
+ return [{ label: 'Внеочередное собрание', value: 'extra' }];
195
+ });
154
196
 
155
197
  // Форма для создания собрания
156
198
  const formData = reactive(
@@ -184,19 +226,21 @@ const formData = reactive(
184
226
  agenda_points: [
185
227
  // пустой массив, либо можно добавить пустой объект для вёрстки
186
228
  ],
187
- }
188
- )
229
+ },
230
+ );
189
231
 
190
- const { addAgendaPoint, removeAgendaPoint } = useAgendaPoints(formData.agenda_points)
232
+ const { addAgendaPoint, removeAgendaPoint } = useAgendaPoints(
233
+ formData.agenda_points,
234
+ );
191
235
 
192
236
  const handleSubmit = () => {
193
237
  // Конвертируем локальные даты в UTC для отправки в блокчейн
194
238
  const dataToSend = {
195
239
  ...formData,
196
240
  open_at: convertLocalDateToUTC(formData.open_at),
197
- close_at: convertLocalDateToUTC(formData.close_at)
198
- }
241
+ close_at: convertLocalDateToUTC(formData.close_at),
242
+ };
199
243
 
200
- emit('create', dataToSend)
201
- }
244
+ emit('create', dataToSend);
245
+ };
202
246
  </script>
@@ -1,128 +1,190 @@
1
1
  <template lang="pug">
2
- q-dialog(:model-value="modelValue" @update:model-value="$emit('update:modelValue', $event)" persistent)
3
- q-card(style="min-width: 500px")
2
+ q-dialog(
3
+ :model-value='modelValue',
4
+ @update:model-value='$emit("update:modelValue", $event)',
5
+ persistent
6
+ )
7
+ q-card(style='min-width: 500px')
4
8
  q-card-section.row.items-center
5
- div.text-h6 Перезапустить собрание
9
+ .text-h6 Перезапустить собрание
6
10
  q-space
7
- q-btn(icon="close" flat round dense v-close-popup @click="$emit('update:modelValue', false)")
11
+ q-btn(
12
+ icon='close',
13
+ flat,
14
+ round,
15
+ dense,
16
+ v-close-popup,
17
+ @click='$emit("update:modelValue", false)'
18
+ )
8
19
  q-card-section
9
- q-form(@submit="handleSubmit")
10
- div.text-subtitle1.q-mb-sm Выберите новые даты для собрания
11
- q-input(
12
- v-model="formData.new_open_at"
13
- :label="env.NODE_ENV === 'development' ? `Новая дата и время открытия (мин. через 1 минуту, ${timezoneLabel})` : `Новая дата и время открытия (мин. через 15 дней, ${timezoneLabel})`"
14
- type="datetime-local"
15
- :rules="[val => !!val || 'Обязательное поле']"
20
+ q-form(@submit='handleSubmit')
21
+ .text-subtitle1.q-mb-sm Выберите новые даты и ответственных для собрания
22
+
23
+ UserSearchSelector.q-mb-md(
24
+ v-model='formData.new_presider',
25
+ label='Председатель собрания',
26
+ :rules='[(val) => !!val || "Обязательное поле"]',
27
+ dense
28
+ )
29
+
30
+ UserSearchSelector.q-mb-md(
31
+ v-model='formData.new_secretary',
32
+ label='Секретарь собрания',
33
+ :rules='[(val) => !!val || "Обязательное поле"]',
34
+ dense
35
+ )
36
+
37
+ q-input.q-mb-md(
38
+ v-model='formData.new_open_at',
39
+ :label='env.NODE_ENV === "development" ? `Новая дата и время открытия (мин. через 1 минуту, ${timezoneLabel})` : `Новая дата и время открытия (мин. через 15 дней, ${timezoneLabel})`',
40
+ type='datetime-local',
41
+ :rules='[(val) => !!val || "Обязательное поле"]',
16
42
  dense
17
- class="q-mb-md"
18
43
  )
19
- q-input(
20
- v-model="formData.new_close_at"
21
- :label="`Новая дата и время закрытия (${timezoneLabel})`"
22
- type="datetime-local"
23
- :rules="[val => !!val || 'Обязательное поле']"
44
+ q-input.q-mb-md(
45
+ v-model='formData.new_close_at',
46
+ :label='`Новая дата и время закрытия (${timezoneLabel})`',
47
+ type='datetime-local',
48
+ :rules='[(val) => !!val || "Обязательное поле"]',
24
49
  dense
25
- class="q-mb-md"
26
50
  )
27
51
 
28
- div.text-subtitle1.q-mb-sm При перезапуске собрания будут использованы существующие пункты повестки:
52
+ .text-subtitle1.q-mb-sm При перезапуске собрания будут использованы существующие пункты повестки:
29
53
 
30
- q-card(bordered flat v-if="meetStore.currentMeet?.processing?.questions?.length").q-pa-xs.q-my-sm.rounded-borders.bg-grey-1
31
- div.q-mb-xs.flex.items-start(v-for="(question, index) in meetStore.currentMeet.processing.questions" :key="index").q-mb-lg.q-pa-xs
32
- AgendaNumberAvatar(:number="index + 1" size="22px" class="q-mr-xs")
33
- div.col
34
- div.text-body2.text-weight-medium.q-mb-2 {{ question.title }}
35
- div.text-caption.q-mb-1.q-mt-md
54
+ q-card.q-pa-xs.q-my-sm.rounded-borders.bg-grey-1(
55
+ bordered,
56
+ flat,
57
+ v-if='meetStore.currentMeet?.processing?.questions?.length'
58
+ )
59
+ .q-mb-xs.flex.items-start.q-mb-lg.q-pa-xs(
60
+ v-for='(question, index) in meetStore.currentMeet.processing.questions',
61
+ :key='index'
62
+ )
63
+ AgendaNumberAvatar.q-mr-xs(:number='index + 1', size='22px')
64
+ .col
65
+ .text-body2.text-weight-medium.q-mb-2 {{ question.title }}
66
+ .text-caption.q-mb-1.q-mt-md
36
67
  span.text-weight-bold.text-black Проект решения:
37
- span.text-black.q-ml-xs {{question.decision }}
38
- div.text-caption.q-mt-md
68
+ span.text-black.q-ml-xs {{ question.decision }}
69
+ .text-caption.q-mt-md
39
70
  span.text-weight-bold.text-black Приложения:
40
- span.text-black(v-if="question.context" v-html="parseLinks(question.context)").q-ml-xs
71
+ span.text-black.q-ml-xs(
72
+ v-if='question.context',
73
+ v-html='parseLinks(question.context)'
74
+ )
41
75
  span.text-black(v-else) —
42
76
 
43
- div.q-pa-sm.q-my-sm.bg-red-1.text-red-8.rounded-borders(v-else)
44
- div.text-center Вопросы повестки не найдены
77
+ .q-pa-sm.q-my-sm.bg-red-1.text-red-8.rounded-borders(v-else)
78
+ .text-center Вопросы повестки не найдены
45
79
 
46
- q-card-actions(align="right")
47
- q-btn(flat label="Отмена" v-close-popup @click="$emit('update:modelValue', false)" :disable="loading")
80
+ q-card-actions(align='right')
81
+ q-btn(
82
+ flat,
83
+ label='Отмена',
84
+ v-close-popup,
85
+ @click='$emit("update:modelValue", false)',
86
+ :disable='loading'
87
+ )
48
88
  q-btn(
49
- color="primary"
50
- label="Перезапустить"
51
- type="submit"
52
- @click="handleSubmit"
53
- :loading="loading"
54
- :disable="!meetStore.currentMeet?.processing?.questions?.length"
89
+ color='primary',
90
+ label='Перезапустить',
91
+ type='submit',
92
+ @click='handleSubmit',
93
+ :loading='loading',
94
+ :disable='!meetStore.currentMeet?.processing?.questions?.length'
55
95
  )
56
96
  </template>
57
97
 
58
98
  <script setup lang="ts">
59
- import { reactive, watch } from 'vue'
60
- import { useMeetStore } from 'src/entities/Meet'
61
- import { getCurrentLocalDateForForm, convertLocalDateToUTC, getTimezoneLabel, getFutureDateForForm } from 'src/shared/lib/utils/dates/timezone'
62
- import { env } from 'src/shared/config/Environment'
63
- import { AgendaNumberAvatar } from 'src/shared/ui/AgendaNumberAvatar'
64
- import { parseLinks } from 'src/shared/lib/utils'
99
+ import { reactive, watch } from 'vue';
100
+ import { useMeetStore } from 'src/entities/Meet';
101
+ import {
102
+ getCurrentLocalDateForForm,
103
+ convertLocalDateToUTC,
104
+ getTimezoneLabel,
105
+ getFutureDateForForm,
106
+ } from 'src/shared/lib/utils/dates/timezone';
107
+ import { env } from 'src/shared/config/Environment';
108
+ import { AgendaNumberAvatar } from 'src/shared/ui/AgendaNumberAvatar';
109
+ import { UserSearchSelector } from 'src/shared/ui';
110
+ import { parseLinks } from 'src/shared/lib/utils';
65
111
  const props = defineProps<{
66
- modelValue: boolean,
67
- loading?: boolean
68
- }>()
112
+ modelValue: boolean;
113
+ loading?: boolean;
114
+ }>();
69
115
 
70
116
  const emit = defineEmits<{
71
- (e: 'update:modelValue', value: boolean): void
72
- (e: 'restart', data: any): void
73
- }>()
117
+ (e: 'update:modelValue', value: boolean): void;
118
+ (e: 'restart', data: any): void;
119
+ }>();
74
120
 
75
- const meetStore = useMeetStore()
121
+ const meetStore = useMeetStore();
76
122
 
77
123
  // Название часового пояса для отображения в лейблах
78
- const timezoneLabel = getTimezoneLabel()
124
+ const timezoneLabel = getTimezoneLabel();
79
125
 
80
126
  // Форма для перезапуска собрания
81
127
  const formData = reactive(
82
128
  env.NODE_ENV === 'development'
83
129
  ? {
130
+ new_presider: '',
131
+ new_secretary: '',
84
132
  new_open_at: getCurrentLocalDateForForm(0.17),
85
133
  new_close_at: getCurrentLocalDateForForm(1),
86
134
  }
87
135
  : {
136
+ new_presider: '',
137
+ new_secretary: '',
88
138
  new_open_at: getFutureDateForForm(15, 6, 0),
89
139
  new_close_at: getFutureDateForForm(18, 12, 0),
90
- }
91
- )
140
+ },
141
+ );
92
142
 
93
143
  // Сброс формы при открытии диалога
94
- watch(() => props.modelValue, (newVal) => {
95
- if (newVal) {
96
- if (env.NODE_ENV === 'development') {
97
- formData.new_open_at = getCurrentLocalDateForForm(0.17)
98
- formData.new_close_at = getCurrentLocalDateForForm(1)
99
- } else {
100
- formData.new_open_at = getFutureDateForForm(15, 6, 0)
101
- formData.new_close_at = getFutureDateForForm(18, 12, 0)
144
+ watch(
145
+ () => props.modelValue,
146
+ (newVal) => {
147
+ if (newVal) {
148
+ // Предзаполняем текущими данными собрания
149
+ const currentMeet = meetStore.currentMeet;
150
+ if (currentMeet?.processing?.meet) {
151
+ formData.new_presider = currentMeet.processing.meet.presider;
152
+ formData.new_secretary = currentMeet.processing.meet.secretary;
153
+ }
154
+
155
+ if (env.NODE_ENV === 'development') {
156
+ formData.new_open_at = getCurrentLocalDateForForm(0.17);
157
+ formData.new_close_at = getCurrentLocalDateForForm(1);
158
+ } else {
159
+ formData.new_open_at = getFutureDateForForm(15, 6, 0);
160
+ formData.new_close_at = getFutureDateForForm(18, 12, 0);
161
+ }
102
162
  }
103
- }
104
- })
163
+ },
164
+ );
105
165
 
106
166
  const handleSubmit = () => {
107
- const meet = meetStore.currentMeet
108
- if (!meet) return
167
+ const meet = meetStore.currentMeet;
168
+ if (!meet) return;
109
169
 
110
170
  // Проверяем наличие вопросов повестки
111
171
  if (!meet.processing?.questions || meet.processing.questions.length === 0) {
112
- return
172
+ return;
113
173
  }
114
174
 
115
175
  // Конвертируем локальные даты в UTC для отправки в блокчейн
116
176
  const dataToSend = {
177
+ new_presider: formData.new_presider,
178
+ new_secretary: formData.new_secretary,
117
179
  new_open_at: convertLocalDateToUTC(formData.new_open_at),
118
180
  new_close_at: convertLocalDateToUTC(formData.new_close_at),
119
- agenda_points: meet.processing.questions.map(q => ({
181
+ agenda_points: meet.processing.questions.map((q) => ({
120
182
  title: q.title,
121
183
  context: q.context,
122
- decision: q.decision
123
- }))
124
- }
184
+ decision: q.decision,
185
+ })),
186
+ };
125
187
 
126
- emit('restart', dataToSend)
127
- }
188
+ emit('restart', dataToSend);
189
+ };
128
190
  </script>
@@ -56,6 +56,8 @@ div
56
56
  EditableIndividualCard(:participantData="props.row.trustee" :readonly="true").q-mt-sm
57
57
  div.text-wrap
58
58
  p.text-grey для замены председателя участка - измените его имя аккаунта в карточке участка на аккаунт одного из пайщиков.
59
+ div.q-mt-md.flex.justify-center
60
+ DeleteBranchButton(:branch="props.row")
59
61
  </template>
60
62
 
61
63
  <script lang="ts" setup>
@@ -63,6 +65,7 @@ import { computed, ref } from 'vue';
63
65
  import { useBranchStore } from 'src/entities/Branch/model';
64
66
  import { useEditableTableRows } from 'src/shared/lib/composables/useEditableTableRows';
65
67
  import { CreateBranchButton } from 'src/features/Branch/CreateBranch';
68
+ import { DeleteBranchButton } from 'src/features/Branch/DeleteBranch';
66
69
  import { getNameFromUserData } from 'src/shared/lib/utils/getNameFromUserData';
67
70
  import { BranchCard } from 'src/widgets/BranchCard';
68
71
  import { EditableIndividualCard } from 'src/shared/ui/EditableIndividualCard';