isidorus-cvs
Threads by month
- ----- 2025 -----
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
June 2009
- 1 participants
- 50 discussions
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();
}
1
0
Author: lgiessmann
Date: Wed Jun 24 03:35:51 2009
New Revision: 61
Log:
ajax-client: fixed a bug with scope-topics that occurs during the scope-selection with scope-topics that owns more than one psi
Modified:
trunk/src/ajax/javascripts/datamodel.js
Modified: trunk/src/ajax/javascripts/datamodel.js
==============================================================================
--- trunk/src/ajax/javascripts/datamodel.js (original)
+++ trunk/src/ajax/javascripts/datamodel.js Wed Jun 24 03:35:51 2009
@@ -653,9 +653,9 @@
for(var j = 0; j != values.length; ++j){
if(values[j].indexOf(selectedItems[i]) !== -1){
for(var k = 0; k != values[j].length; ++k){
- select.insert({"bottom" : new Element("option", {"value" : values[j][k]}).update(values[j][k])});
- if(values[j][k] === selectedItems[i])select.writeAttribute({"selected" : "selected"});
- //values = values.without(values[j]);
+ var opt = new Element("option", {"value" : values[j][k]}).update(values[j][k]);
+ select.insert({"bottom" : opt});
+ if(values[j][k] === selectedItems[i]) opt.writeAttribute({"selected" : "selected"});
selectedIdx.push(j);
}
break;
@@ -931,6 +931,7 @@
this.__container__ = new Array();
this.resetValues(contents, constraints);
this.__constraints__ = constraints;
+
},
"resetValues" : function(contents, constraints){
try{
1
0
Author: lgiessmann
Date: Tue Jun 23 15:37:47 2009
New Revision: 60
Log:
ajax-client: fixed a lot of bugs in scope/type-handling; now also scopes will be validated and if there exist some scopes in the requested fragment these scopes will be used as default; currently it is possible to use one scope twice - if there are more scope-constraints with an intersection of scope-topics - this should be fixed anytime
Modified:
trunk/src/ajax/javascripts/datamodel.js
Modified: trunk/src/ajax/javascripts/datamodel.js
==============================================================================
--- trunk/src/ajax/javascripts/datamodel.js (original)
+++ trunk/src/ajax/javascripts/datamodel.js Tue Jun 23 15:37:47 2009
@@ -930,6 +930,7 @@
this.__frame__.writeAttribute({"class" : CLASSES.scopeContainer()});
this.__container__ = new Array();
this.resetValues(contents, constraints);
+ this.__constraints__ = constraints;
},
"resetValues" : function(contents, constraints){
try{
@@ -942,6 +943,8 @@
this.__container__ = new Array();
}
+ this.__constraints__ = constraints;
+
// --- sets contents corresponding to the passed constraints
if(constraints && constraints.length){
var cContents = contents ? contents.clone() : null;
@@ -1010,10 +1013,81 @@
return false;
},
"isValid" : function(){
- for(var i = 0; i != this.__container__.length; ++i){
- if(this.__container__[i].isUsed() === true) return true;
+ var errorStr = "";
+ var ret = true;
+ var allContent = this.getContent();
+ if(!allContent) allContent = new Array();
+ var allFoundContent = new Array();
+ if(allContent) allContent = allContent.flatten();
+ if((!this.__constraints__ || this.__constraints__length === 0) && allContent.length !== 0){
+ this.showError("No constraints found for the existing scopes!");
+ return false;
}
- return false;
+ for(var i = 0; this.__constraints__ && i !== this.__constraints__.length; ++i){
+ var min = parseInt(this.__constraints__[i].cardMin);
+ var max = this.__constraints__[i].cardMax === MAX_INT ? MMAX_INT : parseInt(this.__constraints__[i].cardMax);
+ var scopes = this.__constraints__[i].scopeTypes;
+ if(scopes) scopes = scopes.flatten();
+ else scopes = new Array();
+
+ // --- checks all available types for the current constraint
+ var currentFoundContent = new Array();
+ for(var j = 0; j !== allContent.length; ++j){
+ if(scopes.indexOf(allContent[j]) !== -1){
+ currentFoundContent.push(allContent[j]);
+ allFoundContent.push(allContent[j]);
+ }
+ }
+ currentFoundContent = currentFoundContent.uniq();
+ allFoundContent = allFoundContent.uniq();
+
+ // --- find topics for the found psis
+ var foundScopes = 0;
+ var _scopes = this.__constraints__[i].scopeTypes;
+ for(var j = 0; _scopes && j !== _scopes.length; ++j){
+ for(var k = 0; k !== _scopes[j].length; ++k){
+ for(var l = 0; l !== currentFoundContent.length; ++l){
+ if(_scopes[j][k].indexOf(currentFoundContent[l]) !== -1){
+ ++foundScopes;
+ break;
+ }
+ }
+ }
+ }
+ // --- checks card-min/card-max
+ var scStr = "";
+ for(var j = 0; j !== scopes.length; ++j){
+ if(scopes[j].length !== 0) scStr += "<br/> *" + scopes[j];
+ }
+
+ if(min > foundScopes){
+ if(errorStr.length !== 0) errorStr += "<br/><br/>";
+ errorStr += "card-min(" + min + ") of the scope-constraint with the available scopes" + scStr + "<br/>is not satisfied(" + foundScopes + ")!"
+ ret = false;
+ }
+ if(max !== MMAX_INT && max < foundScopes){
+ if(errorStr.length !== 0) errorStr += "<br/><br/>";
+ errorStr += "card-max(" + max + ") of the scope-constraint with the available scopes" + scStr + "<br/>is not satisfied(" + foundScopes + ")!"
+ ret = false;
+ }
+ }
+
+ // --- removes all checked contents
+ for(var i = 0; i !== allFoundContent.length; ++i) allContent = allContent.without(allFoundContent[i]);
+ if(allContent && allContent.length !== 0){
+ allContent = allContent.flatten();
+ scStr = "";
+ for(var j = 0; j !== allContent.length; ++j){
+ if(allContent[j].length !== 0) scStr += "<br/> *" + allContent[j];
+ }
+ if(errorStr.length !== 0) errorStr += "<br/><br/>";
+ errorStr += "No constraint found for the scopes \"" + scStr + "\"!";
+ ret = false;
+ }
+
+ if(ret === true) this.hideError();
+ else if(errorStr.length !== 0)this.showError(errorStr);
+ return ret;
},
"getContent" : function(){
var values = new Array();
@@ -1022,16 +1096,19 @@
var cValues = this.__container__[i].getContent(true, true);
for(var j = 0; j != cValues.length; ++j){
if(values.indexOf(cValues[j]) !== -1) continue;
- values.push(cValues[j]);
+ values.push(cValues[j][0]);
}
}
}catch(err){
return new Array();
}
+ if(values.length === 0) return null;
+ values = values.uniq();
+ for(var i = 0; i !== values.length; ++i) values[i] = new Array(values[i]);
return values;
},
"toJSON" : function(){
- if(this.getContent().length === 0) return "null";
+ if(!this.getContent() || this.getContent().length === 0) return "null";
return this.getContent().toJSON();
},
"disable" : function(){
@@ -1356,7 +1433,11 @@
if(valueValid === false) this.showError("The name-value \"" + this.__value__.__frames__[0].getContent() + "\" doesn't matches the constraint \"" + this.__value__.__frames__[0].getRegexp() + "\"!");
else this.hideError();
var variantsValid = this.__variants__.isValid();
- return valueValid && variantsValid;
+ var scopeValid = this.scopeIsValid();
+ return valueValid && variantsValid && scopeValid;
+ },
+ "scopeIsValid" : function(){
+ return this.__scope__.isValid();
},
"minimize" : function(){
var trs = this.__table__.select("tr");
@@ -1537,6 +1618,7 @@
for(var j = 0; j !== this.__containers__[i].length; ++j){
for(var k = 0; k !== this.__containers__[i][j].__frames__.length; ++k){
this.__containers__[i][j].__frames__[k].hideError();
+ if(this.__containers__[i][j].__frames__[k].scopeIsValid() === false) ret = false;
if(this.__containers__[i][j].__frames__[k].isUsed() === true && this.__containers__[i][j].__frames__[k].isEmpty() === false){
allNames.push(this.__containers__[i][j].__frames__[k]);
}
@@ -1730,7 +1812,11 @@
var regexp = new RegExp(this.__constraint__.regexp);
// TODO: validate the data via the given datatype
// TODO: validate the uniqeuoccurrence-constraint
- return regexp.match(this.__value__.value);
+ var scopeValid = this.scopeIsValid();
+ return regexp.match(this.__value__.value) && scopeValid;
+ },
+ "scopeIsValid" : function(){
+ return this.__scope__.isValid();
},
"minimize" : function(){
var trs = this.__table__.select("tr");
@@ -1887,6 +1973,7 @@
allOccurrences.push(this.__containers__[i][j].__frames__[k]);
}
this.__containers__[i][j].__frames__[k].hideError();
+ if(this.__containers__[i][j].__frames__[k].scopeIsValid() === false) ret = false;
}
}
}
@@ -2892,6 +2979,9 @@
}
this.__disable__ = false;
},
+ "scopeIsValid" : function(){
+ return this.__scope__.isValid();
+ },
"isValid" : function(){
var ret = true;
var errorStr = "";
@@ -3018,10 +3108,10 @@
}
}
-
+ var scopeValid = this.scopeIsValid();
if(ret === false) this.showError(errorStr);
else this.hideError();
- return ret;
+ return ret && scopeIsValid;
}});
1
0
Author: lgiessmann
Date: Tue Jun 23 10:24:07 2009
New Revision: 59
Log:
ajax-client: added a onchange-handler for scope-frames
Modified:
trunk/src/ajax/javascripts/datamodel.js
Modified: trunk/src/ajax/javascripts/datamodel.js
==============================================================================
--- trunk/src/ajax/javascripts/datamodel.js (original)
+++ trunk/src/ajax/javascripts/datamodel.js Tue Jun 23 10:24:07 2009
@@ -728,8 +728,77 @@
}
function changeHandler(event){
- alert("changed!");
- }
+ try{
+ var eventOwner = event.element();
+ var newValue = eventOwner.value;
+ var oldValue = null;
+ var allValues = new Array();
+ var allOpts = myself.getFrame().select("option");
+ var allOwnOpts = eventOwner.select("option");
+ for(var i = 0; i !== allOwnOpts.length; ++i) allOpts = allOpts.without(allOwnOpts[i]);
+
+ // --- collects all selected values
+ for(var i = 0; i !== allOpts.length; ++i) allValues.push(allOpts[i].value);
+ allValues = allValues.uniq();
+ var foundContent = new Array();
+ for(var i = 0; i !== allValues.length; ++i){
+ for(var j = 0; contents && j !== contents.length; ++j){
+ for(var k = 0; k !== contents[j].length; ++k){
+ if(contents[j][k].indexOf(allValues[i]) !== -1) foundContent.push(contents[j]);
+ if(contents[j][k].indexOf(newValue) !== -1) foundContent.push(contents[j]);
+ }
+ }
+ }
+ foundContent = foundContent.uniq();
+ // --- searches for the content to be removed from all other select elements
+ // --- and for the values to be inserted to all other elements
+ var contentToAdd = null;
+ var contentToRemove = null;
+ if(contents && contents.length !== 0){
+ for(var i = 0; i !== contents.length; ++i){
+ if(foundContent.indexOf(contents[i]) === -1) contentToAdd = contents[i];
+ if(!contentToRemove){
+ for(var j = 0; j !== contents[i].length; ++j){
+ if(contentToRemove) break;
+ for(var k = 0; k !== contents[i][j].length; ++k){
+ if(contents[i][j][k].indexOf(newValue) !== -1){
+ contentToRemove = contents[i];
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // --- iterates through all select elements and adds/removes the found values
+ var selects = myself.getFrame().select("select");
+ selects = selects.without(eventOwner);
+ if(contentToAdd) contentToAdd = contentToAdd.flatten();
+ if(contentToRemove) contentToRemove = contentToRemove.flatten();
+ for(var i = 0; i !== selects.length; ++i){
+ var opts = selects[i].select("option");
+ var val = selects[i].value;
+ for(var j = 0; j !== opts.length; ++j){
+ if(contentToRemove.indexOf(opts[j].value) !== -1) opts[j].remove();
+ }
+
+ if(contentToAdd){
+ var selectOpts = new Array();
+ for(var j = 0; j !== opts.length; ++j) selectOpts.push(opts[j].value);
+ var iter = 0;
+ for( ; iter !== contentToAdd.length; ++iter){
+ if(selectOpts.indexOf(contentToAdd[iter]) !== -1) break;
+ }
+ if(iter === contentToAdd.length){
+ for(var j = 0; j !== contentToAdd.length; ++j){
+ selects[i].insert({"bottom" : new Element("option", {"value" : contentToAdd[j]}).update(contentToAdd[j])});
+ }
+ }
+ }
+ }
+ }catch(err){ alert("ch: " + err);}
+ } // changeHandler
for(var i = 0; i != rows.length; ++i){
var selectE = rows[i].select("select");
1
0
Author: lgiessmann
Date: Tue Jun 23 09:19:45 2009
New Revision: 58
Log:
ajax-client: existing scopes can be inserted into existing constraint-frames
Modified:
trunk/src/ajax/javascripts/datamodel.js
Modified: trunk/src/ajax/javascripts/datamodel.js
==============================================================================
--- trunk/src/ajax/javascripts/datamodel.js (original)
+++ trunk/src/ajax/javascripts/datamodel.js Tue Jun 23 09:19:45 2009
@@ -586,16 +586,16 @@
// --- Represantation of a scope frame, doesn't contain SelectrowCs, because the values must be unique!
// --- So this class uses another implementation.
-var ScopeC = Class.create(ContainerC, {"initialize" : function($super, contents, min, max){
+var ScopeC = Class.create(ContainerC, {"initialize" : function($super, contents, selectedContents, min, max){
$super();
this.__frame__.writeAttribute({"class" : CLASSES.scopeFrame()});
this.__error__ = this.__error__.remove();
this.__container__ = null;
this.__contents__ = contents;
- this.resetRows(this.__contents__, min, max);
+ this.resetRows(this.__contents__, min, max, selectedContents);
},
- "resetRows" : function(contents, min, max){
+ "resetRows" : function(contents, min, max, selectedContents){
try{
for(var i = 0; i != this.__container__.__frames__.length; ++i){
this.__container__.__frames__[i].remove();
@@ -637,6 +637,7 @@
function checkValues(myself){
var rows = myself.getFrame().select("div");
var selectedItems = new Array();
+
// --- collects all old selected values and removes the elements
for(var i = 0; i != rows.length; ++i){
var selects = rows[i].select("select");
@@ -664,11 +665,11 @@
for(var k = 0; k != values.length; ++k){
if(selectedIdx.indexOf(k) === -1){
cleanedValues.push(values[k]);
- }
+ }
}
values = cleanedValues;
}
-
+
// --- if there is an empty value "" (if cardMin == 0), this value should be the last
// --- in the array (only when there is another value selected)
for(var h = 0; h != rows.length; ++h){
@@ -726,7 +727,12 @@
addHandlers(myself);
}
+ function changeHandler(event){
+ alert("changed!");
+ }
+
for(var i = 0; i != rows.length; ++i){
+ var selectE = rows[i].select("select");
var spans = rows[i].select("span." + CLASSES.clickable());
var removeS = null;
var addS = null;
@@ -762,21 +768,42 @@
rows[i].writeAttribute({"class" : CLASSES.selectrowWithoutRemoveButton()});
removeS.hide();
}
+ if(selectE.length !== 0){
+ selectE[0].stopObserving("change");
+ selectE[0].observe("change", changeHandler);
+ }
}
} // addHandlers
- for(var i = 0; i != (min === -1 ? 1 : min); ++i){
- var div = new Element("div", {"class" : CLASSES.selectrowWithoutRemoveButton()});
- var select = new Element("select");
- for(var j = 0; j != options.length; ++j){
- if(j === i || j > min){
- for(var k = 0; k != options[j].length; ++k){
- select.insert({"bottom" : new Element("option", {"value" : options[j][k]}).update(options[j][k])});
+
+ var endIdx = (min === -1 ? 1 : min);
+ if(selectedContents && selectedContents.length > endIdx) endIdx = selectedContents.length;
+ if(endIdx > options.length) throw "From ScopeC(): not enough scope-topics(" + options.length + ") to satisfie card-min(" + min + ")!";
+ for(var i = 0; i != endIdx; ++i){
+ var currentScope = null;
+ if(selectedContents && selectedContents.length > i) currentScope = selectedContents[i];
+ var currentOptions = options.clone();
+
+ var optionsToRemove = new Array();
+ for(var j = 0; selectedContents && j !== selectedContents.length; ++j){
+ for(var k = 0; k !== selectedContents[j].length; ++k){
+ for(var l = 0; l !== currentOptions.length; ++l){
+ if(currentOptions[l].indexOf(selectedContents[j][k]) !== -1) optionsToRemove.push(currentOptions[l]);
}
}
}
-
+ optionsToRemove = optionsToRemove.uniq();
+ for(var j = 0; j !== optionsToRemove.length; ++j) currentOptions = currentOptions.without(optionsToRemove[j]);
+ if(currentScope) currentOptions.unshift(currentScope);
+ var div = new Element("div", {"class" : CLASSES.selectrowWithoutRemoveButton()});
+ var select = new Element("select");
+ for(var j = 0; j != currentOptions.length; ++j){
+ for(var k = 0; k != currentOptions[j].length; ++k){
+ select.insert({"bottom" : new Element("option", {"value" : currentOptions[j][k]}).update(currentOptions[j][k])});
+ }
+ }
+
div.insert({"top" : select});
this.getFrame().insert({"bottom" : div});
addHandlers(this);
@@ -848,19 +875,58 @@
// --- sets contents corresponding to the passed constraints
if(constraints && constraints.length){
+ var cContents = contents ? contents.clone() : null;
+ var foundContents = new Array();
for(var i = 0; i != constraints.length; ++i){
var scopeTypes = constraints[i].scopeTypes;
var min = parseInt(constraints[i].cardMin);
var max = constraints[i].cardMax !== MAX_INT ? parseInt(constraints[i].cardMax) : MMAX_INT;
- // TODO: check and adds contents to the types
-
- // --- if min === 0 && there is no content, adds an empty option
- if(min === 0){ // TODO: check contents of this type
+ // --- checks already existing scopes with the given scope-constraints
+ var currentFoundContents = new Array();
+ if(cContents && cContents.length !== 0){
+ var allCurrentTypes = scopeTypes ? scopeTypes.flatten() : new Array();
+ for(var j = 0; j !== cContents.length; ++j){
+ for(var k = 0; k !== allCurrentTypes.length; ++k){
+ if(cContents[j].indexOf(allCurrentTypes[k]) !== -1){
+ foundContents.push(cContents[j]);
+ currentFoundContents.push(cContents[j]);
+ break;
+ }
+ }
+ }
+ foundContents = foundContents.uniq();
+ }
+
+ // --- if min === 0 adds an empty option
+ if(min === 0){
scopeTypes.unshift(new Array(new Array(""))); // [[""]]
}
- this.__container__.push(new ScopeC(scopeTypes, min === 0 ? 1 : min, max === MMAX_INT ? -1 : max));
- this.__error__.insert({"before" : this.__container__[this.__container__.length - 1].getFrame()});
+
+ var scp = new ScopeC(scopeTypes, currentFoundContents, min === 0 ? 1 : min, max === MMAX_INT ? -1 : max);
+ this.__container__.push(scp);
+ this.__error__.insert({"before" : scp.getFrame()});
+ }
+
+ // --- removes contents that are already used
+ if(cContents && cContents.length !== 0){
+ for(var i = 0; i !== foundContents.length; ++i) cContents = cContents.without(foundContents[i]);
+
+ // --- inserts all contents that doesn't correspond with any constraint
+ for(var i = 0; i !== cContents.length; ++i) cContents[i] = new Array(cContents[i]);
+ var cmax = cContents.length;
+ for(var i = 0; i !== cContents.length; ++i){
+ var scp = new ScopeC(new Array(cContents[i]), null, 1, 1);
+ this.__container__.push(scp);
+ this.__error__.insert({"before" : scp.getFrame()});
+ }
+ }
+ }
+ else if(contents && contents.length){
+ for(var i = 0; i !== contents.length; ++i){
+ var scp = new ScopeC(new Array(new Array(contents[i])), null, 1, 1);
+ this.__container__.push(scp);
+ this.__error__.insert({"before" : scp.getFrame()});
}
}
else {
@@ -1504,7 +1570,24 @@
var types = makeTypes(this, typeContent, occurrenceTypes);
// --- scopes
- this.__scope__ = new ScopeContainerC(scopesContent, occurrenceTypes && occurrenceTypes[0].scopeConstraints ? occurrenceTypes[0].scopeConstraints : null);
+ var scopes = null;
+ if(contents){
+ if(typeContent){
+ for(var i = 0; occurrenceTypes && i !== occurrenceTypes.length; ++i){
+ if(scopes) break;
+ for(var j = 0; j !== occurrenceTypes[i].occurrenceType.length; ++j){
+ if(typeContent.indexOf(occurrenceTypes[i].occurrenceType[j]) !== -1){
+ scopes = occurrenceTypes[i].scopeConstraints;
+ break;
+ }
+ }
+ }
+ }
+ }
+ else if(occurrenceTypes && occurrenceTypes[0].scopeConstraints){
+ scopes = occurrenceTypes[0].scopeConstraints;
+ }
+ this.__scope__ = new ScopeContainerC(scopesContent, scopes);
this.__table__.insert({"bottom" : newRow(CLASSES.scopeContainer(), "Scope", this.__scope__.getFrame())});
onTypeChangeScope(this, contents && contents.scopes ? contents.scopes : null, occurrenceTypes, "occurrence");
@@ -1663,7 +1746,7 @@
break;
}
}
- var endIdx = min;
+ var endIdx = (min === 0 ? 1 : min);
endIdx = _contents && _contents.length > endIdx ? _contents.length : endIdx;
var regexp = constraints[i].constraints[j].regexp;
if(max !== 0 || (_contents && contents.length)){
1
0
Author: lgiessmann
Date: Tue Jun 23 04:31:45 2009
New Revision: 57
Log:
fixed a bug with itemIdentities and variants
Modified:
trunk/src/ajax/javascripts/datamodel.js
Modified: trunk/src/ajax/javascripts/datamodel.js
==============================================================================
--- trunk/src/ajax/javascripts/datamodel.js (original)
+++ trunk/src/ajax/javascripts/datamodel.js Tue Jun 23 04:31:45 2009
@@ -3273,7 +3273,7 @@
// --- creates a control row for NameC, OccurrenceC and VariantC with a nested ItemIdentity frame.
-function makeControlRow(myself, rowspan, contents)
+function makeControlRow(myself, rowspan, itemIdentities)
{
var tr = new Element("tr", {"class" : CLASSES.itemIdentityFrame()});
var tdCtrl = new Element("td", {"class" : CLASSES.controlColumn(), "rowspan" : rowspan});
@@ -3291,7 +3291,7 @@
tdCtrl.insert({"bottom" : myself.__add__});
var tdCont = new Element("td", {"class" : CLASSES.content()});
tr.insert({"bottom" : tdCont});
- myself.__itemIdentity__ = new ItemIdentityC(contents ? contents.itemIdentities : null, myself);
+ myself.__itemIdentity__ = new ItemIdentityC(itemIdentities, myself);
tdCont.insert({"top" : myself.__itemIdentity__.getFrame()});
myself.__table__.insert({"bottom" : tr});
1
0
Author: lgiessmann
Date: Tue Jun 23 04:06:39 2009
New Revision: 56
Log:
ajax-client: fixed a bug which occurs if the exported fragment has no name- occurrence- or associationtype
Modified:
trunk/src/ajax/javascripts/datamodel.js
Modified: trunk/src/ajax/javascripts/datamodel.js
==============================================================================
--- trunk/src/ajax/javascripts/datamodel.js (original)
+++ trunk/src/ajax/javascripts/datamodel.js Tue Jun 23 04:06:39 2009
@@ -1144,24 +1144,10 @@
setRemoveAddHandler(this, owner, min, max, function(){
return new NameC(null, nametypescopes, simpleConstraint, owner, min, max, dblClickHandler);
});
+
// --- type
- var types = new Array();
- for(var i = 0; nametypescopes && i !== nametypescopes.length; ++i){
- for(var j = 0; j != nametypescopes[i].nameType.length; ++j){
- types.push(nametypescopes[i].nameType[j]);
- if(typeContent && typeContent[0] === nametypescopes[i].nameType[j]){
- var selected = nametypescopes[i].nameType[j];
- types[types.length - 1] = types[0];
- types[0] = selected;
- }
- }
- }
- if(types.length === 0 && contents && contents.length !== 0) types = contents.type;
- if(types.length === 0) throw "From NameC(): There must be given a nametype or any nametype-constraint!";
- this.__type__ = new Object();
-
- var tr = newRow(CLASSES.typeFrame(), "Type", new SelectrowC(types, this.__type__, 1, 1).getFrame());
- this.__table__.insert({"bottom" : tr});
+ var types = makeTypes(this, typeContent, nametypescopes);
+
// --- scopes
this.__scope__ = new ScopeContainerC(scopesContent, nametypescopes && nametypescopes[0].scopeConstraints ? nametypescopes[0].scopeConstraints : null);
this.__table__.insert({"bottom" : newRow(CLASSES.scopeContainer(), "Scope", this.__scope__.getFrame())});
@@ -1515,23 +1501,8 @@
});
// --- type
- var types = new Array();
- for(var i = 0; occurrenceTypes && i !== occurrenceTypes.length; ++i){
- for(var j = 0; j != occurrenceTypes[i].occurrenceType.length; ++j){
- types.push(occurrenceTypes[i].occurrenceType[j]);
- if(typeContent && typeContent[0] === occurrenceTypes[i].occurrenceType[j]){
- var selected = occurrenceTypes[i].occurrenceType[j];
- types[types.length - 1] = types[0];
- types[0] = selected;
- }
- }
- }
- if(types.length === 0 && contents && contents.length !== 0) types = contents.type;
- if(types.length === 0) throw "From OccurrenceC(): There must be given an occurrencetype or any occurrencetype-constraint!";
- this.__type__ = new Object();
- var tr = newRow(CLASSES.typeFrame(), "Type", new SelectrowC(types, this.__type__, 1, 1).getFrame());
- this.__table__.insert({"bottom" : tr});
-
+ var types = makeTypes(this, typeContent, occurrenceTypes);
+
// --- scopes
this.__scope__ = new ScopeContainerC(scopesContent, occurrenceTypes && occurrenceTypes[0].scopeConstraints ? occurrenceTypes[0].scopeConstraints : null);
this.__table__.insert({"bottom" : newRow(CLASSES.scopeContainer(), "Scope", this.__scope__.getFrame())});
@@ -2939,20 +2910,7 @@
});
// --- type
- var types = new Array();
- for(var i = 0; constraints && i !== constraints.length; ++i){
- for(var j = 0; j != constraints[i].associationType.length; ++j){
- types.push(constraints[i].associationType[j]);
- if(typeContent && typeContent[0] === constraints[i].associationType[j]){
- var selected = constraints[i].associationType[j];
- types[types.length - 1] = types[0];
- types[0] = selected;
- }
- }
- }
- this.__type__ = new Object();
- var tr = newRow(CLASSES.typeFrame(), "Type", new SelectrowC(types, this.__type__, 1, 1).getFrame());
- this.__table__.insert({"bottom" : tr});
+ var types = makeTypes(this, typeContent, constraints);
// --- scopes
this.__scope__ = new ScopeContainerC(scopesContent, this.__constraints__ && this.__constraints__[0].scopeConstraints ? this.__constraints__[0].scopeConstraints : null);
@@ -3575,3 +3533,29 @@
return {"constraintsAndContents" : constraintsAndContents, "contents" : contents};
}
+
+
+// --- creates a type frames for a name- or an occurrence- frame.
+function makeTypes(myself, typeContent, xtypescopes)
+{
+ var types = new Array();
+ for(var i = 0; xtypescopes && i !== xtypescopes.length; ++i){
+ var xtype = xtypescopes[i].nameType;
+ if(!xtype) xtype = xtypescopes[i].occurrenceType;
+ if(!xtype) xtype = xtypescopes[i].associationType;
+ for(var j = 0; xtype && j != xtype.length; ++j){
+ types.push(xtype[j]);
+ if(typeContent && typeContent[0] === xtype[j]){
+ var selected = xtype[j];
+ if(types.length !== 0) types[types.length - 1] = types[0];
+ types[0] = selected;
+ }
+ }
+ }
+ if(types.length === 0 && typeContent && typeContent.length !== 0) types = typeContent;
+ if(!types || types.length === 0) types = new Array("");
+ myself.__type__ = new Object();
+ var tr = newRow(CLASSES.typeFrame(), "Type", new SelectrowC(types, myself.__type__, 1, 1).getFrame());
+ myself.__table__.insert({"bottom" : tr});
+ return types;
+}
\ No newline at end of file
1
0

22 Jun '09
Author: lgiessmann
Date: Mon Jun 22 16:23:23 2009
New Revision: 55
Log:
ajax-client: fixed a bug in poems.xtm; added the functionality of inserting existing contents to specific constraint frames
Modified:
trunk/src/ajax/javascripts/datamodel.js
trunk/src/unit_tests/poems.xtm
Modified: trunk/src/ajax/javascripts/datamodel.js
==============================================================================
--- trunk/src/ajax/javascripts/datamodel.js (original)
+++ trunk/src/ajax/javascripts/datamodel.js Mon Jun 22 16:23:23 2009
@@ -1331,7 +1331,7 @@
this.__containers__.push(new Array(new Object()));
var owner = this.__containers__[0][0];
var cssTitle = "No constraint found for this name";
- for(var i = 0; i !== contents.length; ++i){
+ for(var i = 0; i !== cContents.length; ++i){
var name = new NameC(cContents[i], null, null, owner, 0, 1, null);
this.__error__.insert({"before" : name.getFrame()});
}
@@ -1519,13 +1519,15 @@
for(var i = 0; occurrenceTypes && i !== occurrenceTypes.length; ++i){
for(var j = 0; j != occurrenceTypes[i].occurrenceType.length; ++j){
types.push(occurrenceTypes[i].occurrenceType[j]);
- if(typeContent && typeContent[0] === ooccurrenceTypes[i].occurrenceType[j]){
+ if(typeContent && typeContent[0] === occurrenceTypes[i].occurrenceType[j]){
var selected = occurrenceTypes[i].occurrenceType[j];
types[types.length - 1] = types[0];
types[0] = selected;
}
}
}
+ if(types.length === 0 && contents && contents.length !== 0) types = contents.type;
+ if(types.length === 0) throw "From OccurrenceC(): There must be given an occurrencetype or any occurrencetype-constraint!";
this.__type__ = new Object();
var tr = newRow(CLASSES.typeFrame(), "Type", new SelectrowC(types, this.__type__, 1, 1).getFrame());
this.__table__.insert({"bottom" : tr});
@@ -1536,9 +1538,15 @@
onTypeChangeScope(this, contents && contents.scopes ? contents.scopes : null, occurrenceTypes, "occurrence");
// --- resource value and datatype
+ var noConstraint = false;
+ if(!constraint){
+ constraint = {"regexp" : ".*", "cardMin" : 0, "cardMax" : MAX_INT};
+ noConstraint = true;
+ }
var _min = parseInt(constraint.cardMin);
var _max = constraint.cardMax !== MAX_INT ? parseInt(constraint.cardMax) : MMAX_INT;
- var cssTitle = "min: " + _min + " max: " + _max + " regular expression: " + constraint.regexp;
+ var cssTitle = "No constraint found for this occurrence";
+ if(noConstraint === false) cssTitle = "min: " + _min + " max: " + _max + " regular expression: " + constraint.regexp;
this.__cssTitle__ = cssTitle;
makeResource(this, contents, constraint, (occurrenceTypes ? occurrenceTypes[0].datatypeConstraint : null), cssTitle);
@@ -1643,21 +1651,58 @@
this.__constraints__ = constraints;
try{
- if((!contents || contents.length === 0) && constraints && constraints.length > 0){
+ if(constraints && constraints.length > 0){
+ var cContents = new Array();
+ if(contents) cContents = contents.clone();
+
for(var i = 0; i != constraints.length; ++i){
+ var simpleConstraints = constraints[i].constraints;
+
+ var allTypes = new Array();
+ for(var k = 0; k !== constraints[i].occurrenceTypes.length; ++k){
+ allTypes = allTypes.concat(constraints[i].occurrenceTypes[k].occurrenceType);
+ }
+ allTypes = allTypes.flatten().uniq();
+
+ var ret = makeConstraintsAndContents(cContents, simpleConstraints, allTypes);
+ var constraintsAndContents = ret.constraintsAndContents;
+ cContents = ret.contents;
+
+ var _c_ = "";
+ for(var j = 0; j !== constraintsAndContents.length; ++j){
+ for(var k = 0; k !== constraintsAndContents[j].contents.length; ++k){
+ var val = constraintsAndContents[j].contents[k].resourceRef;
+ if(!val){
+ if(constraintsAndContents[j].contents[k].resourceData)
+ val = constraintsAndContents[j].contents[k].resourceData.value;
+ }
+ _c_ += val + "\n";
+ }
+ }
+
this.__containers__.push(new Array());
for(var j = 0; j != constraints[i].constraints.length; ++j){
this.__containers__[i].push(new Object());
var min = parseInt(constraints[i].constraints[j].cardMin);
var max = constraints[i].constraints[j].cardMax !== MAX_INT ? parseInt(constraints[i].constraints[j].cardMax) : MMAX_INT;
+ var _contents = null;
+ for(var k = 0; k !== constraintsAndContents.length; ++k){
+ if(constraintsAndContents[k].constraint === constraints[i].constraints[j]){
+ _contents = constraintsAndContents[k].contents;
+ break;
+ }
+ }
+ var endIdx = min;
+ endIdx = _contents && _contents.length > endIdx ? _contents.length : endIdx;
var regexp = constraints[i].constraints[j].regexp;
- if(max !== 0){
+ if(max !== 0 || (_contents && contents.length)){
var dblClickHandler = null;
if(min === 0) dblClickHandler = dblClickHandlerF;
-
var title = "min: " + min + " max: " + max + " regular expression: " + regexp;
- for(var k = 0; k !== (min === 0 ? 1 : min); ++k){
- var occurrence = new OccurrenceC("", constraints[i].occurrenceTypes, constraints[i].constraints[j], constraints[i].uniqueConstraints, this.__containers__[i][j], min === 0 ? 1 : min, max === MMAX_INT ? -1 : max, title, dblClickHandler);
+ for(var k = 0; k !== endIdx; ++k){
+ var _content = null;
+ if(_contents && _contents.length > k) _content = _contents[k];
+ var occurrence = new OccurrenceC(_content, constraints[i].occurrenceTypes, constraints[i].constraints[j], constraints[i].uniqueConstraints, this.__containers__[i][j], min === 0 ? 1 : min, max === MMAX_INT ? -1 : max, title, dblClickHandler);
if(min === 0) occurrence.disable();
this.__error__.insert({"before" : occurrence.getFrame()});
if(min === 0)occurrence.minimize();
@@ -1665,10 +1710,26 @@
}
}
}
+ // --- inserts not used contents
+ if(cContents.length !== 0){
+ this.__containers__.push(new Array(new Object()));
+ var owner = this.__containers__[0][0];
+ var cssTitle = "No constraint found for this occurrence";
+ for(var i = 0; i !== cContents.length; ++i){
+ var occurrence = new OccurrenceC(cContents[i], null, null, null, owner, 0, 1, cssTitle, null);
+ this.__error__.insert({"before" : occurrence.getFrame()});
+ }
+ }
}
- else {
- // TODO: check already existing contents and order them to the corresponding fields
- }
+ else if(contents && contents.length !== 0){
+ this.__containers__.push(new Array(new Object()));
+ var owner = this.__containers__[0][0];
+ var cssTitle = "No constraint found for this occurrence";
+ for(var i = 0; i !== contents.length; ++i){
+ var occurrence = new OccurrenceC(contents[i], null, null, null, owner, 0, 1, null);
+ this.__error__.insert({"before" : occurrence.getFrame()});
+ }
+ }
}
catch(err){
alert("From OccurrenceContainerC(): " + err);
@@ -3367,9 +3428,9 @@
}
else if(content && content.resourceData){
value = content.resourceData.value;
- datatype = contents.resourceData.datatype;
+ datatype = content.resourceData.datatype;
}
-
+
try{
this.__value__.remove();
this.__value__ = null;
@@ -3435,6 +3496,10 @@
for(var k = 0; k !== simpleConstraints.length; ++k){
var rex = new RegExp(simpleConstraints[k].regexp);
var contentValue = (isForTypes === true ? contents[j].value : contents[j]);
+ if(!contentValue){ // must be an occurrence
+ if(contents[j].resourceRef) contentValue = contents[j].resourceRef;
+ else if(contents[j].resourceData) contentValue = contents[j].resourceData.value;
+ }
if(rex.match(contentValue) === true && (tmpConstraint === null || (tmpConstraint && (simpleConstraints[k].regexp.length > tmpConstraint.regexp.length)))){
tmpConstraint = simpleConstraints[k];
}
@@ -3487,6 +3552,10 @@
for(var l = 0; l !== constraintsAndContents[k].contents.length; ++l){
if(_min >= _len - contentsToMove.length || min <= len + contentsToMove.length) break;
var contentValue = (isForTypes === true ? constraintsAndContents[k].contents[l].value : constraintsAndContents[k].contents[l]);
+ if(!contentValue){ // must be an occurrence
+ if(constraintsAndContents[k].contents[l].resourceRef) contentValue = constraintsAndContents[k].contents[l].resourceRef;
+ else if(constraintsAndContents[k].contents[l].resourceData) contentValue = constraintsAndContents[k].contents[l].resourceData.value;
+ }
if(rex.match(contentValue) === true){
contentsToMove.push(constraintsAndContents[k].contents[l]);
}
Modified: trunk/src/unit_tests/poems.xtm
==============================================================================
--- trunk/src/unit_tests/poems.xtm (original)
+++ trunk/src/unit_tests/poems.xtm Mon Jun 22 16:23:23 2009
@@ -1568,7 +1568,7 @@
</tm:occurrence>
<tm:occurrence>
<tm:type><tm:topicRef href="#regexp"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#string">^.+$</tm:resourceData>
+ <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#string">.+</tm:resourceData>
</tm:occurrence>
</tm:topic>
1
0

22 Jun '09
Author: lgiessmann
Date: Mon Jun 22 15:02:33 2009
New Revision: 54
Log:
ajax-client: fixed some bugs: *the test-file "poems.xtm", *the server's json-interface by more constraints for one nametype, *the insertion algorithm of existing data to specific constraint-frames; new functionality: the client is able to insert existing name-data into specific constraint-frames
Modified:
trunk/src/ajax/javascripts/create.js
trunk/src/ajax/javascripts/datamodel.js
trunk/src/json/json_tmcl.lisp
trunk/src/unit_tests/poems.xtm
Modified: trunk/src/ajax/javascripts/create.js
==============================================================================
--- trunk/src/ajax/javascripts/create.js (original)
+++ trunk/src/ajax/javascripts/create.js Mon Jun 22 15:02:33 2009
@@ -98,7 +98,7 @@
if(tmId.isValid() === false) ret = false;
if(ret === false){
- alert("The fragment wasn't committed - Please correct your input date!");
+ alert("The fragment wasn't committed - Please correct your input data!");
return;
}
Modified: trunk/src/ajax/javascripts/datamodel.js
==============================================================================
--- trunk/src/ajax/javascripts/datamodel.js (original)
+++ trunk/src/ajax/javascripts/datamodel.js Mon Jun 22 15:02:33 2009
@@ -148,7 +148,7 @@
// --- This class represents a selectrow with the functionality of FrameC.
var SelectrowC = Class.create(FrameC, {"initialize" : function($super, contents, owner, min, max){
- if(!contents || !contents.length)throw "From SelectrowC(): contents must be an array!";
+ if(!contents || !contents.length)throw "From SelectrowC(): contents must be a non-empty array!";
$super(contents, owner, min, max);
owner.__frames__.pop();
owner.__frames__.push(this);
@@ -425,7 +425,6 @@
}});
-
// --- Representation of a subjectLocator and subjectIdentifier frame.
var IdentifierC = Class.create(ContainerC, {"initialize" : function($super, contents, constraints, cssClass){
$super();
@@ -438,66 +437,9 @@
var cContents = new Array();
if(contents) cContents = contents.clone();
- var constraintsAndContents = new Array();
- // --- searches a constraint for every content with the longest string.length
- for(var i = 0; i !== cContents.length; ++i){
- var tmpConstraint = null;
- for(var j = 0; j !== constraints.length; ++j){
- var rex = new RegExp(constraints[j].regexp);
- if(rex.match(cContents[i]) === true && (tmpConstraint === null || (tmpConstraint && (constraints[j].regexp.length > tmpConstraint.regexp.length)))){
- tmpConstraint = constraints[j];
- }
- }
- if(tmpConstraint){
- var found = false;
- for(var j = 0; j !== constraintsAndContents.length; ++j){
- if(constraintsAndContents[j].constraint === tmpConstraint){
- constraintsAndContents[j].contents.push(cContents[i]);
- found = true;
- break;
- }
- }
- if(found === false){
- constraintsAndContents.push({"constraint" : tmpConstraint, "contents" : new Array(cContents[i])})
- }
- }
- }
- // --- removes all moved contents from cContents
- for(var i = 0; i !== constraintsAndContents.length; ++i){
- for(var j = 0; j !== constraintsAndContents[i].contents.length; ++j){
- cContents = cContents.without(constraintsAndContents[i].contents[j]);
- }
- }
-
- // --- checks the card-min of all used constraints
- for(var i = 0; i !== constraintsAndContents.length; ++i){
- var min = parseInt(constraintsAndContents[i].constraint.cardMin);
- var len = constraintsAndContents[i].contents.length;
- var rex = new RegExp(constraintsAndContents[i].constraint.regexp);
- if(len < min){
- for(var j = 0; j !== constraintsAndContents.length; ++j){
- if(constraintsAndContents[i] === constraintsAndContents[j]) continue;
- var _min = parseInt(constraintsAndContents[j].constraint.cardMin);
- var _len = constraintsAndContents[j].contents.length;
- var contentsToMove = new Array();
- for(var k = 0; k !== constraintsAndContents[j].contents.length; ++k){
- if(_min >= _len + contentsToMove.length || min <= len + contentsToMove.length) break;
- if(rex.match(constraintsAndContents[j].contents[k]) === true){
- contentsToMove.push(constraintsAndContents[j].contents[k]);
- }
- }
- constraintsAndContents[i].contents = constraintsAndContents[i].contents.concat(contentsToMove);
- // --- removes the moved contents from the source object
- for(var k = 0; k !== contentsToMove.length; ++k){
- constraintsAndContents[j].contents = constraintsAndContents[j].contents.without(contentsToMove[k]);
- }
- if(constraintsAndContents[i].contents.length >= min) break;
- }
- }
- }
-
- // --- to check card-max is not necessary, because if there is any constraint not satisfied the
- // --- validation will fail anyway
+ var ret = makeConstraintsAndContents(cContents, constraints, null);
+ var constraintsAndContents = ret.constraintsAndContents;
+ cContents = ret.contents;
// --- creates all rows
for(var i = 0; i != constraints.length; ++i){
@@ -505,20 +447,25 @@
var min = parseInt(constraints[i].cardMin);
var max = constraints[i].cardMax !== MAX_INT ? parseInt(constraints[i].cardMax) : MMAX_INT;
var regexp = constraints[i].regexp;
- var contents = null;
+ var _contents = null;
for(var j = 0; j !== constraintsAndContents.length; ++j){
- if(constraintsAndContents[j].constraint === constraints[i]) contents = constraintsAndContents[j].contents;
+ if(constraintsAndContents[j].constraint === constraints[i]){
+ _contents = constraintsAndContents[j].contents;
+ break;
+ }
}
- if(max !== 0 || contents && contents.length){
+ var _c_ = "";
+ for(var x = 0; x !== _contents.length; ++x) _c_ += "[" + x + "/" + _contents.length + "]: " + _contents[x] + "\n";
+ if(max !== 0 || _contents && _contents.length){
// -- creates the roles
var cssTitle = "min: " + min + " max: " + max + " regular expression: " + constraints[i].regexp;
var endIdx = (min === 0 ? 1 : min);
- endIdx = contents && contents.length > endIdx ? contents.length : endIdx;
+ endIdx = _contents && _contents.length > endIdx ? _contents.length : endIdx;
for(var j = 0; j != endIdx; ++j){
var dblClickHandler = null;
if(min === 0) dblClickHandler = dblClickHandlerF;
var _content = "";
- if(contents && contents.length > j) _content = contents[j];
+ if(_contents && _contents.length > j) _content = _contents[j];
var row = new TextrowC(_content, constraints[i].regexp, this.__containers__[i],
min === 0 ? 1 : min, max === MMAX_INT ? -1 : max, cssTitle, dblClickHandler);
if(!_content) row.dblClick();
@@ -527,12 +474,14 @@
}
}
// --- not used contents
- this.__containers__.push(new Object());
- for(var i = 0; i !== cContents.length; ++i){
- var owner = this.__containers__[this.__containers__.length - 1];
- var cssTitle = "No constraint found for this identifier!";
- var row = new TextrowC(cContents[i], "^.+$", owner, 0, 1, cssTitle, null);
- this.__error__.insert({"before" : row.getFrame()});
+ if(cContents.length !== 0){
+ this.__containers__.push(new Object());
+ for(var i = 0; i !== cContents.length; ++i){
+ var owner = this.__containers__[this.__containers__.length - 1];
+ var cssTitle = "No constraint found for this identifier!";
+ var row = new TextrowC(cContents[i], "^.+$", owner, 0, 1, cssTitle, null);
+ this.__error__.insert({"before" : row.getFrame()});
+ }
}
}
@@ -541,7 +490,6 @@
var cssTitle = "No constraint found for this identifier";
for(var i = 0; i !== contents.length; ++i){
var row = new TextrowC(contents[i], null, this.__containers__[0], 0, 1, cssTitle, null);
- row.dblClick();
this.__error__.insert({"before" : row.getFrame()});
}
}
@@ -1162,7 +1110,7 @@
// --- representation of a name element
-var NameC = Class.create(ContainerC, {"initialize" : function($super, contents, nametypescopes, simpleConstraint, owner, min, max, cssTitle, dblClickHandler){
+var NameC = Class.create(ContainerC, {"initialize" : function($super, contents, nametypescopes, simpleConstraint, owner, min, max, dblClickHandler){
$super();
if(!owner) throw "From NameC(): owner must be set but is null";
if(max !== -1 && (min > max || max === 0))throw "From FrameC(): min must be > max(" + max + ") and > 0 but is " + min;
@@ -1194,9 +1142,8 @@
makeControlRow(this, 5, itemIdentityContent);
checkRemoveAddButtons(owner, min, max);
setRemoveAddHandler(this, owner, min, max, function(){
- return new NameC(null, nametypescopes, simpleConstraint, owner, min, max, cssTitle, dblClickHandler);
+ return new NameC(null, nametypescopes, simpleConstraint, owner, min, max, dblClickHandler);
});
-
// --- type
var types = new Array();
for(var i = 0; nametypescopes && i !== nametypescopes.length; ++i){
@@ -1209,22 +1156,32 @@
}
}
}
+ if(types.length === 0 && contents && contents.length !== 0) types = contents.type;
+ if(types.length === 0) throw "From NameC(): There must be given a nametype or any nametype-constraint!";
this.__type__ = new Object();
+
var tr = newRow(CLASSES.typeFrame(), "Type", new SelectrowC(types, this.__type__, 1, 1).getFrame());
this.__table__.insert({"bottom" : tr});
-
// --- scopes
this.__scope__ = new ScopeContainerC(scopesContent, nametypescopes && nametypescopes[0].scopeConstraints ? nametypescopes[0].scopeConstraints : null);
this.__table__.insert({"bottom" : newRow(CLASSES.scopeContainer(), "Scope", this.__scope__.getFrame())});
onTypeChangeScope(this, contents ? contents.scopes : null, nametypescopes, "name");
// --- value
+ var noConstraint = false;
+ if(!simpleConstraint){
+ simpleConstraint = {"regexp" : ".*", "cardMin" : 0, "cardMax" : MAX_INT};
+ noConstraint = true;
+ }
this.__value__ = new Object();
var _min = parseInt(simpleConstraint.cardMin);
var _max = simpleConstraint.cardMax !== MAX_INT ? parseInt(simpleConstraint.cardMax) : MMAX_INT;
- var cssTitleV = "min: " + _min + " max: " + _max + " regular expression: " + (simpleConstraint ? simpleConstraint.regexp : ".*");
+ var cssTitle = "No constraint found for this name";
+ if(noConstraint === false){
+ cssTitle = "min: " + _min + " max: " + _max + " regular expression: " + (simpleConstraint ? simpleConstraint.regexp : ".*");
+ }
this.__cssTitle__ = cssTitle;
- new TextrowC(valueContent, (simpleConstraint ? simpleConstraint.regexp : ".*"), this.__value__, 1, 1, cssTitleV);
+ new TextrowC(valueContent, (simpleConstraint ? simpleConstraint.regexp : ".*"), this.__value__, 1, 1, cssTitle);
this.__table__.insert({"bottom" : newRow(CLASSES.valueFrame(), "Value", this.__value__.__frames__[0].getFrame())});
// --- variants
@@ -1322,23 +1279,46 @@
this.__containers__ = new Array();
this.__constraints__ = constraints;
-// ------------------>
try{
- if((!contents || contents.length === 0) && constraints && constraints.length > 0){
+ if(constraints && constraints.length > 0){
+ var cContents = new Array();
+ if(contents) cContents = contents.clone();
for(var i = 0; i != constraints.length; ++i){
+ var simpleConstraints = constraints[i].constraints;
+
+ var allTypes = new Array();
+ for(var k = 0; k !== constraints[i].nametypescopes.length; ++k){
+ allTypes = allTypes.concat(constraints[i].nametypescopes[k].nameType);
+ }
+ allTypes = allTypes.flatten().uniq();
+
+ var ret = makeConstraintsAndContents(cContents, simpleConstraints, allTypes);
+ var constraintsAndContents = ret.constraintsAndContents;
+ cContents = ret.contents;
+
+ // --- creation of the frames with the found contents
this.__containers__.push(new Array());
for(var j = 0; j != constraints[i].constraints.length; ++j){
this.__containers__[i].push(new Object());
var min = parseInt(constraints[i].constraints[j].cardMin);
var max = constraints[i].constraints[j].cardMax !== MAX_INT ? parseInt(constraints[i].constraints[j].cardMax) : MMAX_INT;
+ var _contents = null;
+ for(var k = 0; k !== constraintsAndContents.length; ++k){
+ if(constraintsAndContents[k].constraint === constraints[i].constraints[j]){
+ _contents = constraintsAndContents[k].contents;
+ break;
+ }
+ }
+ var endIdx = (min === 0 ? 1 : min);
+ endIdx = _contents && _contents.length > endIdx ? _contents.length : endIdx;
var regexp = constraints[i].constraints[j].regexp;
- if(max !== 0){
+ if(max !== 0 || _contents && _contents.length){
var dblClickHandler = null;
if(min === 0) dblClickHandler = dblClickHandlerF;
-
- var title = "min: " + min + " max: " + max + " regular expression: " + regexp;
- for(var k = 0; k !== (min === 0 ? 1 : min); ++k){
- var name = new NameC("", constraints[i].nametypescopes, constraints[i].constraints[j], this.__containers__[i][j], min === 0 ? 1 : min, max === MMAX_INT ? -1 : max, title, dblClickHandler);
+ for(var k = 0; k !== endIdx; ++k){
+ var _content = null;
+ if(_contents && _contents.length > k) _content = _contents[k];
+ var name = new NameC(_content, constraints[i].nametypescopes, constraints[i].constraints[j], this.__containers__[i][j], min === 0 ? 1 : min, max === MMAX_INT ? -1 : max, dblClickHandler);
if(min === 0)name.disable();
this.__error__.insert({"before" : name.getFrame()});
if(min === 0)name.minimize();
@@ -1346,10 +1326,26 @@
}
}
}
+ // --- inserts not used contents
+ if(cContents.length !== 0){
+ this.__containers__.push(new Array(new Object()));
+ var owner = this.__containers__[0][0];
+ var cssTitle = "No constraint found for this name";
+ for(var i = 0; i !== contents.length; ++i){
+ var name = new NameC(cContents[i], null, null, owner, 0, 1, null);
+ this.__error__.insert({"before" : name.getFrame()});
+ }
+ }
}
- else {
- // TODO: check already existing contents and order them to the corresponding fields
- }
+ else if(contents && contents.length !== 0){
+ this.__containers__.push(new Array(new Object()));
+ var owner = this.__containers__[0][0];
+ var cssTitle = "No constraint found for this name";
+ for(var i = 0; i !== contents.length; ++i){
+ var name = new NameC(contents[i], null, null, owner, 0, 1, null);
+ this.__error__.insert({"before" : name.getFrame()});
+ }
+ }
}
catch(err){
alert("From NameContainerC(): " + err);
@@ -3153,7 +3149,8 @@
// --- A handler for the dblclick-event. So a frame can be disabled or enabled.
-function dblClickHandlerF(owner, event){
+function dblClickHandlerF(owner, event)
+{
if(owner.__frames__.length === 1){
if(owner.__frames__[0].isUsed() === true){
owner.__frames__[0].disable();
@@ -3168,7 +3165,8 @@
// --- helper function to create a dom-fragment of the form
// --- <tr class="rowClass"><td class="description">description</td>
//---- <td class="content">content</td></tr>
-function newRow(rowClass, description, content){
+function newRow(rowClass, description, content)
+{
var tr = new Element("tr", {"class" : rowClass});
tr.insert({"top" : new Element("td", {"class" : CLASSES.description()}).update(description)});
tr.insert({"bottom" : new Element("td", {"class" : CLASSES.content()}).update(content)});
@@ -3179,7 +3177,8 @@
// --- Helper function for the constructors of all classes
// --- of the type FrameC.
// --- There will be set the remome and add handler.
-function setRemoveAddHandler(myself, owner, min, max, call){
+function setRemoveAddHandler(myself, owner, min, max, call)
+{
myself.__remove__.stopObserving();
myself.__add__.stopObserving();
myself.__remove__.observe("click", function(event){
@@ -3226,7 +3225,8 @@
// --- of the type FrameC.
// --- There will be checked the visibility of the remove and
// --- add buttons.
-function checkRemoveAddButtons(owner, min, max){
+function checkRemoveAddButtons(owner, min, max)
+{
if(min >= owner.__frames__.length){
for(var i = 0; i != owner.__frames__.length; ++i){
owner.__frames__[i].hideRemoveButton();
@@ -3254,7 +3254,8 @@
// --- creates a control row for NameC, OccurrenceC and VariantC with a nested ItemIdentity frame.
-function makeControlRow(myself, rowspan, contents){
+function makeControlRow(myself, rowspan, contents)
+{
var tr = new Element("tr", {"class" : CLASSES.itemIdentityFrame()});
var tdCtrl = new Element("td", {"class" : CLASSES.controlColumn(), "rowspan" : rowspan});
tr.insert({"top" : tdCtrl})
@@ -3301,7 +3302,8 @@
// --- On changing there will be reset the scope frame to the corresponding
// --- type and when what is set to "occurrence" there will be set a corresponding
// --- datatype-value.
-function onTypeChangeScope(myself, contents, constraints, what){
+function onTypeChangeScope(myself, contents, constraints, what)
+{
try{
var select = myself.__table__.select("tr." + CLASSES.typeFrame())[0].select("td." + CLASSES.content())[0].select("select")[0];
select.observe("change", function(event){
@@ -3355,7 +3357,8 @@
// --- sets the resource value and datatype of names and occurrences
-function makeResource(myself, content, constraints, datatypeConstraint, cssTitle){
+function makeResource(myself, content, constraints, datatypeConstraint, cssTitle)
+{
var value = "";
var datatype = "";
if(content && content.resourceRef && content.resourceRef.length !== 0){
@@ -3390,4 +3393,116 @@
new TextrowC(datatype, ".*", myself.__datatype__, 1, 1, null);
}
myself.__table__.insert({"bottom" : newRow(CLASSES.datatypeFrame(), "Datatype", myself.__datatype__.__frames__[0].getFrame())});
-}
\ No newline at end of file
+}
+
+
+// --- Orders the passed contents to a corresponding constraint.
+// --- There will be searched for every content the constraint
+// --- with the longest string.length of the regular expression.
+// --- If there is a constraint invalidated by card-min
+// --- there will be tried to move some contents to other constraint
+// --- with a matching regular expression and a card-min/card-max that is
+// --- not bad.
+// --- If for types ist set to an array of a length > 0, the constraint
+// --- and content type must be for a name or occurrence.
+// --- The return value is an object of the form
+// --- {"constraintsAndContents" : constraintsAndContents, "contents" : contents}
+// --- constraintsAndContents contains all constraints with an array of contents
+// --- belonging to the constraint, contents is an array of all contents
+// --- which were passed to this function without the matched contents for found
+// --- constraints.
+function makeConstraintsAndContents(contents, simpleConstraints, forTypes)
+{
+ var isForTypes = forTypes && forTypes.length !== 0;
+
+ var constraintsAndContents = new Array();
+ for(var j = 0; j !== contents.length; ++j){
+ // --- searches only for contents that have the given type of the current constraint
+ if(isForTypes){
+ var cContentIsInConstraint = false;
+ for(var k = 0; contents[j].type && k !== contents[j].type.length; ++k){
+ if(forTypes.indexOf(contents[j].type[k]) !== -1){
+ cContentIsInConstraint = true;
+ break;
+ }
+ }
+ // --- cContent's type is not in the current constraint
+ if(cContentIsInConstraint === false) continue;
+ }
+
+ // --- searches a constraint for every existing content
+ var tmpConstraint = null;
+ for(var k = 0; k !== simpleConstraints.length; ++k){
+ var rex = new RegExp(simpleConstraints[k].regexp);
+ var contentValue = (isForTypes === true ? contents[j].value : contents[j]);
+ if(rex.match(contentValue) === true && (tmpConstraint === null || (tmpConstraint && (simpleConstraints[k].regexp.length > tmpConstraint.regexp.length)))){
+ tmpConstraint = simpleConstraints[k];
+ }
+ }
+ if(tmpConstraint){
+ var found = false;
+ for(var k = 0; k !== constraintsAndContents.length; ++k){
+ if(constraintsAndContents[k].constraint === tmpConstraint){
+ constraintsAndContents[k].contents.push(contents[j]);
+ found = true;
+ break;
+ }
+ }
+ if(found === false){
+ constraintsAndContents.push({"constraint" : tmpConstraint, "contents" : new Array(contents[j])})
+ }
+ }
+ }
+ // --- removes all moved contents from contents
+ for(var j = 0; j !== constraintsAndContents.length; ++j){
+ for(var k = 0; k !== constraintsAndContents[j].contents.length; ++k){
+ contents = contents.without(constraintsAndContents[j].contents[k]);
+ }
+ }
+
+ // --- adds all constraints to constraintsAndcontents that are not used now
+ // --- this is neccessary to find constraint with card-min > 0, but which has
+ // --- still no contents because the regular expression is too short,
+ for(var j = 0; j !== simpleConstraints.length; ++j){
+ var k = 0;
+ for( ; k !== constraintsAndContents.length; ++k){
+ if(constraintsAndContents[k].constraint === simpleConstraints[j]) break;
+ }
+ if(k === constraintsAndContents.length){
+ constraintsAndContents.push({"constraint" : simpleConstraints[j], "contents" : new Array()});
+ }
+ }
+
+ // --- checks the card-min of all used constraints
+ for(var j = 0; j !== constraintsAndContents.length; ++j){
+ var min = parseInt(constraintsAndContents[j].constraint.cardMin);
+ var len = constraintsAndContents[j].contents.length;
+ var rex = new RegExp(constraintsAndContents[j].constraint.regexp);
+ if(len < min){
+ for(var k = 0; k !== constraintsAndContents.length; ++k){
+ if(constraintsAndContents[j] === constraintsAndContents[k]) continue;
+ var _min = parseInt(constraintsAndContents[k].constraint.cardMin);
+ var _len = constraintsAndContents[k].contents.length;
+ var contentsToMove = new Array();
+ for(var l = 0; l !== constraintsAndContents[k].contents.length; ++l){
+ if(_min >= _len - contentsToMove.length || min <= len + contentsToMove.length) break;
+ var contentValue = (isForTypes === true ? constraintsAndContents[k].contents[l].value : constraintsAndContents[k].contents[l]);
+ if(rex.match(contentValue) === true){
+ contentsToMove.push(constraintsAndContents[k].contents[l]);
+ }
+ }
+ constraintsAndContents[j].contents = constraintsAndContents[j].contents.concat(contentsToMove);
+ // --- removes the moved contents from the source object
+ for(var l = 0; l !== contentsToMove.length; ++l){
+ constraintsAndContents[k].contents = constraintsAndContents[k].contents.without(contentsToMove[l]);
+ }
+ if(constraintsAndContents[j].contents.length >= min) break;
+ }
+ }
+ }
+
+ // --- to check card-max is not necessary, because if there is any constraint not satisfied the
+ // --- validation will fail anyway
+
+ return {"constraintsAndContents" : constraintsAndContents, "contents" : contents};
+}
Modified: trunk/src/json/json_tmcl.lisp
==============================================================================
--- trunk/src/json/json_tmcl.lisp (original)
+++ trunk/src/json/json_tmcl.lisp Mon Jun 22 15:02:33 2009
@@ -546,15 +546,16 @@
append (loop for other-role in (roles (parent role))
when (eq nametype-role (instance-of other-role))
collect (let ((nametype-topic (player other-role))
- (constraint-list (get-constraint-topic-values constraint-topic)))
+ (constraint-list (get-constraint-topic-values constraint-topic)))
(list :type nametype-topic :constraint constraint-list))))))))
(let ((nametype-topics
- (map 'list #'(lambda(x)
- (let ((topicname-type
- (getf x :type)))
- (topictype-p topicname-type nametype nametype-constraint)
- topicname-type))
- topicname-constraints)))
+ (remove-duplicates
+ (map 'list #'(lambda(x)
+ (let ((topicname-type
+ (getf x :type)))
+ (topictype-p topicname-type nametype nametype-constraint)
+ topicname-type))
+ topicname-constraints))))
(let ((cleaned-topicname-constraints "["))
(loop for nametype-topic in nametype-topics
do (let ((constraint-lists
@@ -615,11 +616,12 @@
(constraint-list (get-constraint-topic-values constraint-topic)))
(list :type occurrencetype-topic :constraint constraint-list))))))))
(let ((occurrencetype-topics
- (remove-duplicates (map 'list #'(lambda(x)
- (let ((occurrence-type (getf x :type)))
- (topictype-p occurrence-type occurrencetype occurrencetype-constraint)
- occurrence-type))
- topicoccurrence-constraints))))
+ (remove-duplicates
+ (map 'list #'(lambda(x)
+ (let ((occurrence-type (getf x :type)))
+ (topictype-p occurrence-type occurrencetype occurrencetype-constraint)
+ occurrence-type))
+ topicoccurrence-constraints))))
(let ((cleaned-topicoccurrence-constraints "["))
(loop for occurrencetype-topic in occurrencetype-topics
do (let ((constraint-lists
Modified: trunk/src/unit_tests/poems.xtm
==============================================================================
--- trunk/src/unit_tests/poems.xtm (original)
+++ trunk/src/unit_tests/poems.xtm Mon Jun 22 15:02:33 2009
@@ -924,7 +924,7 @@
</tm:occurrence>
<tm:occurrence>
<tm:type><tm:topicRef href="#card-max"/></tm:type>
- <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">1</tm:resourceData>
+ <tm:resourceData datatype="http://www.w3.org/2001/XMLSchema#unsignedInt">2</tm:resourceData>
</tm:occurrence>
<tm:occurrence>
<tm:type><tm:topicRef href="#regexp"/></tm:type>
@@ -2351,26 +2351,20 @@
<tm:subjectIdentifier href="http://some.where/psis/country/germany"/>
<tm:instanceOf><tm:topicRef href="#country"/></tm:instanceOf>
<tm:name>
+ <tm:type><tm:topicRef href="#country-name"/></tm:type>
<tm:scope><tm:topicRef href="#de"/></tm:scope>
<tm:value>Deutschland</tm:value>
</tm:name>
- <tm:name>
- <tm:scope><tm:topicRef href="#en"/></tm:scope>
- <tm:value>Germany</tm:value>
- </tm:name>
</tm:topic>
<tm:topic id="poland">
<tm:subjectIdentifier href="http://some.where/psis/country/poland"/>
<tm:instanceOf><tm:topicRef href="#country"/></tm:instanceOf>
<tm:name>
+ <tm:type><tm:topicRef href="#country-name"/></tm:type>
<tm:scope><tm:topicRef href="#de"/></tm:scope>
<tm:value>Polen</tm:value>
</tm:name>
- <tm:name>
- <tm:scope><tm:topicRef href="#en"/></tm:scope>
- <tm:value>Poland</tm:value>
- </tm:name>
</tm:topic>
<tm:topic id="frankfurt_am_main">
1
0

21 Jun '09
Author: lgiessmann
Date: Sun Jun 21 06:37:21 2009
New Revision: 53
Log:
ajax-client: by editing a fragment all identifiers will be inserted in the corresponding generated tmcl-frames; contents which doesn't satisfy any constraint will be inserted in frames with a corresponding title - so the user is able to recognize which contents are bad
Modified:
trunk/src/ajax/javascripts/datamodel.js
trunk/src/unit_tests/poems.xtm
Modified: trunk/src/ajax/javascripts/datamodel.js
==============================================================================
--- trunk/src/ajax/javascripts/datamodel.js (original)
+++ trunk/src/ajax/javascripts/datamodel.js Sun Jun 21 06:37:21 2009
@@ -426,7 +426,7 @@
-// --- Representation of a subjectLocator and subjectIdentifier frames.
+// --- Representation of a subjectLocator and subjectIdentifier frame.
var IdentifierC = Class.create(ContainerC, {"initialize" : function($super, contents, constraints, cssClass){
$super();
this.__frame__.writeAttribute({"class" : cssClass});
@@ -434,27 +434,116 @@
this.__constraints__ = constraints;
try{
- if((!contents || contents.length === 0) && constraints && constraints.length > 0){
+ if(constraints && constraints.length > 0){
+ var cContents = new Array();
+ if(contents) cContents = contents.clone();
+
+ var constraintsAndContents = new Array();
+ // --- searches a constraint for every content with the longest string.length
+ for(var i = 0; i !== cContents.length; ++i){
+ var tmpConstraint = null;
+ for(var j = 0; j !== constraints.length; ++j){
+ var rex = new RegExp(constraints[j].regexp);
+ if(rex.match(cContents[i]) === true && (tmpConstraint === null || (tmpConstraint && (constraints[j].regexp.length > tmpConstraint.regexp.length)))){
+ tmpConstraint = constraints[j];
+ }
+ }
+ if(tmpConstraint){
+ var found = false;
+ for(var j = 0; j !== constraintsAndContents.length; ++j){
+ if(constraintsAndContents[j].constraint === tmpConstraint){
+ constraintsAndContents[j].contents.push(cContents[i]);
+ found = true;
+ break;
+ }
+ }
+ if(found === false){
+ constraintsAndContents.push({"constraint" : tmpConstraint, "contents" : new Array(cContents[i])})
+ }
+ }
+ }
+ // --- removes all moved contents from cContents
+ for(var i = 0; i !== constraintsAndContents.length; ++i){
+ for(var j = 0; j !== constraintsAndContents[i].contents.length; ++j){
+ cContents = cContents.without(constraintsAndContents[i].contents[j]);
+ }
+ }
+
+ // --- checks the card-min of all used constraints
+ for(var i = 0; i !== constraintsAndContents.length; ++i){
+ var min = parseInt(constraintsAndContents[i].constraint.cardMin);
+ var len = constraintsAndContents[i].contents.length;
+ var rex = new RegExp(constraintsAndContents[i].constraint.regexp);
+ if(len < min){
+ for(var j = 0; j !== constraintsAndContents.length; ++j){
+ if(constraintsAndContents[i] === constraintsAndContents[j]) continue;
+ var _min = parseInt(constraintsAndContents[j].constraint.cardMin);
+ var _len = constraintsAndContents[j].contents.length;
+ var contentsToMove = new Array();
+ for(var k = 0; k !== constraintsAndContents[j].contents.length; ++k){
+ if(_min >= _len + contentsToMove.length || min <= len + contentsToMove.length) break;
+ if(rex.match(constraintsAndContents[j].contents[k]) === true){
+ contentsToMove.push(constraintsAndContents[j].contents[k]);
+ }
+ }
+ constraintsAndContents[i].contents = constraintsAndContents[i].contents.concat(contentsToMove);
+ // --- removes the moved contents from the source object
+ for(var k = 0; k !== contentsToMove.length; ++k){
+ constraintsAndContents[j].contents = constraintsAndContents[j].contents.without(contentsToMove[k]);
+ }
+ if(constraintsAndContents[i].contents.length >= min) break;
+ }
+ }
+ }
+
+ // --- to check card-max is not necessary, because if there is any constraint not satisfied the
+ // --- validation will fail anyway
+
+ // --- creates all rows
for(var i = 0; i != constraints.length; ++i){
this.__containers__.push(new Object());
var min = parseInt(constraints[i].cardMin);
var max = constraints[i].cardMax !== MAX_INT ? parseInt(constraints[i].cardMax) : MMAX_INT;
- if(max !== 0){
+ var regexp = constraints[i].regexp;
+ var contents = null;
+ for(var j = 0; j !== constraintsAndContents.length; ++j){
+ if(constraintsAndContents[j].constraint === constraints[i]) contents = constraintsAndContents[j].contents;
+ }
+ if(max !== 0 || contents && contents.length){
+ // -- creates the roles
var cssTitle = "min: " + min + " max: " + max + " regular expression: " + constraints[i].regexp;
- for(var j = 0; j != (min === 0 ? 1 : min); ++j){
-
+ var endIdx = (min === 0 ? 1 : min);
+ endIdx = contents && contents.length > endIdx ? contents.length : endIdx;
+ for(var j = 0; j != endIdx; ++j){
var dblClickHandler = null;
if(min === 0) dblClickHandler = dblClickHandlerF;
- var row = new TextrowC("", constraints[i].regexp, this.__containers__[i],
+ var _content = "";
+ if(contents && contents.length > j) _content = contents[j];
+ var row = new TextrowC(_content, constraints[i].regexp, this.__containers__[i],
min === 0 ? 1 : min, max === MMAX_INT ? -1 : max, cssTitle, dblClickHandler);
- row.dblClick();
+ if(!_content) row.dblClick();
this.__error__.insert({"before" : row.getFrame()});
}
}
}
+ // --- not used contents
+ this.__containers__.push(new Object());
+ for(var i = 0; i !== cContents.length; ++i){
+ var owner = this.__containers__[this.__containers__.length - 1];
+ var cssTitle = "No constraint found for this identifier!";
+ var row = new TextrowC(cContents[i], "^.+$", owner, 0, 1, cssTitle, null);
+ this.__error__.insert({"before" : row.getFrame()});
+ }
+
}
- else {
- // TODO: check already existing contents and order them to the corresponding fields
+ else if(contents && contents.length !== 0){
+ this.__containers__.push(new Object());
+ var cssTitle = "No constraint found for this identifier";
+ for(var i = 0; i !== contents.length; ++i){
+ var row = new TextrowC(contents[i], null, this.__containers__[0], 0, 1, cssTitle, null);
+ row.dblClick();
+ this.__error__.insert({"before" : row.getFrame()});
+ }
}
}
catch(err){
@@ -521,11 +610,13 @@
// --- checks card-min and card-max for the current constraint
if(cardMin > currentIdentifiers.length){
- errorStr += "card-min of the constraint regexp: \"" + this.__constraints__[i].regexp + "\" card-min: " + cardMin + " card-max: " + cardMax + " is not satisfied (" + currentIdentifiers.length + ")!<br/>";
+ if(errorStr.length !== 0) errorStr += "<br/><br/>";
+ errorStr += "card-min of the constraint regexp: \"" + this.__constraints__[i].regexp + "\" card-min: " + cardMin + " card-max: " + cardMax + " is not satisfied (" + currentIdentifiers.length + ")!";
ret = false;
}
if(cardMax !== MMAX_INT && cardMax < currentIdentifiers.length){
- errorStr += "card-max of the constraint regexp: \"" + this.__constraints__[i].regexp + "\" card-min: " + cardMin + " card-max: " + cardMax + " is not satisfied (" + currentIdentifiers.length + ")!<br/>";
+ if(errorStr.length !== 0) errorStr += "<br/><br/>";
+ errorStr += "card-max of the constraint regexp: \"" + this.__constraints__[i].regexp + "\" card-min: " + cardMin + " card-max: " + cardMax + " is not satisfied (" + currentIdentifiers.length + ")!";
ret = false;
}
}
@@ -1098,7 +1189,7 @@
valueContent = contents.value;
variantsContent = contents.variants;
}
-
+
// --- control row + ItemIdentity
makeControlRow(this, 5, itemIdentityContent);
checkRemoveAddButtons(owner, min, max);
@@ -1231,6 +1322,7 @@
this.__containers__ = new Array();
this.__constraints__ = constraints;
+// ------------------>
try{
if((!contents || contents.length === 0) && constraints && constraints.length > 0){
for(var i = 0; i != constraints.length; ++i){
Modified: trunk/src/unit_tests/poems.xtm
==============================================================================
--- trunk/src/unit_tests/poems.xtm (original)
+++ trunk/src/unit_tests/poems.xtm Sun Jun 21 06:37:21 2009
@@ -2374,7 +2374,7 @@
</tm:topic>
<tm:topic id="frankfurt_am_main">
- <tm:subjectIdentifier href="http://some.where/psis/city/frankfurt_am_main"/>
+ <tm:subjectIdentifier href="http://some.where/psis/region/frankfurt_am_main"/>
<tm:instanceOf><tm:topicRef href="#metropolis"/></tm:instanceOf>
<tm:name>
<tm:type><tm:topicRef href="#region-name"/></tm:type>
@@ -2399,7 +2399,7 @@
</tm:association>
<tm:topic id="marbach_am_neckar">
- <tm:subjectIdentifier href="http://some.where/psis/city/marbach_am_neckar"/>
+ <tm:subjectIdentifier href="http://some.where/psis/region/marbach_am_neckar"/>
<tm:instanceOf><tm:topicRef href="#city"/></tm:instanceOf>
<tm:name>
<tm:type><tm:topicRef href="#region-name"/></tm:type>
@@ -2424,7 +2424,7 @@
</tm:association>
<tm:topic id="lubowitz">
- <tm:subjectIdentifier href="http://some.where/psis/city/lubowitz"/>
+ <tm:subjectIdentifier href="http://some.where/psis/region/lubowitz"/>
<tm:instanceOf><tm:topicRef href="#city"/></tm:instanceOf>
<tm:name>
<tm:type><tm:topicRef href="#region-name"/></tm:type>
1
0