diff --git a/ccm-cms-types-researchnetwork/pdl/com/arsdigita/content-types/ResearchNetwork.pdl b/ccm-cms-types-researchnetwork/pdl/com/arsdigita/content-types/ResearchNetwork.pdl index b029d2f80..64af6d364 100644 --- a/ccm-cms-types-researchnetwork/pdl/com/arsdigita/content-types/ResearchNetwork.pdl +++ b/ccm-cms-types-researchnetwork/pdl/com/arsdigita/content-types/ResearchNetwork.pdl @@ -24,7 +24,7 @@ import com.arsdigita.cms.ContentPage; import com.arsdigita.cms.DomainObject; object type type ResearchNetwork extends ContentPage { - String[0..1] researchNetworkTitle = ct_researchNetworks.researchnetwork_title VARCHAR(512); + String[1..1] researchNetworkTitle = ct_researchNetworks.researchnetwork_title VARCHAR(512); String[0..1] researchNetworkDirection = ct_researchnetwork.researchnetwork_direction VARCHAR(1024); String[0..1] researchNetworkCoordination = ct_researchnetwork.researchnetwork_coordination VARCHAR(1024); String[0..1] researchNetworkDescription = ct_researchnetwork.researchnetwork_description VARCHAR(4096); diff --git a/ccm-cms-types-researchnetwork/pdl/com/arsdigita/content-types/ResearchNetworkMembers.pdl b/ccm-cms-types-researchnetwork/pdl/com/arsdigita/content-types/ResearchNetworkMembers.pdl index d7496ed7d..66e28c5a2 100644 --- a/ccm-cms-types-researchnetwork/pdl/com/arsdigita/content-types/ResearchNetworkMembers.pdl +++ b/ccm-cms-types-researchnetwork/pdl/com/arsdigita/content-types/ResearchNetworkMembers.pdl @@ -20,24 +20,24 @@ model com.arsdigita.cms.contenttypes; import com.arsdigita.cms.ContentItem; import com.arsdigita.kernel.ACSObject; -object type ResearchNetworkMembers extends ACSObject { - Person[0..1] targetItem = join ct_researchnetworkmembers_target_item_id to ct_persons.person_id; +object type ResearchNetworkMembership extends ACSObject { + Person[0..1] targetItem = join ct_researchnetworkmemberships_target_item_id to ct_persons.person_id; - reference key(ct_researchnetworkmembers.member_id); - aggressive load (memberOwner.id); + reference key(ct_researchnetworkmemberships.membership_id); + aggressive load (membershipOwner.id); } association { - composite ResearchNetwork[0..1] memberOwner = join ct_researchnetworkmembers.owner_id to ct_researchnetworks_researchnetwork_id; - composite ResearchNetworkMembers[0..n] members = join ct_researchnetworks.researchnetwork.id to ct_researchnetworkmembers.owner_id; + composite ResearchNetwork[0..1] membershipOwner = join ct_researchnetworkmemberships.owner_id to ct_researchnetworks_researchnetwork_id; + composite ResearchNetworkMembers[0..n] members = join ct_researchnetworks.researchnetwork.id to ct_researchnetworkmemberships.owner_id; } -query getResearchNetworkMemberReferingToResearchNetworks { +query getResearchNetworkMembershipsReferingToResearchNetworks { BigDecimal id; do { - select m.member_id from ResearchNetworkMembers m where m.target_item_id = :itemID; + select m.member_id from ResearchNetworkMemberships m where m.target_item_id = :itemID; } map { - id = m.researchnetworkmember_id; + id = m.membership_id; } } \ No newline at end of file diff --git a/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ResearchNetwork.java b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ResearchNetwork.java index 449e9882a..8d04ee3b7 100644 --- a/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ResearchNetwork.java +++ b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ResearchNetwork.java @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ -package src.com.arsdigita.cms.contenttypes; +package com.arsdigita.cms.contenttypes; import com.arsdigita.cms.ContentPage; import com.arsdigita.domain.DataObjectNotFoundException; diff --git a/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ResearchNetworkInitializer.java b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ResearchNetworkInitializer.java new file mode 100644 index 000000000..e249c726f --- /dev/null +++ b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ResearchNetworkInitializer.java @@ -0,0 +1,26 @@ +package com.arsdigita.cms.contenttypes; + +import com.arsdigita.runtime.LegacyInitEvent; +import org.apache.log4j.Logger; + +/** + * + * @author Jens Pelzetter + */ +public class ResearchNetworkInitializer extends ContentTypeInitializer { + + private static final Logger s_log = Logger.getLogger(ResearchNetworkInitializer.class); + + public ResearchNetworkInitializer() { + super("ccm-cms-types-researchnetwork.pdl.mf", ResearchNetwork.BASE_DATA_OBJECT_TYPE); + } + + public String getStylesheet() { + return "static/content-types/com/arsdigita/cms/contenttypes/ResearchNetwork.xsl"; + } + + @Override + public void init(LegacyInitEvent evt) { + super.init(evt); + } +} diff --git a/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ResearchNetworkLoader.java b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ResearchNetworkLoader.java new file mode 100644 index 000000000..50d08c8a7 --- /dev/null +++ b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ResearchNetworkLoader.java @@ -0,0 +1,23 @@ +package com.arsdigita.cms.contenttypes; + +import org.apache.log4j.Logger; + +/** + * + * @author Jens Pelzetter + */ +public class ResearchNetworkLoader extends AbstractContentTypeLoader { + + private final static Logger s_log = Logger.getLogger(ResearchNetworkLoader.class); + private final static String[] TYPES = {"/WEB-INF/content-types/com/arsdigita/cms/contenttypes/ResearchNetwork.xml"}; + + @Override + protected String[] getTypes() { + return TYPES; + } + + public ResearchNetworkLoader() { + super(); + } + +} diff --git a/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ResearchNetworkMembership.java b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ResearchNetworkMembership.java new file mode 100644 index 000000000..81a2bfefb --- /dev/null +++ b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ResearchNetworkMembership.java @@ -0,0 +1,109 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package 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.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 ResearchNetworkMembership extends ACSObject { + + private static final Logger s_log = Logger.getLogger(ResearchNetwork.class); + public static final String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.contenttypes.ResearchNetworkMember"; + public static final String MEMBER_OWNER = "memberOwner"; + public static final String TARGET_ITEM = "targetItem"; + + public ResearchNetworkMembership() { + super(BASE_DATA_OBJECT_TYPE); + } + + public ResearchNetworkMembership(DataObject obj) { + super(obj); + } + + public ResearchNetworkMembership(BigDecimal id) { + this(new OID(BASE_DATA_OBJECT_TYPE, id)); + } + + public ResearchNetworkMembership(OID oid) { + super(oid); + } + + public ResearchNetworkMembership(String type) { + super(type); + } + + public ResearchNetwork getResearchNetworkMembershipOwner() { + DataObject obj = (DataObject) get(MEMBER_OWNER); + if (obj == null) { + return null; + } else { + return (ResearchNetwork) DomainObjectFactory.newInstance(obj); + } + } + + public void setResearchNetworkMembershipOwner(ResearchNetwork rn) { + Assert.exists(rn, ResearchNetwork.class); + s_log.debug("Setting member owner to " + rn.getResearchNetworkTitle()); + setAssociation(MEMBER_OWNER, rn); + } + + public Person getTargetItem() { + DataObject obj = (DataObject) get(TARGET_ITEM); + return (Person) DomainObjectFactory.newInstance(obj); + } + + public void setTargetItem(Person person) { + Assert.exists(person, Person.class); + setAssociation(TARGET_ITEM, person); + } + + public String getURI(PageState state) { + Person person = this.getTargetItem(); + + if (person == null) { + s_log.error(getOID() + " is a link between a ResearchNetwork and a Person, but the associated person is null"); + return ""; + } + + ContentSection section = person.getContentSection(); + ItemResolver resolver = section.getItemResolver(); + String url = resolver.generateItemURL(state, person, section, person.getVersion()); + + return URL.there(state.getRequest(), url).toString(); + } + + public static DataCollection getReferingPersons(Person person) { + Session session = SessionManager.getSession(); + DataCollection members = session.retrieve(BASE_DATA_OBJECT_TYPE); + Filter filter = members.addInSubqueryFilter("id", "com.arsdigita.cms.contenttypes.getReferingPersons"); + filter.set("itemID", person.getID()); + + return members; + } + + public static DataCollection getMemberships(ResearchNetwork rn) { + Session session = SessionManager.getSession(); + DataCollection dc = session.retrieve(BASE_DATA_OBJECT_TYPE); + dc.addEqualsFilter(MEMBER_OWNER + ".id", rn.getID()); + return dc; + } +} diff --git a/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipPropertiesStep.java b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipPropertiesStep.java new file mode 100644 index 000000000..d9db6b48d --- /dev/null +++ b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipPropertiesStep.java @@ -0,0 +1,74 @@ +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 org.apache.log4j.Logger; + +/** + * + * @author Jens Pelzetter + */ +public class ResearchNetworkMembershipPropertiesStep extends ResettableContainer { + + private static final Logger s_log = Logger.getLogger(ResearchNetworkMembershipPropertiesStep.class); + private AuthoringKitWizard m_parent; + private ItemSelectionModel m_itemModel; + private BigDecimalParameter m_membershipParam = new BigDecimalParameter("membership"); + private ResearchNetworkMembershipSelectionModel m_membershipModel; + + public ResearchNetworkMembershipPropertiesStep(ItemSelectionModel itemModel, AuthoringKitWizard parent) { + s_log.debug("Creating ResearchNetworkMembershipPropertiesStep"); + this.m_itemModel = itemModel; + this.m_parent = parent; + setMembershipSelectionModel(); + add(getDisplayComponent()); + + Form form = new Form("researchNetworkMembershipEditForm"); + form.add(getEditSheet()); + + WorkflowLockedContainer edit = new WorkflowLockedContainer(itemModel); + edit.add(form); + add(edit); + } + + protected void setMembershipSelectionModel() { + setMembershipSelectionModel(new ResearchNetworkMembershipSelectionModel(this.m_membershipParam)); + } + + protected void setMembershipSelectionModel(ResearchNetworkMembershipSelectionModel membershipModel) { + this.m_membershipModel = membershipModel; + } + + protected ResearchNetworkMembershipSelectionModel getMembershipSelectionModel() { + return this.m_membershipModel; + } + + protected BigDecimalParameter getMembershipParam() { + return this.m_membershipParam; + } + + public Component getDisplayComponent() { + SimpleContainer container = new SimpleContainer(); + container.add(new ResearchNetworkMembershipTable(m_itemModel, m_membershipModel)); + return container; + } + + public FormSection getEditSheet() { + ResearchNetworkMembershipPropertyForm propertyForm = new ResearchNetworkMembershipPropertyForm(m_itemModel, m_membershipModel); + propertyForm.setPropertiesStep(this); + return propertyForm; + } + + @Override + public void register(Page p) { + super.register(p); + p.addComponentStateParam(this, m_membershipParam); + } +} diff --git a/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipPropertyForm.java b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipPropertyForm.java new file mode 100644 index 000000000..acfd6cb72 --- /dev/null +++ b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipPropertyForm.java @@ -0,0 +1,182 @@ +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.bebop.util.GlobalizationUtil; +import com.arsdigita.cms.ContentType; +import com.arsdigita.cms.ItemSelectionModel; +import com.arsdigita.cms.contenttypes.Person; +import com.arsdigita.cms.contenttypes.ResearchNetwork; +import com.arsdigita.cms.contenttypes.ResearchNetworkMembership; +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 ResearchNetworkMembershipPropertyForm extends FormSection implements FormInitListener, FormProcessListener, FormValidationListener, FormSubmissionListener { + + private final static Logger s_log = Logger.getLogger(ResearchNetworkMembershipPropertyForm.class); + public final static String ID = "researchnetwork_membership_edit"; + private ItemSelectionModel m_itemModel; + private ResearchNetworkMembershipSelectionModel m_membershipModel; + private ItemSearchWidget m_personSearch; + private final static String PERSON_SEARCH = "membership"; + private SaveCancelSection m_saveCancelSection; + private ResearchNetworkMembershipPropertiesStep m_properties_step; + + public ResearchNetworkMembershipPropertyForm(ItemSelectionModel itemModel, ResearchNetworkMembershipSelectionModel membershipModel) { + super(new ColumnPanel(2)); + this.m_itemModel = itemModel; + this.m_membershipModel = membershipModel; + + addWidgets(); + addSaveCancelSection(); + + addInitListener(this); + addValidationListener(this); + addProcessListener(this); + addSubmissionListener(this); + } + + protected void setPropertiesStep(ResearchNetworkMembershipPropertiesStep propertiesStep) { + this.m_properties_step = propertiesStep; + } + + protected void addWidgets() { + add(new Label(GlobalizationUtil.globalize("cms.contenttypes.ui.researchnetwork.membership.person"))); + this.m_personSearch = new ItemSearchWidget(PERSON_SEARCH, ContentType.findByAssociatedObjectType("com.arsdigita.cms.contenttypes.Person")); + add(this.m_personSearch); + } + + protected 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_membershipModel.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_membershipModel.isSelected(e.getPageState())) { + target.setButtonLabel("Save"); + } else { + target.setButtonLabel("Create"); + } + } + }); + } catch(Exception ex) { + throw new UncheckedWrapperException("this cannot happen", ex); + } + add(this.m_saveCancelSection, ColumnPanel.FULL_WIDTH); + } + + public SaveCancelSection getSaveCancelSection() { + return this.m_saveCancelSection; + } + + protected ResearchNetworkMembershipSelectionModel getMembershipSelectionModel() { + return this.m_membershipModel; + } + + protected ResearchNetwork getResearchNetwork(PageState state) { + return (ResearchNetwork) m_itemModel.getSelectedItem(state); + } + + protected ResearchNetworkMembership createMembership(PageState state) { + ResearchNetwork network = this.getResearchNetwork(state); + s_log.debug ("Owning network " + network.getResearchNetworkTitle()); + Assert.exists(network); + ResearchNetworkMembership membership = new ResearchNetworkMembership(); + membership.setResearchNetworkMembershipOwner(network); + s_log.debug("set network to: " + membership.getResearchNetworkMembershipOwner().getResearchNetworkTitle()); + return membership; + } + + protected void setMembershipProperties(ResearchNetworkMembership membership, FormSectionEvent event) { + PageState state = event.getPageState(); + FormData data = event.getFormData(); + + membership.setTargetItem((Person) data.get(PERSON_SEARCH)); + + membership.save(); + } + + public void init(FormSectionEvent event) throws FormProcessException { + FormData data = event.getFormData(); + PageState state = event.getPageState(); + + setVisible(state, true); + + ResearchNetworkMembership membership; + if (m_membershipModel.isSelected(state)) { + membership = m_membershipModel.getSelectedMembership(state); + try { + data.put(PERSON_SEARCH, membership.getTargetItem()); + } catch(IllegalStateException ex) { + throw ex; + } + } else { + data.put(PERSON_SEARCH, null); + } + } + + public void process(FormSectionEvent event) throws FormProcessException { + PageState state = event.getPageState(); + ResearchNetworkMembership membership; + + if (this.getSaveCancelSection().getCancelButton().isSelected(state)) { + this.m_membershipModel.clearSelection(state); + } else { + if (this.m_membershipModel.isSelected(state)) { + membership = m_membershipModel.getSelectedMembership(state); + } else { + membership = createMembership(state); + } + setMembershipProperties(membership, event); + } + + this.m_membershipModel.clearSelection(state); + init(event); + } + + public void validate(FormSectionEvent event) throws FormProcessException { + if (event.getFormData().get(PERSON_SEARCH) == null) { + throw new FormProcessException("Person selection is required"); + } + } + + public void submitted(FormSectionEvent event) throws FormProcessException { + if (this.m_saveCancelSection.getCancelButton().isSelected(event.getPageState())) { + m_membershipModel.clearSelection(event.getPageState()); + init(event); + throw new FormProcessException("cancelled"); + } + } +} diff --git a/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipSelectionModel.java b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipSelectionModel.java new file mode 100644 index 000000000..55ecb974b --- /dev/null +++ b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipSelectionModel.java @@ -0,0 +1,26 @@ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.bebop.PageState; +import com.arsdigita.bebop.parameters.BigDecimalParameter; +import com.arsdigita.cms.contenttypes.ResearchNetworkMembership; +import com.arsdigita.kernel.ui.ACSObjectSelectionModel; + +/** + * + * @author Jens Pelzetter + */ +public class ResearchNetworkMembershipSelectionModel extends ACSObjectSelectionModel { + + public ResearchNetworkMembershipSelectionModel(BigDecimalParameter param) { + super(ResearchNetworkMembership.class.getName(), ResearchNetworkMembership.BASE_DATA_OBJECT_TYPE, param); + } + + public ResearchNetworkMembershipSelectionModel(String itemClass, String objectType, BigDecimalParameter param) { + super(itemClass, objectType, param); + } + + public ResearchNetworkMembership getSelectedMembership(PageState state) { + return (ResearchNetworkMembership) getSelectedObject(state); + } + +} diff --git a/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipTable.java b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipTable.java new file mode 100644 index 000000000..1f0aaf5dd --- /dev/null +++ b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipTable.java @@ -0,0 +1,186 @@ +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.dispatcher.Utilities; +import com.arsdigita.cms.SecurityManager; +import com.arsdigita.cms.contenttypes.Membership; +import com.arsdigita.cms.contenttypes.Person; +import com.arsdigita.cms.contenttypes.ResearchNetworkMembership; +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 ResearchNetworkMembershipTable extends Table { + + private final static Logger s_log = Logger.getLogger(ResearchNetworkMembershipTable.class); + private ResearchNetworkMembershipSelectionModel m_membershipModel; + private ItemSelectionModel m_itemModel; + private TableColumn m_personCol; + 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"; + + public ResearchNetworkMembershipTable(ItemSelectionModel itemModel, ResearchNetworkMembershipSelectionModel membershipModel) { + super(); + this.m_itemModel = itemModel; + this.m_membershipModel = membershipModel; + addColumns(); + + m_size = new RequestLocal(); + m_editor = new RequestLocal() { + + @Override + public Object initialValue(PageState state) { + SecurityManager sm = Utilities.getSecurityManager(state); + ContentItem item = m_itemModel.getSelectedItem(state); + Boolean val = new Boolean(sm.canAccess(state.getRequest(), SecurityManager.EDIT_ITEM, item)); + return val; + } + }; + + Label empty = new Label("This research network has no associated persons."); + setEmptyView(empty); + addTableActionListener(new ResearchNetworkMembershipTableActionListener()); + setRowSelectionModel(m_membershipModel); + setDefaultCellRenderer(new ResearchNetworkMembershipTableCellRenderer()); + setModelBuilder(new ResearchNetworkMembershipTableModelBuilder(itemModel)); + } + + public void addColumns() { + TableColumnModel model = getColumnModel(); + this.m_personCol = new TableColumn(0, "Person"); + this.m_editCol = new TableColumn(1, "Edit"); + this.m_delCol = new TableColumn(2, "Delete"); + + model.add(this.m_personCol); + model.add(this.m_editCol); + model.add(this.m_delCol); + setColumnModel(model); + } + + private class ResearchNetworkMembershipTableCellRenderer implements TableCellRenderer { + + public Component getComponent(Table table, PageState state, Object value, boolean isSelected, Object key, int row, int column) { + ResearchNetworkMembership membership = (ResearchNetworkMembership) value; + if (m_size.get(state) == null) { + m_size.set(state, new Long(((ResearchNetworkMembershipTableModelBuilder.ResearchNetworkMembershipTableModel) table.getTableModel(state)).size())); + } + + String url = membership.getURI(state); + if (column == m_personCol.getModelIndex()) { + Person person = membership.getTargetItem(); + StringBuilder fullNameBuilder = new StringBuilder(); + + if (person.getTitlePre() != null) { + fullNameBuilder.append(person.getTitlePre()); + fullNameBuilder.append(" "); + } + if (person.getGivenName() != null) { + fullNameBuilder.append(person.getGivenName()); + fullNameBuilder.append(" "); + } + if (person.getSurname() != null) { + fullNameBuilder.append(person.getSurname()); + fullNameBuilder.append(" "); + } + if (person.getTitlePost() != null) { + fullNameBuilder.append(person.getTitlePost()); + } + + String fullName = fullNameBuilder.toString(); + ExternalLink extLink = new ExternalLink(fullName, 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 { + throw new UncheckedWrapperException("column out of bounds"); + } + } + } + + private class ResearchNetworkMembershipTableActionListener implements TableActionListener { + + private ResearchNetworkMembership getMembership(TableActionEvent event) { + Object obj = event.getRowKey(); + BigDecimal id; + if (obj instanceof String) { + id = new BigDecimal((String) obj); + } else { + id = (BigDecimal) obj; + } + + Assert.exists(id); + ResearchNetworkMembership membership; + try { + membership = (ResearchNetworkMembership) DomainObjectFactory.newInstance(new OID(ResearchNetworkMembership.BASE_DATA_OBJECT_TYPE, id)); + } catch(DataObjectNotFoundException ex) { + throw new UncheckedWrapperException(ex); + } + return membership; + } + + public void cellSelected(TableActionEvent e) { + int col = e.getColumn().intValue(); + PageState state = e.getPageState(); + ResearchNetworkMembership membership = getMembership(e); + Assert.exists(membership); + + if (col == m_editCol.getModelIndex()) { + if(Boolean.TRUE.equals(m_editor.get(state))) { + m_membershipModel.setSelectedObject(state, membership); + } + } else if(col == m_delCol.getModelIndex()) { + if (Boolean.TRUE.equals(m_editor.get(state))) { + try { + m_membershipModel.clearSelection(state); + membership.delete(); + } catch(Exception ex) { + throw new UncheckedWrapperException(ex); + } + } + } + } + + public void headSelected(TableActionEvent e) { + } + + } +} diff --git a/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipTableModelBuilder.java b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipTableModelBuilder.java new file mode 100644 index 000000000..5c51885b1 --- /dev/null +++ b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkMembershipTableModelBuilder.java @@ -0,0 +1,83 @@ +package com.arsdigita.cms.contenttypes.ui; + +import com.arsdigita.cms.contenttypes.*; +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.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 ResearchNetworkMembershipTableModelBuilder extends LockableImpl implements TableModelBuilder { + + private final static Logger s_log = Logger.getLogger(ResearchNetworkMembershipTableModelBuilder.class); + + private ItemSelectionModel m_itemModel; + + public ResearchNetworkMembershipTableModelBuilder(ItemSelectionModel itemModel) { + this.m_itemModel = itemModel; + } + + public TableModel makeModel(Table t, PageState s) { + DataCollection members = getMembers(s); + + if(members.isEmpty()) { + return Table.EMPTY_MODEL; + } else { + return new ResearchNetworkMembershipTableModel(members); + } + } + + public DataCollection getMembers(PageState state) { + Assert.isTrue(this.m_itemModel.isSelected(state), "item selected"); + ResearchNetwork network = (ResearchNetwork) this.m_itemModel.getSelectedItem(state); + return ResearchNetworkMembership.getMemberships(network); + } + + public static class ResearchNetworkMembershipTableModel implements TableModel { + + ResearchNetworkMembership m_membership; + DataCollection m_memberships; + + public ResearchNetworkMembershipTableModel(DataCollection memberships) { + m_memberships = memberships; + m_membership = null; + } + + public int getColumnCount() { + return (int) m_memberships.size(); + } + + public boolean nextRow() { + if (m_memberships.next()) { + DataObject obj = m_memberships.getDataObject(); + m_membership = (ResearchNetworkMembership) DomainObjectFactory.newInstance(obj); + return true; + } else { + return false; + } + } + + public Object getElementAt(int columnIndex) { + return m_membership; + } + + public Object getKeyAt(int columnIndex) { + return m_membership.getID(); + } + + public long size() { + return m_memberships.size(); + } + } +} diff --git a/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkPropertiesStep.java b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkPropertiesStep.java new file mode 100644 index 000000000..393d386a0 --- /dev/null +++ b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkPropertiesStep.java @@ -0,0 +1,58 @@ +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.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 ResearchNetworkPropertiesStep extends SimpleEditStep { + + private final static Logger s_log = Logger.getLogger(ResearchNetworkPropertiesStep.class); + public final static String EDIT_SHEET_NAME = "edit"; + + public ResearchNetworkPropertiesStep(ItemSelectionModel itemModel, AuthoringKitWizard parent) { + super(itemModel, parent); + + setDefaultEditKey(EDIT_SHEET_NAME); + BasicPageForm editSheet; + + editSheet = new ResearchNetworkPropertyForm(itemModel, this); + add(EDIT_SHEET_NAME, "Edit", new WorkflowLockedComponentAccess(editSheet, itemModel), editSheet.getSaveCancelSection().getCancelButton()); + + setDisplayComponent(getResearchNetworkPropertySheet(itemModel)); + } + + public static Component getResearchNetworkPropertySheet(ItemSelectionModel itemModel) { + DomainObjectPropertySheet sheet = new DomainObjectPropertySheet(itemModel); + + 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; + } +} diff --git a/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkPropertyForm.java b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkPropertyForm.java new file mode 100644 index 000000000..e65990a62 --- /dev/null +++ b/ccm-cms-types-researchnetwork/src/com/arsdigita/cms/contenttypes/ui/ResearchNetworkPropertyForm.java @@ -0,0 +1,116 @@ +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.ResearchNetwork; +import com.arsdigita.cms.ui.authoring.BasicPageForm; +import org.apache.log4j.Logger; + +/** + * + * @author Jens Pelzetter + */ +public class ResearchNetworkPropertyForm extends BasicPageForm implements FormProcessListener, FormInitListener, FormSubmissionListener { + + private final static Logger s_log = Logger.getLogger(ResearchNetworkPropertyForm.class); + private ResearchNetworkPropertiesStep m_step; + public final static String RESEARCHNETWORK_TITLE = ResearchNetwork.RESEARCHNETWORK_TITLE; + public final static String RESEARCHNETWORK_DIRECTION = ResearchNetwork.RESEARCHNETWORK_DIRECTION; + public final static String RESEARCHNETWORK_COORDINATION = ResearchNetwork.RESEARCHNETWORK_COORDINATION; + public final static String RESEARCHNETWORK_DESCRIPTION = ResearchNetwork.RESEARCHNETWORK_DESCRIPTION; + public final static String RESEARCHNETWORK_WEBSITE = ResearchNetwork.RESEARCHNETWORK_WEBSITE; + public final static String ID = "ResearchNetwork_edit"; + + public ResearchNetworkPropertyForm(ItemSelectionModel itemModel) { + this(itemModel, null); + } + + public ResearchNetworkPropertyForm(ItemSelectionModel itemModel, ResearchNetworkPropertiesStep step) { + super(ID, itemModel); + this.m_step = step; + addSubmissionListener(this); + } + + @Override + public void addWidgets() { + super.addWidgets(); + + add(new Label(GlobalizationUtil.globalize("cms.contenttypes.researchnetwork.ui.title"))); + ParameterModel researchNetworkTitleParam = new StringParameter(RESEARCHNETWORK_TITLE); + TextField researchNetworkTitle = new TextField(researchNetworkTitleParam); + researchNetworkTitle.addValidationListener(new NotNullValidationListener()); + add(researchNetworkTitle); + + add(new Label(GlobalizationUtil.globalize("cms.contenttypes.researchnetwork.ui.direction"))); + TextArea researchNetworkDirection = new TextArea(RESEARCHNETWORK_DIRECTION); + researchNetworkDirection.setRows(5); + researchNetworkDirection.setCols(30); + add(researchNetworkDirection); + + add(new Label(GlobalizationUtil.globalize("cms.contenttypes.researchnetwork.ui.coordination"))); + TextArea researchNetworkCoordination = new TextArea(RESEARCHNETWORK_COORDINATION); + researchNetworkCoordination.setRows(5); + researchNetworkCoordination.setCols(30); + add(researchNetworkCoordination); + + add(new Label(GlobalizationUtil.globalize("cms.contenttypes.researchnetwork.ui.website"))); + ParameterModel researchNetworkWebsiteParam = new StringParameter(RESEARCHNETWORK_WEBSITE); + TextField researchNetworkWebsite = new TextField(researchNetworkWebsiteParam); + add(researchNetworkWebsite); + + add(new Label(GlobalizationUtil.globalize("cms.contenttypes.researchnetwork.ui.description"))); + TextArea researchNetworkAreaDescription = new TextArea(RESEARCHNETWORK_DESCRIPTION); + researchNetworkAreaDescription.setRows(10); + researchNetworkAreaDescription.setCols(30); + add(researchNetworkAreaDescription); + } + + public void init(FormSectionEvent e) throws FormProcessException { + FormData data = e.getFormData(); + ResearchNetwork network = (ResearchNetwork) super.initBasicWidgets(e); + + data.put(RESEARCHNETWORK_TITLE, network.getResearchNetworkTitle()); + data.put(RESEARCHNETWORK_DIRECTION, network.getResearchNetworkDirection()); + data.put(RESEARCHNETWORK_COORDINATION, network.getResearchNetworkCoordination()); + data.put(RESEARCHNETWORK_WEBSITE, network.getResearchNetworkWebsite()); + data.put(RESEARCHNETWORK_DESCRIPTION, network.getResearchNetworkDescription()); + } + + public void process(FormSectionEvent e) throws FormProcessException { + FormData data = e.getFormData(); + + ResearchNetwork network = (ResearchNetwork) super.processBasicWidgets(e); + + if ((network != null) && (getSaveCancelSection().getSaveButton().isSelected(e.getPageState()))) { + network.setResearchNetworkTitle((String) data.get(RESEARCHNETWORK_TITLE)); + network.setResearchNetworkDirection((String) data.get(RESEARCHNETWORK_DIRECTION)); + network.setResearchNetworkCoordination(((String) data.get(RESEARCHNETWORK_COORDINATION))); + network.setResearchNetworkWebsite((String) data.get(RESEARCHNETWORK_WEBSITE)); + network.setResearchNetworkDescription((String) data.get(RESEARCHNETWORK_DESCRIPTION)); + + network.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()); + } + } +}