CCM NG/ccm-cms: Language Tab of the ContentItemPage now works

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4835 8810af33-2d31-482b-a856-94f89814c4df
pull/2/head
jensp 2017-07-03 17:03:07 +00:00
parent d0c7265b13
commit a57a121ebb
10 changed files with 397 additions and 145 deletions

View File

@ -29,7 +29,6 @@ import com.arsdigita.bebop.Resettable;
import com.arsdigita.bebop.SimpleContainer; import com.arsdigita.bebop.SimpleContainer;
import com.arsdigita.bebop.SingleSelectionModel; import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.TabbedPane; import com.arsdigita.bebop.TabbedPane;
import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.event.ActionEvent; import com.arsdigita.bebop.event.ActionEvent;
import com.arsdigita.bebop.event.ActionListener; import com.arsdigita.bebop.event.ActionListener;
import com.arsdigita.bebop.event.FormSectionEvent; import com.arsdigita.bebop.event.FormSectionEvent;
@ -42,7 +41,6 @@ import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.cms.CMS; import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ItemSelectionModel; import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.PageLocations; import com.arsdigita.cms.PageLocations;
import com.arsdigita.cms.dispatcher.CMSDispatcher;
import com.arsdigita.cms.dispatcher.CMSPage; import com.arsdigita.cms.dispatcher.CMSPage;
import com.arsdigita.cms.ui.authoring.WizardSelector; import com.arsdigita.cms.ui.authoring.WizardSelector;
import com.arsdigita.cms.ui.item.ContentItemRequestLocal; import com.arsdigita.cms.ui.item.ContentItemRequestLocal;
@ -57,7 +55,6 @@ import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig; import com.arsdigita.kernel.KernelConfig;
import com.arsdigita.kernel.ui.ACSObjectSelectionModel; import com.arsdigita.kernel.ui.ACSObjectSelectionModel;
import com.arsdigita.util.Assert; import com.arsdigita.util.Assert;
import com.arsdigita.util.UncheckedWrapperException;
import com.arsdigita.xml.Document; import com.arsdigita.xml.Document;
import com.arsdigita.xml.Element; import com.arsdigita.xml.Element;
@ -71,9 +68,7 @@ import org.librecms.contentsection.ContentItemL10NManager;
import org.librecms.contentsection.ContentItemRepository; import org.librecms.contentsection.ContentItemRepository;
import org.librecms.contentsection.ContentItemVersion; import org.librecms.contentsection.ContentItemVersion;
import org.librecms.contentsection.ContentSection; import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionManager;
import org.librecms.contentsection.ContentType; import org.librecms.contentsection.ContentType;
import org.librecms.dispatcher.ItemResolver;
import java.io.IOException; import java.io.IOException;
import java.util.Locale; import java.util.Locale;
@ -149,7 +144,7 @@ public class ContentItemPage extends CMSPage implements ActionListener {
private final TabbedPane tabbedPane; private final TabbedPane tabbedPane;
private final StringParameter returnUrlParameter; private final StringParameter returnUrlParameter;
private final ItemSelectionModel itemSelectionModel; private final ItemSelectionModel itemSelectionModel;
private final SingleSelectionModel<String> selectedLanguageModel; // private final SingleSelectionModel<String> selectedLanguageModel;
private final ACSObjectSelectionModel typeSelectionModel; private final ACSObjectSelectionModel typeSelectionModel;
private final ContentItemRequestLocal itemRequestLocal; private final ContentItemRequestLocal itemRequestLocal;
private final Summary summaryPane; private final Summary summaryPane;
@ -238,15 +233,14 @@ public class ContentItemPage extends CMSPage implements ActionListener {
itemSelectionModel = new ItemSelectionModel(itemId); itemSelectionModel = new ItemSelectionModel(itemId);
// Add the selected item language as parameter // Add the selected item language as parameter
selectedLanguageParam = new StringParameter( selectedLanguageParam = new StringParameter(SELECTED_LANGUAGE);
SELECTED_LANGUAGE);
selectedLanguageParam.addParameterListener( selectedLanguageParam.addParameterListener(
new NotNullValidationListener(SELECTED_LANGUAGE)); new NotNullValidationListener(SELECTED_LANGUAGE));
addGlobalStateParam(selectedLanguageParam); addGlobalStateParam(selectedLanguageParam);
selectedLanguageModel = new ParameterSingleSelectionModel<>( // selectedLanguageModel = new ParameterSingleSelectionModel<>(
selectedLanguageParam); // selectedLanguageParam);
selectedLanguageParam // selectedLanguageParam
.setDefaultValue(KernelConfig.getConfig().getDefaultLanguage()); // .setDefaultValue(KernelConfig.getConfig().getDefaultLanguage());
// Add the content type global state parameter // Add the content type global state parameter
final LongParameter contentType = new LongParameter(CONTENT_TYPE); final LongParameter contentType = new LongParameter(CONTENT_TYPE);
@ -282,7 +276,8 @@ public class ContentItemPage extends CMSPage implements ActionListener {
summaryPane = new Summary(itemSelectionModel); summaryPane = new Summary(itemSelectionModel);
wizardPane = new WizardSelector(itemSelectionModel, typeSelectionModel); wizardPane = new WizardSelector(itemSelectionModel, typeSelectionModel);
languagesPane = new ItemLanguages(itemSelectionModel, languagesPane = new ItemLanguages(itemSelectionModel,
selectedLanguageModel); // selectedLanguageModel,
selectedLanguageParam);
workflowPane = new ItemWorkflowAdminPane(itemId); // Make this use m_item XXX workflowPane = new ItemWorkflowAdminPane(itemId); // Make this use m_item XXX
lifecyclePane = new ItemLifecycleAdminPane(itemRequestLocal); lifecyclePane = new ItemLifecycleAdminPane(itemRequestLocal);
revisionsPane = new ItemRevisionAdminPane(itemRequestLocal); revisionsPane = new ItemRevisionAdminPane(itemRequestLocal);

View File

@ -31,10 +31,9 @@ import com.arsdigita.bebop.event.PrintListener;
import com.arsdigita.bebop.form.Option; import com.arsdigita.bebop.form.Option;
import com.arsdigita.bebop.form.OptionGroup; import com.arsdigita.bebop.form.OptionGroup;
import com.arsdigita.bebop.form.Submit; import com.arsdigita.bebop.form.Submit;
import com.arsdigita.bebop.parameters.StringParameter;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentType;
import com.arsdigita.cms.ItemSelectionModel; import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.ui.ContentItemPage; import com.arsdigita.cms.ui.ContentItemPage;
@ -43,28 +42,21 @@ import com.arsdigita.cms.ui.authoring.LanguageWidget;
import org.librecms.util.LanguageUtil; import org.librecms.util.LanguageUtil;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig;
import com.arsdigita.toolbox.ui.ActionGroup; import com.arsdigita.toolbox.ui.ActionGroup;
import com.arsdigita.toolbox.ui.LayoutPanel; import com.arsdigita.toolbox.ui.LayoutPanel;
import com.arsdigita.toolbox.ui.Section; import com.arsdigita.toolbox.ui.Section;
import com.arsdigita.util.Assert;
import com.arsdigita.util.Pair; import com.arsdigita.util.Pair;
import com.arsdigita.util.UncheckedWrapperException;
import com.arsdigita.web.RedirectSignal; import com.arsdigita.web.RedirectSignal;
import com.arsdigita.web.URL; import com.arsdigita.web.URL;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.workflow.Workflow;
import org.libreccm.workflow.WorkflowTemplate;
import org.librecms.contentsection.ContentItemL10NManager; import org.librecms.contentsection.ContentItemL10NManager;
import java.util.Collection;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.TooManyListenersException; import java.util.TooManyListenersException;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.libreccm.configuration.ConfigurationManager;
import org.libreccm.core.UnexpectedErrorException;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
/** /**
@ -77,23 +69,28 @@ import org.librecms.CmsConstants;
public class ItemLanguages extends LayoutPanel { public class ItemLanguages extends LayoutPanel {
private final ItemSelectionModel selectionModel; private final ItemSelectionModel selectionModel;
private final SingleSelectionModel<String> selectedLanguage; // private final SingleSelectionModel<String> selectedLanguage;
private final LanguageWidget languageWidget; private final LanguageWidget languageWidget;
private final Submit changeSubmit; private final StringParameter selectedLanguageParam;
// private final Submit changeSubmit;
private final Submit createSubmit; private final Submit createSubmit;
/** /**
* Constructs a new <code>ItemLanguages</code>. * Constructs a new <code>ItemLanguages</code>.
* *
* @param selectionModel the {@link ItemSelectionModel} which will supply * @param selectionModel the {@link ItemSelectionModel} which will
* the current item * supply the current item
* @param selectedLanguage {@link SingleSelectionModel} for the selected * @param selectedLanguage {@link SingleSelectionModel} for the
* language. * selected language.
* @param selectedLanguageParam
*/ */
public ItemLanguages(final ItemSelectionModel selectionModel, public ItemLanguages(final ItemSelectionModel selectionModel,
final SingleSelectionModel<String> selectedLanguage) { // final SingleSelectionModel<String> selectedLanguage,
final StringParameter selectedLanguageParam) {
this.selectionModel = selectionModel; this.selectionModel = selectionModel;
this.selectedLanguage = selectedLanguage; // this.selectedLanguage = selectedLanguage;
this.selectedLanguageParam = selectedLanguageParam;
final Section section = new Section(gz("cms.ui.item.languages")); final Section section = new Section(gz("cms.ui.item.languages"));
setBody(section); setBody(section);
@ -102,10 +99,23 @@ public class ItemLanguages extends LayoutPanel {
section.setBody(group); section.setBody(group);
group.setSubject(new ItemLanguagesTable(selectionModel, group.setSubject(new ItemLanguagesTable(selectionModel,
selectedLanguage)); // selectedLanguage,
selectedLanguageParam));
final Form form = new Form("newLanguage", new BoxPanel( final Form form = new Form("newLanguage", new BoxPanel(
BoxPanel.HORIZONTAL)); BoxPanel.HORIZONTAL)) {
@Override
public boolean isVisible(final PageState state) {
final ContentItem item = selectionModel.getSelectedItem(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ContentItemL10NManager l10NManager = cdiUtil.findBean(
ContentItemL10NManager.class);
return !l10NManager.creatableLocales(item).isEmpty();
}
};
group.addAction(form); group.addAction(form);
form.setRedirecting(true); form.setRedirecting(true);
@ -121,12 +131,12 @@ public class ItemLanguages extends LayoutPanel {
try { try {
languageWidget.addPrintListener(new OptionPrinter()); languageWidget.addPrintListener(new OptionPrinter());
} catch (TooManyListenersException ex) { } catch (TooManyListenersException ex) {
throw new UncheckedWrapperException(ex); throw new UnexpectedErrorException(ex);
} }
form.add(languageWidget); form.add(languageWidget);
changeSubmit = new Submit("change", gz("cms.ui.item.language.change")); // changeSubmit = new Submit("change", gz("cms.ui.item.language.change"));
form.add(changeSubmit); // form.add(changeSubmit);
createSubmit = new Submit("create", gz("cms.ui.item.language.add")); createSubmit = new Submit("create", gz("cms.ui.item.language.add"));
form.add(createSubmit); form.add(createSubmit);
form.addProcessListener(new ProcessListener()); form.addProcessListener(new ProcessListener());
@ -140,28 +150,29 @@ public class ItemLanguages extends LayoutPanel {
@Override @Override
public final void prepare(final PrintEvent event) { public final void prepare(final PrintEvent event) {
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final OptionGroup optionGroup = (OptionGroup) event.getTarget(); final OptionGroup target = (OptionGroup) event.getTarget();
target.clearOptions();
final ContentItem item = selectionModel.getSelectedItem(state); final ContentItem item = selectionModel.getSelectedItem(state);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final LanguageUtil languageUtil = cdiUtil.findBean( final LanguageUtil languageUtil = cdiUtil.findBean(
LanguageUtil.class); LanguageUtil.class);
final ContentItemL10NManager l10NManager = cdiUtil.findBean( final ContentItemL10NManager l10NManager = cdiUtil.findBean(
ContentItemL10NManager.class); ContentItemL10NManager.class);
final List<String> creatableLangs = l10NManager.creatableLocales( final List<String> creatableLangs = l10NManager.creatableLocales(
item).stream() item).stream()
.map(locale -> locale.toString()) .map(locale -> locale.toString())
.collect(Collectors.toList()); .collect(Collectors.toList());
final List<Pair> languages = languageUtil.convertToG11N( final List<Pair> languages = languageUtil
creatableLangs); .convertToG11N(creatableLangs);
for (final Pair pair : languages) { for (final Pair pair : languages) {
final String langCode = (String) pair.getKey(); final String langCode = (String) pair.getKey();
final GlobalizedMessage langName final GlobalizedMessage langName
= (GlobalizedMessage) pair = (GlobalizedMessage) pair
.getValue(); .getValue();
optionGroup.addOption(new Option(langCode, new Label(langName))); target.addOption(new Option(langCode, new Label(langName)));
} }
} }
@ -174,37 +185,32 @@ public class ItemLanguages extends LayoutPanel {
@Override @Override
public final void process(final FormSectionEvent event) public final void process(final FormSectionEvent event)
throws FormProcessException { throws FormProcessException {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final String lang = (String) languageWidget.getValue(state); final String language = (String) languageWidget.getValue(state);
final ContentItem item = (ContentItem) selectionModel final ContentItem item = selectionModel.getSelectedItem(state);
.getSelectedItem(state);
final ConfigurationManager confManager = cdiUtil.findBean(
ConfigurationManager.class);
final KernelConfig kernelConfig = confManager.findConfiguration(
KernelConfig.class);
final Locale defaultLocale = kernelConfig.getDefaultLocale();
final String name = item.getName().getValue(defaultLocale);
if (createSubmit.isSelected(state)) { if (createSubmit.isSelected(state)) {
final ContentSection section = item.getContentType().
getContentSection();
Assert.exists(section, ContentSection.class); final ItemLanguagesController controller = cdiUtil
.findBean(ItemLanguagesController.class);
final ContentItemL10NManager l10NManager = cdiUtil.findBean( controller.addLanguage(item, language);
ContentItemL10NManager.class);
l10NManager.addLanguage(item, new Locale(lang));
// redirect to ContentItemPage.AUTHORING_TAB of the new instance // redirect to ContentItemPage.AUTHORING_TAB of the new instance
state.setValue(selectedLanguageParam, language);
final String langParam = String
.format("&%s=%s",
ContentItemPage.SELECTED_LANGUAGE,
language);
final String target = String.join( final String target = String.join(
"", URL.getDispatcherPath(), "",
ContentItemPage.getItemURL(item, URL.getDispatcherPath(),
ContentItemPage.AUTHORING_TAB)); controller.getItemEditUrl(item),
langParam);
throw new RedirectSignal(target, true); throw new RedirectSignal(target, true);
} }

View File

@ -19,6 +19,7 @@
package com.arsdigita.cms.ui.item; package com.arsdigita.cms.ui.item;
import com.arsdigita.bebop.table.RowData; import com.arsdigita.bebop.table.RowData;
import com.arsdigita.cms.ui.ContentItemPage;
import org.libreccm.l10n.GlobalizationHelper; import org.libreccm.l10n.GlobalizationHelper;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
@ -41,7 +42,7 @@ import javax.transaction.Transactional;
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped
public class ItemLanguagesController { class ItemLanguagesController {
@Inject @Inject
private ContentItemRepository itemRepo; private ContentItemRepository itemRepo;
@ -52,27 +53,27 @@ public class ItemLanguagesController {
@Inject @Inject
private GlobalizationHelper globalizationHelper; private GlobalizationHelper globalizationHelper;
public List<RowData<String>> retrieveLanguageVariants(final ContentItem item) { protected List<RowData<String>> retrieveLanguageVariants(
final ContentItem item) {
return retrieveLanguageVariants(item.getObjectId()); return retrieveLanguageVariants(item.getObjectId());
} }
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public List<RowData<String>> retrieveLanguageVariants(final long itemId) { protected List<RowData<String>> retrieveLanguageVariants(final long itemId) {
final Optional<ContentItem> item = itemRepo.findById(itemId);
if (!item.isPresent()) { final ContentItem item = itemRepo
throw new IllegalArgumentException(String.format( .findById(itemId)
"No content item with id %d found.", itemId)); .orElseThrow(() -> new IllegalArgumentException(String.format(
} "No ContentItem with ID %d in the database.", itemId)));
final List<Locale> availableLangs = new ArrayList<>(itemL10NManager final List<Locale> availableLangs = new ArrayList<>(itemL10NManager
.availableLanguages(item.get())); .availableLanguages(item));
availableLangs.sort((locale1, locale2) -> { availableLangs.sort((locale1, locale2) -> {
return locale1.toString().compareTo(locale2.toString()); return locale1.toString().compareTo(locale2.toString());
}); });
return availableLangs.stream() return availableLangs.stream()
.map(lang -> createRow(item.get(), lang)) .map(lang -> createRow(item, lang))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@ -80,10 +81,61 @@ public class ItemLanguagesController {
final Locale lang) { final Locale lang) {
final RowData<String> row = new RowData<>(2); final RowData<String> row = new RowData<>(2);
row.setRowKey(lang.toString()); row.setRowKey(lang.toString());
row.setColData(0, lang.getDisplayName(globalizationHelper.getNegotiatedLocale())); row.setColData(0, lang.getDisplayName(globalizationHelper
.getNegotiatedLocale()));
row.setColData(1, item.getTitle().getValue(lang)); row.setColData(1, item.getTitle().getValue(lang));
return row; return row;
} }
@Transactional(Transactional.TxType.REQUIRED)
protected int countLanguageVariants(final ContentItem item) {
final ContentItem contentItem = itemRepo
.findById(item.getObjectId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No ContentItem with ID %d in the database.",
item.getObjectId())));
return itemL10NManager.availableLanguages(contentItem).size();
}
@Transactional(Transactional.TxType.REQUIRED)
protected void addLanguage(final ContentItem item, final String language) {
final ContentItem contentItem = itemRepo
.findById(item.getObjectId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No ContentItem with ID %d in the database.",
item.getObjectId())));
itemL10NManager.addLanguage(contentItem, new Locale(language));
}
@Transactional(Transactional.TxType.REQUIRED)
protected void removeLanguage(final ContentItem item,
final String language) {
final ContentItem contentItem = itemRepo
.findById(item.getObjectId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No ContentItem with ID %d in the database.",
item.getObjectId())));
itemL10NManager.removeLanguage(contentItem, new Locale(language));
}
@Transactional(Transactional.TxType.REQUIRED)
protected String getItemEditUrl(final ContentItem item) {
final ContentItem contentItem = itemRepo
.findById(item.getObjectId())
.orElseThrow(() -> new IllegalArgumentException(String.format(
"No ContentItem with ID %d in the database.",
item.getObjectId())));
return ContentItemPage.getItemURL(contentItem,
ContentItemPage.AUTHORING_TAB);
}
} }

View File

@ -22,28 +22,29 @@ import com.arsdigita.bebop.Component;
import com.arsdigita.bebop.ControlLink; import com.arsdigita.bebop.ControlLink;
import com.arsdigita.bebop.FormProcessException; import com.arsdigita.bebop.FormProcessException;
import com.arsdigita.bebop.Label; import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.Link;
import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.bebop.Table; import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.Text;
import com.arsdigita.bebop.event.TableActionEvent; import com.arsdigita.bebop.event.TableActionEvent;
import com.arsdigita.bebop.event.TableActionListener; import com.arsdigita.bebop.event.TableActionListener;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.bebop.table.TableCellRenderer; import com.arsdigita.bebop.table.TableCellRenderer;
import com.arsdigita.bebop.table.TableColumn; import com.arsdigita.bebop.table.TableColumn;
import com.arsdigita.bebop.table.TableColumnModel; import com.arsdigita.bebop.table.TableColumnModel;
import com.arsdigita.cms.ItemSelectionModel; import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.ui.ContentItemPage; import com.arsdigita.cms.ui.ContentItemPage;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.kernel.KernelConfig;
import com.arsdigita.web.RedirectSignal;
import com.arsdigita.web.URL;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.librecms.CmsConstants; import org.librecms.CmsConstants;
import org.librecms.contentsection.ContentItem; import org.librecms.contentsection.ContentItem;
import org.librecms.contentsection.ContentItemL10NManager;
import org.librecms.util.LanguageUtil; import org.librecms.util.LanguageUtil;
import java.util.Locale; import java.util.Locale;
/** /**
* Displays a list of all language instances of an item. * Displays a list of all language instances of an item.
* *
@ -55,7 +56,8 @@ public class ItemLanguagesTable extends Table {
public static final int COL_DELETE = 2; public static final int COL_DELETE = 2;
private final ItemSelectionModel itemSelectionModel; private final ItemSelectionModel itemSelectionModel;
private final SingleSelectionModel<String> langSelectionModel; // private final SingleSelectionModel<String> langSelectionModel;
private final StringParameter selectedLanguageParam;
// private final TableColumn deleteColumn; // private final TableColumn deleteColumn;
/** /**
@ -68,12 +70,14 @@ public class ItemLanguagesTable extends Table {
* selected language. * selected language.
*/ */
public ItemLanguagesTable(final ItemSelectionModel itemSelectionModel, public ItemLanguagesTable(final ItemSelectionModel itemSelectionModel,
final SingleSelectionModel<String> langSelectionModel) { // final SingleSelectionModel<String> langSelectionModel,
final StringParameter selectedLanguageParam) {
super(); super();
setIdAttr("item_languages_table"); setIdAttr("item_languages_table");
this.itemSelectionModel = itemSelectionModel; this.itemSelectionModel = itemSelectionModel;
this.langSelectionModel = langSelectionModel; // this.langSelectionModel = langSelectionModel;
this.selectedLanguageParam = selectedLanguageParam;
setModelBuilder(new ItemLanguagesTableModelBuilder(itemSelectionModel)); setModelBuilder(new ItemLanguagesTableModelBuilder(itemSelectionModel));
final TableColumnModel columnModel = getColumnModel(); final TableColumnModel columnModel = getColumnModel();
@ -102,6 +106,8 @@ public class ItemLanguagesTable extends Table {
final int column) { final int column) {
final Locale locale = new Locale((String) value); final Locale locale = new Locale((String) value);
final String selectedLanguage = (String) state
.getValue(selectedLanguageParam);
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final LanguageUtil langUtil = cdiUtil.findBean( final LanguageUtil langUtil = cdiUtil.findBean(
@ -109,70 +115,114 @@ public class ItemLanguagesTable extends Table {
final Label label = new Label(langUtil.getLangFull(locale)); final Label label = new Label(langUtil.getLangFull(locale));
if (langSelectionModel.getSelectedKey(state).equals(key)) { // if (langSelectionModel.getSelectedKey(state).equals(key)) {
if (selectedLanguage.equals(key)) {
// Current variant, no link // Current variant, no link
return label; return label;
} else { } else {
final String target = ContentItemPage.getItemURL( return new ControlLink(label);
itemSelectionModel.getSelectedItem(state),
ContentItemPage.AUTHORING_TAB); // final String target = ContentItemPage.getItemURL(
return new Link(label, target); // itemSelectionModel.getSelectedItem(state),
// ContentItemPage.AUTHORING_TAB);
// return new Link(label, target);
} }
} }
} }
); );
columnModel.get(COL_DELETE).setCellRenderer(new TableCellRenderer() { columnModel.get(COL_DELETE)
.setCellRenderer(new TableCellRenderer() {
@Override @Override
public Component getComponent(final Table table, public Component getComponent(final Table table,
final PageState state, final PageState state,
final Object value, final Object value,
final boolean isSelected, final boolean isSelected,
final Object key, final Object key,
final int row, final int row,
final int column) { final int column
) {
final ControlLink link = new ControlLink(new Label( final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
new GlobalizedMessage("cms.ui.delete", final ItemLanguagesController controller = cdiUtil
CmsConstants.CMS_BUNDLE))); .findBean(ItemLanguagesController.class);
link.setConfirmation(new GlobalizedMessage( final ContentItem item = itemSelectionModel
"cms.ui.delete.confirmation", CmsConstants.CMS_BUNDLE)); .getSelectedItem(state);
if (key
.equals(KernelConfig.getConfig().getDefaultLanguage())
|| controller.countLanguageVariants(item) <= 1) {
return new Text(" ");
} else {
final ControlLink link = new ControlLink(new Label(
new GlobalizedMessage("cms.ui.delete",
CmsConstants.CMS_BUNDLE)));
link.setConfirmation(new GlobalizedMessage(
"cms.ui.delete.confirmation",
CmsConstants.CMS_BUNDLE));
return link;
}
}
return link;
} }
);
}); addTableActionListener(
new TableActionListener() {
addTableActionListener(new TableActionListener() {
@Override @Override
public void cellSelected(final TableActionEvent event) public void cellSelected(final TableActionEvent event)
throws FormProcessException { throws FormProcessException {
if (event.getColumn() != COL_DELETE) {
//Nothing to do
return;
}
final PageState state = event.getPageState(); final PageState state = event.getPageState();
final ContentItem item = itemSelectionModel final ContentItem item = itemSelectionModel
.getSelectedItem(state); .getSelectedItem(state);
final String selectedLang = (String) event.getRowKey(); final String selectedLanguage = (String) event.getRowKey();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final ContentItemL10NManager l10nManager = cdiUtil.findBean( final ItemLanguagesController controller = cdiUtil
ContentItemL10NManager.class); .findBean(ItemLanguagesController.class);
l10nManager.removeLanguage(item, new Locale(selectedLang)); switch (event.getColumn()) {
case COL_LANGUAGE: {
state.setValue(selectedLanguageParam, selectedLanguage);
final String langParam = String
.format("&%s=%s",
ContentItemPage.SELECTED_LANGUAGE,
selectedLanguage);
final String target = String.join(
"",
URL.getDispatcherPath(),
controller.getItemEditUrl(item),
langParam);
throw new RedirectSignal(target, true);
}
case COL_DELETE: {
if (selectedLanguage.equals(state.getValue(
selectedLanguageParam))) {
state.setValue(selectedLanguageParam,
KernelConfig.getConfig()
.getDefaultLanguage());
}
controller.removeLanguage(item, selectedLanguage);
}
default:
//Nothing to do
return;
}
} }
@Override @Override
public void headSelected(final TableActionEvent event) { public void headSelected(final TableActionEvent event
) {
//Nothing //Nothing
} }
}); }
);
} }

View File

@ -359,7 +359,11 @@ public class ContentItemL10NManager {
* set with all locales provided by any of the fields. After that the method * set with all locales provided by any of the fields. After that the method
* will iterate over all {@link LocalizedString} fields and check if the * will iterate over all {@link LocalizedString} fields and check if the
* {@link LocalizedString} has an entry for every language in the set. If * {@link LocalizedString} has an entry for every language in the set. If
* not an entry for the language is added. * not an entry for the language is added. The initial value is taken from
* the variant for default language configured in
* {@link KernelConfig#defaultLanguage}. If no value for the default locale
* exists the value for the first found language from the list of supported
* languages ({@link KernelConfig#supportedLanguages}) is used.
* *
* @param item The item to normalise. The item <strong>must be</strong> the * @param item The item to normalise. The item <strong>must be</strong> the
* <strong>draft version</strong> of the item! If a <em>live version</em> or * <strong>draft version</strong> of the item! If a <em>live version</em> or

View File

@ -8,10 +8,9 @@ ay=Aymara
az=Azerbaijani az=Azerbaijani
ba=Bashkir ba=Bashkir
be=Byelorussian be=Byelorussian
bg=Bulgarian
bh=Bihari bh=Bihari
bi=Bislama bi=Bislama
bn=Bengali;=Bangla bn=Bengali
bo=Tibetan bo=Tibetan
br=Breton br=Breton
ca=Catalan ca=Catalan
@ -20,21 +19,21 @@ cs=Czech
cy=Welsh cy=Welsh
da=Danish da=Danish
de=German de=German
dz=Bhutani dz=Dzongkha (Bhutani)
el=Greek el=Greek
en=English en=English
eo=Esperanto eo=Esperanto
es=Spanish es=Spanish
et=Estonian et=Estonian
eu=Basque eu=Basque
fa=Persian fa=Farsi (Persian)
fi=Finnish fi=Finnish
fj=Fiji fj=Fiji
fo=Faroese fo=Faroese
fr=French fr=French
fy=Frisian fy=Frisian
ga=Irish ga=Irish
gd=Scots=Gaelic gd=Scottish Gaelic
gl=Galician gl=Galician
gn=Guarani gn=Guarani
gu=Gujarati gu=Gujarati
@ -47,17 +46,15 @@ hy=Armenian
ia=Interlingua ia=Interlingua
id=Indonesian id=Indonesian
ie=Interlingue ie=Interlingue
ik=Inupiak ik=Ik
is=Icelandic is=Icelandic
it=Italian it=Italian
iu=Inuktitut iu=Inuktitut
iw=Hebrew
ja=Japanese ja=Japanese
jw=Javanese
ka=Georgian ka=Georgian
kk=Kazakh kk=Kazakh
kl=Greenlandic kl=Kalaallisut (Greenlandic)
km=Cambodian km=Khmer (Cambodian)
kn=Kannada kn=Kannada
ko=Korean ko=Korean
ks=Kashmiri ks=Kashmiri
@ -83,11 +80,11 @@ ne=Nepali
nl=Dutch nl=Dutch
no=Norwegian no=Norwegian
oc=Occitan oc=Occitan
om==Oromo om=Oromo
or=Oriya or=Oriya
pa=Punjabi pa=Punjabi
pl=Polish pl=Polish
ps=Pashto,=Pushto ps=Pashto
pt=Portuguese pt=Portuguese
qu=Quechua qu=Quechua
rm=Rhaeto-Romance rm=Rhaeto-Romance
@ -98,7 +95,6 @@ rw=Kinyarwanda
sa=Sanskrit sa=Sanskrit
sd=Sindhi sd=Sindhi
sg=Sangho sg=Sangho
sh=Serbo-Croatian
si=Sinhalese si=Sinhalese
sk=Slovak sk=Slovak
sl=Slovenian sl=Slovenian
@ -136,6 +132,6 @@ xh=Xhosa
yi=Yiddish yi=Yiddish
yo=Yoruba yo=Yoruba
za=Zhuang za=Zhuang
zh=Chinese zh=Manarin Chinese
zu=Zulu zu=Zulu
--=Undefined --=Undefined

View File

@ -0,0 +1,137 @@
aa=Afar
ab=Abchasisch
af=Afrikaans
am=Amharisch
ar=Arabisch
as=Assamesisch
ay=Aymara
az=Aserbeidschanisch
ba=Baschkirisch
be=Wei\u00dfrussisch
bh=Bihari
bi=Bislama
bn=Bengalisch
bo=Tibetisch
br=Bretonisch
ca=Catalanisch
co=Korsisch
cs=Tschechisch
cy=Walisisch
da=D\u00e4nisch
de=Deutsch
dz=Dzongkha (Bhutanisch)
el=Griechisch
en=Englisch
eo=Esperanto
es=Spanisch
et=Estnisch
eu=Baskisch
fa=Farsi (Persisch)
fi=Finnisch
fj=Fidschi
fo=F\u00e4r\u00f6isch
fr=Franz\u00f6sische
fy=Friesisch
ga=Irisch
gd=Schottisch-g\u00e4lisch
gl=Galicisch
gn=Guarani
gu=Gujarati
ha=Hausa
he=Ivrit (Hebrew)
hi=Hindi
hr=Kroatisch
hu=Ungarisch
hy=Armenisch
ia=Interlingua
id=Indonesisch
ie=Interlingue
ik=Ik
is=Isl\u00e4ndisch
it=Italienisch
iu=Inuktitut
ja=Japanisch
ka=Georgisch
kk=Kasachisch
kl=Kalaallisut (Gr\u00f6nl\u00e4ndisch)
km=Khmer (Kambodschanisch)
kn=Kannada
ko=Koreanisch
ks=Kashmiri
ku=Kurdisch
ky=Kirgisisch
la=Latein
ln=Ling\u00e1la
lo=Laotisch
lt=Litauisch
lv=Lettisch
mg=Malagasy
mi=Maorisch
mk=Mazedonisch
ml=Malayalam
mn=Mongolisch
mo=Moldauische
mr=Marathi
ms=Malaiisch
mt=(Malti) Maltesisch
my=Birmanisch
na=Nauruisch
ne=Nepali
nl=Niederl\u00e4ndisch
no=Norwegisch
oc=Okzitanisch
om=Oromo
or=Oriya
pa=Punjabi
pl=Polnisch
ps=Paschtu
pt=Portugiesisch
qu=Quechua
rm=R\u00e4toromanisch
rn=Kirundi
ro=Rum\u00e4nisch
ru=Russisch
rw=Kinyarwanda
sa=Sanskrit
sd=Sindhi
sg=Sangho
si=Singhalesisch
sk=Slowakisch
sl=Slowenisch
sm=Samoanisch
sn=Shona
so=Somali
sq=Albanisch
sr=Serbisch
ss=Siswati
st=Sesotho
su=Sundanesisch
sv=Schwedisch
sw=Swahili
ta=Tamil
te=Telugu
tg=Tadschikisch
th=Thail\u00e4ndisch
ti=Tigrinya
tk=Turkmenisch
tl=Tagalog
tn=Setswana
to=Tongaische
tr=T\u00fcrkisch
ts=Tsonga
tt=Tatarisch
tw=Twi
ug=Uigurisch
uk=Ukrainisch
ur=Urdu
uz=Usbekisch
vi=Vietnamesisch
vo=Volap\u00fck
wo=Wolof
xh=Xhosa
yi=Jiddisch
yo=Yoruba
za=Zhuang
zh=Mandarin (Chinese)
zu=Zulu
--=Undefined

View File

@ -330,3 +330,7 @@ cms.ui.workflow.task.user.add=Assign user
cms.ui.workflow.task.locked_by=Locked by {0} cms.ui.workflow.task.locked_by=Locked by {0}
cms.ui.workflow.task.locked_by_you=Locked by you cms.ui.workflow.task.locked_by_you=Locked by you
cms.ui.edit=Edit cms.ui.edit=Edit
cms.ui.language.header=Language
cms.ui.language.title=Title
cms.ui.action=Action
cms.ui.item.language.add=Add language

View File

@ -327,3 +327,7 @@ cms.ui.workflow.task.user.add=Benutzer zuordnen
cms.ui.workflow.task.locked_by=Reserviert durch {0} cms.ui.workflow.task.locked_by=Reserviert durch {0}
cms.ui.workflow.task.locked_by_you=Von Ihnen reserviert cms.ui.workflow.task.locked_by_you=Von Ihnen reserviert
cms.ui.edit=Bearbeiten cms.ui.edit=Bearbeiten
cms.ui.language.header=Sprache
cms.ui.language.title=Titel
cms.ui.action=Aktion
cms.ui.item.language.add=Sprache hinzuf\u00fcgen

View File

@ -286,3 +286,7 @@ cms.ui.workflow.task.user.add=Assign user
cms.ui.workflow.task.locked_by=Locked by {0} cms.ui.workflow.task.locked_by=Locked by {0}
cms.ui.workflow.task.locked_by_you=Locked by you cms.ui.workflow.task.locked_by_you=Locked by you
cms.ui.edit=Edit cms.ui.edit=Edit
cms.ui.language.header=Language
cms.ui.language.title=Title
cms.ui.action=Action
cms.ui.item.language.add=Add language