Index: addon-cms/src/main/java/org/onehippo/forge/selection/frontend/plugin/DynamicMultiSelectPlugin.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- addon-cms/src/main/java/org/onehippo/forge/selection/frontend/plugin/DynamicMultiSelectPlugin.java (revision 869) +++ addon-cms/src/main/java/org/onehippo/forge/selection/frontend/plugin/DynamicMultiSelectPlugin.java (revision ) @@ -66,16 +66,13 @@ import org.slf4j.LoggerFactory; /** - * A dynamic multiselect plugin, which is backed by a ValueListProvider service - * that provides a ValueList object. + * A dynamic multiselect plugin, which is backed by a ValueListProvider service that provides a ValueList object. *

- * The default DocumentValueListProvider reads a document of the type - * 'selection:valuelist', which contains key label pairs used to display values - * and labels in the dropdown. + * The default DocumentValueListProvider reads a document of the type 'selection:valuelist', which contains key label + * pairs used to display values and labels in the dropdown. *

- * The plugin configuration must then be provided with a source - * property, which can either be a valid UUID of a handle or the path to the - * document based on the JCR root. + * The plugin configuration must then be provided with a source property, which can either be a valid UUID + * of a handle or the path to the document based on the JCR root. */ public class DynamicMultiSelectPlugin extends RenderPlugin { @@ -116,7 +113,7 @@ // required Label required = new Label("required", "*"); - if (helper.getField() != null && !helper.getField().isMandatory()) { + if (helper.getField() != null && !helper.getField().getValidators().contains("required")) { required.setVisible(false); } add(required); @@ -144,9 +141,9 @@ final JcrMultiPropertyValueModel model = new JcrMultiPropertyValueModel(getPropertyModel().getItemModel()); final IPluginConfig options = config.getPluginConfig(CONFIG_VALUELIST_OPTIONS); - if(options == null) { + if (options == null) { throw new WicketRuntimeException("Configuration node '" + CONFIG_VALUELIST_OPTIONS - + "' not found in plugin configuration. " + config.toString()); + + "' not found in plugin configuration. " + config.toString()); } final Locale locale = SelectionUtils.getLocale(SelectionUtils.getNode(model)); @@ -155,7 +152,7 @@ sortHelper.sort(valueList, options); ArrayList keys = new ArrayList(valueList.size()); - for(org.onehippo.forge.selection.frontend.model.ListItem item : valueList) { + for (org.onehippo.forge.selection.frontend.model.ListItem item : valueList) { keys.add(item.getKey()); } final IModel choicesModel = new Model>(keys); @@ -163,164 +160,206 @@ Fragment modeFragment; final String mode = config.getString(ITemplateEngine.MODE); if ("edit".equals(mode)) { + modeFragment = populateEditMode(config, model, valueList, choicesModel); + } else if ("compare".equals(mode)) { + modeFragment = populateCompareMode(context, config, model, valueList); + } else { + modeFragment = populateViewMode(model, valueList); + + } + add(modeFragment); + } + + private Fragment populateViewMode(final JcrMultiPropertyValueModel model, final ValueList valueList) { + final Fragment modeFragment;// show view list + modeFragment = new Fragment("mode", "view", this); + modeFragment.add(new ListView("viewitems", model.getObject(), valueList)); + + // hide dummy fragment + final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this); + final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null); + unselectFragment.add(unselectLink); + unselectFragment.setVisibilityAllowed(false); + add(unselectFragment); + return modeFragment; + } + + private Fragment populateCompareMode(final IPluginContext context, final IPluginConfig config, + final JcrMultiPropertyValueModel model, final ValueList valueList) { + final Fragment modeFragment; + modeFragment = new Fragment("mode", "view", this); + + IModelReference compareToRef = context.getService(config.getString("model.compareTo"), + IModelReference.class); + if (compareToRef != null) { + JcrNodeModel baseNodeModel = (JcrNodeModel) compareToRef.getModel(); + if (baseNodeModel != null && baseNodeModel.getNode() != null) { + IFieldDescriptor field = helper.getField(); + JcrMultiPropertyValueModel baseModel = new JcrMultiPropertyValueModel(new JcrItemModel( + baseNodeModel.getItemModel().getPath() + "/" + field.getPath())); + + List baseOptions = baseModel.getObject(); + List currentOptions = model.getObject(); + List> changes = LCS.getChangeSet(baseOptions.toArray(new String[baseOptions.size()]), + currentOptions.toArray(new String[currentOptions.size()])); + + // show view list + modeFragment.add(new CompareView("viewitems", changes, valueList)); + } else { + modeFragment.add(new ListView("viewitems", model.getObject(), valueList)); + } + } else { + modeFragment.add(new ListView("viewitems", model.getObject(), valueList)); + } + + // hide dummy fragment + final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this); + final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null); + unselectFragment.add(unselectLink); + unselectFragment.setVisibilityAllowed(false); + add(unselectFragment); + return modeFragment; + } + + private Fragment populateEditMode(final IPluginConfig config, final JcrMultiPropertyValueModel model, + final ValueList valueList, final IModel choicesModel) { + final Fragment modeFragment; - modeFragment = new Fragment("mode", "edit", this); + modeFragment = new Fragment("mode", "edit", this); - Fragment typeFragment; - final String type = config.getString(CONFIG_TYPE); - if (CONFIG_CHECKBOXES.equals(type)) { + Fragment typeFragment; + final String type = config.getString(CONFIG_TYPE); + if (CONFIG_CHECKBOXES.equals(type)) { + typeFragment = addCheckboxes(model, valueList, choicesModel); + } else if (CONFIG_PALETTE.equals(type)) { + typeFragment = addPalette(config, model, valueList, choicesModel); + } else { + typeFragment = addList(config, model, valueList, choicesModel); + } + modeFragment.add(typeFragment); + return modeFragment; + } - typeFragment = new Fragment("type", "edit-checkboxes", this); + private Fragment addList(final IPluginConfig config, final JcrMultiPropertyValueModel model, + final ValueList valueList, final IModel choicesModel) { + final Fragment typeFragment; + typeFragment = new Fragment("type", "edit-select", this); - CheckBoxMultipleChoice checkboxes = new CheckBoxMultipleChoice("checkboxes", model, choicesModel, new ValueListItemRenderer(valueList)); + ListMultipleChoice multiselect = new ListMultipleChoice("multiselect", model, choicesModel, + new ValueListItemRenderer(valueList)); - // trigger setObject on selection changed + // trigger setObject on selection changed - checkboxes.add(new AjaxFormChoiceComponentUpdatingBehavior() { + multiselect.add(new OnChangeAjaxBehavior() { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - @Override - protected void onUpdate(AjaxRequestTarget target) { - } - }); + @Override + protected void onUpdate(AjaxRequestTarget target) { + } + }); - typeFragment.add(checkboxes); + // set (configured) max rows + final String maxRows = config.getString(CONFIG_SELECT_MAX_ROWS, "8"); + try { + multiselect.setMaxRows(Integer.valueOf(maxRows)); + } catch (NumberFormatException nfe) { + log.warn("The configured value '" + maxRows + "' for " + CONFIG_SELECT_MAX_ROWS + + " is not a valid number. Defaulting to 8."); + multiselect.setMaxRows(8); + } - // hide unselect fragment + typeFragment.add(multiselect); + - final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this); + final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this); - final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null); + final AjaxLink unselectLink = new UnselectLink("unselect-link", multiselect, model); - unselectFragment.add(unselectLink); + unselectFragment.add(unselectLink); - unselectFragment.setVisibilityAllowed(false); - add(unselectFragment); + add(unselectFragment); - } else if (CONFIG_PALETTE.equals(type)) { + return typeFragment; + } + private Fragment addPalette(final IPluginConfig config, final JcrMultiPropertyValueModel model, + final ValueList valueList, final IModel choicesModel) { + final Fragment typeFragment; - typeFragment = new Fragment("type", "edit-palette", this); + typeFragment = new Fragment("type", "edit-palette", this); - // set (configured) max rows - int rows = 10; - final String maxRows = config.getString(CONFIG_PALETTE_MAX_ROWS, "10"); - try { - rows = Integer.valueOf(maxRows); - } catch (NumberFormatException nfe) { - log.warn("The configured value '" + maxRows + "' for " + CONFIG_PALETTE_MAX_ROWS - + " is not a valid number. Defaulting to 10."); - } + // set (configured) max rows + int rows = 10; + final String maxRows = config.getString(CONFIG_PALETTE_MAX_ROWS, "10"); + try { + rows = Integer.valueOf(maxRows); + } catch (NumberFormatException nfe) { + log.warn("The configured value '" + maxRows + "' for " + CONFIG_PALETTE_MAX_ROWS + + " is not a valid number. Defaulting to 10."); + } - // set (configured) allow order value - final boolean allowOrder = config.getBoolean(CONFIG_PALETTE_ALLOW_ORDER); + // set (configured) allow order value + final boolean allowOrder = config.getBoolean(CONFIG_PALETTE_ALLOW_ORDER); - final Palette palette = new Palette("palette", model, choicesModel, new ValueListItemRenderer(valueList), rows, allowOrder) { + final Palette palette = new Palette("palette", model, choicesModel, + new ValueListItemRenderer(valueList), rows, allowOrder) { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - // FIXME: workaround for WICKET-2843 - @Override - public Collection getModelCollection() { - return new ArrayList(super.getModelCollection()); - } + // FIXME: workaround for WICKET-2843 + @Override + public Collection getModelCollection() { + return new ArrayList(super.getModelCollection()); + } - // trigger setObject on selection changed - @Override - protected Recorder newRecorderComponent() { - Recorder recorder = super.newRecorderComponent(); - recorder.add(new AjaxFormComponentUpdatingBehavior("onchange") { + // trigger setObject on selection changed + @Override + protected Recorder newRecorderComponent() { + Recorder recorder = super.newRecorderComponent(); + recorder.add(new AjaxFormComponentUpdatingBehavior("onchange") { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - @Override - protected void onUpdate(AjaxRequestTarget target) { - } + @Override + protected void onUpdate(AjaxRequestTarget target) { + } - }); - return recorder; - } - }; + }); + return recorder; + } + }; - typeFragment.add(palette); + typeFragment.add(palette); - // hide unselect fragment - final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this); - final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null); - unselectFragment.add(unselectLink); - unselectFragment.setVisibilityAllowed(false); - add(unselectFragment); + // hide unselect fragment + final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this); + final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null); + unselectFragment.add(unselectLink); + unselectFragment.setVisibilityAllowed(false); + add(unselectFragment); - } else { - typeFragment = new Fragment("type", "edit-select", this); + return typeFragment; + } - ListMultipleChoice multiselect = new ListMultipleChoice("multiselect", model, choicesModel, new ValueListItemRenderer(valueList)); + private Fragment addCheckboxes(final JcrMultiPropertyValueModel model, final ValueList valueList, + final IModel choicesModel) { + final Fragment typeFragment; + typeFragment = new Fragment("type", "edit-checkboxes", this); + CheckBoxMultipleChoice checkboxes = new CheckBoxMultipleChoice("checkboxes", model, choicesModel, + new ValueListItemRenderer(valueList)); + - // trigger setObject on selection changed + // trigger setObject on selection changed - multiselect.add(new OnChangeAjaxBehavior() { + checkboxes.add(new AjaxFormChoiceComponentUpdatingBehavior() { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - @Override - protected void onUpdate(AjaxRequestTarget target) { - } - }); + @Override + protected void onUpdate(AjaxRequestTarget target) { + } + }); - // set (configured) max rows - final String maxRows = config.getString(CONFIG_SELECT_MAX_ROWS, "8"); - try { - multiselect.setMaxRows(Integer.valueOf(maxRows)); - } catch (NumberFormatException nfe) { - log.warn("The configured value '" + maxRows + "' for " + CONFIG_SELECT_MAX_ROWS - + " is not a valid number. Defaulting to 8."); - multiselect.setMaxRows(8); - } + typeFragment.add(checkboxes); - typeFragment.add(multiselect); - + // hide unselect fragment - final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this); + final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this); - final AjaxLink unselectLink = new UnselectLink("unselect-link", multiselect, model); - unselectFragment.add(unselectLink); - add(unselectFragment); - } - modeFragment.add(typeFragment); - } else if ("compare".equals(mode)) { - modeFragment = new Fragment("mode", "view", this); - - IModelReference compareToRef = context.getService(config.getString("model.compareTo"), - IModelReference.class); - if (compareToRef != null) { - JcrNodeModel baseNodeModel = (JcrNodeModel) compareToRef.getModel(); - if (baseNodeModel != null && baseNodeModel.getNode() != null) { - IFieldDescriptor field = helper.getField(); - JcrMultiPropertyValueModel baseModel = new JcrMultiPropertyValueModel(new JcrItemModel( - baseNodeModel.getItemModel().getPath() + "/" + field.getPath())); - - List baseOptions = baseModel.getObject(); - List currentOptions = model.getObject(); - List> changes = LCS.getChangeSet(baseOptions.toArray(new String[baseOptions.size()]), - currentOptions.toArray(new String[currentOptions.size()])); - - // show view list - modeFragment.add(new CompareView("viewitems", changes, valueList)); - } else { - modeFragment.add(new ListView("viewitems", model.getObject(), valueList)); - } - } else { - modeFragment.add(new ListView("viewitems", model.getObject(), valueList)); - } - - // hide dummy fragment - final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this); - final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null); - unselectFragment.add(unselectLink); - unselectFragment.setVisibilityAllowed(false); - add(unselectFragment); + final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null); + unselectFragment.add(unselectLink); + unselectFragment.setVisibilityAllowed(false); + add(unselectFragment); - } else { - // show view list - modeFragment = new Fragment("mode", "view", this); - modeFragment.add(new ListView("viewitems", model.getObject(), valueList)); - - // hide dummy fragment - final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this); - final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null); - unselectFragment.add(unselectLink); - unselectFragment.setVisibilityAllowed(false); - add(unselectFragment); - } - add(modeFragment); + return typeFragment; } @Override @@ -397,7 +436,7 @@ super(id); // get the choice labels by the actual values/keys - for(Object item : actualValues) { + for (Object item : actualValues) { this.models.add(new Model(choices.getLabel(item))); } }