diff --git a/ccm-cms-types-genericorganization/application.xml b/ccm-cms-types-genericorganization/application.xml index a88c90f8f..13799e255 100644 --- a/ccm-cms-types-genericorganization/application.xml +++ b/ccm-cms-types-genericorganization/application.xml @@ -9,7 +9,7 @@ - + diff --git a/ccm-cms-types-genericorganization/pdl/com/arsdigita/content-types/Orga2OrgaUnit.pdl b/ccm-cms-types-genericorganization/pdl/com/arsdigita/content-types/Orga2OrgaUnit.pdl new file mode 100644 index 000000000..e3fb80335 --- /dev/null +++ b/ccm-cms-types-genericorganization/pdl/com/arsdigita/content-types/Orga2OrgaUnit.pdl @@ -0,0 +1,69 @@ +// +// Copyright (C) 2009 Center of Socialpolitics, University of Bremen +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License +// as published by the Free Software Foundation; either version 2.1 of +// the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +model com.arsdigita.cms.contenttypes; + +import com.arsdigita.cms.ContentItem; +import com.arsdigita.kernel.ACSObject; + +object type Orga2OrgaUnit extends ACSObject { + OrganizationalUnit[0..1] targetItem = join ct_orga2orgaunits.target_item_id to ct_organizationalunits.organizationalunit_id; + + Integer[0..1] unitOrder = ct_orga2orgaunits.unit_order INTEGER; + + reference key(ct_orga2orgaunits.orga2orgaunit_id); + aggressive load (unitOwner.id); +} + +association { + composite GenericOrganization[0..1] unitOwner = join ct_orga2orgaunits.unit_owner to ct_genericorganizations.organization_id; + composite Orga2OrgaUnit[0..n] units = join ct_genericorganizations.organization_id to ct_orga2orgaunits.owner_id; +} + +query getReferingUnits { + BigDecimal id; + + do { + select u.organizationalunit_id from orga2orgaunits u where u.target_item_id = :itemID + } map { + id = u.orga2orgaunit_id; + } +} + +data operation swapOrga2OrgaUnitWithNextInGroup { + do { + update ct_orga2orgaunits + set unit_order = CASE WHEN (unit_order = :unitOrder) THEN + (:nextUnitOrder) + ELSE + (:unitOrder) + END + where (unit_order = :unitOrder or unit_order = :nextUnitOrder) + and owner_id = :ownerID + } +} + +query allUnitsOrderForOrganization { + Integer unitOrder; + + do { + select u.unit_order from ct_orga2orgaunits u where u.owner_id = :ownerID + } + map { + unitOrder = u.unit_order; + } +} \ No newline at end of file diff --git a/ccm-cms-types-genericorganization/src/WEB-INF/content-types/com/arsdigita/cms/contenttypes/GenericOrganization.xml b/ccm-cms-types-genericorganization/src/WEB-INF/content-types/com/arsdigita/cms/contenttypes/GenericOrganization.xml index 9c8abfeea..2d9bab9b0 100644 --- a/ccm-cms-types-genericorganization/src/WEB-INF/content-types/com/arsdigita/cms/contenttypes/GenericOrganization.xml +++ b/ccm-cms-types-genericorganization/src/WEB-INF/content-types/com/arsdigita/cms/contenttypes/GenericOrganization.xml @@ -29,6 +29,15 @@ component="com.arsdigita.cms.contenttypes.ui.OrganizationRolePropertiesStep" ordering="2"/> + + + diff --git a/ccm-cms-types-genericorganization/src/ccm-cms-types-genericorganization.load b/ccm-cms-types-genericorganization/src/ccm-cms-types-genericorganization.load index 54eec215a..937b4956e 100644 --- a/ccm-cms-types-genericorganization/src/ccm-cms-types-genericorganization.load +++ b/ccm-cms-types-genericorganization/src/ccm-cms-types-genericorganization.load @@ -3,6 +3,7 @@
+
diff --git a/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/Orga2OrgaUnit.java b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/Orga2OrgaUnit.java new file mode 100644 index 000000000..c8e0f1c92 --- /dev/null +++ b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/Orga2OrgaUnit.java @@ -0,0 +1,239 @@ +package com.arsdigita.cms.contenttypes; + +import com.arsdigita.cms.contenttypes.*; +import com.arsdigita.bebop.PageState; +import com.arsdigita.cms.ContentSection; +import com.arsdigita.cms.dispatcher.ItemResolver; +import com.arsdigita.domain.DomainObjectFactory; +import com.arsdigita.kernel.ACSObject; +import com.arsdigita.persistence.DataCollection; +import com.arsdigita.persistence.DataObject; +import com.arsdigita.persistence.DataOperation; +import com.arsdigita.persistence.DataQuery; +import com.arsdigita.persistence.Filter; +import com.arsdigita.persistence.OID; +import com.arsdigita.persistence.Session; +import com.arsdigita.persistence.SessionManager; +import com.arsdigita.util.Assert; +import com.arsdigita.web.URL; +import java.math.BigDecimal; +import org.apache.log4j.Logger; + +/** + * + * @author Jens Pelzetter + */ +public class Orga2OrgaUnit extends ACSObject { + + private final static Logger logger = Logger.getLogger(Orga2OrgaUnit.class); + + public final static String TARGETITEM = "targetItem"; + + public final static String UNITOWNER = "unitOwner"; + + public final static String UNITORDER = "unitOrder"; + + public final static String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.contenttypes.Orga2OrgaUnit"; + + public Orga2OrgaUnit() { + super(BASE_DATA_OBJECT_TYPE); + } + + public Orga2OrgaUnit(BigDecimal id) { + this(new OID(BASE_DATA_OBJECT_TYPE, id)); + } + + public Orga2OrgaUnit(OID id) { + super(id); + } + + public Orga2OrgaUnit(DataObject obj) { + super(obj); + } + + public Orga2OrgaUnit(String type) { + super(type); + } + + public GenericOrganization getUnitOwner() { + DataObject obj = (DataObject) get(UNITOWNER); + if (obj == null) { + return null; + } else { + return (GenericOrganization) DomainObjectFactory.newInstance(obj); + } + } + + public void setUnitOwner(GenericOrganization orga) { + Assert.exists(orga, GenericOrganization.class); + setAssociation(UNITOWNER, orga); + } + + public OrganizationalUnit getTargetItem() { + DataObject object = (DataObject) get(TARGETITEM); + return (OrganizationalUnit) DomainObjectFactory.newInstance(object); + } + + public void setTargetItem(OrganizationalUnit unit) { + setAssociation(TARGETITEM, unit); + } + + public Integer getOrder() { + return (Integer) get(UNITORDER); + } + + public void setOrder(Integer order) { + Assert.exists(order); + set(UNITORDER, order); + } + + public String getURI(PageState s) { + OrganizationalUnit unit = getTargetItem(); + + if(unit == null) { + logger.error(getOID() + "is a link between an organization and an organizational unit, but the associated organizational unit is null"); + return ""; + } + + ContentSection section = unit.getContentSection(); + ItemResolver resolver = section.getItemResolver(); + String url = resolver.generateItemURL(s, unit, section, unit.getVersion()); + + return URL.there(s.getRequest(), url).toString(); + } + + public static DataCollection getReferingUnits(OrganizationalUnit unit) { + Session session = SessionManager.getSession(); + DataCollection units = session.retrieve(BASE_DATA_OBJECT_TYPE); + Filter filter = units.addInSubqueryFilter("id", "com.arsdigita.cms.contenttypes.getReferingUnits"); + filter.set("itemID", unit.getID()); + + return units; + } + + public static DataCollection getUnits(GenericOrganization orga) { + Session session = SessionManager.getSession(); + DataCollection units = session.retrieve(BASE_DATA_OBJECT_TYPE); + units.addEqualsFilter(UNITOWNER + ".id", orga.getID()); + units.addOrder(UNITORDER); + return units; + } + + public void swapWithNext() { + swapWithNext("com.arsdigita.cms.contenttypes.allUnitsOrderForOrganization", "com.arsdigita.cms.contenttypes.swapOrga2OrgaUnitWithNextInGroup"); + } + + public void swapWithPrevious() { + swapWithPrevious("com.arsdigita.cms.contenttypes.allUnitsOrderForOrganization", "com.arsdigita.cms.contenttypes.swapOrga2OrgaUnitWithNextInGroup"); + } + + public void swapWithNext(String queryName, String operationName) { + swapKeys(true, queryName, operationName); + } + + public void swapWithPrevious(String queryName, String operationName) { + swapKeys(false, queryName, operationName); + } + + protected DataQuery getSwapQuery(String queryName) { + DataQuery query = SessionManager.getSession().retrieve(queryName); + query.setParameter("ownerID", getUnitOwner().getID()); + return query; + } + + protected DataOperation getSwapOperation(String operationName) { + DataOperation operation = SessionManager.getSession().retrieveDataOperation(operationName); + operation.setParameter("ownerID", getUnitOwner().getID()); + return operation; + } + + protected void swapKeys(boolean swapNext, String queryName, String operationName) { + + String methodName = null; + if (swapNext) { + methodName = "swapWithNext"; + } else { + methodName = "swapWithPrevious"; + } + + Assert.isTrue(!isNew(), methodName + " cannot be called on an object that is new"); + + Integer currentKey = (Integer) get(UNITORDER); + + if(currentKey == null) { + alphabetize(); + return; + } + + Assert.isTrue(currentKey != null, methodName + " cannot be " + + "called on an object that is not currently in the " + + "list"); + + int key = currentKey.intValue(); + + DataQuery query = getSwapQuery(queryName); + + int otherKey; + if(swapNext) { + otherKey = key + 1; + query.addOrder("unitOrder ASC"); + query.addFilter(query.getFilterFactory().greaterThan("unitOrder", currentKey, true)); + } else { + otherKey = key - 1; + query.addOrder("unitOrder DESC"); + query.addFilter(query.getFilterFactory().lessThan("unitOrder", currentKey, true)); + } + + if(query.next()) { + otherKey = ((Integer) query.get("unitOrder")).intValue(); + query.close(); + } + + DataOperation operation = getSwapOperation(operationName); + operation.setParameter("unitOrder", new Integer(key)); + operation.setParameter("nextUnitOrder", new Integer(otherKey)); + operation.execute(); + } + + protected void alphabetize() { + Session session = SessionManager.getSession(); + DataCollection units = session.retrieve(BASE_DATA_OBJECT_TYPE); + units.addEqualsFilter(UNITOWNER + ".id", getUnitOwner().getID()); + int sortkey = 0; + while (units.next()) { + sortkey++; + Orga2OrgaUnit o2ou = new Orga2OrgaUnit(units.getDataObject()); + o2ou.setOrder(sortkey); + o2ou.save(); + } + } + + public int maxOrder() { + GenericOrganization unitOwner = getUnitOwner(); + if (unitOwner == null) { + return 0; + } + + int returnOrder = 0; + DataQuery query = SessionManager.getSession().retrieveQuery("com.arsdigita.cms.contenttypes.allUnitsOrderForOrganization"); + query.setParameter("ownerID", getUnitOwner().getID()); + query.addOrder("unitOrder DESC"); + if(query.next()) { + Integer unitOrder = ((Integer) query.get("unitOrder")); + query.close(); + if(unitOrder != null) { + returnOrder = unitOrder.intValue(); + } + } + + return returnOrder; + } + + @Override + public void beforeSave() { + super.beforeSave(); + if (getOrder() == null) { + setOrder(maxOrder() + 1); + } + } +} diff --git a/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitPropertiesStep.java b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitPropertiesStep.java new file mode 100644 index 000000000..a2259223d --- /dev/null +++ b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitPropertiesStep.java @@ -0,0 +1,70 @@ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.Component; +import com.arsdigita.bebop.Form; +import com.arsdigita.bebop.FormSection; +import com.arsdigita.bebop.Page; +import com.arsdigita.bebop.SimpleContainer; +import com.arsdigita.bebop.parameters.BigDecimalParameter; +import com.arsdigita.cms.ItemSelectionModel; +import com.arsdigita.cms.ui.authoring.AuthoringKitWizard; +import com.arsdigita.cms.ui.workflow.WorkflowLockedContainer; +import java.math.BigDecimal; + +/** + * + * @author Jens Pelzetter + */ +public class Orga2OrgaUnitPropertiesStep extends ResettableContainer { + + private AuthoringKitWizard m_parent; + private ItemSelectionModel m_itemModel; + private BigDecimalParameter m_o2ouParam = new BigDecimalParameter(("orga2orgaunit")); + private Orga2OrgaUnitSelectionModel m_o2ouModel = new Orga2OrgaUnitSelectionModel(m_o2ouParam); + + public Orga2OrgaUnitPropertiesStep(ItemSelectionModel itemModel, AuthoringKitWizard parent) { + this.m_itemModel = itemModel; + this.m_parent = parent; + setOrga2OrgaUnitSelectionModel(); + add(getDisplayComponent()); + + Form form = new Form("orga2OrgaUnitEditForm"); + form.add(getEditSheet()); + + WorkflowLockedContainer edit = new WorkflowLockedContainer(itemModel); + edit.add(form); + add(edit); + } + + protected void setOrga2OrgaUnitSelectionModel() { + setOrga2OrgaUnitSelectionModel(new Orga2OrgaUnitSelectionModel(m_o2ouParam)); + } + + protected void setOrga2OrgaUnitSelectionModel(Orga2OrgaUnitSelectionModel model) { + this.m_o2ouModel = model; + } + + protected Orga2OrgaUnitSelectionModel getOrga2OrgaUnitSelectionModel() { + return this.m_o2ouModel; + } + + protected BigDecimalParameter getO2OUParam() { + return this.m_o2ouParam; + } + + public Component getDisplayComponent() { + SimpleContainer container = new SimpleContainer(); + container.add(new Orga2OrgaUnitTable(m_itemModel, m_o2ouModel)); + return container; + } + + public FormSection getEditSheet() { + return new Orga2OrgaUnitPropertyForm(this.m_itemModel, this.m_o2ouModel); + } + + @Override + public void register(Page p) { + super.register(p); + p.addComponentStateParam(this, m_o2ouParam); + } +} diff --git a/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitPropertyForm.java b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitPropertyForm.java new file mode 100644 index 000000000..579a1d607 --- /dev/null +++ b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitPropertyForm.java @@ -0,0 +1,174 @@ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.ColumnPanel; +import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.FormProcessException; +import com.arsdigita.bebop.FormSection; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.SaveCancelSection; +import com.arsdigita.bebop.event.FormInitListener; +import com.arsdigita.bebop.event.FormProcessListener; +import com.arsdigita.bebop.event.FormSectionEvent; +import com.arsdigita.bebop.event.FormSubmissionListener; +import com.arsdigita.bebop.event.FormValidationListener; +import com.arsdigita.bebop.event.PrintEvent; +import com.arsdigita.bebop.event.PrintListener; +import com.arsdigita.bebop.form.Submit; +import com.arsdigita.cms.ContentType; +import com.arsdigita.cms.ItemSelectionModel; +import com.arsdigita.cms.contenttypes.GenericOrganization; +import com.arsdigita.cms.contenttypes.Orga2OrgaUnit; +import com.arsdigita.cms.contenttypes.OrganizationalUnit; +import com.arsdigita.cms.ui.ItemSearchWidget; +import com.arsdigita.util.Assert; +import com.arsdigita.util.UncheckedWrapperException; +import org.apache.log4j.Logger; + +/** + * + * @author Jens Pelzetter + */ +public class Orga2OrgaUnitPropertyForm extends FormSection implements FormInitListener, FormProcessListener, FormValidationListener, FormSubmissionListener { + + private final static Logger logger = Logger.getLogger(Orga2OrgaUnitPropertyForm.class); + public final static String ID = "orga2orgaunit_edit"; + private ItemSelectionModel m_itemModel; + private Orga2OrgaUnitSelectionModel m_o2ouModel; + private ItemSearchWidget m_itemSearch; + private SaveCancelSection m_saveCancelSection; + private final String ITEM_SEARCH = "orga2OrgaUnit"; + + public Orga2OrgaUnitPropertyForm(ItemSelectionModel itemModel, Orga2OrgaUnitSelectionModel o2ouModel) { + super(new ColumnPanel(2)); + this.m_itemModel = itemModel; + this.m_o2ouModel = o2ouModel; + + addWidgets(); + addSaveCancelSection(); + + addInitListener(this); + addValidationListener(this); + addProcessListener(this); + addSubmissionListener(this); + } + + protected void addWidgets() { + add(new Label("OrganizationalUnit")); + this.m_itemSearch = new ItemSearchWidget(ITEM_SEARCH, ContentType.findByAssociatedObjectType("com.arsdigita.cms.contenttypes.OrganizationalUnit")); + add(this.m_itemSearch); + } + + public void addSaveCancelSection() { + this.m_saveCancelSection = new SaveCancelSection(); + try { + this.m_saveCancelSection.getCancelButton().addPrintListener(new PrintListener() { + + public void prepare(PrintEvent e) { + Submit target = (Submit) e.getTarget(); + if (m_o2ouModel.isSelected(e.getPageState())) { + target.setButtonLabel("Cancel"); + } else { + target.setButtonLabel("Reset"); + } + } + }); + + this.m_saveCancelSection.getSaveButton().addPrintListener(new PrintListener() { + + public void prepare(PrintEvent e) { + Submit target = (Submit) e.getTarget(); + if (m_o2ouModel.isSelected(e.getPageState())) { + target.setButtonLabel("Save"); + } else { + target.setButtonLabel("Create"); + } + } + }); + } catch (Exception ex) { + throw new UncheckedWrapperException("this cannot happen", ex); + } + add(m_saveCancelSection, ColumnPanel.FULL_WIDTH); + } + + public SaveCancelSection getSaveCancelSection() { + return this.m_saveCancelSection; + } + + protected Orga2OrgaUnitSelectionModel getO2OUSelectionModel() { + return this.m_o2ouModel; + } + + protected GenericOrganization getOrganization(PageState s) { + return (GenericOrganization) m_itemModel.getSelectedItem(s); + } + + protected Orga2OrgaUnit createOrga2OrgaUnit(PageState s) { + GenericOrganization orga = this.getOrganization(s); + Assert.exists(orga); + Orga2OrgaUnit o2ou = new Orga2OrgaUnit(); + o2ou.setUnitOwner(orga); + return o2ou; + } + + protected void setOrga2OrgaUnitProperties(Orga2OrgaUnit o2ou, FormSectionEvent e) { + PageState state = e.getPageState(); + FormData data = e.getFormData(); + + o2ou.setTargetItem((OrganizationalUnit) data.get(ITEM_SEARCH)); + + o2ou.save(); + } + + public void init(FormSectionEvent e) throws FormProcessException { + FormData data = e.getFormData(); + PageState state = e.getPageState(); + + setVisible(state, true); + + Orga2OrgaUnit o2ou; + if (m_o2ouModel.isSelected(state)) { + o2ou = m_o2ouModel.getSelectedO2OU(state); + try { + data.put(ITEM_SEARCH, o2ou.getTargetItem()); + } catch (IllegalStateException ex) { + throw ex; + } + } else { + data.put(ITEM_SEARCH, null); + } + } + + public void process(FormSectionEvent e) throws FormProcessException { + PageState state = e.getPageState(); + Orga2OrgaUnit o2ou; + + if (this.getSaveCancelSection().getCancelButton().isSelected(state)) { + this.m_o2ouModel.clearSelection(state); + } else { + if (this.m_o2ouModel.isSelected(state)) { + o2ou = m_o2ouModel.getSelectedO2OU(state); + } else { + o2ou = createOrga2OrgaUnit(state); + } + setOrga2OrgaUnitProperties(o2ou, e); + } + + m_o2ouModel.clearSelection(state); + init(e); + } + + public void validate(FormSectionEvent e) throws FormProcessException { + if (e.getFormData().get(ITEM_SEARCH) == null) { + throw new FormProcessException("OrganiztionalUnit selection is required"); + } + } + + public void submitted(FormSectionEvent e) throws FormProcessException { + if (this.m_saveCancelSection.getCancelButton().isSelected(e.getPageState())) { + m_o2ouModel.clearSelection(e.getPageState()); + init(e); + throw new FormProcessException("cancelled"); + } + } +} \ No newline at end of file diff --git a/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitSelectionModel.java b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitSelectionModel.java new file mode 100644 index 000000000..ddab79e21 --- /dev/null +++ b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitSelectionModel.java @@ -0,0 +1,25 @@ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.parameters.BigDecimalParameter; +import com.arsdigita.cms.contenttypes.Orga2OrgaUnit; +import com.arsdigita.kernel.ui.ACSObjectSelectionModel; + +/** + * + * @author Jens Pelzetter + */ +public class Orga2OrgaUnitSelectionModel extends ACSObjectSelectionModel { + + public Orga2OrgaUnitSelectionModel(BigDecimalParameter param) { + super(Orga2OrgaUnit.class.getName(), Orga2OrgaUnit.BASE_DATA_OBJECT_TYPE, param); + } + + public Orga2OrgaUnitSelectionModel(String itemClass, String objectType, BigDecimalParameter param) { + super(itemClass, objectType, param); + } + + public Orga2OrgaUnit getSelectedO2OU(PageState s) { + return (Orga2OrgaUnit) getSelectedObject(s); + } +} diff --git a/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitTable.java b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitTable.java new file mode 100644 index 000000000..8dd94fb6d --- /dev/null +++ b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitTable.java @@ -0,0 +1,191 @@ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.Component; +import com.arsdigita.bebop.ControlLink; +import com.arsdigita.bebop.ExternalLink; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.RequestLocal; +import com.arsdigita.bebop.Table; +import com.arsdigita.bebop.event.TableActionEvent; +import com.arsdigita.bebop.event.TableActionListener; +import com.arsdigita.bebop.table.TableCellRenderer; +import com.arsdigita.bebop.table.TableColumn; +import com.arsdigita.bebop.table.TableColumnModel; +import com.arsdigita.cms.ContentItem; +import com.arsdigita.cms.ItemSelectionModel; +import com.arsdigita.cms.SecurityManager; +import com.arsdigita.cms.contenttypes.Orga2OrgaUnit; +import com.arsdigita.cms.dispatcher.Utilities; +import com.arsdigita.domain.DataObjectNotFoundException; +import com.arsdigita.domain.DomainObjectFactory; +import com.arsdigita.persistence.OID; +import com.arsdigita.util.Assert; +import com.arsdigita.util.UncheckedWrapperException; +import java.math.BigDecimal; +import org.apache.log4j.Logger; + +/** + * + * @author Jens Pelzetter + */ +public class Orga2OrgaUnitTable extends Table { + + private final static Logger logger = Logger.getLogger(Orga2OrgaUnitTable.class); + private Orga2OrgaUnitSelectionModel m_o2ouModel; + private ItemSelectionModel m_itemModel; + private TableColumn m_orgaUnitCol; + private TableColumn m_moveUpCol; + private TableColumn m_moveDownCol; + private TableColumn m_editCol; + private TableColumn m_delCol; + private RequestLocal m_size; + private RequestLocal m_editor; + protected final static String EDIT_EVENT = "Edit"; + protected final static String DELETE_EVENT = "Delete"; + protected final static String UP_EVENT = "up"; + protected final static String DOWN_EVENT = "down"; + + public Orga2OrgaUnitTable(ItemSelectionModel itemModel, Orga2OrgaUnitSelectionModel o2ouModel) { + super(); + this.m_itemModel = itemModel; + this.m_o2ouModel = o2ouModel; + addColumns(); + + m_size = new RequestLocal(); + m_editor = new RequestLocal() { + + @Override + public Object initialValue(PageState s) { + SecurityManager sm = Utilities.getSecurityManager(s); + ContentItem item = m_itemModel.getSelectedItem(s); + Boolean val = new Boolean(sm.canAccess(s.getRequest(), SecurityManager.EDIT_ITEM, item)); + return val; + } + }; + + Label empty = new Label("There are no organizational units for this organization."); + setEmptyView(empty); + addTableActionListener(new Orga2OrgaUnitTableActionListener()); + setRowSelectionModel(m_o2ouModel); + setDefaultCellRenderer(new Orga2OrgaUnitTableRenderer()); + setModelBuilder(new Orga2OrgaUnitTableModelBuilder(itemModel)); + } + + public void addColumns() { + TableColumnModel model = getColumnModel(); + int i = 0; + this.m_orgaUnitCol = new TableColumn(i, "Organizational Unit"); + this.m_editCol = new TableColumn(++i, "Edit"); + model.add(this.m_delCol); + model.add(this.m_moveUpCol); + model.add(this.m_moveDownCol); + setColumnModel(model); + } + + private class Orga2OrgaUnitTableRenderer implements TableCellRenderer { + + public Component getComponent(Table table, PageState state, Object value, boolean isSelected, Object key, int row, int column) { + Orga2OrgaUnit o2ou = (Orga2OrgaUnit) value; + boolean isFirst = (row == 0); + if (m_size.get(state) == null) { + m_size.set(state, new Long(((Orga2OrgaUnitTableModelBuilder.Orga2OrgaUnitTableModel) table.getTableModel(state)).size())); + } + boolean isLast = (row == ((Long) m_size.get(state)).intValue() - 1); + + String url = o2ou.getURI(state); + if (column == m_orgaUnitCol.getModelIndex()) { + ExternalLink extLink = new ExternalLink(o2ou.getTargetItem().getOrganizationalUnitName(), url); + return extLink; + } else if (column == m_editCol.getModelIndex()) { + if (Boolean.TRUE.equals(m_editor.get(state))) { + if (isSelected) { + return new Label(EDIT_EVENT, Label.BOLD); + } else { + return new ControlLink(EDIT_EVENT); + } + } else { + return new Label(EDIT_EVENT); + } + } else if (column == m_delCol.getModelIndex()) { + if (Boolean.TRUE.equals(m_editor.get(state))) { + return new ControlLink(DELETE_EVENT); + } else { + return new Label(DELETE_EVENT); + } + } else if (column == m_moveUpCol.getModelIndex()) { + if (Boolean.TRUE.equals(m_editor.get(state)) && !isFirst) { + Label downLabel = new Label(UP_EVENT); + downLabel.setClassAttr("linkSort"); + return new ControlLink(downLabel); + } else { + return new Label(""); + } + } else if (column == m_moveDownCol.getModelIndex()) { + if (Boolean.TRUE.equals(m_editor.get(state)) && !isLast) { + Label downLabel = new Label(DOWN_EVENT); + downLabel.setClassAttr("linkSort"); + return new ControlLink(downLabel); + } else { + return new Label(""); + } + } else { + throw new UncheckedWrapperException("column out of bounds"); + } + } + } + + private class Orga2OrgaUnitTableActionListener implements TableActionListener { + + private Orga2OrgaUnit getOrga2OrgaUnit(TableActionEvent e) { + Object o = e.getRowKey(); + BigDecimal id; + if (o instanceof String) { + id = new BigDecimal((String) o); + } else { + id = (BigDecimal) e.getRowKey(); + } + + Assert.exists(id); + Orga2OrgaUnit o2ou; + try { + o2ou = (Orga2OrgaUnit) DomainObjectFactory.newInstance(new OID(Orga2OrgaUnit.BASE_DATA_OBJECT_TYPE, id)); + } catch (DataObjectNotFoundException ex) { + throw new UncheckedWrapperException(ex); + } + return o2ou; + } + + public void cellSelected(TableActionEvent e) { + int col = e.getColumn().intValue(); + PageState state = e.getPageState(); + Orga2OrgaUnit o2ou = getOrga2OrgaUnit(e); + Assert.exists(o2ou); + + if (col == m_editCol.getModelIndex()) { + if (Boolean.TRUE.equals(m_editor.get(state))) { + m_o2ouModel.setSelectedObject(state, o2ou); + } + } else if (col == m_delCol.getModelIndex()) { + if (Boolean.TRUE.equals(m_editor.get(state))) { + try { + m_o2ouModel.clearSelection(state); + o2ou.delete(); + } catch (Exception ex) { + throw new UncheckedWrapperException(ex); + } + } + } else if (col == m_moveUpCol.getModelIndex()) { + m_o2ouModel.clearSelection(state); + o2ou.swapWithPrevious(); + } else if (col == m_moveDownCol.getModelIndex()) { + m_o2ouModel.clearSelection(state); + o2ou.swapWithNext(); + } + + } + + public void headSelected(TableActionEvent e) { + } + } +} \ No newline at end of file diff --git a/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitTableModelBuilder.java b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitTableModelBuilder.java new file mode 100644 index 000000000..0fa8598ff --- /dev/null +++ b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/Orga2OrgaUnitTableModelBuilder.java @@ -0,0 +1,82 @@ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.Table; +import com.arsdigita.bebop.table.TableModel; +import com.arsdigita.bebop.table.TableModelBuilder; +import com.arsdigita.cms.ItemSelectionModel; +import com.arsdigita.cms.contenttypes.GenericOrganization; +import com.arsdigita.cms.contenttypes.Orga2OrgaUnit; +import com.arsdigita.domain.DomainObjectFactory; +import com.arsdigita.persistence.DataCollection; +import com.arsdigita.persistence.DataObject; +import com.arsdigita.util.Assert; +import com.arsdigita.util.LockableImpl; +import org.apache.log4j.Logger; + +/** + * + * @author Jens Pelzetter + */ +public class Orga2OrgaUnitTableModelBuilder extends LockableImpl implements TableModelBuilder { + + private final static Logger logger = Logger.getLogger(Orga2OrgaUnitTableModelBuilder.class); + private ItemSelectionModel m_itemModel; + + public Orga2OrgaUnitTableModelBuilder(ItemSelectionModel itemModel) { + this.m_itemModel = itemModel; + } + + public TableModel makeModel(Table t, PageState s) { + DataCollection units = getUnits(s); + + if (units.isEmpty()) { + return Table.EMPTY_MODEL; + } else { + return new Orga2OrgaUnitTableModel(units); + } + } + + public DataCollection getUnits(PageState s) { + Assert.isTrue(this.m_itemModel.isSelected(s), "item selected"); + GenericOrganization orga = (GenericOrganization) this.m_itemModel.getSelectedItem(s); + return Orga2OrgaUnit.getUnits(orga); + } + + public static class Orga2OrgaUnitTableModel implements TableModel { + + Orga2OrgaUnit m_o2ou; + DataCollection m_units; + + public Orga2OrgaUnitTableModel(DataCollection units) { + m_units = units; + m_o2ou = null; + } + + public int getColumnCount() { + return (int) m_units.size(); + } + + public boolean nextRow() { + if (m_units.next()) { + DataObject obj = m_units.getDataObject(); + m_o2ou = (Orga2OrgaUnit) DomainObjectFactory.newInstance(obj); + return true; + } else { + return false; + } + } + + public Object getElementAt(int columnIndex) { + return m_o2ou; + } + + public Object getKeyAt(int columnIndex) { + return m_o2ou.getID(); + } + + public long size() { + return m_units.size(); + } + } +} \ No newline at end of file diff --git a/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/OrganizationRoleTable.java b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/OrganizationRoleTable.java index 12084ffca..b1f1b04fa 100644 --- a/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/OrganizationRoleTable.java +++ b/ccm-cms-types-genericorganization/src/com/arsdigita/cms/contenttypes/ui/OrganizationRoleTable.java @@ -186,7 +186,7 @@ public class OrganizationRoleTable extends Table { try { role = (OrganizationRole)DomainObjectFactory.newInstance(new OID(OrganizationRole.BASE_DATA_OBJECT_TYPE, id)); } catch(DataObjectNotFoundException ex) { - throw new UncheckedWrapperException(e); + throw new UncheckedWrapperException(ex); } return role; } diff --git a/ccm-cms-types-organizationalunit/src/WEB-INF/content-types/com/arsdigita/cms/contenttypes/OrganizationalUnit.xml b/ccm-cms-types-organizationalunit/src/WEB-INF/content-types/com/arsdigita/cms/contenttypes/OrganizationalUnit.xml index 00498128e..96110662d 100644 --- a/ccm-cms-types-organizationalunit/src/WEB-INF/content-types/com/arsdigita/cms/contenttypes/OrganizationalUnit.xml +++ b/ccm-cms-types-organizationalunit/src/WEB-INF/content-types/com/arsdigita/cms/contenttypes/OrganizationalUnit.xml @@ -18,6 +18,7 @@ component="com.arsdigita.cms.contenttypes.ui.OrganizationalUnitPropertiesStep" ordering="1"/> + diff --git a/ccm-cms-types-organizationalunit/src/ccm-cms-types-organizationalunit.load b/ccm-cms-types-organizationalunit/src/ccm-cms-types-organizationalunit.load index ba5755a63..5696a7181 100644 --- a/ccm-cms-types-organizationalunit/src/ccm-cms-types-organizationalunit.load +++ b/ccm-cms-types-organizationalunit/src/ccm-cms-types-organizationalunit.load @@ -3,7 +3,6 @@
-
diff --git a/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/OrganizationalUnit.java b/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/OrganizationalUnit.java index cbd534b15..053fc2127 100644 --- a/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/OrganizationalUnit.java +++ b/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/OrganizationalUnit.java @@ -30,8 +30,8 @@ import java.math.BigDecimal; */ public class OrganizationalUnit extends ContentPage { - public final static String ORGANIZATIONALUNIT_NAME = "organizationalunitname"; - public final static String ORGANIZATIONAL_DESCRIPTION = "description"; + public final static String ORGANIZATIONALUNIT_NAME = "organizationalunitName"; + public final static String ORGANIZATIONALUNIT_DESCRIPTION = "organizationalunitDescription"; public final static String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.contenttypes.OrganizationalUnit"; @@ -65,10 +65,10 @@ public class OrganizationalUnit extends ContentPage { } public String getOrganizationalUnitDescription() { - return (String) get(ORGANIZATIONAL_DESCRIPTION); + return (String) get(ORGANIZATIONALUNIT_DESCRIPTION); } public void setOrganizationalUnitDescription(String description) { - set(ORGANIZATIONAL_DESCRIPTION, description); + set(ORGANIZATIONALUNIT_DESCRIPTION, description); } } diff --git a/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/OrganizationalUnitInitializer.java b/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/OrganizationalUnitInitializer.java index 50c338d09..e31ed9771 100644 --- a/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/OrganizationalUnitInitializer.java +++ b/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/OrganizationalUnitInitializer.java @@ -34,7 +34,7 @@ public class OrganizationalUnitInitializer extends ContentTypeInitializer { } public String getStylesheet() { - return "static/content-types/com/arsdigita/cms/contenttypes/OrganizationalUnit.xml"; + return "static/content-types/com/arsdigita/cms/contenttypes/OrganizationalUnit.xsl"; } @Override diff --git a/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/OrganizationalUnitLoader.java b/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/OrganizationalUnitLoader.java index 2dcda83a7..b88012070 100644 --- a/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/OrganizationalUnitLoader.java +++ b/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/OrganizationalUnitLoader.java @@ -9,7 +9,7 @@ import org.apache.log4j.Logger; public class OrganizationalUnitLoader extends AbstractContentTypeLoader { private final static Logger logger = Logger.getLogger(OrganizationalUnitLoader.class); - private final static String[] TYPES = {"/WEB-INF/content-types/com/arsdigita/cms/contentypes/OrganizationalUnit.xml"}; + private final static String[] TYPES = {"/WEB-INF/content-types/com/arsdigita/cms/contenttypes/OrganizationalUnit.xml"}; public String[] getTypes() { return TYPES; diff --git a/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/ui/OrganizationalUnitPropertiesStep.java b/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/ui/OrganizationalUnitPropertiesStep.java new file mode 100644 index 000000000..ed62b4fb7 --- /dev/null +++ b/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/ui/OrganizationalUnitPropertiesStep.java @@ -0,0 +1,62 @@ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.Component; +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.util.GlobalizationUtil; +import com.arsdigita.cms.ContentPage; +import com.arsdigita.cms.ContentSection; +import com.arsdigita.cms.ItemSelectionModel; +import com.arsdigita.cms.contenttypes.OrganizationalUnit; +import com.arsdigita.cms.ui.authoring.AuthoringKitWizard; +import com.arsdigita.cms.ui.authoring.BasicPageForm; +import com.arsdigita.cms.ui.authoring.SimpleEditStep; +import com.arsdigita.cms.ui.workflow.WorkflowLockedComponentAccess; +import com.arsdigita.domain.DomainObject; +import com.arsdigita.toolbox.ui.DomainObjectPropertySheet; +import java.text.DateFormat; +import org.apache.log4j.Logger; + +/** + * + * @author Jens Pelzetter + */ +public class OrganizationalUnitPropertiesStep extends SimpleEditStep { + + private final static Logger logger = Logger.getLogger(OrganizationalUnitPropertiesStep.class); + public final static String EDIT_SHEET_NAME = "edit"; + + public OrganizationalUnitPropertiesStep(ItemSelectionModel itemModel, AuthoringKitWizard parent) { + super(itemModel, parent); + + setDefaultEditKey(EDIT_SHEET_NAME); + BasicPageForm editSheet; + + editSheet = new OrganizationalUnitPropertyForm(itemModel, this); + add(EDIT_SHEET_NAME, "Edit", new WorkflowLockedComponentAccess(editSheet, itemModel), editSheet.getSaveCancelSection().getCancelButton()); + + setDisplayComponent(getOrganizationalUnitPropertySheet(itemModel)); + } + + public static Component getOrganizationalUnitPropertySheet(ItemSelectionModel itemModel) { + DomainObjectPropertySheet sheet = new DomainObjectPropertySheet(itemModel); + + sheet.add(GlobalizationUtil.globalize("cms.contenttypes.ui.organizatialunit.unitname"), OrganizationalUnit.ORGANIZATIONALUNIT_NAME); + sheet.add(GlobalizationUtil.globalize("cms.contenttypes.ui.organizatialunit.unitdescription"), OrganizationalUnit.ORGANIZATIONALUNIT_DESCRIPTION); + + if (!ContentSection.getConfig().getHideLaunchDate()) { + sheet.add(GlobalizationUtil.globalize("cms.ui.authoring.page_launch_date"), ContentPage.LAUNCH_DATE, new DomainObjectPropertySheet.AttributeFormatter() { + + public String format(DomainObject obj, String attribute, PageState state) { + ContentPage page = (ContentPage) obj; + if (page.getLaunchDate() != null) { + return DateFormat.getDateInstance(DateFormat.LONG).format(page.getLaunchDate()); + } else { + return (String) GlobalizationUtil.globalize("cms.ui.unknown").localize(); + } + } + }); + } + + return sheet; + } +} \ No newline at end of file diff --git a/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/ui/OrganizationalUnitPropertyForm.java b/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/ui/OrganizationalUnitPropertyForm.java new file mode 100644 index 000000000..a033dc331 --- /dev/null +++ b/ccm-cms-types-organizationalunit/src/com/arsdigita/cms/contenttypes/ui/OrganizationalUnitPropertyForm.java @@ -0,0 +1,94 @@ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.FormData; +import com.arsdigita.bebop.FormProcessException; +import com.arsdigita.bebop.Label; +import com.arsdigita.bebop.event.FormInitListener; +import com.arsdigita.bebop.event.FormProcessListener; +import com.arsdigita.bebop.event.FormSectionEvent; +import com.arsdigita.bebop.event.FormSubmissionListener; +import com.arsdigita.bebop.form.TextArea; +import com.arsdigita.bebop.form.TextField; +import com.arsdigita.bebop.parameters.NotNullValidationListener; +import com.arsdigita.bebop.parameters.ParameterModel; +import com.arsdigita.bebop.parameters.StringParameter; +import com.arsdigita.bebop.util.GlobalizationUtil; +import com.arsdigita.cms.ItemSelectionModel; +import com.arsdigita.cms.contenttypes.OrganizationalUnit; +import com.arsdigita.cms.ui.authoring.BasicPageForm; +import org.apache.log4j.Logger; + +/** + * + * @author Jens Pelzetter + */ +public class OrganizationalUnitPropertyForm extends BasicPageForm implements FormProcessListener, FormInitListener, FormSubmissionListener { + + private final static Logger logger = Logger.getLogger(OrganizationalUnitPropertyForm.class); + private OrganizationalUnitPropertiesStep m_step; + public final static String ORGANIZATIONALUNIT_NAME = OrganizationalUnit.ORGANIZATIONALUNIT_NAME; + public final static String ORGANIZATIONALUNIT_DESCRIPTION = OrganizationalUnit.ORGANIZATIONALUNIT_DESCRIPTION; + public final static String ID = "OrganizationalUnit_edit"; + + public OrganizationalUnitPropertyForm(ItemSelectionModel itemModel) { + this(itemModel, null); + } + + public OrganizationalUnitPropertyForm(ItemSelectionModel itemModel, OrganizationalUnitPropertiesStep step) { + super(ID, itemModel); + this.m_step = step; + addSubmissionListener(this); + } + + @Override + public void addWidgets() { + super.addWidgets(); + + add(new Label(GlobalizationUtil.globalize("cms.contenttypes.organizationalunit.ui.unitname"))); + ParameterModel orgaUnitNameParam = new StringParameter(ORGANIZATIONALUNIT_NAME); + TextField orgaUnitName = new TextField(orgaUnitNameParam); + orgaUnitName.addValidationListener(new NotNullValidationListener()); + add(orgaUnitName); + + add(new Label(GlobalizationUtil.globalize("cms.contenttypes.organizationalunit.ui.description"))); + TextArea description = new TextArea(ORGANIZATIONALUNIT_DESCRIPTION); + description.setRows(5); + description.setCols(30); + add(description); + } + + @Override + public void init(FormSectionEvent e) throws FormProcessException { + FormData data = e.getFormData(); + OrganizationalUnit orgaUnit = (OrganizationalUnit) super.initBasicWidgets(e); + + data.put(ORGANIZATIONALUNIT_NAME, orgaUnit.getOrganizationalUnitName()); + data.put(ORGANIZATIONALUNIT_DESCRIPTION, orgaUnit.getOrganizationalUnitDescription()); + } + + @Override + public void process(FormSectionEvent e) throws FormProcessException { + FormData data = e.getFormData(); + + OrganizationalUnit orgaUnit = (OrganizationalUnit) super.processBasicWidgets(e); + + if ((orgaUnit != null) && (getSaveCancelSection().getSaveButton().isSelected(e.getPageState()))) { + orgaUnit.setOrganizationalUnitName((String) data.get(ORGANIZATIONALUNIT_NAME)); + orgaUnit.setOrganizationalUnitDescription((String) data.get(ORGANIZATIONALUNIT_DESCRIPTION)); + + orgaUnit.save(); + } + + if (this.m_step != null) { + this.m_step.maybeForwardToNextStep(e.getPageState()); + } + + } + + public void submitted(FormSectionEvent e) throws FormProcessException { + if ((this.m_step != null) && + (getSaveCancelSection().getCancelButton().isSelected(e.getPageState()))) { + this.m_step.cancelStreamlinedCreation(e.getPageState()); + } + } +}