<!--

    Copyright (c) 2009, 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="help_common" bundle="org.glassfish.common.admingui.Helplinks");
/>
#include "/common/shared/commonHandlers.inc"
<!composition template="/templates/default.layout" guiTitle="$resource{i18nc.pswdAliases.title}"
        guiOnLoad="admingui.nav.selectTreeNodeWithURL('#{request.contextPath}/common/appServer/serverInstDomainAttrs.jsf');"
>
<!define name="content">
    <event>
        <!beforeCreate
            setSessionAttribute(key="domainTabs" value="pswdAliases");
            gf.restRequest(endpoint="#{sessionScope.REST_URL}/list-password-aliases"  method="GET" result="#{requestScope.resp}");
            setPageSessionAttribute(key="editLink" value="#{request.contextPath}/common/appServer/pswdAliasEdit.jsf");
            setPageSessionAttribute(key="createLink" value="#{request.contextPath}/common/appServer/pswdAliasNew.jsf");
            setPageSessionAttribute(key="listLink" value="#{request.contextPath}/common/appServer/pswdAliases.jsf");
            setPageSessionAttribute(key="confirmDeleteMsg" value="$resource{i18nc.msg.JS.confirmDeletePswdAlias}");
            gfr.getPswdAliases();
            setAttribute(key="listOfRows" value={});
            foreach(var="oneAlias" list="#{pageSession.listOfAliases}"){
                createMap(result="#{requestScope.aMap}");
                mapPut(map="#{requestScope.aMap}" key="name" value="#{requestScope.oneAlias}");
                mapPut(map="#{requestScope.aMap}" key="selected" value="$boolean{false}");
                listAdd(list="#{requestScope.listOfRows}" value="#{requestScope.aMap}");
            }
        />
    </event>
    <sun:form id="propertyForm">

#include "/common/appServer/domainTabs.inc"
#include "/common/shared/alertMsg_1.inc"
         <sun:title id="propertyContentPage" title="$resource{i18nc.pswdAliases.title}" helpText="$resource{i18nc.pswdAliases.titleHelp}"/>
         "<br /><br />
<sun:table id="aliases" title="$resource{i18nc.pswdAliases.tableTitle}"
    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="newButton" text="$resource{i18n.button.New}" >
                <!command gf.redirect(page="#{pageSession.createLink}") />
            </sun:button>

            <sun:button id="button1" text="$resource{i18n.button.Delete}" disabled="#{true}" primary="#{false}"
                onClick="if ( getConfirm(this,'$pageSession{confirmDeleteMsg}') )
                        { return submitAndDisable(this, '$resource{i18n.button.Processing}');} else {return false;} "  >
            <!command
                getUIComponent(clientId="$pageSession{tableRowGroupId}", component=>$attribute{tableRowGroup});
                getSelectedSingleMapRows(TableRowGroup="${tableRowGroup}" selectedRows=>$attribute{selectedRows});
                createMap(result="#{requestScope.deleteMap}");
                foreach(var="oneRow" list="#{requestScope.selectedRows}"){
                    mapPut(map="#{requestScope.deleteMap}" key="id" value="#{requestScope.oneRow.name}");
                    gf.restRequest(
                        endpoint="#{sessionScope.REST_URL}/delete-password-alias"
                        method="POST"
                        attrs="#{requestScope.deleteMap}"
                        result="#{pageSession.deleteResult}" );
                }
                gf.redirect(page="#{pageSession.listLink}");
            />
            </sun:button>
         </sun:panelGroup>
     </facet>


<sun:tableRowGroup id="rowGroup1" selected="#{td.value.selected}" data={"$attribute{listOfRows}"} sourceVar="td">
     <!afterCreate
         getClientId(component="$this{component}" clientId=>$page{tableRowGroupId});
        />
    <sun:tableColumn headerText="$resource{i18n.common.SelectHeader}" selectId="select" rowHeader="$boolean{false}" id="col0">
            <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{i18nc.pswdAlias.nameCol}"  sort="name" rowHeader="$boolean{true}" id="col1">
        <sun:hyperlink id="link" text="#{td.value.name}"   url="#{pageSession.editLink}?name=#{td.value.name}" />
    </sun:tableColumn>
        </sun:tableRowGroup>

</sun:table>
	<sun:hidden id="helpKey" value="$resource{help_common.pswdAliases}" />
</sun:form>
</define>
</composition>
