<!--

    Copyright (c) 2010, 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="i18n" bundle="org.glassfish.admingui.core.Strings")
    setResourceBundle(key="i18nc" bundle="org.glassfish.common.admingui.Strings")
    setResourceBundle(key="help_common" bundle="org.glassfish.common.admingui.Helplinks");

/>
<!composition template="/templates/default.layout"  guiTitle="$resource{i18nc.configurations.SystemPropertiesTitle} - #{pageSession.configName}" >
<!define name="content">
    <event>
        <!beforeCreate
            getRequestValue(key="configName" value="#{pageSession.configName}");

            setPageSessionAttribute(key="parentPage", value="#{request.contextPath}/common/configuration/configuration.jsf?configName=#{pageSession.configName}");
            setPageSessionAttribute(key="selfPage", value="#{request.contextPath}/common/configuration/configurationSystemProperties.jsf?configName=#{pageSession.configName}");
            setPageSessionAttribute(key="parentUrl", value="#{sessionScope.REST_URL}/configs/config/#{pageSession.configName}");
            setPageSessionAttribute(key="selfUrl", value="#{pageSession.parentUrl}/system-properties");

            setPageSessionAttribute(key="rest-api" value="true");
            setPageSessionAttribute(key="edit" value="#{true}" );
            setPageSessionAttribute(key="hasPropertyTable" value="#{true}" );
            setPageSessionAttribute(key="showDefaultButton" value="#{false}" );

            if ("(server-config=$pageSession{configName})") {
                setPageSessionAttribute(key="isServerConfig" value="$boolean{true}");
            }

            // Get config attributes
            gf.restRequest(endpoint="#{pageSession.parentUrl}", method="get", result="#{requestScope.result}");
            setPageSessionAttribute(key="dynaReconfig", value="#{requestScope.result.data.extraProperties.entity.dynamicReconfigurationEnabled}");

            // get config sys props
            gf.restRequest(endpoint="#{pageSession.selfUrl}", method="GET", result="#{requestScope.propTable}");
            setPageSessionAttribute(key="tableList", value="#{requestScope.propTable.data.extraProperties.systemProperties}");

            // find clusters/instances using this config
            createList(result="#{pageSession.configUsageList}" size="0");
            //if (!"$pageSession{isServerConfig}") {
                gf.restRequest(endpoint="#{sessionScope.REST_URL}/servers/server", method="get", result="#{requestScope.result}");
                gf.getMapKeys(Map="#{requestScope.result.data.extraProperties.childResources}", Keys="#{requestScope.instances}");
                foreach (var="instance", list="#{requestScope.instances}") {
                    gf.restRequest(endpoint="#{sessionScope.REST_URL}/servers/server/#{instance}", method="get", result="#{requestScope.instanceResults}");
                    if ("#{requestScope.instanceResults.data.extraProperties.entity.configRef}=#{pageSession.configName}") {
                        listAdd(list="#{pageSession.configUsageList}", value="#{instance}");
                    }
                }
            //}
			gf.isConfigName(configName="#{pageSession.configName}" );
        />
    </event>
    <sun:form id="propertyForm">
        <sun:title id="propertyContentPage" title="$resource{i18n.systemProps.systemProps}" >
            <!facet pageButtonsTop>
                <sun:panelGroup id="topButtons">
#include "configSystemPropertiesButtons.jsf"
                </sun:panelGroup>
            </facet>
        </sun:title>
#include "/common/shared/alertMsg.inc"
        <sun:propertySheet id="propertySheet1" >
#include "/common/shared/configNameSection.inc"
            <sun:propertySheetSection id="reconfigSheet">
                <sun:property id="dynaReconfigProp" labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n.systemProps.dynamicReconfigLabel}" >
                    <sun:checkbox id="dynaReconfig" value="#{pageSession.dynaReconfig}" selectedValue="true"/>
                </sun:property>
            </sun:propertySheetSection>
        </sun:propertySheet>

        <sun:table id="basicTable"  style="padding: 10pt" title="$resource{i18n.common.AdditionalProperties}"
                    deselectMultipleButton="$boolean{true}"
                    deselectMultipleButtonOnClick="setTimeout('admingui.table.changeOneTableButton(\\\\\'#{pageSession.topActionGroup}\\\\\', \\\\\'#{pageSession.tableId}\\\\\');', 0)"
                    selectMultipleButton="$boolean{true}"
                    selectMultipleButtonOnClick="setTimeout('admingui.table.changeOneTableButton(\\\\\'#{pageSession.topActionGroup}\\\\\', \\\\\'#{pageSession.tableId}\\\\\');', 0)" >
                    <!afterCreate
                        getClientId(component="$this{component}" clientId=>$page{tableId});
                    />
            <!facet actionsTop>
                <sun:panelGroup id="topActionsGroup1">
                    <!afterCreate
                        getClientId(component="$this{component}" clientId=>$page{topActionGroup});
                    />
                    <sun:button id="addSharedTableButton" disabled="#{false}" text="$resource{i18n.button.AddProperty}" >
                        <!command
                            getUIComponent(clientId="$pageSession{propertyTableRowGroupId}", component=>$attribute{tableRowGroup});
                            addRowToTable(TableRowGroup="$attribute{tableRowGroup}", NameList={"name", "value", "description"});
                        />
                    </sun:button>
                    <sun:button id="button1" text="$resource{i18n.button.DeleteProperties}" disabled="#{true}" primary="#{false}">
                        <!command
                            getUIComponent(clientId="$pageSession{propertyTableRowGroupId}", component=>$attribute{trg});
                            getSelectedTableRowKeys(tableRowGroup="${trg}" rowKeys=>$attribute{rowKeys});
                            deleteTableRows(tableRowGroup="${trg}" rowKeys="${rowKeys}");
                            commitTableRowGroup(tableRowGroup="${trg}");
                        />
                    </sun:button>
                </sun:panelGroup>
            </facet>
            <sun:tableRowGroup id="rowGroup1" selected="#{td.value.selected}" data={"$pageSession{tableList}", "$pageSession{tableList2}"}  sourceVar="td">
                <ui:event type="beforeCreate">
                    // Ensure all required fields exist
                    if ("#{pageSession.tableList[0].name}") {
                        if ("!#{pageSession.tableList[0].value}") {
                            mapPut(map="#{pageSession.tableList[0]}" key="value" value="");
                        }
                        if ("!#{pageSession.tableList[0].description}") {
                            mapPut(map="#{pageSession.tableList[0]}" key="description" value="");
                        }
                    }

                    // Add extra table properties...
                    createList(size="0", result="#{pageSession.tableList2}");
                    foreach(var="row" list="#{pageSession.tableList}") {
                        selectiveEncode(value="#{row.name}" result="#{requestScope.tlEncName}");
                        gf.createAttributeMap(
                            keys={"selected", "encodedName", "description"},
                            values={"$boolean{false}", "$attribute{tlEncName}", ""},
                            map="#{requestScope.tlMap}");
                        listAdd(list="#{pageSession.tableList2}", value="#{requestScope.tlMap}");
                    }
                </ui:event>
                <ui:event type="afterCreate">
                    getClientId(component="$this{component}" clientId=>$page{propertyTableRowGroupId});
                </ui:event>
                <sun:tableColumn headerText="$resource{i18n.common.SelectHeader}" selectId="select" rowHeader="$boolean{false}" id="col1">
                    <sun:checkbox id="select"
                        selected="#{td.value.selected}"
                        selectedValue="$boolean{true}"
                        onClick="setTimeout('admingui.table.changeOneTableButton(\\\\\'#{pageSession.topActionGroup}\\\\\', \\\\\'#{pageSession.tableId}\\\\\'); admingui.table.initAllRows(\\\\\'#{pageSession.tableId}\\\\\');', 0);"
                    />
                </sun:tableColumn>
                <sun:tableColumn headerText="$resource{i18n.systemProps.colInstanceName}" sort="name" rowHeader="$boolean{false}" id="col2">
                    <sun:textField columns="$int{40}" maxLength="#{sessionScope.fieldLengths['maxLength.common.PropertyName']}" id="col1St" value="#{td.value.name}" />
                </sun:tableColumn>
                <sun:tableColumn headerText="$resource{i18n.systemProps.colDefaultValue}" sort="value" rowHeader="$boolean{false}" id="col3">
                    <sun:textField columns="$int{40}" maxLength="#{sessionScope.fieldLengths['maxLength.common.PropertyValue']}" id="col1St" value="#{td.value.value}" />
                </sun:tableColumn>
                <sun:tableColumn headerText="$resource{i18n.systemProps.colInstanceValues}" sort="value" rowHeader="$boolean{false}" id="col4" rendered="#{!pageSession.isServerConfig}">
                    <sun:hyperlink id="instanceLink" text="$resource{i18n.systemProps.colInstanceValues}" 
                                   rendered="#{!empty td.value.name}"
                                   url="/common/configuration/sysInstanceValues.jsf?propName=#{td.value.name}&configName=#{pageSession.configName}"/>
                </sun:tableColumn>
                "<br/>
            </sun:tableRowGroup>
        </sun:table>
        <sun:propertySheet id="propertySheet2" rendered="#{!pageSession.isServerConfig}">
            <sun:propertySheetSection id="usingThisConfigSheet">
                <sun:property id="usingThisConfigProp" labelAlign="left" noWrap="#{true}" overlapLabel="#{false}" label="$resource{i18n.systemProps.instClustLabel}" >
                    <foreach key="entry" list="#{pageSession.configUsageList}">
                        <event>
                            <!beforeEncode
                                setAttribute(key="tmp" value="#{entry}");
                                gf.listInstances(optionKeys={"id"} optionValues={"$attribute{tmp}"}, statusMap="#{requestScope.statusMap}");
                                setAttribute(key="status" value="#{requestScope.statusMap['$attribute{tmp}']}");
                                setAttribute(key="statusString" value="$resource{i18nc.status.image.$attribute{status}}");
                            />
                        </event>
                        <h:outputText id="colStopped" value="#{requestScope.statusString}&#160;#{entry}" escape="false"/>
                        "<br/>
                    </foreach>
                </sun:property>
            </sun:propertySheetSection>
        </sun:propertySheet>
        <sun:title id="title2">
            <!facet pageButtonsTop>
                <sun:panelGroup id="topButtons">
#include "configSystemPropertiesButtons.jsf"
                </sun:panelGroup>
            </facet>
        </sun:title>
    <sun:hidden id="helpKey" value="$resource{help_common.configurationSystemProperties}" />
    </sun:form>
#include "/common/shared/changeButtonsJS.inc"
</define>
</composition>
