Платформа 3V/Формы/Компоненты/Основные/Кнопка/Кнопка 'Сохранить': различия между версиями
(→Пример) |
м (A.kazanceva переименовал страницу Платформа 3V/Формы/Компоненты/Основные/Кнопка/Сохранение (Кнопка 'Сохранить') в Платформа 3V/Формы/Компоненты/Основные/Кнопка/Кнопка 'Сохранить') |
||
(не показаны 52 промежуточные версии 2 участников) | |||
Строка 1: | Строка 1: | ||
− | + | Кнопку "Сохранить" можно реализовать двумя способами: <br><br> | |
− | + | 1. Кнопка Сохранить (ButtonSubmitSourceEntryDto), <br> | |
− | Кнопку "Сохранить" можно реализовать двумя способами: <br> | + | 2. Пользовательская кнопка (CustomButtonEntry). <br> |
− | 1. | ||
− | 2. кнопка CustomButtonEntry | ||
<br> | <br> | ||
− | |||
− | + | Кнопка Сохранить (ButtonSubmitSourceEntryDto) сохраняет данные автоматически в источники, у которых свойство readOnly = false. <br> | |
− | Кнопка ButtonSubmitSourceEntryDto сохраняет | + | Пользовательской кнопке (CustomButtonEntry) необходимо прописать действие, которое сохраняет добавленный элемент в источнике данных. <br> |
+ | Обе кнопки могут содержать дополнительные действия помимо сохранения. <br> | ||
+ | Основным отличием является порядок выполнения действий - в кнопке ButtonSubmitSourceEntryDto нельзя управлять порядком сохранения. <br> | ||
− | + | == Сравнение кнопок == | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | = | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |- | ||
− | ! Свойство !! | + | ! Свойство / Тип кнопки !! ButtonSubmitSourceEntryDto !! CustomButtonEntry |
|- | |- | ||
− | | | + | | Actions || Может быть пустым || Обязательно должно содержать [[Платформа_3V/Формы/Действия/Сохранение источников|'''действие, <br> которое сохраняет добавленный элемент в источнике данных''']] |
|- | |- | ||
− | | | + | | Управлять порядком выполнения действий || Нельзя || Можно |
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|} | |} | ||
+ | |||
+ | |||
+ | ==ButtonSubmitSourceEntryDto== | ||
+ | Примерный алгоритм: <br> | ||
+ | 1. В раздел uiSources добавляем элемент управления (строка в данном примере), значения которого будет записывать кнопка. | ||
+ | <syntaxhighlight lang="JSON" line> | ||
+ | "uiSources": [ | ||
+ | {...}, | ||
+ | { | ||
+ | ... | ||
+ | |||
+ | "id": 1, | ||
+ | "uiDataSource": { | ||
+ | "attribute": { | ||
+ | "id": 2, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "attributeId": null, | ||
+ | "sourceId": 1, | ||
+ | "discriminator": "UiDataSourceDictionary" | ||
+ | }, | ||
+ | ... | ||
+ | |||
+ | "discriminator": "StringSourceEntry" | ||
+ | } | ||
+ | ] | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | </div></div> | ||
+ | |||
+ | 2. В раздел uiSources добавляем элементы управления кнопка ButtonSubmitSourceEntry. Свойство Actions в данном примере пустое, дополнительных действий нет. | ||
+ | |||
+ | <syntaxhighlight lang="JSON" line> | ||
+ | |||
+ | "uiSources": [ | ||
+ | { | ||
+ | "actionConfirmation": { ... }, | ||
+ | "Actions": [], | ||
+ | "onBeforeClickConditionalActions": [], | ||
+ | "submitRuleIds": [], | ||
+ | "id": 100, | ||
+ | "caption": "Сохранить", | ||
+ | |||
+ | ... | ||
+ | |||
+ | "discriminator": "ButtonSubmitSourceEntry" | ||
+ | }, | ||
+ | {...} | ||
+ | ] | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | </div></div> | ||
+ | |||
+ | 3. В раздел entryDataSources добавляем источник (справочник в данном примере), в который записываются данные. <br> | ||
+ | Важно, чтобы свойство "isReadOnly" [[Платформа_3V/Формы/Источники_данных|'''источника (источников)''']], куда записываются данные, принимало значение false. | ||
+ | |||
+ | <syntaxhighlight lang="JSON" line> | ||
+ | |||
+ | "entryDataSources": [ | ||
+ | { | ||
+ | "dictionaryId": 47, | ||
+ | |||
+ | ... | ||
+ | |||
+ | "id": 1, | ||
+ | "name": "Список контрагентов", | ||
+ | "isReadOnly": false, | ||
+ | |||
+ | ... | ||
+ | |||
+ | "discriminator": "DictionaryDataSource" | ||
+ | } | ||
+ | ], | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | </div></div> | ||
+ | |||
+ | Кнопка сохранит все введенные данные автоматически. <br> | ||
===Пример=== | ===Пример=== | ||
− | + | ||
− | + | Кейс: Добавление нового элемента справочника.<br> | |
− | + | ||
+ | [[Файл:Screenshot 2021-06-18 at 11.37.46.png|мини|слева]] | ||
+ | <br><br><br><br><br><br><br> | ||
+ | |||
+ | [[Файл:Screenshot 2021-06-18 at 11.41.09.png|мини|слева]] | ||
+ | <br><br><br><br><br><br><br><br><br> | ||
+ | |||
+ | Кнопка Сохранить (контрол id=100) сохрает введенное в строку значение в справочник (источник id=3). | ||
<div class="toccolours mw-collapsible mw-collapsed" style="width:800px; overflow:auto;"> | <div class="toccolours mw-collapsible mw-collapsed" style="width:800px; overflow:auto;"> | ||
Строка 97: | Строка 163: | ||
}, | }, | ||
"attributeId": null, | "attributeId": null, | ||
− | "sourceId": | + | "sourceId": 3, |
"discriminator": "UiDataSourceDictionary" | "discriminator": "UiDataSourceDictionary" | ||
}, | }, | ||
Строка 127: | Строка 193: | ||
"filePrefix": null, | "filePrefix": null, | ||
"defaultNewElementSettings": null, | "defaultNewElementSettings": null, | ||
− | "id": | + | "id": 3, |
"name": "Список контрагентов", | "name": "Список контрагентов", | ||
"isReadOnly": false, | "isReadOnly": false, | ||
Строка 153: | Строка 219: | ||
==CustomButtonEntry== | ==CustomButtonEntry== | ||
− | + | Пользовательская кнопка CustomButtonEntry требует [[Платформа_3V/Формы/Действия/Сохранение источников|'''добавить действие, которое сохраняет добавленный элемент в источнике данных''']]. Действия, "повешанные" на кнопку, будут выполняться последовательно.<br> | |
+ | Примерный алгоритм:<br> | ||
+ | 1. В раздел uiSources добавляем элементы управления. В приведенном примере - дата начала периода, дата окончания периода и строка, которая заполнится рассчитанной длительностью периода. | ||
+ | |||
+ | <syntaxhighlight lang="JSON" line> | ||
+ | |||
+ | "uiSources": [ | ||
+ | {...}, | ||
+ | { | ||
+ | "id": 222, | ||
+ | "caption": "Длительность периода", | ||
+ | "uiDataSource": { | ||
+ | "attribute": { | ||
+ | "id": 20, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "attributeId": null, | ||
+ | "sourceId": 1, | ||
+ | "discriminator": "UiDataSourceDictionary" | ||
+ | }, | ||
+ | "discriminator": "StringSourceEntry", | ||
+ | ... | ||
+ | }, | ||
+ | { | ||
+ | "id": 21, | ||
+ | "caption": "Дата начала периода", | ||
+ | ..., | ||
+ | "discriminator": "DateTimeSourceEntry" | ||
+ | }, | ||
+ | { | ||
+ | |||
+ | "id": 22, | ||
+ | "caption": "Дата конца периода", | ||
+ | ..., | ||
+ | "discriminator": "DateTimeSourceEntry" | ||
+ | }, | ||
+ | |||
+ | {...} | ||
+ | ] | ||
+ | </syntaxhighlight> | ||
+ | </div></div> | ||
+ | |||
+ | 2. В раздел uiSources добавляем элементы управления пользовательская кнопка CustomButtonEntry. В Actions в данном примере два действия, сначала рассчитается длинна периода, отобразится в строке и только потом сохранится это значение. | ||
+ | |||
+ | <syntaxhighlight lang="JSON" line> | ||
+ | |||
+ | "uiSources": [ | ||
+ | { | ||
+ | ..., | ||
+ | |||
+ | "Actions": [ | ||
+ | 222, | ||
+ | 111 | ||
+ | ], | ||
+ | "id": 200, | ||
+ | "caption": "Сохранить", | ||
+ | |||
+ | ... | ||
+ | |||
+ | "discriminator": "CustomButtonEntry" | ||
+ | }, | ||
+ | |||
+ | {...} | ||
+ | ] | ||
+ | |||
+ | |||
+ | </syntaxhighlight> | ||
+ | </div></div> | ||
+ | |||
+ | 3. В раздел entryDataSources добавляем источник (справочник в данном примере), в который записываются данные. <br> | ||
+ | |||
+ | <syntaxhighlight lang="JSON" line> | ||
+ | |||
+ | "entryDataSources": [ | ||
+ | { | ||
+ | "dictionaryId": 316, | ||
+ | ..., | ||
+ | "name": "Длительность отпусков", | ||
+ | "isReadOnly": false, | ||
+ | "dataEditRuleIds": [], | ||
+ | "beforeSaveDataActions": [], | ||
+ | "afterSaveDataActions": [], | ||
+ | "discriminator": "DictionaryDataSource" | ||
+ | }, | ||
+ | {...} | ||
+ | ] | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | </div></div> | ||
+ | ===Пример=== | ||
+ | Кейс: Внести данные об отпуске сотрудника - ФИО и период. При нажатии кнопки "Сохранить" выполняться три действия: сначала произойдет вычисление количества дней отпуска, затем данные сохранятся и, наконец, обновится пивот. | ||
+ | |||
+ | [[Файл:SubmitButton_1.gif|мини|слева|Внесение данных]] | ||
+ | <br><br><br><br><br><br><br><br><br><br><br> | ||
+ | |||
+ | [[Файл:SubmitButton 4.gif|обрамить|слева|Вычисление и запись результата]] | ||
+ | <br><br><br><br><br><br><br><br><br><br><br><br><br><br> | ||
+ | |||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="width:800px; overflow:auto;"> | ||
+ | <div style="font-weight:bold;line-height:1.6;">JSON серверной карточки</div> | ||
+ | <div class="mw-collapsible-content mw-collapsed-content"> | ||
<syntaxhighlight lang="JSON" line> | <syntaxhighlight lang="JSON" line> | ||
+ | |||
{ | { | ||
− | "id": | + | "id": 356, |
− | " | + | "title": "", |
− | " | + | "description": "", |
− | "enable": true, | + | "uiSources": [ |
− | + | { | |
− | + | "submitRuleIds": [], | |
− | + | "actionConfirmation": { | |
− | + | "message": null, | |
− | + | "conditionId": null | |
− | + | }, | |
− | + | "controlsValueCalculateRulesIds": [], | |
− | + | "Actions": [ | |
− | + | 222, | |
− | + | 111, | |
− | + | 333 | |
− | + | ], | |
− | + | "onBeforeClickConditionalActions": [], | |
− | + | "id": 200, | |
− | " | + | "caption": "Сохранить", |
− | + | "enable": true, | |
− | " | + | "visible": true, |
− | " | + | "hint": null, |
− | " | + | "uiDataSource": null, |
− | + | "doActionOnChangeValue": false, | |
+ | "onAfterChangeValueConditionalActions": null, | ||
+ | "onAfterChangeValueByClientConditionalActions": null, | ||
+ | "enableRuleIds": [], | ||
+ | "visibleRuleIds": [], | ||
+ | "access": { | ||
+ | "read": { | ||
+ | "roles": [], | ||
+ | "inversion": false, | ||
+ | "default": true | ||
+ | }, | ||
+ | "edit": { | ||
+ | "roles": [], | ||
+ | "inversion": false, | ||
+ | "default": true | ||
+ | } | ||
+ | }, | ||
+ | "isValueChanged": false, | ||
+ | "expressionId": null, | ||
+ | "discriminator": "CustomButtonEntry" | ||
+ | }, | ||
+ | { | ||
+ | "id": 222, | ||
+ | "caption": "Длительность периода", | ||
+ | "enable": true, | ||
+ | "visible": true, | ||
+ | "uiDataSource": { | ||
+ | "attribute": { | ||
+ | "id": 20, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "attributeId": null, | ||
+ | "sourceId": 1, | ||
+ | "discriminator": "UiDataSourceDictionary" | ||
+ | }, | ||
+ | "discriminator": "StringSourceEntry", | ||
+ | "doActionOnChangeValue": false | ||
+ | }, | ||
+ | { | ||
+ | "defaultValue": null, | ||
+ | "value": null, | ||
+ | "id": 21, | ||
+ | "caption": "Дата начала периода", | ||
+ | "enable": true, | ||
+ | "visible": true, | ||
+ | "hint": null, | ||
+ | "doActionOnChangeValue": false, | ||
+ | "onAfterChangeValueConditionalActions": null, | ||
+ | "onAfterChangeValueByClientConditionalActions": null, | ||
+ | "visibleRuleIds": [], | ||
+ | "isValueChanged": false, | ||
+ | "expressionId": null, | ||
+ | "discriminator": "DateTimeSourceEntry" | ||
+ | }, | ||
+ | { | ||
+ | "defaultValue": null, | ||
+ | "value": null, | ||
+ | "id": 22, | ||
+ | "caption": "Дата конца периода", | ||
+ | "enable": true, | ||
+ | "visible": true, | ||
+ | "hint": null, | ||
+ | "doActionOnChangeValue": false, | ||
+ | "onAfterChangeValueConditionalActions": null, | ||
+ | "onAfterChangeValueByClientConditionalActions": null, | ||
+ | "visibleRuleIds": [], | ||
+ | "isValueChanged": false, | ||
+ | "expressionId": null, | ||
+ | "discriminator": "DateTimeSourceEntry" | ||
+ | }, | ||
+ | { | ||
+ | "trimSpaces": false, | ||
+ | "defaultValue": null, | ||
+ | "value": null, | ||
+ | "id": 1, | ||
+ | "caption": "Список сотрудников", | ||
+ | "enable": true, | ||
+ | "visible": true, | ||
+ | "hint": null, | ||
+ | "uiDataSource": { | ||
+ | "attribute": { | ||
+ | "id": 2, | ||
+ | "discriminator": "OwnAttributeDefinitionDto" | ||
+ | }, | ||
+ | "attributeId": null, | ||
+ | "sourceId": 1, | ||
+ | "discriminator": "UiDataSourceDictionary" | ||
+ | }, | ||
+ | "doActionOnChangeValue": false, | ||
+ | "onAfterChangeValueConditionalActions": null, | ||
+ | "onAfterChangeValueByClientConditionalActions": null, | ||
+ | "enableRuleIds": [], | ||
+ | "visibleRuleIds": [], | ||
+ | "access": null, | ||
+ | "isValueChanged": false, | ||
+ | "expressionId": null, | ||
+ | "discriminator": "StringSourceEntry" | ||
+ | }, | ||
+ | { | ||
+ | "id": 2, | ||
+ | "pivotSourceId": 2, | ||
+ | "doActionOnChangeFocusedCell": false, | ||
+ | "doActionOnChangeCellValue": true, | ||
+ | "caption": "Пивот Режимы", | ||
+ | "enable": true, | ||
+ | "visible": true, | ||
+ | "hint": null, | ||
+ | "uiDataSource": null, | ||
+ | "doActionOnChangeValue": false, | ||
+ | "onAfterChangeValueConditionalActions": null, | ||
+ | "onAfterChangeValueByClientConditionalActions": null, | ||
+ | "enableRuleIds": [], | ||
+ | "visibleRuleIds": [], | ||
+ | "access": {}, | ||
+ | "isValueChanged": false, | ||
+ | "expressionId": null, | ||
+ | "discriminator": "PivotSourceEntry" | ||
+ | } | ||
+ | ], | ||
+ | "entryDataSources": [ | ||
+ | { | ||
+ | "dictionaryId": 316, | ||
+ | "hierarchyId": null, | ||
+ | "filter": null, | ||
+ | "sortingOptions": null, | ||
+ | "groupingOptions": null, | ||
+ | "dictionaryAttributes": null, | ||
+ | "defaultValue": [], | ||
+ | "defaultValueExpressionId": null, | ||
+ | "parameterId": null, | ||
+ | "dictionarySourceSelectionMode": "None", | ||
+ | "dataSourceAttributesAdditionsSettings": [], | ||
+ | "externalFileStorageUrl": null, | ||
+ | "filePrefix": null, | ||
+ | "defaultNewElementSettings": null, | ||
+ | "id": 1, | ||
+ | "name": "Отпуска", | ||
+ | "isReadOnly": false, | ||
+ | "dataEditRuleIds": [], | ||
+ | "beforeSaveDataActions": [], | ||
+ | "afterSaveDataActions": [], | ||
+ | "discriminator": "DictionaryDataSource" | ||
+ | }, | ||
+ | { | ||
+ | "pivotId": 358, | ||
+ | "parameters": [], | ||
+ | "id": 2, | ||
+ | "name": "Пивот Сотрудник и количество дней отпуска", | ||
+ | "isReadOnly": false, | ||
+ | "dataEditRuleIds": [], | ||
+ | "beforeSaveDataActions": [], | ||
+ | "afterSaveDataActions": [], | ||
+ | "discriminator": "PivotDataSource" | ||
+ | } | ||
+ | ], | ||
+ | "parameters": null, | ||
+ | "binaryConditionsRules": [], | ||
+ | "expressions": [ | ||
+ | { | ||
+ | "id": 222, | ||
+ | "expression": "if(IsNullOrEmpty([21]) or IsNullOrEmpty([22]), Null(), (TrimTime([22])-TrimTime([21]))+1)", | ||
+ | "returnFirstParameterValue": false, | ||
+ | "parameters": [ | ||
+ | { | ||
+ | "uiSourceId": 22, | ||
+ | "id": 22, | ||
+ | "discriminator": "EntryExpressionUiSourceParameterDto" | ||
+ | }, | ||
+ | { | ||
+ | "uiSourceId": 21, | ||
+ | "id": 21, | ||
+ | "discriminator": "EntryExpressionUiSourceParameterDto" | ||
+ | } | ||
+ | ], | ||
+ | "comment": null | ||
+ | } | ||
+ | ], | ||
+ | "actions": [ | ||
+ | { | ||
+ | "dataSourcesIds": [ | ||
+ | 1 | ||
+ | ], | ||
+ | "id": 111, | ||
+ | "comment": "Сохранение значения", | ||
+ | "discriminator": "SaveDataSourceAction" | ||
+ | }, | ||
+ | { | ||
+ | "id": 222, | ||
+ | "controlId": 222, | ||
+ | "expressionId": 222, | ||
+ | "comment": "Вычисление количества дней отпуска", | ||
+ | "discriminator": "CalculateControlValueAction" | ||
+ | }, | ||
+ | { | ||
+ | "instanceId": 2, | ||
+ | "id": 333, | ||
+ | "comment": "Обновление пивота", | ||
+ | "discriminator": "RebuildSourceInstanceAction" | ||
+ | } | ||
+ | ], | ||
+ | "conditionActionIdsOnOpen": null | ||
} | } | ||
+ | |||
</syntaxhighlight> | </syntaxhighlight> |
Текущая версия на 08:43, 17 сентября 2021
Кнопку "Сохранить" можно реализовать двумя способами:
1. Кнопка Сохранить (ButtonSubmitSourceEntryDto),
2. Пользовательская кнопка (CustomButtonEntry).
Кнопка Сохранить (ButtonSubmitSourceEntryDto) сохраняет данные автоматически в источники, у которых свойство readOnly = false.
Пользовательской кнопке (CustomButtonEntry) необходимо прописать действие, которое сохраняет добавленный элемент в источнике данных.
Обе кнопки могут содержать дополнительные действия помимо сохранения.
Основным отличием является порядок выполнения действий - в кнопке ButtonSubmitSourceEntryDto нельзя управлять порядком сохранения.
Содержание
Сравнение кнопок
Свойство / Тип кнопки | ButtonSubmitSourceEntryDto | CustomButtonEntry |
---|---|---|
Actions | Может быть пустым | Обязательно должно содержать действие, которое сохраняет добавленный элемент в источнике данных |
Управлять порядком выполнения действий | Нельзя | Можно |
ButtonSubmitSourceEntryDto
Примерный алгоритм:
1. В раздел uiSources добавляем элемент управления (строка в данном примере), значения которого будет записывать кнопка.
1 "uiSources": [
2 {...},
3 {
4 ...
5
6 "id": 1,
7 "uiDataSource": {
8 "attribute": {
9 "id": 2,
10 "discriminator": "OwnAttributeDefinitionDto"
11 },
12 "attributeId": null,
13 "sourceId": 1,
14 "discriminator": "UiDataSourceDictionary"
15 },
16 ...
17
18 "discriminator": "StringSourceEntry"
19 }
20 ]
2. В раздел uiSources добавляем элементы управления кнопка ButtonSubmitSourceEntry. Свойство Actions в данном примере пустое, дополнительных действий нет.
1 "uiSources": [
2 {
3 "actionConfirmation": { ... },
4 "Actions": [],
5 "onBeforeClickConditionalActions": [],
6 "submitRuleIds": [],
7 "id": 100,
8 "caption": "Сохранить",
9
10 ...
11
12 "discriminator": "ButtonSubmitSourceEntry"
13 },
14 {...}
15 ]
3. В раздел entryDataSources добавляем источник (справочник в данном примере), в который записываются данные.
Важно, чтобы свойство "isReadOnly" источника (источников), куда записываются данные, принимало значение false.
1 "entryDataSources": [
2 {
3 "dictionaryId": 47,
4
5 ...
6
7 "id": 1,
8 "name": "Список контрагентов",
9 "isReadOnly": false,
10
11 ...
12
13 "discriminator": "DictionaryDataSource"
14 }
15 ],
Кнопка сохранит все введенные данные автоматически.
Пример
Кейс: Добавление нового элемента справочника.
Кнопка Сохранить (контрол id=100) сохрает введенное в строку значение в справочник (источник id=3).
1 {
2 "id": 315,
3 "name": "Кнопка сохранить (ButtonSubmitSourceEntry)",
4 "description": null,
5 "title": "Пример кнопки Сохранить ButtonSubmitSourceEntry",
6 "entrySettings": null,
7 "uiSources": [
8 {
9 "actionConfirmation": {
10 "message": null,
11 "conditionId": null
12 },
13 "controlsValueCalculateRulesIds": [],
14 "conditionalActions": [],
15 "onBeforeClickConditionalActions": [],
16 "submitRuleIds": [],
17 "id": 100,
18 "caption": "Сохранить",
19 "enable": true,
20 "visible": true,
21 "hint": null,
22 "uiDataSource": null,
23 "doActionOnChangeValue": true,
24 "onAfterChangeValueConditionalActions": null,
25 "onAfterChangeValueByClientConditionalActions": null,
26 "rebuildDependentsObjectOnChange": false,
27 "enableRuleIds": [],
28 "visibleRuleIds": [],
29 "access": null,
30 "isValueChanged": false,
31 "expressionId": null,
32 "discriminator": "ButtonSubmitSourceEntry"
33 },
34 {
35 "trimSpaces": false,
36 "defaultValue": null,
37 "value": null,
38 "id": 1,
39 "caption": "Новый контрагент",
40 "enable": true,
41 "visible": true,
42 "hint": null,
43 "uiDataSource": {
44 "attribute": {
45 "id": 2,
46 "discriminator": "OwnAttributeDefinitionDto"
47 },
48 "attributeId": null,
49 "sourceId": 3,
50 "discriminator": "UiDataSourceDictionary"
51 },
52 "doActionOnChangeValue": false,
53 "onAfterChangeValueConditionalActions": null,
54 "onAfterChangeValueByClientConditionalActions": null,
55 "enableRuleIds": [],
56 "visibleRuleIds": [],
57 "access": null,
58 "isValueChanged": false,
59 "expressionId": null,
60 "discriminator": "StringSourceEntry"
61 }
62 ],
63 "entryDataSources": [
64 {
65 "dictionaryId": 47,
66 "hierarchyId": null,
67 "filter": null,
68 "sortingOptions": null,
69 "groupingOptions": null,
70 "dictionaryAttributes": null,
71 "defaultValue": [],
72 "defaultValueExpressionId": null,
73 "parameterId": null,
74 "dictionarySourceSelectionMode": "None",
75 "dataSourceAttributesAdditionsSettings": [],
76 "externalFileStorageUrl": null,
77 "filePrefix": null,
78 "defaultNewElementSettings": null,
79 "id": 3,
80 "name": "Список контрагентов",
81 "isReadOnly": false,
82 "dataEditRuleIds": [],
83 "beforeSaveDataActions": [],
84 "afterSaveDataActions": [],
85 "discriminator": "DictionaryDataSource"
86 }
87 ],
88 "parameters": [],
89 "binaryConditionsRules": [],
90 "submitValidateRules": [],
91 "expressions": [],
92 "controlsValueCalculateRules": [],
93 "actions": [],
94 "conditionActionIdsOnOpen": [],
95 "conditionalActions": [],
96 "selectionSets": [],
97 "reportTemplates": [],
98 "useNewDependenciesBuilder": null
99 }
CustomButtonEntry
Пользовательская кнопка CustomButtonEntry требует добавить действие, которое сохраняет добавленный элемент в источнике данных. Действия, "повешанные" на кнопку, будут выполняться последовательно.
Примерный алгоритм:
1. В раздел uiSources добавляем элементы управления. В приведенном примере - дата начала периода, дата окончания периода и строка, которая заполнится рассчитанной длительностью периода.
1
2 "uiSources": [
3 {...},
4 {
5 "id": 222,
6 "caption": "Длительность периода",
7 "uiDataSource": {
8 "attribute": {
9 "id": 20,
10 "discriminator": "OwnAttributeDefinitionDto"
11 },
12 "attributeId": null,
13 "sourceId": 1,
14 "discriminator": "UiDataSourceDictionary"
15 },
16 "discriminator": "StringSourceEntry",
17 ...
18 },
19 {
20 "id": 21,
21 "caption": "Дата начала периода",
22 ...,
23 "discriminator": "DateTimeSourceEntry"
24 },
25 {
26
27 "id": 22,
28 "caption": "Дата конца периода",
29 ...,
30 "discriminator": "DateTimeSourceEntry"
31 },
32
33 {...}
34 ]
2. В раздел uiSources добавляем элементы управления пользовательская кнопка CustomButtonEntry. В Actions в данном примере два действия, сначала рассчитается длинна периода, отобразится в строке и только потом сохранится это значение.
1 "uiSources": [
2 {
3 ...,
4
5 "Actions": [
6 222,
7 111
8 ],
9 "id": 200,
10 "caption": "Сохранить",
11
12 ...
13
14 "discriminator": "CustomButtonEntry"
15 },
16
17 {...}
18 ]
3. В раздел entryDataSources добавляем источник (справочник в данном примере), в который записываются данные.
1 "entryDataSources": [
2 {
3 "dictionaryId": 316,
4 ...,
5 "name": "Длительность отпусков",
6 "isReadOnly": false,
7 "dataEditRuleIds": [],
8 "beforeSaveDataActions": [],
9 "afterSaveDataActions": [],
10 "discriminator": "DictionaryDataSource"
11 },
12 {...}
13 ]
Пример
Кейс: Внести данные об отпуске сотрудника - ФИО и период. При нажатии кнопки "Сохранить" выполняться три действия: сначала произойдет вычисление количества дней отпуска, затем данные сохранятся и, наконец, обновится пивот.
1 {
2 "id": 356,
3 "title": "",
4 "description": "",
5 "uiSources": [
6 {
7 "submitRuleIds": [],
8 "actionConfirmation": {
9 "message": null,
10 "conditionId": null
11 },
12 "controlsValueCalculateRulesIds": [],
13 "Actions": [
14 222,
15 111,
16 333
17 ],
18 "onBeforeClickConditionalActions": [],
19 "id": 200,
20 "caption": "Сохранить",
21 "enable": true,
22 "visible": true,
23 "hint": null,
24 "uiDataSource": null,
25 "doActionOnChangeValue": false,
26 "onAfterChangeValueConditionalActions": null,
27 "onAfterChangeValueByClientConditionalActions": null,
28 "enableRuleIds": [],
29 "visibleRuleIds": [],
30 "access": {
31 "read": {
32 "roles": [],
33 "inversion": false,
34 "default": true
35 },
36 "edit": {
37 "roles": [],
38 "inversion": false,
39 "default": true
40 }
41 },
42 "isValueChanged": false,
43 "expressionId": null,
44 "discriminator": "CustomButtonEntry"
45 },
46 {
47 "id": 222,
48 "caption": "Длительность периода",
49 "enable": true,
50 "visible": true,
51 "uiDataSource": {
52 "attribute": {
53 "id": 20,
54 "discriminator": "OwnAttributeDefinitionDto"
55 },
56 "attributeId": null,
57 "sourceId": 1,
58 "discriminator": "UiDataSourceDictionary"
59 },
60 "discriminator": "StringSourceEntry",
61 "doActionOnChangeValue": false
62 },
63 {
64 "defaultValue": null,
65 "value": null,
66 "id": 21,
67 "caption": "Дата начала периода",
68 "enable": true,
69 "visible": true,
70 "hint": null,
71 "doActionOnChangeValue": false,
72 "onAfterChangeValueConditionalActions": null,
73 "onAfterChangeValueByClientConditionalActions": null,
74 "visibleRuleIds": [],
75 "isValueChanged": false,
76 "expressionId": null,
77 "discriminator": "DateTimeSourceEntry"
78 },
79 {
80 "defaultValue": null,
81 "value": null,
82 "id": 22,
83 "caption": "Дата конца периода",
84 "enable": true,
85 "visible": true,
86 "hint": null,
87 "doActionOnChangeValue": false,
88 "onAfterChangeValueConditionalActions": null,
89 "onAfterChangeValueByClientConditionalActions": null,
90 "visibleRuleIds": [],
91 "isValueChanged": false,
92 "expressionId": null,
93 "discriminator": "DateTimeSourceEntry"
94 },
95 {
96 "trimSpaces": false,
97 "defaultValue": null,
98 "value": null,
99 "id": 1,
100 "caption": "Список сотрудников",
101 "enable": true,
102 "visible": true,
103 "hint": null,
104 "uiDataSource": {
105 "attribute": {
106 "id": 2,
107 "discriminator": "OwnAttributeDefinitionDto"
108 },
109 "attributeId": null,
110 "sourceId": 1,
111 "discriminator": "UiDataSourceDictionary"
112 },
113 "doActionOnChangeValue": false,
114 "onAfterChangeValueConditionalActions": null,
115 "onAfterChangeValueByClientConditionalActions": null,
116 "enableRuleIds": [],
117 "visibleRuleIds": [],
118 "access": null,
119 "isValueChanged": false,
120 "expressionId": null,
121 "discriminator": "StringSourceEntry"
122 },
123 {
124 "id": 2,
125 "pivotSourceId": 2,
126 "doActionOnChangeFocusedCell": false,
127 "doActionOnChangeCellValue": true,
128 "caption": "Пивот Режимы",
129 "enable": true,
130 "visible": true,
131 "hint": null,
132 "uiDataSource": null,
133 "doActionOnChangeValue": false,
134 "onAfterChangeValueConditionalActions": null,
135 "onAfterChangeValueByClientConditionalActions": null,
136 "enableRuleIds": [],
137 "visibleRuleIds": [],
138 "access": {},
139 "isValueChanged": false,
140 "expressionId": null,
141 "discriminator": "PivotSourceEntry"
142 }
143 ],
144 "entryDataSources": [
145 {
146 "dictionaryId": 316,
147 "hierarchyId": null,
148 "filter": null,
149 "sortingOptions": null,
150 "groupingOptions": null,
151 "dictionaryAttributes": null,
152 "defaultValue": [],
153 "defaultValueExpressionId": null,
154 "parameterId": null,
155 "dictionarySourceSelectionMode": "None",
156 "dataSourceAttributesAdditionsSettings": [],
157 "externalFileStorageUrl": null,
158 "filePrefix": null,
159 "defaultNewElementSettings": null,
160 "id": 1,
161 "name": "Отпуска",
162 "isReadOnly": false,
163 "dataEditRuleIds": [],
164 "beforeSaveDataActions": [],
165 "afterSaveDataActions": [],
166 "discriminator": "DictionaryDataSource"
167 },
168 {
169 "pivotId": 358,
170 "parameters": [],
171 "id": 2,
172 "name": "Пивот Сотрудник и количество дней отпуска",
173 "isReadOnly": false,
174 "dataEditRuleIds": [],
175 "beforeSaveDataActions": [],
176 "afterSaveDataActions": [],
177 "discriminator": "PivotDataSource"
178 }
179 ],
180 "parameters": null,
181 "binaryConditionsRules": [],
182 "expressions": [
183 {
184 "id": 222,
185 "expression": "if(IsNullOrEmpty([21]) or IsNullOrEmpty([22]), Null(), (TrimTime([22])-TrimTime([21]))+1)",
186 "returnFirstParameterValue": false,
187 "parameters": [
188 {
189 "uiSourceId": 22,
190 "id": 22,
191 "discriminator": "EntryExpressionUiSourceParameterDto"
192 },
193 {
194 "uiSourceId": 21,
195 "id": 21,
196 "discriminator": "EntryExpressionUiSourceParameterDto"
197 }
198 ],
199 "comment": null
200 }
201 ],
202 "actions": [
203 {
204 "dataSourcesIds": [
205 1
206 ],
207 "id": 111,
208 "comment": "Сохранение значения",
209 "discriminator": "SaveDataSourceAction"
210 },
211 {
212 "id": 222,
213 "controlId": 222,
214 "expressionId": 222,
215 "comment": "Вычисление количества дней отпуска",
216 "discriminator": "CalculateControlValueAction"
217 },
218 {
219 "instanceId": 2,
220 "id": 333,
221 "comment": "Обновление пивота",
222 "discriminator": "RebuildSourceInstanceAction"
223 }
224 ],
225 "conditionActionIdsOnOpen": null
226 }