/*
* Copyright (c) 2010-2016 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.web.page.self.component;
import java.util.ArrayList;
import java.util.List;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.PasswordTextField;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.component.password.PasswordPanel;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.web.component.data.SelectableDataTable;
import com.evolveum.midpoint.web.component.data.TablePanel;
import com.evolveum.midpoint.web.component.data.column.CheckBoxColumn;
import com.evolveum.midpoint.web.component.data.column.IconColumn;
import com.evolveum.midpoint.web.component.data.column.ImagePanel;
import com.evolveum.midpoint.web.component.dialog.HelpInfoPanel;
import com.evolveum.midpoint.web.component.util.ListDataProvider;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.home.dto.MyPasswordsDto;
import com.evolveum.midpoint.web.page.admin.home.dto.PasswordAccountDto;
import com.evolveum.midpoint.xml.ns._public.common.common_3.CredentialsPropagationUserControlType;
import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType;
/**
* @author Kate Honchar
*/
public class ChangePasswordPanel extends BasePanel<MyPasswordsDto> {
private static final long serialVersionUID = 1L;
private static final String ID_PASSWORD_PANEL = "passwordPanel";
private static final String ID_OLD_PASSWORD_FIELD = "oldPassword";
private static final String ID_PASSWORD_LABEL = "passwordLabel";
private static final String ID_OLD_PASSWORD_LABEL = "oldPasswordLabel";
public static final String ID_ACCOUNTS_TABLE = "accounts";
public static final String ID_ACCOUNTS_CONTAINER = "accountsContainer";
private static final String ID_BUTTON_HELP = "help";
public static final String SELECTED_ACCOUNT_ICON_CSS = "fa fa-check-square-o";
public static final String DESELECTED_ACCOUNT_ICON_CSS = "fa fa-square-o";
public static final String PROPAGATED_ACCOUNT_ICON_CSS = "fa fa-sign-out";
private static final int HELP_MODAL_WIDTH = 400;
private static final int HELP_MODAL_HEIGH = 600;
private LoadableModel<MyPasswordsDto> model;
private boolean midpointAccountSelected = true;
public ChangePasswordPanel(String id, boolean oldPasswordVisible) {
super(id);
initLayout(oldPasswordVisible);
}
public ChangePasswordPanel(String id, boolean oldPasswordVisible, LoadableModel<MyPasswordsDto> model, MyPasswordsDto myPasswordsDto) {
super(id, model);
initLayout(oldPasswordVisible);
}
private void initLayout(final boolean oldPasswordVisible) {
model = (LoadableModel<MyPasswordsDto>) getModel();
Label oldPasswordLabel = new Label(ID_OLD_PASSWORD_LABEL, createStringResource("PageSelfCredentials.oldPasswordLabel"));
add(oldPasswordLabel);
oldPasswordLabel.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
return oldPasswordVisible;
}
});
Label passwordLabel = new Label(ID_PASSWORD_LABEL, createStringResource("PageSelfCredentials.passwordLabel1"));
add(passwordLabel);
PasswordTextField oldPasswordField =
new PasswordTextField(ID_OLD_PASSWORD_FIELD, new PropertyModel<String>(model, MyPasswordsDto.F_OLD_PASSWORD));
oldPasswordField.setRequired(false);
oldPasswordField.setResetPassword(false);
add(oldPasswordField);
oldPasswordField.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
public boolean isVisible() {
return oldPasswordVisible;
};
});
PasswordPanel passwordPanel = new PasswordPanel(ID_PASSWORD_PANEL, new PropertyModel<ProtectedStringType>(model, MyPasswordsDto.F_PASSWORD));
passwordPanel.getBaseFormComponent().add(new AttributeModifier("autofocus", ""));
add(passwordPanel);
WebMarkupContainer accountContainer = new WebMarkupContainer(ID_ACCOUNTS_CONTAINER);
List<IColumn<PasswordAccountDto, String>> columns = initColumns();
ListDataProvider<PasswordAccountDto> provider = new ListDataProvider<PasswordAccountDto>(this,
new PropertyModel<List<PasswordAccountDto>>(model, MyPasswordsDto.F_ACCOUNTS));
TablePanel accounts = new TablePanel(ID_ACCOUNTS_TABLE, provider, columns);
accounts.setItemsPerPage(30);
accounts.setShowPaging(false);
if (model.getObject().getPropagation() != null && model.getObject().getPropagation()
.equals(CredentialsPropagationUserControlType.MAPPING)){
accountContainer.setVisible(false);
}
accountContainer.add(accounts);
AjaxLink help = new AjaxLink(ID_BUTTON_HELP) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
showHelpPerformed(target);
}
};
accountContainer.add(help);
add(accountContainer);
}
private List<IColumn<PasswordAccountDto, String>> initColumns() {
List<IColumn<PasswordAccountDto, String>> columns = new ArrayList<IColumn<PasswordAccountDto, String>>();
IColumn column = new IconColumn<PasswordAccountDto>(new Model<String>()) {
private static final long serialVersionUID = 1L;
@Override
protected IModel<String> createIconModel(final IModel<PasswordAccountDto> rowModel) {
return new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
PasswordAccountDto item = rowModel.getObject();
if (item.getCssClass() == null || item.getCssClass().trim().equals("")) {
if (item.isMidpoint()) {
item.setCssClass(SELECTED_ACCOUNT_ICON_CSS);
} else if (item.isPasswordOutbound()) {
item.setCssClass(PROPAGATED_ACCOUNT_ICON_CSS);
} else {
item.setCssClass(DESELECTED_ACCOUNT_ICON_CSS);
}
}
return item.getCssClass();
}
};
}
@Override
public void populateItem(Item<ICellPopulator<PasswordAccountDto>> item, String componentId,
final IModel<PasswordAccountDto> rowModel) {
super.populateItem(item, componentId, rowModel);
final ImagePanel imagePanel = (ImagePanel) item.get(0);
final PasswordAccountDto passwordAccountDto = rowModel.getObject();
imagePanel.add(new AjaxEventBehavior("click") {
private static final long serialVersionUID = 1L;
protected void onEvent(final AjaxRequestTarget target) {
if (!passwordAccountDto.isMidpoint()) {
if (passwordAccountDto.getCssClass().equals(PROPAGATED_ACCOUNT_ICON_CSS)) {
passwordAccountDto.setCssClass(SELECTED_ACCOUNT_ICON_CSS);
} else if (passwordAccountDto.getCssClass().equals(SELECTED_ACCOUNT_ICON_CSS)
&& passwordAccountDto.isPasswordOutbound() &&
midpointAccountSelected) {
passwordAccountDto.setCssClass(PROPAGATED_ACCOUNT_ICON_CSS);
} else if (passwordAccountDto.getCssClass().equals(SELECTED_ACCOUNT_ICON_CSS)) {
passwordAccountDto.setCssClass(DESELECTED_ACCOUNT_ICON_CSS);
} else if (passwordAccountDto.getCssClass().equals(DESELECTED_ACCOUNT_ICON_CSS)) {
passwordAccountDto.setCssClass(SELECTED_ACCOUNT_ICON_CSS);
}
target.add(imagePanel);
} else {
midpointAccountSelected = !midpointAccountSelected;
if (passwordAccountDto.getCssClass().equals(SELECTED_ACCOUNT_ICON_CSS)) {
passwordAccountDto.setCssClass(DESELECTED_ACCOUNT_ICON_CSS);
updatePropagatedAccountIconsCssClass(DESELECTED_ACCOUNT_ICON_CSS);
target.add(imagePanel.findParent(SelectableDataTable.class));
} else if (passwordAccountDto.getCssClass().equals(DESELECTED_ACCOUNT_ICON_CSS)) {
passwordAccountDto.setCssClass(SELECTED_ACCOUNT_ICON_CSS);
updatePropagatedAccountIconsCssClass(PROPAGATED_ACCOUNT_ICON_CSS);
target.add(imagePanel.findParent(SelectableDataTable.class));
}
}
}
}
);
}
};
columns.add(column);
columns.add(new AbstractColumn<PasswordAccountDto, String>(createStringResource("ChangePasswordPanel.name")) {
private static final long serialVersionUID = 1L;
@Override
public void populateItem(Item<ICellPopulator<PasswordAccountDto>> item, String componentId,
final IModel<PasswordAccountDto> rowModel) {
item.add(new Label(componentId, new AbstractReadOnlyModel<Object>() {
private static final long serialVersionUID = 1L;
@Override
public Object getObject() {
PasswordAccountDto dto = rowModel.getObject();
return dto.getDisplayName();
}
}));
}
});
column = new PropertyColumn(createStringResource("ChangePasswordPanel.resourceName"),
PasswordAccountDto.F_RESOURCE_NAME);
columns.add(column);
CheckBoxColumn enabled = new CheckBoxColumn(createStringResource("ChangePasswordPanel.enabled"),
PasswordAccountDto.F_ENABLED);
enabled.setEnabled(false);
columns.add(enabled);
return columns;
}
private void updatePropagatedAccountIconsCssClass(String cssClassName) {
MyPasswordsDto dto = model.getObject();
for (PasswordAccountDto passwordAccountDto : dto.getAccounts()) {
if (passwordAccountDto.isPasswordOutbound()) {
passwordAccountDto.setCssClass(cssClassName);
}
}
}
private void showHelpPerformed(AjaxRequestTarget target){
getPageBase().showMainPopup(new HelpInfoPanel(getPageBase().getMainPopupBodyId(), "ChangePasswordPanel.helpInfo") {
@Override
protected void closePerformed(AjaxRequestTarget target) {
getPageBase().hideMainPopup(target);
}
}, target);
}
}