Author: lgiessmann Date: Thu Jun 25 04:38:25 2009 New Revision: 62
Log: ajax-cient: fixed a bug with remove-buttons in role-frames created from otherrole-constraints; added the functionality of creating role-frames from existing content - so there will be all existing roles selected as default-value - if there exist any constraints for the content
Modified: trunk/src/ajax/javascripts/datamodel.js trunk/src/ajax/javascripts/tmcl_tools.js
Modified: trunk/src/ajax/javascripts/datamodel.js ============================================================================== --- trunk/src/ajax/javascripts/datamodel.js (original) +++ trunk/src/ajax/javascripts/datamodel.js Thu Jun 25 04:38:25 2009 @@ -2314,6 +2314,36 @@ alert("From RoleC(): " + err); } }, + "selectPlayer" : function(playerPsi){ + if(this.getPlayer() === playerPsi) return; + var opts = this.__player__.__frames__[0].getFrame().select("select")[0].select("option"); + for(var i = 0; i !== opts.length; ++i){ + if(opts[i].value !== playerPsi) opts[i].removeAttribute("selected"); + else { + opts[i].writeAttribute({"selected" : "selected"}); + this.__player__.__frames__[0].getFrame().select("select")[0].insert({"top" : opts[i]}); + } + } + }, + "selectType" : function(typePsi){ + if(this.getType() === typePsi) return; + var opts = this.__type__.__frames__[0].getFrame().select("select")[0].select("option"); + for(var i = 0; i !== opts.length; ++i){ + if(opts[i].value !== typePsi) opts[i].removeAttribute("selected"); + else { + opts[i].writeAttribute({"selected" : "selected"}); + this.__type__.__frames__[0].getFrame().select("select")[0].insert({"top" : opts[i]}); + } + } + }, + "getAllPlayers" : function(){ + if(!this.__rolePlayers__ || this.__rolePlayers__.length === 0) return new Array(); + return this.__rolePlayers__.clone(); + }, + "getAllTypes" : function(){ + if(!this.__roleTypes__ || this.__roleTypes__.length === 0) return new Array(); + return this.__roleTypes__; + }, "setAddHandler" : function(handler){ if(!handler) return; this.__addButton__.stopObserving(); @@ -2452,17 +2482,250 @@ this.__parentElem__ = parent;
try{ - if((!contents || contents.length === 0) && associationRoleConstraints){ - this.resetValues(associationRoleConstraints, rolePlayerConstraints, otherRoleConstraints); - } - else { - // TODO: check already existing contents and order them to the corresponding fields - } - } + this.resetValues(associationRoleConstraints, rolePlayerConstraints, otherRoleConstraints, contents); + this.__createFromContent__(contents); + } catch(err){ alert("From RoleContainerC(): " + err); } }, + "__orderContentsToRoles__" : function(contents, roleContainer, usedContents, alreadyUsedRoles){ + for(var i = 0; i !== contents.length; ++i){ + var rType = contents[i].type; + var player = contents[i].topicRef; + + // --- searches existing roles in the role-container + for(var j = 0; j !== roleContainer.length; ++j){ + var role = roleContainer[j]; + if(alreadyUsedRoles.indexOf(role) !== -1) continue; + + var typesOfRole = role.getAllTypes().flatten(); + var playersOfRole = role.getAllPlayers().flatten(); + var iter = 0; + for( ; iter !== rType.length; ++iter){ + if(typesOfRole.indexOf(rType[iter]) !== -1) break; + } + if(iter === rType.length) continue; + for(iter = 0; iter !== player.length; ++iter){ + if(playersOfRole.indexOf(player[iter]) !== -1) break; + } + if(iter === player.length) continue; + + alreadyUsedRoles.push(role); + usedContents.push(contents[i]); + + // --- inserts the deselected player of all other roles of this type + var oldPlayer = new Array(role.getPlayer()); + var _tmp = role.getAllPlayers(); + for(var i = 0; i !== _tmp.length; ++i){ + if(_tmp[i].indexOf(oldPlayer[0]) !== -1){ + oldPlayer = _tmp[i]; + break; + } + } + + for(var k = 0; k !== roleContainer.length; ++k){ + if(roleContainer[k] === role) continue; + roleContainer[k].addPlayer(oldPlayer); + } + + // --- removes the current player from all other roles with this type + for(var k = 0; k !== roleContainer.length; ++k){ + if(roleContainer[k] === role) continue; + roleContainer[k].removePlayer(player); + } + + // --- selects the currentPlayer/type + role.selectPlayer(player[0]); + + // --- selects the current roletype + role.selectType(rType[0]); + break; + } + } + // --- removes all used contents from contents + for(var i = 0; i !== usedContents.length; ++i) contents = contents.without(usedContents[i]); + + return {"usedContents" : usedContents, "contents" : contents, "alreadyUsedRoles" : alreadyUsedRoles}; + }, + "__createAdditionalRolesFromContents__" : function(contents,usedContents, alreadyUsedRoles, isARC){ + var roleContainer = this.__orContainer__.__frames__; + if(isARC === true) roleContainer = this.__arContainer__.__frames__; + + if(roleContainer && roleContainer.length !== 0){ + for(var i = 0; i !== contents.length; ++i){ + var rType = contents[i].type; + var player = contents[i].topicRef; + + // --- gets all existing roles corresponding to the current content + var existingRoles = new Array(); + for(var j = 0; j !== roleContainer.length; ++j){ + var iTypes = roleContainer[j].getAllTypes().flatten(); + var iPlayers = roleContainer[j].getAllPlayers().flatten(); + var iter = 0; + for( ; iter !== rType.length; ++iter) if(iTypes.indexOf(rType[iter]) !== -1) break; + if(iter === rType.length) continue; + for(iter = 0; iter !== player.length; ++iter) if(iPlayers.indexOf(player[iter]) !== -1) break; + if(iter === player.length) continue; + + existingRoles.push(roleContainer[j]); + } + + // --- collects the selected players + if(existingRoles && existingRoles.length > 0){ + var selectedPlayers = new Array(); + for(var j = 0; j !== existingRoles.length; ++j){ + var _tmp = existingRoles[j].getAllPlayers(); + for(var k = 0; k !== _tmp.length; ++k){ + if(_tmp[k].indexOf(existingRoles[j].getPlayer()) !== -1){ + selectedPlayers.push(_tmp[k]); + break; + } + } + } + selectedPlayers = selectedPlayers.flatten(); + var allPlayers = existingRoles[0].getAllPlayers(); + var playersToRemove = new Array(); + for(var j = 0; j !== allPlayers.length; ++j){ + for(var k = 0; k !== selectedPlayers.length; ++k){ + if(allPlayers[j].indexOf(selectedPlayers[k]) !== -1){ + playersToRemove.push(allPlayers[j]); + break; + } + } + } + for(var j = 0; j !== playersToRemove.length; ++j) allPlayers = allPlayers.without(playersToRemove[j]); + var newTypes = existingRoles[0].getAllTypes(); + var min = 0; + var arc = null; + var orc = null; + if(isARC === true){ + for(var j = 0; this.__associationRoleConstraints__ && j !== this.__associationRoleConstraints__.length; ++j){ + if(arc) break; + var arcTypes = this.__associationRoleConstraints__[j].roleType; + if(arcTypes) arcTypes = arcTypes.flatten(); + var nTs = newTypes.flatten(); + for(var k = 0; k !== nTs.length; ++k){ + if(arcTypes.indexOf(nTs[k]) !== -1){ + arc = this.__associationRoleConstraints__[j]; + min = parseInt(arc.cardMin); + break; + } + } + } + } + else { + for(var j = 0; this.__otherRoleConstraints__ && j !== this.__otherRoleConstraints__.length; ++j){ + if(orc) break; + var oPlayers = this.__otherRoleConstraints__[j].otherPlayers; + if(oPlayers) oPlayers = oPlayers.flatten(); + var oTypes = this.__otherRoleConstraints__[j].otherRoleType; + if(oTypes) oTypes = oTypes.flatten(); + + for(var k = 0; k !== rType.length; ++k){ + if(orc) break; + if(oTypes.indexOf(rType[k]) !== -1){ + for(var l = 0; l !== player.length; ++l){ + if(oPlayers.indexOf(player[l]) !== -1){ + orc = this.__otherRoleConstraints__[j]; + min = parseInt(orc.cardMin); + break; + } + } + } + } + } + } + var role = null; + if(isARC === true) role = new RoleC(null, newTypes, allPlayers, this.__arContainer__, min, this.__parentElem__); + else role = new RoleC(null, newTypes, allPlayers, this.__orContainer__, min, this.__parentElem__); + for(var j = 0; j !== roleContainer.length; ++j){ + if(roleContainer[j] !== role) roleContainer[j].removePlayer(player); + } + role.selectPlayer(player[0]); + role.selectType(rType[0]); + + if(isARC === true){ + var rpcs = getRolePlayerConstraintsForRole(newTypes, this.__rolePlayerConstraints__); + var allAvailablePlayers = extractPlayersOfConstraints(rpcs); + var allRolesToCheck = existingRoles; + allRolesToCheck.push(role); + this.__checkARCButtons__(allRolesToCheck, allAvailablePlayers, arc); + this.__setARCAddHandler__(role, allAvailablePlayers, arc); + this.__setARCRemoveHandler__(role, arc); + this.__setRoleChangePlayerHandler__(role, this.__arContainer__.__frames__, rpcs, null); + } + else { + var orpcs = new Array(); + var ac = this.__arContainer__.__frames__; + for(var j = 0; ac && j !== ac.length; ++j){ + var fType = new Array(ac[j].getType()); + var fPlayer = new Array(ac[j].getPlayer()); + orpcs = orpcs.concat(getOtherRoleConstraintsForRole(fType, fPlayer, this.__otherRoleConstraints__)); + } + var _orpcs = new Array(); + for(var j = 0; j !== orpcs.length; ++j){ + var players = orpcs[j].otherPlayers; + if(players) players = players.flatten(); + var types = orpcs[j].otherRoleType; + if(types) types = types.flatten(); + if(!types || !players) continue; + for(var k = 0; k !== rType.length; ++k){ + if(types.indexOf(rType[k]) !== -1){ + for(var l = 0; l !== player.length; ++l){ + if(players.indexOf(player[l]) !== -1) _orpcs.push(orpcs[j]); + } + } + } + } + + orpcs = _orpcs.uniq(); + this.__checkORCButtons__(role, orc); + this.__setRoleChangePlayerHandler__(role, this.__orContainer__.__frames__, null, orpcs); + this.__setORCAddHandler__(role, orc, orpcs); + this.__setORCRemoveHandler__(role, orc, orpcs); + } + + var lastRole = roleContainer[roleContainer.length -2]; + lastRole.getFrame().insert({"after" : role.getFrame()}); + } + } + } + return {"usedContents" : usedContents, "contents" : contents, "alreadyUsedRoles" : alreadyUsedRoles}; + }, + "__createFromContent__" : function(contents){ + if(!contents || contents.lenght === 0) return; + + var cContents = contents; + var usedContents = new Array(); + var alreadyUsedRoles = new Array(); + + // --- searches for associaitonrole-constraints and roleplayer-constraints + var ret = this.__orderContentsToRoles__(cContents, this.__arContainer__.__frames__, usedContents, alreadyUsedRoles); + cContents = ret.contents; + usedContents = ret.usedContents; + alreadyUsedRoles = ret.alreadyUsedRoles; + + // --- searches for otherrole-constraints + ret = this.__orderContentsToRoles__(cContents, this.__orContainer__.__frames__, usedContents, alreadyUsedRoles); + cContents = ret.contents; + usedContents = ret.usedContents; + alreadyUsedRoles = ret.alreadyUsedRoles; + + // --- creates additional roles (associationrole-constraints) + ret = this.__createAdditionalRolesFromContents__(cContents, usedContents, alreadyUsedRoles, true); + cContents = ret.contents; + usedContents = ret.usedContents; + alreadyUsedRoles = ret.alreadyUsedRoles; + + // --- creates additional roles (associationrole-constraints) + ret = this.__createAdditionalRolesFromContents__(cContents, usedContents, alreadyUsedRoles, false); + cContents = ret.contents; + usedContents = ret.usedContents; + alreadyUsedRoles = ret.alreadyUsedRoles; + + // TODO: create roles that does not belong to any constraint + }, "resetValues" : function(associationRoleConstraints, rolePlayerConstraints, otherRoleConstraints){ this.__associationRoleConstraints__ = associationRoleConstraints; this.__rolePlayerConstraints__ = rolePlayerConstraints; @@ -2488,7 +2751,6 @@ }
// --- creates all roles from existing associationroleconstraints and roleplayerConstraints - // TODO: insert existing contents to the corresponding constraints for(var i = 0; this.__associationRoleConstraints__ && i !== this.__associationRoleConstraints__.length; ++i){ var arc = this.__associationRoleConstraints__[i]; var foundRpcs = getRolePlayerConstraintsForRole(arc.roleType, this.__rolePlayerConstraints__); @@ -2502,7 +2764,7 @@ "__makeRolesFromARC__" : function(associationRoleConstraint, rolePlayerConstraints){ if(!associationRoleConstraint || !rolePlayerConstraints || rolePlayerConstraints.length === 0) return; checkCardinalitiesARC_RPC(associationRoleConstraint, rolePlayerConstraints); - + // --- creates all roles with all needed players var currentRoles = new Array(); var rolesCreated = 0; @@ -2631,11 +2893,11 @@ }
// --- remove button - if(cardMin > existingRoles.length){ - for(var i = 0; i !== existingRoles.length; ++i) existingRoles[i].showRemoveButton(); + if(cardMin >= existingRoles.length){ + for(var i = 0; i !== existingRoles.length; ++i) existingRoles[i].hideRemoveButton(); } else { - for(var i = 0; i !== existingRoles.length; ++i) existingRoles[i].hideRemoveButton(); + for(var i = 0; i !== existingRoles.length; ++i) existingRoles[i].showRemoveButton(); } }, "__checkARCButtons__" : function(rolesToCheck, players, associationRoleConstraint){ @@ -3143,8 +3405,7 @@ scopesContent = contents.scopes; rolesContent = contents.roles; } - - + // --- control row + ItemIdentity makeControlRow(this, 4, itemIdentityContent); checkRemoveAddButtons(owner, 1, -1);
Modified: trunk/src/ajax/javascripts/tmcl_tools.js ============================================================================== --- trunk/src/ajax/javascripts/tmcl_tools.js (original) +++ trunk/src/ajax/javascripts/tmcl_tools.js Thu Jun 25 04:38:25 2009 @@ -82,7 +82,7 @@ } } } - return foundConstraints; + return foundConstraints.uniq(); }