package org.brixcms.plugin.content.blog.post.admin; import java.util.Arrays; import java.util.Collection; import java.util.Date; import org.apache.wicket.MarkupContainer; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.extensions.yui.calendar.DateTimeField; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.markup.html.panel.EmptyPanel; import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.model.IModel; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.ResourceModel; import org.brixcms.Brix; import org.brixcms.jcr.wrapper.BrixFileNode; import org.brixcms.jcr.wrapper.BrixNode; import org.brixcms.plugin.content.ContentPlugin; import org.brixcms.plugin.content.blog.post.PostNode; import org.brixcms.plugin.content.blog.post.PostNode.State; import org.brixcms.plugin.content.blog.post.PostNode.Visibility; import org.brixcms.plugin.content.blog.post.admin.editor.PostEditorFactory; import org.brixcms.plugin.content.blog.post.admin.resource.PostResourcesPanel; import org.brixcms.plugin.content.resource.ResourceUtils; import org.brixcms.plugin.site.picker.reference.ReferenceEditorConfiguration; import org.brixcms.plugin.site.picker.reference.ReferenceEditorPanel; import org.brixcms.web.ContainerFeedbackPanel; import org.brixcms.web.generic.BrixGenericPanel; import org.brixcms.web.model.ModelBuffer; import org.brixcms.web.reference.Reference; import org.brixcms.web.tree.NodeFilter; /** * @author dan.simko@gmail.com */ @SuppressWarnings("serial") public abstract class PostEditTab extends BrixGenericPanel<PostNode> { private final MarkupContainer contentEditorParent; private final IModel<String> contentEditorModel; private String currentContentEditorFactory; public PostEditTab(String id, final IModel<PostNode> nodeModel) { super(id, nodeModel); Brix brix = getModelObject().getBrix(); Form<Void> form = new Form<Void>("form"); add(form); final ModelBuffer adapter = new ModelBuffer(nodeModel); form.add(new TextField<String>("title", adapter.forProperty("title")).setRequired(true)); form.add(new TextField<String>("name", adapter.forProperty("name")).setRequired(true)); form.add(new DateTimeField("publish", adapter.<Date> forProperty("publish"))); form.add(new DropDownChoice<Visibility>("visibility", adapter.forProperty("visibility"), Arrays.asList(Visibility.values()))); contentEditorModel = adapter.forProperty("dataAsString"); contentEditorParent = form; Collection<PostEditorFactory> editorFactories = brix.getConfig().getRegistry().lookupCollection(PostEditorFactory.POINT); setupEditor(editorFactories.iterator().next().getClass().getName()); RepeatingView contentEditors = new RepeatingView("contentEditors") { private static final long serialVersionUID = 1L; @Override public boolean isVisible() { return size() > 1; } }; form.add(contentEditors); for (PostEditorFactory factory : editorFactories) { final String cn = factory.getClass().getName(); contentEditors.add(new Button(contentEditors.newChildId(), new ResourceModel(factory.newStringLabelKey())) { private static final long serialVersionUID = 1L; @Override public void onSubmit() { setupEditor(cn); } @Override public boolean isEnabled() { return !cn.equals(currentContentEditorFactory); } }); } form.add(new ContainerFeedbackPanel("feedback", this)); form.add(new AjaxLink<Void>("showAvailableResources") { @Override public void onClick(AjaxRequestTarget target) { PostResourcesPanel resourcesPanel = new PostResourcesPanel("resources", nodeModel); resourcesPanel.setOutputMarkupId(true); form.get("resources").replaceWith(resourcesPanel); setVisible(false); target.add(resourcesPanel); target.add(this); } }.setOutputMarkupId(true)); form.add(new EmptyPanel("resources").setOutputMarkupId(true)); ReferenceEditorConfiguration conf = new ReferenceEditorConfiguration(); conf.setDisplayFiles(true); conf.setAllowIndexedParameters(false); conf.setAllowQueryParameters(false); conf.setAllowURLEdit(false); conf.setNodeFilter(new NodeFilter() { @Override public boolean isNodeAllowed(BrixNode node) { return node instanceof BrixFileNode && ResourceUtils.isImage((BrixFileNode) node); } }); conf.setRootNode(new IModel<BrixNode>() { @Override public BrixNode getObject() { return nodeModel.getObject().getResourcesFolder(); } }); IModel<Reference> model = adapter.forProperty("featuredImageReference"); form.add(new ReferenceEditorPanel("featuredImageReference", model) { @Override protected IModel<String> newLabelModel() { return new PropertyModel<String>(getModel(), "nodeModel.object.name"); } }.setConfiguration(conf)); form.add(new Button("saveDraft") { @Override public void onSubmit() { save(adapter, nodeModel.getObject(), State.Draft); getSession().info(getString("content-plugin.status.saved")); } }); form.add(new Button("savePublish") { @Override public void onSubmit() { save(adapter, nodeModel.getObject(), State.Published); getSession().info(getString("content-plugin.status.published")); } }); form.add(new Link<Void>("cancel") { private static final long serialVersionUID = 1L; @Override public void onClick() { getSession().info(getString("content-plugin.status.cancelled")); goBack(); } }); } private void save(final ModelBuffer adapter, PostNode node, State state) { node.checkout(); adapter.apply(); node.setState(state); if (state == State.Published && node.getPublish() == null) { node.setPublish(new Date()); } node.save(); node.checkin(); ContentPlugin.get().selectNode(this, node, true); goBack(); } private void setupEditor(String cn) { final Brix brix = getModelObject().getBrix(); Collection<PostEditorFactory> factories = brix.getConfig().getRegistry().lookupCollection(PostEditorFactory.POINT); for (PostEditorFactory factory : factories) { if (factory.getClass().getName().equals(cn)) { contentEditorParent.addOrReplace(factory.newEditor("content", contentEditorModel)); currentContentEditorFactory = factory.getClass().getName(); return; } } throw new RuntimeException("Unknown markup editor factory class: " + cn); } abstract void goBack(); }