<!--

    Copyright (c) 2013, 2018 Oracle and/or its affiliates. All rights reserved.

    This program and the accompanying materials are made available under the
    terms of the Eclipse Public License v. 2.0, which is available at
    http://www.eclipse.org/legal/epl-2.0.

    This Source Code may also be made available under the following Secondary
    Licenses when the conditions for such availability set forth in the
    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
    version 2 with the GNU Classpath Exception, which is available at
    https://www.gnu.org/software/classpath/license.html.

    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0

-->

<!initPage
    setResourceBundle(key="i18nc" bundle="org.glassfish.common.admingui.Strings");
    setResourceBundle(key="i18nf" bundle="org.glassfish.full.admingui.Strings");
	setResourceBundle(key="help_full" bundle="org.glassfish.full.admingui.Helplinks");
/>
<!composition template="/templates/default.layout"  guiTitle="$resource{i18nf.batch.executionDetailTitle}"  >

<!define name="content">
    <event>
    <!beforeCreate

#include "/full/batch/batchRequestParam.inc"
        getRequestValue(key="executionId" value="#{pageSession.executionId}");
        setSessionAttribute(key="batchExecutionTabs" value="jobParameters");
        createMap(result="#{requestScope.attrsMap}");
        mapPut(map="#{requestScope.attrsMap}"  key="long" value="true");
        mapPut(map="#{requestScope.attrsMap}"  key="executionId" value="#{pageSession.executionId}");
        mapPut(map="#{requestScope.attrsMap}"  key="target" value="#{pageSession.encodedTarget}");
        gf.restRequest(endpoint="#{sessionScope.REST_URL}/list-batch-job-executions" attrs="#{requestScope.attrsMap}" method="GET" result="#{requestScope.resp}");
        setPageSessionAttribute(key="valueMap", value="#{requestScope.resp.data.extraProperties.listBatchJobExecutions[0]}");
        gf.convertMapToListOfMap(map="#{pageSession.valueMap.jobParameters}"  keyName="key" valueName="value" result="#{requestScope.listOfRows}");
        setPageSessionAttribute(key="tableTitle" value="$resource{i18nf.batch.jobParametersTableTitle}");
    />
    </event>
<sun:form id="propertyForm">
#include "/full/batch/batchExecutionTabs.inc"
#include "/common/shared/alertMsg_1.inc"

    <sun:title id="propertyContentPage" title="$resource{i18nf.batch.executionDetailTitle}" helpText="$resource{i18nf.batch.executionDetailTitleHelp}" >
    <!facet pageButtonsTop>
        <sun:panelGroup id="topButtons">
            <sun:button id="backButton" immediate="#{true}" primary="#{false}"  text="$resource{i18n.button.Back}" >
                <!command
                    gf.redirect(page="#{pageSession.listJobsLink}");
                />
            </sun:button>
        </sun:panelGroup>
    </facet>
    </sun:title>
#include "/common/shared/nameSection.inc"
        <sun:propertySheetSection >
            <sun:property id="jobName"   labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18nf.batch.jobName}">
                <sun:staticText id="jobName" value="#{pageSession.valueMap.jobName}" />
            </sun:property>

            <sun:property id="executionId"   labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18nf.batch.executionId}">
                <sun:staticText id="executionId" text="#{pageSession.valueMap.executionId}" />
            </sun:property>

            <sun:property id="stepCount"   labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18nf.batch.stepCount}">
                <sun:staticText id="stepCount" text="#{pageSession.valueMap.stepCount}" />
            </sun:property>
             <sun:property id="batchStatus"   labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18nf.batch.batchStatus}">
                 <sun:staticText id="batchStatus" text="#{pageSession.valueMap.batchStatus}" />
             </sun:property>
             <sun:property id="exitStatus"   labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18nf.batch.exitStatus}">
                  <sun:staticText id="exitStatus" text="#{pageSession.valueMap.exitStatus}" />
             </sun:property>
             <sun:property id="startTime"   labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18nf.batch.startTime}">
                 <sun:staticText id="startTime" text="#{requestScope.startTime}" >
                     <event>
                     <!beforeEncode
                         gf.convertDateTime(dateTime="#{pageSession.valueMap.startTime}"  result="#{requestScope.startTime}");
                     />
                     </event>
                 </sun:staticText>
             </sun:property>
             <sun:property id="endTime"   labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18nf.batch.endTime}">
                  <sun:staticText id="endTime" text="#{requestScope.endTime}" >
                      <event>
                      <!beforeEncode
                          gf.convertDateTime(dateTime="#{pageSession.valueMap.endTime}"  result="#{requestScope.endTime}");
                      />
                      </event>
                  </sun:staticText>
             </sun:property>
        </sun:propertySheetSection>
    "<br>
    <sun:table id="configs" title="#{tableTitle}"
        deselectMultipleButton="$boolean{false}"
        selectMultipleButton="$boolean{false}" >
        <!afterCreate
            getClientId(component="$this{component}" clientId=>$page{tableId});
        />
        <sun:tableRowGroup id="rowGroup1"  data={"$attribute{listOfRows}"} sourceVar="td">
             <!afterCreate
                 getClientId(component="$this{component}" clientId=>$page{tableRowGroupId});
            />
            <sun:tableColumn headerText="$resource{i18nf.batch.keyCol}"  sort="key"  rowHeader="$boolean{true}" id="key">
                <staticText id="key" value="#{td.value.key}" />
            </sun:tableColumn>
            <sun:tableColumn headerText="$resource{i18nf.batch.valueCol}"  sort="value"  rowHeader="$boolean{false}" id="value">
                    <staticText id="value" value="#{td.value.value}" />
            </sun:tableColumn>
        </sun:tableRowGroup>
    </sun:table>
    <sun:hidden id="helpKey" value="$resource{help_full.batchJobExecution}" />
</sun:form>
</define>
</composition>
