///////////////////////////////////////////////////////////////////////////// // // Project ProjectForge Community Edition // www.projectforge.org // // Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de) // // ProjectForge is dual-licensed. // // This community edition is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as published // by the Free Software Foundation; version 3 of the License. // // This community edition 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 General // Public License for more details. // // You should have received a copy of the GNU General Public License along // with this program; if not, see http://www.gnu.org/licenses/. // ///////////////////////////////////////////////////////////////////////////// package org.projectforge.plugins.skillmatrix; import java.util.Collection; import java.util.HashSet; import org.apache.log4j.Logger; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.projectforge.registry.Registry; import org.projectforge.user.GroupDO; import org.projectforge.user.UserGroupCache; import org.projectforge.user.UserRights; import org.projectforge.web.common.MultiChoiceListHelper; import org.projectforge.web.user.GroupsComparator; import org.projectforge.web.user.GroupsProvider; import org.projectforge.web.wicket.AbstractEditForm; import org.projectforge.web.wicket.WicketUtils; import org.projectforge.web.wicket.bootstrap.GridSize; import org.projectforge.web.wicket.bootstrap.GridType; import org.projectforge.web.wicket.components.MaxLengthTextArea; import org.projectforge.web.wicket.components.RequiredMaxLengthTextField; import org.projectforge.web.wicket.flowlayout.DivTextPanel; import org.projectforge.web.wicket.flowlayout.FieldsetPanel; import com.vaynberg.wicket.select2.Select2MultiChoice; /** * @author Billy Duong (b.duong@micromata.de) * */ public class SkillEditForm extends AbstractEditForm<SkillDO, SkillEditPage> { private static final long serialVersionUID = 7795854215943696332L; private static final Logger log = Logger.getLogger(SkillEditForm.class); @SpringBean(name = "skillDao") private SkillDao skillDao; MultiChoiceListHelper<GroupDO> fullAccessGroupsListHelper, readOnlyAccessGroupsListHelper, trainingAccessGroupsListHelper; SkillRight skillRight; private Collection<Component> ajaxTargets; /** * @param parentPage * @param data */ public SkillEditForm(final SkillEditPage parentPage, final SkillDO data) { super(parentPage, data); } @Override public void init() { super.init(); skillRight = (SkillRight) UserRights.instance().getRight(SkillDao.USER_RIGHT_ID); ajaxTargets = new HashSet<Component>(); gridBuilder.newSplitPanel(GridSize.COL50, GridType.CONTAINER); // Title of skill FieldsetPanel fs = gridBuilder.newFieldset(SkillDO.class, "title"); final RequiredMaxLengthTextField titleField = new RequiredMaxLengthTextField(fs.getTextFieldId(), new PropertyModel<String>(data, "title")); fs.add(titleField); WicketUtils.setFocus(titleField); gridBuilder.newSplitPanel(GridSize.COL50, GridType.CONTAINER); // Parent fs = gridBuilder.newFieldset(SkillDO.class, "parent"); final SkillSelectPanel parentSelectPanel = new SkillSelectPanel(fs, new PropertyModel<SkillDO>(data, "parent"), parentPage, "parentId") { private static final long serialVersionUID = 8355684523726816059L; /** * @see org.projectforge.plugins.skillmatrix.SkillSelectPanel#onModelSelected(org.apache.wicket.ajax.AjaxRequestTarget, * org.projectforge.plugins.skillmatrix.SkillDO) */ @Override protected void onModelSelected(final AjaxRequestTarget target, final SkillDO skillDo) { super.onModelSelected(target, skillDo); if (ajaxTargets != null) { for (final Component ajaxTarget : ajaxTargets) target.add(ajaxTarget); } } }; fs.add(parentSelectPanel); parentSelectPanel.init(); fs.getFieldset().setOutputMarkupId(true); if (getSkillTree().isRootNode(data) == true) { fs.setVisible(false); } else { parentSelectPanel.setRequired(true); } gridBuilder.newSplitPanel(GridSize.COL50, GridType.CONTAINER); // Full access groups fs = gridBuilder.newFieldset(getString("plugins.teamcal.fullAccess"), getString("plugins.teamcal.access.groups")); final GroupsProvider groupsFullAccessProvider = new GroupsProvider(); final Collection<GroupDO> fullAccessGroups = new GroupsProvider().getSortedGroups(getData().getFullAccessGroupIds()); fullAccessGroupsListHelper = new MultiChoiceListHelper<GroupDO>().setComparator(new GroupsComparator()).setFullList( groupsFullAccessProvider.getSortedGroups()); if (fullAccessGroups != null) { for (final GroupDO group : fullAccessGroups) { fullAccessGroupsListHelper.addOriginalAssignedItem(group).assignItem(group); } } final Select2MultiChoice<GroupDO> groupsFullAccess = new Select2MultiChoice<GroupDO>(fs.getSelect2MultiChoiceId(), new PropertyModel<Collection<GroupDO>>(this.fullAccessGroupsListHelper, "assignedItems"), groupsFullAccessProvider); fs.add(groupsFullAccess); // Full access groups inherited rights fs = gridBuilder.newFieldset("", getString("plugins.skillmatrix.skill.inherited")); @SuppressWarnings("serial") final DivTextPanel labelFull = new DivTextPanel(fs.newChildId(), new Model<String>() { /** * @see org.apache.wicket.model.Model#getObject() */ @Override public String getObject() { if (getData().getParent() != null) { return getGroupnames(skillRight.getFullAccessGroupIds(getData().getParent())); } return ""; } }); fs.suppressLabelForWarning(); fs.add(labelFull); ajaxTargets.add(labelFull.getLabel4Ajax()); gridBuilder.newSplitPanel(GridSize.COL50, GridType.CONTAINER); { // Read-only access groups fs = gridBuilder.newFieldset(getString("plugins.teamcal.readonlyAccess"), getString("plugins.teamcal.access.groups")); final GroupsProvider groupsProvider = new GroupsProvider(); final Collection<GroupDO> readOnlyAccessGroups = new GroupsProvider().getSortedGroups(getData().getReadOnlyAccessGroupIds()); readOnlyAccessGroupsListHelper = new MultiChoiceListHelper<GroupDO>().setComparator(new GroupsComparator()).setFullList( groupsProvider.getSortedGroups()); if (readOnlyAccessGroups != null) { for (final GroupDO group : readOnlyAccessGroups) { readOnlyAccessGroupsListHelper.addOriginalAssignedItem(group).assignItem(group); } } final Select2MultiChoice<GroupDO> groups = new Select2MultiChoice<GroupDO>(fs.getSelect2MultiChoiceId(), new PropertyModel<Collection<GroupDO>>(this.readOnlyAccessGroupsListHelper, "assignedItems"), groupsProvider); fs.add(groups); // Read-only access groups inherited rights fs = gridBuilder.newFieldset("", getString("plugins.skillmatrix.skill.inherited")); @SuppressWarnings("serial") final DivTextPanel labelReadOnly = new DivTextPanel(fs.newChildId(), new Model<String>() { /** * @see org.apache.wicket.model.Model#getObject() */ @Override public String getObject() { if (getData().getParent() != null) { return getGroupnames(skillRight.getReadOnlyAccessGroupIds(getData().getParent())); } return ""; } }); fs.add(labelReadOnly); fs.suppressLabelForWarning(); ajaxTargets.add(labelReadOnly.getLabel4Ajax()); } gridBuilder.newSplitPanel(GridSize.COL50, GridType.CONTAINER); { // Training access groups fs = gridBuilder.newFieldset(getString("plugins.skillmatrix.skill.trainingAccess"), getString("plugins.teamcal.access.groups")); final GroupsProvider groupsProvider = new GroupsProvider(); final Collection<GroupDO> trainingAccessGroups = new GroupsProvider().getSortedGroups(getData().getTrainingAccessGroupIds()); trainingAccessGroupsListHelper = new MultiChoiceListHelper<GroupDO>().setComparator(new GroupsComparator()).setFullList( groupsProvider.getSortedGroups()); if (trainingAccessGroups != null) { for (final GroupDO group : trainingAccessGroups) { trainingAccessGroupsListHelper.addOriginalAssignedItem(group).assignItem(group); } } final Select2MultiChoice<GroupDO> groups = new Select2MultiChoice<GroupDO>(fs.getSelect2MultiChoiceId(), new PropertyModel<Collection<GroupDO>>(this.trainingAccessGroupsListHelper, "assignedItems"), groupsProvider); fs.add(groups); // Training access groups inherited rights fs = gridBuilder.newFieldset("", getString("plugins.skillmatrix.skill.inherited")); @SuppressWarnings("serial") final DivTextPanel labelTraining = new DivTextPanel(fs.newChildId(), new Model<String>() { /** * @see org.apache.wicket.model.Model#getObject() */ @Override public String getObject() { if (getData().getParent() != null) { return getGroupnames(skillRight.getTrainingAccessGroupIds(getData().getParent())); } return ""; } }); fs.add(labelTraining); fs.suppressLabelForWarning(); ajaxTargets.add(labelTraining.getLabel4Ajax()); } gridBuilder.newGridPanel(); { // Description fs = gridBuilder.newFieldset(SkillDO.class, "description"); fs.add(new MaxLengthTextArea(fs.getTextAreaId(), new PropertyModel<String>(data, "description"))).setAutogrow(); } { // Comment fs = gridBuilder.newFieldset(SkillDO.class, "comment"); fs.add(new MaxLengthTextArea(fs.getTextAreaId(), new PropertyModel<String>(data, "comment"))).setAutogrow(); } { // Rateable gridBuilder.newFieldset(SkillDO.class, "rateable").addCheckBox(new PropertyModel<Boolean>(data, "rateable"), null); } } /** * @see org.projectforge.web.wicket.AbstractEditForm#getLogger() */ @Override protected Logger getLogger() { return log; } public SkillTree getSkillTree() { return skillDao.getSkillTree(); } private String getGroupnames(final Integer[] ids) { if (ids == null || ids.length == 0) { return ""; } String s = ""; final UserGroupCache userGroupCache = Registry.instance().getUserGroupCache(); for (final Integer id : ids) { s += userGroupCache.getGroupname(id) + ", "; } return s.substring(0, s.lastIndexOf(", ")); } }