/* (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; import org.geoserver.geofence.gui.client.widget.GeofenceGridWidget; import org.geoserver.geofence.gui.client.widget.SearchFilterField; import java.util.ArrayList; import java.util.List; import com.extjs.gxt.ui.client.data.BasePagingLoadResult; import com.extjs.gxt.ui.client.data.BasePagingLoader; import com.extjs.gxt.ui.client.data.LoadEvent; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.data.PagingLoadConfig; import com.extjs.gxt.ui.client.data.PagingLoadResult; import com.extjs.gxt.ui.client.data.PagingLoader; import com.extjs.gxt.ui.client.data.RpcProxy; import com.extjs.gxt.ui.client.event.ButtonEvent; 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.event.MessageBoxEvent; import com.extjs.gxt.ui.client.mvc.Dispatcher; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.store.Store; import com.extjs.gxt.ui.client.widget.BoxComponent; import com.extjs.gxt.ui.client.widget.MessageBox; import com.extjs.gxt.ui.client.widget.button.Button; import com.extjs.gxt.ui.client.widget.form.CheckBox; import com.extjs.gxt.ui.client.widget.form.TextField; 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.extjs.gxt.ui.client.widget.toolbar.PagingToolBar; import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem; import com.google.gwt.user.client.rpc.AsyncCallback; import org.geoserver.geofence.gui.client.Constants; import org.geoserver.geofence.gui.client.GeofenceEvents; import org.geoserver.geofence.gui.client.Resources; import org.geoserver.geofence.gui.client.i18n.I18nProvider; import org.geoserver.geofence.gui.client.model.BeanKeyValue; import org.geoserver.geofence.gui.client.model.UserGroupModel; import org.geoserver.geofence.gui.client.service.ProfilesManagerRemoteServiceAsync; // TODO: Auto-generated Javadoc /** * The Class ProfileGridWidget. */ public class ProfileGridWidget extends GeofenceGridWidget<UserGroupModel> { /** The service. */ private ProfilesManagerRemoteServiceAsync service; /** The proxy. */ private RpcProxy<PagingLoadResult<UserGroupModel>> proxy; /** The loader. */ private PagingLoader<PagingLoadResult<ModelData>> loader; /** The tool bar. */ private PagingToolBar toolBar; /** * Instantiates a new profile grid widget. * * @param service * the service */ public ProfileGridWidget(ProfilesManagerRemoteServiceAsync service) { super(); this.service = service; } /** * Instantiates a new profile grid widget. * * @param models * the models */ public ProfileGridWidget(List<UserGroupModel> models) { super(models); } /* * (non-Javadoc) * * @see org.geoserver.geofence.gui.client.widget.GEOFENCEGridWidget# * setGridProperties () */ @Override public void setGridProperties() { grid.setHeight(Constants.SOUTH_PANEL_DIMENSION - 25); } /* * (non-Javadoc) * * @see org.geoserver.geofence.gui.client.widget.GEOFENCEGridWidget# * prepareColumnModel() */ @Override public ColumnModel prepareColumnModel() { List<ColumnConfig> configs = new ArrayList<ColumnConfig>(); ColumnConfig profileNameColumn = new ColumnConfig(); profileNameColumn.setId(BeanKeyValue.NAME.getValue()); profileNameColumn.setHeader("Role Name"); profileNameColumn.setWidth(160); profileNameColumn.setRenderer(this.createProfileNameTextBox()); configs.add(profileNameColumn); ColumnConfig dateCreationColumn = new ColumnConfig(); dateCreationColumn.setId(BeanKeyValue.DATE_CREATION.getValue()); dateCreationColumn.setHeader("Date Creation"); dateCreationColumn.setWidth(180); configs.add(dateCreationColumn); ColumnConfig profileEnabledColumn = new ColumnConfig(); profileEnabledColumn.setId(BeanKeyValue.PROFILE_ENABLED.getValue()); profileEnabledColumn.setHeader("Enabled"); profileEnabledColumn.setWidth(80); profileEnabledColumn.setRenderer(this.createEnableCheckBox()); profileEnabledColumn.setMenuDisabled(true); profileEnabledColumn.setSortable(false); configs.add(profileEnabledColumn); // ColumnConfig detailsActionColumn = new ColumnConfig(); // detailsActionColumn.setId("detailsProfile"); // detailsActionColumn.setWidth(80); // detailsActionColumn.setRenderer(this.createProfileDetailsButton()); // detailsActionColumn.setMenuDisabled(true); // detailsActionColumn.setSortable(false); // configs.add(detailsActionColumn); ColumnConfig removeActionColumn = new ColumnConfig(); removeActionColumn.setId("removeProfile"); removeActionColumn.setWidth(80); removeActionColumn.setRenderer(this.createProfileDeleteButton()); removeActionColumn.setMenuDisabled(true); removeActionColumn.setSortable(false); configs.add(removeActionColumn); return new ColumnModel(configs); } /* * (non-Javadoc) * * @see * org.geoserver.geofence.gui.client.widget.GEOFENCEGridWidget#createStore * () */ @Override public void createStore() { this.toolBar = new PagingToolBar( org.geoserver.geofence.gui.client.Constants.DEFAULT_PAGESIZE); // Loader fro service this.proxy = new RpcProxy<PagingLoadResult<UserGroupModel>>() { @Override protected void load(Object loadConfig, AsyncCallback<PagingLoadResult<UserGroupModel>> callback) { service.getProfiles( ((PagingLoadConfig) loadConfig).getOffset(), ((PagingLoadConfig) loadConfig).getLimit(), false, callback); } }; loader = new BasePagingLoader<PagingLoadResult<ModelData>>(proxy); loader.setRemoteSort(false); store = new ListStore<UserGroupModel>(loader); // store.sort(BeanKeyValue.NAME.getValue(), SortDir.ASC); // Search tool SearchFilterField<UserGroupModel> filter = new SearchFilterField<UserGroupModel>() { @Override protected boolean doSelect(Store<UserGroupModel> store, UserGroupModel parent, UserGroupModel record, String property, String filter) { String name = parent.get(BeanKeyValue.NAME.getValue()); name = name.toLowerCase(); if (name.indexOf(filter.toLowerCase()) != -1) { return true; } return false; } }; filter.setWidth(130); filter.setIcon(Resources.ICONS.search()); // Bind the filter field to your grid store (grid.getStore()) filter.bind(store); // Add Profile button // TODO: generalize this! Button addProfileButton = new Button("Add Role"); addProfileButton.setIcon(Resources.ICONS.add()); // TODO: temporally disabled! addProfileButton.setEnabled(false); addProfileButton.addListener(Events.OnClick, new Listener<ButtonEvent>() { public void handleEvent(ButtonEvent be) { Dispatcher.forwardEvent( GeofenceEvents.SEND_INFO_MESSAGE, new String[] { "GeoServer Group", "Add Group" }); Dispatcher .forwardEvent(GeofenceEvents.CREATE_NEW_PROFILE); } }); this.toolBar.bind(loader); this.toolBar.add(new SeparatorToolItem()); this.toolBar.add(addProfileButton); this.toolBar.add(new SeparatorToolItem()); this.toolBar.add(filter); this.toolBar.add(new SeparatorToolItem()); setUpLoadListener(); } /** * Gets the loader. * * @return the loader */ public PagingLoader<PagingLoadResult<ModelData>> getLoader() { return loader; } /** * Gets the tool bar. * * @return the tool bar */ public PagingToolBar getToolBar() { return toolBar; } /** * Clear grid elements. */ public void clearGridElements() { this.store.removeAll(); this.toolBar.clear(); this.toolBar.disable(); } /** * Sets the up load listener. */ private void setUpLoadListener() { loader.addLoadListener(new LoadListener() { @Override public void loaderBeforeLoad(LoadEvent le) { if (!toolBar.isEnabled()) { toolBar.enable(); } } @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() }); } } }); } /** * Creates the profile name text box. * * @return the grid cell renderer */ private GridCellRenderer<UserGroupModel> createProfileNameTextBox() { GridCellRenderer<UserGroupModel> buttonRendered = 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); } } } }); } TextField<String> profileNameTextBox = new TextField<String>(); profileNameTextBox.setWidth(150); // TODO: add correct tooltip text here! // profileNameTextBox("Test"); profileNameTextBox.setValue(model.getName()); profileNameTextBox.addListener(Events.Change, new Listener<FieldEvent>() { public void handleEvent(FieldEvent be) { Dispatcher.forwardEvent( GeofenceEvents.SEND_INFO_MESSAGE, new String[] { "GeoServer role", "Role name changed to -> " + be.getField() .getValue() }); model.setName((String) be.getField().getValue()); Dispatcher.forwardEvent( GeofenceEvents.UPDATE_PROFILE, model); } }); return profileNameTextBox; } }; return buttonRendered; } /** * Creates the enable check box. * * @return the grid cell renderer */ private GridCellRenderer<UserGroupModel> createEnableCheckBox() { GridCellRenderer<UserGroupModel> buttonRendered = 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 profileEnabledButton = new CheckBox(); // TODO: add correct tooltip text here! // profileEnabledButton.setToolTip("Test"); profileEnabledButton.setValue(model.isEnabled()); profileEnabledButton.addListener(Events.OnClick, new Listener<FieldEvent>() { public void handleEvent(FieldEvent be) { Dispatcher.forwardEvent( GeofenceEvents.SEND_INFO_MESSAGE, new String[] { "GeoServer Group", "Enable check!" }); model.setEnabled((Boolean) be.getField() .getValue()); Dispatcher.forwardEvent( GeofenceEvents.UPDATE_PROFILE, model); } }); return profileEnabledButton; } }; return buttonRendered; } /** * Creates the profile delete button. * * @return the grid cell renderer */ private GridCellRenderer<UserGroupModel> createProfileDeleteButton() { GridCellRenderer<UserGroupModel> buttonRendered = 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); } } } }); } // TODO: generalize this! Button removeProfileButton = new Button("Remove"); removeProfileButton.setIcon(Resources.ICONS.delete()); removeProfileButton.addListener(Events.OnClick, new Listener<ButtonEvent>() { public void handleEvent(ButtonEvent be) { final Listener<MessageBoxEvent> l = new Listener<MessageBoxEvent>() { public void handleEvent(MessageBoxEvent ce) { Button btn = ce.getButtonClicked(); if (btn.getText().equalsIgnoreCase( "Yes")) { Dispatcher .forwardEvent( GeofenceEvents.DELETE_PROFILE, model); Dispatcher .forwardEvent( GeofenceEvents.SEND_INFO_MESSAGE, new String[] { "GeoServer Group", "Remove Group: " + model.getName() }); } } }; MessageBox .confirm( "Confirm", "The Role will be deleted. Are you sure you want to do that?", l); } }); return removeProfileButton; } }; return buttonRendered; } /** * Creates the profile details button. * * @return the grid cell renderer */ private GridCellRenderer<UserGroupModel> createProfileDetailsButton() { GridCellRenderer<UserGroupModel> buttonRendered = 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); } } } }); } Button detailsProfileButton = new Button("Details"); detailsProfileButton.setIcon(Resources.ICONS.table()); detailsProfileButton.addListener(Events.OnClick, new Listener<ButtonEvent>() { public void handleEvent(ButtonEvent be) { Dispatcher.forwardEvent( GeofenceEvents.SEND_INFO_MESSAGE, new String[] { "GeoServer Group", "Group Details: " + model.getName() }); Dispatcher.forwardEvent( GeofenceEvents.EDIT_PROFILE_DETAILS, model); } }); return detailsProfileButton; } }; return buttonRendered; } }