@haiiro/docuflow 0.0.9 → 0.0.11
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 +16 -11
- package/bin/install.mjs +32 -10
- package/manifest.json +82 -24
- 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 +206 -94
- package/src/front-components/docflow-processes.front-component.mjs +42 -42
- package/src/front-components/docflow-processes.front-component.tsx +157 -71
- package/src/front-components/docflow-tasks.front-component.mjs +42 -42
- package/src/front-components/docflow-tasks.front-component.tsx +57 -47
- package/src/front-components/process-steps.front-component.mjs +36 -36
- package/src/front-components/process-steps.front-component.tsx +1 -1
- package/src/front-components/task-form.front-component.mjs +36 -36
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
| Где | Что |
|
|
11
11
|
|---|---|
|
|
12
|
-
| Сайдбар |
|
|
12
|
+
| Сайдбар | папка «Документооборот» с пунктами «Задания», «Процессы», «Документы» — у каждого своя страница |
|
|
13
13
|
| «Задания» | задачи раздела «Документооборот»; фильтры «Открытые / Мои / Просроченные / Выполненные / Архив» (архив — удалённые, со штатным «Восстановить»), поиск, создание задания с инструкцией и полями для заполнения |
|
|
14
14
|
| Карточка задачи | вкладка «Задание»: инструкция, поля задания (собрать конструктором, заполнить), «Выполнить» |
|
|
15
15
|
| Карточка процесса | кнопка «Параметры запуска» вверху (боковая панель): параметры запуска (конструктор полей) и, для шагов «Человеческий ввод» черновика, кто выполняет, срок в днях, обязательные поля; у каждого поля видна переменная, которой его читают следующие шаги |
|
|
@@ -32,19 +32,19 @@
|
|
|
32
32
|
|
|
33
33
|
## Установка
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
ставит новую версию:
|
|
35
|
+
С любого компьютера с Node.js 20+, нужен только адрес CRM и ключ API администратора
|
|
36
|
+
(«Настройки → API и вебхуки → Создать ключ»). Повторный запуск ставит новую версию:
|
|
37
37
|
|
|
38
38
|
```bash
|
|
39
|
-
|
|
39
|
+
npx -y @haiiro/docuflow install --url https://crm.example.ru --api-key <ключ>
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
`
|
|
44
|
-
|
|
45
|
-
`bash scripts/smb-publish.sh docflow`.
|
|
42
|
+
Установщик загружает в CRM опубликованный архив этой версии пакета и устанавливает приложение
|
|
43
|
+
(как `twenty app:install`), доступ к серверу и его настройки не нужны. Конкретная версия:
|
|
44
|
+
`--version 0.0.8`.
|
|
46
45
|
|
|
47
|
-
Из исходников (для разработки): `
|
|
46
|
+
Из исходников (для разработки): `node scripts/reinstall.mjs docuflow --local` в корне репозитория
|
|
47
|
+
(нужны `CRM_URL` и `CRM_API_KEY` в `.env`).
|
|
48
48
|
|
|
49
49
|
Затем в «Настройки → Приложения → Документооборот» заполнить переменные:
|
|
50
50
|
|
|
@@ -83,8 +83,13 @@ docker compose exec server npx -y @haiiro/install@latest docuflow
|
|
|
83
83
|
из «Параметров запуска», без него — у запустившего. Поля задания — поля шага из редактора.
|
|
84
84
|
«Выполнить» проверяет обязательные поля и продолжает процесс; значения дальше читаются
|
|
85
85
|
переменными шага `{{<шаг>.<поле>}}`.
|
|
86
|
-
-
|
|
87
|
-
|
|
86
|
+
- **Списки.** Фильтры — в окне под полем поиска (значок фильтра горит, когда фильтр включён),
|
|
87
|
+
сортировка — кликом по заголовку колонки. Действия со строкой — в «⋯» в её конце: открыть,
|
|
88
|
+
переименовать, переместить в папку, удалить и т. п. «Процессы» показывают все процессы раздела,
|
|
89
|
+
опубликованные и черновики.
|
|
90
|
+
- **Папки документов.** «+ Новая папка», у папки «⋯ → Переименовать и оформить»: название, цвет и
|
|
91
|
+
значок; удаление папки оставляет документы в «Все документы».
|
|
92
|
+
- **Удаление.** «⋯ → Удалить» спрашивает ещё раз и удаляет. Запись уходит в корзину Twenty и
|
|
88
93
|
восстанавливается: задания — в фильтре «Архив», документы — в фильтре «Удалённые», процессы — в
|
|
89
94
|
штатном списке «Рабочие процессы → Удалённые»; в карточке удалённой записи есть «Восстановить».
|
|
90
95
|
Для этого роль приложения может мягко удалять только документы, задачи и процессы.
|
package/bin/install.mjs
CHANGED
|
@@ -94,6 +94,12 @@ class CrmApiError extends Error {
|
|
|
94
94
|
this.rawMessage = graphqlError?.message ?? '';
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
+
// This version's archive was uploaded to the CRM before (also before an
|
|
98
|
+
// uninstall): the server keeps it and installs from that copy.
|
|
99
|
+
get isAlreadyDeployed() {
|
|
100
|
+
return /not higher than the currently deployed/i.test(`${this.message} ${this.rawMessage}`);
|
|
101
|
+
}
|
|
102
|
+
|
|
97
103
|
// The app was installed from the marketplace on this CRM: the server keeps
|
|
98
104
|
// it tied to npm and refuses an archive for it.
|
|
99
105
|
get isSourceChannelMismatch() {
|
|
@@ -161,23 +167,39 @@ const install = async (options) => {
|
|
|
161
167
|
try {
|
|
162
168
|
await uploadArchive(connection, label, tarball);
|
|
163
169
|
} catch (error) {
|
|
164
|
-
if (!(error instanceof CrmApiError) || !error.isSourceChannelMismatch) {
|
|
170
|
+
if (!(error instanceof CrmApiError) || !(error.isSourceChannelMismatch || error.isAlreadyDeployed)) {
|
|
165
171
|
throw error;
|
|
166
172
|
}
|
|
167
173
|
|
|
168
174
|
// Installed from the marketplace before: the server fetches the same
|
|
169
|
-
// version from npm itself.
|
|
170
|
-
|
|
175
|
+
// version from npm itself. Or this version was uploaded before: the
|
|
176
|
+
// server has its copy.
|
|
177
|
+
console.log(
|
|
178
|
+
error.isAlreadyDeployed
|
|
179
|
+
? `→ Версия ${options.version} уже загружена в CRM раньше, ставлю её`
|
|
180
|
+
: '→ Приложение подключено из каталога npm, ставлю эту версию через каталог',
|
|
181
|
+
);
|
|
171
182
|
}
|
|
172
183
|
|
|
173
184
|
console.log(`→ Устанавливаю «${manifest.application.displayName ?? packageJson.name}» ${options.version}`);
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
185
|
+
|
|
186
|
+
try {
|
|
187
|
+
await callMetadataApi(
|
|
188
|
+
connection,
|
|
189
|
+
`mutation InstallApplication($universalIdentifier: String!, $version: String) {
|
|
190
|
+
installApplication(universalIdentifier: $universalIdentifier, version: $version) { id }
|
|
191
|
+
}`,
|
|
192
|
+
{ universalIdentifier: manifest.application.universalIdentifier, version: options.version },
|
|
193
|
+
);
|
|
194
|
+
} catch (error) {
|
|
195
|
+
if (!(error instanceof CrmApiError) || !/already installed/i.test(`${error.message} ${error.rawMessage}`)) {
|
|
196
|
+
throw error;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
console.log(`\n✓ ${label} уже установлен в этой CRM.\n`);
|
|
200
|
+
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
181
203
|
|
|
182
204
|
console.log(`\n✓ ${label} установлен. Обновите страницу CRM.\n`);
|
|
183
205
|
};
|
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| Карточка процесса | кнопка «Параметры запуска» вверху (боковая панель): параметры запуска (конструктор полей) и, для шагов «Человеческий ввод» черновика, кто выполняет, срок в днях, обязательные поля; у каждого поля видна переменная, которой его читают следующие шаги |\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 выбираются как его переменные `{{trigger.<поле>}}` — например «Запуск с параметрами →\n Сотрудник → Id» в поле «Исполнитель» задачи. Без параметров процесс начинается с обычного\n «Запуск вручную». Опубликуйте процесс. Параметры заполняются в «Процессах» до запуска;\n обязательные проверяются и на странице, и на сервере.\n\n Устройство: своих типов триггеров у приложений Twenty нет, а у «Запуск вручную» редактор\n показывает только свои переменные. Поэтому «Запуск с параметрами» — штатный триггер Webhook\n (POST, только с ключом API), поля параметров — его тело. Документооборот запускает такую версию\n сам; внешняя система (например, мост в Битрикс24) может запустить процесс POST-запросом на адрес\n вебхука с ключом API и телом из этих полей — тогда проверку обязательных полей делает она.\n Шаг «Параметры запуска» процессов из 0.0.6 и раньше при первом сохранении параметров убирается,\n его переменные в следующих шагах переводятся на `trigger`.\n- **Задание шага.** Шаг «Человеческий ввод» становится задачей раздела процесса: у исполнителя\n из «Параметров запуска», без него — у запустившего. Поля задания — поля шага из редактора.\n «Выполнить» проверяет обязательные поля и продолжает процесс; значения дальше читаются\n переменными шага `{{<шаг>.<поле>}}`.\n- **Удаление.** В «Заданиях», «Процессах» и «Документах» у строки под курсором есть «Удалить»:\n первый клик спрашивает «Удалить?», второй удаляет. Запись уходит в корзину Twenty и\n восстанавливается: задания — в фильтре «Архив», документы — в фильтре «Удалённые», процессы — в\n штатном списке «Рабочие процессы → Удалённые»; в карточке удалённой записи есть «Восстановить».\n Для этого роль приложения может мягко удалять только документы, задачи и процессы.\n- **Параметры в редакторе.** После «Сохранить параметры» редактор процесса открывается заново:\n он держит загруженную версию и иначе показал бы новые переменные только после перезагрузки.\n- **Своё задание.** «Задания → Создать»: название, исполнитель, срок, инструкция и поля для\n заполнения тем же конструктором. Поля меняются в панели задания («Изменить поля»).\n- **Документы.** «Документы → Создать» создаёт черновик в открытой папке и открывает его штатную\n карточку: там реквизиты и поле «Файл»; строка списка открывает ту же карточку. Так сделано потому, что\n страница приложения в песочнице видит только имя и размер выбранного файла, не его содержимое.\n Файл, приложенный к любой записи (компания, сделка, задача, свой объект), появляется в\n документах сам: «Где загружен», автор, дата, для задачи процесса — ссылка на запуск. Документ\n хранит копию файла.\n\n## Ограничения\n\n- Рамки вокруг страницы раздела рисует платформа: карточку виджета и рамку вокруг компонента\n приложения. Компоненты приложений работают в изолированном worker'е и убрать их не могут.\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",
|
|
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С любого компьютера с Node.js 20+, нужен только адрес CRM и ключ API администратора\n(«Настройки → API и вебхуки → Создать ключ»). Повторный запуск ставит новую версию:\n\n```bash\nnpx -y @haiiro/docuflow install --url https://crm.example.ru --api-key <ключ>\n```\n\nУстановщик загружает в CRM опубликованный архив этой версии пакета и устанавливает приложение\n(как `twenty app:install`), доступ к серверу и его настройки не нужны. Конкретная версия:\n`--version 0.0.8`.\n\nИз исходников (для разработки): `node scripts/reinstall.mjs docuflow --local` в корне репозитория\n(нужны `CRM_URL` и `CRM_API_KEY` в `.env`).\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 выбираются как его переменные `{{trigger.<поле>}}` — например «Запуск с параметрами →\n Сотрудник → Id» в поле «Исполнитель» задачи. Без параметров процесс начинается с обычного\n «Запуск вручную». Опубликуйте процесс. Параметры заполняются в «Процессах» до запуска;\n обязательные проверяются и на странице, и на сервере.\n\n Устройство: своих типов триггеров у приложений Twenty нет, а у «Запуск вручную» редактор\n показывает только свои переменные. Поэтому «Запуск с параметрами» — штатный триггер Webhook\n (POST, только с ключом API), поля параметров — его тело. Документооборот запускает такую версию\n сам; внешняя система (например, мост в Битрикс24) может запустить процесс POST-запросом на адрес\n вебхука с ключом API и телом из этих полей — тогда проверку обязательных полей делает она.\n Шаг «Параметры запуска» процессов из 0.0.6 и раньше при первом сохранении параметров убирается,\n его переменные в следующих шагах переводятся на `trigger`.\n- **Задание шага.** Шаг «Человеческий ввод» становится задачей раздела процесса: у исполнителя\n из «Параметров запуска», без него — у запустившего. Поля задания — поля шага из редактора.\n «Выполнить» проверяет обязательные поля и продолжает процесс; значения дальше читаются\n переменными шага `{{<шаг>.<поле>}}`.\n- **Списки.** Фильтры — в окне под полем поиска (значок фильтра горит, когда фильтр включён),\n сортировка — кликом по заголовку колонки. Действия со строкой — в «⋯» в её конце: открыть,\n переименовать, переместить в папку, удалить и т. п. «Процессы» показывают все процессы раздела,\n опубликованные и черновики.\n- **Папки документов.** «+ Новая папка», у папки «⋯ → Переименовать и оформить»: название, цвет и\n значок; удаление папки оставляет документы в «Все документы».\n- **Удаление.** «⋯ → Удалить» спрашивает ещё раз и удаляет. Запись уходит в корзину Twenty и\n восстанавливается: задания — в фильтре «Архив», документы — в фильтре «Удалённые», процессы — в\n штатном списке «Рабочие процессы → Удалённые»; в карточке удалённой записи есть «Восстановить».\n Для этого роль приложения может мягко удалять только документы, задачи и процессы.\n- **Параметры в редакторе.** После «Сохранить параметры» редактор процесса открывается заново:\n он держит загруженную версию и иначе показал бы новые переменные только после перезагрузки.\n- **Своё задание.** «Задания → Создать»: название, исполнитель, срок, инструкция и поля для\n заполнения тем же конструктором. Поля меняются в панели задания («Изменить поля»).\n- **Документы.** «Документы → Создать» создаёт черновик в открытой папке и открывает его штатную\n карточку: там реквизиты и поле «Файл»; строка списка открывает ту же карточку. Так сделано потому, что\n страница приложения в песочнице видит только имя и размер выбранного файла, не его содержимое.\n Файл, приложенный к любой записи (компания, сделка, задача, свой объект), появляется в\n документах сам: «Где загружен», автор, дата, для задачи процесса — ссылка на запуск. Документ\n хранит копию файла.\n\n## Ограничения\n\n- Рамки вокруг страницы раздела рисует платформа: карточку виджета и рамку вокруг компонента\n приложения. Компоненты приложений работают в изолированном worker'е и убрать их не могут.\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
51
|
"yarnLockChecksum": "42ac7e58e1f5be33be57956ccaa20fb3",
|
|
52
|
-
"packageJsonChecksum": "
|
|
52
|
+
"packageJsonChecksum": "5f6c8154ff516638f8521ec7e7aa4312",
|
|
53
53
|
"requiredServerVersionRange": null,
|
|
54
54
|
"healthCheckLogicFunction": {
|
|
55
55
|
"universalIdentifier": "84360081-db5a-4f1c-9644-d975ccad9b2c"
|
|
@@ -371,6 +371,16 @@
|
|
|
371
371
|
"icon": "IconAbc",
|
|
372
372
|
"name": "name"
|
|
373
373
|
},
|
|
374
|
+
{
|
|
375
|
+
"universalIdentifier": "ba5dc9b0-5592-48c8-b0a5-13c9ea91c548",
|
|
376
|
+
"type": "TEXT",
|
|
377
|
+
"label": "Значок",
|
|
378
|
+
"icon": "IconIcons",
|
|
379
|
+
"name": "icon",
|
|
380
|
+
"description": "Значок папки в документах, имя иконки Tabler (IconFolder, IconBriefcase…)",
|
|
381
|
+
"isNullable": true,
|
|
382
|
+
"defaultValue": null
|
|
383
|
+
},
|
|
374
384
|
{
|
|
375
385
|
"universalIdentifier": "bd9ffd70-819f-4e09-bba1-d76002fb7b6b",
|
|
376
386
|
"type": "SELECT",
|
|
@@ -733,6 +743,14 @@
|
|
|
733
743
|
"canDestroyObjectRecords": false,
|
|
734
744
|
"universalIdentifier": "f82e6bc7-751b-5ff2-8c5b-0aa4d05bcd3a"
|
|
735
745
|
},
|
|
746
|
+
{
|
|
747
|
+
"objectUniversalIdentifier": "dfbf9c6a-8ee5-4598-9bc3-f767d3636e17",
|
|
748
|
+
"canReadObjectRecords": true,
|
|
749
|
+
"canUpdateObjectRecords": true,
|
|
750
|
+
"canSoftDeleteObjectRecords": true,
|
|
751
|
+
"canDestroyObjectRecords": false,
|
|
752
|
+
"universalIdentifier": "3bc9c33d-cf6a-52bc-9155-3029fc5d51f9"
|
|
753
|
+
},
|
|
736
754
|
{
|
|
737
755
|
"objectUniversalIdentifier": "20202020-1ba1-48ba-bc83-ef7e5990ed10",
|
|
738
756
|
"canReadObjectRecords": true,
|
|
@@ -995,7 +1013,7 @@
|
|
|
995
1013
|
"componentName": "TaskForm",
|
|
996
1014
|
"sourceComponentPath": "src/front-components/task-form.front-component.tsx",
|
|
997
1015
|
"builtComponentPath": "src/front-components/task-form.front-component.mjs",
|
|
998
|
-
"builtComponentChecksum": "
|
|
1016
|
+
"builtComponentChecksum": "33fa54e8c3bd27830f85195a4aa1e489262371b137b48a131d95484e34a49812",
|
|
999
1017
|
"isHeadless": false,
|
|
1000
1018
|
"usesSdkClient": true
|
|
1001
1019
|
},
|
|
@@ -1006,7 +1024,7 @@
|
|
|
1006
1024
|
"componentName": "ProcessSteps",
|
|
1007
1025
|
"sourceComponentPath": "src/front-components/process-steps.front-component.tsx",
|
|
1008
1026
|
"builtComponentPath": "src/front-components/process-steps.front-component.mjs",
|
|
1009
|
-
"builtComponentChecksum": "
|
|
1027
|
+
"builtComponentChecksum": "45fcaea1fa2f65a7d6a3bee5aa99f413eb351465147fc2f439e01a9cf1066de4",
|
|
1010
1028
|
"isHeadless": false,
|
|
1011
1029
|
"usesSdkClient": true
|
|
1012
1030
|
},
|
|
@@ -1017,7 +1035,7 @@
|
|
|
1017
1035
|
"componentName": "DocflowTasks",
|
|
1018
1036
|
"sourceComponentPath": "src/front-components/docflow-tasks.front-component.tsx",
|
|
1019
1037
|
"builtComponentPath": "src/front-components/docflow-tasks.front-component.mjs",
|
|
1020
|
-
"builtComponentChecksum": "
|
|
1038
|
+
"builtComponentChecksum": "9a7cf922b19dc40d860e3162594e42cdf306bdbadfb9f5f10909e0c816c760a9",
|
|
1021
1039
|
"isHeadless": false,
|
|
1022
1040
|
"usesSdkClient": true
|
|
1023
1041
|
},
|
|
@@ -1028,7 +1046,7 @@
|
|
|
1028
1046
|
"componentName": "DocflowDocuments",
|
|
1029
1047
|
"sourceComponentPath": "src/front-components/docflow-documents.front-component.tsx",
|
|
1030
1048
|
"builtComponentPath": "src/front-components/docflow-documents.front-component.mjs",
|
|
1031
|
-
"builtComponentChecksum": "
|
|
1049
|
+
"builtComponentChecksum": "960bba09e135069123bb0ddb2522e2da482c89c54c8bb36a8624aa5e1b246393",
|
|
1032
1050
|
"isHeadless": false,
|
|
1033
1051
|
"usesSdkClient": false
|
|
1034
1052
|
},
|
|
@@ -1039,7 +1057,7 @@
|
|
|
1039
1057
|
"componentName": "DocflowProcesses",
|
|
1040
1058
|
"sourceComponentPath": "src/front-components/docflow-processes.front-component.tsx",
|
|
1041
1059
|
"builtComponentPath": "src/front-components/docflow-processes.front-component.mjs",
|
|
1042
|
-
"builtComponentChecksum": "
|
|
1060
|
+
"builtComponentChecksum": "e1cf8f66264e75ac353360519f3f219764c30299a8719de5a7236e00ec17c238",
|
|
1043
1061
|
"isHeadless": false,
|
|
1044
1062
|
"usesSdkClient": true
|
|
1045
1063
|
}
|
|
@@ -1217,19 +1235,45 @@
|
|
|
1217
1235
|
],
|
|
1218
1236
|
"viewFields": [],
|
|
1219
1237
|
"navigationMenuItems": [
|
|
1238
|
+
{
|
|
1239
|
+
"universalIdentifier": "5355f1b8-c9aa-408f-a6a1-4fba20783f50",
|
|
1240
|
+
"name": "Процессы",
|
|
1241
|
+
"icon": "IconTopologyStar3",
|
|
1242
|
+
"position": 1,
|
|
1243
|
+
"type": "PAGE_LAYOUT",
|
|
1244
|
+
"pageLayoutUniversalIdentifier": "9e32175c-8751-47c7-8310-79592798d0ba",
|
|
1245
|
+
"folderUniversalIdentifier": "ad0bb840-6369-4d61-a4c8-eadd887c3653"
|
|
1246
|
+
},
|
|
1247
|
+
{
|
|
1248
|
+
"universalIdentifier": "5cb9f473-2f5b-4b9d-bdad-2bd33c15084f",
|
|
1249
|
+
"name": "Документы",
|
|
1250
|
+
"icon": "IconFileText",
|
|
1251
|
+
"position": 2,
|
|
1252
|
+
"type": "PAGE_LAYOUT",
|
|
1253
|
+
"pageLayoutUniversalIdentifier": "59b1060b-6892-40ef-b32d-01174b16296b",
|
|
1254
|
+
"folderUniversalIdentifier": "ad0bb840-6369-4d61-a4c8-eadd887c3653"
|
|
1255
|
+
},
|
|
1220
1256
|
{
|
|
1221
1257
|
"universalIdentifier": "684b284a-5539-4576-8ff3-bebc42b6b040",
|
|
1258
|
+
"name": "Задания",
|
|
1259
|
+
"icon": "IconChecklist",
|
|
1260
|
+
"position": 0,
|
|
1261
|
+
"type": "PAGE_LAYOUT",
|
|
1262
|
+
"pageLayoutUniversalIdentifier": "2afc1ee1-4931-45c9-a656-284703432ae9",
|
|
1263
|
+
"folderUniversalIdentifier": "ad0bb840-6369-4d61-a4c8-eadd887c3653"
|
|
1264
|
+
},
|
|
1265
|
+
{
|
|
1266
|
+
"universalIdentifier": "ad0bb840-6369-4d61-a4c8-eadd887c3653",
|
|
1222
1267
|
"name": "Документооборот",
|
|
1223
1268
|
"icon": "IconFiles",
|
|
1224
1269
|
"position": 0,
|
|
1225
|
-
"type": "
|
|
1226
|
-
"pageLayoutUniversalIdentifier": "2afc1ee1-4931-45c9-a656-284703432ae9"
|
|
1270
|
+
"type": "FOLDER"
|
|
1227
1271
|
}
|
|
1228
1272
|
],
|
|
1229
1273
|
"pageLayouts": [
|
|
1230
1274
|
{
|
|
1231
1275
|
"universalIdentifier": "2afc1ee1-4931-45c9-a656-284703432ae9",
|
|
1232
|
-
"name": "
|
|
1276
|
+
"name": "Задания",
|
|
1233
1277
|
"type": "STANDALONE_PAGE",
|
|
1234
1278
|
"tabs": [
|
|
1235
1279
|
{
|
|
@@ -1250,41 +1294,55 @@
|
|
|
1250
1294
|
}
|
|
1251
1295
|
}
|
|
1252
1296
|
]
|
|
1253
|
-
}
|
|
1297
|
+
}
|
|
1298
|
+
]
|
|
1299
|
+
},
|
|
1300
|
+
{
|
|
1301
|
+
"universalIdentifier": "59b1060b-6892-40ef-b32d-01174b16296b",
|
|
1302
|
+
"name": "Документы",
|
|
1303
|
+
"type": "STANDALONE_PAGE",
|
|
1304
|
+
"tabs": [
|
|
1254
1305
|
{
|
|
1255
|
-
"universalIdentifier": "
|
|
1256
|
-
"title": "
|
|
1257
|
-
"position":
|
|
1258
|
-
"icon": "
|
|
1306
|
+
"universalIdentifier": "6812be11-2eba-4a84-9fa6-415a20a8c41b",
|
|
1307
|
+
"title": "Документы",
|
|
1308
|
+
"position": 0,
|
|
1309
|
+
"icon": "IconFileText",
|
|
1259
1310
|
"layoutMode": "VERTICAL_LIST",
|
|
1260
1311
|
"widgets": [
|
|
1261
1312
|
{
|
|
1262
|
-
"universalIdentifier": "
|
|
1313
|
+
"universalIdentifier": "0186ba32-7eed-4882-ac28-55309fb6aad5",
|
|
1263
1314
|
"title": " ",
|
|
1264
1315
|
"type": "FRONT_COMPONENT",
|
|
1265
1316
|
"heightBehavior": "TAB_VIEWPORT",
|
|
1266
1317
|
"configuration": {
|
|
1267
1318
|
"configurationType": "FRONT_COMPONENT",
|
|
1268
|
-
"frontComponentUniversalIdentifier": "
|
|
1319
|
+
"frontComponentUniversalIdentifier": "ea04342b-c22e-4aa6-aa70-368899394750"
|
|
1269
1320
|
}
|
|
1270
1321
|
}
|
|
1271
1322
|
]
|
|
1272
|
-
}
|
|
1323
|
+
}
|
|
1324
|
+
]
|
|
1325
|
+
},
|
|
1326
|
+
{
|
|
1327
|
+
"universalIdentifier": "9e32175c-8751-47c7-8310-79592798d0ba",
|
|
1328
|
+
"name": "Процессы",
|
|
1329
|
+
"type": "STANDALONE_PAGE",
|
|
1330
|
+
"tabs": [
|
|
1273
1331
|
{
|
|
1274
|
-
"universalIdentifier": "
|
|
1275
|
-
"title": "
|
|
1276
|
-
"position":
|
|
1277
|
-
"icon": "
|
|
1332
|
+
"universalIdentifier": "2a39e80b-5ffd-4b36-ad55-31858985faf5",
|
|
1333
|
+
"title": "Процессы",
|
|
1334
|
+
"position": 0,
|
|
1335
|
+
"icon": "IconTopologyStar3",
|
|
1278
1336
|
"layoutMode": "VERTICAL_LIST",
|
|
1279
1337
|
"widgets": [
|
|
1280
1338
|
{
|
|
1281
|
-
"universalIdentifier": "
|
|
1339
|
+
"universalIdentifier": "a81078bf-e8cd-497a-a557-89fe3d428842",
|
|
1282
1340
|
"title": " ",
|
|
1283
1341
|
"type": "FRONT_COMPONENT",
|
|
1284
1342
|
"heightBehavior": "TAB_VIEWPORT",
|
|
1285
1343
|
"configuration": {
|
|
1286
1344
|
"configurationType": "FRONT_COMPONENT",
|
|
1287
|
-
"frontComponentUniversalIdentifier": "
|
|
1345
|
+
"frontComponentUniversalIdentifier": "ee4f4169-9ef7-44e6-bbd4-aa60384a9f46"
|
|
1288
1346
|
}
|
|
1289
1347
|
}
|
|
1290
1348
|
]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haiiro/docuflow",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"description": "NorDiv Документооборот: задания с полями, процессы с запуском по параметрам, документы со всех записей, приложение Битрикс24",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"publishConfig": {
|