@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.
- package/package.json +7 -7
- package/src/entities/Branch/api/index.ts +1 -2
- package/src/entities/Branch/model/types.ts +2 -1
- package/src/features/Branch/CreateBranch/ui/CreateBranchButton.vue +85 -33
- package/src/features/Branch/DeleteBranch/api/index.ts +15 -0
- package/src/features/Branch/DeleteBranch/index.ts +1 -0
- package/src/features/Branch/DeleteBranch/model/index.ts +44 -0
- package/src/features/Branch/DeleteBranch/ui/DeleteBranchButton.vue +56 -0
- package/src/features/Cooperative/UpdateBoard/index.ts +1 -0
- package/src/features/Cooperative/UpdateBoard/ui/AddMemberDialog.vue +59 -0
- package/src/features/Cooperative/UpdateBoard/ui/index.ts +1 -0
- package/src/features/Meet/CreateMeet/ui/CreateMeetForm.vue +138 -94
- package/src/features/Meet/RestartMeet/ui/RestartMeetForm.vue +135 -73
- package/src/pages/Cooperative/MemberBranchList/ui/MemberBranchListPage.vue +3 -0
- package/src/processes/navigation-guard-setup/index.ts +31 -31
- package/src/shared/ui/UserSearchSelector/UserSearchSelector.vue +328 -0
- package/src/shared/ui/UserSearchSelector/composables/useUserSearch.ts +70 -0
- package/src/shared/ui/UserSearchSelector/index.ts +3 -0
- package/src/shared/ui/UserSearchSelector/model/types.ts +17 -0
- package/src/shared/ui/index.ts +1 -0
- package/src/widgets/Cooperative/Members/ui/Members.vue +167 -135
@@ -1,156 +1,198 @@
|
|
1
1
|
<template lang="pug">
|
2
|
-
q-dialog(
|
3
|
-
|
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
|
-
|
9
|
+
.text-h6 Создать общее собрание {{ isChairman ? '(Председатель)' : '(Член совета)' }}
|
6
10
|
q-space
|
7
|
-
q-btn(
|
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=
|
21
|
+
q-form(@submit='handleSubmit')
|
11
22
|
// Выбор типа собрания
|
12
23
|
q-select(
|
13
|
-
v-model=
|
14
|
-
:options=
|
15
|
-
label=
|
16
|
-
emit-value
|
17
|
-
map-options
|
18
|
-
:rules=
|
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
|
-
|
23
|
-
v-model=
|
24
|
-
label=
|
25
|
-
:rules=
|
33
|
+
UserSearchSelector(
|
34
|
+
v-model='formData.presider',
|
35
|
+
label='Председатель собрания',
|
36
|
+
:rules='[(val) => !!val || "Обязательное поле"]',
|
26
37
|
dense
|
27
38
|
)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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=
|
36
|
-
:label=
|
37
|
-
type=
|
38
|
-
:rules=
|
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=
|
43
|
-
:label=
|
44
|
-
type=
|
45
|
-
:rules=
|
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
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
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=
|
61
|
-
label=
|
62
|
-
:rules=
|
63
|
-
dense
|
64
|
-
type=
|
82
|
+
v-model='point.title',
|
83
|
+
label='Вопрос',
|
84
|
+
:rules='[(val) => !!val || "Обязательное поле"]',
|
85
|
+
dense,
|
86
|
+
type='textarea',
|
65
87
|
autogrow
|
66
88
|
)
|
67
89
|
|
68
|
-
|
90
|
+
.q-mb-sm
|
69
91
|
q-input(
|
70
|
-
v-model=
|
71
|
-
label=
|
72
|
-
:rules=
|
73
|
-
dense
|
74
|
-
type=
|
92
|
+
v-model='point.decision',
|
93
|
+
label='Проект Решения',
|
94
|
+
:rules='[(val) => !!val || "Обязательное поле"]',
|
95
|
+
dense,
|
96
|
+
type='textarea',
|
75
97
|
autogrow
|
76
98
|
)
|
77
99
|
|
78
|
-
|
100
|
+
.q-mb-sm
|
79
101
|
q-input(
|
80
|
-
v-model=
|
81
|
-
label=
|
82
|
-
:rules=
|
83
|
-
dense
|
84
|
-
type=
|
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=
|
110
|
+
q-separator(v-if='index < formData.agenda_points.length - 1')
|
89
111
|
|
90
|
-
|
91
|
-
q-btn(
|
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
|
-
|
95
|
-
|
96
|
-
q-card-actions(align=
|
97
|
-
q-btn(
|
98
|
-
|
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 {
|
105
|
-
|
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
|
-
|
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(
|
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(
|
3
|
-
|
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
|
-
|
9
|
+
.text-h6 Перезапустить собрание
|
6
10
|
q-space
|
7
|
-
q-btn(
|
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=
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
:rules=
|
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=
|
21
|
-
:label=
|
22
|
-
type=
|
23
|
-
:rules=
|
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
|
-
|
52
|
+
.text-subtitle1.q-mb-sm При перезапуске собрания будут использованы существующие пункты повестки:
|
29
53
|
|
30
|
-
q-card
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
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
|
-
|
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
|
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
|
-
|
44
|
-
|
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=
|
47
|
-
q-btn(
|
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=
|
50
|
-
label=
|
51
|
-
type=
|
52
|
-
@click=
|
53
|
-
:loading=
|
54
|
-
:disable=
|
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 {
|
62
|
-
|
63
|
-
|
64
|
-
|
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(
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
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';
|