com.trivago.mail.pigeon.web.components.templates.ModalAddTemplate.java Source code

Java tutorial

Introduction

Here is the source code for com.trivago.mail.pigeon.web.components.templates.ModalAddTemplate.java

Source

/**
 * Copyright (C) 2011-2012 trivago GmbH <mario.mueller@trivago.com>, <christian.krause@trivago.com>
 *
 * Licensed under the Apache 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.apache.org/licenses/LICENSE-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 com.trivago.mail.pigeon.web.components.templates;

import com.trivago.mail.pigeon.bean.MailTemplate;
import com.trivago.mail.pigeon.storage.Util;
import com.vaadin.data.util.BeanItem;
import com.vaadin.terminal.ExternalResource;
import com.vaadin.terminal.UserError;
import com.vaadin.ui.*;
import org.vaadin.openesignforms.ckeditor.CKEditorTextField;

public class ModalAddTemplate extends Window {
    public ModalAddTemplate(final TemplateList tl) {
        this(tl, null);
    }

    public ModalAddTemplate(final TemplateList tl, final Long templateId) {
        setResizable(true);
        setWidth("972px");
        setHeight("700px");
        Panel rootPanel = new Panel("Add new Template");
        TabSheet tSheet = new TabSheet();
        HorizontalLayout hLayout = new HorizontalLayout();

        final TextField title = new TextField("Template description");
        final TextField subject = new TextField("Newsletter Subject");

        final TextArea textContent = new TextArea("Text Version");
        textContent.setRows(40);
        textContent.setColumns(100);

        final CKEditorTextField htmlContent = new CKEditorTextField();
        htmlContent.setWidth("100%");
        htmlContent.setHeight("650px");

        // Load the content, if we receive a template id
        if (templateId != null) {
            MailTemplate mt = new MailTemplate(templateId);
            title.setValue(mt.getTitle());
            subject.setValue(mt.getSubject());
            textContent.setValue(mt.getText());
            htmlContent.setValue(mt.getHtml());
        }

        Button saveButton = new Button("Save");
        Button cancel = new Button("Cancel");

        saveButton.addListener(new Button.ClickListener() {
            @Override
            public void buttonClick(Button.ClickEvent event) {
                boolean hasError = false;
                if (title.getValue().equals("")) {
                    title.setComponentError(new UserError("Name must not be empty"));
                    hasError = true;
                } else {
                    title.setComponentError(null);
                }

                if (subject.getValue().equals("")) {
                    subject.setComponentError(new UserError("Subject must not be empty"));
                    hasError = true;
                } else {
                    subject.setComponentError(null);
                }

                if (htmlContent.getValue().equals("")) {
                    htmlContent.setComponentError(new UserError("Please provide some HTML content"));
                    hasError = true;
                } else {
                    htmlContent.setComponentError(null);
                }

                if (textContent.getValue().equals("")) {
                    textContent.setComponentError(new UserError("Please provide some text content"));
                    hasError = true;
                } else {
                    textContent.setComponentError(null);
                }

                if (!hasError) {
                    if (templateId == null) {
                        long templateId = Util.generateId();
                        try {
                            MailTemplate mt = new MailTemplate(templateId, title.getValue().toString(),
                                    textContent.getValue().toString(), htmlContent.getValue().toString(),
                                    subject.getValue().toString());
                            event.getButton().getWindow().setVisible(false);
                            event.getButton().getWindow().getParent()
                                    .removeComponent(event.getButton().getWindow());
                            event.getButton().getWindow().getParent().showNotification("Saved successfully",
                                    Notification.TYPE_HUMANIZED_MESSAGE);
                            tl.getBeanContainer().addItem(mt.getId(), mt);
                        } catch (RuntimeException e) {
                            // Should never happen ... hopefully :D
                        }
                    } else {
                        MailTemplate mt = new MailTemplate(templateId);

                        mt.setHtml(htmlContent.getValue().toString());
                        mt.setSubject(subject.getValue().toString());
                        mt.setText(textContent.getValue().toString());
                        mt.setTitle(title.getValue().toString());

                        event.getButton().getWindow().setVisible(false);
                        event.getButton().getWindow().getParent().removeComponent(event.getButton().getWindow());
                        event.getButton().getWindow().getParent().showNotification("Saved successfully",
                                Notification.TYPE_HUMANIZED_MESSAGE);

                        final int beanIndex = tl.getBeanContainer().indexOfId(mt.getId());
                        tl.getBeanContainer().removeItem(mt.getId());
                        tl.getBeanContainer().addItemAt(beanIndex, mt.getId(), mt);
                    }
                    TemplateSelectBox.reloadSelect();
                }
            }
        });

        hLayout.addComponent(saveButton);
        hLayout.addComponent(cancel);
        hLayout.setSpacing(true);

        VerticalLayout metaDataLayout = new VerticalLayout();

        Panel textFieldPanel = new Panel("Meta Data");
        VerticalLayout metaLayout = new VerticalLayout();
        metaLayout.addComponent(title);
        metaLayout.addComponent(subject);
        textFieldPanel.addComponent(metaLayout);

        Panel helpPanel = new Panel("Template Documentation");
        assembleHelpComponents(helpPanel);

        metaDataLayout.addComponent(textFieldPanel);
        metaDataLayout.addComponent(helpPanel);

        tSheet.addTab(metaDataLayout).setCaption("Meta Data");

        VerticalLayout textLayout = new VerticalLayout();
        textLayout.addComponent(textContent);
        tSheet.addTab(textLayout).setCaption("Text Content");

        VerticalLayout htmlLayout = new VerticalLayout();
        htmlLayout.addComponent(htmlContent);
        tSheet.addTab(htmlLayout).setCaption("HTML Content");

        rootPanel.addComponent(tSheet);
        rootPanel.addComponent(hLayout);
        addComponent(rootPanel);
    }

    private void assembleHelpComponents(final Panel helpRootPanel) {
        VerticalLayout vHelpLayout = new VerticalLayout();

        Link velocityLink = new Link("Velocity User Guide",
                new ExternalResource("http://velocity.apache.org/engine/releases/velocity-1.7/user-guide.html"));
        velocityLink.setTargetName("_blank");
        Label helpText1 = new Label(
                "<p>You can find the basic template language user guide at the vendors homepage.</p>",
                Label.CONTENT_XHTML);
        Label helpText2 = new Label(
                "<p>The standard set of commands is enriched with our application specific variables."
                        + "Those will help you to get the newsletter personalized. See below for a list of variables and and macros.</p>",
                Label.CONTENT_XHTML);

        Accordion accordion = new Accordion();

        // Sender
        StringBuilder senderText = new StringBuilder("<dl>");
        senderText.append("<dt>sender.uuid.id</dt><dd>The unique id of the sender</dd>");
        senderText.append("<dt>sender.name</dt><dd>The name of the sender</dd>");
        senderText.append("<dt>sender.email.from</dt><dd>The 'from' eMail of the sender</dd>");
        senderText.append("<dt>sender.email.replyto</dt><dd>The reply-to eMail of the sender</dd>");
        senderText.append("</dl>");
        Label senderLabel = new Label(senderText.toString(), Label.CONTENT_XHTML);
        VerticalLayout senderBox = new VerticalLayout();
        senderBox.addComponent(senderLabel);
        senderBox.setMargin(true);
        accordion.addTab(senderBox).setCaption("Sender");

        // Recipient
        StringBuilder recipientText = new StringBuilder("<dl>");
        recipientText.append("<dt>recipient.uuid.id</dt><dd>The unique id of the recipient</dd>");
        recipientText.append(
                "<dt>recipient.uuid.external</dt><dd>The external (e.g. imported from the live system) id of the recipient</dd>");
        recipientText.append("<dt>recipient.name</dt><dd>The name of the recipient</dd>");
        recipientText.append("<dt>recipient.email</dt><dd>The eMail of the recipient</dd>");
        recipientText.append("<dt>recipient.name.title</dt><dd>The reply-to eMail of the sender</dd>");
        recipientText.append("<dt>recipient.name.first</dt><dd>The reply-to eMail of the sender</dd>");
        recipientText.append("<dt>recipient.name.last</dt><dd>The reply-to eMail of the sender</dd>");
        recipientText.append("<dt>recipient.gender</dt><dd>The reply-to eMail of the sender</dd>");
        recipientText.append("<dt>recipient.birthday</dt><dd>The reply-to eMail of the sender</dd>");
        recipientText.append("<dt>recipient.language</dt><dd>The reply-to eMail of the sender</dd>");
        recipientText.append("<dt>recipient.location.city</dt><dd>The reply-to eMail of the sender</dd>");
        recipientText.append("<dt>recipient.location.country</dt><dd>The reply-to eMail of the sender</dd>");
        recipientText.append("</dl>");
        Label recipientLabel = new Label(recipientText.toString(), Label.CONTENT_XHTML);
        VerticalLayout recipientBox = new VerticalLayout();
        recipientBox.addComponent(recipientLabel);
        recipientBox.setMargin(true);
        accordion.addTab(recipientBox).setCaption("Recipient");

        // Mail
        StringBuilder mailText = new StringBuilder("<dl>");
        mailText.append("<dt>recipient.uuid.id</dt><dd>The unique id of the recipient</dd>");
        mailText.append(
                "<dt>recipient.uuid.external</dt><dd>The external (e.g. imported from the live system) id of the recipient</dd>");
        mailText.append("</dl>");
        Label mailLabel = new Label(mailText.toString(), Label.CONTENT_XHTML);
        VerticalLayout mailBox = new VerticalLayout();
        mailBox.addComponent(mailLabel);
        mailBox.setMargin(true);
        accordion.addTab(mailBox).setCaption("Mail");

        // Campaign
        StringBuilder campaignText = new StringBuilder("<dl>");
        campaignText.append("<dt>recipient.uuid.id</dt><dd>The unique id of the recipient</dd>");
        campaignText.append(
                "<dt>recipient.uuid.external</dt><dd>The external (e.g. imported from the live system) id of the recipient</dd>");
        campaignText.append("<dt>recipient.name</dt><dd>The name of the recipient</dd>");
        campaignText.append("<dt>recipient.email</dt><dd>The eMail of the recipient</dd>");
        campaignText.append("<dt>sender.email.replyto</dt><dd>The reply-to eMail of the sender</dd>");
        campaignText.append("</dl>");
        Label campaignLabel = new Label(campaignText.toString(), Label.CONTENT_XHTML);
        VerticalLayout campaignBox = new VerticalLayout();
        campaignBox.addComponent(campaignLabel);
        campaignBox.setMargin(true);
        accordion.addTab(campaignBox).setCaption("Campaign");

        vHelpLayout.addComponent(helpText1);
        vHelpLayout.addComponent(velocityLink);
        vHelpLayout.addComponent(helpText2);
        vHelpLayout.addComponent(accordion);

        helpRootPanel.addComponent(vHelpLayout);
    }
}