/** * Copyright (c) 2008-2012 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.osedu.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.sakaiproject.profile2.tool.pages.panels; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.apache.commons.lang.StringUtils; import org.apache.wicket.AttributeModifier; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.form.AjaxButton; import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton; import org.apache.wicket.extensions.markup.html.form.palette.Palette; import org.apache.wicket.feedback.FeedbackMessage; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.ChoiceRenderer; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.IChoiceRenderer; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.panel.FeedbackPanel; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; import org.apache.wicket.model.ResourceModel; import org.apache.wicket.model.util.CollectionModel; import org.apache.wicket.model.util.ListModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.sakaiproject.profile2.logic.ProfileWorksiteLogic; import org.sakaiproject.profile2.logic.SakaiProxy; import org.sakaiproject.profile2.model.Person; import org.sakaiproject.profile2.tool.components.ErrorLevelsFeedbackMessageFilter; import org.sakaiproject.profile2.tool.components.IconWithClueTip; import org.sakaiproject.profile2.util.ProfileConstants; import org.sakaiproject.profile2.util.ProfileUtils; /** * Panel for creating a worksite from a group of people. * * @author d.b.robinson@lancaster.ac.uk */ public class CreateWorksitePanel extends Panel { private static final long serialVersionUID = 1L; @SpringBean(name="org.sakaiproject.profile2.logic.ProfileWorksiteLogic") private ProfileWorksiteLogic worksiteLogic; @SpringBean(name="org.sakaiproject.profile2.logic.SakaiProxy") private SakaiProxy sakaiProxy; /** * Creates an instance of <code>CreateWorksitePanel</code>. * * @param id the wicket id. * @param persons list of users e.g. from connections (and possibly search * results in the future). */ public CreateWorksitePanel(final String id, final List<Person> persons) { super(id); // sort persons Collections.sort(persons); Form<Void> form = new Form<Void>("form"); form.setOutputMarkupId(true); add(form); // form submit feedback final Label formFeedback = new Label("formFeedback"); formFeedback.setOutputMarkupPlaceholderTag(true); form.add(formFeedback); final FeedbackPanel feedback = new FeedbackPanel("feedback"); feedback.setOutputMarkupId(true); form.add(feedback); int[] filteredErrorLevels = new int[] { FeedbackMessage.ERROR }; feedback.setFilter(new ErrorLevelsFeedbackMessageFilter( filteredErrorLevels)); IChoiceRenderer<Person> renderer = new ChoiceRenderer<Person>("displayName", "uuid"); final Palette<Person> palette = new Palette<Person>("palette", new ListModel<Person>( new ArrayList<Person>()), new CollectionModel<Person>(persons), renderer, 10, true); palette.setOutputMarkupId(true); form.add(palette); Label siteNameLabel = new Label("siteNameLabel", new ResourceModel("worksite.name")); form.add(siteNameLabel); final TextField<String> siteNameField = new TextField<String>("siteNameField", new Model<String>()); siteNameField.setOutputMarkupId(true); form.add(siteNameField); AjaxButton cancelButton = new AjaxButton("cancelButton") { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { resetPanel(target, siteNameField, palette, formFeedback); } }; cancelButton.setModel(new ResourceModel("button.worksite.cancel")); form.add(cancelButton); IndicatingAjaxButton createButton = new IndicatingAjaxButton("createButton", form) { @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { if (StringUtils.isBlank(siteNameField.getValue())) { formFeedback.setDefaultModel(new ResourceModel( "error.worksite.no.title")); formFeedback.add(new AttributeModifier("class", true, new Model<String>("alertMessage"))); target.addComponent(formFeedback); return; } if (true == worksiteLogic.createWorksite(ProfileUtils.stripHtml(siteNameField .getValue()), sakaiProxy.getCurrentUserId(), new ArrayList<Person>(palette.getModelCollection()), true)) { resetPanel(target, siteNameField, palette, formFeedback); } else { formFeedback.setDefaultModel(new ResourceModel( "error.worksite.create.failed")); formFeedback.add(new AttributeModifier("class", true, new Model<String>("alertMessage"))); target.addComponent(formFeedback); return; } } }; createButton.setModel(new ResourceModel("button.worksite.create")); form.add(createButton); form.add(new IconWithClueTip("createWorksiteToolTip", ProfileConstants.INFO_IMAGE, new ResourceModel("text.worksite.create"))); Label refreshLabel = new Label("refreshLabel", new ResourceModel("text.worksite.refresh")); form.add(refreshLabel); } // clears site name field and palette, and slides up private void resetPanel(AjaxRequestTarget target, final TextField<String> siteNameField, final Palette<Person> palette, Label formFeedback) { siteNameField.setModelObject(""); // there is quite possibly a better way of doing this List<Person> remove = new ArrayList<Person>(); for (Person person : palette.getModelCollection()) { remove.add(person); } palette.getModelCollection().removeAll(remove); formFeedback.setVisible(false); target.addComponent(siteNameField); target.appendJavascript("$('#" + CreateWorksitePanel.this.getMarkupId() + "').slideUp();"); target.appendJavascript("fixWindowVertical();"); } }