@haiiro/docuflow 0.0.4 → 0.0.6
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/README.md +10 -10
- package/bin/install.mjs +87 -20
- package/manifest.json +25 -31
- package/package.json +1 -1
- package/src/front-components/docflow-documents.front-component.mjs +35 -35
- package/src/front-components/docflow-documents.front-component.tsx +90 -300
- package/src/front-components/docflow-processes.front-component.mjs +27 -27
- package/src/front-components/docflow-processes.front-component.tsx +122 -26
- package/src/front-components/docflow-tasks.front-component.mjs +19 -19
- package/src/front-components/process-steps.front-component.mjs +18 -18
- package/src/front-components/task-form.front-component.mjs +26 -26
- package/src/logic-functions/capture-file.logic-function.mjs +15 -1
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
| Сайдбар | пункт «Документооборот» с вкладками «Задания», «Процессы», «Документы» |
|
|
13
13
|
| «Задания» | задачи раздела «Документооборот»; фильтры «Открытые / Мои / Просроченные / Выполненные», поиск, создание задания с инструкцией и полями для заполнения |
|
|
14
14
|
| Карточка задачи | вкладка «Задание»: инструкция, поля задания (собрать конструктором, заполнить), «Выполнить» |
|
|
15
|
-
| Карточка процесса |
|
|
15
|
+
| Карточка процесса | команда «Запуск и задания» (кнопка вверху, открывает боковую панель): параметры запуска (конструктор полей) и, для шагов «Человеческий ввод» черновика, кто выполняет, срок в днях, обязательные поля; у каждого поля видна переменная, которой его читают следующие шаги |
|
|
16
16
|
| Редактор процесса | шаг «Запуск с параметрами» (из приложения): отдаёт следующим шагам параметры, заполненные перед запуском |
|
|
17
17
|
| «Процессы» | процессы с ручным запуском раздела «Документооборот»; форма параметров до запуска, «Запустить», «Создать», «Изменить процесс» |
|
|
18
18
|
| «Документы» | папки, фильтры, поиск по названию и номеру, документ с реквизитами (тип, номер, дата, срок действия, контрагент, описание), файл в поле «Файл» карточки, карточка с источником |
|
|
@@ -32,17 +32,17 @@
|
|
|
32
32
|
|
|
33
33
|
## Установка
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
На сервере, где запущен Twenty, из каталога с его `docker-compose.yml`; повторный запуск
|
|
36
|
+
ставит новую версию:
|
|
36
37
|
|
|
37
38
|
```bash
|
|
38
|
-
|
|
39
|
+
docker compose exec server npx -y @haiiro/install@latest docuflow
|
|
39
40
|
```
|
|
40
41
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
Конкретная версия: `--version 0.0.4`. Ключ можно передать переменной `CRM_API_KEY`, адрес — `CRM_URL`.
|
|
42
|
+
Ключи не нужны: установщик работает внутри контейнера сервера и вызывает его команды
|
|
43
|
+
`marketplace:catalog-sync`, `application:install` и `application:upgrade`. Приложение ставится
|
|
44
|
+
во все компании сервера. Конкретная версия: `docuflow@0.0.6`. Публикация из репозитория форка:
|
|
45
|
+
`bash scripts/smb-publish.sh docflow`.
|
|
46
46
|
|
|
47
47
|
Из исходников (для разработки): `yarn install && yarn app remote:add --url … --api-key … --as prod && yarn app apply --remote prod`.
|
|
48
48
|
|
|
@@ -64,7 +64,7 @@ npx @haiiro/docuflow install --url https://crm.example.ru --api-key '<ключ A
|
|
|
64
64
|
|
|
65
65
|
- **Процесс.** «Процессы → Создать» открывает карточку процесса с уже выставленным разделом.
|
|
66
66
|
Существующий процесс переносится в документооборот полем «Раздел» в его карточке.
|
|
67
|
-
- **Запуск с параметрами.**
|
|
67
|
+
- **Запуск с параметрами.** Команда процесса «Запуск и задания» → «Добавить поле»: название, тип
|
|
68
68
|
(текст, число, дата, сотрудник, компания, контакт, сделка), обязательность. «Сохранить параметры»
|
|
69
69
|
ставит процессу ручной запуск, если запуска ещё нет, и первым шагом черновика — шаг «Запуск с
|
|
70
70
|
параметрами». В следующих шагах параметры выбираются в списке переменных как поля этого шага:
|
|
@@ -72,7 +72,7 @@ npx @haiiro/docuflow install --url https://crm.example.ru --api-key '<ключ A
|
|
|
72
72
|
заполняются в «Процессах» до запуска; обязательные проверяются и на странице, и на сервере, а
|
|
73
73
|
значения хранятся в запуске (`trigger.smbDocflowParameters`).
|
|
74
74
|
- **Задание шага.** Шаг «Человеческий ввод» становится задачей раздела процесса: у исполнителя
|
|
75
|
-
из
|
|
75
|
+
из команды «Запуск и задания», без него — у запустившего. Поля задания — поля шага из редактора.
|
|
76
76
|
«Выполнить» проверяет обязательные поля и продолжает процесс; значения дальше читаются
|
|
77
77
|
переменными шага `{{<шаг>.<поле>}}`.
|
|
78
78
|
- **Своё задание.** «Задания → Создать»: название, исполнитель, срок, инструкция и поля для
|
package/bin/install.mjs
CHANGED
|
@@ -13,9 +13,9 @@ import { fileURLToPath } from 'node:url';
|
|
|
13
13
|
|
|
14
14
|
const REGISTRY_URL = 'https://registry.npmjs.org';
|
|
15
15
|
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
);
|
|
16
|
+
const packageDir = join(dirname(fileURLToPath(import.meta.url)), '..');
|
|
17
|
+
const packageJson = JSON.parse(await readFile(join(packageDir, 'package.json'), 'utf8'));
|
|
18
|
+
const manifest = JSON.parse(await readFile(join(packageDir, 'manifest.json'), 'utf8'));
|
|
19
19
|
|
|
20
20
|
const fail = (message) => {
|
|
21
21
|
console.error(`\n✗ ${message}\n`);
|
|
@@ -78,14 +78,60 @@ const callMetadataApi = async ({ url, apiKey }, query, variables) => {
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
if (firstError !== undefined || body?.data === undefined) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
throw new Error(typeof details === 'string' ? details : JSON.stringify(details));
|
|
81
|
+
throw new CrmApiError(firstError, response.status);
|
|
84
82
|
}
|
|
85
83
|
|
|
86
84
|
return body.data;
|
|
87
85
|
};
|
|
88
86
|
|
|
87
|
+
class CrmApiError extends Error {
|
|
88
|
+
constructor(graphqlError, status) {
|
|
89
|
+
const details =
|
|
90
|
+
graphqlError?.extensions?.userFriendlyMessage ?? graphqlError?.message ?? `HTTP ${status}`;
|
|
91
|
+
|
|
92
|
+
super(typeof details === 'string' ? details : JSON.stringify(details));
|
|
93
|
+
this.extensions = graphqlError?.extensions ?? {};
|
|
94
|
+
this.rawMessage = graphqlError?.message ?? '';
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// The app was installed from the marketplace on this CRM: the server keeps
|
|
98
|
+
// it tied to npm and refuses an archive for it.
|
|
99
|
+
get isSourceChannelMismatch() {
|
|
100
|
+
return (
|
|
101
|
+
[this.extensions.code, this.extensions.subCode].includes('SOURCE_CHANNEL_MISMATCH') ||
|
|
102
|
+
/source channel|Cannot upload tarball/i.test(`${this.message} ${this.rawMessage}`)
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Manifest validation lists what is wrong per entity; the platform CLI
|
|
107
|
+
// prints it the same way.
|
|
108
|
+
describe() {
|
|
109
|
+
const lines = [this.message];
|
|
110
|
+
const { errors } = this.extensions;
|
|
111
|
+
|
|
112
|
+
if (this.rawMessage !== '' && this.rawMessage !== this.message) {
|
|
113
|
+
lines.push(this.rawMessage);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (errors !== null && typeof errors === 'object') {
|
|
117
|
+
for (const [metadataName, entries] of Object.entries(errors)) {
|
|
118
|
+
for (const entry of entries ?? []) {
|
|
119
|
+
const entity = entry.flatEntityMinimalInformation ?? {};
|
|
120
|
+
const name = entity.name ?? entity.label ?? entity.universalIdentifier ?? '';
|
|
121
|
+
|
|
122
|
+
for (const entryError of entry.errors ?? []) {
|
|
123
|
+
const value = entryError.value !== undefined ? ` (значение: ${JSON.stringify(entryError.value)})` : '';
|
|
124
|
+
|
|
125
|
+
lines.push(` ${metadataName} ${name}: ${entryError.code} — ${entryError.message}${value}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return lines.join('\n');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
89
135
|
const downloadPackageTarball = async (version) => {
|
|
90
136
|
const metadataResponse = await fetch(`${REGISTRY_URL}/${packageJson.name}/${version}`);
|
|
91
137
|
|
|
@@ -111,6 +157,32 @@ const install = async (options) => {
|
|
|
111
157
|
const tarball = await downloadPackageTarball(options.version);
|
|
112
158
|
|
|
113
159
|
console.log(`→ Загружаю в CRM ${connection.url} (${(tarball.length / 1e6).toFixed(1)} МБ)`);
|
|
160
|
+
|
|
161
|
+
try {
|
|
162
|
+
await uploadArchive(connection, label, tarball);
|
|
163
|
+
} catch (error) {
|
|
164
|
+
if (!(error instanceof CrmApiError) || !error.isSourceChannelMismatch) {
|
|
165
|
+
throw error;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Installed from the marketplace before: the server fetches the same
|
|
169
|
+
// version from npm itself.
|
|
170
|
+
console.log('→ Приложение подключено из каталога npm, ставлю эту версию через каталог');
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
console.log(`→ Устанавливаю «${manifest.application.displayName ?? packageJson.name}» ${options.version}`);
|
|
174
|
+
await callMetadataApi(
|
|
175
|
+
connection,
|
|
176
|
+
`mutation InstallApplication($universalIdentifier: String!, $version: String) {
|
|
177
|
+
installApplication(universalIdentifier: $universalIdentifier, version: $version) { id }
|
|
178
|
+
}`,
|
|
179
|
+
{ universalIdentifier: manifest.application.universalIdentifier, version: options.version },
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
console.log(`\n✓ ${label} установлен. Обновите страницу CRM.\n`);
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
const uploadArchive = async (connection, label, tarball) => {
|
|
114
186
|
const { createFileUpload } = await callMetadataApi(
|
|
115
187
|
connection,
|
|
116
188
|
`mutation CreateFileUpload($filename: String!, $size: Float!, $fileFolder: FileFolder!) {
|
|
@@ -129,24 +201,13 @@ const install = async (options) => {
|
|
|
129
201
|
fail(`Хранилище файлов CRM не приняло архив (HTTP ${uploadResponse.status})`);
|
|
130
202
|
}
|
|
131
203
|
|
|
132
|
-
|
|
204
|
+
await callMetadataApi(
|
|
133
205
|
connection,
|
|
134
206
|
`mutation CompleteAppTarballUpload($fileId: UUID!) {
|
|
135
|
-
completeAppTarballUpload(fileId: $fileId) { id
|
|
207
|
+
completeAppTarballUpload(fileId: $fileId) { id }
|
|
136
208
|
}`,
|
|
137
209
|
{ fileId: createFileUpload.fileId },
|
|
138
210
|
);
|
|
139
|
-
|
|
140
|
-
console.log(`→ Устанавливаю «${completeAppTarballUpload.name}»`);
|
|
141
|
-
await callMetadataApi(
|
|
142
|
-
connection,
|
|
143
|
-
`mutation InstallApplication($universalIdentifier: String!) {
|
|
144
|
-
installApplication(universalIdentifier: $universalIdentifier) { id }
|
|
145
|
-
}`,
|
|
146
|
-
{ universalIdentifier: completeAppTarballUpload.universalIdentifier },
|
|
147
|
-
);
|
|
148
|
-
|
|
149
|
-
console.log(`\n✓ ${label} установлен. Обновите страницу CRM.\n`);
|
|
150
211
|
};
|
|
151
212
|
|
|
152
213
|
const options = readOptions(process.argv.slice(2));
|
|
@@ -156,4 +217,10 @@ if (options.help || options.url === undefined || options.apiKey === undefined) {
|
|
|
156
217
|
process.exit(options.help ? 0 : 1);
|
|
157
218
|
}
|
|
158
219
|
|
|
159
|
-
|
|
220
|
+
if (options.apiKey.startsWith('npm_')) {
|
|
221
|
+
fail('Это токен npm, а нужен ключ API самой CRM: «Настройки → API и вебхуки → Создать ключ»');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
await install(options).catch((error) =>
|
|
225
|
+
fail(`Установка не прошла: ${error instanceof CrmApiError ? error.describe() : error.message}`),
|
|
226
|
+
);
|
package/manifest.json
CHANGED
|
@@ -47,9 +47,9 @@
|
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
49
|
"defaultRoleUniversalIdentifier": "26b1dde8-4ed9-4f39-8516-e0dcb734ea5a",
|
|
50
|
-
"aboutDescription": "# Документооборот (`@crm-nordiv/docuflow`)\n\nЗадания, процессы и документы компании в одном разделе. Ставится в CRM как приложение, без правок\nсервера.\n\n- universalIdentifier: `0b7d5d2e-8c4f-4a59-9a43-2f6f1c3e9d21`\n\n## Что получается после установки\n\n| Где | Что |\n|---|---|\n| Сайдбар | пункт «Документооборот» с вкладками «Задания», «Процессы», «Документы» |\n| «Задания» | задачи раздела «Документооборот»; фильтры «Открытые / Мои / Просроченные / Выполненные», поиск, создание задания с инструкцией и полями для заполнения |\n| Карточка задачи | вкладка «Задание»: инструкция, поля задания (собрать конструктором, заполнить), «Выполнить» |\n| Карточка процесса |
|
|
51
|
-
"yarnLockChecksum": "
|
|
52
|
-
"packageJsonChecksum": "
|
|
50
|
+
"aboutDescription": "# Документооборот (`@crm-nordiv/docuflow`)\n\nЗадания, процессы и документы компании в одном разделе. Ставится в CRM как приложение, без правок\nсервера.\n\n- universalIdentifier: `0b7d5d2e-8c4f-4a59-9a43-2f6f1c3e9d21`\n\n## Что получается после установки\n\n| Где | Что |\n|---|---|\n| Сайдбар | пункт «Документооборот» с вкладками «Задания», «Процессы», «Документы» |\n| «Задания» | задачи раздела «Документооборот»; фильтры «Открытые / Мои / Просроченные / Выполненные», поиск, создание задания с инструкцией и полями для заполнения |\n| Карточка задачи | вкладка «Задание»: инструкция, поля задания (собрать конструктором, заполнить), «Выполнить» |\n| Карточка процесса | команда «Запуск и задания» (кнопка вверху, открывает боковую панель): параметры запуска (конструктор полей) и, для шагов «Человеческий ввод» черновика, кто выполняет, срок в днях, обязательные поля; у каждого поля видна переменная, которой его читают следующие шаги |\n| Редактор процесса | шаг «Запуск с параметрами» (из приложения): отдаёт следующим шагам параметры, заполненные перед запуском |\n| «Процессы» | процессы с ручным запуском раздела «Документооборот»; форма параметров до запуска, «Запустить», «Создать», «Изменить процесс» |\n| «Документы» | папки, фильтры, поиск по названию и номеру, документ с реквизитами (тип, номер, дата, срок действия, контрагент, описание), файл в поле «Файл» карточки, карточка с источником |\n| Автоматически | шаг «Человеческий ввод» процесса становится задачей; её выполнение продолжает процесс; файл, приложенный к любой записи, копируется в документы с отметкой, кто, когда и куда его добавил |\n| Битрикс24 | страница приложения в портале со списком открытых заданий сотрудника и ссылками в CRM; уведомление исполнителю нового задания |\n\n## Данные\n\n| Объект | Поля |\n|---|---|\n| `smbDocument` (новый) | название, файл, тип, номер, дата, действует до, контрагент (компания), описание, статус, автор, ответственный, папка; источник: `origin`, `sourceObjectName`, `sourceRecordId`, `sourceRecordName`, `sourceFileId`, `workflowRunId` |\n| `smbDocumentFolder` (новый) | название, цвет, родительская папка |\n| `workflow` | `smbSection` «Раздел»: CRM / Документооборот; `smbLaunchFields` «Параметры запуска» — поля, которые заполняют перед запуском |\n| `task` | `smbSection`, `smbInstruction` «Инструкция»; `smbFormSchema`, `smbFormValues` — поля задания; `smbWorkflowRunId`, `smbWorkflowStepId`, `smbWorkflowThreadId` — связь с шагом процесса |\n| `company` | `smbDocuments` — документы контрагента |\n| роли | «Документооборот: функции приложения» (права функций), «Документооборот: участник процессов» (для людей, см. ниже) |\n\n## Установка\n\nНа сервере, где запущен Twenty, из каталога с его `docker-compose.yml`; повторный запуск\nставит новую версию:\n\n```bash\ndocker compose exec server npx -y @haiiro/install@latest docuflow\n```\n\nКлючи не нужны: установщик работает внутри контейнера сервера и вызывает его команды\n`marketplace:catalog-sync`, `application:install` и `application:upgrade`. Приложение ставится\nво все компании сервера. Конкретная версия: `docuflow@0.0.6`. Публикация из репозитория форка:\n`bash scripts/smb-publish.sh docflow`.\n\nИз исходников (для разработки): `yarn install && yarn app remote:add --url … --api-key … --as prod && yarn app apply --remote prod`.\n\nЗатем в «Настройки → Приложения → Документооборот» заполнить переменные:\n\n| Переменная | Что указать |\n|---|---|\n| `DOCFLOW_ENGINE` | `APP` |\n| `CRM_PUBLIC_URL` | адрес CRM компании, например `https://acme.example.ru`; по нему строятся ссылки из Битрикс24 |\n| `BITRIX_CLIENT_ID`, `BITRIX_CLIENT_SECRET` | из карточки локального приложения портала; без них Битрикс24 не подключается, остальное работает |\n\n**Права людей.** Отвечать на шаг запущенного процесса может только тот, у кого есть право\n«Рабочие процессы». Кто выполняет задания процессов или запускает процессы с параметрами,\nполучает роль «Документооборот: участник процессов» или это право в своей роли. Право также\nпозволяет менять процессы: давайте его тем, кому это допустимо. Обычные задания и документы\nправа «Рабочие процессы» не требуют.\n\n## Как пользоваться\n\n- **Процесс.** «Процессы → Создать» открывает карточку процесса с уже выставленным разделом.\n Существующий процесс переносится в документооборот полем «Раздел» в его карточке.\n- **Запуск с параметрами.** Команда процесса «Запуск и задания» → «Добавить поле»: название, тип\n (текст, число, дата, сотрудник, компания, контакт, сделка), обязательность. «Сохранить параметры»\n ставит процессу ручной запуск, если запуска ещё нет, и первым шагом черновика — шаг «Запуск с\n параметрами». В следующих шагах параметры выбираются в списке переменных как поля этого шага:\n `{{<шаг>.<поле>}}`, точное имя показано рядом с полем. Опубликуйте процесс. Параметры\n заполняются в «Процессах» до запуска; обязательные проверяются и на странице, и на сервере, а\n значения хранятся в запуске (`trigger.smbDocflowParameters`).\n- **Задание шага.** Шаг «Человеческий ввод» становится задачей раздела процесса: у исполнителя\n из команды «Запуск и задания», без него — у запустившего. Поля задания — поля шага из редактора.\n «Выполнить» проверяет обязательные поля и продолжает процесс; значения дальше читаются\n переменными шага `{{<шаг>.<поле>}}`.\n- **Своё задание.** «Задания → Создать»: название, исполнитель, срок, инструкция и поля для\n заполнения тем же конструктором. Поля меняются в панели задания («Изменить поля»).\n- **Документы.** «Документы → Добавить документ»: реквизиты, затем «Создать и прикрепить файл» —\n справа откроется карточка документа, файл кладётся в её поле «Файл». Так сделано потому, что\n страница приложения в песочнице видит только имя и размер выбранного файла, не его содержимое.\n Файл, приложенный к любой записи (компания, сделка, задача, свой объект), появляется в\n документах сам: «Где загружен», автор, дата, для задачи процесса — ссылка на запуск. Документ\n хранит копию файла.\n\n## Ограничения\n\n- Рамку вокруг страницы раздела рисует платформа (страница из виджетов), приложение её не меняет.\n- Параметры запуска относятся к процессу, а не к версии: после правки полей опубликованная версия\n до публикации нового черновика получает новые поля, а переменные убранных полей в ней пусты.\n- Если после ручного запуска идут сразу несколько шагов, «Запуск с параметрами» встаёт перед\n первым из них; остальным ветвям переменные шага недоступны.\n- Документ без файла создаётся раньше файла: если закрыть карточку, не прикрепив файл, документ\n останется с пустым полем «Файл».\n\n## Битрикс24\n\nПодключается локальным приложением портала (одна компания — один портал).\n\n1. В портале: «Разработчикам → Другое → Локальное приложение», тип «Серверное».\n2. Адреса — HTTP-маршруты приложения на адресе компании (точный адрес виден в «Настройки →\n Приложения → Документооборот → функции»):\n - путь обработчика: `https://<адрес компании>/s/bitrix/app`\n - путь первоначальной установки: `https://<адрес компании>/s/bitrix/install`\n3. Права приложения: `user`, `im`.\n4. Сохранить, скопировать «Код приложения» и «Ключ приложения» в `BITRIX_CLIENT_ID` и\n `BITRIX_CLIENT_SECRET`, затем открыть приложение в портале — установка завершится сама.\n\nКаждый запрос портала проверяется обменом refresh-токена на `oauth.bitrix.info` с ключом\nприложения; адрес портала берётся из ответа Битрикс24. Привязывается первый подтверждённый портал,\nдругой портал к той же компании не подключится. Токены портала хранятся в хранилище приложения, не\nв записях. Сотрудник находится по почте профиля Битрикс24.\n\n## Разработка\n\n```bash\nyarn app dev # следит за src/ и синхронизирует с сервером\nyarn app dev:function:logs\nyarn test && yarn typecheck && yarn lint\n```\n\nУстройство `src/`: `shared/` — общий код (формы, процессы, фильтры REST, Битрикс24); `server/` —\nобращения к записям и движку процессов из функций; `logic-functions/`; `front/` и\n`front-components/` — интерфейс; `objects/`, `fields/`, `views/`, `roles/`, `page-layouts/`,\n`navigation-menu-items/` — данные и раскладка. Записи читаются и пишутся только через REST API\n(`server/records.ts`, `front/api.ts`), движок процессов — через две мутации GraphQL\n(`server/workflow-engine.ts`, `server/launch-step.ts`): при смене версии платформы сверять эти\nфайлы. Стили интерфейса только inline: теги `<style>` в странице приложения платформа отбрасывает.\n",
|
|
51
|
+
"yarnLockChecksum": "42ac7e58e1f5be33be57956ccaa20fb3",
|
|
52
|
+
"packageJsonChecksum": "62a145fe1d24b8fdc150b6239abbb312",
|
|
53
53
|
"requiredServerVersionRange": null,
|
|
54
54
|
"healthCheckLogicFunction": {
|
|
55
55
|
"universalIdentifier": "84360081-db5a-4f1c-9644-d975ccad9b2c"
|
|
@@ -725,7 +725,9 @@
|
|
|
725
725
|
"canSoftDeleteAllObjectRecords": false,
|
|
726
726
|
"canDestroyAllObjectRecords": false,
|
|
727
727
|
"permissionFlagUniversalIdentifiers": [
|
|
728
|
-
"6189e7bd-4051-5752-b6b1-5f31358fbaf1"
|
|
728
|
+
"6189e7bd-4051-5752-b6b1-5f31358fbaf1",
|
|
729
|
+
"dc6931a9-44bd-5164-a983-3db5db837f54",
|
|
730
|
+
"6edf252f-228e-5e2f-9706-7bab7a796fd3"
|
|
729
731
|
],
|
|
730
732
|
"objectPermissions": [],
|
|
731
733
|
"fieldPermissions": [],
|
|
@@ -947,7 +949,7 @@
|
|
|
947
949
|
"handlerName": "default.config.handler",
|
|
948
950
|
"sourceHandlerPath": "src/logic-functions/capture-file.logic-function.ts",
|
|
949
951
|
"builtHandlerPath": "src/logic-functions/capture-file.logic-function.mjs",
|
|
950
|
-
"builtHandlerChecksum": "
|
|
952
|
+
"builtHandlerChecksum": "bc75be09cf7a967ea95d3b9f7876f402"
|
|
951
953
|
},
|
|
952
954
|
{
|
|
953
955
|
"universalIdentifier": "f7559a62-213e-4b1f-a142-603b463a585a",
|
|
@@ -989,7 +991,7 @@
|
|
|
989
991
|
"componentName": "TaskForm",
|
|
990
992
|
"sourceComponentPath": "src/front-components/task-form.front-component.tsx",
|
|
991
993
|
"builtComponentPath": "src/front-components/task-form.front-component.mjs",
|
|
992
|
-
"builtComponentChecksum": "
|
|
994
|
+
"builtComponentChecksum": "d7fab9dddddda34b40ef5fd41273882db1755672061ae1d631b1a1b52af32e85",
|
|
993
995
|
"isHeadless": false,
|
|
994
996
|
"usesSdkClient": true
|
|
995
997
|
},
|
|
@@ -1000,7 +1002,7 @@
|
|
|
1000
1002
|
"componentName": "ProcessSteps",
|
|
1001
1003
|
"sourceComponentPath": "src/front-components/process-steps.front-component.tsx",
|
|
1002
1004
|
"builtComponentPath": "src/front-components/process-steps.front-component.mjs",
|
|
1003
|
-
"builtComponentChecksum": "
|
|
1005
|
+
"builtComponentChecksum": "659adef94bb6b100e3f7af76b50cb03d4ddfb1af88da2648212c2aeddec8c927",
|
|
1004
1006
|
"isHeadless": false,
|
|
1005
1007
|
"usesSdkClient": true
|
|
1006
1008
|
},
|
|
@@ -1011,7 +1013,7 @@
|
|
|
1011
1013
|
"componentName": "DocflowTasks",
|
|
1012
1014
|
"sourceComponentPath": "src/front-components/docflow-tasks.front-component.tsx",
|
|
1013
1015
|
"builtComponentPath": "src/front-components/docflow-tasks.front-component.mjs",
|
|
1014
|
-
"builtComponentChecksum": "
|
|
1016
|
+
"builtComponentChecksum": "7e15cd586a0d1d162ef92542f6004b943b9c6bac88f29467b9936ef0a4e17cbf",
|
|
1015
1017
|
"isHeadless": false,
|
|
1016
1018
|
"usesSdkClient": true
|
|
1017
1019
|
},
|
|
@@ -1022,9 +1024,9 @@
|
|
|
1022
1024
|
"componentName": "DocflowDocuments",
|
|
1023
1025
|
"sourceComponentPath": "src/front-components/docflow-documents.front-component.tsx",
|
|
1024
1026
|
"builtComponentPath": "src/front-components/docflow-documents.front-component.mjs",
|
|
1025
|
-
"builtComponentChecksum": "
|
|
1027
|
+
"builtComponentChecksum": "f3c446b3ed107e2131132b30f612448b4cabd2467758cef01488304097935234",
|
|
1026
1028
|
"isHeadless": false,
|
|
1027
|
-
"usesSdkClient":
|
|
1029
|
+
"usesSdkClient": false
|
|
1028
1030
|
},
|
|
1029
1031
|
{
|
|
1030
1032
|
"universalIdentifier": "ee4f4169-9ef7-44e6-bbd4-aa60384a9f46",
|
|
@@ -1033,7 +1035,7 @@
|
|
|
1033
1035
|
"componentName": "DocflowProcesses",
|
|
1034
1036
|
"sourceComponentPath": "src/front-components/docflow-processes.front-component.tsx",
|
|
1035
1037
|
"builtComponentPath": "src/front-components/docflow-processes.front-component.mjs",
|
|
1036
|
-
"builtComponentChecksum": "
|
|
1038
|
+
"builtComponentChecksum": "e3f1ad14777174405307e1d140bba65818b4b20b26afe2cb6b4ca6daa9eade57",
|
|
1037
1039
|
"isHeadless": false,
|
|
1038
1040
|
"usesSdkClient": true
|
|
1039
1041
|
}
|
|
@@ -1306,30 +1308,22 @@
|
|
|
1306
1308
|
}
|
|
1307
1309
|
}
|
|
1308
1310
|
]
|
|
1309
|
-
}
|
|
1311
|
+
}
|
|
1312
|
+
],
|
|
1313
|
+
"pageLayoutWidgets": [],
|
|
1314
|
+
"commandMenuItems": [
|
|
1310
1315
|
{
|
|
1311
|
-
"universalIdentifier": "
|
|
1312
|
-
"
|
|
1313
|
-
"
|
|
1314
|
-
"position": 50,
|
|
1316
|
+
"universalIdentifier": "c3f5a2d4-7e1b-4c9a-8f36-2b5d0e7a91c4",
|
|
1317
|
+
"label": "Запуск и задания",
|
|
1318
|
+
"shortLabel": "Запуск и задания",
|
|
1315
1319
|
"icon": "IconPlayerPlay",
|
|
1316
|
-
"
|
|
1317
|
-
"
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
"type": "FRONT_COMPONENT",
|
|
1322
|
-
"heightBehavior": "FIT_CONTENT",
|
|
1323
|
-
"configuration": {
|
|
1324
|
-
"configurationType": "FRONT_COMPONENT",
|
|
1325
|
-
"frontComponentUniversalIdentifier": "839b8f10-d269-4005-a13a-0838610747b9"
|
|
1326
|
-
}
|
|
1327
|
-
}
|
|
1328
|
-
]
|
|
1320
|
+
"isPinned": true,
|
|
1321
|
+
"availabilityType": "RECORD_SELECTION",
|
|
1322
|
+
"availabilityObjectUniversalIdentifier": "20202020-62be-406c-b9ca-8caa50d51392",
|
|
1323
|
+
"frontComponentUniversalIdentifier": "839b8f10-d269-4005-a13a-0838610747b9",
|
|
1324
|
+
"conditionalAvailabilityExpression": "numberOfSelectedRecords == 1"
|
|
1329
1325
|
}
|
|
1330
1326
|
],
|
|
1331
|
-
"pageLayoutWidgets": [],
|
|
1332
|
-
"commandMenuItems": [],
|
|
1333
1327
|
"timelineActivityTypes": [],
|
|
1334
1328
|
"settingsMenuItems": []
|
|
1335
1329
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haiiro/docuflow",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"description": "NorDiv Документооборот: задания с полями, процессы с запуском по параметрам, документы со всех записей, приложение Битрикс24",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"publishConfig": {
|