@coopenomics/desktop 2025.11.14-alpha-3 → 2025.11.16-alpha-1
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 +6 -6
- package/src/app/styles/style.css +5 -0
- package/src/entities/ConnectionAgreement/api/index.ts +1 -1
- package/src/entities/Installer/model/store.ts +1 -0
- package/src/features/Installer/ui/SetInitForm/SetInitForm.vue +1 -0
- package/src/features/Installer/ui/SetVariablesForm/SetVariablesForm.vue +60 -25
- package/src/features/NotificationPermissionDialog/model/index.ts +12 -17
- package/src/features/NotificationPermissionDialog/ui/NotificationPermissionDialog.vue +0 -1
- package/src/features/Union/CooperativeDataForm/ui/CooperativeDataForm.vue +188 -17
- package/src/pages/Registrator/SignUp/ReadStatement.vue +13 -1
- package/src/pages/Union/ConnectionAgreement/ConnectionAgreementPage.vue +12 -2
- package/src/pages/Union/InstallCooperative/ui/InstallCooperativePage.vue +180 -22
- package/src/shared/ui/UserDataForm/CreateOrganizationDataForm/CreateOrganizationDataForm.vue +2 -0
- package/src/widgets/ConnectionAgreementStepper/Steps/AgreementStep.vue +24 -3
- package/src/widgets/ConnectionAgreementStepper/Steps/FormStep.vue +44 -9
- package/src/widgets/ConnectionAgreementStepper/Steps/IntroStep.vue +15 -0
- package/src/widgets/ConnectionAgreementStepper/Steps/UnionMembershipStep.vue +309 -0
- package/src/widgets/ConnectionAgreementStepper/Steps/index.ts +1 -0
- package/src/widgets/ConnectionAgreementStepper/Tariffs/TariffCard.vue +0 -2
- package/src/widgets/ConnectionAgreementStepper/ui/ConnectionAgreementStepper.vue +10 -1
- package/src/widgets/Desktop/CmdkMenu/CmdkMenu.vue +1 -5
- package/src-pwa/register-service-worker.ts +3 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coopenomics/desktop",
|
|
3
|
-
"version": "2025.11.
|
|
3
|
+
"version": "2025.11.16-alpha-1",
|
|
4
4
|
"description": "A Desktop Project",
|
|
5
5
|
"productName": "Desktop App",
|
|
6
6
|
"author": "Alex Ant <dacom.dark.sun@gmail.com>",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"start": "node -r ./alias-resolver.js dist/ssr/index.js"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@coopenomics/controller": "2025.11.
|
|
29
|
-
"@coopenomics/notifications": "2025.11.
|
|
30
|
-
"@coopenomics/sdk": "2025.11.
|
|
28
|
+
"@coopenomics/controller": "2025.11.16-alpha-1",
|
|
29
|
+
"@coopenomics/notifications": "2025.11.16-alpha-1",
|
|
30
|
+
"@coopenomics/sdk": "2025.11.16-alpha-1",
|
|
31
31
|
"@dicebear/collection": "^9.0.1",
|
|
32
32
|
"@dicebear/core": "^9.0.1",
|
|
33
33
|
"@editorjs/code": "^2.9.3",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"@wharfkit/wallet-plugin-privatekey": "^1.1.0",
|
|
60
60
|
"axios": "^1.2.1",
|
|
61
61
|
"compression": "^1.7.4",
|
|
62
|
-
"cooptypes": "2025.11.
|
|
62
|
+
"cooptypes": "2025.11.16-alpha-1",
|
|
63
63
|
"dompurify": "^3.1.7",
|
|
64
64
|
"dotenv": "^16.4.5",
|
|
65
65
|
"email-regex": "^5.0.0",
|
|
@@ -123,5 +123,5 @@
|
|
|
123
123
|
"npm": ">= 6.13.4",
|
|
124
124
|
"yarn": ">= 1.21.1"
|
|
125
125
|
},
|
|
126
|
-
"gitHead": "
|
|
126
|
+
"gitHead": "8ed8af1b9ce9fbbfc01c9221cdd46230e6f56662"
|
|
127
127
|
}
|
package/src/app/styles/style.css
CHANGED
|
@@ -16,7 +16,7 @@ export async function getCurrentInstance(): Promise<CurrentInstance | null> {
|
|
|
16
16
|
|
|
17
17
|
return instance;
|
|
18
18
|
} catch (error) {
|
|
19
|
-
console.
|
|
19
|
+
console.warn('Инстанс не получен. Продолжаем работу без него:', error);
|
|
20
20
|
return null;
|
|
21
21
|
}
|
|
22
22
|
}
|
|
@@ -3,44 +3,79 @@ div
|
|
|
3
3
|
div(v-if="installStore.vars")
|
|
4
4
|
q-card(flat).q-mb-md
|
|
5
5
|
q-card-section
|
|
6
|
-
|
|
6
|
+
div.text-h6 Наименование
|
|
7
7
|
div
|
|
8
|
-
q-badge.q-mr-sm.q-mb-md
|
|
9
|
-
| -
|
|
8
|
+
q-badge.q-mr-sm.q-mb-md ОПФ+
|
|
9
|
+
| - основа наименования (ОПФ + цель деятельности)
|
|
10
|
+
.text-caption.text-grey Например: "Потребительский Кооператив Социального Комплекса" или просто "Потребительский Кооператив"
|
|
11
|
+
|
|
10
12
|
q-input(
|
|
11
13
|
autofocus
|
|
12
14
|
v-model="installStore.vars.name"
|
|
13
|
-
label="
|
|
15
|
+
label="Собственное название организации"
|
|
14
16
|
placeholder="Ромашка"
|
|
15
17
|
standout="bg-teal text-white"
|
|
18
|
+
:rules="[val => notEmpty(val)]"
|
|
16
19
|
)
|
|
20
|
+
.text-caption.text-grey Название без кавычек, которое будет добавляться к основе
|
|
17
21
|
|
|
18
22
|
q-input.q-mt-md(
|
|
19
23
|
v-model="installStore.vars.full_abbr"
|
|
20
|
-
label="
|
|
21
|
-
placeholder="Потребительский Кооператив"
|
|
24
|
+
label="Основа наименования в именительном падеже"
|
|
25
|
+
placeholder="Потребительский Кооператив Социального Комплекса"
|
|
22
26
|
standout="bg-teal text-white"
|
|
27
|
+
:rules="[val => notEmpty(val)]"
|
|
23
28
|
)
|
|
29
|
+
.text-caption.text-grey Вся часть до названия. Если уточнения нет - просто ОПФ
|
|
24
30
|
|
|
25
31
|
q-input.q-mt-md(
|
|
26
32
|
v-model="installStore.vars.full_abbr_genitive"
|
|
27
|
-
label="
|
|
28
|
-
placeholder="Потребительского Кооператива"
|
|
33
|
+
label="Основа наименования в родительном падеже"
|
|
34
|
+
placeholder="Потребительского Кооператива Социального Комплекса"
|
|
29
35
|
standout="bg-teal text-white"
|
|
36
|
+
:rules="[val => notEmpty(val)]"
|
|
30
37
|
)
|
|
31
38
|
|
|
32
39
|
q-input.q-mt-md(
|
|
33
40
|
v-model="installStore.vars.full_abbr_dative"
|
|
34
|
-
label="
|
|
35
|
-
placeholder="Потребительскому Кооперативу"
|
|
41
|
+
label="Основа наименования в дательном падеже"
|
|
42
|
+
placeholder="Потребительскому Кооперативу Социального Комплекса"
|
|
36
43
|
standout="bg-teal text-white"
|
|
44
|
+
:rules="[val => notEmpty(val)]"
|
|
37
45
|
)
|
|
38
46
|
|
|
39
47
|
q-input.q-mt-md(
|
|
40
48
|
v-model="installStore.vars.short_abbr"
|
|
41
|
-
label="Краткая
|
|
49
|
+
label="Краткая аббревиатура ОПФ"
|
|
42
50
|
placeholder="ПК"
|
|
43
51
|
standout="bg-teal text-white"
|
|
52
|
+
:rules="[val => notEmpty(val)]"
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
q-card(flat).q-mb-md
|
|
56
|
+
q-card-section
|
|
57
|
+
div.text-h6 Устав
|
|
58
|
+
p Укажите ссылку на устав вашего кооператива, ознакомиться с которым будет предложено пайщикам при регистрации.
|
|
59
|
+
q-input.q-mt-md(
|
|
60
|
+
v-model="installStore.vars.statute_link"
|
|
61
|
+
label="Ссылка на устав кооператива"
|
|
62
|
+
placeholder="https://example.com/statute.pdf"
|
|
63
|
+
type="url"
|
|
64
|
+
standout="bg-teal text-white"
|
|
65
|
+
:rules="[val => notEmpty(val)]"
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
q-card(flat).q-mb-md
|
|
69
|
+
q-card-section
|
|
70
|
+
div.text-h6 Паспортные данные
|
|
71
|
+
p Укажите, должны ли заявления на вступление в кооператив и система в целом запрашивать паспортные данные пайщиков при регистрации.
|
|
72
|
+
|
|
73
|
+
q-toggle.q-mt-md(
|
|
74
|
+
v-model="installStore.vars.passport_request"
|
|
75
|
+
label="Запрашивать паспортные данные"
|
|
76
|
+
:true-value="'yes'"
|
|
77
|
+
:false-value="'no'"
|
|
78
|
+
color="teal"
|
|
44
79
|
)
|
|
45
80
|
|
|
46
81
|
q-card(flat).q-mb-md
|
|
@@ -65,6 +100,7 @@ div
|
|
|
65
100
|
label="Email по вопросам конфиденциальности"
|
|
66
101
|
type="email"
|
|
67
102
|
standout="bg-teal text-white"
|
|
103
|
+
:rules="[val => notEmpty(val)]"
|
|
68
104
|
)
|
|
69
105
|
|
|
70
106
|
//- q-input.q-mt-md(
|
|
@@ -75,20 +111,7 @@ div
|
|
|
75
111
|
|
|
76
112
|
q-card(flat).q-mb-md
|
|
77
113
|
q-card-section
|
|
78
|
-
div.text-h6
|
|
79
|
-
p Укажите, должны ли заявления на вступление в кооператив и система в целом запрашивать паспортные данные пайщиков при регистрации.
|
|
80
|
-
|
|
81
|
-
q-toggle.q-mt-md(
|
|
82
|
-
v-model="installStore.vars.passport_request"
|
|
83
|
-
label="Запрашивать паспортные данные"
|
|
84
|
-
:true-value="'yes'"
|
|
85
|
-
:false-value="'no'"
|
|
86
|
-
color="teal"
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
q-card(flat).q-mb-md
|
|
90
|
-
q-card-section
|
|
91
|
-
div.text-h6 Протоколы решений по базовым документам
|
|
114
|
+
div.text-h6 Базовые протоколы решений
|
|
92
115
|
p Для начала работы с системой совету кооператива необходимо принять решение о приёме ЦПП "Цифровой Кошелёк", положение о простой электронной подписи, политику конфиденциальности, пользовательское соглашение, а также формы заявлений на вступление физлиц, юрлиц и ИП. Данная информация также будет использоваться для генерации электронных документов с пайщиками.
|
|
93
116
|
| Примите решение совета и укажите номера и даты протоколов по каждому документу. У всех документов может быть общий номер протокола и дата принятия решения.
|
|
94
117
|
| Сгенерировать и скачать образцы документов можно по ссылке: <a href="https://generate-documents.coopenomics.world/connection-package" target="_blank">https://generate-documents.coopenomics.world</a>
|
|
@@ -99,12 +122,14 @@ div
|
|
|
99
122
|
label="Номер протокола"
|
|
100
123
|
:placeholder="getCurrentProtocolNumber"
|
|
101
124
|
standout="bg-teal text-white"
|
|
125
|
+
:rules="[val => notEmpty(val)]"
|
|
102
126
|
)
|
|
103
127
|
q-input.q-mt-sm(
|
|
104
128
|
v-model="installStore.vars.wallet_agreement.protocol_day_month_year"
|
|
105
129
|
label="Дата протокола"
|
|
106
130
|
:placeholder="getCurrentProtocolDate"
|
|
107
131
|
standout="bg-teal text-white"
|
|
132
|
+
:rules="[val => notEmpty(val)]"
|
|
108
133
|
)
|
|
109
134
|
|
|
110
135
|
div.q-mt-md
|
|
@@ -114,12 +139,14 @@ div
|
|
|
114
139
|
label="Номер протокола"
|
|
115
140
|
:placeholder="getCurrentProtocolNumber"
|
|
116
141
|
standout="bg-teal text-white"
|
|
142
|
+
:rules="[val => notEmpty(val)]"
|
|
117
143
|
)
|
|
118
144
|
q-input.q-mt-sm(
|
|
119
145
|
v-model="installStore.vars.signature_agreement.protocol_day_month_year"
|
|
120
146
|
label="Дата протокола"
|
|
121
147
|
:placeholder="getCurrentProtocolDate"
|
|
122
148
|
standout="bg-teal text-white"
|
|
149
|
+
:rules="[val => notEmpty(val)]"
|
|
123
150
|
)
|
|
124
151
|
|
|
125
152
|
div.q-mt-md
|
|
@@ -129,12 +156,14 @@ div
|
|
|
129
156
|
label="Номер протокола"
|
|
130
157
|
:placeholder="getCurrentProtocolNumber"
|
|
131
158
|
standout="bg-teal text-white"
|
|
159
|
+
:rules="[val => notEmpty(val)]"
|
|
132
160
|
)
|
|
133
161
|
q-input.q-mt-sm(
|
|
134
162
|
v-model="installStore.vars.privacy_agreement.protocol_day_month_year"
|
|
135
163
|
label="Дата протокола"
|
|
136
164
|
:placeholder="getCurrentProtocolDate"
|
|
137
165
|
standout="bg-teal text-white"
|
|
166
|
+
:rules="[val => notEmpty(val)]"
|
|
138
167
|
)
|
|
139
168
|
|
|
140
169
|
div.q-mt-md
|
|
@@ -144,12 +173,14 @@ div
|
|
|
144
173
|
label="Номер протокола"
|
|
145
174
|
:placeholder="getCurrentProtocolNumber"
|
|
146
175
|
standout="bg-teal text-white"
|
|
176
|
+
:rules="[val => notEmpty(val)]"
|
|
147
177
|
)
|
|
148
178
|
q-input.q-mt-sm(
|
|
149
179
|
v-model="installStore.vars.user_agreement.protocol_day_month_year"
|
|
150
180
|
label="Дата протокола"
|
|
151
181
|
:placeholder="getCurrentProtocolDate"
|
|
152
182
|
standout="bg-teal text-white"
|
|
183
|
+
:rules="[val => notEmpty(val)]"
|
|
153
184
|
)
|
|
154
185
|
|
|
155
186
|
div.q-mt-md
|
|
@@ -159,12 +190,14 @@ div
|
|
|
159
190
|
label="Номер протокола"
|
|
160
191
|
:placeholder="getCurrentProtocolNumber"
|
|
161
192
|
standout="bg-teal text-white"
|
|
193
|
+
:rules="[val => notEmpty(val)]"
|
|
162
194
|
)
|
|
163
195
|
q-input.q-mt-sm(
|
|
164
196
|
v-model="installStore.vars.participant_application.protocol_day_month_year"
|
|
165
197
|
label="Дата протокола"
|
|
166
198
|
:placeholder="getCurrentProtocolDate"
|
|
167
199
|
standout="bg-teal text-white"
|
|
200
|
+
:rules="[val => notEmpty(val)]"
|
|
168
201
|
)
|
|
169
202
|
|
|
170
203
|
div.flex.justify-between.q-mt-md
|
|
@@ -179,6 +212,7 @@ import { useInstallCooperativeStore } from 'src/entities/Installer/model';
|
|
|
179
212
|
import { useSystemStore } from 'src/entities/System/model';
|
|
180
213
|
import { FailAlert, SuccessAlert } from 'src/shared/api';
|
|
181
214
|
import { useInstallCooperative } from '../../model';
|
|
215
|
+
import { notEmpty } from 'src/shared/lib/utils';
|
|
182
216
|
import { ref, onMounted, computed } from 'vue';
|
|
183
217
|
|
|
184
218
|
const installStore = useInstallCooperativeStore()
|
|
@@ -221,6 +255,7 @@ onMounted(() => {
|
|
|
221
255
|
confidential_email: '',
|
|
222
256
|
contact_email: '',
|
|
223
257
|
passport_request: 'no',
|
|
258
|
+
statute_link: '',
|
|
224
259
|
wallet_agreement: {
|
|
225
260
|
protocol_number: '',
|
|
226
261
|
protocol_day_month_year: '',
|
|
@@ -78,31 +78,26 @@ export function useNotificationPermissionDialog() {
|
|
|
78
78
|
|
|
79
79
|
// Обработка согласия пользователя
|
|
80
80
|
const handleAllow = async () => {
|
|
81
|
+
// Немедленно закрываем диалог и сохраняем выбор пользователя
|
|
82
|
+
saveChoice('granted');
|
|
83
|
+
hideDialog();
|
|
84
|
+
|
|
85
|
+
// Выполняем подписку в фоне
|
|
81
86
|
try {
|
|
82
|
-
|
|
83
|
-
console.log('handleAllow');
|
|
84
|
-
// Подписываемся на уведомления (это включает запрос разрешения)
|
|
87
|
+
console.log('handleAllow - начинаем фоновую подписку');
|
|
85
88
|
const success = await subscribe();
|
|
86
89
|
console.log('success', success);
|
|
87
|
-
if (success) {
|
|
88
|
-
console.log('saveChoice
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
hideDialog();
|
|
92
|
-
} else {
|
|
93
|
-
console.log('saveChoice denied');
|
|
94
|
-
// Если подписка не удалась, но пользователь согласился,
|
|
95
|
-
// все равно сохраняем выбор чтобы не показывать диалог снова
|
|
90
|
+
if (!success) {
|
|
91
|
+
console.log('saveChoice denied - подписка не удалась');
|
|
92
|
+
// Если подписка не удалась, меняем выбор на denied
|
|
93
|
+
// чтобы диалог мог появиться снова при необходимости
|
|
96
94
|
saveChoice('denied');
|
|
97
|
-
hideDialog();
|
|
98
95
|
}
|
|
99
96
|
} catch (error) {
|
|
100
97
|
console.error('Ошибка при разрешении уведомлений:', error);
|
|
101
|
-
console.log('saveChoice denied');
|
|
98
|
+
console.log('saveChoice denied - ошибка подписки');
|
|
99
|
+
// При ошибке тоже меняем на denied
|
|
102
100
|
saveChoice('denied');
|
|
103
|
-
hideDialog();
|
|
104
|
-
} finally {
|
|
105
|
-
store.isPermissionDialogProcessing = false;
|
|
106
101
|
}
|
|
107
102
|
};
|
|
108
103
|
|
|
@@ -1,23 +1,87 @@
|
|
|
1
1
|
<template lang="pug">
|
|
2
2
|
div
|
|
3
|
-
Form(:handler-submit="saveData" :showCancel="
|
|
4
|
-
q-input(standout="bg-teal text-white" hint="domovoy.com или coop.domovoy.com" label="Домен или поддомен для запуска" v-model="formData.announce" :rules="[val => notEmpty(val), val => isDomain(val)]")
|
|
3
|
+
Form(:handler-submit="saveData" :showCancel="true" :button-cancel-txt="'Назад'" :button-submit-txt="'Продолжить'" @cancel="handleBack").q-gutter-md
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
//- Домен кооператива
|
|
6
|
+
.form-section.q-mb-lg
|
|
7
|
+
.section-header.q-mb-md
|
|
8
|
+
.section-title
|
|
9
|
+
q-icon(name="domain" size="20px" color="primary").q-mr-sm
|
|
10
|
+
span.text-subtitle1.text-weight-medium Домен кооператива
|
|
11
|
+
.section-description.text-body2.q-mt-sm
|
|
12
|
+
| Укажите домен или поддомен, на котором будет работать ваш кооператив
|
|
9
13
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
14
|
+
q-input.form-input(
|
|
15
|
+
standout="bg-teal text-white"
|
|
16
|
+
hint="domovoy.com или coop.domovoy.com"
|
|
17
|
+
label="Домен или поддомен для запуска"
|
|
18
|
+
v-model="formData.announce"
|
|
19
|
+
:rules="[val => notEmpty(val), val => isDomain(val)]"
|
|
20
|
+
)
|
|
13
21
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
22
|
+
//- Финансовые параметры
|
|
23
|
+
.form-section.q-mb-lg
|
|
24
|
+
.section-header.q-mb-md
|
|
25
|
+
.section-title
|
|
26
|
+
q-icon(name="account_balance_wallet" size="20px" color="secondary").q-mr-sm
|
|
27
|
+
span.text-subtitle1.text-weight-medium Финансовые параметры
|
|
28
|
+
.section-description.text-body2.q-mt-sm
|
|
29
|
+
| Введите вступительные и минимальные паевые взносы пайщиков. Эти параметры будут должны быть указаны в уставных документах кооператива.
|
|
17
30
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
31
|
+
.financial-grid
|
|
32
|
+
.grid-section.q-mb-md
|
|
33
|
+
.subsection-title.text-body1.text-weight-medium.q-mb-sm Для физических лиц и ИП
|
|
34
|
+
.input-row.q-mb-sm
|
|
35
|
+
q-input.form-input(
|
|
36
|
+
standout="bg-teal text-white"
|
|
37
|
+
placeholder="100"
|
|
38
|
+
label="Вступительный взнос"
|
|
39
|
+
v-model="formData.initial"
|
|
40
|
+
type="number"
|
|
41
|
+
:min="0"
|
|
42
|
+
:rules="[val => notEmpty(val)]"
|
|
43
|
+
)
|
|
44
|
+
template(#append)
|
|
45
|
+
span.text-overline RUB
|
|
46
|
+
.input-row
|
|
47
|
+
q-input.form-input(
|
|
48
|
+
standout="bg-teal text-white"
|
|
49
|
+
label="Минимальный паевый взнос"
|
|
50
|
+
placeholder="300"
|
|
51
|
+
v-model="formData.minimum"
|
|
52
|
+
type="number"
|
|
53
|
+
:min="0"
|
|
54
|
+
:rules="[val => notEmpty(val)]"
|
|
55
|
+
)
|
|
56
|
+
template(#append)
|
|
57
|
+
span.text-overline RUB
|
|
58
|
+
|
|
59
|
+
.grid-section
|
|
60
|
+
.subsection-title.text-body1.text-weight-medium.q-mb-sm Для организаций
|
|
61
|
+
.input-row.q-mb-sm
|
|
62
|
+
q-input.form-input(
|
|
63
|
+
standout="bg-teal text-white"
|
|
64
|
+
placeholder="1000"
|
|
65
|
+
label="Вступительный взнос"
|
|
66
|
+
v-model="formData.org_initial"
|
|
67
|
+
type="number"
|
|
68
|
+
:min="0"
|
|
69
|
+
:rules="[val => notEmpty(val)]"
|
|
70
|
+
)
|
|
71
|
+
template(#append)
|
|
72
|
+
span.text-overline RUB
|
|
73
|
+
.input-row
|
|
74
|
+
q-input.form-input(
|
|
75
|
+
standout="bg-teal text-white"
|
|
76
|
+
placeholder="3000"
|
|
77
|
+
label="Минимальный паевый взнос"
|
|
78
|
+
v-model="formData.org_minimum"
|
|
79
|
+
type="number"
|
|
80
|
+
:min="0"
|
|
81
|
+
:rules="[val => notEmpty(val)]"
|
|
82
|
+
)
|
|
83
|
+
template(#append)
|
|
84
|
+
span.text-overline RUB
|
|
21
85
|
</template>
|
|
22
86
|
<script lang="ts" setup>
|
|
23
87
|
import { ref, watch } from 'vue'
|
|
@@ -27,7 +91,7 @@ import { useConnectionAgreementStore } from 'src/entities/ConnectionAgreement';
|
|
|
27
91
|
import type { ICooperativeFormData } from 'src/entities/ConnectionAgreement/model/types';
|
|
28
92
|
|
|
29
93
|
|
|
30
|
-
const emit = defineEmits(['continue'])
|
|
94
|
+
const emit = defineEmits(['continue', 'back'])
|
|
31
95
|
|
|
32
96
|
const connectionAgreement = useConnectionAgreementStore()
|
|
33
97
|
|
|
@@ -56,8 +120,8 @@ const syncFormData = () => {
|
|
|
56
120
|
connectionAgreement.setFormData(formData.value)
|
|
57
121
|
}
|
|
58
122
|
|
|
59
|
-
const
|
|
60
|
-
emit('
|
|
123
|
+
const handleBack = () => {
|
|
124
|
+
emit('back')
|
|
61
125
|
}
|
|
62
126
|
|
|
63
127
|
const saveData = async () => {
|
|
@@ -67,3 +131,110 @@ const saveData = async () => {
|
|
|
67
131
|
emit('continue', formData.value)
|
|
68
132
|
}
|
|
69
133
|
</script>
|
|
134
|
+
|
|
135
|
+
<style scoped>
|
|
136
|
+
.form-section {
|
|
137
|
+
padding: 1.5rem;
|
|
138
|
+
border-radius: 16px;
|
|
139
|
+
border: 1px solid rgba(0, 0, 0, 0.05);
|
|
140
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.section-header {
|
|
144
|
+
border-bottom: 1px solid rgba(0, 0, 0, 0.08);
|
|
145
|
+
padding-bottom: 1rem;
|
|
146
|
+
display: block;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.section-title {
|
|
150
|
+
display: flex;
|
|
151
|
+
align-items: center;
|
|
152
|
+
margin-bottom: 0.25rem;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.section-description {
|
|
156
|
+
line-height: 1.5;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.financial-grid {
|
|
160
|
+
display: grid;
|
|
161
|
+
grid-template-columns: 1fr 1fr;
|
|
162
|
+
gap: 2rem;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.grid-section {
|
|
166
|
+
padding: 1rem;
|
|
167
|
+
border-radius: 12px;
|
|
168
|
+
border: 1px solid rgba(0, 0, 0, 0.03);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
.subsection-title {
|
|
172
|
+
color: var(--q-primary);
|
|
173
|
+
border-bottom: 2px solid var(--q-primary);
|
|
174
|
+
padding-bottom: 0.5rem;
|
|
175
|
+
margin-bottom: 1rem;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.input-row {
|
|
179
|
+
margin-bottom: 1rem;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
.input-row:last-child {
|
|
183
|
+
margin-bottom: 0;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.form-input {
|
|
187
|
+
margin-bottom: 0;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/* Разделитель между секциями */
|
|
191
|
+
.form-section + .form-section {
|
|
192
|
+
margin-top: 2rem;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/* Адаптивность */
|
|
196
|
+
@media (max-width: 768px) {
|
|
197
|
+
.financial-grid {
|
|
198
|
+
grid-template-columns: 1fr;
|
|
199
|
+
gap: 1.5rem;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.form-section {
|
|
203
|
+
padding: 1.25rem;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
@media (max-width: 480px) {
|
|
208
|
+
.form-section {
|
|
209
|
+
padding: 1rem;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.section-title {
|
|
213
|
+
flex-direction: column;
|
|
214
|
+
gap: 0.5rem;
|
|
215
|
+
text-align: center;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.section-header {
|
|
219
|
+
text-align: center;
|
|
220
|
+
display: block !important;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.section-description {
|
|
224
|
+
display: block !important;
|
|
225
|
+
width: 100% !important;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.financial-grid {
|
|
229
|
+
gap: 1rem;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.grid-section {
|
|
233
|
+
padding: 0.75rem;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.subsection-title {
|
|
237
|
+
font-size: 1rem;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
</style>
|
|
@@ -31,7 +31,8 @@ div
|
|
|
31
31
|
q-checkbox(v-model='store.state.agreements.ustav' full-width)
|
|
32
32
|
| Я прочитал и принимаю
|
|
33
33
|
|
|
34
|
-
a(@click.stop='(event) => event.stopPropagation()' href='
|
|
34
|
+
a(v-if='hasStatuteLink' @click.stop='(event) => event.stopPropagation()' :href='statuteLink' target='_blank').q-ml-xs Устав кооператива
|
|
35
|
+
p(v-else).q-ml-xs Устав кооператива
|
|
35
36
|
|
|
36
37
|
div(v-if="!isLoading").q-mt-lg
|
|
37
38
|
q-btn.col-md-6.col-xs-12(flat @click='back')
|
|
@@ -53,6 +54,9 @@ const agreementer = useAgreementStore()
|
|
|
53
54
|
import { useRegistratorStore } from 'src/entities/Registrator'
|
|
54
55
|
const store = useRegistratorStore()
|
|
55
56
|
|
|
57
|
+
import { useSystemStore } from 'src/entities/System/model'
|
|
58
|
+
const systemStore = useSystemStore()
|
|
59
|
+
|
|
56
60
|
const { generateStatementWithoutSignature } = useCreateUser()
|
|
57
61
|
|
|
58
62
|
const agreeWithAll = computed(() => {
|
|
@@ -108,5 +112,13 @@ const userAgreement = computed(() => {
|
|
|
108
112
|
return agreementer.cooperativeAgreements.find(el => el.type == 'user')
|
|
109
113
|
})
|
|
110
114
|
|
|
115
|
+
const statuteLink = computed(() => {
|
|
116
|
+
return systemStore.info.vars?.statute_link || ''
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
const hasStatuteLink = computed(() => {
|
|
120
|
+
return statuteLink.value && statuteLink.value.trim() !== ''
|
|
121
|
+
})
|
|
122
|
+
|
|
111
123
|
|
|
112
124
|
</script>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<template lang="pug">
|
|
2
|
-
div.row
|
|
2
|
+
div.row
|
|
3
3
|
div.col-md-12.col-xs-12
|
|
4
4
|
// Лоадер пока идет загрузка данных
|
|
5
5
|
WindowLoader(v-if="isLoading", text="Загрузка данных подключения...")
|
|
@@ -104,10 +104,19 @@ const init = async () => {
|
|
|
104
104
|
isLoading.value = false;
|
|
105
105
|
return;
|
|
106
106
|
}
|
|
107
|
-
|
|
107
|
+
console.log('SYSTEM.info.is_unioned', system.info.is_unioned, connectionAgreement.isInitialized);
|
|
108
108
|
// Инициализируем persistent store если он еще не инициализирован
|
|
109
109
|
if (!connectionAgreement.isInitialized) {
|
|
110
110
|
connectionAgreement.setInitialized(true);
|
|
111
|
+
|
|
112
|
+
// Устанавливаем начальный шаг в зависимости от членства в союзе
|
|
113
|
+
if (system.info.is_unioned) {
|
|
114
|
+
// Если кооператив не является членом союза, начинаем с нулевого шага
|
|
115
|
+
connectionAgreement.setCurrentStep(0);
|
|
116
|
+
} else {
|
|
117
|
+
// Если кооператив уже член союза, начинаем с первого шага
|
|
118
|
+
connectionAgreement.setCurrentStep(1);
|
|
119
|
+
}
|
|
111
120
|
}
|
|
112
121
|
|
|
113
122
|
// Запускаем автообновление инстанса каждые 30 секунд (включает начальную загрузку)
|
|
@@ -140,6 +149,7 @@ watch(
|
|
|
140
149
|
});
|
|
141
150
|
|
|
142
151
|
// Логика автоматических переходов (только для шагов 4, 5, 6)
|
|
152
|
+
// Шаги 0, 1, 2, 3 не имеют автоматических переходов
|
|
143
153
|
if (currentStep === 4) {
|
|
144
154
|
// Шаг 4: Проверка домена
|
|
145
155
|
if (instance.is_valid && instance.is_delegated) {
|