/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.geofence.gui.client.widget.rule.detail; import org.geoserver.geofence.gui.client.GeofenceEvents; import org.geoserver.geofence.gui.client.i18n.I18nProvider; import org.geoserver.geofence.gui.client.model.BeanKeyValue; import org.geoserver.geofence.gui.client.model.GSUserModel; import org.geoserver.geofence.gui.client.model.UserGroupModel; import org.geoserver.geofence.gui.client.service.GsUsersManagerRemoteServiceAsync; import org.geoserver.geofence.gui.client.service.ProfilesManagerRemoteServiceAsync; import org.geoserver.geofence.gui.client.widget.GeofenceGridWidget; import java.util.ArrayList; import java.util.List; import com.extjs.gxt.ui.client.Style.SortDir; import com.extjs.gxt.ui.client.data.BaseListLoader; import com.extjs.gxt.ui.client.data.BasePagingLoadResult; import com.extjs.gxt.ui.client.data.ListLoadResult; import com.extjs.gxt.ui.client.data.LoadEvent; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.data.PagingLoadResult; import com.extjs.gxt.ui.client.data.RpcProxy; import com.extjs.gxt.ui.client.event.Events; import com.extjs.gxt.ui.client.event.FieldEvent; import com.extjs.gxt.ui.client.event.GridEvent; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.event.LoadListener; import com.extjs.gxt.ui.client.mvc.Dispatcher; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.widget.BoxComponent; import com.extjs.gxt.ui.client.widget.form.CheckBox; import com.extjs.gxt.ui.client.widget.form.LabelField; import com.extjs.gxt.ui.client.widget.grid.ColumnConfig; import com.extjs.gxt.ui.client.widget.grid.ColumnData; import com.extjs.gxt.ui.client.widget.grid.ColumnModel; import com.extjs.gxt.ui.client.widget.grid.Grid; import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer; import com.google.gwt.user.client.rpc.AsyncCallback; // TODO: Auto-generated Javadoc /** * The Class ProfilesGridWidget. */ public class ProfilesGridWidget extends GeofenceGridWidget<UserGroupModel> { /** The users service */ private final GsUsersManagerRemoteServiceAsync usersService; /** The profiles service. */ private final ProfilesManagerRemoteServiceAsync profilesService; /** The user details widget. */ private UserDetailsWidget userDetailsWidget; /** The proxy. */ private RpcProxy<PagingLoadResult<UserGroupModel>> proxy; /** The loader. */ private BaseListLoader<ListLoadResult<ModelData>> loader; private GSUserModel user; /** * Instantiates a new rule details grid widget. * @param model * * @param model * the model * @param usersService * @param workspacesService * the workspaces service * @param ruleDetailsWidget * the rule details widget */ public ProfilesGridWidget(GSUserModel model, GsUsersManagerRemoteServiceAsync usersService, ProfilesManagerRemoteServiceAsync profilesService, UserDetailsWidget userDetailsWidget) { super(); this.user = model; this.usersService = usersService; this.profilesService = profilesService; this.userDetailsWidget = userDetailsWidget; } /* * (non-Javadoc) * @see org.geoserver.geofence.gui.client.widget.GEOFENCEGridWidget#setGridProperties () */ @Override public void setGridProperties() { grid.setLoadMask(true); grid.setAutoWidth(true); //grid.setHeight(300); grid.setAutoHeight(true); grid.setAutoWidth(true); } /** * Clear grid elements. */ public void clearGridElements() { this.store.removeAll(); } /* * (non-Javadoc) * * @see org.geoserver.geofence.gui.client.widget.GEOFENCEGridWidget#createStore() */ @Override public void createStore() { // ///////////////////////////// // Loader for rulesService // ///////////////////////////// this.proxy = new RpcProxy<PagingLoadResult<UserGroupModel>>() { @Override protected void load(Object loadConfig, AsyncCallback<PagingLoadResult<UserGroupModel>> callback) { profilesService.getProfiles(-1,-1,false, callback); } }; loader = new BaseListLoader<ListLoadResult<ModelData>>(proxy); loader.setRemoteSort(false); store = new ListStore<UserGroupModel>(loader); store.sort(BeanKeyValue.STYLES_COMBO.getValue(), SortDir.ASC); setUpLoadListener(); } /** * Sets the up load listener. */ private void setUpLoadListener() { loader.addLoadListener(new LoadListener() { @Override public void loaderLoad(LoadEvent le) { // TODO: change messages here!! BasePagingLoadResult<?> result = le.getData(); if (!result.getData().isEmpty()) { int size = result.getData().size(); String message = ""; if (size == 1) { message = I18nProvider.getMessages().recordLabel(); } else { message = I18nProvider.getMessages().recordPluralLabel(); } Dispatcher.forwardEvent(GeofenceEvents.SEND_INFO_MESSAGE, new String[] { I18nProvider.getMessages().remoteServiceName(), I18nProvider.getMessages().foundLabel() + " " + result.getData().size() + " " + message }); } else { Dispatcher.forwardEvent(GeofenceEvents.SEND_INFO_MESSAGE, new String[] { I18nProvider.getMessages().remoteServiceName(), I18nProvider.getMessages().recordNotFoundMessage() }); } } }); } /* (non-Javadoc) * @see org.geoserver.geofence.gui.client.widget.GeofenceGridWidget#prepareColumnModel() */ @Override public ColumnModel prepareColumnModel() { List<ColumnConfig> configs = new ArrayList<ColumnConfig>(); ColumnConfig attributeProfileColumn = new ColumnConfig(); attributeProfileColumn.setId(BeanKeyValue.STYLES_COMBO.getValue()); attributeProfileColumn.setHeader("Role"); attributeProfileColumn.setWidth(180); attributeProfileColumn.setRenderer(this.createProfileTextBox()); attributeProfileColumn.setMenuDisabled(true); attributeProfileColumn.setSortable(false); configs.add(attributeProfileColumn); ColumnConfig attributeEnableColumn = new ColumnConfig(); attributeEnableColumn.setId(BeanKeyValue.STYLE_ENABLED.getValue()); attributeEnableColumn.setHeader("Enable"); attributeEnableColumn.setWidth(80); attributeEnableColumn.setRenderer(this.createEnableCheckBox()); attributeEnableColumn.setMenuDisabled(true); attributeEnableColumn.setSortable(false); configs.add(attributeEnableColumn); return new ColumnModel(configs); } /** * Creates the style text box. * * @return the grid cell renderer */ private GridCellRenderer<UserGroupModel> createProfileTextBox() { GridCellRenderer<UserGroupModel> textRendered = new GridCellRenderer<UserGroupModel>() { private boolean init; public Object render(final UserGroupModel model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<UserGroupModel> store, Grid<UserGroupModel> grid) { if (!init) { init = true; grid.addListener(Events.ColumnResize, new Listener<GridEvent<UserGroupModel>>() { public void handleEvent(GridEvent<UserGroupModel> be) { for (int i = 0; i < be.getGrid().getStore().getCount(); i++) { if ((be.getGrid().getView().getWidget(i, be.getColIndex()) != null) && (be.getGrid().getView().getWidget(i, be.getColIndex()) instanceof BoxComponent)) { ((BoxComponent) be.getGrid().getView().getWidget(i, be.getColIndex())).setWidth(be.getWidth() - 10); } } } }); } LabelField profileName = new LabelField(); profileName.setWidth(150); profileName.setReadOnly(true); profileName.setValue(model.getName()); return profileName; } }; return textRendered; } /** * Creates the enable check box. * * @return the grid cell renderer */ private GridCellRenderer<UserGroupModel> createEnableCheckBox() { GridCellRenderer<UserGroupModel> textRendered = new GridCellRenderer<UserGroupModel>() { private boolean init; public Object render(final UserGroupModel model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<UserGroupModel> store, Grid<UserGroupModel> grid) { if (!init) { init = true; grid.addListener(Events.ColumnResize, new Listener<GridEvent<UserGroupModel>>() { public void handleEvent(GridEvent<UserGroupModel> be) { for (int i = 0; i < be.getGrid().getStore().getCount(); i++) { if ((be.getGrid().getView().getWidget(i, be.getColIndex()) != null) && (be.getGrid().getView().getWidget(i, be.getColIndex()) instanceof BoxComponent)) { ((BoxComponent) be.getGrid().getView().getWidget(i, be.getColIndex())).setWidth(be.getWidth() - 10); } } } }); } CheckBox available = new CheckBox(); model.setEnabled(false); for( UserGroupModel group : user.getUserGroups()) { if (group.getName().equals(model.getName())) { available.setValue(true); model.setEnabled(true); break; } } available.addListener(Events.Change, new Listener<FieldEvent>() { public void handleEvent(FieldEvent be) { Boolean enable = (Boolean) be.getField().getValue(); if (enable.booleanValue()) { Dispatcher.forwardEvent(GeofenceEvents.SEND_INFO_MESSAGE, new String[] { "User Roles", "Role " + model.getName() + ": enabled" }); model.setEnabled(enable); /*logger.error("TODO: profile refactoring!!!");*/ userDetailsWidget.enableSaveButton(); } else { Dispatcher.forwardEvent(GeofenceEvents.SEND_INFO_MESSAGE, new String[] { "User Roles", "Role " + model.getName() + ": disabled" }); model.setEnabled(enable); /*logger.error("TODO: profile refactoring!!!");*/ userDetailsWidget.enableSaveButton(); } } }); return available; } }; return textRendered; } /** * Gets the loader. * * @return the loader */ public BaseListLoader<ListLoadResult<ModelData>> getLoader() { return loader; } }