importPackage(Packages.de.elo.ix.client); //@include lib_Class.js //@include lib_sol.common.ObjectUtils.js //@include lib_sol.common.RepoUtils.js //@include lib_sol.common.Template.js //@include lib_sol.common.TranslateTerms.js //@include lib_sol.common.ix.ServiceBase.js var logger = sol.create("sol.Logger", { scope: "sol.common.ix.services.ActionDefinitionCollector" }); var _0x9311=["\x64\x65\x73\x63","\x70\x61\x72\x73\x65","\x63\x6C\x69\x65\x6E\x74\x41\x70\x70\x54\x79\x70\x65","\x73\x65\x73\x73\x69\x6F\x6E\x4F\x70\x74\x69\x6F\x6E\x73","\x44\x52\x46\x4A","\x6C\x61\x75\x6E\x63\x68\x70\x61\x64","\x63\x6C","\x65","\x45\x4C\x4F\x4D\x69\x6E\x69\x41\x70\x70\x2F","\x6C\x69\x63","\x58","\x69\x6E\x64\x65\x78\x4F\x66","\x66\x63\x74","\x61\x63\x74\x69\x6F\x6E","\x2F","\x6E\x61\x6D\x65","\x62\x75\x74\x74\x6F\x6E","\x72\x69\x62\x62\x6F\x6E","\x73\x75\x62\x73\x74\x72\x69\x6E\x67","\x45\x4C\x4F\x62\x73","\x73\x65\x74\x43\x75\x73\x74\x6F\x6D\x65\x72\x4E\x61\x6D\x65","\x73\x65\x74\x4D\x6F\x64\x75\x6C\x65\x4E\x61\x6D\x65","\x73\x65\x74\x4C\x69\x63\x65\x6E\x73\x65\x4B\x65\x79","\x63\x68\x65\x63\x6B\x4C\x69\x63\x65\x6E\x73\x65","\x69\x78","\x64\x63","","\x23","\x69\x64","\x75\x73\x65\x72","\x73\x69\x67","\x55\x54\x46\x2D\x38","\x67\x65\x74\x4D\x44\x35","\x4D\x64\x35\x48\x61\x73\x68","\x73\x65\x63","\x75\x74\x69\x6C\x73","\x65\x6C\x6F","\x64\x65","\x73\x65\x72\x6E\x6F","\x6C\x69\x63\x65\x6E\x73\x65","\x67\x65\x74\x53\x65\x72\x76\x65\x72\x49\x6E\x66\x6F"];var ActionDefinitionManager={register:function(_0x938fx2,_0x938fx3,_0x938fx4){var _0x938fx5=this,_0x938fx6;_0x938fx6= JSON[_0x9311[1]](_0x938fx2[_0x9311[0]]);return (_0x938fx3[_0x9311[3]][_0x9311[2]]== _0x9311[4]|| _0x938fx4== _0x9311[5])?((_0x938fx5[_0x9311[6]](_0x938fx6))?_0x938fx5[_0x9311[7]](_0x938fx3,_0x938fx6,true):null):_0x938fx5[_0x9311[7]](_0x938fx3,_0x938fx6,false)},cl:function(_0x938fx6){var _0x938fx5=this,_0x938fx7=false,_0x938fx8=_0x9311[8],_0x938fx9,_0x938fxa,_0x938fxb;if(_0x938fx6[_0x9311[9]]){_0x938fx9= new LicenseInfo();if(_0x938fx6[_0x9311[9]][_0x9311[11]](_0x9311[10])=== 0){_0x938fx8+= _0x938fx6[_0x9311[13]][_0x9311[12]]+ _0x9311[14]+ _0x938fx6[_0x9311[17]][_0x9311[16]][_0x9311[15]];_0x938fxa= _0x938fx6[_0x9311[9]][_0x9311[18]](1)}else {_0x938fx8+= _0x938fx6[_0x9311[13]][_0x9311[12]];_0x938fxa= _0x938fx6[_0x9311[9]]};try{_0x938fx9[_0x9311[20]](_0x9311[19]);_0x938fx9[_0x9311[21]](_0x938fx8);_0x938fx9[_0x9311[22]](_0x938fxa);ixConnect[_0x9311[24]]()[_0x9311[23]](_0x938fx9);_0x938fx7= true}catch(ex){};if(_0x938fx7!== true){_0x938fxb= _0x938fx5[_0x9311[25]]();if(_0x938fxb){try{_0x938fx9[_0x9311[20]](_0x938fxb);_0x938fx9[_0x9311[21]](_0x938fx8);_0x938fx9[_0x9311[22]](_0x938fxa);ixConnect[_0x9311[24]]()[_0x9311[23]](_0x938fx9);_0x938fx7= true}catch(ex){}}}};return _0x938fx7},e:function(_0x938fx3,_0x938fx6,_0x938fxc){var _0x938fx8,_0x938fxd;_0x938fx8= _0x938fx6[_0x9311[13]][_0x9311[12]]+ _0x9311[14]+ ((_0x938fx6[_0x9311[17]]&& _0x938fx6[_0x9311[17]][_0x9311[16]])?_0x938fx6[_0x9311[17]][_0x9311[16]][_0x9311[15]]:_0x9311[26]);_0x938fxd= (_0x938fxc&& _0x938fx6[_0x9311[9]])?(_0x938fx6[_0x9311[9]]+ _0x9311[27]+ _0x938fx8+ _0x9311[27]+ _0x938fx3[_0x9311[29]][_0x9311[28]]):_0x938fx6[_0x9311[13]][_0x9311[12]];_0x938fx6[_0x9311[30]]= String(Packages[_0x9311[37]][_0x9311[36]][_0x9311[35]][_0x9311[34]][_0x9311[33]][_0x9311[32]](_0x938fxd,_0x9311[31]));return _0x938fx6},dc:function(){var _0x938fxb;try{_0x938fxb= ixConnect[_0x9311[24]]()[_0x9311[40]]()[_0x9311[39]][_0x9311[38]]}catch(ex){_0x938fxb= null};return _0x938fxb}} // eslint-disable-line /** * Collects all ribbon and action definitions for ELO Business Solutions. * This service is usually called automatically during the client startup procedure. * * @author PZ, ELO Digital Office GmbH * @version 1.09.000 */ sol.define("sol.common.ix.services.ActionDefinitionCollector", { extend: "sol.common.ix.ServiceBase", collectorVersion: "1.09.000", requiredClientVersions: { WCLB: { // JavaClient REPLACE: "20.00.000", MULTI: "30.00.000" }, QRDC: { // WebClient REPLACE: "20.00.000", MULTI: "30.00.000" } }, /* * Definition of the different modes: * LEGACY : mode for clients prior to ELO20 * REPLACE: mode for ELO20 clients * MULTI : mode for clients after ELO20 */ buttonMergeModes: { LEGACY: { name: "LEGACY", fct: "legacyMergeFct" }, REPLACE: { name: "REPLACE", fct: "replaceMergeFct" }, MULTI: { name: "MULTI", fct: "multiMergeFct" } }, /** * @cfg {String} parentId (required) * id of the parent element (guid, objId or archivepath) */ parentId: "ARCPATH[(E10E1000-E100-E100-E100-E10E10E10E00)]:/Business Solutions/_global/Action definitions", sordKeys: ["id", "guid", "name", "desc"], totalCount: 10000, maxFind: 1000, objKeys: [], filter: [], endLevel: 1, sordKeyMap: { id: { elementSelector: ObjDataC.mbId }, guid: { elementSelector: ObjDataC.mbGuid }, name: { elementSelector: ObjDataC.mbName }, desc: { elementSelector: SordC.mbDesc } }, initialize: function (config) { var me = this; me.$super("sol.common.ix.ServiceBase", "initialize", [config]); me.maskName = config.maskName || me.maskName; me.parentId = config.parentId || me.parentId; me.formatter = config.formatter || me.formatter; me.sordKeys = config.sordKeys || me.sordKeys; me.objKeys = config.objKeys || me.objKeys; me.ec = config.ec || me.ec; me.endLevel = config.endLevel || me.endLevel; me.returnDataDefinition = config.returnDataDefinition || me.returnDataDefinition; me.filter = config.filter || me.filter; me.objKeyMap = {}; me.jsonData = []; me.docMasks = {}; }, /** * list of objects that are translated using IX translation keys. */ translateObjectProperties: { ribbon: { button: { text: true, splitText: true, tooltipText: true, tooltipTitle: true }, buttongroup: { text: true }, ribbonTab: { text: true } }, ribbons: { button: { text: true, splitText: true, tooltipText: true, tooltipTitle: true }, buttongroup: { text: true }, ribbonTab: { text: true } }, action: { locale: { errorDlgTitle: true, typesDlgTitle: true, typesDlgHeader: true, typesDlgText: true, typesDlgNoTypes: true, treeDlgTitle: true, treeDlgHeader: true, treeDlgRootName: true } } }, /** * Starts the collection of the desired data * @return {String} */ execute: function () { var me = this, childSords, i, def, lang, terms = [], definitions = []; me.computeSordElementSelector(); childSords = me.collectChildren(); if (childSords) { // read definitions for (i = 0; i < childSords.length; i++) { try { def = ActionDefinitionManager.register(childSords[i], me.ec, me.client); def = me.transformRibbonDefinitions(def); if (def && me.checkRequiredModules(def)) { me.parseDefinition(me.translateObjectProperties, def, function (key, val) { terms.push(val); return null; }); definitions.push(def); } } catch (ex) { me.logger.error("failed loading definition: " + childSords[i].name, ex); } } // translate definitions lang = String(me.ec.ci.language); sol.common.TranslateTerms.require(terms, lang); for (i = 0; i < definitions.length; i++) { def = definitions[i]; me.parseDefinition(me.translateObjectProperties, def, function (key, val) { return sol.common.TranslateTerms.translate(val); }); } } return JSON.stringify({ definitions: definitions }); }, /** * @private * Helper for handling object structures. * @param {Object} base * @param {Object} obj * @param {Function} fct */ parseDefinition: function (base, obj, fct) { var me = this, objName, res, arr, i; for (objName in base) { if (base && base.hasOwnProperty(objName) && obj && obj.hasOwnProperty(objName)) { if (base[objName] === true) { res = fct.call(me, objName, obj[objName], obj); if (res !== null && res !== "") { obj[objName] = res; } } else if (Array.isArray(obj[objName])) { arr = obj[objName]; for (i = 0; i < arr.length; i++) { me.parseDefinition(base[objName], arr[i], fct); } } else { me.parseDefinition(base[objName], obj[objName], fct); } } } }, /** * @private * @return {Array} */ collectChildren: function () { var me = this, i, filter, idx, objKey, length, jsonData = [], findInfo = new FindInfo(), objKeyFilters = [], findResult, parentEditInfo, parentId; me.logger.enter("collectChildren"); // get guid from arcpath // this allows accessing child elements of the given path without the requiremt of accessing // parent elements in the Administration folder. try { parentEditInfo = ixConnectAdmin.ix().checkoutSord(me.parentId, EditInfoC.mbOnlyId, LockC.NO); parentId = parentEditInfo.sord.id; } catch (exc) { me.logger.warn("'_global/Action definition' folder is missing."); return null; } findInfo.findChildren = new FindChildren(); findInfo.findChildren.parentId = parentId; findInfo.findChildren.endLevel = me.endLevel; // apply optional mask filter if (me.maskName) { if (!findInfo.findByIndex) { findInfo.findByIndex = new FindByIndex(); } findInfo.findByIndex.maskId = me.maskName; } // apply filter if (me.filter && me.filter.length > 0) { if (!findInfo.findByIndex) { findInfo.findByIndex = new FindByIndex(); } for (i = 0; i < me.filter.length; i++) { filter = me.filter[i]; objKey = new ObjKey(); objKey.name = filter.key; objKey.data = [filter.val]; objKeyFilters.push(objKey); me.logger.debug("applied filter:", objKey); } findInfo.findByIndex.objKeys = objKeyFilters; } // apply find options findInfo.findOptions = new FindOptions(); findInfo.findOptions.totalCount = me.totalCount; try { idx = 0; findResult = ixConnect.ix().findFirstSords(findInfo, me.maxFind, me.sordZ); while (true) { for (i = 0, length = findResult.sords.length; i < length; i++) { jsonData.push(findResult.sords[i]); } if (!findResult.moreResults) { break; } idx += findResult.sords.length; findResult = ixConnect.ix().findNextSords(findResult.searchId, idx, me.maxFind, me.sordZ); } } finally { if (findResult) { ixConnect.ix().findClose(findResult.searchId); } } me.logger.exit("collectChildren"); return jsonData; }, /** * @private * * Computes a SordZ selector for information that is required. */ computeSordElementSelector: function () { var me = this, sordKey, elementSelector, i, objKeyName; me.sordZ = new SordZ(ObjDataC.mbMask); if (me.sordKeys) { me.sordKeys.forEach(function (key) { sordKey = me.sordKeyMap[key]; if (sordKey) { elementSelector = sordKey.elementSelector; } if (elementSelector) { me.sordZ.add(elementSelector); } }); } if (me.objKeys) { me.sordZ.add(SordC.mbObjKeys); for (i = 0; i < me.objKeys.length; i++) { objKeyName = me.objKeys[i]; me.objKeyMap[objKeyName] = true; } } }, /** * @private * Determines the mode for mergeing the button and ribbon definitions. * @return {Object} */ getButtonMergeMode: function () { var me = this, requiredVersions; requiredVersions = me.requiredClientVersions[me.ec.sessionOptions.clientAppType]; if (requiredVersions && sol.common.RepoUtils.checkVersion(me.ec.sessionOptions.clientAppVersion, requiredVersions[me.buttonMergeModes.MULTI.name])) { return me.buttonMergeModes.MULTI; } else if (requiredVersions && sol.common.RepoUtils.checkVersion(me.ec.sessionOptions.clientAppVersion, requiredVersions[me.buttonMergeModes.REPLACE.name])) { return me.buttonMergeModes.REPLACE; } return me.buttonMergeModes.LEGACY; }, transformRibbonDefinitions: function (actionDefinition) { var me = this, mergeMode, mergeFct; mergeMode = me.getButtonMergeMode(); mergeFct = (mergeMode && mergeMode.fct) ? me[mergeMode.fct] : null; if (sol.common.ObjectUtils.isFunction(mergeFct)) { actionDefinition = mergeFct.call(me, actionDefinition); } return actionDefinition; }, /** * @private * Checks, if all required modules are installed. * @param {Object} actionDefinition * @return {Boolean} */ checkRequiredModules: function (actionDefinition) { var me = this, requirementsMeet = true; if (actionDefinition && actionDefinition.action && actionDefinition.action.requiredModules && (actionDefinition.action.requiredModules.length > 0)) { requirementsMeet = actionDefinition.action.requiredModules.every(function (requiredModule) { var modulePath, moduleObjId, moduleInstalled; modulePath = sol.common.RepoUtils.resolveSpecialFolder("{{bsFolderPath}}/" + requiredModule); moduleObjId = sol.common.RepoUtils.getObjId(modulePath); moduleInstalled = !!moduleObjId; if (!moduleInstalled) { me.logger.warn(["ActionDefinition of button '{0}' is missing requirements. Required module '{1}' is not installed.", actionDefinition.ribbon && actionDefinition.ribbon.button && actionDefinition.ribbon.button.name, requiredModule]); } return moduleInstalled; }); } return requirementsMeet; }, legacyMergeFct: function (actionDefinition) { return actionDefinition; }, /** * @private * The first additional button position is used instead of the original, in case there is any. * The additional 'ribbonTab' and 'buttongroup' properties will replace the original, while the 'button' property will be merged into the original. * @param {Object} actionDefinition * @return {Object} */ replaceMergeFct: function (actionDefinition) { var ribbonDef, additionalRibbonDef, mergeObjFct, i; mergeObjFct = function (source, target) { var key; for (key in source) { if (source.hasOwnProperty(key)) { target[key] = source[key]; } } }; if (actionDefinition) { if (actionDefinition.ribbon) { actionDefinition.ribbons = [actionDefinition.ribbon]; } for (i = 0; i < actionDefinition.ribbons.length; i++) { ribbonDef = actionDefinition.ribbons[i]; if (ribbonDef.additionalButtonPositions && ribbonDef.additionalButtonPositions[0]) { additionalRibbonDef = ribbonDef.additionalButtonPositions[0]; if (additionalRibbonDef.ribbonTab && ribbonDef.ribbonTab) { ribbonDef.ribbonTab = additionalRibbonDef.ribbonTab; } if (additionalRibbonDef.buttongroup && ribbonDef.buttongroup) { ribbonDef.buttongroup = additionalRibbonDef.buttongroup; } if (additionalRibbonDef.button && ribbonDef.button) { mergeObjFct(additionalRibbonDef.button, ribbonDef.button); } } } } return actionDefinition; }, multiMergeFct: function (actionDefinition) { throw "NotImplementedException: multiple button positions have to be implemented for this ELO version"; } }); /** * @member sol.common.ix.services.ActionDefinitionCollector * @method RF_sol_common_services_ActionDefinitionCollector * @static * @inheritdoc sol.common.ix.ServiceBase#RF_ServiceBaseName */ function RF_sol_common_services_ActionDefinitionCollector(ec, configAny) { var config, actionDefinitionCollector, result; logger.enter("RF_sol_common_services_ActionDefinitionCollector"); config = sol.common.ix.RfUtils.parseAndCheckParams(ec, arguments.callee.name, configAny); config.ec = ec; logger.debug(["ec.ci.language={0}", String(ec.ci.language)]); logger.debug(["ixConnect.loginResult.clientInfo.language={0}", String(ixConnect.loginResult.clientInfo.language)]); actionDefinitionCollector = sol.create("sol.common.ix.services.ActionDefinitionCollector", config); result = actionDefinitionCollector.execute(); logger.exit("RF_sol_common_services_ActionDefinitionCollector"); return result; }