/*
* Copyright (C) 2017 LibreCCM Foundation.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
package org.librecms.ui;
import com.vaadin.icons.VaadinIcons;
import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.Grid;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.components.grid.HeaderCell;
import com.vaadin.ui.components.grid.HeaderRow;
import com.vaadin.ui.themes.ValoTheme;
import org.libreccm.l10n.LocalizedTextsUtil;
import org.libreccm.ui.ConfirmDialog;
import org.librecms.CmsConstants;
import org.librecms.pages.Pages;
import org.librecms.pages.PagesRepository;
/**
*
* @author Jens Pelzetter
*/
class PagesTab extends CustomComponent {
private static final long serialVersionUID = 8237082714759130342L;
private static final String COL_NAME = "name";
private static final String COL_SITE = "site";
private static final String COL_EDIT = "edit";
private static final String COL_DEL = "del";
private final CmsViewController controller;
private final LocalizedTextsUtil textsUtil;
PagesTab(final CmsViewController controller) {
super();
this.controller = controller;
textsUtil = controller
.getGlobalizationHelper()
.getLocalizedTextsUtil(CmsConstants.CMS_BUNDLE);
final Grid pagesGrid = new Grid<>();
// pagesGrid
// .addColumn(Pages::getPrimaryUrl)
// .setCaption("cms.ui.contentcenter.pagestable.columns.name.header")
// .setId(COL_NAME);
pagesGrid
.addComponentColumn(this::buildDetailsLink)
.setCaption(textsUtil
.getText("cms.ui.contentcenter.pagestable.columns.name.header"))
.setId(COL_NAME);
pagesGrid
.addColumn(pages -> pages.getSite().getDomainOfSite())
.setCaption(textsUtil
.getText("cms.ui.contentcenter.pagestable.columns.site.header"))
.setId(COL_SITE);
pagesGrid
.addComponentColumn(this::buildEditButton)
.setCaption(textsUtil
.getText("cms.ui.contentcenter.pagestable.columns.edit.header"))
.setId(COL_EDIT);
pagesGrid
.addComponentColumn(this::buildDeleteButton)
.setCaption(textsUtil
.getText("cms.ui.contentcenter.pagestable.columns.delete.header"))
.setId(COL_DEL);
final Button addPagesButton = new Button(textsUtil
.getText("cms.ui.contentcenter.pages.add_link"));
addPagesButton.addStyleName(ValoTheme.BUTTON_TINY);
addPagesButton.setIcon(VaadinIcons.PLUS_CIRCLE_O);
addPagesButton.addClickListener(this::addPagesButtonClicked);
final HeaderRow headerRow = pagesGrid.prependHeaderRow();
final HeaderCell headerCell = headerRow
.join(COL_NAME, COL_SITE, COL_EDIT, COL_DEL);
headerCell.setComponent(new HorizontalLayout(addPagesButton));
pagesGrid.setDataProvider(controller
.getPagesController()
.getPagesGridDataProvider());
pagesGrid.setWidth("100%");
super.setCompositionRoot(new VerticalLayout(pagesGrid));
}
private Component buildDetailsLink(final Pages pages) {
final Button button = new Button(pages.getPrimaryUrl());
button.addStyleName(ValoTheme.BUTTON_LINK);
button.addClickListener(event -> detailsLinkClicked(event, pages));
return button;
}
private Component buildEditButton(final Pages pages) {
final Button button = new Button(textsUtil
.getText("cms.ui.contentcenter.pages.edit.label"));
button.setIcon(VaadinIcons.EDIT);
button.addStyleName(ValoTheme.BUTTON_TINY);
button.addClickListener(event -> editButtonClicked(event, pages));
return button;
}
private Component buildDeleteButton(final Pages pages) {
final Button button = new Button(textsUtil
.getText("cms.ui.contentcenter.pages.delete.label"));
button.setIcon(VaadinIcons.MINUS_CIRCLE_O);
button.addStyleNames(ValoTheme.BUTTON_TINY,
ValoTheme.BUTTON_DANGER);
button.addClickListener(event -> deleteButtonClicked(event, pages));
return button;
}
private void addPagesButtonClicked(final Button.ClickEvent event) {
final PagesEditor editor = new PagesEditor(controller);
editor.setModal(true);
editor.setWidth("40%");
editor.setHeight("60%");
UI.getCurrent().addWindow(editor);
}
private void detailsLinkClicked(final Button.ClickEvent event,
final Pages pages) {
final PagesDetails pagesDetails = new PagesDetails(pages, controller);
pagesDetails.setModal(true);
pagesDetails.setWidth("90%");
pagesDetails.setHeight("90%");
UI.getCurrent().addWindow(pagesDetails);
}
private void editButtonClicked(final Button.ClickEvent event,
final Pages pages) {
final PagesEditor pagesEditor = new PagesEditor(pages, controller);
pagesEditor.setModal(true);
pagesEditor.setWidth("40%");
pagesEditor.setHeight("80%");
UI.getCurrent().addWindow(pagesEditor);
}
private void deleteButtonClicked(final Button.ClickEvent event,
final Pages pages) {
final ConfirmDialog confirmDialog
= new ConfirmDialog(() -> deletePages(pages));
confirmDialog.setMessage(textsUtil
.getText("cms.ui.contentcenter.pages.delete.confirm"));
confirmDialog.setModal(true);
UI.getCurrent().addWindow(confirmDialog);
}
private Void deletePages(final Pages pages) {
final PagesRepository pagesRepo = controller
.getPagesController()
.getPagesRepo();
pagesRepo.delete(pages);
controller
.getPagesController()
.getPagesGridDataProvider()
.refreshAll();
return null;
}
}