CCM NG: UI for managing permissions for assets

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5325 8810af33-2d31-482b-a856-94f89814c4df
ccm-docs
jensp 2018-03-03 10:41:29 +00:00
parent e9cc6caa9f
commit 4cc9f60be5
11 changed files with 76 additions and 215 deletions

View File

@ -318,11 +318,16 @@ public abstract class AbstractAssetForm<T extends Asset>
}
protected Locale getSelectedLocale(final PageState state) {
final String selected = (String) showLocaleSelect.getValue(state);
final Object selected = showLocaleSelect.getValue(state);
if (selected == null) {
return KernelConfig.getConfig().getDefaultLocale();
} else if(selected instanceof Locale) {
return (Locale) selected;
} else if(selected instanceof String) {
return new Locale((String) selected);
} else {
return new Locale(selected);
return new Locale(selected.toString());
}
}

View File

@ -92,8 +92,6 @@ public class AssetFolderBrowser extends Table {
private void initComponents() {
setModelBuilder(new AssetFolderBrowserTableModelBuilder());
final GlobalizedMessage[] headers = {
new GlobalizedMessage("cms.ui.folder.name",
CMS_FOLDER_BUNDLE),

View File

@ -67,9 +67,11 @@ import com.arsdigita.cms.ui.folder.FolderRequestLocal;
import com.arsdigita.cms.ui.folder.FolderSelectionModel;
import com.arsdigita.cms.ui.folder.FolderTreeModelBuilder;
import com.arsdigita.cms.ui.folder.FolderTreeModelController;
import com.arsdigita.cms.ui.permissions.CMSPermissionsPane;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.toolbox.ui.ActionGroup;
import com.arsdigita.toolbox.ui.LayoutPanel;
import com.arsdigita.ui.CcmObjectSelectionModel;
import java.lang.reflect.InvocationTargetException;
@ -88,6 +90,7 @@ import org.libreccm.categorization.CategoryManager;
import org.libreccm.core.CcmObject;
import org.libreccm.core.UnexpectedErrorException;
import org.libreccm.security.PermissionChecker;
import org.libreccm.security.PermissionManager;
import org.librecms.assets.AssetTypeInfo;
import org.librecms.assets.AssetTypesManager;
import org.librecms.contentsection.Asset;
@ -95,9 +98,12 @@ import org.librecms.contentsection.AssetManager;
import org.librecms.contentsection.AssetRepository;
import org.librecms.contentsection.FolderManager;
import org.librecms.contentsection.FolderRepository;
import org.librecms.contentsection.privileges.AssetPrivileges;
import org.librecms.contentsection.privileges.ItemPrivileges;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.ResourceBundle;
import java.util.TooManyListenersException;
@ -142,6 +148,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
private SegmentedPanel.Segment newFolderSegment;
private SegmentedPanel.Segment editFolderSegment;
private SegmentedPanel.Segment editAssetSegment;
private SegmentedPanel.Segment folderPermissionsSegment;
@SuppressWarnings("unchecked")
public AssetPane() {
@ -337,7 +344,6 @@ public class AssetPane extends LayoutPanel implements Resettable {
//
// });
// currentFolderSegment.add(currentFolderLabel);
actionsSegment = panel.addSegment();
actionsSegment.setIdAttr("folder-browse");
@ -570,7 +576,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final AssetTypesManager typesManager = cdiUtil
.findBean(AssetTypesManager.class);
if (selectedAssetModel.isSelected(state)) {
target.setLabel(
new GlobalizedMessage(
@ -585,7 +591,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
typeInfo.getLabelBundle());
final String typeLabel = bundle
.getString(typeInfo.getLabelKey());
target.setLabel(new GlobalizedMessage(
"cms.ui.admin.assets.create",
CmsConstants.CMS_BUNDLE,
@ -595,6 +601,25 @@ public class AssetPane extends LayoutPanel implements Resettable {
}));
editAssetSegment.add(editAssetForm);
folderPermissionsSegment = panel.addSegment();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionManager permissionManager = cdiUtil
.findBean(PermissionManager.class);
final String[] privileges = permissionManager
.listDefiniedPrivileges(AssetPrivileges.class)
.toArray(new String[]{});
final Map<String, String> privilegeNameMap = new HashMap<>();
Arrays
.stream(privileges)
.forEach(privilege -> privilegeNameMap.put(privilege, privilege));
final CcmObjectSelectionModel<CcmObject> objSelectionModel
= new CcmObjectSelectionModel<>(
CcmObject.class, folderSelectionModel);
final CMSPermissionsPane folderPermissionsPane = new CMSPermissionsPane(
privileges, privilegeNameMap, objSelectionModel);
folderPermissionsSegment.add(folderPermissionsPane);
return panel;
@ -610,7 +635,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
newFolderSegment.setVisible(state, false);
editFolderSegment.setVisible(state, false);
editAssetSegment.setVisible(state, false);
folderPermissionsSegment.setVisible(state, true);
}
protected void moveCopyMode(final PageState state) {
@ -624,6 +649,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
editFolderSegment.setVisible(state, false);
targetSelector.expose(state);
editAssetSegment.setVisible(state, false);
folderPermissionsSegment.setVisible(state, false);
}
protected void newFolderMode(final PageState state) {
@ -636,6 +662,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
newFolderSegment.setVisible(state, true);
editFolderSegment.setVisible(state, false);
editAssetSegment.setVisible(state, false);
folderPermissionsSegment.setVisible(state, false);
}
protected void editFolderMode(final PageState state) {
@ -646,6 +673,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
newFolderSegment.setVisible(state, false);
editFolderSegment.setVisible(state, true);
editAssetSegment.setVisible(state, false);
folderPermissionsSegment.setVisible(state, false);
}
protected void editAssetMode(final PageState state) {
@ -656,6 +684,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
newFolderSegment.setVisible(state, false);
editFolderSegment.setVisible(state, false);
editAssetSegment.setVisible(state, true);
folderPermissionsSegment.setVisible(state, false);
}
@Override
@ -675,6 +704,7 @@ public class AssetPane extends LayoutPanel implements Resettable {
page.setVisibleDefault(newFolderSegment, false);
page.setVisibleDefault(editFolderSegment, false);
page.setVisibleDefault(editAssetSegment, false);
page.setVisibleDefault(folderPermissionsSegment, true);
page.addComponentStateParam(this, actionParameter);
page.addComponentStateParam(this, sourcesParameter);

View File

@ -20,12 +20,10 @@ package com.arsdigita.cms.ui.folder;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.SingleSelectionModel;
import com.arsdigita.cms.CMS;
import com.arsdigita.ui.CcmObjectSelectionModel;
import org.libreccm.categorization.Category;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.Folder;
/**

View File

@ -27,8 +27,8 @@ import org.libreccm.security.PermissionManager;
import org.libreccm.security.Role;
import org.librecms.contentsection.ContentSection;
import org.librecms.contentsection.ContentSectionRepository;
import org.librecms.contentsection.privileges.ItemPrivileges;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@ -56,7 +56,7 @@ class CMSPermissionsTableController {
@Transactional(Transactional.TxType.REQUIRED)
public List<CMSPermissionsTableRow> buildDirectPermissionsRows(
final CcmObject object) {
final CcmObject object, final String[] privileges) {
final Optional<ContentSection> section = sectionRepo.findById(CMS
.getContext().getContentSection().getObjectId());
@ -68,7 +68,7 @@ class CMSPermissionsTableController {
.getRoles();
return roles.stream()
.map(role -> buildRow(role, object))
.map(role -> buildRow(role, object, privileges))
.sorted((row1, row2) -> {
return row1.getRoleName().compareTo(row2.getRoleName());
})
@ -76,11 +76,11 @@ class CMSPermissionsTableController {
}
private CMSPermissionsTableRow buildRow(final Role role,
final CcmObject object) {
final List<String> privileges = permissionManager
.listDefiniedPrivileges(ItemPrivileges.class);
final CcmObject object,
final String[] privileges) {
final List<CMSPermissionsTableColumn> columns = privileges.stream()
final List<CMSPermissionsTableColumn> columns = Arrays
.stream(privileges)
.map(privilege -> buildColumn(role, object, privilege))
.collect(Collectors.toList());

View File

@ -22,8 +22,6 @@ import com.arsdigita.bebop.table.TableModel;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.core.CcmObject;
import org.libreccm.security.PermissionManager;
import org.librecms.contentsection.privileges.ItemPrivileges;
import java.util.Iterator;
@ -33,26 +31,28 @@ import java.util.Iterator;
*/
class CMSPermissionsTableModel implements TableModel {
private final String[] privileges;
private final Iterator<CMSPermissionsTableRow> iterator;
private CMSPermissionsTableRow currentRow;
public CMSPermissionsTableModel(final CcmObject object) {
public CMSPermissionsTableModel(final CcmObject object,
final String[] privileges) {
this.privileges = privileges;
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final CMSPermissionsTableController controller = cdiUtil.findBean(
CMSPermissionsTableController.class);
iterator = controller.buildDirectPermissionsRows(object).iterator();
iterator = controller
.buildDirectPermissionsRows(object,privileges)
.iterator();
}
@Override
public int getColumnCount() {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final PermissionManager permissionManager = cdiUtil.findBean(
PermissionManager.class);
return permissionManager.listDefiniedPrivileges(ItemPrivileges.class)
.size() + 2;
return privileges.length + 2;
}
@Override

View File

@ -42,7 +42,7 @@ class CMSPermissionsTableModelBuilder extends LockableImpl
@Override
public TableModel makeModel(final Table table, final PageState state) {
final CcmObject object = parent.getObject(state);
return new CMSPermissionsTableModel(object);
return new CMSPermissionsTableModel(object, parent.getPrivileges());
}
}

View File

@ -19,19 +19,12 @@
package com.arsdigita.cms.ui.permissions;
import com.arsdigita.bebop.BoxPanel;
import com.arsdigita.bebop.Label;
import com.arsdigita.bebop.PageState;
import com.arsdigita.bebop.Table;
import com.arsdigita.bebop.parameters.StringParameter;
import com.arsdigita.bebop.table.TableModel;
import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.cms.CMS;
import com.arsdigita.cms.ItemSelectionModel;
import com.arsdigita.cms.ui.authoring.AuthoringKitWizard;
import com.arsdigita.cms.ui.authoring.ResettableContainer;
import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.ui.CcmObjectSelectionModel;
import com.arsdigita.util.LockableImpl;
import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.core.CcmObject;
@ -56,15 +49,11 @@ import java.util.Map;
)
public class ItemPermissionsStep extends ResettableContainer {
private final ItemSelectionModel itemSelectionModel;
public ItemPermissionsStep(final ItemSelectionModel itemSelectionModel,
final AuthoringKitWizard authoringKitWizard,
final StringParameter selectedLanguage) {
super("cms:permissionsStep", CMS.CMS_XML_NS);
this.itemSelectionModel = itemSelectionModel;
super("cms:permissionsStep", CMS.CMS_XML_NS);
final BoxPanel panel = new BoxPanel(BoxPanel.VERTICAL);
super.add(panel);
@ -88,178 +77,4 @@ public class ItemPermissionsStep extends ResettableContainer {
panel.add(permissionsPane);
}
// public ItemPermissionsStep(final ItemSelectionModel itemSelectionModel,
// final AuthoringKitWizard authoringKitWizard,
// final StringParameter selectedLanguage) {
// super("cms:permissionsStep", CMS.CMS_XML_NS);
//
// this.itemSelectionModel = itemSelectionModel;
//
// final BoxPanel panel = new BoxPanel(BoxPanel.VERTICAL);
// final Label header = new Label(new GlobalizedMessage(
// "cms.ui.permissions.table.header",
// CmsConstants.CMS_BUNDLE));
// panel.add(header);
// super.add(panel);
//
// final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
// final PermissionManager permissionManager = cdiUtil.findBean(
// PermissionManager.class);
// final List<String> privileges = permissionManager
// .listDefiniedPrivileges(ItemPrivileges.class);
// final List<Label> headerLabels = privileges.stream()
// .map(privilege -> generatePrivilegeColumnHeader(privilege))
// .collect(Collectors.toList());
// headerLabels.add(0,
// new Label(new GlobalizedMessage(
// "cms.ui.permissions.table.role_header",
// CmsConstants.CMS_BUNDLE)));
// headerLabels.add(new Label(new GlobalizedMessage(
// "cms.ui.permissions.table.remove_all.header",
// CmsConstants.CMS_BUNDLE)));
// final Table table = new Table(
// new PermissionsTableModelBuilder(),
// headerLabels.toArray());
// table.setClassAttr("dataTable");
// for (int j = 1; j < table.getColumnModel().size() - 1; j++) {
// table.getColumn(j).setKey(privileges.get(j - 1));
// table.getColumn(j).setCellRenderer(new TableCellRenderer() {
//
// @Override
// public Component getComponent(final Table table,
// final PageState state,
// final Object value,
// final boolean isSelected,
// final Object key,
// final int row,
// final int column) {
//
// final ControlLink link = new ControlLink("");
//
// final CMSPermissionsTableColumn col
// = (CMSPermissionsTableColumn) value;
// if (col.isPermitted()) {
// link.setClassAttr("checkBoxChecked");
// } else {
// link.setClassAttr("checkBoxUnchecked");
// }
//
// return link;
// }
//
// });
// }
// table.getColumn(table.getColumnModel().size() - 1).setCellRenderer(
// new TableCellRenderer() {
//
// @Override
// public Component getComponent(final Table table,
// final PageState state,
// final Object value,
// final boolean isSelected,
// final Object key,
// final int row,
// final int column) {
// final ControlLink link = new ControlLink(new Label(
// new GlobalizedMessage(
// "cms.ui.permissions.table.actions.remove_all",
// CmsConstants.CMS_BUNDLE)));
// link.setConfirmation(new GlobalizedMessage(
// "cms.ui.permissions.table.actions.remove_all.confirm",
// CmsConstants.CMS_BUNDLE));
//
// return link;
// }
//
// });
// table.addTableActionListener(new TableActionListener() {
//
// @Override
// public void cellSelected(final TableActionEvent event)
// throws FormProcessException {
//
// final PageState state = event.getPageState();
// final int columnIndex = event.getColumn();
// if (event.getRowKey() == null) {
// return;
// }
// final String roleName = (String) event.getRowKey();
//
// final Table table = (Table) event.getSource();
// final int columnCount = table.getColumnModel().size();
// final int lastColumnIndex = columnCount - 1;
//
// final CcmObject object = itemSelectionModel
// .getSelectedItem(state);
// final RoleRepository roleRepo = cdiUtil.findBean(
// RoleRepository.class);
// final Optional<Role> role = roleRepo.findByName(roleName);
// if (!role.isPresent()) {
// throw new UnexpectedErrorException(String.format(
// "Role \"%s\" was not found inthe database, but was in "
// + "the permissions table.",
// roleName));
// }
// final PermissionChecker permissionChecker = cdiUtil.findBean(
// PermissionChecker.class);
// if (columnIndex > 0 && columnIndex < lastColumnIndex) {
// final String privilege = table.getColumn(columnIndex)
// .getKey();
//
// if (permissionChecker.isPermitted(privilege,
// object,
// role.get())) {
// permissionManager.revokePrivilege(privilege,
// role.get(),
// object);
// } else {
// permissionManager.grantPrivilege(privilege,
// role.get(),
// object);
// }
// } else if (columnIndex == lastColumnIndex) {
// final List<String> privileges = permissionManager
// .listDefiniedPrivileges(ItemPrivileges.class);
// privileges.forEach(privilege -> permissionManager
// .revokePrivilege(privilege, role.get(), object));
// }
// }
//
// @Override
// public void headSelected(final TableActionEvent event) {
// //Nothing
// }
//
// });
//
// panel.add(table);
// }
private Label generatePrivilegeColumnHeader(final String privilege) {
return new Label(new GlobalizedMessage(
String.format("cms.ui.permissions.table.privilege.headers.%s",
privilege),
CmsConstants.CMS_BUNDLE));
}
private class PermissionsTableModelBuilder extends LockableImpl
implements TableModelBuilder {
@Override
public TableModel makeModel(final Table table, final PageState state) {
final CcmObject object = itemSelectionModel.getSelectedItem(state);
return new CMSPermissionsTableModel(object);
}
}
// private class PermissionsTableModel implements TableModel {
//
// private final Iterator<PermissionsTableRow> iterator;
// private PermissionsTableRow currentRow;
//
// public PermissionsTableModel(final CcmObject object) {
//
// }
//
// }
}

View File

@ -522,3 +522,8 @@ cms.ui.item.lifecycle.republish_and_reset=Republish and reset lifecycle
cms.ui.search.help=Enter some search terms
item_permissions_step.label=Permissions
item_permissions_step.description=Edit permissions for this content item
cms.ui.permissions.table.privilege.headers.create_new_assets=Create new assets
cms.ui.permissions.table.privilege.headers.delete_assets=Delete assets
cms.ui.permissions.table.privilege.headers.edit_asset=
cms.ui.permissions.table.privilege.headers.use_asset=Use assets
cms.ui.permissions.table.privilege.headers.view_asset=View assets

View File

@ -519,3 +519,8 @@ cms.ui.item.lifecycle.republish_and_reset=Erneut publizieren und Lebenszyklus zu
cms.ui.search.help=Enter some search terms
item_permissions_step.label=Berechtigungen
item_permissions_step.description=Berechtigungen f\u00fcr dieses Dokument bearbeiten
cms.ui.permissions.table.privilege.headers.create_new_assets=Neue Assets anlegen
cms.ui.permissions.table.privilege.headers.delete_assets=Assets l\u00f6schen
cms.ui.permissions.table.privilege.headers.edit_asset=Assets bearbeiten
cms.ui.permissions.table.privilege.headers.use_asset=Assets verwenden
cms.ui.permissions.table.privilege.headers.view_asset=Assets ansehen

View File

@ -481,3 +481,8 @@ cms.ui.item.lifecycle.republish_and_reset=Republish and reset lifecycle
cms.ui.search.help=Enter some search terms
item_permissions_step.label=Permissions
item_permissions_step.description=Edit permissions for this content item
cms.ui.permissions.table.privilege.headers.create_new_assets=Create new assets
cms.ui.permissions.table.privilege.headers.delete_assets=Delete assets
cms.ui.permissions.table.privilege.headers.edit_asset=Edit assets
cms.ui.permissions.table.privilege.headers.use_asset=Use assets
cms.ui.permissions.table.privilege.headers.view_asset=View assets