CCM NG: PageModel Admin UI for Vaadin Prototype
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5155 8810af33-2d31-482b-a856-94f89814c4df
parent
b60a7e5817
commit
3032773dc4
|
|
@ -73,6 +73,7 @@ public class CategoryTreeComponentEditor
|
|||
showFullTreeCheckBox = new CheckBox(textsUtil
|
||||
.getText(
|
||||
"cms.ui.pagemodel.category_tree_component_form.show_full_tree.label"));
|
||||
addComponent(showFullTreeCheckBox);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -81,7 +82,9 @@ public class CategoryTreeComponentEditor
|
|||
|
||||
final CategoryTreeComponent component = getComponentModel();
|
||||
|
||||
showFullTreeCheckBox.setValue(component.isShowFullTree());
|
||||
if (component != null) {
|
||||
showFullTreeCheckBox.setValue(component.isShowFullTree());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@ public class ItemListComponentEditor
|
|||
|
||||
pageSizeField = new TextField(textsUtil
|
||||
.getText("cms.ui.pagemodel.itemlist_component_form.page_size.label"));
|
||||
pageSizeField.setValue("25");
|
||||
addComponent(pageSizeField);
|
||||
|
||||
listOrderArea = new TextArea(textsUtil
|
||||
|
|
@ -106,9 +107,13 @@ public class ItemListComponentEditor
|
|||
|
||||
if (itemListComponent != null) {
|
||||
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
|
||||
|
|
|
|||
|
|
@ -137,14 +137,16 @@ public abstract class AbstractPageModelComponentEditor<T extends ComponentModel>
|
|||
componentModel = createComponentModel();
|
||||
componentModel.setKey(key);
|
||||
updateComponentModel();
|
||||
controller.getPageModelManager().addComponentModel(pageModel,
|
||||
componentModel);
|
||||
controller
|
||||
.getPageModelsController()
|
||||
.addComponentModel(pageModel, componentModel);
|
||||
} else {
|
||||
|
||||
componentModel.setKey(key);
|
||||
updateComponentModel();
|
||||
controller.getComponentModelRepository().save(componentModel);
|
||||
}
|
||||
controller.refreshComponentModels();
|
||||
close();
|
||||
}
|
||||
|
||||
protected PageModelComponentEditorController getController() {
|
||||
|
|
|
|||
|
|
@ -38,9 +38,18 @@ public class PageModelComponentEditorController {
|
|||
@Inject
|
||||
private GlobalizationHelper globalizationHelper;
|
||||
|
||||
@Inject
|
||||
private PageModelsController pageModelsController;
|
||||
|
||||
@Inject
|
||||
private PageModelManager pageModelManager;
|
||||
|
||||
@Inject
|
||||
private PageModelsTableDataProvider pageModelsTableDataProvider;
|
||||
|
||||
@Inject
|
||||
private PageModelComponentModelsTableDataProvider pageModelComponentModelsTableDataProvider;
|
||||
|
||||
public ComponentModelRepository getComponentModelRepository() {
|
||||
return componentModelRepository;
|
||||
}
|
||||
|
|
@ -49,8 +58,20 @@ public class PageModelComponentEditorController {
|
|||
return globalizationHelper;
|
||||
}
|
||||
|
||||
public PageModelsController getPageModelsController() {
|
||||
return pageModelsController;
|
||||
}
|
||||
|
||||
public PageModelManager getPageModelManager() {
|
||||
return pageModelManager;
|
||||
}
|
||||
|
||||
public void refreshPageModelsTable() {
|
||||
pageModelsTableDataProvider.refreshAll();
|
||||
}
|
||||
|
||||
public void refreshComponentModels() {
|
||||
pageModelComponentModelsTableDataProvider.refreshAll();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,9 +21,12 @@ 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.l10n.GlobalizationHelper;
|
||||
import org.libreccm.l10n.LocalizedTextsUtil;
|
||||
import org.libreccm.pagemodel.ComponentModels;
|
||||
import org.libreccm.pagemodel.PageModelComponentModel;
|
||||
|
||||
import java.util.Optional;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
|
@ -41,6 +44,9 @@ class PageModelComponentModelTypesDataProvider
|
|||
@Inject
|
||||
private ComponentModels componentModels;
|
||||
|
||||
@Inject
|
||||
private GlobalizationHelper globalizationHelper;
|
||||
|
||||
@Override
|
||||
public boolean isInMemory() {
|
||||
return true;
|
||||
|
|
@ -49,18 +55,50 @@ class PageModelComponentModelTypesDataProvider
|
|||
@Override
|
||||
public int size(final Query<PageModelComponentModel, String> query) {
|
||||
|
||||
return componentModels
|
||||
.findAvailableComponentModels()
|
||||
.size();
|
||||
final Optional<String> filter = query.getFilter();
|
||||
|
||||
if (filter.isPresent()) {
|
||||
return (int) componentModels
|
||||
.findAvailableComponentModels()
|
||||
.stream()
|
||||
.filter(model -> filterModels(model, filter.get()))
|
||||
.count();
|
||||
|
||||
} else {
|
||||
return componentModels
|
||||
.findAvailableComponentModels()
|
||||
.size();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream<PageModelComponentModel> fetch(
|
||||
final Query<PageModelComponentModel, String> query) {
|
||||
|
||||
return componentModels
|
||||
.findAvailableComponentModels()
|
||||
.stream();
|
||||
final Optional<String> filter = query.getFilter();
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,10 @@ import java.util.Objects;
|
|||
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;
|
||||
|
||||
/**
|
||||
|
|
@ -41,6 +45,9 @@ class PageModelComponentModelsTableDataProvider
|
|||
|
||||
private static final long serialVersionUID = -8880329002442808769L;
|
||||
|
||||
@Inject
|
||||
private EntityManager entityManager;
|
||||
|
||||
@Inject
|
||||
private PageModelRepository pageModelRepo;
|
||||
|
||||
|
|
@ -60,8 +67,16 @@ class PageModelComponentModelsTableDataProvider
|
|||
protected Stream<ComponentModel> fetchFromBackEnd(
|
||||
final Query<ComponentModel, String> query) {
|
||||
|
||||
return retrievePageModel()
|
||||
.getComponents()
|
||||
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
|
||||
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();
|
||||
}
|
||||
|
||||
|
|
@ -69,7 +84,19 @@ class PageModelComponentModelsTableDataProvider
|
|||
@Transactional(Transactional.TxType.REQUIRED)
|
||||
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() {
|
||||
|
|
|
|||
|
|
@ -23,18 +23,19 @@ import com.arsdigita.ui.admin.AdminUiConstants;
|
|||
|
||||
import com.vaadin.icons.VaadinIcons;
|
||||
import com.vaadin.ui.Button;
|
||||
import com.vaadin.ui.ComboBox;
|
||||
import com.vaadin.ui.Component;
|
||||
import com.vaadin.ui.FormLayout;
|
||||
import com.vaadin.ui.Grid;
|
||||
import com.vaadin.ui.HorizontalLayout;
|
||||
import com.vaadin.ui.Label;
|
||||
import com.vaadin.ui.NativeSelect;
|
||||
import com.vaadin.ui.Notification;
|
||||
import com.vaadin.ui.UI;
|
||||
import com.vaadin.ui.VerticalLayout;
|
||||
import com.vaadin.ui.Window;
|
||||
import com.vaadin.ui.components.grid.HeaderCell;
|
||||
import com.vaadin.ui.components.grid.HeaderRow;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.core.UnexpectedErrorException;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
|
|
@ -68,7 +69,8 @@ class PageModelDetails extends Window {
|
|||
private final CcmApplication application;
|
||||
private final PageModel pageModel;
|
||||
|
||||
private final NativeSelect<PageModelComponentModel> componentModelTypeSelect;
|
||||
// private final NativeSelect<PageModelComponentModel> componentModelTypeSelect;
|
||||
private final ComboBox<PageModelComponentModel> componentModelTypeSelect;
|
||||
|
||||
PageModelDetails(final PageModel pageModel,
|
||||
final CcmApplication application,
|
||||
|
|
@ -121,6 +123,8 @@ class PageModelDetails extends Window {
|
|||
editPropertiesButton.setIcon(VaadinIcons.EDIT);
|
||||
editPropertiesButton
|
||||
.addClickListener(this::editBasicPropertiesButtonClicked);
|
||||
final HorizontalLayout buttonsLayout = new HorizontalLayout(
|
||||
editPropertiesButton);
|
||||
|
||||
final PageModelsController pageModelsController = controller
|
||||
.getPageModelsController();
|
||||
|
|
@ -154,16 +158,32 @@ class PageModelDetails extends Window {
|
|||
.setId(COL_DEL);
|
||||
componentsModelGrid.setWidth("100%");
|
||||
|
||||
componentModelTypeSelect = new NativeSelect<>(
|
||||
textsUtil.getText("ui.admin.pagemodels.add_new_component.type"),
|
||||
pageModelsController.getComponentModelTypesDataProvider());
|
||||
// componentModelTypeSelect = new NativeSelect<>(
|
||||
// textsUtil.getText("ui.admin.pagemodels.add_new_component.type"),
|
||||
// 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
|
||||
.setItemCaptionGenerator(this::generateComponentModelTypeCaption);
|
||||
componentModelTypeSelect.addStyleName(ValoTheme.COMBOBOX_TINY);
|
||||
final Button addComponentModelButton = new Button(textsUtil
|
||||
.getText("ui.admin.pagemodels.add_new_component.submit"));
|
||||
addComponentModelButton.addStyleName(ValoTheme.BUTTON_TINY);
|
||||
addComponentModelButton.setIcon(VaadinIcons.PLUS_CIRCLE_O);
|
||||
addComponentModelButton
|
||||
.addClickListener(this::addComponentButtonClicked);
|
||||
// final Panel componentsPanel = new Panel(
|
||||
// "Components",
|
||||
// new VerticalLayout(new HorizontalLayout(
|
||||
// new FormLayout(componentModelTypeSelect),
|
||||
// addComponentModelButton),
|
||||
// componentsModelGrid));
|
||||
|
||||
final HeaderRow headerRow = componentsModelGrid.prependHeaderRow();
|
||||
final HeaderCell headerCell = headerRow.join(COL_KEY,
|
||||
COL_TYPE,
|
||||
|
|
@ -171,8 +191,12 @@ class PageModelDetails extends Window {
|
|||
COL_DEL);
|
||||
headerCell.setComponent(new HorizontalLayout(componentModelTypeSelect,
|
||||
addComponentModelButton));
|
||||
|
||||
super.setContent(new VerticalLayout(propertiesSheetLayout));
|
||||
super.setContent(new VerticalLayout(propertiesSheetLayout,
|
||||
buttonsLayout,
|
||||
componentsModelGrid));
|
||||
// super.setContent(new VerticalLayout(propertiesSheetLayout,
|
||||
// buttonsLayout,
|
||||
// componentsPanel));
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
|
|
@ -222,6 +246,7 @@ class PageModelDetails extends Window {
|
|||
| InvocationTargetException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
editor.initWidgets();
|
||||
|
||||
editor.setModal(true);
|
||||
editor.setWidth("50%");
|
||||
|
|
@ -270,6 +295,7 @@ class PageModelDetails extends Window {
|
|||
final Button editButton = new Button(textsUtil
|
||||
.getText("ui.admin.pagemodels.components.edit"));
|
||||
editButton.setIcon(VaadinIcons.EDIT);
|
||||
editButton.addStyleName(ValoTheme.BUTTON_TINY);
|
||||
editButton.addClickListener(event -> editComponentModel(componentModel));
|
||||
|
||||
return editButton;
|
||||
|
|
@ -315,8 +341,8 @@ class PageModelDetails extends Window {
|
|||
try {
|
||||
constructor = editorClass
|
||||
.getDeclaredConstructor(PageModel.class,
|
||||
ComponentModel.class,
|
||||
PageModelComponentEditorController.class
|
||||
componentModelInfo.get().modelClass(),
|
||||
PageModelComponentEditorController.class
|
||||
);
|
||||
} catch (NoSuchMethodException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
|
|
@ -333,6 +359,7 @@ class PageModelDetails extends Window {
|
|||
| InvocationTargetException ex) {
|
||||
throw new UnexpectedErrorException(ex);
|
||||
}
|
||||
editor.initWidgets();
|
||||
|
||||
editor.setModal(true);
|
||||
editor.setWidth("50%");
|
||||
|
|
@ -357,7 +384,9 @@ class PageModelDetails extends Window {
|
|||
|
||||
final Button deleteButton = new Button(textsUtil
|
||||
.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 -> {
|
||||
|
||||
final ConfirmDialog confirmDialog = new ConfirmDialog(() -> {
|
||||
|
|
|
|||
|
|
@ -24,11 +24,13 @@ import com.vaadin.server.UserError;
|
|||
import com.vaadin.ui.Button;
|
||||
import com.vaadin.ui.FormLayout;
|
||||
import com.vaadin.ui.HorizontalLayout;
|
||||
import com.vaadin.ui.Panel;
|
||||
import com.vaadin.ui.TextField;
|
||||
import com.vaadin.ui.VerticalLayout;
|
||||
import com.vaadin.ui.Window;
|
||||
import com.vaadin.ui.themes.ValoTheme;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
import org.libreccm.l10n.LocalizedTextsUtil;
|
||||
import org.libreccm.l10n.ui.LocalizedStringEditor;
|
||||
import org.libreccm.pagemodel.PageModel;
|
||||
|
|
@ -36,6 +38,9 @@ import org.libreccm.pagemodel.PageModelManager;
|
|||
import org.libreccm.pagemodel.PageModelRepository;
|
||||
import org.libreccm.web.CcmApplication;
|
||||
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
*
|
||||
* @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.setRequiredIndicatorVisible(true);
|
||||
|
||||
titleEditor = new LocalizedStringEditor(pageModel.getTitle(),
|
||||
globalizationHelper);
|
||||
titleEditor.setCaption(textsUtil.getText("ui.admin.pagemodels.title"));
|
||||
if (pageModel == null) {
|
||||
titleEditor = new LocalizedStringEditor(globalizationHelper);
|
||||
} 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(
|
||||
pageModel.getDescription(), globalizationHelper);
|
||||
descriptionEditor
|
||||
.setCaption(textsUtil.getText("ui.admin.pagemodels.desc"));
|
||||
if (pageModel == null) {
|
||||
descriptionEditor = new LocalizedStringEditor(globalizationHelper);
|
||||
} else {
|
||||
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,
|
||||
titleEditor,
|
||||
descriptionEditor);
|
||||
if (pageModel == null) {
|
||||
setCaption(textsUtil.getText("ui.admin.pagemodels.caption.new"));
|
||||
} 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
|
||||
.getText("ui.admin.pagemodels.buttons.save"));
|
||||
|
|
@ -113,7 +139,10 @@ class PageModelForm extends Window {
|
|||
cancelButton);
|
||||
|
||||
final VerticalLayout layout = new VerticalLayout(formLayout,
|
||||
titlePanel,
|
||||
descPanel,
|
||||
buttonsLayout);
|
||||
layout.setMargin(true);
|
||||
setContent(layout);
|
||||
}
|
||||
|
||||
|
|
@ -140,15 +169,30 @@ class PageModelForm extends Window {
|
|||
}
|
||||
|
||||
if (pageModel == null) {
|
||||
|
||||
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);
|
||||
|
||||
final PageModelRepository pageModelRepo = pageModelsController
|
||||
.getPageModelRepo();
|
||||
pageModelRepo.save(pageModel);
|
||||
|
||||
controller
|
||||
.getPageModelsController()
|
||||
.getPageModelsTableDataProvider()
|
||||
.refreshAll();
|
||||
close();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -134,6 +134,22 @@ class PageModelsController implements Serializable {
|
|||
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)
|
||||
protected void removeComponentModel(final PageModel pageModel,
|
||||
final ComponentModel componentModel) {
|
||||
|
|
|
|||
|
|
@ -109,6 +109,7 @@ class PageModelsTab extends CustomComponent {
|
|||
|
||||
final Button addPageModelButton = new Button(localizedTextsUtil
|
||||
.getText("ui.admin.pagemodels.create_new"));
|
||||
addPageModelButton.addStyleName(ValoTheme.BUTTON_TINY);
|
||||
addPageModelButton.setIcon(VaadinIcons.PLUS_CIRCLE_O);
|
||||
addPageModelButton.addClickListener(event -> {
|
||||
final CcmApplication application
|
||||
|
|
@ -118,7 +119,7 @@ class PageModelsTab extends CustomComponent {
|
|||
adminViewController, application);
|
||||
pageModelForm.setModal(true);
|
||||
pageModelForm.setWidth("40%");
|
||||
pageModelForm.setHeight("30%");
|
||||
pageModelForm.setHeight("60%");
|
||||
|
||||
UI.getCurrent().addWindow(pageModelForm);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -33,9 +33,11 @@ import javax.servlet.http.HttpServletRequest;
|
|||
import javax.servlet.http.HttpSession;
|
||||
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.MissingResourceException;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Provides the locale which has been selected based on the available languages
|
||||
|
|
@ -185,6 +187,21 @@ public class GlobalizationHelper implements Serializable {
|
|||
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) {
|
||||
|
||||
final HttpSession session = request.getSession(true);
|
||||
|
|
|
|||
|
|
@ -1,8 +1,18 @@
|
|||
package org.libreccm.l10n.ui;
|
||||
|
||||
import com.vaadin.data.provider.ListDataProvider;
|
||||
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.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.LocalizedString;
|
||||
|
||||
|
|
@ -10,6 +20,7 @@ import java.util.ArrayList;
|
|||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/*
|
||||
|
|
@ -74,7 +85,39 @@ public class LocalizedStringEditor extends CustomComponent {
|
|||
grid.addColumn(LocalizedStringValue::getLocaleLabel)
|
||||
.setCaption("Language")
|
||||
.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,
|
||||
|
|
@ -90,6 +133,7 @@ public class LocalizedStringEditor extends CustomComponent {
|
|||
final GlobalizationHelper globalizationHelper) {
|
||||
this(globalizationHelper);
|
||||
this.multiline = multiline;
|
||||
localizedString = new LocalizedString();
|
||||
}
|
||||
|
||||
public LocalizedStringEditor(final LocalizedString localizedString,
|
||||
|
|
@ -116,6 +160,58 @@ public class LocalizedStringEditor extends CustomComponent {
|
|||
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 Locale locale;
|
||||
|
|
@ -176,11 +272,19 @@ public class LocalizedStringEditor extends CustomComponent {
|
|||
.compareTo(Objects.toString(locale2));
|
||||
});
|
||||
|
||||
return locales
|
||||
.subList(offset, limit)
|
||||
.stream()
|
||||
.map(locale -> new LocalizedStringValue(
|
||||
locale, localizedString.getValue(locale)));
|
||||
if (locales.size() > limit) {
|
||||
return locales
|
||||
.subList(offset, limit)
|
||||
.stream()
|
||||
.map(locale -> new LocalizedStringValue(
|
||||
locale, localizedString.getValue(locale)));
|
||||
} else {
|
||||
return locales
|
||||
.subList(offset, locales.size())
|
||||
.stream()
|
||||
.map(locale -> new LocalizedStringValue(
|
||||
locale, localizedString.getValue(locale)));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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.table.columns.edit.label=Edit
|
||||
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}
|
||||
|
|
|
|||
|
|
@ -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.table.columns.edit.label=Bearbeiten
|
||||
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
|
||||
|
|
|
|||
|
|
@ -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.table.columns.edit.label=Edit
|
||||
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}
|
||||
|
|
|
|||
|
|
@ -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.table.columns.edit.label=Edit
|
||||
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}
|
||||
|
|
|
|||
Loading…
Reference in New Issue