importPackage(Packages.de.elo.ix.client); //@include lib_Class.js //@include lib_sol.common.SordUtils.js //@include lib_sol.common.AclUtils.js //@include lib_sol.common.RepoUtils.js //@include lib_sol.common.AsyncUtils.js //@include lib_sol.common.UserUtils.js //@include lib_sol.common.ObjectFormatter.js //@include lib_sol.common.Template.js //@include lib_sol.common.SordTypeUtils.js //@include lib_sol.common.Map.js //@include lib_sol.common.ix.FunctionBase.js var logger = sol.create("sol.Logger", { scope: "sol.common.ix.functions.Move" }); /** * Moves an archive element to a new location. Alternatively only references can be created without moving. * * The path string can contain static parts as well as dynamic parts. * Dynamic parts are in [handlebars] (http://handlebarsjs.com/) syntax (see also {@link sol.common.Template}) * and have access to the sord object in form of a {@link sol.common.ObjectFormatter.TemplateSord TemplateSord}. * * Please note that handlebars does html-escaping by default if used double-curlies {{ sord.name }}. Therefore trippe-curlies should be used {{{ sord.name }}} since that prevents escaping strings. * * # As workflow node * * ObjId is set based on the element that the workflow is attached to. * Following configuration should be applied to the comments field. * * { * "path": "¶Invoice¶Archive¶{{{substring sord.objKeys.INVOICE_DATE 0 4}}}¶{{{substring sord.objKeys.VENDOR_NAME 0 1}}}¶{{{sord.objKeys.VENDOR_NAME}}}", * "rightsConfig": { "mode": "ADD", "inherit": true } * } * * { * "path": "¶Invoice¶{{formatDate 'YYYY-MM-DD' sord.IDateIso}}" * } * * # As IX function call * * In addition to the workflow node configuration the objId must be passed. * * sol.common.IxUtils.execute("RF_sol_function_Move", { * "objId": "4711", * "path": "¶Invoice¶Archive¶{{{substring sord.objKeys.INVOICE_DATE 0 4}}}¶{{{substring sord.objKeys.VENDOR_NAME 0 1}}}¶{{{sord.objKeys.VENDOR_NAME}}}", * "adjustRights": true * }); * * Move move object and keep reference on old location * * sol.common.IxUtils.execute("RF_sol_function_Move", { * "objId": "4711", * "path": "¶Invoice¶Archive¶{{{substring sord.objKeys.INVOICE_DATE 0 4}}}¶{{{substring sord.objKeys.VENDOR_NAME 0 1}}}¶{{{sord.objKeys.VENDOR_NAME}}}", * "refOldParentId": true * }); * * Set multiple references without moving * * sol.common.IxUtils.execute("RF_sol_function_Move", { * "objId": "4711", * "referenceIds": ["1815", "1816", "1817"] * }); * * sol.common.IxUtils.execute("RF_sol_function_Move", { * "objId": "4711", * "referencePaths": ["¶Invoice¶Archive¶{{substring sord.objKeys.INVOICE_DATE 0 4}}¶{{substring sord.objKeys.VENDOR_NAME 0 1}}¶{{sord.objKeys.VENDOR_NAME}}", * "¶Invoice¶Backup¶{{substring sord.objKeys.INVOICE_DATE 0 4}}¶{{substring sord.objKeys.VENDOR_NAME 0 1}}¶{{sord.objKeys.VENDOR_NAME}}"] * }); * * @author PZ, ELO Digital Office GmbH * @version 1.03.000 * * @eloix * * @requires sol.common.SordUtils * @requires sol.common.JsonUtils * @requires sol.common.RepoUtils * @requires sol.common.ObjectFormatter * @requires sol.common.Template * @requires sol.common.WfUtils * @requires sol.common.UserUtils * @requires sol.common.ix.RfUtils * @requires sol.common.Map * @requires sol.common.ix.FunctionBase */ sol.define("sol.common.ix.functions.Move", { extend: "sol.common.ix.FunctionBase", requiredConfig: ["objId"], /** * @cfg {String} objId (required) ObjId, GUID or ARCPATH */ objId: undefined, /** * @cfg {String} path Either `path` or `targetId` has to be defined; `targetId` has priority; exception: if there are `referenceIds` or `referencePaths` are defined, in that case the original will not be moved; */ path: undefined, /** * @cfg {Boolean} deleteIfPathNotFound If set, and the path does not exists, the sord will be deleted instead of being moved. This is only possible, if the sord is in the chaos cabinet. */ deleteIfPathNotFound: false, /** * @cfg {String} targetId Either `path` or `targetId` has to be defined; `targetId` has priority; exception: if there are `referenceIds` or `referencePaths` are defined, in that case the original will not be moved; */ targetId: undefined, /** * @cfg {String} targetIdFromMap reads the targetId from a MAP-field. Priority: targetIdFromMap > targetId > path */ targetIdFromMap: undefined, /** * @cfg {Boolean} refOldParentId If set, a reference to original position will be created after move */ refOldParentId: undefined, /** * @cfg {String[]} referenceIds If set, references will be created */ referenceIds: undefined, /** * @cfg {String[]} referencePaths If set, references will be created */ referencePaths: undefined, /** * @cfg {Object} rightsConfig * Rights that will be set to the workflow object and it's children * * Example: * * { "inherit": true, "users": ["user1"], "rights": { "r": true } } * * The ACL will be inherited from the parent object and in addition the read right for the user "user1" will be set. */ rightsConfig: undefined, /** * @cfg {Boolean} adjustRights * If true, the rights will be inherited from the parent */ /** * @cfg {String|Number} sordType * Name or ID of a sord type for the newly created elements. Fallback is the IX standard behaviour. */ /** * @since 1.05.000 * @cfg {Boolean} [ignoreInvalidRefPaths=false] * If this is `true`, there will be no error if one of the {@link #referencePaths} is invalid and the invalid paths will just be ignored. */ initialize: function (config) { var me = this; me.$super("sol.common.ix.FunctionBase", "initialize", [config]); if (!me.targetId && !me.targetIdFromMap && !me.path && !me.refOldParentId && !me.referenceIds && !me.referencePaths) { me.logger.error("IllegalArgumentException: either 'targetId' or 'targetIdFromMap' or 'path' or 'refOldParentId' or 'referenceIds' or 'referencePaths' has to be defined"); throw "IllegalArgumentException: either 'targetId' or 'targetIdFromMap' or 'path' or 'refOldParentId' or 'referenceIds' or 'referencePaths' has to be defined"; } }, /** * Moves the element to a new location or set references. */ process: function () { var me = this, conn, sord, oldParentId, newParentId, i, refId, sordMap, mapValue, deleteIfPathNotFound, target; conn = (typeof ixConnectAdmin !== "undefined") ? ixConnectAdmin : ixConnect; sord = ixConnect.ix().checkoutSord(me.objId, EditInfoC.mbSord, LockC.NO).sord; oldParentId = sord.parentId; deleteIfPathNotFound = (me.deleteIfPathNotFound === true) && (+(oldParentId) === 0); // only allow sords in chaos cabinet for now. if (me.wFDiagram) { me.logger.debug(["templateName={0}", me.wFDiagram.templateName]); } if (typeof me.targetIdFromMap === "string" && me.targetIdFromMap) { sordMap = sol.create("sol.common.SordMap", { objId: me.objId }); sordMap.read(); mapValue = sordMap.getValue(me.targetIdFromMap); if (mapValue) { mapValue = String(mapValue); if (mapValue) { me.targetId = mapValue; me.logger.info(["using targetId {0} from map-field `{1}`.", me.targetId, me.targetIdFromMap]); } } } if (me.path) { me.logger.debug(["path={0}", me.path]); if (!me.targetId) { target = sol.common.RepoUtils.preparePath(me.path, { data: sord, sordType: me.sordType, mask: me.mask, skipIfNotExists: deleteIfPathNotFound, returnDetails: true }); if (target.objId) { me.targetId = target.objId; me.logger.info(["target path OK {0}.", target.path]); } else if (deleteIfPathNotFound && target.skipped) { me.logger.info(["deleteIfPathNotFound is defined. target path not found {0}. Deleting sord {1}", target.path, me.objId]); ixConnect.ix().deleteSord(oldParentId, me.objId, LockC.NO, (new DeleteOptions())); return; } } } if (!me.referenceIds && !me.referencePaths) { if (!me.targetId) { me.logger.error(["could not resolve path: {0}", me.path]); throw "could not resolve path: " + me.path; } } if (me.targetId) { newParentId = conn.ix().checkoutSord(me.targetId, EditInfoC.mbOnlyId, LockC.NO).sord.id; // make sure, newParentId is a number (targetId might be an arcpath) me.logger.info(["move sord (objId={0}, name={1}): {2} -> {3}", sord.id, sord.name, oldParentId, newParentId]); conn.ix().refSord(oldParentId, newParentId, sord.id, -1); if (me.refOldParentId) { conn.ix().refSord("", oldParentId, sord.id, -1); } } if (!me.referenceIds) { me.referenceIds = []; if (me.referencePaths instanceof Array) { for (i = 0; i < me.referencePaths.length; i++) { if (me.ignoreInvalidRefPaths !== true || me.isValidPath(me.referencePaths[i])) { refId = sol.common.RepoUtils.preparePath(me.referencePaths[i], { data: sord, sordType: me.sordType }); } if (refId) { me.referenceIds.push(refId); } } } } for (i = 0; i < me.referenceIds.length; i++) { conn.ix().refSord("", me.referenceIds[i], sord.id, -1); } if ((me.rightsConfig || me.adjustRights) && (me.targetId)) { if (!me.rightsConfig && me.adjustRights) { me.rightsConfig = { mode: "SET", inherit: true }; } else { me.rightsConfig = JSON.parse(JSON.stringify(me.rightsConfig)); } sol.common.AclUtils.changeRightsInBackground(sord.id, me.rightsConfig); } }, /** * @private * Checks if a Path is valid. * @param {String} path * @return {Boolean} */ isValidPath: function (path) { var separator, regex; separator = path.charAt(0); regex = new RegExp(separator + separator + "|" + separator + "$"); // checks for duplicated separators or if the string ends with the separator return !regex.test(path); } }); /** * @member sol.common.ix.functions.Move * @static * @inheritdoc sol.common.ix.FunctionBase#onEnterNode */ function onEnterNode(_clInfo, _userId, wFDiagram, nodeId) { var params, module; logger.enter("onEnterNode_Move", { flowId: wFDiagram.id, nodeId: nodeId }); sol.common.WfUtils.checkMainAdminWf(wFDiagram); params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId); params.objId = wFDiagram.objId; params.wFDiagram = wFDiagram; module = sol.create("sol.common.ix.functions.Move", params); module.process(); logger.exit("onEnterNode_Move"); } /** * @member sol.common.ix.functions.Move * @static * @inheritdoc sol.common.ix.FunctionBase#onExitNode */ function onExitNode(_clInfo, _userId, wFDiagram, nodeId) { var params, module; logger.enter("onExitNode_Move", { flowId: wFDiagram.id, nodeId: nodeId }); sol.common.WfUtils.checkMainAdminWf(wFDiagram); params = sol.common.WfUtils.parseAndCheckParams(wFDiagram, nodeId); params.objId = wFDiagram.objId; params.wFDiagram = wFDiagram; module = sol.create("sol.common.ix.functions.Move", params); module.process(); logger.exit("onExitNode_Move"); } /** * @member sol.common.ix.functions.Move * @method RF_sol_function_Move * @static * @inheritdoc sol.common.ix.FunctionBase#RF_FunctionName */ function RF_sol_function_Move(iXSEContext, args) { var params, module; logger.enter("RF_sol_function_Move", args); params = sol.common.ix.RfUtils.parseAndCheckParams(iXSEContext, arguments.callee.name, args, "objId"); sol.common.ix.RfUtils.checkMainAdminRights(iXSEContext.user, params); module = sol.create("sol.common.ix.functions.Move", params); module.process(); logger.exit("RF_sol_function_Move"); }