/**
* Copyright (C) 2012 BonitaSoft S.A.
* BonitaSoft, 32 rue Gustave Eiffel - 38000 Grenoble
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2.0 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.bonitasoft.console.client.common.metadata;
import static org.bonitasoft.web.toolkit.client.common.i18n.AbstractI18n._;
import java.util.Map;
import org.bonitasoft.console.client.data.item.attribute.reader.DeployedUserReader;
import org.bonitasoft.console.client.uib.SafeHtmlParser;
import org.bonitasoft.web.rest.model.bpm.cases.ArchivedCaseDefinition;
import org.bonitasoft.web.rest.model.bpm.cases.ArchivedCaseItem;
import org.bonitasoft.web.rest.model.bpm.cases.CaseDefinition;
import org.bonitasoft.web.rest.model.bpm.flownode.ArchivedHumanTaskItem;
import org.bonitasoft.web.rest.model.bpm.flownode.FlowNodeTypeAttributeReader;
import org.bonitasoft.web.rest.model.bpm.flownode.HumanTaskItem;
import org.bonitasoft.web.rest.model.bpm.flownode.IActivityItem;
import org.bonitasoft.web.rest.model.bpm.flownode.IFlowNodeItem;
import org.bonitasoft.web.rest.model.bpm.flownode.IHumanTaskItem;
import org.bonitasoft.web.rest.model.bpm.flownode.PriorityAttributeReader;
import org.bonitasoft.web.rest.model.bpm.process.ProcessItem;
import org.bonitasoft.web.rest.model.identity.UserItem;
import org.bonitasoft.web.toolkit.client.Session;
import org.bonitasoft.web.toolkit.client.common.json.JSonItemReader;
import org.bonitasoft.web.toolkit.client.data.api.callback.APICallback;
import org.bonitasoft.web.toolkit.client.data.api.request.APIGetRequest;
import org.bonitasoft.web.toolkit.client.data.api.request.APISearchRequest;
import org.bonitasoft.web.toolkit.client.data.item.attribute.reader.DateAttributeReader;
import org.bonitasoft.web.toolkit.client.data.item.attribute.reader.DeployedAttributeReader;
import org.bonitasoft.web.toolkit.client.data.item.attribute.reader.DeployedJsId;
import org.bonitasoft.web.toolkit.client.ui.component.Html;
import org.bonitasoft.web.toolkit.client.ui.page.ItemQuickDetailsPage.ItemDetailsMetadata;
import org.bonitasoft.web.toolkit.client.ui.utils.DateFormat.FORMAT;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.AnchorElement;
import com.google.gwt.safehtml.client.SafeHtmlTemplates;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.user.client.Element;
/**
* @author Vincent Elcrin
*/
public class MetadataTaskBuilder extends MetadataBuilder {
interface Templates extends SafeHtmlTemplates {
@SafeHtmlTemplates.Template(
"<a class='definition caseid' title='{0}'>" +
"<label>{1}: </label><span>{2}</span>" +
"</a>")
SafeHtml caseId(String title, String label, String id);
}
private static Templates TEMPLATES = GWT.create(Templates.class);
public void addAppsName() {
add(createMetaAppsName());
}
public void addAppsVersion() {
add(createMetaAppsVersion());
}
public void AddSubAppsName() {
add(createMetaSubAppsName());
}
public void AddSubAppsVersion() {
add(createMetaSubAppsVersion());
}
/**
* @param anchor
* @param task
* @deprecated
*/
@Deprecated
public void addCaseId(final IFlowNodeItem task, final String targetPageToken, final String targetArchivedPageToken) {
final AnchorElement anchor = AnchorElement.as(Element.as(SafeHtmlParser.parseFirst(TEMPLATES.caseId(
_("The id of the related case"),
_("Case"),
task.getCaseId().toString()))));
add(new ItemDetailsMetadata(ArchivedHumanTaskItem.ATTRIBUTE_CASE_ID, new Html(anchor)));
setCaseHref(anchor, task, targetPageToken, targetArchivedPageToken);
}
/**
* Is static to be accessible in HumanTaskMetadataView which is the same code but really shouldn't.
*
* @param anchor
* @param task
*/
public static void setCaseHref(final AnchorElement anchor, final IFlowNodeItem task, final String targetPageToken, final String targetArchivedPageToken) {
final APIGetRequest request = new APIGetRequest(CaseDefinition.get()).setId(task.getCaseId());
request.run(new APICallback() {
@Override
public void onSuccess(final int httpStatusCode, final String response, final Map<String, String> headers) {
anchor.setHref("#?id=" + task.getCaseId() + "&_p=" + targetPageToken + "&_pf=" + Session.getCurrentProfile());
}
@Override
protected void on404NotFound(final String message) {
getArchivedCaseId(task, new APICallback() {
@Override
public void onSuccess(final int httpStatusCode, final String response, final Map<String, String> headers) {
final ArchivedCaseItem archive = JSonItemReader.parseItem(response, ArchivedCaseDefinition.get());
anchor.setHref("#?id=" + archive.getId() + "&_p=" + targetArchivedPageToken + "&_pf=" + Session.getCurrentProfile());
}
});
}
});
}
public static void getArchivedCaseId(final IFlowNodeItem task, final APICallback callback) {
final APISearchRequest request = new APISearchRequest(ArchivedCaseDefinition.get());
request.addFilter(ArchivedCaseItem.ATTRIBUTE_SOURCE_OBJECT_ID, task.getCaseId().toString());
request.run(callback);
}
public void addPriority() {
add(createMetaPriority());
}
public void addAssignedTo() {
add(createMetaAssignTo());
}
public void addDoneOn(final FORMAT format) {
add(createMetaDoneOn(format));
}
public void addLastUpdateDate(final FORMAT format) {
add(createMetaLastUpdateDate(format));
}
public void addAssignedDate(final FORMAT format) {
add(createMetaAssignedDate(format));
}
public void addExecutedBy() {
add(createMetaExecutedBy());
}
public void addDueDate(final FORMAT format) {
add(createMetaDueDate(format));
}
public void addState() {
add(createMetaState());
}
public void addType() {
add(createMetaType());
}
private ItemDetailsMetadata createMetaType() {
return new ItemDetailsMetadata(new FlowNodeTypeAttributeReader(), _("Type"), _("The type of the task"));
}
private ItemDetailsMetadata createMetaState() {
return new ItemDetailsMetadata(IFlowNodeItem.ATTRIBUTE_STATE, _("State"), _("The state of the task"));
}
private ItemDetailsMetadata createMetaAppsName() {
return new ItemDetailsMetadata(
new DeployedAttributeReader(IFlowNodeItem.ATTRIBUTE_ROOT_CONTAINER_ID, ProcessItem.ATTRIBUTE_DISPLAY_NAME),
_("Process"),
_("The process responsible for the creation of this task"));
}
private ItemDetailsMetadata createMetaAppsVersion() {
return new ItemDetailsMetadata(
new DeployedAttributeReader(IFlowNodeItem.ATTRIBUTE_ROOT_CONTAINER_ID, ProcessItem.ATTRIBUTE_VERSION),
_("Process version"),
_("Version of the process"));
}
private ItemDetailsMetadata createMetaSubAppsName() {
return new ItemDetailsMetadata(
new DeployedAttributeReader(HumanTaskItem.ATTRIBUTE_PROCESS_ID, ProcessItem.ATTRIBUTE_DISPLAY_NAME),
_("Subprocess"),
_("The sub process responsible for the creation of this task"));
}
private ItemDetailsMetadata createMetaSubAppsVersion() {
return new ItemDetailsMetadata(
new DeployedAttributeReader(HumanTaskItem.ATTRIBUTE_PROCESS_ID, ProcessItem.ATTRIBUTE_VERSION),
_("Subprocess version"),
_("Version of the process"));
}
private ItemDetailsMetadata createMetaCaseId() {
return new ItemDetailsMetadata(IActivityItem.ATTRIBUTE_CASE_ID, _("Case"), _("The id of the related case"));
}
private ItemDetailsMetadata createMetaPriority() {
return new ItemDetailsMetadata(new PriorityAttributeReader(HumanTaskItem.ATTRIBUTE_PRIORITY), _("Priority"), _("The priority of the task"));
}
private ItemDetailsMetadata createMetaAssignTo() {
return new ItemDetailsMetadata(
new DeployedJsId(IHumanTaskItem.ATTRIBUTE_ASSIGNED_USER_ID, UserItem.ATTRIBUTE_FIRSTNAME, UserItem.ATTRIBUTE_LASTNAME),
new DeployedUserReader(IHumanTaskItem.ATTRIBUTE_ASSIGNED_USER_ID).setDefaultValue(_("Unassigned")),
_("Assigned to"),
_("The username to which the task is assigned."));
}
private ItemDetailsMetadata createMetaDoneOn(final FORMAT format) {
return new ItemDetailsMetadata(new DateAttributeReader(HumanTaskItem.ATTRIBUTE_LAST_UPDATE_DATE, format).setDefaultValue(_("No data")),
_("Done on"), "");
}
private ItemDetailsMetadata createMetaLastUpdateDate(final FORMAT format) {
return new ItemDetailsMetadata(new DateAttributeReader(HumanTaskItem.ATTRIBUTE_LAST_UPDATE_DATE, format).setDefaultValue(_("No data")),
_("Last update date"), _("The date of the last modification"));
}
private ItemDetailsMetadata createMetaAssignedDate(final FORMAT format) {
return new ItemDetailsMetadata(new DateAttributeReader(HumanTaskItem.ATTRIBUTE_ASSIGNED_DATE).setDefaultValue(_("No data")),
_("Assigned date"),
_("The date when the task was assigned"));
}
private ItemDetailsMetadata createMetaExecutedBy() {
return new ItemDetailsMetadata(new DeployedUserReader(IActivityItem.ATTRIBUTE_EXECUTED_BY_USER_ID),
_("Done by"),
_("Name of the user who executed this task"));
}
private ItemDetailsMetadata createMetaDueDate(final FORMAT format) {
return new ItemDetailsMetadata(
new DateAttributeReader(HumanTaskItem.ATTRIBUTE_DUE_DATE, format).setDefaultValue("No data"),
_("Due date"),
_("The date when the task must be finished"));
}
}