diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesController.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesController.java index 204cd7c80..80184e990 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesController.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesController.java @@ -48,6 +48,7 @@ class SitesController implements Serializable { .findAll() .stream() .map(this::buildRow) + .sorted() .collect(Collectors.toList()); } diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesForm.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesForm.java index 9683d7c53..3e53aad4a 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesForm.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesForm.java @@ -112,6 +112,9 @@ public class SitesForm extends Form { super.add(defaultSiteCheckbox); defaultThemeSelect = new SingleSelect(THEME_SELECT); + defaultThemeSelect.setLabel(new GlobalizedMessage( + "ui.admin.sites.default_theme", + ADMIN_BUNDLE)); try { defaultThemeSelect.addPrintListener(event -> { diff --git a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTableRow.java b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTableRow.java index 45fd948c7..3facc9900 100644 --- a/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTableRow.java +++ b/ccm-core/src/main/java/com/arsdigita/ui/admin/sites/SitesTableRow.java @@ -27,7 +27,7 @@ import java.util.List; * * @author Jens Pelzetter */ -class SitesTableRow implements Serializable { +class SitesTableRow implements Comparable, Serializable { private static final long serialVersionUID = -8913595737414248135L; @@ -98,5 +98,10 @@ class SitesTableRow implements Serializable { protected void addApplication(final String application) { applications.add(application); } + + @Override + public int compareTo(final SitesTableRow other) { + return domainOfSite.compareTo(other.getDomainOfSite()); + } } diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java b/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java index 1e1404a41..06a81873c 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/AdminView.java @@ -56,7 +56,7 @@ public class AdminView extends CustomComponent implements View { private final JpqlConsole jpqlConsole; private final ConfigurationTab configurationTab; - + private final SystemInformationTab sysInfoTab; @Inject @@ -75,7 +75,7 @@ public class AdminView extends CustomComponent implements View { tabUsersGroupsRoles = tabSheet .addTab(usersGroupsRoles, bundle.getString("ui.admin.tab.users_groups_roles.title")); - + final ServletContext servletContext = VaadinServlet .getCurrent() .getServletContext(); @@ -86,12 +86,15 @@ public class AdminView extends CustomComponent implements View { jpqlConsole = null; } + final SitesTab sitesTab = new SitesTab(controller); + tabSheet.addTab(sitesTab, "Sites"); + configurationTab = new ConfigurationTab(); tabSheet.addTab(configurationTab, "Configuration"); sysInfoTab = new SystemInformationTab(controller); tabSheet.addTab(sysInfoTab, "System Information"); - + final CssLayout footer = new CssLayout(); footer.setHeight("5em"); @@ -104,7 +107,4 @@ public class AdminView extends CustomComponent implements View { super.setCompositionRoot(viewLayout); } - - - } diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/AdminViewController.java b/ccm-core/src/main/java/org/libreccm/admin/ui/AdminViewController.java index 24a2ba6e1..3ff397497 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/AdminViewController.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/AdminViewController.java @@ -45,6 +45,9 @@ class AdminViewController implements Serializable { @Inject private JpqlConsoleController jpqlConsoleController; + @Inject + private SitesController sitesController; + @Inject private UsersGroupsRolesController usersGroupsRolesController; @@ -64,6 +67,10 @@ class AdminViewController implements Serializable { return jpqlConsoleController; } + protected SitesController getSitesController() { + return sitesController; + } + protected UsersGroupsRolesController getUsersGroupsRolesController() { return usersGroupsRolesController; } diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/SiteEditor.java b/ccm-core/src/main/java/org/libreccm/admin/ui/SiteEditor.java new file mode 100644 index 000000000..7e132975f --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/SiteEditor.java @@ -0,0 +1,167 @@ +/* + * 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.libreccm.admin.ui; + +import com.arsdigita.ui.admin.AdminUiConstants; + +import com.vaadin.server.UserError; +import com.vaadin.ui.Button; +import com.vaadin.ui.CheckBox; +import com.vaadin.ui.FormLayout; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.NativeSelect; +import com.vaadin.ui.TextField; +import com.vaadin.ui.VerticalLayout; +import com.vaadin.ui.Window; +import org.libreccm.l10n.LocalizedTextsUtil; +import org.libreccm.sites.Site; +import org.libreccm.theming.ThemeInfo; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * + * @author Jens Pelzetter + */ +class SiteEditor extends Window { + + private static final long serialVersionUID = 7016158691791408762L; + + private final Site site; + private final AdminViewController controller; + + private boolean dataHasChanged = false; + + public SiteEditor(final AdminViewController controller) { + super(); + + this.site = null; + this.controller = controller; + + addWidgets(); + } + + public SiteEditor(final Site site, final AdminViewController controller) { + + super(); + + this.site = site; + this.controller = controller; + + addWidgets(); + } + + private void addWidgets() { + + final LocalizedTextsUtil adminTextsUtil = controller + .getGlobalizationHelper() + .getLocalizedTextsUtil(AdminUiConstants.ADMIN_BUNDLE); + + if (site == null) { + setCaption(adminTextsUtil.getText("ui.admin.sites.create_new")); + } else { + setCaption(adminTextsUtil.getText("ui.admin.sites.edit")); + } + + final TextField domainOfSiteField = new TextField( + adminTextsUtil.getText("ui.admin.sites.domain_of_site")); + domainOfSiteField.addValueChangeListener(event -> { + dataHasChanged = true; + }); + + final CheckBox isDefaultSiteCheckBox = new CheckBox( + adminTextsUtil.getText("ui.admin.sites.is_default_site")); + isDefaultSiteCheckBox.addValueChangeListener(event -> { + dataHasChanged = true; + }); + + final List themes = controller + .getSitesController() + .getThemes() + .getAvailableThemes() + .stream() + .map(ThemeInfo::getName) + .collect(Collectors.toList()); + + final NativeSelect defaultThemeSelect = new NativeSelect<>( + adminTextsUtil.getText("ui.admin.sites.default_theme"), themes); + defaultThemeSelect.addValueChangeListener(event -> { + dataHasChanged = true; + }); + + final Button saveButton = new Button(); + if (site == null) { + saveButton.setCaption(adminTextsUtil.getText( + "ui.admin.sites.buttons.save.create")); + } else { + saveButton.setCaption(adminTextsUtil.getText( + "ui.admin.sites.buttons.save.changed")); + } + saveButton.addClickListener(event -> { + if (dataHasChanged) { + + final String domainOfSite = domainOfSiteField.getValue(); + if (domainOfSite == null + || domainOfSite.isEmpty() + || domainOfSite.matches("\\s*")) { + + domainOfSiteField.setComponentError(new UserError( + adminTextsUtil.getText( + "ui.admin.sites.domain_of_site.error.empty"))); + return; + } + + if (!controller.getSitesController().isUnique(domainOfSite)) { + domainOfSiteField.setComponentError(new UserError( + adminTextsUtil.getText( + "ui.admin.sites.domain_of_site.error.not_unique"))); + return; + } + + site.setDomainOfSite(domainOfSite); + site.setDefaultSite(isDefaultSiteCheckBox.getValue()); + site.setDefaultTheme(defaultThemeSelect.getValue()); + + controller + .getSitesController() + .getSiteRepository() + .save(site); + controller + .getSitesController() + .getSitesTableDataProvider() + .refreshAll(); + close(); + } + }); + + final Button cancelButton = new Button(adminTextsUtil + .getText("ui.admin.sites.buttons.cancel")); + cancelButton.addClickListener(event -> { + close(); + }); + + super.setContent(new VerticalLayout( + new FormLayout(domainOfSiteField, + isDefaultSiteCheckBox, + defaultThemeSelect), + new HorizontalLayout(saveButton, cancelButton))); + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/SitesController.java b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesController.java new file mode 100644 index 000000000..e7a3f415e --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesController.java @@ -0,0 +1,87 @@ +/* + * 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.libreccm.admin.ui; + +import com.vaadin.cdi.ViewScoped; +import org.libreccm.sites.Site; +import org.libreccm.sites.SiteRepository; +import org.libreccm.theming.Themes; + +import java.io.Serializable; + +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@ViewScoped +class SitesController implements Serializable { + + private static final long serialVersionUID = 112502641827852807L; + + @Inject + private SiteRepository siteRepository; + + @Inject + private SitesTableDataProvider sitesTableDataProvider; + + @Inject + private Themes themes; + + protected SitesTableDataProvider getSitesTableDataProvider() { + return sitesTableDataProvider; + } + + protected Themes getThemes() { + return themes; + } + + protected SiteRepository getSiteRepository() { + return siteRepository; + } + + /** + * Check if there no site with the provided domain. + * + * @param domainOfSite + * + * @return {@code true} if there is no site with the provided domain, + * {@code false} otherwise. + */ + @Transactional(Transactional.TxType.REQUIRED) + protected boolean isUnique(final String domainOfSite) { + + return !siteRepository.findByDomain(domainOfSite).isPresent(); + } + + @Transactional(Transactional.TxType.REQUIRED) + protected void delete(final long siteId) { + final Site site = siteRepository + .findById(siteId) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No site with ID %d in the database.", + siteId))); + siteRepository.delete(site); + sitesTableDataProvider.refreshAll(); + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTab.java b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTab.java new file mode 100644 index 000000000..198b00505 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTab.java @@ -0,0 +1,169 @@ +/* + * 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.libreccm.admin.ui; + +import com.arsdigita.ui.admin.AdminUiConstants; + +import com.vaadin.icons.VaadinIcons; +import com.vaadin.shared.ui.ContentMode; +import com.vaadin.ui.Button; +import com.vaadin.ui.CustomComponent; +import com.vaadin.ui.Grid; +import com.vaadin.ui.HorizontalLayout; +import com.vaadin.ui.Label; +import com.vaadin.ui.UI; +import com.vaadin.ui.components.grid.HeaderCell; +import com.vaadin.ui.components.grid.HeaderRow; +import com.vaadin.ui.themes.ValoTheme; +import org.libreccm.cdi.utils.CdiUtil; +import org.libreccm.l10n.LocalizedTextsUtil; +import org.libreccm.sites.Site; +import org.libreccm.ui.ConfirmDialog; + +/** + * + * @author Jens Pelzetter + */ +class SitesTab extends CustomComponent { + + private static final long serialVersionUID = 9188476373782633282L; + + private static final String COL_DOMAIN_OF_SITE = "domain_of_site"; + private static final String COL_IS_DEFAULT_SITE = "is_default_site"; + private static final String COL_DEFAULT_THEME = "default_theme"; + private static final String COL_APPLICATIONS = "applications"; + private static final String COL_EDIT = "edit"; + private static final String COL_DELETE = "delete"; + + protected SitesTab(final AdminViewController adminViewController) { + + super(); + + final LocalizedTextsUtil adminTextsUtil = adminViewController + .getGlobalizationHelper() + .getLocalizedTextsUtil(AdminUiConstants.ADMIN_BUNDLE); + + final SitesController controller = adminViewController + .getSitesController(); + + final Grid sitesGrid = new Grid<>(); + sitesGrid + .addColumn(SitesTableRowData::getDomainOfSite) + .setCaption(adminTextsUtil.getText( + "ui.admin.sites.table.columns.domain.header")) + .setId(COL_DOMAIN_OF_SITE); + sitesGrid + .addColumn(SitesTableRowData::isDefaultSite) + .setCaption(adminTextsUtil.getText( + "ui.admin.sites.table.columns.default_site.header")) + .setId(COL_IS_DEFAULT_SITE); + sitesGrid + .addColumn(SitesTableRowData::getDefaultTheme) + .setCaption(adminTextsUtil.getText( + "ui.admin.sites.table.columns.default_theme.header")) + .setId(COL_DEFAULT_THEME); + sitesGrid + .addComponentColumn(row -> { + return new Label(String.join("\n", + row.getApplications()), + ContentMode.PREFORMATTED); + }) + .setCaption(adminTextsUtil + .getText("ui.admin.sites.table.columns.applications.header")) + .setId(COL_APPLICATIONS); + sitesGrid + .addComponentColumn(row -> { + final Button editButton = new Button(adminTextsUtil + .getText("ui.admin.sites.table.buttons.edit"), + VaadinIcons.EDIT); + editButton.addClickListener(event -> { + final Site site = adminViewController + .getSitesController() + .getSiteRepository() + .findById(row.getSiteId()) + .orElseThrow(() -> new IllegalArgumentException(String + .format("No Site with ID %d in the database.", + row.getSiteId()))); + final SiteEditor editor = new SiteEditor( + site, adminViewController); + editor.center(); + editor.setWidth("66%"); + editor.setHeight("80%"); + UI.getCurrent().addWindow(editor); + }); + editButton.addStyleName(ValoTheme.BUTTON_TINY); + + return editButton; + }) + .setId(COL_EDIT); + sitesGrid + .addComponentColumn(row -> { + if (row.isDeletable()) { + final Button deleteButton = new Button(adminTextsUtil + .getText("ui.admin.sites.table.buttons.delete"), + VaadinIcons.EDIT); + deleteButton.addClickListener(event -> { + + final ConfirmDialog dialog = new ConfirmDialog(() -> { + adminViewController + .getSitesController() + .delete(row.getSiteId()); + + return null; + }); + }); + deleteButton.addStyleNames(ValoTheme.BUTTON_TINY, + ValoTheme.BUTTON_DANGER); + + return deleteButton; + } else { + return new Label(""); + } + }) + .setId(COL_DELETE); + final HeaderRow headerRow = sitesGrid.prependHeaderRow(); + final HeaderCell headerCell = headerRow.join(COL_DOMAIN_OF_SITE, + COL_IS_DEFAULT_SITE, + COL_DEFAULT_THEME, + COL_APPLICATIONS, + COL_EDIT, + COL_DELETE); + final Button newSiteButton = new Button(adminTextsUtil + .getText("ui.admin.sites.add_new_site_link"), + VaadinIcons.PLUS_CIRCLE_O); + newSiteButton.addStyleName(ValoTheme.BUTTON_TINY); + newSiteButton.addClickListener(event -> { + final SiteEditor editor = new SiteEditor(adminViewController); + editor.center(); + editor.setWidth("66%"); + editor.setHeight("80%"); + UI.getCurrent().addWindow(editor); + }); + final HorizontalLayout headerLayout + = new HorizontalLayout(newSiteButton); + headerCell.setComponent(headerLayout); + sitesGrid.setDataProvider(adminViewController + .getSitesController() + .getSitesTableDataProvider()); + sitesGrid.setWidth("100%"); + + super.setCompositionRoot(sitesGrid); + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTableDataProvider.java b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTableDataProvider.java new file mode 100644 index 000000000..654f9003a --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTableDataProvider.java @@ -0,0 +1,149 @@ +/* + * 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.libreccm.admin.ui; + +import com.vaadin.cdi.ViewScoped; +import com.vaadin.data.provider.AbstractDataProvider; +import com.vaadin.data.provider.Query; +import org.libreccm.sites.Site; +import org.libreccm.sites.SiteRepository; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.inject.Inject; +import javax.persistence.EntityManager; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import javax.transaction.Transactional; + +/** + * + * @author Jens Pelzetter + */ +@ViewScoped +public class SitesTableDataProvider + // extends AbstractBackEndDataProvider { + extends AbstractDataProvider { + + private static final long serialVersionUID = 2696603483924152498L; + + @Inject + private EntityManager entityManager; + + @Inject + private SiteRepository siteRepository; + +// @Override +// @Transactional(Transactional.TxType.REQUIRED) +// public Stream fetchFromBackEnd( +// final Query query) { +// +// final CriteriaBuilder criteriaBuilder = entityManager +// .getCriteriaBuilder(); +// final CriteriaQuery criteriaQuery = criteriaBuilder +// .createQuery(Site.class); +// final Root from = criteriaQuery.from(Site.class); +// +// criteriaQuery.orderBy(criteriaBuilder.asc(from.get("domainOfSite"))); +// +// return entityManager +// .createQuery(criteriaQuery) +// .setFirstResult(query.getOffset()) +// .setMaxResults(query.getLimit()) +// .getResultList() +// .stream() +// .map(this::buildRow); +// } +// +// @Transactional(Transactional.TxType.REQUIRED) +// @Override +// public int sizeInBackEnd(final Query query) { +// +// return siteRepository.findAll().size(); +// } + private SitesTableRowData buildRow(final Site site) { + + final SitesTableRowData row = new SitesTableRowData(); + + row.setSiteId(site.getObjectId()); + row.setDomainOfSite(site.getDomainOfSite()); + row.setDefaultSite(site.isDefaultSite()); + row.setDefaultTheme(site.getDefaultTheme()); + row.setDeletable(site.getApplications().isEmpty()); + + final List applications = site + .getApplications() + .stream() + .map(application -> application.getPrimaryUrl()) + .collect(Collectors.toList()); + + row.setApplications(applications); + return row; + } + + @Override + public boolean isInMemory() { + return false; + } + + @Override + public int size(final Query query) { + return siteRepository.findAll().size(); + } + + @Override + @Transactional(Transactional.TxType.REQUIRED) + public Stream fetch( + final Query query) { + + final CriteriaBuilder criteriaBuilder = entityManager + .getCriteriaBuilder(); + final CriteriaQuery criteriaQuery = criteriaBuilder + .createQuery(Site.class); + final Root from = criteriaQuery.from(Site.class); + + criteriaQuery.orderBy(criteriaBuilder.asc(from.get("domainOfSite"))); + + final List sites = entityManager + .createQuery(criteriaQuery) + .setFirstResult(query.getOffset()) + .setMaxResults(query.getLimit()) + .getResultList(); + final List rows = new ArrayList<>(); + for (final Site site : sites) { + final SitesTableRowData row = buildRow(site); + rows.add(row); + } + + return rows.stream(); + +// return entityManager +// .createQuery(criteriaQuery) +// .setFirstResult(query.getOffset()) +// .setMaxResults(query.getLimit()) +// .getResultList() +// .stream() +// .map(this::buildRow); + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTableRowData.java b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTableRowData.java new file mode 100644 index 000000000..7fb8c9b4e --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/SitesTableRowData.java @@ -0,0 +1,107 @@ +/* + * 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.libreccm.admin.ui; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * + * @author Jens Pelzetter + */ +public class SitesTableRowData implements Comparable, Serializable { + + private static final long serialVersionUID = 4023882563583816258L; + + private long siteId; + + private String domainOfSite; + + private boolean defaultSite; + + private String defaultTheme; + + private boolean deletable; + + private List applications; + + protected SitesTableRowData() { + applications = new ArrayList<>(); + } + + public long getSiteId() { + return siteId; + } + + public void setSiteId(final long siteId) { + this.siteId = siteId; + } + + public String getDomainOfSite() { + return domainOfSite; + } + + public void setDomainOfSite(final String domainOfSite) { + this.domainOfSite = domainOfSite; + } + + public boolean isDefaultSite() { + return defaultSite; + } + + public void setDefaultSite(final boolean defaultSite) { + this.defaultSite = defaultSite; + } + + public String getDefaultTheme() { + return defaultTheme; + } + + public void setDefaultTheme(final String defaultTheme) { + this.defaultTheme = defaultTheme; + } + + public boolean isDeletable() { + return deletable; + } + + public void setDeletable(final boolean deletable) { + this.deletable = deletable; + } + + public List getApplications() { + return Collections.unmodifiableList(applications); + } + + protected void setApplications(final List applications) { + this.applications = new ArrayList<>(applications); + } + + protected void addApplication(final String application) { + applications.add(application); + } + + @Override + public int compareTo(final SitesTableRowData other) { + return domainOfSite.compareTo(other.getDomainOfSite()); + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/SystemInformationTab.java b/ccm-core/src/main/java/org/libreccm/admin/ui/SystemInformationTab.java index cf272a94e..41b1e5600 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/SystemInformationTab.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/SystemInformationTab.java @@ -54,6 +54,8 @@ class SystemInformationTab extends CustomComponent { protected SystemInformationTab(final AdminViewController controller) { + super(); + final LocalizedTextsUtil adminTextsUtil = controller .getGlobalizationHelper() .getLocalizedTextsUtil(AdminUiConstants.ADMIN_BUNDLE); diff --git a/ccm-core/src/main/java/org/libreccm/admin/ui/UsersGroupsRolesTab.java b/ccm-core/src/main/java/org/libreccm/admin/ui/UsersGroupsRolesTab.java index e9552dc9c..5901f1685 100644 --- a/ccm-core/src/main/java/org/libreccm/admin/ui/UsersGroupsRolesTab.java +++ b/ccm-core/src/main/java/org/libreccm/admin/ui/UsersGroupsRolesTab.java @@ -18,12 +18,8 @@ */ package org.libreccm.admin.ui; -import com.arsdigita.ui.admin.AdminUiConstants; import com.vaadin.ui.CustomComponent; import com.vaadin.ui.TabSheet; -import com.vaadin.ui.UI; - -import java.util.ResourceBundle; /** * diff --git a/ccm-core/src/main/java/org/libreccm/sites/Site.java b/ccm-core/src/main/java/org/libreccm/sites/Site.java index 56f0f4067..af0021793 100644 --- a/ccm-core/src/main/java/org/libreccm/sites/Site.java +++ b/ccm-core/src/main/java/org/libreccm/sites/Site.java @@ -43,7 +43,9 @@ import javax.persistence.Table; @NamedQueries({ @NamedQuery( name = "Site.findByDomain", - query = "SELECT s FROM Site s WHERE s.domainOfSite = :domain" + query = "SELECT s FROM Site s " + + "WHERE s.domainOfSite = :domain " + + "ORDER BY s.domainOfSite" ) , @NamedQuery( @@ -72,12 +74,12 @@ public class Site extends CcmObject { @OneToMany(mappedBy = "site") private List applications; - + public Site() { super(); applications = new ArrayList<>(); } - + public String getDomainOfSite() { return domainOfSite; } @@ -101,11 +103,11 @@ public class Site extends CcmObject { public void setDefaultTheme(final String defaultTheme) { this.defaultTheme = defaultTheme; } - + public List getApplications() { return Collections.unmodifiableList(applications); } - + protected void setApplications(final List applications) { this.applications = new ArrayList<>(applications); } @@ -113,11 +115,11 @@ public class Site extends CcmObject { protected void addApplication(final SiteAwareApplication application) { applications.add(application); } - + protected void removeApplication(final SiteAwareApplication application) { applications.remove(application); } - + @Override public int hashCode() { int hash = 3; @@ -147,7 +149,7 @@ public class Site extends CcmObject { if (!other.canEqual(this)) { return false; } - + if (defaultSite != other.isDefaultSite()) { return false; } diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties index 8b8f6a47b..1da378f6a 100644 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources.properties @@ -631,3 +631,5 @@ ui.admin.sites.domain_of_site=Domain of Site ui.admin.sites.is_default_site=Is default site? ui.admin.sites.domain_of_site.error.not_unique=The domain of the Site is not unique. ui.admin.sites.domain_of_site.error.empty=The domain of a Site can't be empty. +ui.admin.sites.table.buttons.edit=Edit +ui.admin.sites.table.buttons.delete=Delete diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties index 3d6446ec7..d6545b966 100644 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_de.properties @@ -635,3 +635,5 @@ ui.admin.sites.domain_of_site=Domain der Site ui.admin.sites.is_default_site=Ist Standard Site? ui.admin.sites.domain_of_site.error.not_unique=Die Domain der Site ist nicht eindeutig. ui.admin.sites.domain_of_site.error.empty=The Domain einer Site darf nicht leer sein. +ui.admin.sites.table.buttons.edit=Bearbeiten +ui.admin.sites.table.buttons.delete=L\u00f6schen diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties index eb37797aa..34feb7c8b 100755 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_en.properties @@ -628,3 +628,5 @@ ui.admin.sites.domain_of_site=Domain of Site ui.admin.sites.is_default_site=Is default site? ui.admin.sites.domain_of_site.error.not_unique=The domain of the Site is not unique. ui.admin.sites.domain_of_site.error.empty=The domain of a Site can't be empty. +ui.admin.sites.table.buttons.edit=Edit +ui.admin.sites.table.buttons.delete=Delete diff --git a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties index e5814fbc0..33e85d866 100755 --- a/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties +++ b/ccm-core/src/main/resources/com/arsdigita/ui/admin/AdminResources_fr.properties @@ -619,3 +619,5 @@ ui.admin.sites.domain_of_site=Domain of Site ui.admin.sites.is_default_site=Is default site? ui.admin.sites.domain_of_site.error.not_unique=The domain of the Site is not unique. ui.admin.sites.domain_of_site.error.empty=The domain of a Site can't be empty. +ui.admin.sites.table.buttons.edit=Edit +ui.admin.sites.table.buttons.delete=Delete