Управління інтерфейсом
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
}
}