@haiiro/docuflow 0.0.0-stage → 0.0.2
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/.nvmrc +1 -0
- package/.oxlintrc.json +37 -0
- package/.yarnrc.yml +1 -0
- package/README.md +127 -2
- package/package.json +60 -4
- package/public/cover.svg +15 -0
- package/public/logo.svg +9 -0
- package/src/application-config.ts +58 -0
- package/src/fields/company-documents.field.ts +29 -0
- package/src/fields/document-author.field.ts +32 -0
- package/src/fields/document-counterparty.field.ts +32 -0
- package/src/fields/document-folder-child-folders.field.ts +23 -0
- package/src/fields/document-folder-documents.field.ts +24 -0
- package/src/fields/document-folder-parent-folder.field.ts +31 -0
- package/src/fields/document-folder.field.ts +32 -0
- package/src/fields/document-responsible.field.ts +32 -0
- package/src/fields/member-authored-documents.field.ts +29 -0
- package/src/fields/member-responsible-documents.field.ts +29 -0
- package/src/fields/task-form-schema.field.ts +21 -0
- package/src/fields/task-form-values.field.ts +21 -0
- package/src/fields/task-instruction.field.ts +21 -0
- package/src/fields/task-section.field.ts +36 -0
- package/src/fields/task-workflow-run-id.field.ts +21 -0
- package/src/fields/task-workflow-step-id.field.ts +21 -0
- package/src/fields/task-workflow-thread-id.field.ts +21 -0
- package/src/fields/workflow-launch-fields.field.ts +21 -0
- package/src/fields/workflow-section.field.ts +36 -0
- package/src/front/api.ts +56 -0
- package/src/front/format.ts +60 -0
- package/src/front/hooks/use-async.ts +54 -0
- package/src/front/hooks/use-workspace-members.ts +22 -0
- package/src/front/types.ts +48 -0
- package/src/front/ui/components.tsx +436 -0
- package/src/front/ui/form-field-inputs.tsx +187 -0
- package/src/front/ui/form-fields-builder.tsx +183 -0
- package/src/front/ui/task-work-panel.tsx +218 -0
- package/src/front-components/docflow-documents.front-component.tsx +516 -0
- package/src/front-components/docflow-processes.front-component.tsx +266 -0
- package/src/front-components/docflow-tasks.front-component.tsx +303 -0
- package/src/front-components/process-steps.front-component.tsx +286 -0
- package/src/front-components/task-form.front-component.tsx +29 -0
- package/src/logic-functions/bitrix-app.logic-function.ts +143 -0
- package/src/logic-functions/bitrix-event.logic-function.ts +54 -0
- package/src/logic-functions/bitrix-install.logic-function.ts +81 -0
- package/src/logic-functions/capture-file.logic-function.ts +32 -0
- package/src/logic-functions/complete-task.logic-function.ts +46 -0
- package/src/logic-functions/hand-out-form-step.logic-function.ts +30 -0
- package/src/logic-functions/health-check.ts +31 -0
- package/src/logic-functions/launch-parameters-step.logic-function.ts +33 -0
- package/src/logic-functions/launch-process.logic-function.ts +96 -0
- package/src/logic-functions/notify-bitrix-assignee.logic-function.ts +85 -0
- package/src/logic-functions/on-attachment-created.logic-function.ts +67 -0
- package/src/logic-functions/on-task-updated.logic-function.ts +71 -0
- package/src/logic-functions/on-workflow-run-updated.logic-function.ts +70 -0
- package/src/logic-functions/save-launch-fields.logic-function.ts +73 -0
- package/src/logic-functions/save-step-settings.logic-function.ts +90 -0
- package/src/logic-functions/save-task-form.logic-function.ts +62 -0
- package/src/navigation-menu-items/docflow.navigation-menu-item.ts +15 -0
- package/src/objects/document-folder.object.ts +80 -0
- package/src/objects/document.object.ts +312 -0
- package/src/page-layouts/docflow.page-layout.ts +86 -0
- package/src/page-layouts/task-docflow.page-layout-tab.ts +36 -0
- package/src/page-layouts/workflow-steps.page-layout-tab.ts +37 -0
- package/src/roles/default-role.ts +21 -0
- package/src/roles/docflow-member.role.ts +23 -0
- package/src/server/bitrix-page.ts +52 -0
- package/src/server/bitrix-portal.ts +67 -0
- package/src/server/document-capture.ts +102 -0
- package/src/server/http-response.ts +18 -0
- package/src/server/launch-step.ts +166 -0
- package/src/server/process-tasks.ts +116 -0
- package/src/server/records.ts +132 -0
- package/src/server/task-completion.ts +100 -0
- package/src/server/workflow-engine.ts +105 -0
- package/src/shared/api/core-graphql.util.ts +98 -0
- package/src/shared/api/object-summaries.ts +79 -0
- package/src/shared/api/rest-filter.util.ts +37 -0
- package/src/shared/api/rest-response.util.ts +43 -0
- package/src/shared/bitrix/bitrix-client.ts +114 -0
- package/src/shared/bitrix/bitrix.type.ts +25 -0
- package/src/shared/bitrix/bitrix.util.ts +139 -0
- package/src/shared/docflow.constants.ts +31 -0
- package/src/shared/documents/attachment-target.util.ts +64 -0
- package/src/shared/engine.ts +11 -0
- package/src/shared/form/form-field-builder.util.ts +122 -0
- package/src/shared/form/form-field.type.ts +23 -0
- package/src/shared/form/form-fields.util.ts +138 -0
- package/src/shared/form/step-settings.util.ts +104 -0
- package/src/shared/workflow/launch-step.util.ts +56 -0
- package/src/shared/workflow/run-target-record.util.ts +70 -0
- package/src/shared/workflow/workflow-run.type.ts +35 -0
- package/src/shared/workflow/workflow-run.util.ts +174 -0
- package/src/universal-identifiers.ts +199 -0
- package/src/views/all-document-folders.view.ts +50 -0
- package/src/views/all-documents.view.ts +91 -0
- package/src/views/documents-by-status.view.ts +76 -0
- package/tsconfig.json +37 -0
- package/tsconfig.spec.json +9 -0
- package/vitest.unit.config.ts +14 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { defineLogicFunction } from 'twenty-sdk/define';
|
|
2
|
+
import { type RoutePayload } from 'twenty-sdk/logic-function';
|
|
3
|
+
|
|
4
|
+
import { getFormFieldsError, parseFormFields, parseFormValues } from 'src/shared/form/form-fields.util';
|
|
5
|
+
import { jsonResponse, readJsonBody } from 'src/server/http-response';
|
|
6
|
+
import { getTask, updateTask } from 'src/server/records';
|
|
7
|
+
import { isProcessTask } from 'src/server/task-completion';
|
|
8
|
+
import { SAVE_TASK_FORM_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER } from 'src/universal-identifiers';
|
|
9
|
+
|
|
10
|
+
// The one-off fields of a task: their list is checked before it is saved,
|
|
11
|
+
// and the fields of a process task belong to the process.
|
|
12
|
+
const handler = async (event: RoutePayload) => {
|
|
13
|
+
const body = readJsonBody(event.body);
|
|
14
|
+
|
|
15
|
+
if (typeof body.taskId !== 'string') {
|
|
16
|
+
return jsonResponse(400, { message: 'Не указано задание' });
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const task = await getTask('person', body.taskId);
|
|
20
|
+
|
|
21
|
+
if (task === undefined) {
|
|
22
|
+
return jsonResponse(404, { message: 'Задание не найдено' });
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const data: Record<string, unknown> = {};
|
|
26
|
+
|
|
27
|
+
if (body.fields !== undefined) {
|
|
28
|
+
if (isProcessTask(task)) {
|
|
29
|
+
return jsonResponse(409, { message: 'Поля этого задания задаёт процесс' });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const fields = parseFormFields(body.fields);
|
|
33
|
+
const error = getFormFieldsError(fields);
|
|
34
|
+
|
|
35
|
+
if (error !== undefined) {
|
|
36
|
+
return jsonResponse(422, { message: error });
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
data.smbFormSchema = fields;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (body.values !== undefined) {
|
|
43
|
+
data.smbFormValues = parseFormValues(body.values);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
await updateTask('person', task.id, data);
|
|
47
|
+
|
|
48
|
+
return { status: 'SAVED' };
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export default defineLogicFunction({
|
|
52
|
+
universalIdentifier: SAVE_TASK_FORM_LOGIC_FUNCTION_UNIVERSAL_IDENTIFIER,
|
|
53
|
+
name: 'docflow-save-task-form',
|
|
54
|
+
description: 'Сохраняет поля задания и их значения',
|
|
55
|
+
timeoutSeconds: 15,
|
|
56
|
+
handler,
|
|
57
|
+
httpRouteTriggerSettings: {
|
|
58
|
+
path: '/docflow/tasks/form',
|
|
59
|
+
httpMethod: 'POST',
|
|
60
|
+
isAuthRequired: true,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { defineNavigationMenuItem, NavigationMenuItemType } from 'twenty-sdk/define';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
DOCFLOW_NAVIGATION_MENU_ITEM_UNIVERSAL_IDENTIFIER,
|
|
5
|
+
DOCFLOW_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER,
|
|
6
|
+
} from 'src/universal-identifiers';
|
|
7
|
+
|
|
8
|
+
export default defineNavigationMenuItem({
|
|
9
|
+
universalIdentifier: DOCFLOW_NAVIGATION_MENU_ITEM_UNIVERSAL_IDENTIFIER,
|
|
10
|
+
name: 'Документооборот',
|
|
11
|
+
icon: 'IconFiles',
|
|
12
|
+
position: 0,
|
|
13
|
+
type: NavigationMenuItemType.PAGE_LAYOUT,
|
|
14
|
+
pageLayoutUniversalIdentifier: DOCFLOW_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER,
|
|
15
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { defineObject, FieldType } from 'twenty-sdk/define';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
DOCUMENT_FOLDER_COLOR_UNIVERSAL_IDENTIFIER,
|
|
5
|
+
DOCUMENT_FOLDER_NAME_UNIVERSAL_IDENTIFIER,
|
|
6
|
+
DOCUMENT_FOLDER_OBJECT_UNIVERSAL_IDENTIFIER,
|
|
7
|
+
} from 'src/universal-identifiers';
|
|
8
|
+
|
|
9
|
+
export default defineObject({
|
|
10
|
+
universalIdentifier: DOCUMENT_FOLDER_OBJECT_UNIVERSAL_IDENTIFIER,
|
|
11
|
+
nameSingular: 'smbDocumentFolder',
|
|
12
|
+
namePlural: 'smbDocumentFolders',
|
|
13
|
+
labelSingular: 'Папка документов',
|
|
14
|
+
labelPlural: 'Папки документов',
|
|
15
|
+
description: 'Папка в дереве документов компании',
|
|
16
|
+
icon: 'IconFolder',
|
|
17
|
+
labelIdentifierFieldMetadataUniversalIdentifier:
|
|
18
|
+
DOCUMENT_FOLDER_NAME_UNIVERSAL_IDENTIFIER,
|
|
19
|
+
fields: [
|
|
20
|
+
{
|
|
21
|
+
universalIdentifier: DOCUMENT_FOLDER_NAME_UNIVERSAL_IDENTIFIER,
|
|
22
|
+
type: FieldType.TEXT,
|
|
23
|
+
label: 'Название',
|
|
24
|
+
icon: 'IconAbc',
|
|
25
|
+
name: 'name',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
universalIdentifier: DOCUMENT_FOLDER_COLOR_UNIVERSAL_IDENTIFIER,
|
|
29
|
+
type: FieldType.SELECT,
|
|
30
|
+
label: 'Цвет',
|
|
31
|
+
icon: 'IconPalette',
|
|
32
|
+
name: 'color',
|
|
33
|
+
defaultValue: "'GRAY'",
|
|
34
|
+
options: [
|
|
35
|
+
{
|
|
36
|
+
id: 'cc211c98-25aa-4152-bf3a-683a94802991',
|
|
37
|
+
value: 'GRAY',
|
|
38
|
+
label: 'Серый',
|
|
39
|
+
position: 0,
|
|
40
|
+
color: 'gray',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: '24d4e509-a5dd-4919-acaf-63b9eca5991b',
|
|
44
|
+
value: 'BLUE',
|
|
45
|
+
label: 'Синий',
|
|
46
|
+
position: 1,
|
|
47
|
+
color: 'blue',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: 'e1a9b896-ded0-4153-ae31-275539e0f914',
|
|
51
|
+
value: 'GREEN',
|
|
52
|
+
label: 'Зелёный',
|
|
53
|
+
position: 2,
|
|
54
|
+
color: 'green',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: '6932e1d5-8ad4-4a87-bb1e-b2f4f9a5bb37',
|
|
58
|
+
value: 'ORANGE',
|
|
59
|
+
label: 'Оранжевый',
|
|
60
|
+
position: 3,
|
|
61
|
+
color: 'orange',
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
id: '220fc4db-37fd-47ce-9754-133a6a7e3eeb',
|
|
65
|
+
value: 'RED',
|
|
66
|
+
label: 'Красный',
|
|
67
|
+
position: 4,
|
|
68
|
+
color: 'red',
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: '2516ec8c-9e1d-4eeb-993f-1791c908e35b',
|
|
72
|
+
value: 'PURPLE',
|
|
73
|
+
label: 'Фиолетовый',
|
|
74
|
+
position: 5,
|
|
75
|
+
color: 'purple',
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
});
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { defineObject, FieldType } from 'twenty-sdk/define';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
DOCUMENT_DATE_UNIVERSAL_IDENTIFIER,
|
|
5
|
+
DOCUMENT_DESCRIPTION_UNIVERSAL_IDENTIFIER,
|
|
6
|
+
DOCUMENT_EDITOR_KIND_UNIVERSAL_IDENTIFIER,
|
|
7
|
+
DOCUMENT_EDITOR_SNAPSHOT_UNIVERSAL_IDENTIFIER,
|
|
8
|
+
DOCUMENT_FILE_UNIVERSAL_IDENTIFIER,
|
|
9
|
+
DOCUMENT_NAME_UNIVERSAL_IDENTIFIER,
|
|
10
|
+
DOCUMENT_NUMBER_UNIVERSAL_IDENTIFIER,
|
|
11
|
+
DOCUMENT_OBJECT_UNIVERSAL_IDENTIFIER,
|
|
12
|
+
DOCUMENT_ORIGIN_UNIVERSAL_IDENTIFIER,
|
|
13
|
+
DOCUMENT_SOURCE_FILE_ID_UNIVERSAL_IDENTIFIER,
|
|
14
|
+
DOCUMENT_SOURCE_OBJECT_NAME_UNIVERSAL_IDENTIFIER,
|
|
15
|
+
DOCUMENT_SOURCE_RECORD_ID_UNIVERSAL_IDENTIFIER,
|
|
16
|
+
DOCUMENT_SOURCE_RECORD_NAME_UNIVERSAL_IDENTIFIER,
|
|
17
|
+
DOCUMENT_STATUS_UNIVERSAL_IDENTIFIER,
|
|
18
|
+
DOCUMENT_TYPE_UNIVERSAL_IDENTIFIER,
|
|
19
|
+
DOCUMENT_VALID_UNTIL_UNIVERSAL_IDENTIFIER,
|
|
20
|
+
DOCUMENT_WORKFLOW_RUN_ID_UNIVERSAL_IDENTIFIER,
|
|
21
|
+
} from 'src/universal-identifiers';
|
|
22
|
+
|
|
23
|
+
export default defineObject({
|
|
24
|
+
universalIdentifier: DOCUMENT_OBJECT_UNIVERSAL_IDENTIFIER,
|
|
25
|
+
nameSingular: 'smbDocument',
|
|
26
|
+
namePlural: 'smbDocuments',
|
|
27
|
+
labelSingular: 'Документ',
|
|
28
|
+
labelPlural: 'Документы',
|
|
29
|
+
description:
|
|
30
|
+
'Документ компании: файл, реквизиты, статус и откуда он пришёл в документы',
|
|
31
|
+
icon: 'IconFiles',
|
|
32
|
+
labelIdentifierFieldMetadataUniversalIdentifier:
|
|
33
|
+
DOCUMENT_NAME_UNIVERSAL_IDENTIFIER,
|
|
34
|
+
fields: [
|
|
35
|
+
{
|
|
36
|
+
universalIdentifier: DOCUMENT_NAME_UNIVERSAL_IDENTIFIER,
|
|
37
|
+
type: FieldType.TEXT,
|
|
38
|
+
label: 'Название',
|
|
39
|
+
icon: 'IconAbc',
|
|
40
|
+
name: 'name',
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
universalIdentifier: DOCUMENT_FILE_UNIVERSAL_IDENTIFIER,
|
|
44
|
+
type: FieldType.FILES,
|
|
45
|
+
label: 'Файл',
|
|
46
|
+
icon: 'IconPaperclip',
|
|
47
|
+
name: 'file',
|
|
48
|
+
universalSettings: { maxNumberOfValues: 1 },
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
universalIdentifier: DOCUMENT_STATUS_UNIVERSAL_IDENTIFIER,
|
|
52
|
+
type: FieldType.SELECT,
|
|
53
|
+
label: 'Статус',
|
|
54
|
+
icon: 'IconProgressCheck',
|
|
55
|
+
name: 'status',
|
|
56
|
+
defaultValue: "'DRAFT'",
|
|
57
|
+
options: [
|
|
58
|
+
{
|
|
59
|
+
id: 'a0e18a38-4cd3-417d-afb8-30ae5568adaf',
|
|
60
|
+
value: 'DRAFT',
|
|
61
|
+
label: 'Черновик',
|
|
62
|
+
position: 0,
|
|
63
|
+
color: 'gray',
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: '173d34b6-a325-4fe8-bf89-f3635efaf941',
|
|
67
|
+
value: 'IN_REVIEW',
|
|
68
|
+
label: 'На согласовании',
|
|
69
|
+
position: 1,
|
|
70
|
+
color: 'orange',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: 'fe0a1f41-895c-4137-85c6-0315f9a375c6',
|
|
74
|
+
value: 'APPROVED',
|
|
75
|
+
label: 'Согласован',
|
|
76
|
+
position: 2,
|
|
77
|
+
color: 'green',
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: 'beb9ae41-787e-4dd8-82f6-2442f4a46209',
|
|
81
|
+
value: 'ARCHIVED',
|
|
82
|
+
label: 'В архиве',
|
|
83
|
+
position: 3,
|
|
84
|
+
color: 'blue',
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
universalIdentifier: DOCUMENT_TYPE_UNIVERSAL_IDENTIFIER,
|
|
90
|
+
type: FieldType.SELECT,
|
|
91
|
+
label: 'Тип',
|
|
92
|
+
icon: 'IconTag',
|
|
93
|
+
name: 'documentType',
|
|
94
|
+
defaultValue: "'OTHER'",
|
|
95
|
+
options: [
|
|
96
|
+
{
|
|
97
|
+
id: '1c605c59-37d3-4acc-80ec-34fb2cc6251c',
|
|
98
|
+
value: 'CONTRACT',
|
|
99
|
+
label: 'Договор',
|
|
100
|
+
position: 0,
|
|
101
|
+
color: 'blue',
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: '9549a49f-8ef9-437c-a3d8-52776b68016f',
|
|
105
|
+
value: 'INVOICE',
|
|
106
|
+
label: 'Счёт',
|
|
107
|
+
position: 1,
|
|
108
|
+
color: 'green',
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
id: '67244616-4a2d-4db0-a48a-f891eccb7d2b',
|
|
112
|
+
value: 'ACT',
|
|
113
|
+
label: 'Акт',
|
|
114
|
+
position: 2,
|
|
115
|
+
color: 'turquoise',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: '70fcc8e3-e779-4c63-b70d-1f035aed706e',
|
|
119
|
+
value: 'WAYBILL',
|
|
120
|
+
label: 'Накладная',
|
|
121
|
+
position: 3,
|
|
122
|
+
color: 'sky',
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
id: '85390ca1-6d61-4691-a347-4a4286bada77',
|
|
126
|
+
value: 'ORDER',
|
|
127
|
+
label: 'Приказ',
|
|
128
|
+
position: 4,
|
|
129
|
+
color: 'purple',
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
id: '499e28d6-52e5-47a0-9cb2-348b96192922',
|
|
133
|
+
value: 'LETTER',
|
|
134
|
+
label: 'Письмо',
|
|
135
|
+
position: 5,
|
|
136
|
+
color: 'orange',
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
id: '709b00c4-624e-4fac-9598-cdca9e92e9cd',
|
|
140
|
+
value: 'REPORT',
|
|
141
|
+
label: 'Отчёт',
|
|
142
|
+
position: 6,
|
|
143
|
+
color: 'pink',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
id: '19aec623-2fea-42b5-ae02-9554bcda75fb',
|
|
147
|
+
value: 'OTHER',
|
|
148
|
+
label: 'Прочее',
|
|
149
|
+
position: 7,
|
|
150
|
+
color: 'gray',
|
|
151
|
+
},
|
|
152
|
+
],
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
universalIdentifier: DOCUMENT_NUMBER_UNIVERSAL_IDENTIFIER,
|
|
156
|
+
type: FieldType.TEXT,
|
|
157
|
+
label: 'Номер',
|
|
158
|
+
icon: 'IconHash',
|
|
159
|
+
name: 'number',
|
|
160
|
+
isNullable: true,
|
|
161
|
+
defaultValue: null,
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
universalIdentifier: DOCUMENT_DATE_UNIVERSAL_IDENTIFIER,
|
|
165
|
+
type: FieldType.DATE,
|
|
166
|
+
label: 'Дата документа',
|
|
167
|
+
icon: 'IconCalendar',
|
|
168
|
+
name: 'documentDate',
|
|
169
|
+
isNullable: true,
|
|
170
|
+
defaultValue: null,
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
universalIdentifier: DOCUMENT_VALID_UNTIL_UNIVERSAL_IDENTIFIER,
|
|
174
|
+
type: FieldType.DATE,
|
|
175
|
+
label: 'Действует до',
|
|
176
|
+
icon: 'IconCalendarDue',
|
|
177
|
+
name: 'validUntil',
|
|
178
|
+
isNullable: true,
|
|
179
|
+
defaultValue: null,
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
universalIdentifier: DOCUMENT_DESCRIPTION_UNIVERSAL_IDENTIFIER,
|
|
183
|
+
type: FieldType.TEXT,
|
|
184
|
+
label: 'Описание',
|
|
185
|
+
icon: 'IconAlignLeft',
|
|
186
|
+
name: 'description',
|
|
187
|
+
isNullable: true,
|
|
188
|
+
defaultValue: null,
|
|
189
|
+
},
|
|
190
|
+
// Откуда документ пришёл (ADR-025 п.5): загружен в разделе или собран
|
|
191
|
+
// сервером из вложения записи либо задания процесса. Заполняет сервер.
|
|
192
|
+
{
|
|
193
|
+
universalIdentifier: DOCUMENT_ORIGIN_UNIVERSAL_IDENTIFIER,
|
|
194
|
+
type: FieldType.SELECT,
|
|
195
|
+
label: 'Источник',
|
|
196
|
+
icon: 'IconArrowFork',
|
|
197
|
+
name: 'origin',
|
|
198
|
+
defaultValue: "'UPLOAD'",
|
|
199
|
+
options: [
|
|
200
|
+
{
|
|
201
|
+
id: '589b6ce6-ed76-4572-8683-2ab62f89d0ad',
|
|
202
|
+
value: 'UPLOAD',
|
|
203
|
+
label: 'Загружен в документы',
|
|
204
|
+
position: 0,
|
|
205
|
+
color: 'gray',
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
id: '0c98e8c3-b61e-4bae-96fe-cb0083b74527',
|
|
209
|
+
value: 'RECORD',
|
|
210
|
+
label: 'Файл записи',
|
|
211
|
+
position: 1,
|
|
212
|
+
color: 'blue',
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
id: 'a33345ed-9a16-425e-bbee-0c43adaa3651',
|
|
216
|
+
value: 'PROCESS',
|
|
217
|
+
label: 'Процесс',
|
|
218
|
+
position: 2,
|
|
219
|
+
color: 'purple',
|
|
220
|
+
},
|
|
221
|
+
],
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
universalIdentifier: DOCUMENT_SOURCE_OBJECT_NAME_UNIVERSAL_IDENTIFIER,
|
|
225
|
+
type: FieldType.TEXT,
|
|
226
|
+
label: 'Объект источника',
|
|
227
|
+
icon: 'IconBox',
|
|
228
|
+
name: 'sourceObjectName',
|
|
229
|
+
isNullable: true,
|
|
230
|
+
defaultValue: null,
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
universalIdentifier: DOCUMENT_SOURCE_RECORD_ID_UNIVERSAL_IDENTIFIER,
|
|
234
|
+
type: FieldType.TEXT,
|
|
235
|
+
label: 'Id записи источника',
|
|
236
|
+
icon: 'IconId',
|
|
237
|
+
name: 'sourceRecordId',
|
|
238
|
+
isNullable: true,
|
|
239
|
+
defaultValue: null,
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
universalIdentifier: DOCUMENT_SOURCE_RECORD_NAME_UNIVERSAL_IDENTIFIER,
|
|
243
|
+
type: FieldType.TEXT,
|
|
244
|
+
label: 'Где загружен',
|
|
245
|
+
icon: 'IconMapPin',
|
|
246
|
+
name: 'sourceRecordName',
|
|
247
|
+
isNullable: true,
|
|
248
|
+
defaultValue: null,
|
|
249
|
+
},
|
|
250
|
+
// Файл источника, из которого документ собран; по нему сбор не повторяется.
|
|
251
|
+
{
|
|
252
|
+
universalIdentifier: DOCUMENT_SOURCE_FILE_ID_UNIVERSAL_IDENTIFIER,
|
|
253
|
+
type: FieldType.TEXT,
|
|
254
|
+
label: 'Файл источника',
|
|
255
|
+
icon: 'IconFileSearch',
|
|
256
|
+
name: 'sourceFileId',
|
|
257
|
+
isNullable: true,
|
|
258
|
+
defaultValue: null,
|
|
259
|
+
},
|
|
260
|
+
{
|
|
261
|
+
universalIdentifier: DOCUMENT_WORKFLOW_RUN_ID_UNIVERSAL_IDENTIFIER,
|
|
262
|
+
type: FieldType.TEXT,
|
|
263
|
+
label: 'Запуск процесса',
|
|
264
|
+
icon: 'IconTopologyStar3',
|
|
265
|
+
name: 'workflowRunId',
|
|
266
|
+
isNullable: true,
|
|
267
|
+
defaultValue: null,
|
|
268
|
+
},
|
|
269
|
+
// Какой редактор открывает документ (ADR-016 п.8). Пока все значения
|
|
270
|
+
// показывает один просмотрщик файла, Univer добавится записью в реестр фронта.
|
|
271
|
+
{
|
|
272
|
+
universalIdentifier: DOCUMENT_EDITOR_KIND_UNIVERSAL_IDENTIFIER,
|
|
273
|
+
type: FieldType.SELECT,
|
|
274
|
+
label: 'Редактор',
|
|
275
|
+
icon: 'IconEdit',
|
|
276
|
+
name: 'editorKind',
|
|
277
|
+
defaultValue: "'NONE'",
|
|
278
|
+
options: [
|
|
279
|
+
{
|
|
280
|
+
id: '04188e00-de3f-4d7f-bfc9-a38703898f80',
|
|
281
|
+
value: 'NONE',
|
|
282
|
+
label: 'Файл',
|
|
283
|
+
position: 0,
|
|
284
|
+
color: 'gray',
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
id: '7120c842-3d38-4560-b434-7cdf48b5b799',
|
|
288
|
+
value: 'UNIVER_SHEET',
|
|
289
|
+
label: 'Таблица',
|
|
290
|
+
position: 1,
|
|
291
|
+
color: 'green',
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
id: 'ac29b1e1-b344-4b15-8701-27d537744ea4',
|
|
295
|
+
value: 'UNIVER_DOC',
|
|
296
|
+
label: 'Текст',
|
|
297
|
+
position: 2,
|
|
298
|
+
color: 'blue',
|
|
299
|
+
},
|
|
300
|
+
],
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
universalIdentifier: DOCUMENT_EDITOR_SNAPSHOT_UNIVERSAL_IDENTIFIER,
|
|
304
|
+
type: FieldType.RAW_JSON,
|
|
305
|
+
label: 'Снимок редактора',
|
|
306
|
+
icon: 'IconBraces',
|
|
307
|
+
name: 'editorSnapshot',
|
|
308
|
+
isNullable: true,
|
|
309
|
+
defaultValue: null,
|
|
310
|
+
},
|
|
311
|
+
],
|
|
312
|
+
});
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {
|
|
2
|
+
definePageLayout,
|
|
3
|
+
PageLayoutTabLayoutMode,
|
|
4
|
+
PageLayoutWidgetVerticalListHeightBehavior,
|
|
5
|
+
} from 'twenty-sdk/define';
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
DOCFLOW_DOCUMENTS_TAB_UNIVERSAL_IDENTIFIER,
|
|
9
|
+
DOCFLOW_DOCUMENTS_WIDGET_UNIVERSAL_IDENTIFIER,
|
|
10
|
+
DOCFLOW_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER,
|
|
11
|
+
DOCFLOW_PROCESSES_TAB_UNIVERSAL_IDENTIFIER,
|
|
12
|
+
DOCFLOW_PROCESSES_WIDGET_UNIVERSAL_IDENTIFIER,
|
|
13
|
+
DOCFLOW_TASKS_TAB_UNIVERSAL_IDENTIFIER,
|
|
14
|
+
DOCFLOW_TASKS_WIDGET_UNIVERSAL_IDENTIFIER,
|
|
15
|
+
DOCUMENTS_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER,
|
|
16
|
+
PROCESSES_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER,
|
|
17
|
+
TASKS_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER,
|
|
18
|
+
} from 'src/universal-identifiers';
|
|
19
|
+
|
|
20
|
+
const buildTab = ({
|
|
21
|
+
universalIdentifier,
|
|
22
|
+
widgetUniversalIdentifier,
|
|
23
|
+
frontComponentUniversalIdentifier,
|
|
24
|
+
title,
|
|
25
|
+
icon,
|
|
26
|
+
position,
|
|
27
|
+
}: {
|
|
28
|
+
universalIdentifier: string;
|
|
29
|
+
widgetUniversalIdentifier: string;
|
|
30
|
+
frontComponentUniversalIdentifier: string;
|
|
31
|
+
title: string;
|
|
32
|
+
icon: string;
|
|
33
|
+
position: number;
|
|
34
|
+
}) => ({
|
|
35
|
+
universalIdentifier,
|
|
36
|
+
title,
|
|
37
|
+
position,
|
|
38
|
+
icon,
|
|
39
|
+
layoutMode: PageLayoutTabLayoutMode.VERTICAL_LIST,
|
|
40
|
+
widgets: [
|
|
41
|
+
{
|
|
42
|
+
universalIdentifier: widgetUniversalIdentifier,
|
|
43
|
+
title: ' ',
|
|
44
|
+
type: 'FRONT_COMPONENT' as const,
|
|
45
|
+
heightBehavior: PageLayoutWidgetVerticalListHeightBehavior.TAB_VIEWPORT,
|
|
46
|
+
configuration: {
|
|
47
|
+
configurationType: 'FRONT_COMPONENT' as const,
|
|
48
|
+
frontComponentUniversalIdentifier,
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
// The docflow page of the sidebar: the same three sections as the fork's
|
|
55
|
+
// /docflow page, built from the app's front components.
|
|
56
|
+
export default definePageLayout({
|
|
57
|
+
universalIdentifier: DOCFLOW_PAGE_LAYOUT_UNIVERSAL_IDENTIFIER,
|
|
58
|
+
name: 'Документооборот',
|
|
59
|
+
type: 'STANDALONE_PAGE',
|
|
60
|
+
tabs: [
|
|
61
|
+
buildTab({
|
|
62
|
+
universalIdentifier: DOCFLOW_TASKS_TAB_UNIVERSAL_IDENTIFIER,
|
|
63
|
+
widgetUniversalIdentifier: DOCFLOW_TASKS_WIDGET_UNIVERSAL_IDENTIFIER,
|
|
64
|
+
frontComponentUniversalIdentifier: TASKS_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER,
|
|
65
|
+
title: 'Задания',
|
|
66
|
+
icon: 'IconChecklist',
|
|
67
|
+
position: 0,
|
|
68
|
+
}),
|
|
69
|
+
buildTab({
|
|
70
|
+
universalIdentifier: DOCFLOW_PROCESSES_TAB_UNIVERSAL_IDENTIFIER,
|
|
71
|
+
widgetUniversalIdentifier: DOCFLOW_PROCESSES_WIDGET_UNIVERSAL_IDENTIFIER,
|
|
72
|
+
frontComponentUniversalIdentifier: PROCESSES_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER,
|
|
73
|
+
title: 'Процессы',
|
|
74
|
+
icon: 'IconTopologyStar3',
|
|
75
|
+
position: 1,
|
|
76
|
+
}),
|
|
77
|
+
buildTab({
|
|
78
|
+
universalIdentifier: DOCFLOW_DOCUMENTS_TAB_UNIVERSAL_IDENTIFIER,
|
|
79
|
+
widgetUniversalIdentifier: DOCFLOW_DOCUMENTS_WIDGET_UNIVERSAL_IDENTIFIER,
|
|
80
|
+
frontComponentUniversalIdentifier: DOCUMENTS_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER,
|
|
81
|
+
title: 'Документы',
|
|
82
|
+
icon: 'IconFileText',
|
|
83
|
+
position: 2,
|
|
84
|
+
}),
|
|
85
|
+
],
|
|
86
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import {
|
|
2
|
+
definePageLayoutTab,
|
|
3
|
+
PageLayoutTabLayoutMode,
|
|
4
|
+
PageLayoutWidgetVerticalListHeightBehavior,
|
|
5
|
+
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS,
|
|
6
|
+
} from 'twenty-sdk/define';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
TASK_FORM_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER,
|
|
10
|
+
TASK_RECORD_DOCFLOW_TAB_UNIVERSAL_IDENTIFIER,
|
|
11
|
+
TASK_RECORD_DOCFLOW_WIDGET_UNIVERSAL_IDENTIFIER,
|
|
12
|
+
} from 'src/universal-identifiers';
|
|
13
|
+
|
|
14
|
+
// "Задание" tab on the standard task page: instruction, the task's own fields
|
|
15
|
+
// and completing it, the same panel as on the docflow page.
|
|
16
|
+
export default definePageLayoutTab({
|
|
17
|
+
universalIdentifier: TASK_RECORD_DOCFLOW_TAB_UNIVERSAL_IDENTIFIER,
|
|
18
|
+
pageLayoutUniversalIdentifier:
|
|
19
|
+
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.taskRecordPage.universalIdentifier,
|
|
20
|
+
title: 'Задание',
|
|
21
|
+
position: 50,
|
|
22
|
+
icon: 'IconChecklist',
|
|
23
|
+
layoutMode: PageLayoutTabLayoutMode.VERTICAL_LIST,
|
|
24
|
+
widgets: [
|
|
25
|
+
{
|
|
26
|
+
universalIdentifier: TASK_RECORD_DOCFLOW_WIDGET_UNIVERSAL_IDENTIFIER,
|
|
27
|
+
title: ' ',
|
|
28
|
+
type: 'FRONT_COMPONENT',
|
|
29
|
+
heightBehavior: PageLayoutWidgetVerticalListHeightBehavior.TAB_VIEWPORT,
|
|
30
|
+
configuration: {
|
|
31
|
+
configurationType: 'FRONT_COMPONENT',
|
|
32
|
+
frontComponentUniversalIdentifier: TASK_FORM_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import {
|
|
2
|
+
definePageLayoutTab,
|
|
3
|
+
PageLayoutTabLayoutMode,
|
|
4
|
+
PageLayoutWidgetVerticalListHeightBehavior,
|
|
5
|
+
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS,
|
|
6
|
+
} from 'twenty-sdk/define';
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
PROCESS_STEPS_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER,
|
|
10
|
+
WORKFLOW_RECORD_STEPS_TAB_UNIVERSAL_IDENTIFIER,
|
|
11
|
+
WORKFLOW_RECORD_STEPS_WIDGET_UNIVERSAL_IDENTIFIER,
|
|
12
|
+
} from 'src/universal-identifiers';
|
|
13
|
+
|
|
14
|
+
// "Запуск и задания" tab on the standard workflow page: the parameters asked
|
|
15
|
+
// before the launch, and who fills each "Human input" step, by when, which
|
|
16
|
+
// fields are required.
|
|
17
|
+
export default definePageLayoutTab({
|
|
18
|
+
universalIdentifier: WORKFLOW_RECORD_STEPS_TAB_UNIVERSAL_IDENTIFIER,
|
|
19
|
+
pageLayoutUniversalIdentifier:
|
|
20
|
+
STANDARD_PAGE_LAYOUT_UNIVERSAL_IDENTIFIERS.workflowRecordPage.universalIdentifier,
|
|
21
|
+
title: 'Запуск и задания',
|
|
22
|
+
position: 50,
|
|
23
|
+
icon: 'IconPlayerPlay',
|
|
24
|
+
layoutMode: PageLayoutTabLayoutMode.VERTICAL_LIST,
|
|
25
|
+
widgets: [
|
|
26
|
+
{
|
|
27
|
+
universalIdentifier: WORKFLOW_RECORD_STEPS_WIDGET_UNIVERSAL_IDENTIFIER,
|
|
28
|
+
title: ' ',
|
|
29
|
+
type: 'FRONT_COMPONENT',
|
|
30
|
+
heightBehavior: PageLayoutWidgetVerticalListHeightBehavior.FIT_CONTENT,
|
|
31
|
+
configuration: {
|
|
32
|
+
configurationType: 'FRONT_COMPONENT',
|
|
33
|
+
frontComponentUniversalIdentifier: PROCESS_STEPS_FRONT_COMPONENT_UNIVERSAL_IDENTIFIER,
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineApplicationRole,
|
|
3
|
+
SystemPermissionFlag,
|
|
4
|
+
} from 'twenty-sdk/define';
|
|
5
|
+
|
|
6
|
+
// What the app's functions may do when nobody is behind a run (record
|
|
7
|
+
// events, the Bitrix24 portal): hand out process tasks, collect documents.
|
|
8
|
+
// A run a person triggered is further narrowed to that person's rights.
|
|
9
|
+
export const DEFAULT_ROLE_UNIVERSAL_IDENTIFIER =
|
|
10
|
+
'26b1dde8-4ed9-4f39-8516-e0dcb734ea5a';
|
|
11
|
+
|
|
12
|
+
export default defineApplicationRole({
|
|
13
|
+
universalIdentifier: DEFAULT_ROLE_UNIVERSAL_IDENTIFIER,
|
|
14
|
+
label: 'Документооборот: функции приложения',
|
|
15
|
+
description: 'Права серверных функций приложения «Документооборот»',
|
|
16
|
+
canReadAllObjectRecords: true,
|
|
17
|
+
canUpdateAllObjectRecords: true,
|
|
18
|
+
canSoftDeleteAllObjectRecords: false,
|
|
19
|
+
canDestroyAllObjectRecords: false,
|
|
20
|
+
permissionFlagUniversalIdentifiers: [SystemPermissionFlag.WORKFLOWS],
|
|
21
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { defineRole, SystemPermissionFlag } from 'twenty-sdk/define';
|
|
2
|
+
|
|
3
|
+
import { DOCFLOW_MEMBER_ROLE_UNIVERSAL_IDENTIFIER } from 'src/universal-identifiers';
|
|
4
|
+
|
|
5
|
+
// Twenty lets only a person with the "Workflows" permission answer a step of
|
|
6
|
+
// a running process. Whoever fills process tasks or launches processes with
|
|
7
|
+
// parameters on a plain Twenty needs this role (or the permission in their
|
|
8
|
+
// own role). It also lets them edit processes: give it to those who own them.
|
|
9
|
+
export default defineRole({
|
|
10
|
+
universalIdentifier: DOCFLOW_MEMBER_ROLE_UNIVERSAL_IDENTIFIER,
|
|
11
|
+
label: 'Документооборот: участник процессов',
|
|
12
|
+
description:
|
|
13
|
+
'Записи CRM и право «Рабочие процессы», без которого Twenty не даёт отвечать на шаги процессов',
|
|
14
|
+
canBeAssignedToUsers: true,
|
|
15
|
+
canBeAssignedToAgents: false,
|
|
16
|
+
canBeAssignedToApiKeys: false,
|
|
17
|
+
canReadAllObjectRecords: true,
|
|
18
|
+
canUpdateAllObjectRecords: true,
|
|
19
|
+
canSoftDeleteAllObjectRecords: true,
|
|
20
|
+
canDestroyAllObjectRecords: false,
|
|
21
|
+
canUpdateAllSettings: false,
|
|
22
|
+
permissionFlagUniversalIdentifiers: [SystemPermissionFlag.WORKFLOWS],
|
|
23
|
+
});
|