ubjs issueshttps://git-pub.intecracy.com/unitybase/ubjs/-/issues2020-12-07T20:13:29+02:00https://git-pub.intecracy.com/unitybase/ubjs/-/issues/113Ярлыки. Настройки сортировки заданные на ярлыке, не отображаются в гриде2020-12-07T20:13:29+02:00Чугай РоманЯрлыки. Настройки сортировки заданные на ярлыке, не отображаются в гриде**STR:**
1. Создать новый ярлык и задать сортировку по любому полю (перетянуть поле в область "Сортировка" на форме настройки ярлыка)
2. Открыть данные по ярлыку
**Issue:**
В гриде не показано что он отсортирован: отсутствует стрелочки ...**STR:**
1. Создать новый ярлык и задать сортировку по любому полю (перетянуть поле в область "Сортировка" на форме настройки ярлыка)
2. Открыть данные по ярлыку
**Issue:**
В гриде не показано что он отсортирован: отсутствует стрелочки сортировки на соотв.колонках, на форме сортировки отображается что сортировки нетPavel MashliakovskiyPavel Mashliakovskiyhttps://git-pub.intecracy.com/unitybase/ubjs/-/issues/110Ukrainian language sort problem for columns in 'showList' command.2020-11-18T10:47:16+02:00Ghost UserUkrainian language sort problem for columns in 'showList' command.When trying to sort columns (GUI or via orderList) Ukrainian letters 'Є' and 'І' are at top.
UB.Repository('######').attrs(['#####']).orderBy('#####', 'asc').select() returns the same result.When trying to sort columns (GUI or via orderList) Ukrainian letters 'Є' and 'І' are at top.
UB.Repository('######').attrs(['#####']).orderBy('#####', 'asc').select() returns the same result.https://git-pub.intecracy.com/unitybase/ubjs/-/issues/100Повторна аутентифікація після таймаута2020-02-20T22:18:16+02:00Олейникова ЮлияПовторна аутентифікація після таймаутаАутентификація за КЕП
Користувач зберіг пароль у браузері
Сессія обірвана за таймаутом
Кроки:
1. Обрати файл з ключом
2. Пароль підставівся автоматично
AR:
Кнопка "Заватажити" неактивна
ER:
Кнопка "Завантажити" актив![Аутентификация...Аутентификація за КЕП
Користувач зберіг пароль у браузері
Сессія обірвана за таймаутом
Кроки:
1. Обрати файл з ключом
2. Пароль підставівся автоматично
AR:
Кнопка "Заватажити" неактивна
ER:
Кнопка "Завантажити" актив![Аутентификация_после_таймаута](/uploads/b039015ed9df1e23c37b822c738798d4/Аутентификация_после_таймаута.png)наhttps://git-pub.intecracy.com/unitybase/ubjs/-/issues/95Validation does not work after editing when saving a record through a tab.2020-01-20T16:58:57+02:00Ghost UserValidation does not work after editing when saving a record through a tab.**Actual Result:** Validation does not work after **editing** when saving a record **through a tab**.
**Expected Result:** Validation should be work when saving a record.
![Validation](/uploads/67fdf9f464b83d875eae6a73821a161a/Validati...**Actual Result:** Validation does not work after **editing** when saving a record **through a tab**.
**Expected Result:** Validation should be work when saving a record.
![Validation](/uploads/67fdf9f464b83d875eae6a73821a161a/Validation.mp4)https://git-pub.intecracy.com/unitybase/ubjs/-/issues/93[Menu] Add the ability to limit the choice of actions through the menu of the...2020-01-02T11:19:20+02:00Ghost User[Menu] Add the ability to limit the choice of actions through the menu of the Enum field.The actions “Select / Edit / Add” of the menu through the field “Enum” must be **customizable**.
![Context_menu](/uploads/90eb014e1b8117ffcdfbb454e76e8119/Context_menu.png)The actions “Select / Edit / Add” of the menu through the field “Enum” must be **customizable**.
![Context_menu](/uploads/90eb014e1b8117ffcdfbb454e76e8119/Context_menu.png)https://git-pub.intecracy.com/unitybase/ubjs/-/issues/92UCodeMirror sometimes makes form dirty on show2019-12-27T10:14:35+02:00Ruslan Onyshchenkoruslan.onyshchenko@softengi.comUCodeMirror sometimes makes form dirty on showCodeMirror sometimes adds `\r` and the form becomes dirty (for string fields, not json)CodeMirror sometimes adds `\r` and the form becomes dirty (for string fields, not json)Shepel VadymShepel Vadymhttps://git-pub.intecracy.com/unitybase/ubjs/-/issues/80Json fields. Error scripts on first display.2019-10-02T17:35:06+03:00Ghost UserJson fields. Error scripts on first display.Json fields. Error scripts on first display.
![Json_fields._Creating_portal.](/uploads/18aba8310dbc69cf04b3277f23790de3/Json_fields._Creating_portal..png)Json fields. Error scripts on first display.
![Json_fields._Creating_portal.](/uploads/18aba8310dbc69cf04b3277f23790de3/Json_fields._Creating_portal..png)https://git-pub.intecracy.com/unitybase/ubjs/-/issues/77Error in the console "Maximum call stack size exceeded".2020-02-03T17:33:29+02:00Ghost UserError in the console "Maximum call stack size exceeded".Error in the console "Maximum call stack size exceeded" when hovering over a minimized menu item.
Steps to Reproduce:
1. Open app.
2. Navigate to the Menu item.
3. Look at the console.
![Error](/uploads/14919ec556f4166ad2b91107f9af2e60/...Error in the console "Maximum call stack size exceeded" when hovering over a minimized menu item.
Steps to Reproduce:
1. Open app.
2. Navigate to the Menu item.
3. Look at the console.
![Error](/uploads/14919ec556f4166ad2b91107f9af2e60/Error.png)https://git-pub.intecracy.com/unitybase/ubjs/-/issues/68When you try to populate the table with data, a conflict occurs.2020-02-21T15:24:03+02:00Ghost UserWhen you try to populate the table with data, a conflict occurs.When you try to populate the table with data, a conflict occurs
For field "Description" set attribute “isMultilang”: true.
```
dataLoader.loadArrayData(conn, data, 'uba_role', ['name', 'description_en^', 'description_ru^', 'description_...When you try to populate the table with data, a conflict occurs
For field "Description" set attribute “isMultilang”: true.
```
dataLoader.loadArrayData(conn, data, 'uba_role', ['name', 'description_en^', 'description_ru^', 'description_tg^'], [0, 1, 2, 3], 1)
```
![UBbug](/uploads/e08865e7d16f12d091602c49741cb81b/UBbug.png)
MPV: the reason is what uba_role.description attribute (multilang) is mapped to uba_subject.name
https://git-pub.intecracy.com/unitybase/ubjs/-/issues/59Entity: Support INCLUDE in INDEX2019-08-10T13:47:10+03:00Andrii BezuglyiEntity: Support INCLUDE in INDEXSQL Server has a nice feature: field inclusion into index.
It allows in some scenarios to take values from index, instead of looking up clustered index.
I suggest to add support for the following:
```json
"idx_ldoc_Document_eav_int"...SQL Server has a nice feature: field inclusion into index.
It allows in some scenarios to take values from index, instead of looking up clustered index.
I suggest to add support for the following:
```json
"idx_ldoc_Document_eav_int": {
"type": "INDEX",
"definition": {
"keys": {
"intValue": {}
},
"include": {
"attrID": {},
"docID": {}
}
}
},
```
This shall generate for MS SQL:
```sql
CREATE NONCLUSTERED INDEX idx_ldoc_Document_eav_int ON dbo.doc_Document_eav
(intValue) INCLUDE (attrID, docID)
```
For other vendors, columns in "include" may be part of index, unless index is unique.
For unique index, for other vendors, just ignore "include".
I whole, this would allow:
* Take advantage of a nice SQL Server feature, and have a better performance on some cases
* When other vendors support it, we will be ready:
* https://www.depesz.com/2018/04/26/waiting-for-postgresql-11-indexes-with-include-columns-and-their-support-in-b-tree/Pavel MashliakovskiyPavel Mashliakovskiyhttps://git-pub.intecracy.com/unitybase/ubjs/-/issues/58ability to switch between applications from one menu2019-09-02T10:19:06+03:00Седнева Ольгаability to switch between applications from one menuImplement the ability to integrate different products on the UB(DocNet, Nectain, A5) in one user interface on the principle Jira+Confluence
![jira-conf](/uploads/be4f689060e8bbdceb965fc93e164823/jira-conf.png)Implement the ability to integrate different products on the UB(DocNet, Nectain, A5) in one user interface on the principle Jira+Confluence
![jira-conf](/uploads/be4f689060e8bbdceb965fc93e164823/jira-conf.png)Pavel MashliakovskiyPavel Mashliakovskiyhttps://git-pub.intecracy.com/unitybase/ubjs/-/issues/52При закрытии закладки формы, пока на форме крутится "Loading...", нужно запре...2019-06-12T14:16:38+03:00Zimina ValentynaПри закрытии закладки формы, пока на форме крутится "Loading...", нужно запретить закрывать закладку.https://tstora.docflow2.unitybase.info/
tester1 (пароль 1111)
1. Создать проект внутреннего документа, заполнить обяз. поля, сохранить.
2. на вкл.Исполнение добавить пункт, заполнить форму пункта добавить через контрол исполнителя.
3. по...https://tstora.docflow2.unitybase.info/
tester1 (пароль 1111)
1. Создать проект внутреннего документа, заполнить обяз. поля, сохранить.
2. на вкл.Исполнение добавить пункт, заполнить форму пункта добавить через контрол исполнителя.
3. пока крутиться "Loading..." закрыть вкладку с документом
Вкладка закрывается и выдается ошибка:
Виникла невідома помилка. Зверніться, будь ласка, до адміністратора системи.file: "" line: TypeError: Cannot read property 'mask' of undefined
at e.mask (/models/adminui-pub/dist/ext-all.min.js:1:318367)
at e.setRecord (/clientRequire/@docflow/doc/public/dist/doc.app.min.js:1:53833)
at e.newRecord (/clientRequire/@docflow/doc/public/dist/doc.app.min.js:1:53729)
at eval (/clientRequire/@docflow/doc/public/dist/doc.app.min.js:1:53280)
at r (/clientRequire/@unitybase/adminui-pub/dist/adminui.app.min.js:1:9999)
at o._settlePromiseFromHandler (/clientRequire/@unitybase/adminui-pub/dist/adminui.app.min.js:1:413188)
at o._settlePromise (/clientRequire/@unitybase/adminui-pub/dist/adminui.app.min.js:1:413988)
at o._settlePromise0 (/clientRequire/@unitybase/adminui-pub/dist/adminui.app.min.js:1:414687)
at o._settlePromises (/clientRequire/@unitybase/adminui-pub/dist/adminui.app.min.js:1:416039)
at l (/clientRequire/@unitybase/adminui-pub/dist/adminui.app.min.js:1:417592)
at s (/clientRequire/@unitybase/adminui-pub/dist/adminui.app.min.js:1:417531)
at i._drainQueues (/clientRequire/@unitybase/adminui-pub/dist/adminui.app.min.js:1:419099)
at drainQueues (/clientRequire/@unitybase/adminui-pub/dist/adminui.app.min.js:1:417273)
-------------------
Необходимо запретить закрывать вкладку на форме пока форма не догружена.Pavel MashliakovskiyPavel Mashliakovskiyhttps://git-pub.intecracy.com/unitybase/ubjs/-/issues/44DocNet. При первом входе в Систему по домену запрашиваются авторизационные да...2019-02-06T16:17:34+02:00Жукова ВикторияDocNet. При первом входе в Систему по домену запрашиваются авторизационные данные пользователя.1. Пользователь на форме входа в Документооборот выбирает доменный вход.
2. Нажимает кнопку "Продолжить".
Результат: Открывается дополнительное окно для указания имени пользователя и пароля. ![Domain_enter](/uploads/6663a105ec2ec7dcc346...1. Пользователь на форме входа в Документооборот выбирает доменный вход.
2. Нажимает кнопку "Продолжить".
Результат: Открывается дополнительное окно для указания имени пользователя и пароля. ![Domain_enter](/uploads/6663a105ec2ec7dcc34627e415893294/Domain_enter.PNG)
Ожидаемый результат: Никаких дополнительный форм для указания параметров входа быть не должно.Pavel MashliakovskiyPavel Mashliakovskiyhttps://git-pub.intecracy.com/unitybase/ubjs/-/issues/43AdminUI: ShowList - to allow columns without "name"2019-01-27T18:40:23+02:00Andrii BezuglyiAdminUI: ShowList - to allow columns without "name"Sometimes, I need calculated columns on client.
But ShowList requires "name", which it puts to the query to DB.
Please don't require it. I need columns, which would not cause extra column to be queries from DB.
A trick with specifying ...Sometimes, I need calculated columns on client.
But ShowList requires "name", which it puts to the query to DB.
Please don't require it. I need columns, which would not cause extra column to be queries from DB.
A trick with specifying "ID" works only if I have just one such column. If I have more - I need more "fake" attributes.
Please just allow columns with "format", but without "name".Nectain 01Pavel MashliakovskiyPavel Mashliakovskiyhttps://git-pub.intecracy.com/unitybase/ubjs/-/issues/40ORG: Add "organizationID" to "org_department"2019-01-28T12:27:22+02:00Andrii BezuglyiORG: Add "organizationID" to "org_department"There are lots of cases, when it is required to output in grid organization of departments or organization staff units.
Please consider adding `org_department.organizationID` - it would help a lot.There are lots of cases, when it is required to output in grid organization of departments or organization staff units.
Please consider adding `org_department.organizationID` - it would help a lot.Nectain 01Pavel MashliakovskiyPavel Mashliakovskiyhttps://git-pub.intecracy.com/unitybase/ubjs/-/issues/39AdminUI: ShowList - to allow display queries without ID column2019-01-28T15:15:12+02:00Andrii BezuglyiAdminUI: ShowList - to allow display queries without ID columnI have entities mapped to views.
Any chance to allow queries which do NOT contain ID column? It is a bit of a pain to add some meaningless, unique value as ID for such entities - just to be able to "showList" them.I have entities mapped to views.
Any chance to allow queries which do NOT contain ID column? It is a bit of a pain to add some meaningless, unique value as ID for such entities - just to be able to "showList" them.Nectain 01Pavel MashliakovskiyPavel Mashliakovskiyhttps://git-pub.intecracy.com/unitybase/ubjs/-/issues/38ELS - possibility to set multiple method names as mask value2019-10-17T10:45:17+03:00Andrii BezuglyiELS - possibility to set multiple method names as mask valueCurrently there is rather insecure way of specifying mask, like `[iuda]*`.
This would give access for unexprected method names, like `addMember`.
Specifying method names individually just pollutes ELS table.
It would be good to be able...Currently there is rather insecure way of specifying mask, like `[iuda]*`.
This would give access for unexprected method names, like `addMember`.
Specifying method names individually just pollutes ELS table.
It would be good to be able to specify method names using separator, comma or | or any other.Pavel MashliakovskiyPavel Mashliakovskiyhttps://git-pub.intecracy.com/unitybase/ubjs/-/issues/36AdminUI - grid - export to Excel / CSV / HTML - provide cell and row to forma...2019-03-12T16:13:42+02:00Andrii BezuglyiAdminUI - grid - export to Excel / CSV / HTML - provide cell and row to format functionsWhen a cell in grid has a custom format function, it accepts 3 parameters:
- value
- cell
- row
But when you export the very same grid to excel / html / csv - you have only the "value" parameter.
I found my peace with undefined cell and...When a cell in grid has a custom format function, it accepts 3 parameters:
- value
- cell
- row
But when you export the very same grid to excel / html / csv - you have only the "value" parameter.
I found my peace with undefined cell and just check its type - if it is object or not. Though that is not too comfortable :)
But I really do need row - I need to be able to look at other columns values. Otherwise, all I could do - return empty cells for columns, which builds their value client-side from other column's values.Nectain 01Pavel MashliakovskiyPavel Mashliakovskiyhttps://git-pub.intecracy.com/unitybase/ubjs/-/issues/35TreeStructure table mixin for hierarchies2019-01-03T17:50:21+02:00Andrii BezuglyiTreeStructure table mixin for hierarchiesСделать возможность указывания в миксине - нужно ли вести специальную таблицу - Tree Structure.
Пример для `org_unit` - должна создасться таблица `org_unit_ts`:
```sql
CREATE TABLE org_unit_ts (
parentID bigint NOT NULL
, objectID...Сделать возможность указывания в миксине - нужно ли вести специальную таблицу - Tree Structure.
Пример для `org_unit` - должна создасться таблица `org_unit_ts`:
```sql
CREATE TABLE org_unit_ts (
parentID bigint NOT NULL
, objectID bigint NOT NULL
, level smallint NOT NULL
);
/*
-- MSSQL ONLY, Postgres does not have conception of clustered indexes and before version 11 does not support covered index (INCLUDE).
CREATE CLUSTERED INDEX idx_org_unit_ts_parentID ON org_unit_ts (parentID, objectID, level);
CREATE INDEX idx_org_unit_ts_objectID ON org_unit_ts (objectID, parentID) INCLUDE (level);
*/
-- This will work on all DB vendors, but where possible, it is better to use INLCUDE columns and clustered index.
-- ...better for huge hierarchies, for small - does not really matter.
CREATE INDEX idx_org_unit_ts_parentID ON org_unit_ts (parentID, objectID, level);
CREATE INDEX idx_org_unit_ts_objectID ON org_unit_ts (objectID, parentID, level);
```
Таблица должна для каждого объекта содержать по записи на каждый из предков, начиная с себя.
Т.е. для структуры
| ID | parentID | code |
| --- | --- | --- |
| 1 | null | Org1 |
| 2 | 1 | Org1_1 |
| 3 | 2 | Dep1_1_1 |
Должны быть такие записи
| objectID | parentID | level |
| --- | --- | --- |
| 1 | 1 | 0 |
| 2 | 2 | 0 |
| 2 | 1 | 1 |
| 3 | 3 | 0 |
| 3 | 2 | 1 |
| 3 | 1 | 2 |
Таблица должна первоначально - сразу после создания - должна заполняться подобным скриптом (писать циклы или CTE - лень :) ):
```sql
INSERT
INTO org_unit_ts (parentID, objectID, level)
SELECT ID
, ID
, 0
FROM org_unit;
INSERT
INTO org_unit_ts (parentID, objectID, level)
SELECT parentID, ID, 1
FROM org_unit
WHERE parentID IS NOT NULL;
INSERT
INTO org_unit_ts (parentID, objectID, level)
SELECT p.parentID, u.ID, 2
FROM org_unit u
JOIN org_unit p ON p.ID = u.parentID
WHERE p.parentID IS NOT NULL;
INSERT
INTO org_unit_ts
SELECT p2.parentID, u.ID, 3
FROM org_unit u
JOIN org_unit p ON p.ID = u.parentID
JOIN org_unit p2 ON p2.ID = p.parentID
WHERE p2.parentID IS NOT NULL;
INSERT
INTO org_unit_ts
SELECT p3.parentID, u.ID, 4
FROM org_unit u
JOIN org_unit p ON p.ID = u.parentID
JOIN org_unit p2 ON p2.ID = p.parentID
JOIN org_unit p3 ON p3.ID = p2.parentID
WHERE p3.parentID IS NOT NULL;
INSERT
INTO org_unit_ts
SELECT p4.parentID, u.ID, 5
FROM org_unit u
JOIN org_unit p ON p.ID = u.parentID
JOIN org_unit p2 ON p2.ID = p.parentID
JOIN org_unit p3 ON p3.ID = p2.parentID
JOIN org_unit p4 ON p4.ID = p3.parentID
WHERE p4.parentID IS NOT NULL;
INSERT
INTO org_unit_ts
SELECT p5.parentID, u.ID, 6
FROM org_unit u
JOIN org_unit p ON p.ID = u.parentID
JOIN org_unit p2 ON p2.ID = p.parentID
JOIN org_unit p3 ON p3.ID = p2.parentID
JOIN org_unit p4 ON p4.ID = p3.parentID
JOIN org_unit p5 ON p5.ID = p4.parentID
WHERE p5.parentID IS NOT NULL;
```
Для поддержания таблиц в актуальном состоянии нужно добавить такие обработчики к сущности:
```javascript
const dom = require('@unitybase/dom')
const me = global[require('path').basename(__filename).split('.')[0]]
me.on('insert:after', orgUnit_insertTreeStructure)
me.on('delete:before', orgUnit_deleteTreeStructure)
me.on('update:before', orgUnit_beforeUpdate)
me.on('update:after', orgUnit_afterUpdate)
/**
* @param {ubMethodParams} ctx
*/
function orgUnit_insertTreeStructure(ctx) {
const {ID, parentID} = ctx.mParams.execParams
if (parentID) {
console.debug('orgUnit_insertTreeStructure: insert links to ancestors: parentID=%d', parentID)
ctx.dataStore.execSQL(
`
INSERT
INTO org_unit_ts (parentID, objectID, level)
SELECT parentID, :ID:, level + 1
FROM org_unit_ts ts
WHERE ts.objectID = :parentID:
`,
{ID, parentID}
)
}
console.debug('orgUnit_insertTreeStructure: link to itself (level=0)')
ctx.dataStore.execSQL(`
INSERT
INTO org_unit_ts (parentID, objectID, level)
VALUES (:ID:, :ID:, 0)
`,
{ID}
)
console.debug('orgUnit_insertTreeStructure: done')
}
/**
* @param {ubMethodParams} ctx
*/
function orgUnit_deleteTreeStructure(ctx) {
const {ID} = ctx.mParams.execParams
console.debug('orgUnit_deleteTreeStructure: deleting links with ancestors')
ctx.dataStore.execSQL(`
DELETE
FROM org_unit_ts
WHERE objectID = :ID:
`,
{ID}
)
console.debug('orgUnit_deleteTreeStructure: done')
}
/**
* If change parent from non-empty value to a new empty or non-empty value, delete all the links between descendants and ancestors.
* @param {ubMethodParams} ctx
*/
function orgUnit_beforeUpdate(ctx) {
const {ID, parentID} = ctx.mParams.execParams
if (parentID === undefined) {
console.debug('orgUnit_beforeUpdate: parentID is not updated, do nothing')
return
}
let oldParentID = null
dom.store.switchContext(ctx.dataStore, 'selectBeforeUpdate', /** @type {TubDataStore} */store => {
oldParentID = store.get('parentID')
})
if (oldParentID === null) {
console.debug('orgUnit_beforeUpdate: old parent is null, do nothing')
return
}
if (parentID === oldParentID) {
console.debug('orgUnit_beforeUpdate: parentID has not been changed, do nothing')
return
}
console.debug(
'orgUnit_beforeUpdate: parentID has been changed from %d to %d; delete links with ancestors',
parentID, oldParentID
)
// Delete links between object descendants and object ascendants
ctx.dataStore.execSQL(`
DELETE
FROM ts
FROM org_unit_ts ts
WHERE EXISTS (SELECT 1 FROM org_unit_ts ts_anc WHERE ts_anc.parentID = ts.parentID AND ts_anc.objectID = :ID: AND ts_anc.level >= 1)
AND EXISTS (SELECT 1 FROM org_unit_ts ts_dsc WHERE ts_dsc.objectID = ts.objectID AND ts_dsc.parentID = :ID:)
`,
{ID}
)
console.debug('orgUnit_beforeUpdate', 'links with ancestors deleted!')
}
/**
* If change parent to a new non-empty value, insert all the new links between descendants and new ancestors.
* @param {ubMethodParams} ctx
*/
function orgUnit_afterUpdate(ctx) {
const {ID, parentID} = ctx.mParams.execParams
if (parentID === undefined) {
console.debug('orgUnit_beforeUpdate: parentID is not updated, do nothing')
return
}
if (parentID === null) {
console.debug('orgUnit_beforeUpdate: parentID is set empty, do nothing')
return
}
let oldParentID = null
dom.store.switchContext(ctx.dataStore, 'selectBeforeUpdate', /** @type {TubDataStore} */store => {
oldParentID = store.get('parentID')
})
if (parentID === oldParentID) {
console.debug('orgUnit_afterUpdate: parentID has not been changed, do nothing')
return
}
console.debug('orgUnit_afterUpdate', 'adding links to ancestors')
ctx.dataStore.execSQL(`
INSERT
INTO org_unit_ts (parentID, objectID, level)
SELECT ts_anc.parentID
, ts_dsc.objectID
, ts_dsc.level + ts_anc.level + 1
FROM org_unit_ts ts_dsc
, org_unit_ts ts_anc
WHERE ts_dsc.parentID = :ID:
AND ts_anc.objectID = :parentID:
`,
{ID, parentID}
)
console.debug('orgUnit_afterUpdate: done')
}
```
Все это легко может быть изменено для того, чтобы оно было применимо для любой сущности с иерархией, не только для org_unit.
Я бы для миксина tree сделал опции:
* Флаг "нужно поле mi_treePath"
* Флаг "нужна таблица _ts"
Теперь пару слов о том, чем это все полезно:
* Вывести список организаций для каждого staffunit - в грид, например (а попробуй сделать тоже самое без tree structure?! :) ):
```sql
SELECT su.ID
, (SELECT TOP 1 FROM org_organization o JOIN org_unit_ts ts ON ts.parentID = o.ID WHERE objectID = su.ID ORDER BY level) organizationID
FROM org_staffunit su
```
Подобный запрос может быть полезен в очень большом количестве случаев. Можно реализовывать настройки с наслендованием.
Работает БЫСТРО!
Также можно делать RLS который базируется на ACL с наследованием и т.п.Pavel MashliakovskiyPavel Mashliakovskiyhttps://git-pub.intecracy.com/unitybase/ubjs/-/issues/29Localization: provide translations UI for "Text" UB attributes2020-02-03T13:38:44+02:00Andrii BezuglyiLocalization: provide translations UI for "Text" UB attributesWe do have translation (the globe icon) for "String" attributes.
But what about "Text" attributes?We do have translation (the globe icon) for "String" attributes.
But what about "Text" attributes?