/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2013, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.adm.ui;
import com.vaadin.addon.jpacontainer.JPAContainer;
import com.vaadin.addon.jpacontainer.provider.CachingLocalEntityProvider;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.event.ItemClickEvent;
import com.vaadin.ui.AbstractField;
import com.vaadin.ui.Button;
import com.vaadin.ui.Form;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.RichTextArea;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
import org.tepi.filtertable.FilterTable;
import ru.codeinside.adm.AdminServiceProvider;
import ru.codeinside.adm.database.News;
import ru.codeinside.jpa.ActivitiEntityManager;
public class CrudNews extends VerticalLayout {
FilterTable tableNews;
Form systemForm;
TextField id = (TextField) createField("Идентификатор", true);
TextField title = (TextField) createField("Заголовок", false);
RichTextArea text = (RichTextArea) createField("Содержимое", false);
TextField dateCreated = (TextField) createField("Дата создания", true);
Button create = new Button("Создать", new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
try {
if (minLength(null)) {
return;
}
systemForm.commit();
tableNews.setValue(AdminServiceProvider.get().createNews(title.getValue().toString(), text.getValue().toString()).getId());
} catch (Exception e) {
//
}
}
});
Button update = new Button("Изменить", new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
String id1 = systemForm.getField("id").getValue().toString();
if (minLength(id1)) {
return;
}
AdminServiceProvider.get().updateNews(Long.parseLong(id1),
systemForm.getField("title").getValue(),
systemForm.getField("text").getValue()
);
tableNews.setValue(null);
}
});
Button remove = new Button("Удалить", new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
long itemId = 0;
try {
itemId = Long.parseLong(id.getValue().toString());
} catch (Exception ex) {
getWindow().showNotification("Не выбрана новость для удаления.", Window.Notification.TYPE_ERROR_MESSAGE);
}
if (itemId != 0) {
AdminServiceProvider.get().deleteNews(itemId);
tableNews.setValue(null);
}
}
});
Button reset = new Button("Сбросить", new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent event) {
tableNews.setValue(null);
}
});
public CrudNews() {
addComponent(createForm());
addComponent(createTable());
final HorizontalLayout buttons = new HorizontalLayout();
buttons.setSpacing(true);
buttons.addComponent(create);
update.setVisible(false);
buttons.addComponent(update);
remove.setVisible(false);
buttons.addComponent(remove);
buttons.addComponent(reset);
reset.setVisible(false);
systemForm.getFooter().addComponent(buttons);
setExpandRatio(getComponent(0), 0.3f);
setExpandRatio(getComponent(1), 0.7f);
setSpacing(true);
setMargin(true);
}
private Panel createForm() {
systemForm = new Form();
title.setRequired(true);
text.setRequired(true);
systemForm.setValidationVisibleOnCommit(false);
systemForm.addField("id", id);
systemForm.addField("title", title);
systemForm.addField("text", text);
systemForm.addField("dateCreated", dateCreated);
systemForm.setWriteThrough(false);
systemForm.setInvalidCommitted(false);
Panel upperPanel = new Panel();
upperPanel.setSizeFull();
upperPanel.addComponent(systemForm);
return upperPanel;
}
private Panel createTable() {
tableNews = new FilterTable("Список новостей");
tableNews.setFilterBarVisible(true);
tableNews.setSizeFull();
tableNews.setImmediate(true);
tableNews.setSelectable(true);
tableNews.setPageLength(5);
tableNews.setFilterDecorator(new FilterDecorator_());
final JPAContainer<News> container = new JPAContainer<News>(News.class);
container.setEntityProvider(new CachingLocalEntityProvider<News>(News.class, ActivitiEntityManager.INSTANCE));
tableNews.setContainerDataSource(container);
tableNews.setVisibleColumns(new Object[]{"id", "title", "text", "dateCreated"});
tableNews.setColumnHeaders(new String[]{"id", "Заголовок", "Содержимое", "Дата создания"});
tableNews.setColumnExpandRatio("id", 4);
tableNews.setColumnExpandRatio("title", 20);
tableNews.setColumnExpandRatio("text", 60);
tableNews.setColumnExpandRatio("dateCreated", 14);
tableNews.setFilterGenerator(new FilterGenerator_());
tableNews.addListener(new Property.ValueChangeListener() {
@Override
public void valueChange(Property.ValueChangeEvent event) {
systemForm.setValidationVisible(false);
((JPAContainer) tableNews.getContainerDataSource()).refresh();
if (event.getProperty().getValue() != null) {
create.setVisible(false);
update.setVisible(true);
remove.setVisible(true);
reset.setVisible(true);
} else {
systemForm.getField("id").setReadOnly(false);
systemForm.getField("id").setValue("");
systemForm.getField("id").setReadOnly(true);
systemForm.getField("title").setValue("");
systemForm.getField("text").setValue("");
systemForm.getField("dateCreated").setReadOnly(false);
systemForm.getField("dateCreated").setValue("");
systemForm.getField("dateCreated").setReadOnly(true);
create.setVisible(true);
update.setVisible(false);
remove.setVisible(false);
reset.setVisible(false);
}
}
});
tableNews.addListener(new ItemClickEvent.ItemClickListener() {
@Override
public void itemClick(ItemClickEvent event) {
Item item = event.getItem();
id.setReadOnly(false);
id.setValue(item.getItemProperty("id").getValue());
id.setReadOnly(true);
title.setValue(item.getItemProperty("title").getValue());
text.setValue(item.getItemProperty("text").getValue());
dateCreated.setReadOnly(false);
dateCreated.setValue(item.getItemProperty("dateCreated").getValue());
dateCreated.setReadOnly(true);
}
});
Panel lowerPanel = new Panel();
lowerPanel.setSizeFull();
lowerPanel.addComponent(tableNews);
return lowerPanel;
}
private AbstractField createField(String caption, Boolean readOnly) {
AbstractField textField;
if (caption.equals("Содержимое")) {
textField = new RichTextArea(caption);
} else {
textField = new TextField(caption);
((TextField) textField).setMaxLength(255);
}
textField.setImmediate(true);
textField.setWidth("40%");
textField.setReadOnly(readOnly);
return textField;
}
private Boolean minLength(String id1) {
if (id1 != null && id1.length() == 0) {
return true;
} else if (title.getValue().toString().length() < 3) {
systemForm.getWindow().showNotification("Поле \"Заголовок\" содержит меньше 3 символов", Window.Notification.TYPE_ERROR_MESSAGE);
return true;
}
String str = text.getValue().toString();
if (str.equals("<br>")) {
systemForm.getWindow().showNotification("Поле \"Содержимое\" содержит меньше 5 символов", Window.Notification.TYPE_ERROR_MESSAGE);
return true;
}
str = str.replaceAll("<(.)+?>", "");
str = str.replaceAll("<(\n)+?>", "");
if (str.length() < 5) {
systemForm.getWindow().showNotification("Поле \"Содержимое\" содержит меньше 5 символов", Window.Notification.TYPE_ERROR_MESSAGE);
return true;
}
return false;
}
}