CategoryForm / TermWidget

* Die ausgewählten Kategorien werden nun auch in den Unterkategorien markiert (verbesserte Version)
 * Kategorienzuweisungen lassen sich jetzt auch im Formular löschen

git-svn-id: https://svn.libreccm.org/ccm/trunk@871 8810af33-2d31-482b-a856-94f89814c4df
master
quasi 2011-04-20 14:57:31 +00:00
parent 979c8853e7
commit c5b1c11bf9
4 changed files with 117 additions and 123 deletions

View File

@ -41,6 +41,7 @@ import com.arsdigita.categorization.CategoryCollection;
import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.kernel.ACSObject; import com.arsdigita.kernel.ACSObject;
import com.arsdigita.persistence.OID; import com.arsdigita.persistence.OID;
import java.util.HashSet;
/** /**
* abstract form for assigning categories to acs_objects. The assigned * abstract form for assigning categories to acs_objects. The assigned
@ -110,13 +111,23 @@ public abstract class ACSObjectCategoryForm extends Form {
ACSObject object = getObject(state); ACSObject object = getObject(state);
HashSet curSelectesdCat = new HashSet();
CategoryCollection cats = new CategorizedObject(object).getParents();
while (cats.next()) {
curSelectesdCat.add(cats.getCategory().getID());
}
BigDecimal[] ids = (BigDecimal[]) m_category.getValue(state); BigDecimal[] ids = (BigDecimal[]) m_category.getValue(state);
for (int i = 0; i < ids.length; i++) { for (int i = 0; i < ids.length; i++) {
Category cat = (Category) DomainObjectFactory.newInstance( Category cat = (Category) DomainObjectFactory.newInstance(
new OID(Category.BASE_DATA_OBJECT_TYPE, new OID(Category.BASE_DATA_OBJECT_TYPE,
ids[i])); ids[i]));
cat.addChild(object); if(!curSelectesdCat.contains(ids[i])) {
cat.addChild(object);
} else {
cat.removeChild(object);
}
} }
fireCompletionEvent(state); fireCompletionEvent(state);

View File

@ -15,7 +15,6 @@
* License along with this library; if not, write to the Free Software * License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
package com.arsdigita.london.terms.ui; package com.arsdigita.london.terms.ui;
import com.arsdigita.bebop.SimpleContainer; import com.arsdigita.bebop.SimpleContainer;
@ -54,14 +53,12 @@ import org.apache.log4j.Logger;
public abstract class ACSObjectCategoryPicker extends SimpleContainer { public abstract class ACSObjectCategoryPicker extends SimpleContainer {
private static final Logger s_log = Logger.getLogger(ACSObjectCategoryPicker.class); private static final Logger s_log = Logger.getLogger(ACSObjectCategoryPicker.class);
private ACSObjectCategoryForm m_form; private ACSObjectCategoryForm m_form;
private BigDecimalParameter m_root; private BigDecimalParameter m_root;
public ACSObjectCategoryPicker(BigDecimalParameter root, public ACSObjectCategoryPicker(BigDecimalParameter root, StringParameter mode) {
StringParameter mode) {
m_form = getForm(root, mode); m_form = getForm(root, mode);
m_root = root; m_root = root;
add(m_form); add(m_form);
@ -69,14 +66,13 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer {
} }
protected abstract ACSObjectCategoryForm getForm(BigDecimalParameter root, protected abstract ACSObjectCategoryForm getForm(BigDecimalParameter root,
StringParameter mode); StringParameter mode);
protected abstract ACSObject getObject(PageState state); protected abstract ACSObject getObject(PageState state);
private class ItemCategoryFormCompletion implements ActionListener { private class ItemCategoryFormCompletion implements ActionListener {
@Override
public void actionPerformed(ActionEvent ev) { public void actionPerformed(ActionEvent ev) {
PageState state = ev.getPageState(); PageState state = ev.getPageState();
@ -87,80 +83,76 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer {
s_log.debug("Saving categories in: " + domainKey); s_log.debug("Saving categories in: " + domainKey);
} }
ACSObject object = getObject(state); // ACSObject object = getObject(state);
//
if ("LGCL".equals(domainKey)) { // if ("LGCL".equals(domainKey)) {
lgclSelected(domain, object); // lgclSelected(domain, object);
} // } else if ("LGDL".equals(domainKey)) {
// lgdlSelected(domain, object);
else if ("LGDL".equals(domainKey)) { // }
lgdlSelected(domain, object);
}
fireCompletionEvent(state); fireCompletionEvent(state);
} }
// private void lgclSelected(Domain domain, ACSObject object) {
private void lgclSelected(Domain domain, ACSObject object) { // List lgclTerms = getCurrentCategories(domain, object);
List lgclTerms = getCurrentCategories(domain, object); //
// Domain gcl = Domain.retrieve("GCL");
Domain gcl = Domain.retrieve("GCL"); // Collection gclTerms = getRelatedTerms(lgclTerms, gcl);
Collection gclTerms = getRelatedTerms(lgclTerms, gcl); // clearTerms(gcl, object);
clearTerms(gcl, object); // assignTerms(gclTerms, object);
assignTerms(gclTerms, object); //
// // The assignment below is removed to satisfy requirement 4.1,
// The assignment below is removed to satisfy requirement 4.1, // // use case 1 of the document "Metadata Improvements" version 1
// use case 1 of the document "Metadata Improvements" version 1 // // by Camden, dated 23/01/05.
// by Camden, dated 23/01/05. // //Domain lgsl = Domain.retrieve("LGSL");
//Domain lgsl = Domain.retrieve("LGSL"); // //Collection lgslTerms = getRelatedTerms(lgclTerms, lgsl);
//Collection lgslTerms = getRelatedTerms(lgclTerms, lgsl); // //clearTerms(lgsl, object);
//clearTerms(lgsl, object); // //assignTerms(lgslTerms, object);
//assignTerms(lgslTerms, object); //
// // adding processing or mapping from LGCL to APLAWS-NAV too
// adding processing or mapping from LGCL to APLAWS-NAV too //// Deactivated here.
// Deactivated here. //// If needed
// If needed //// boolean lgclOverrideAnav = Aplaws.getAplawsConfig().getOverrideAnavFromLGCLMappings().booleanValue();
// boolean lgclOverrideAnav = Aplaws.getAplawsConfig().getOverrideAnavFromLGCLMappings().booleanValue(); //// if (lgclOverrideAnav) {
// if (lgclOverrideAnav) { //// Domain aplawsNav = Domain.retrieve("APLAWS-NAV");
// Domain aplawsNav = Domain.retrieve("APLAWS-NAV"); //// Collection aplawsNavTerms = getRelatedTerms(lgclTerms, aplawsNav);
// Collection aplawsNavTerms = getRelatedTerms(lgclTerms, aplawsNav); //// clearTerms(aplawsNav, object);
// clearTerms(aplawsNav, object); //// assignTerms(aplawsNavTerms, object);
// assignTerms(aplawsNavTerms, object); //// }
// } // }
} //
// // User has selected a term in the LGDL hierarchy, which includes
// User has selected a term in the LGDL hierarchy, which includes // // terms from the LGSL. We're only interested in LGSL terms here.
// terms from the LGSL. We're only interested in LGSL terms here. // private void lgdlSelected(Domain domain, ACSObject object) {
private void lgdlSelected(Domain domain, ACSObject object) { // Domain lgsl = Domain.retrieve("LGSL");
Domain lgsl = Domain.retrieve("LGSL"); // Domain gcl = Domain.retrieve("GCL");
Domain gcl = Domain.retrieve("GCL"); // Domain lgcl = Domain.retrieve("LGCL");
Domain lgcl = Domain.retrieve("LGCL"); //
// // We have a mapping LGSL -> LGCL based on the reverse of a
// We have a mapping LGSL -> LGCL based on the reverse of a // // published mapping. We don't have a mapping LGSL -> GCL, so we
// published mapping. We don't have a mapping LGSL -> GCL, so we // // do LGSL -> LGCL -> GCL instead.
// do LGSL -> LGCL -> GCL instead. //
// List lgslTerms = getCurrentCategories(lgsl, object);
List lgslTerms = getCurrentCategories(lgsl, object); // Collection lgclTerms = getRelatedTerms(lgslTerms, lgcl);
Collection lgclTerms = getRelatedTerms(lgslTerms, lgcl); //
// LinkedList lgclIDs = new LinkedList();
LinkedList lgclIDs = new LinkedList(); // Iterator i = lgclTerms.iterator();
Iterator i = lgclTerms.iterator(); // while (i.hasNext()) {
while (i.hasNext()) { // Term term = (Term) i.next();
Term term = (Term) i.next(); // lgclIDs.add(term.getModel().getID());
lgclIDs.add(term.getModel().getID()); // }
} //
// Collection gclTerms = getRelatedTerms(lgclIDs, gcl);
Collection gclTerms = getRelatedTerms(lgclIDs, gcl); //
// clearTerms(lgcl, object);
clearTerms(lgcl, object); // assignTerms(lgclTerms, object);
assignTerms(lgclTerms, object); //
// clearTerms(gcl, object);
clearTerms(gcl, object); // assignTerms(gclTerms, object);
assignTerms(gclTerms, object); // }
}
} }
protected List getCurrentCategories(Domain domain, protected List getCurrentCategories(Domain domain, ACSObject object) {
ACSObject object) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Getting terms from " + domain + " to " + object); s_log.debug("Getting terms from " + domain + " to " + object);
} }
@ -179,8 +171,7 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer {
} }
// TODO move out of UI code // TODO move out of UI code
public static Collection getCurrentTerms(Domain domain, public static Collection getCurrentTerms(Domain domain, ACSObject object) {
ACSObject object) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Getting terms from " + domain + " to " + object); s_log.debug("Getting terms from " + domain + " to " + object);
} }
@ -198,21 +189,20 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer {
} }
// TODO move out of UI code // TODO move out of UI code
public static Collection getRelatedTerms(Collection src, public static Collection getRelatedTerms(Collection src, Domain domain) {
Domain domain) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Getting related terms to " + domain); s_log.debug("Getting related terms to " + domain);
} }
if (src.isEmpty()) { if (src.isEmpty()) {
// this is a hack, it would be better not to use a completion event listener as // this is a hack, it would be better not to use a completion event listener as
// this is called even when the form is cancelled... // this is called even when the form is cancelled...
return new LinkedList(); return new LinkedList();
} }
DomainCollection terms = domain.getTerms(); DomainCollection terms = domain.getTerms();
// these next two lines build the query // these next two lines build the query
terms.addEqualsFilter("model.parents.link.relationType", "related"); terms.addEqualsFilter("model.parents.link.relationType", "related");
terms.addFilter("model.parents.id in :ids").set("ids", src); terms.addFilter("model.parents.id in :ids").set("ids", src);
Collection related = new LinkedList(); Collection related = new LinkedList();
while (terms.next()) { while (terms.next()) {
@ -224,14 +214,13 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer {
return related; return related;
} }
protected void clearTerms(Domain domain, protected void clearTerms(Domain domain, ACSObject object) {
ACSObject object) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Removing terms from " + domain + " to " + object); s_log.debug("Removing terms from " + domain + " to " + object);
} }
Iterator terms = getCurrentTerms(domain, object).iterator(); Iterator terms = getCurrentTerms(domain, object).iterator();
while (terms.hasNext()) { while (terms.hasNext()) {
Term term = (Term)terms.next(); Term term = (Term) terms.next();
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Removing term " + term + " from " + object); s_log.debug("Removing term " + term + " from " + object);
} }
@ -239,16 +228,14 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer {
} }
} }
// TODO move out of UI code // TODO move out of UI code
public static void assignTerms(Collection terms, public static void assignTerms(Collection terms, ACSObject object) {
ACSObject object) {
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Assigning terms to " + object); s_log.debug("Assigning terms to " + object);
} }
Iterator i = terms.iterator(); Iterator i = terms.iterator();
while (i.hasNext()) { while (i.hasNext()) {
Term term = (Term)i.next(); Term term = (Term) i.next();
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Assigning term " + term + " to " + object); s_log.debug("Assigning term " + term + " to " + object);
} }
@ -261,14 +248,11 @@ public abstract class ACSObjectCategoryPicker extends SimpleContainer {
s_log.debug("Getting domain for " + state.getValue(m_root)); s_log.debug("Getting domain for " + state.getValue(m_root));
} }
DataCollection domains = SessionManager.getSession() DataCollection domains = SessionManager.getSession().retrieve(Domain.BASE_DATA_OBJECT_TYPE);
.retrieve(Domain.BASE_DATA_OBJECT_TYPE); domains.addEqualsFilter("model.id", state.getValue(m_root));
domains.addEqualsFilter("model.id",
state.getValue(m_root));
if (domains.next()) { if (domains.next()) {
Domain domain = (Domain)DomainObjectFactory Domain domain = (Domain) DomainObjectFactory.newInstance(domains.getDataObject());
.newInstance(domains.getDataObject());
if (s_log.isDebugEnabled()) { if (s_log.isDebugEnabled()) {
s_log.debug("Got domain " + domain); s_log.debug("Got domain " + domain);
} }

View File

@ -1,6 +1,5 @@
package com.arsdigita.london.terms.ui; package com.arsdigita.london.terms.ui;
import com.arsdigita.bebop.FormData;
import java.math.BigDecimal; import java.math.BigDecimal;
// import java.util.Iterator; // import java.util.Iterator;
// import java.util.Map; // import java.util.Map;
@ -11,17 +10,13 @@ import org.apache.log4j.Logger;
import com.arsdigita.bebop.Page; import com.arsdigita.bebop.Page;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SimpleComponent; import com.arsdigita.bebop.SimpleComponent;
import com.arsdigita.bebop.parameters.ParameterData;
import com.arsdigita.bebop.parameters.StringParameter; import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.categorization.Category; import com.arsdigita.categorization.Category;
import com.arsdigita.domain.DomainObjectFactory; import com.arsdigita.domain.DomainObjectFactory;
import com.arsdigita.persistence.OID; import com.arsdigita.persistence.OID;
import com.arsdigita.util.Assert;
import com.arsdigita.xml.Element; import com.arsdigita.xml.Element;
import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import javax.servlet.http.HttpSession;
/** /**
* Generate part of the category tree. Used by Assign Category authoring step. * Generate part of the category tree. Used by Assign Category authoring step.
@ -61,7 +56,7 @@ public class CategorySubtree extends SimpleComponent {
HashSet ids = new HashSet(); HashSet ids = new HashSet();
if (((String) state.getValue(selectedCatsparam)) != null) { if (((String) state.getValue(selectedCatsparam)) != null) {
StringTokenizer values = new StringTokenizer((String) state.getValue(selectedCatsparam), ","); StringTokenizer values = new StringTokenizer((String) state.getValue(selectedCatsparam), ",");
while(values.hasMoreTokens()) { while (values.hasMoreTokens()) {
ids.add(new BigDecimal(values.nextToken().trim())); ids.add(new BigDecimal(values.nextToken().trim()));
} }
} }
@ -75,5 +70,4 @@ public class CategorySubtree extends SimpleComponent {
s_log.debug("generating subtree for cat " + root.getID()); s_log.debug("generating subtree for cat " + root.getID());
TermWidget.generateSubtree(p, root, ids); TermWidget.generateSubtree(p, root, ids);
} }
} }

View File

@ -105,8 +105,13 @@ public class TermWidget extends Widget {
ids.addAll(Arrays.asList(values)); ids.addAll(Arrays.asList(values));
} }
String selectedCats = ids.toString(); Element selEl = widget.newChildElement("cms:selectedCategories", CMS.CMS_XML_NS);
widget.addAttribute("selectedCats", selectedCats.substring(1, selectedCats.length() - 1)); selEl.addAttribute("name", this.getName());
Iterator selCats = ids.iterator();
while (selCats.hasNext()) {
Element selCat = selEl.newChildElement("cms:category", CMS.CMS_XML_NS);
selCat.addAttribute("id", selCats.next().toString());
}
// only root terms at first, the rest is loaded on-demand via AJAX // only root terms at first, the rest is loaded on-demand via AJAX
DomainCollection terms = domain.getRootTerms(); DomainCollection terms = domain.getRootTerms();