UserUtilsMixin (Утилиты для работы с информацией о "Организационных единицах" (роли/юниты))
В API текущего приложения, не входит каких либо инструментов для упрощенной работы с элементами организационной структуры:
"Функциональные роли", "Организационные юниты", "Пользователи" (само по себе)
Уже обсуждалось вот в этой теме
Там же я выложил первые наработки, миксин-модуля с некоторыми методами решающими классические "юзкейсы".
С тех пор его пришлось существенно доработать и расширить функционал, по этому выложу его в этой отдельной теме для тех кому может понадобиться.
Во вложении (ZIP-архив) вы найдете исчерпывающую документацию в виде HTML-страницы.
Модуль реализован в виде "миксина", т.е. без каких либо трудностей подключайте в любой схеме и пользуйтесь на здоровье :) так же в конце темы есть исходный код, а так-же Уже готовая к импорту схема в виде MD-файла.
Краткое описание:
getRelAU ([id], callback, [contactModeFlag], [scope]);
Получить информацию об административных юнитах связанных с пользователем, по его идентификатору Id или Id связанного с ним контакта, или для текущего пользователя если опустить первый аргумент.
(элементы "Организационной структуры", "Функциональные роли", "Организации", "Роли руководителей" (если он в них входит)) в виде структурированного объекта с дополнительной информацией (н/п о родительских OU/FU) будут переданы в callback вызов.
checkUserInAU (AUname, [AUtype], [UserId], callback, [scope])
Проверить принадлежит ли текущий пользователь (или произвольный по его Id) к конкретному административному юниту по его имени (элементу "Организационной структуры", "Функциональные роли", "Организации").
В целях оптимизации предусмотрен поиск только по конкретным типам Орг.юнитов. Результат передается в виде булева примитива в callback-функцию
getUsersFromRole (RoleId, [getManagerFlag], callback, [scope])
Получить всех пользователей непосредственно входящих в целевые орг.юнит или функциональную роль, в том числе руководителей (пользователей из специалищированного связанного орг.юнита).
Коллекция пользователей будет передана в callback-функцию
Исходный код:
function(resources) {
Ext.define("Terrasoft.configuration.mixins.UserUtilsMixin", {
"alternateClassName": "Terrasoft.UserUtilsMixin",
"getRelAU": function(UserId, callback, UseContactIdFlag, scope) {
var serviceScope;
if (callback === undefined) {
callback = UserId;
UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
}
if (typeof callback === "object") {
scope = callback;
callback = UserId;
UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
}
if (typeof UseContactIdFlag === "object") {
scope = UseContactIdFlag;
UseContactIdFlag = false;
}
if (typeof scope !== "object") {
scope = this;
} else if (scope.scope) {
serviceScope = scope;
scope = scope.scope;
}
function mainLogick(UserId, callback) {
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "SysUserInRole"
});
var filter = this.scope.Terrasoft.createColumnFilterWithParameter(
this.scope.Terrasoft.ComparisonType.EQUAL,
"SysUser",
UserId
);
esq.filters.addItem(filter);
esq.addColumn("SysRole");
esq.addColumn("[SysAdminUnit:Id:SysRole].Name", "AuName");
esq.addColumn("[SysAdminUnit:Id:SysRole].ParentRole", "Parent");
esq.addColumn("[SysAdminUnit:Id:SysRole].[SysAdminUnitType:Value:SysAdminUnitTypeValue].Name", "AuType");
esq.getEntityCollection(
function(response) {
if (response && response.success) {
var resultObject = {
FuncRoles: [],
OrgUnits: [],
Organizations: [],
Managers: [],
Teams: []
};
response.collection.each(function(item) {
var wrapObj = {
name: item.values.AuName,
id: item.values.SysRole.value,
parentAU: item.values.Parent
};
var type = item.values.AuType;
if (type === "Division") {
resultObject.OrgUnits.push(wrapObj);
} else if (type === "Функциональная роль") {
resultObject.FuncRoles.push(wrapObj);
} else if (type === "Organization") {
resultObject.Organizations.push(wrapObj);
} else if (type === "Manager") {
resultObject.Managers.push(wrapObj);
} else if (type === "Team") {
resultObject.Teams.push(wrapObj);
}
});
if (serviceScope) {
this.callback.call(serviceScope, resultObject);
} else {
this.callback.call(scope, resultObject);
}
}
},
{callback: callback, scope: this.scope}
);
}
var wrapOfMainLogick = mainLogick.bind({scope: scope, callback: callback});
if (UseContactIdFlag) {
var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "SysAdminUnit"
});
var filter = this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL,
"Contact.Id",
UserId
);
esq.filters.addItem(filter);
esq.getEntityCollection(
function(response) {
if (response.collection.getCount() !== 1) {
this.scope.log("(getRelAU) Target Contact is not associated with User", Terrasoft.LogMessageType.ERROR);
} else {
this.mainLogick(response.collection.getByIndex(0).values.Id, this.callback);
}
},
{
scope: scope,
mainLogick: wrapOfMainLogick,
callback: callback
}
);
} else {
wrapOfMainLogick(UserId, callback);
}
},
"checkUserInAU": function(AUname, AUtype, UserId, callback, scope) {
if (typeof AUtype === "function" && UserId === undefined) {
callback = AUtype;
AUtype = "ALL";
if (typeof UserId === "object") {
scope = UserId;
}
UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
}
if (typeof UserId === "function") {
if (typeof callback === "object") {
scope = callback;
}
callback = UserId;
UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
}
if (typeof UserId !== "object") {
scope = this;
}
this.getRelAU(UserId, function(result) {
var CompareResult = false;
switch (this.AUtype) {
case "OU":
for (var OU in result.OrgUnits) {
if (this.AUname === result.OrgUnits[OU].name) {
CompareResult = true;
}
}
break;
case "FR":
for (var FU in result.FuncRoles) {
if (this.AUname === result.FuncRoles[FU].name) {
CompareResult = true;
}
}
break;
case "ORG":
for (var orgIndex in result.Organizations) {
if (this.AUname === result.Organizations[orgIndex].name) {
CompareResult = true;
}
}
break;
default:
for (var each in result) {
for (var subarray in result[each]) {
if (this.AUname === result[each][subarray].name) {
CompareResult = true;
}
}
}
break;
}
this.callback.call(this.scope, CompareResult);
}, {
scope: scope,
AUtype: AUtype,
AUname: AUname,
callback: callback
});
},
"getUsersFromRole": function(RoleId, getManager, callback, scope) {
var getManagerFlag = false, filter = Terrasoft.createFilterGroup(), esq;
if (typeof getManager === "function") {
callback = getManager;
if (typeof callback === "object") {
scope = callback;
}
} else {
getManagerFlag = getManager;
}
if (typeof scope !== "object") {
scope = this;
}
if (getManagerFlag) {
filter.logicalOperation = Terrasoft.LogicalOperatorType.AND;
esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "SysAdminUnit"
});
filter.addItem(
this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL,
"ParentRole",
RoleId
)
);
filter.addItem(
this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL,
"SysAdminUnitTypeValue",
2
)
);
esq.addColumn("Name");
} else {
esq = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "SysUserInRole"
});
filter.addItem(
this.Terrasoft.createColumnFilterWithParameter(
this.Terrasoft.ComparisonType.EQUAL,
"SysRole",
RoleId
)
);
esq.addColumn("[SysAdminUnit:Id:SysUser].Name", "UserName");
esq.addColumn("[SysAdminUnit:Id:SysUser].Id", "UserId");
esq.addColumn("[SysAdminUnit:Id:SysUser].Contact", "Contact");
}
esq.filters.addItem(filter);
esq.getEntityCollection(
function(response) {
var cleanArray = [];
if (this.getManagerFlag) {
this.scope.getUsersFromRole(
response.collection.getByIndex(0).values.Id,
this.callback,
this.scope
);
} else {
response.collection.each(function(elem) {
elem.values.Id = elem.values.UserId;
delete elem.values.UserId;
cleanArray.push(elem.values);
});
this.callback.call(this.scope, cleanArray);
}
}, {
scope: scope,
callback: callback,
getManagerFlag: getManagerFlag
}
);
}
});
});
Нравится
код миксина обновлен (исправлены некоторые проблемы, добавлены некоторые решения), MD-файл из приложений убрал он не актуален.
берите код из листинга в теме.
примеры для вызова getRelAU
//Получаем результирующий объект для текущего пользователя this.getRelAU( function(result) { console.log(result); } ); //Тот же вызов, но с явным определением контекста для callback-функции this.getRelAU( function(result) { console.log(result); } , context); //Получаем результирующий объект для пользователя с id "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D" this.getRelAU( "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D", function(result) { console.log(result); } ); //Тот же вызов, но с явным определением контекста для callback-функции this.getRelAU( "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D", function(result) { console.log(result); } , context); //Получаем результирующий объект для пользователя связанного с контактом id которого "E7D525FB-88EE-4947-94CC-D013E85D2F79" this.getRelAU( "E7D525FB-88EE-4947-94CC-D013E85D2F79", function(result) { console.log(result); }, true ); //Тот же вызов, но с явным определением контекста для callback-функции this.getRelAU( "E7D525FB-88EE-4947-94CC-D013E85D2F79", function(result) { console.log(result); }, true, context );
в схему корректно не выгружается кириллица, а поскольку в SysAdminUnitType одна только "Функциональная роль" названа кириллицей.
То после импорта схемы посмотрите в исходник, там где "кракозебры" замените на "Функциональная роль"
Будет время, обновлю MD-корректный
Получилось запустить, но думаю стоит добавить полный код схемы с примером как его использовать. это многим поможет. дело в том, что этот код будут использовать только те кто начинает, им как раз нужна полная инф.
Севостьянов Илья Сергеевич,
подскажите, пожалуйста, что за UserUtilsMixinResources передается в зависимости? его нужно создать отдельно?
define("UserUtilsMixin", ["UserUtilsMixinResources"]
создала у себя миксин, но без этого UserUtilsMixinResources, а также изменив названия миксина в 3 местах. когда его подключаю в своем клиентском модуле, выходит ошибка.
Есть какие-то особенности при этого подключении миксина?
UserUtilsMixinResources, это имя модуля + Resources стандартная мнемоника для объявления ресурсов в зависимостях для схем.
в 3-х местах это в каких ?