Skip to main content
Version: 50.0.0

Управління інтерфейсом

Runtime управління елементами​

Управління атрибутами run-time: Документ​

Блокування, обов'язковість, show/hide

Блокування атрибута якщо певне поле заповнено​

Виконується за допомогою конструкції event.form.setNodeProperty(....'disabled'.....). enabled не існує, тому якщо потрібно enabled ставимо заперечення на disabled за допомогою знака оклику.

// Не дозволяти редагувати атрибут Attrdict11 (nodeId = 6), поки атрибут Attrdict10 порожній
module.exports = {
loaded(event) {
// Блокує атрибут Attrdict11 у випадку якщо атрибут Attrdict10 порожній при завантаженні форми
const value = event.document.getAttribute('Attrdict10')
event.form.setNodeProperty(6, 'disabled', !value)
},
document_attributeChanged_Attrdict10(event) {
// Розблоковує атрибут Attrdict11 у випадку якщо атрибут Attrdict10 заповнений
event.form.setNodeProperty(6, 'disabled', !event.value)
}
}

Блокування атрибута якщо певне поле заповнено певним значенням.​

Приклад аналогічний з попереднім, різниця тільки в тому, що в попередньому прикладі блокування спрацьовувало при введенні будь-якого значення, в даному випадку тільки при введенні певного значення. В даному прикладі поле від якого залежить блокування – текстове.

// Блокувати атрибут Attrdict11 (nodeId = 6) у випадку якщо в атрибут Attrtext01 внесено значення "Заборонено"
module.exports = {
document_attributeChanged_Attrtext01(event) {
if (event.document.getAttribute('Attrtext01') === 'Заборонено') {
event.form.setNodeProperty(6, 'disabled', !!event.value)
} else {
event.form.setNodeProperty(6, 'disabled', !event.value)
}
}
}

Блокування атрибута якщо певне поле заповнене певним значенням​

Приклад аналогічний з попереднім, різниця тільки в тому, що в попередньому прикладі блокування спрацьовувало при введенні будь-якого значення, в даному випадку тільки при введенні певного значення. В даному прикладі поле від якого залежить блокування – поле з довідником.

module.exports = {
async document_attributeChanged_Attrdict10(event) {
if (event.value) {
const valueTextCode = await UB.Repository('cdn_currency')
.attrs('code3')
.where('ID', '=', event.value)
.selectScalar()

if (valueTextCode === 'AED') {
event.form.setNodeProperty(6, 'disabled', !!event.value)
} else {
event.form.setNodeProperty(6, 'disabled', !event.value)
}
}
}
}

Встановлення обов'язковості для атрибута​

Виконується за допомогою конструкції event.document.setAttributeRequiredRule(.....'*.*'.....).

// Атрибут Attrdict11 стає обов'язковим у випадку якщо атрибут Attrdict10 заповнений. '*.*' означає що обов'язковість поширюється на всі стани, всі дії
module.exports = {
loaded(event) {
// Встановлення обов'язковості для атрибута Attrdict11 при відкритті документа, на основі аналізу стану атрибута Attrdict10
const valuee = event.document.getAttribute('Attrdict10')
event.document.setAttributeRequiredRule('Attrdict11', '*.*', !!valuee)
},
document_attributeChanged_Attrdict10(event) {
// Встановлення обов'язковості для атрибута Attrdict11 при заповненні атрибута Attrdict10
event.document.setAttributeRequiredRule('Attrdict11', '*.*', !!event.value)
}
}

Встановлення обов'язковості для всіх атрибутів секції​

Аналогічно попередньому прикладу, різниця тільки в тому, що в попередньому прикладі вплив був тільки на один обраний атрибут, а в поточному прикладі на всі атрибути заданої секції. Виконується за допомогою конструкції event.form.setNodeRequiredRule(.....'*.*'.....). *.* означає всі ролі, всі стани.

// Всі атрибути секції з nodeid = 10 стають обов'язковими у випадку якщо атрибут Attrdict10 заповнений. '*.*' означає що обов'язковість поширюється на всі стани, всі дії
module.exports = {
loaded(event) {
// Встановлення обов'язковості для всіх атрибутів секції при відкритті документа, на основі аналізу стану атрибута Attrdict10
const valuee = event.document.getAttribute('Attrdict10')
event.form.setNodeRequiredRule(10, '*.*', !!valuee)
},
document_attributeChanged_Attrdict10(event) {
// Встановлення обов'язковості для всіх атрибутів секції при заповненні атрибута Attrdict10
event.form.setNodeRequiredRule(10, '*.*', !!event.value)
}
}

Встановлює відображення/приховування атрибута​

Виконується за допомогою конструкції event.form.setNodeProperty(9, 'hidden', true), вказується id атрибута.

module.exports = {
async document_attributeChanged_a00013(event) {
if (event.value) {
event.form.setNodeProperty(9, 'hidden', true)
} else {
event.form.setNodeProperty(9, 'hidden', !true)
}
}
}

Встановлює відображення/приховування всіх атрибутів секції​

Виконується аналогічно як для атрибута, за допомогою конструкції event.form.setNodeProperty(10, 'hidden', true), тільки вказується id секції.

module.exports = {
async document_attributeChanged_a00013(event) {
if (event.value) {
event.form.setNodeProperty(10, 'hidden', true)
} else {
event.form.setNodeProperty(10, 'hidden', !true)
}
}
}

Управління атрибутами run-time: Завдання​

Блокування, обов'язковість, show/hide

Встановлює обов'язковість для атрибута документа​

Виконується за допомогою конструкції event.document.setAttributeRequiredRule

module.exports = {
document_attributeChanged_Attrdict10(event) {
event.document.setAttributeRequiredRule('Attrdict11', '*', !!event.value)
}
}

Встановлює обов'язковість для нативного атрибута завдання​

Встановлює обов'язковість для нативного атрибута завдання при зміні нативних атрибутів завдання. Виконується за допомогою конструкції event.task.setNativeAttributeRequiredRule

module.exports = {
task_nativeAttributeChanged_description(event) {
event.task.setNativeAttributeRequiredRule('comment', '*', !!event.value)
}
}

Встановлює обов'язковість для всіх атрибутів секції.​

Виконується за допомогою конструкції event.form.setNodeRequiredRule. * означає Усі Дії.

module.exports = {
document_attributeChanged_Attrdict10(event) {
event.form.setNodeRequiredRule(18, '*', !!event.value)
}
}

Встановлює відображення/приховування атрибута.​

Виконується за допомогою конструкції event.form.setNodeProperty(9, 'hidden', true), вказується id атрибута.

module.exports = {
async document_attributeChanged_a00013(event) {
if (event.value) {
event.form.setNodeProperty(9, 'hidden', true)
} else {
event.form.setNodeProperty(9, 'hidden', !true)
}
}
}

Встановлює відображення/приховування всіх атрибутів секції.​

Виконується аналогічно як для атрибута, за допомогою конструкції event.form.setNodeProperty(10, 'hidden', true), тільки вказується id секції.

module.exports = {
async document_attributeChanged_a00013(event) {
if (event.value) {
event.form.setNodeProperty(10, 'hidden', true)
} else {
event.form.setNodeProperty(10, 'hidden', !true)
}
}
}

Управління кнопками файлових та табличних атрибутів​

Для файлових та табличних атрибутів можна керувати станом кнопок під час виконання: видимістю, доступністю кнопок управління (як нативних кнопок так і кнопок створених зі скриптового модуля). Для керування кнопкою спочатку звертаємося до елемента керування getNodeControl('ID атрибута'), потім до самої кнопки getButton('код кнопки'). Коди кнопок наведені в меню Дії з файлами при виборі атрибута в конструкторі типу документа/форми завдання.

Об'єкт доступу до кнопки має такі методи:

  • hidden - логічне значення, що вказує, чи ця кнопка прихована
  • hide() - функція, що приховує цю кнопку, якщо вона не прихована
  • show() - функція, яка показує цю кнопку, якщо вона прихована
  • disabled - логічне значення, що вказує, чи ця кнопка відключена
Примітка:

Кнопка може бути відключена за власною логікою (не можна видалити підпис, якщо вона відсутня, наприклад) не тільки з модуля скрипту

  • enable() - функція включення цієї кнопки, якщо вона не прихована та відключена
  • disable() - функція, що відключає цю кнопку, якщо вона не прихована та не відключена

hidden, hide(), show(), disabled, enable(), disable() можна використовувати для файлових атрибутів; hidden, hide(), show() для табличних атрибутів.

Файловий атрибут: Приховати кнопку Завантажити​

Перед збереженням приховати кнопку Завантажити, якщо завантажено документ.

module.exports = {
async beforeSave(event) {
const docImageFile = event.document.getNativeFileAttribute()
const docImageControl = event.form.getNodeControl('31') // код атрибута

// перевірка завантажений документ чи ні, якщо завантажений ховаємо кнопку "Завантажити"
if (docImageFile.isUploaded) {
docImageControl.getButton('download').hide()
}
}
}

Файловий атрибут: Приховати кнопку Підписати файл​

Перед збереженням відключаємо кнопку Підписати файл, якщо документ уже підписано. Відключаємо кнопку Завантажити підписи, якщо кнопку Підписати файл відключено.

const { showErrorWindow } = require('@unitybase/ub-pub') // необхідно для відображення сповіщень

module.exports = {
async beforeSave(event) {
const docImageFile = event.document.getNativeFileAttribute()
const docImageControl = event.form.getNodeControl('31') // ID атрибута Образ документа

if (!docImageFile.isSigned) { // перевіряємо чи підписаний документ
docImageControl.getButton('signDoc').enable() // якщо ні виводимо повідомлення "Підпишіть документ" і не зберігаємо
showErrorWindow('Підпишіть документ')
event.cancelSave()
} else {
docImageControl.getButton('signDoc').disable() // якщо так ховаємо кнопку "Підписати файл"
}
},
async saved(event) { // після збереження документа відключаємо кнопку "Завантажити підписи" якщо кнопка "Підписати файл" відключена
const docImageControl = event.form.getNodeControl('31') // ID атрибута Образ документа

if (docImageControl.getButton('signDoc').disabled) {
docImageControl.getButton('uploadSignatures').disable()
} else {
docImageControl.getButton('uploadSignatures').enable()
}
}
}

Файловий атрибут: Приховати/показати кнопки Видалити, Завантажити​

Приховуємо/показуємо кнопки Видалити, Завантажити під час переходу станів, дозволяємо скачати вкладення по натисканню на кнопку, якщо кнопка Завантажити прихована.

module.exports = {
action_executed_d2(event) { // d2 код дії переходу стану
event.form.getNodeControl('31').getButton('remove').hide() // '31' - ID атрибута Образ документа
event.form.getNodeControl('31').getButton('download').hide()
},
action_executed_d3(event) { // d3 код дії переходу стану
event.form.getNodeControl('31').getButton('remove').show()
event.form.getNodeControl('31').getButton('download').show()
},
form_33_click(event) { // 33 - id атрибута Кнопка, дозволяємо скачати вкладення при прихованій кнопці "Завантажити"
if (event.form.getNodeControl('31').getButton('download').hidden) {
event.form.getNodeControl('31').downloadFile()
}
}
}

Табличний атрибут: Приховати кнопки Імпортувати, Додати​

Ховаємо кнопки Імпортувати, Додати при завантаженні форми, показуємо кнопки при зміні стану, при натисканні на кнопку Зберегти показуємо статус кнопок.

const { showErrorWindow } = require('@unitybase/ub-pub') // необхідно для відображення сповіщень

module.exports = {
form_32_mounted(event) { // ховаємо кнопки при завантаженні форми
const docImageControl = event.form.getNodeControl('32') // ID табличного атрибута
docImageControl.getButton('addNew').hide()
docImageControl.getButton('import').hide()
},
action_executed_d2(event) { // d2 код дії переходу стану, показуємо кнопки при переході
const docImageControl = event.form.getNodeControl('32') // ID табличного атрибута
docImageControl.getButton('addNew').show()
docImageControl.getButton('import').show()
},
async saved(event) { // після збереження документа показуємо статус кнопок
const docImageControl = event.form.getNodeControl('32') // ID табличного атрибута

if (docImageControl.getButton('addNew').hidden && docImageControl.getButton('import').hidden) {
showErrorWindow('Кнопки приховані')
} else {
showErrorWindow('Кнопки активні')
}
}
}

Управління фокусом​

Встановити курсор на атрибут по натисканню на кнопку​

module.exports = {
form_4_click(event) { // 4 - ID кнопки
event.form.getNodeControl(6).focus() // 6 - ID атрибута, на який буде встановлений курсор
}
}

Встановити курсор на атрибут при завантаженні спливаючої форми​

Скрипт додається на спливаючій формі.

module.exports = {
loaded(event) {
event.form.getNodeControl(15).focus() // 15 - ID елемента на який буде встановлений курсор при відкритті форми
}
}

Перевірка розміру екрана під час завантаження форми​

Якщо ширина менше 600, фокусування на одному атрибуті (вкладка з одним атрибутом у ряд - для роботи на моб.пристроях), якщо ні, то на іншому атрибуті (вкладка з трьома атрибутами в ряд - для роботи на ПК)

module.exports = {
form_0_mounted(event) {
var intViewportWidth = window.innerWidth
if (intViewportWidth < 600) {
event.form.getNodeControl(8).focus()
} else {
event.form.getNodeControl(26).focus()
}
}
}

Управління видимістю кнопок дій​

Декілька дій в одному обробнику​

Обробник action_isVisible.

module.exports = {
action_isVisible(event) {
switch(event.actionCode) {
case 'action1':
return event.document.getAttribute('ms15')
// дія action1 залежить від перемикача - атрибут ms15
case 'action2':
return event.document.getNativeAttribute('subject') === 'Дія 2'
// дія action2 буде відображатися тільки при введенні "Дія 2" в атрибуті "Короткий опис"
case 'send':
return event.document.getNativeAttribute('regNumber') != null
// дія send буде відображатися якщо документ зареєстрований - атрибут "Реєстраційний номер" не порожній
}
}
}

Відображення кнопки дії по перемикачу​

Обробник action_isVisible_<actionCode>.

module.exports = {
action_isVisible_action3(event) {
return event.document.getAttribute('sd15') // дія action3 залежить від перемикача - атрибут sd15
}
}

Відображення кнопки, якщо завантажено файл в атрибут Образ документа​

Обробник action_isVisible_<actionCode>.

module.exports = {
action_isVisible_action4(event) {
const aaa = event.document.getNativeFileAttribute()
const type = event.document.getNativeFileAttribute()?.fileInfo?.fileName
? 'true'
: 'false'
return type == 'true' // дія action4 буде відображатися при завантаженні файла в атрибут "Образ документа"
}
}

Відображення кнопки по ролі користувача, який відкриває документ​

Обробник action_isVisible_<actionCode>. Відображення кнопки дії по ролі користувача, який відкриває документ.

module.exports = {
action_isVisible_action5(event) {
const curUserRole = $App.connection.userData().roles
// console.log(curUserRole) // подивитися в консолі браузера ролі поточного користувача
return curUserRole == 'Everyone,User,dfx_user' // дія action5 тільки для користувачів в ролі dfx_user
}
}