CCM NG: PageModel Admin UI for Vaadin Prototype

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5155 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2017-12-03 18:52:14 +00:00
parent 71cadb3da1
commit c11bdaaa03
16 changed files with 393 additions and 58 deletions

View File

@ -73,6 +73,7 @@ public class CategoryTreeComponentEditor
showFullTreeCheckBox = new CheckBox(textsUtil showFullTreeCheckBox = new CheckBox(textsUtil
.getText( .getText(
"cms.ui.pagemodel.category_tree_component_form.show_full_tree.label")); "cms.ui.pagemodel.category_tree_component_form.show_full_tree.label"));
addComponent(showFullTreeCheckBox);
} }
@ -81,7 +82,9 @@ public class CategoryTreeComponentEditor
final CategoryTreeComponent component = getComponentModel(); final CategoryTreeComponent component = getComponentModel();
showFullTreeCheckBox.setValue(component.isShowFullTree()); if (component != null) {
showFullTreeCheckBox.setValue(component.isShowFullTree());
}
} }
@Override @Override

View File

@ -92,6 +92,7 @@ public class ItemListComponentEditor
pageSizeField = new TextField(textsUtil pageSizeField = new TextField(textsUtil
.getText("cms.ui.pagemodel.itemlist_component_form.page_size.label")); .getText("cms.ui.pagemodel.itemlist_component_form.page_size.label"));
pageSizeField.setValue("25");
addComponent(pageSizeField); addComponent(pageSizeField);
listOrderArea = new TextArea(textsUtil listOrderArea = new TextArea(textsUtil
@ -106,9 +107,13 @@ public class ItemListComponentEditor
if (itemListComponent != null) { if (itemListComponent != null) {
descendingCheckBox.setValue(itemListComponent.isDescending()); descendingCheckBox.setValue(itemListComponent.isDescending());
} limitToTypeField.setValue(itemListComponent.getLimitToType());
pageSizeField
.setValue(Integer.toString(itemListComponent.getPageSize()));
listOrderArea.setValue(String.join("\n",
itemListComponent.getListOrder()));
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. }
} }
@Override @Override

View File

@ -137,14 +137,16 @@ public abstract class AbstractPageModelComponentEditor<T extends ComponentModel>
componentModel = createComponentModel(); componentModel = createComponentModel();
componentModel.setKey(key); componentModel.setKey(key);
updateComponentModel(); updateComponentModel();
controller.getPageModelManager().addComponentModel(pageModel, controller
componentModel); .getPageModelsController()
.addComponentModel(pageModel, componentModel);
} else { } else {
componentModel.setKey(key); componentModel.setKey(key);
updateComponentModel(); updateComponentModel();
controller.getComponentModelRepository().save(componentModel); controller.getComponentModelRepository().save(componentModel);
} }
controller.refreshComponentModels();
close();
} }
protected PageModelComponentEditorController getController() { protected PageModelComponentEditorController getController() {

View File

@ -38,9 +38,18 @@ public class PageModelComponentEditorController {
@Inject @Inject
private GlobalizationHelper globalizationHelper; private GlobalizationHelper globalizationHelper;
@Inject
private PageModelsController pageModelsController;
@Inject @Inject
private PageModelManager pageModelManager; private PageModelManager pageModelManager;
@Inject
private PageModelsTableDataProvider pageModelsTableDataProvider;
@Inject
private PageModelComponentModelsTableDataProvider pageModelComponentModelsTableDataProvider;
public ComponentModelRepository getComponentModelRepository() { public ComponentModelRepository getComponentModelRepository() {
return componentModelRepository; return componentModelRepository;
} }
@ -49,8 +58,20 @@ public class PageModelComponentEditorController {
return globalizationHelper; return globalizationHelper;
} }
public PageModelsController getPageModelsController() {
return pageModelsController;
}
public PageModelManager getPageModelManager() { public PageModelManager getPageModelManager() {
return pageModelManager; return pageModelManager;
} }
public void refreshPageModelsTable() {
pageModelsTableDataProvider.refreshAll();
}
public void refreshComponentModels() {
pageModelComponentModelsTableDataProvider.refreshAll();
}
} }

View File

@ -21,9 +21,12 @@ package org.libreccm.admin.ui;
import com.vaadin.cdi.ViewScoped; import com.vaadin.cdi.ViewScoped;
import com.vaadin.data.provider.AbstractDataProvider; import com.vaadin.data.provider.AbstractDataProvider;
import com.vaadin.data.provider.Query; import com.vaadin.data.provider.Query;
import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.l10n.LocalizedTextsUtil;
import org.libreccm.pagemodel.ComponentModels; import org.libreccm.pagemodel.ComponentModels;
import org.libreccm.pagemodel.PageModelComponentModel; import org.libreccm.pagemodel.PageModelComponentModel;
import java.util.Optional;
import java.util.stream.Stream; import java.util.stream.Stream;
import javax.inject.Inject; import javax.inject.Inject;
@ -41,6 +44,9 @@ class PageModelComponentModelTypesDataProvider
@Inject @Inject
private ComponentModels componentModels; private ComponentModels componentModels;
@Inject
private GlobalizationHelper globalizationHelper;
@Override @Override
public boolean isInMemory() { public boolean isInMemory() {
return true; return true;
@ -49,18 +55,50 @@ class PageModelComponentModelTypesDataProvider
@Override @Override
public int size(final Query<PageModelComponentModel, String> query) { public int size(final Query<PageModelComponentModel, String> query) {
return componentModels final Optional<String> filter = query.getFilter();
.findAvailableComponentModels()
.size(); if (filter.isPresent()) {
return (int) componentModels
.findAvailableComponentModels()
.stream()
.filter(model -> filterModels(model, filter.get()))
.count();
} else {
return componentModels
.findAvailableComponentModels()
.size();
}
} }
@Override @Override
public Stream<PageModelComponentModel> fetch( public Stream<PageModelComponentModel> fetch(
final Query<PageModelComponentModel, String> query) { final Query<PageModelComponentModel, String> query) {
return componentModels final Optional<String> filter = query.getFilter();
.findAvailableComponentModels()
.stream(); if (filter.isPresent()) {
return componentModels
.findAvailableComponentModels()
.stream()
.filter(model -> filterModels(model, filter.get()));
} else {
return componentModels
.findAvailableComponentModels()
.stream();
}
}
private boolean filterModels(final PageModelComponentModel model,
final String filter) {
final LocalizedTextsUtil textsUtil = globalizationHelper
.getLocalizedTextsUtil(model.descBundle());
final String title = textsUtil
.getText(textsUtil.getText(model.titleKey()));
return title.startsWith(filter);
} }
} }

View File

@ -29,6 +29,10 @@ import java.util.Objects;
import java.util.stream.Stream; import java.util.stream.Stream;
import javax.inject.Inject; 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; import javax.transaction.Transactional;
/** /**
@ -41,6 +45,9 @@ class PageModelComponentModelsTableDataProvider
private static final long serialVersionUID = -8880329002442808769L; private static final long serialVersionUID = -8880329002442808769L;
@Inject
private EntityManager entityManager;
@Inject @Inject
private PageModelRepository pageModelRepo; private PageModelRepository pageModelRepo;
@ -60,8 +67,16 @@ class PageModelComponentModelsTableDataProvider
protected Stream<ComponentModel> fetchFromBackEnd( protected Stream<ComponentModel> fetchFromBackEnd(
final Query<ComponentModel, String> query) { final Query<ComponentModel, String> query) {
return retrievePageModel() final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
.getComponents() final CriteriaQuery<ComponentModel> criteriaQuery = builder
.createQuery(ComponentModel.class);
final Root<ComponentModel> from = criteriaQuery
.from(ComponentModel.class);
criteriaQuery.where(builder.equal(from.get("pageModel"), pageModel));
return entityManager
.createQuery(criteriaQuery)
.getResultList()
.stream(); .stream();
} }
@ -69,7 +84,19 @@ class PageModelComponentModelsTableDataProvider
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
protected int sizeInBackEnd(final Query<ComponentModel, String> query) { protected int sizeInBackEnd(final Query<ComponentModel, String> query) {
return retrievePageModel().getComponents().size(); final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<Long> criteriaQuery = builder
.createQuery(Long.class);
final Root<ComponentModel> from = criteriaQuery
.from(ComponentModel.class);
criteriaQuery.select(builder.count(from));
criteriaQuery.where(builder.equal(from.get("pageModel"), pageModel));
return entityManager
.createQuery(criteriaQuery)
.getSingleResult()
.intValue();
// return retrievePageModel().getComponents().size();
} }
private PageModel retrievePageModel() { private PageModel retrievePageModel() {

View File

@ -23,18 +23,19 @@ import com.arsdigita.ui.admin.AdminUiConstants;
import com.vaadin.icons.VaadinIcons; import com.vaadin.icons.VaadinIcons;
import com.vaadin.ui.Button; import com.vaadin.ui.Button;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component; import com.vaadin.ui.Component;
import com.vaadin.ui.FormLayout; import com.vaadin.ui.FormLayout;
import com.vaadin.ui.Grid; import com.vaadin.ui.Grid;
import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label; import com.vaadin.ui.Label;
import com.vaadin.ui.NativeSelect;
import com.vaadin.ui.Notification; import com.vaadin.ui.Notification;
import com.vaadin.ui.UI; import com.vaadin.ui.UI;
import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
import com.vaadin.ui.components.grid.HeaderCell; import com.vaadin.ui.components.grid.HeaderCell;
import com.vaadin.ui.components.grid.HeaderRow; import com.vaadin.ui.components.grid.HeaderRow;
import com.vaadin.ui.themes.ValoTheme;
import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.core.UnexpectedErrorException; import org.libreccm.core.UnexpectedErrorException;
import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.GlobalizationHelper;
@ -68,7 +69,8 @@ class PageModelDetails extends Window {
private final CcmApplication application; private final CcmApplication application;
private final PageModel pageModel; private final PageModel pageModel;
private final NativeSelect<PageModelComponentModel> componentModelTypeSelect; // private final NativeSelect<PageModelComponentModel> componentModelTypeSelect;
private final ComboBox<PageModelComponentModel> componentModelTypeSelect;
PageModelDetails(final PageModel pageModel, PageModelDetails(final PageModel pageModel,
final CcmApplication application, final CcmApplication application,
@ -121,6 +123,8 @@ class PageModelDetails extends Window {
editPropertiesButton.setIcon(VaadinIcons.EDIT); editPropertiesButton.setIcon(VaadinIcons.EDIT);
editPropertiesButton editPropertiesButton
.addClickListener(this::editBasicPropertiesButtonClicked); .addClickListener(this::editBasicPropertiesButtonClicked);
final HorizontalLayout buttonsLayout = new HorizontalLayout(
editPropertiesButton);
final PageModelsController pageModelsController = controller final PageModelsController pageModelsController = controller
.getPageModelsController(); .getPageModelsController();
@ -154,16 +158,32 @@ class PageModelDetails extends Window {
.setId(COL_DEL); .setId(COL_DEL);
componentsModelGrid.setWidth("100%"); componentsModelGrid.setWidth("100%");
componentModelTypeSelect = new NativeSelect<>( // componentModelTypeSelect = new NativeSelect<>(
textsUtil.getText("ui.admin.pagemodels.add_new_component.type"), // textsUtil.getText("ui.admin.pagemodels.add_new_component.type"),
pageModelsController.getComponentModelTypesDataProvider()); // pageModelsController.getComponentModelTypesDataProvider());
componentModelTypeSelect = new ComboBox<>();
componentModelTypeSelect.setTextInputAllowed(false);
componentModelTypeSelect.setEmptySelectionAllowed(false);
componentModelTypeSelect.setDescription(textsUtil
.getText("ui.admin.pagemodels.add_new_component.type"));
componentModelTypeSelect.setDataProvider(pageModelsController
.getComponentModelTypesDataProvider());
componentModelTypeSelect componentModelTypeSelect
.setItemCaptionGenerator(this::generateComponentModelTypeCaption); .setItemCaptionGenerator(this::generateComponentModelTypeCaption);
componentModelTypeSelect.addStyleName(ValoTheme.COMBOBOX_TINY);
final Button addComponentModelButton = new Button(textsUtil final Button addComponentModelButton = new Button(textsUtil
.getText("ui.admin.pagemodels.add_new_component.submit")); .getText("ui.admin.pagemodels.add_new_component.submit"));
addComponentModelButton.addStyleName(ValoTheme.BUTTON_TINY);
addComponentModelButton.setIcon(VaadinIcons.PLUS_CIRCLE_O); addComponentModelButton.setIcon(VaadinIcons.PLUS_CIRCLE_O);
addComponentModelButton addComponentModelButton
.addClickListener(this::addComponentButtonClicked); .addClickListener(this::addComponentButtonClicked);
// final Panel componentsPanel = new Panel(
// "Components",
// new VerticalLayout(new HorizontalLayout(
// new FormLayout(componentModelTypeSelect),
// addComponentModelButton),
// componentsModelGrid));
final HeaderRow headerRow = componentsModelGrid.prependHeaderRow(); final HeaderRow headerRow = componentsModelGrid.prependHeaderRow();
final HeaderCell headerCell = headerRow.join(COL_KEY, final HeaderCell headerCell = headerRow.join(COL_KEY,
COL_TYPE, COL_TYPE,
@ -171,8 +191,12 @@ class PageModelDetails extends Window {
COL_DEL); COL_DEL);
headerCell.setComponent(new HorizontalLayout(componentModelTypeSelect, headerCell.setComponent(new HorizontalLayout(componentModelTypeSelect,
addComponentModelButton)); addComponentModelButton));
super.setContent(new VerticalLayout(propertiesSheetLayout,
super.setContent(new VerticalLayout(propertiesSheetLayout)); buttonsLayout,
componentsModelGrid));
// super.setContent(new VerticalLayout(propertiesSheetLayout,
// buttonsLayout,
// componentsPanel));
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@ -222,6 +246,7 @@ class PageModelDetails extends Window {
| InvocationTargetException ex) { | InvocationTargetException ex) {
throw new UnexpectedErrorException(ex); throw new UnexpectedErrorException(ex);
} }
editor.initWidgets();
editor.setModal(true); editor.setModal(true);
editor.setWidth("50%"); editor.setWidth("50%");
@ -270,6 +295,7 @@ class PageModelDetails extends Window {
final Button editButton = new Button(textsUtil final Button editButton = new Button(textsUtil
.getText("ui.admin.pagemodels.components.edit")); .getText("ui.admin.pagemodels.components.edit"));
editButton.setIcon(VaadinIcons.EDIT); editButton.setIcon(VaadinIcons.EDIT);
editButton.addStyleName(ValoTheme.BUTTON_TINY);
editButton.addClickListener(event -> editComponentModel(componentModel)); editButton.addClickListener(event -> editComponentModel(componentModel));
return editButton; return editButton;
@ -315,8 +341,8 @@ class PageModelDetails extends Window {
try { try {
constructor = editorClass constructor = editorClass
.getDeclaredConstructor(PageModel.class, .getDeclaredConstructor(PageModel.class,
ComponentModel.class, componentModelInfo.get().modelClass(),
PageModelComponentEditorController.class PageModelComponentEditorController.class
); );
} catch (NoSuchMethodException ex) { } catch (NoSuchMethodException ex) {
throw new UnexpectedErrorException(ex); throw new UnexpectedErrorException(ex);
@ -333,6 +359,7 @@ class PageModelDetails extends Window {
| InvocationTargetException ex) { | InvocationTargetException ex) {
throw new UnexpectedErrorException(ex); throw new UnexpectedErrorException(ex);
} }
editor.initWidgets();
editor.setModal(true); editor.setModal(true);
editor.setWidth("50%"); editor.setWidth("50%");
@ -357,7 +384,9 @@ class PageModelDetails extends Window {
final Button deleteButton = new Button(textsUtil final Button deleteButton = new Button(textsUtil
.getText("ui.admin.pagemodels.components.delete")); .getText("ui.admin.pagemodels.components.delete"));
deleteButton.setIcon(VaadinIcons.EDIT); deleteButton.setIcon(VaadinIcons.MINUS_CIRCLE_O);
deleteButton.addStyleNames(ValoTheme.BUTTON_TINY,
ValoTheme.BUTTON_DANGER);
deleteButton.addClickListener(event -> { deleteButton.addClickListener(event -> {
final ConfirmDialog confirmDialog = new ConfirmDialog(() -> { final ConfirmDialog confirmDialog = new ConfirmDialog(() -> {

View File

@ -24,11 +24,13 @@ import com.vaadin.server.UserError;
import com.vaadin.ui.Button; import com.vaadin.ui.Button;
import com.vaadin.ui.FormLayout; import com.vaadin.ui.FormLayout;
import com.vaadin.ui.HorizontalLayout; import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Panel;
import com.vaadin.ui.TextField; import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout; import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window; import com.vaadin.ui.Window;
import com.vaadin.ui.themes.ValoTheme; import com.vaadin.ui.themes.ValoTheme;
import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.l10n.LocalizedString;
import org.libreccm.l10n.LocalizedTextsUtil; import org.libreccm.l10n.LocalizedTextsUtil;
import org.libreccm.l10n.ui.LocalizedStringEditor; import org.libreccm.l10n.ui.LocalizedStringEditor;
import org.libreccm.pagemodel.PageModel; import org.libreccm.pagemodel.PageModel;
@ -36,6 +38,9 @@ import org.libreccm.pagemodel.PageModelManager;
import org.libreccm.pagemodel.PageModelRepository; import org.libreccm.pagemodel.PageModelRepository;
import org.libreccm.web.CcmApplication; import org.libreccm.web.CcmApplication;
import java.util.Locale;
import java.util.Map;
/** /**
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
@ -88,18 +93,39 @@ class PageModelForm extends Window {
nameField = new TextField(textsUtil.getText("ui.admin.pagemodels.name")); nameField = new TextField(textsUtil.getText("ui.admin.pagemodels.name"));
nameField.setRequiredIndicatorVisible(true); nameField.setRequiredIndicatorVisible(true);
titleEditor = new LocalizedStringEditor(pageModel.getTitle(), if (pageModel == null) {
globalizationHelper); titleEditor = new LocalizedStringEditor(globalizationHelper);
titleEditor.setCaption(textsUtil.getText("ui.admin.pagemodels.title")); } else {
titleEditor = new LocalizedStringEditor(pageModel.getTitle(),
globalizationHelper);
}
// titleEditor.setCaption(textsUtil.getText("ui.admin.pagemodels.title"));
titleEditor.setHeight("10em");
final Panel titlePanel = new Panel(
textsUtil.getText("ui.admin.pagemodels.title"),
titleEditor);
descriptionEditor = new LocalizedStringEditor( if (pageModel == null) {
pageModel.getDescription(), globalizationHelper); descriptionEditor = new LocalizedStringEditor(globalizationHelper);
descriptionEditor } else {
.setCaption(textsUtil.getText("ui.admin.pagemodels.desc")); descriptionEditor = new LocalizedStringEditor(
pageModel.getDescription(), globalizationHelper);
}
// descriptionEditor
// .setCaption(textsUtil.getText("ui.admin.pagemodels.desc"));
descriptionEditor.setHeight("10em");
final Panel descPanel = new Panel(
textsUtil.getText("ui.admin.pagemodels.desc"),
descriptionEditor);
final FormLayout formLayout = new FormLayout(nameField, if (pageModel == null) {
titleEditor, setCaption(textsUtil.getText("ui.admin.pagemodels.caption.new"));
descriptionEditor); } else {
setCaption(textsUtil.getText("ui.admin.pagemodels.caption.edit",
new String[]{pageModel.getName()}));
}
final FormLayout formLayout = new FormLayout(nameField);
final Button saveButton = new Button(textsUtil final Button saveButton = new Button(textsUtil
.getText("ui.admin.pagemodels.buttons.save")); .getText("ui.admin.pagemodels.buttons.save"));
@ -113,7 +139,10 @@ class PageModelForm extends Window {
cancelButton); cancelButton);
final VerticalLayout layout = new VerticalLayout(formLayout, final VerticalLayout layout = new VerticalLayout(formLayout,
titlePanel,
descPanel,
buttonsLayout); buttonsLayout);
layout.setMargin(true);
setContent(layout); setContent(layout);
} }
@ -140,15 +169,30 @@ class PageModelForm extends Window {
} }
if (pageModel == null) { if (pageModel == null) {
pageModel = pageModelManager.createPageModel(name, application); pageModel = pageModelManager.createPageModel(name, application);
final LocalizedString title = titleEditor.getLocalizedString();
for (final Map.Entry<Locale, String> entry : title.getValues()
.entrySet()) {
pageModel.getTitle().addValue(entry.getKey(), entry.getValue());
}
final LocalizedString desc = descriptionEditor.getLocalizedString();
for (final Map.Entry<Locale, String> entry : desc.getValues()
.entrySet()) {
pageModel.getDescription().addValue(entry.getKey(),
entry.getValue());
}
} }
pageModel.setName(name); pageModel.setName(name);
final PageModelRepository pageModelRepo = pageModelsController final PageModelRepository pageModelRepo = pageModelsController
.getPageModelRepo(); .getPageModelRepo();
pageModelRepo.save(pageModel); pageModelRepo.save(pageModel);
controller
.getPageModelsController()
.getPageModelsTableDataProvider()
.refreshAll();
close(); close();
} }

View File

@ -134,6 +134,22 @@ class PageModelsController implements Serializable {
pageModelsTableDataProvider.refreshAll(); pageModelsTableDataProvider.refreshAll();
} }
@Transactional(Transactional.TxType.REQUIRED)
protected void addComponentModel(final PageModel pageModel,
final ComponentModel componentModel) {
Objects.requireNonNull(pageModel);
Objects.requireNonNull(componentModel);
final PageModel toPageModel = pageModelRepo
.findById(pageModel.getPageModelId())
.orElseThrow(() -> new IllegalArgumentException(String
.format("No PageModel with ID %d in the database.",
pageModel.getPageModelId())));
pageModelManager.addComponentModel(toPageModel, componentModel);
}
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
protected void removeComponentModel(final PageModel pageModel, protected void removeComponentModel(final PageModel pageModel,
final ComponentModel componentModel) { final ComponentModel componentModel) {

View File

@ -109,6 +109,7 @@ class PageModelsTab extends CustomComponent {
final Button addPageModelButton = new Button(localizedTextsUtil final Button addPageModelButton = new Button(localizedTextsUtil
.getText("ui.admin.pagemodels.create_new")); .getText("ui.admin.pagemodels.create_new"));
addPageModelButton.addStyleName(ValoTheme.BUTTON_TINY);
addPageModelButton.setIcon(VaadinIcons.PLUS_CIRCLE_O); addPageModelButton.setIcon(VaadinIcons.PLUS_CIRCLE_O);
addPageModelButton.addClickListener(event -> { addPageModelButton.addClickListener(event -> {
final CcmApplication application final CcmApplication application
@ -118,7 +119,7 @@ class PageModelsTab extends CustomComponent {
adminViewController, application); adminViewController, application);
pageModelForm.setModal(true); pageModelForm.setModal(true);
pageModelForm.setWidth("40%"); pageModelForm.setWidth("40%");
pageModelForm.setHeight("30%"); pageModelForm.setHeight("60%");
UI.getCurrent().addWindow(pageModelForm); UI.getCurrent().addWindow(pageModelForm);
}); });

View File

@ -33,9 +33,11 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSession;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.MissingResourceException; import java.util.MissingResourceException;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.util.stream.Collectors;
/** /**
* Provides the locale which has been selected based on the available languages * Provides the locale which has been selected based on the available languages
@ -185,6 +187,21 @@ public class GlobalizationHelper implements Serializable {
return selected; return selected;
} }
public List<Locale> getAvailableLocales() {
final KernelConfig kernelConfig = confManager
.findConfiguration(KernelConfig.class);
return kernelConfig
.getSupportedLanguages()
.stream()
.map(lang -> new Locale(lang))
.sorted((locale1, locale2) -> {
return locale1.toString().compareTo(locale2.toString());
})
.collect(Collectors.toList());
}
public void setSelectedLocale(final Locale locale) { public void setSelectedLocale(final Locale locale) {
final HttpSession session = request.getSession(true); final HttpSession session = request.getSession(true);

View File

@ -1,8 +1,18 @@
package org.libreccm.l10n.ui; package org.libreccm.l10n.ui;
import com.vaadin.data.provider.ListDataProvider;
import com.vaadin.data.provider.QuerySortOrder; import com.vaadin.data.provider.QuerySortOrder;
import com.vaadin.icons.VaadinIcons;
import com.vaadin.server.SerializableToIntFunction;
import com.vaadin.ui.Button;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.Component;
import com.vaadin.ui.CustomComponent; import com.vaadin.ui.CustomComponent;
import com.vaadin.ui.Grid; import com.vaadin.ui.Grid;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.components.grid.HeaderCell;
import com.vaadin.ui.components.grid.HeaderRow;
import com.vaadin.ui.themes.ValoTheme;
import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.GlobalizationHelper;
import org.libreccm.l10n.LocalizedString; import org.libreccm.l10n.LocalizedString;
@ -10,6 +20,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
/* /*
@ -74,7 +85,39 @@ public class LocalizedStringEditor extends CustomComponent {
grid.addColumn(LocalizedStringValue::getLocaleLabel) grid.addColumn(LocalizedStringValue::getLocaleLabel)
.setCaption("Language") .setCaption("Language")
.setId(COL_LOCALE); .setId(COL_LOCALE);
grid.addColumn(LocalizedStringValue::getValue)
.setCaption("Value")
.setId(COL_VALUE);
grid.addComponentColumn(this::buildEditButton)
.setCaption("Edit")
.setId(COL_EDIT);
grid.addComponentColumn(this::buildDeleteButton)
.setCaption("Delete")
.setId(COL_REMOVE);
final ComboBox<Locale> localeSelect = new ComboBox<>();
localeSelect.setDataProvider(this::fetchAvailableLocales,
this::countAvailableLocales);
localeSelect.setDescription("Select locale to add");
localeSelect.addStyleName(ValoTheme.COMBOBOX_TINY);
localeSelect.setEmptySelectionAllowed(false);
localeSelect.setTextInputAllowed(false);
localeSelect.setItemCaptionGenerator(Locale::toString);
final Button addButton = new Button("Add value");
addButton.addStyleName(ValoTheme.BUTTON_TINY);
addButton.setIcon(VaadinIcons.PLUS_CIRCLE_O);
addButton.addClickListener(event -> {
});
final HeaderRow headerRow = grid.prependHeaderRow();
final HeaderCell headerCell = headerRow.join(COL_LOCALE,
COL_VALUE,
COL_EDIT,
COL_REMOVE);
headerCell.setComponent(new HorizontalLayout(localeSelect, addButton));
localizedString = new LocalizedString();
super.setCompositionRoot(grid);
} }
public LocalizedStringEditor(final LocalizedString localizedString, public LocalizedStringEditor(final LocalizedString localizedString,
@ -90,6 +133,7 @@ public class LocalizedStringEditor extends CustomComponent {
final GlobalizationHelper globalizationHelper) { final GlobalizationHelper globalizationHelper) {
this(globalizationHelper); this(globalizationHelper);
this.multiline = multiline; this.multiline = multiline;
localizedString = new LocalizedString();
} }
public LocalizedStringEditor(final LocalizedString localizedString, public LocalizedStringEditor(final LocalizedString localizedString,
@ -116,6 +160,58 @@ public class LocalizedStringEditor extends CustomComponent {
this.localizedString = localizedString; this.localizedString = localizedString;
} }
private Stream<Locale> fetchAvailableLocales(final String filter,
final int offset,
final int limit) {
final List<Locale> values = globalizationHelper
.getAvailableLocales()
.stream()
.filter(locale -> localizedString.hasValue(locale))
.sorted((locale1, locale2) -> {
return locale1.toString().compareTo(locale2.toString());
})
.collect(Collectors.toList());
if (values.size() > limit) {
return values.subList(offset, offset + limit).stream();
} else {
return values.stream();
}
}
private int countAvailableLocales(final String value) {
return (int) globalizationHelper
.getAvailableLocales()
.stream()
.filter(locale -> localizedString.hasValue(locale))
.count();
}
private Component buildEditButton(final LocalizedStringValue value) {
final Button button = new Button("Edit");
button.setIcon(VaadinIcons.EDIT);
button.addStyleName(ValoTheme.BUTTON_TINY);
button.addClickListener(event -> {
});
return button;
}
private Component buildDeleteButton(final LocalizedStringValue value) {
final Button button = new Button("Edit");
button.setIcon(VaadinIcons.MINUS_CIRCLE_O);
button.addStyleNames(ValoTheme.BUTTON_TINY,
ValoTheme.BUTTON_DANGER);
button.addClickListener(event -> {
});
return button;
}
private class LocalizedStringValue { private class LocalizedStringValue {
private Locale locale; private Locale locale;
@ -176,11 +272,19 @@ public class LocalizedStringEditor extends CustomComponent {
.compareTo(Objects.toString(locale2)); .compareTo(Objects.toString(locale2));
}); });
return locales if (locales.size() > limit) {
.subList(offset, limit) return locales
.stream() .subList(offset, limit)
.map(locale -> new LocalizedStringValue( .stream()
locale, localizedString.getValue(locale))); .map(locale -> new LocalizedStringValue(
locale, localizedString.getValue(locale)));
} else {
return locales
.subList(offset, locales.size())
.stream()
.map(locale -> new LocalizedStringValue(
locale, localizedString.getValue(locale)));
}
} }
} }

View File

@ -690,3 +690,10 @@ ui.admin.pagemodels.table.columns.headers.islive=Is live?
ui.admin.pagemodels.select_application=Please select an application ui.admin.pagemodels.select_application=Please select an application
ui.admin.pagemodels.table.columns.edit.label=Edit ui.admin.pagemodels.table.columns.edit.label=Edit
ui.admin.pagemodels.table.columns.delete.label=Delete ui.admin.pagemodels.table.columns.delete.label=Delete
ui.admin.pagemodels.edit_basic_properties=Edit
ui.admin.pagemodels.components.save=Save
ui.admin.pagemodels.components.cancel=Cancel
ui.admin.pagemodels.buttons.save=Save
ui.admin.pagemodels.buttons.cancel=Cancel
ui.admin.pagemodels.caption.new=Create new PageModel
ui.admin.pagemodels.caption.edit=Edit PageModel {0}

View File

@ -694,3 +694,10 @@ ui.admin.pagemodels.table.columns.headers.islive=Ist publiziert?
ui.admin.pagemodels.select_application=Bitte eine Applikation ausw\u00e4hlen ui.admin.pagemodels.select_application=Bitte eine Applikation ausw\u00e4hlen
ui.admin.pagemodels.table.columns.edit.label=Bearbeiten ui.admin.pagemodels.table.columns.edit.label=Bearbeiten
ui.admin.pagemodels.table.columns.delete.label=L\u00f6schen ui.admin.pagemodels.table.columns.delete.label=L\u00f6schen
ui.admin.pagemodels.edit_basic_properties=Bearbeiten
ui.admin.pagemodels.components.save=Speichern
ui.admin.pagemodels.components.cancel=Abbrechen
ui.admin.pagemodels.buttons.save=Speichern
ui.admin.pagemodels.buttons.cancel=Abbrechen
ui.admin.pagemodels.caption.new=Neues PageModel erstellen
ui.admin.pagemodels.caption.edit=PageModel {0} bearbeiten

View File

@ -687,3 +687,10 @@ ui.admin.pagemodels.table.columns.headers.islive=Is live?
ui.admin.pagemodels.select_application=Please select an application ui.admin.pagemodels.select_application=Please select an application
ui.admin.pagemodels.table.columns.edit.label=Edit ui.admin.pagemodels.table.columns.edit.label=Edit
ui.admin.pagemodels.table.columns.delete.label=Delete ui.admin.pagemodels.table.columns.delete.label=Delete
ui.admin.pagemodels.edit_basic_properties=Edit
ui.admin.pagemodels.components.save=Save
ui.admin.pagemodels.components.cancel=Cancel
ui.admin.pagemodels.buttons.save=Save
ui.admin.pagemodels.buttons.cancel=Cancel
ui.admin.pagemodels.caption.new=Create new PageModel
ui.admin.pagemodels.caption.edit=Edit PageModel {0}

View File

@ -678,3 +678,10 @@ ui.admin.pagemodels.table.columns.headers.islive=Is live?
ui.admin.pagemodels.select_application=Please select an application ui.admin.pagemodels.select_application=Please select an application
ui.admin.pagemodels.table.columns.edit.label=Edit ui.admin.pagemodels.table.columns.edit.label=Edit
ui.admin.pagemodels.table.columns.delete.label=Delete ui.admin.pagemodels.table.columns.delete.label=Delete
ui.admin.pagemodels.edit_basic_properties=Edit
ui.admin.pagemodels.components.save=Save
ui.admin.pagemodels.components.cancel=Cancel
ui.admin.pagemodels.buttons.save=Save
ui.admin.pagemodels.buttons.cancel=Cancel
ui.admin.pagemodels.caption.new=Create new PageModel
ui.admin.pagemodels.caption.edit=Edit PageModel {0}