You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by fm...@apache.org on 2015/08/12 15:55:25 UTC
[1/3] syncope git commit: [SYNCOPE-156] providing ListView table view
+ Provision wizard functionalities
Repository: syncope
Updated Branches:
refs/heads/master 6ad532ae6 -> ba7f1a5ce
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionPanel.html
new file mode 100644
index 0000000..7df9317
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionPanel.html
@@ -0,0 +1,39 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you 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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+ <wicket:panel>
+
+ <div id="bean">
+ <div class="tablerow" wicket:id="fields">
+ <div class="tablecolumn_check">
+ <span wicket:id="check">[check]</span>
+ </div>
+ <div class="tablecolumn_label short_dynamicsize">
+ <label for="label">
+ <span wicket:id="label">[label]</span>
+ </label>
+ </div>
+ <div class="tablecolumn_field medium_dynamicsize">
+ <span wicket:id="field">[field]</span>
+ </div>
+ </div>
+ </div>
+
+ </wicket:panel>
+</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.html
index b85acb6..a07a8dc 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ConnectorModal.html
@@ -18,18 +18,15 @@ under the License.
-->
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<wicket:extend>
- <p class="ui-widget ui-corner-all ui-widget-header">
- <span wicket:id="new"/> <wicket:message key="title"/> <span wicket:id="key"/>
- </p>
- <div style="margin: 5px;">
- <form wicket:id="form">
- <div id="tabs">
- <ul>
- <li class="tabs-selected"><a href="#tabs-1"><span><wicket:message key="tab1"/></span></a></li>
- <li><a href="#tabs-2"><span><wicket:message key="tab2"/></span></a></li>
- <li><a href="#tabs-3"><span><wicket:message key="tab3"/></span></a></li>
- </ul>
- <div id="tabs-1">
+ <form wicket:id="form">
+ <div class="tabbable tabs-left">
+ <ul class="nav nav-tabs">
+ <li class="active"><a data-toggle="tab" href="#tabs-1"><span><wicket:message key="tab1"/></span></a></li>
+ <li><a data-toggle="tab" href="#tabs-2"><span><wicket:message key="tab2"/></span></a></li>
+ <li><a data-toggle="tab" href="#tabs-3"><span><wicket:message key="tab3"/></span></a></li>
+ </ul>
+ <div class="tab-content">
+ <div id="tabs-1" class="tab-pane active">
<div id="formtable">
<div class="tablerow alt">
<div class="tablecolumn_label short_dynamicsize">
@@ -112,7 +109,7 @@ under the License.
</div>
</div>
</div>
- <div id="tabs-2">
+ <div id="tabs-2" class="tab-pane">
<div id="formtable">
<span wicket:id="container">
<div style="border-bottom: 10px">
@@ -142,20 +139,16 @@ under the License.
</span>
</div>
</div>
- <div id="tabs-3">
+ <div id="tabs-3" class="tab-pane">
<span wicket:id="capabilitiesPalette"/>
</div>
</div>
+ </div>
- <div style="margin: 20px 10px 0">
- <input type="submit"
- class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
- wicket:id="apply"/>
- <input type="button"
- class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
- wicket:id="cancel"/>
- </div>
- </form>
- </div>
+ <div class="modal-footer">
+ <input type="submit" class="btn btn-primary" wicket:id="apply"/>
+ <input type="button" class="btn btn-default" wicket:id="cancel"/>
+ </div>
+ </form>
</wicket:extend>
</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ListViewPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ListViewPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ListViewPanel.html
new file mode 100644
index 0000000..ec4cc94
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ListViewPanel.html
@@ -0,0 +1,60 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you 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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+ <wicket:panel>
+ <span wicket:id="container">
+ <wicket:container wicket:id="content" />
+ </span>
+
+ <wicket:fragment wicket:id="wizard">
+ <span wicket:id="wizard"/>
+ </wicket:fragment>
+
+ <wicket:fragment wicket:id="table">
+ <div class="col-xs-12">
+ <div class="box">
+ <div class="box-header">
+ <h3 class="box-title">
+ <span wicket:id="caption"/>
+ </h3>
+ </div><!-- /.box-header -->
+ <div class="box-body table-responsive no-padding">
+ <table class="table table-hover">
+ <tbody>
+ <tr>
+ <th wicket:id="names"><span wicket:id="name"/></th>
+ </tr>
+ <tr wicket:id="beans">
+ <td wicket:id="fields"><span wicket:id="field"/></td>
+ <td>
+ <div class="listview-actions">
+ <span wicket:id="actions">[actions]</span>
+ </div>
+ </td>
+ </tr>
+ </tbody></table>
+ </div><!-- /.box-body -->
+ </div><!-- /.box -->
+ </div>
+ <div class="modal-footer">
+ <input type="submit" class="btn btn-primary" value="Add" wicket:message="value:listview.add" wicket:id="add"/>
+ </div>
+ </wicket:fragment>
+ </wicket:panel>
+</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.html
index 8cb22f0..2d4f7b4 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.html
@@ -22,8 +22,7 @@ under the License.
<div class="tabbable tabs-left">
<ul class="nav nav-tabs">
<li class="active"><a data-toggle="tab" href="#resource"><span><wicket:message key="resource"/></span></a></li>
- <li><a data-toggle="tab" href="#umapping"><span><wicket:message key="umapping"/></span></a></li>
- <li><a data-toggle="tab" href="#gmapping"><span><wicket:message key="gmapping"/></span></a></li>
+ <li><a data-toggle="tab" href="#provisions"><span><wicket:message key="provisions"/></span></a></li>
<li><a data-toggle="tab" href="#connectorProperties"><span><wicket:message key="connectorProperties"/></span></a></li>
<li><a data-toggle="tab" href="#security"><span><wicket:message key="security"/></span></a></li>
</ul>
@@ -32,11 +31,10 @@ under the License.
<span wicket:id="details">[details]</span>
<span wicket:id="systeminformation">[System Information]</span>
</div>
- <div id="umapping" class="tab-pane">
- <span wicket:id="umapping">[umapping]</span>
- </div>
- <div id="gmapping" class="tab-pane">
- <span wicket:id="gmapping">[gmapping]</span>
+ <div id="provisions" class="tab-pane">
+ <span wicket:id="pcontainer">
+ <span wicket:id="provisions">[provisions]</span>
+ </span>
</div>
<div id="connectorProperties" class="tab-pane">
<span wicket:id="connconf">[connconf]</span>
@@ -50,7 +48,7 @@ under the License.
<div class="modal-footer">
<input type="submit" class="btn btn-primary" wicket:id="apply"/>
<input type="button" class="btn btn-default" wicket:id="cancel"/>
- </div>
+ </div>
</form>
</wicket:extend>
</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
index 789919b..24827a6 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal.properties
@@ -15,6 +15,7 @@
# specific language governing permissions and limitations
# under the License.
resource=Resource details
+provisions=Provisioning
umapping=User mapping
connectorProperties=Connector properties
security=Security
@@ -58,3 +59,9 @@ actionsClasses=Actions classes
gmapping=Group mapping
new=New resource
randomPwdIfNotProvided=Generate random passwords when missing
+
+anyType=Object Type
+objectClass= Object Class
+__ACCOUNT__=ACCOUNT
+__GROUP__=GROUP
+listview.caption=Provisioning configuration instances
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties
index 54179a5..1bc3c04 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_it.properties
@@ -15,6 +15,7 @@
# specific language governing permissions and limitations
# under the License.
resource=Dettagli Risorsa
+provisions=Provisioning
umapping=Mapping utenti
connectorProperties=Propriet\u00e0\u00a0 Connettore
security=Sicurezza
@@ -58,3 +59,9 @@ actionsClasses=Classi azioni
gmapping=Mapping gruppi
new=Nuova risorsa
randomPwdIfNotProvided=Genera password casuali se mancanti
+
+anyType=Oggetto
+objectClass=Classe
+__ACCOUNT__=ACCOUNT
+__GROUP__=GROUP
+listview.caption=Istanze di configurazione del provisioning
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties
index 45c3616..47f41b2 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModal_pt_BR.properties
@@ -15,6 +15,7 @@
# specific language governing permissions and limitations
# under the License.
resource=Detalhes de Recursos
+provisions=Provisioning
umapping=Mapeamento de usu\u00e1rios
connectorProperties=Propriedades de Conectores
security=Seguran\u00e7a
@@ -58,3 +59,9 @@ actionsClasses=Classes de a\u00e7\u00f5es
gmapping=Mapeamento de grupos
new=Novo recurso
randomPwdIfNotProvided=Gerar senhas aleat\u00f3rias quando n\u00e3o houver
+
+anyType=Objeto
+objectClass=Classe
+__ACCOUNT__=ACCOUNT
+__GROUP__=GROUP
+listview.caption=Inst\u00e2ncias de provisionamento de recursos
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.html b/client/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.html
index 8df7df7..fe7677e 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/topology/Topology.html
@@ -44,21 +44,28 @@ under the License.
</div>
<div id="topology">
<div id="drawing">
- <div class="window topology_root" wicket:id="syncope" onmouseup="refreshPosition(this)">[syncope]</div>
+ <div class="window" wicket:id="syncope" onmouseup="refreshPosition(this)">[syncope]</div>
<span wicket:id="connectorServers">
- <div class="window topology_cs" wicket:id="cs" onmouseup="refreshPosition(this)">[resource]</div>
+ <div class="window" wicket:id="cs" onmouseup="refreshPosition(this)">[connector server]</div>
</span>
- <span wicket:id="conn1">
- <div class="window topology_conn" wicket:id="conn" onmouseup="refreshPosition(this)">[resource]</div>
+ <span wicket:id="filePaths">
+ <div class="window" wicket:id="fp" onmouseup="refreshPosition(this)">[file path]</div>
</span>
- <span wicket:id="conn2">
- <div class="window topology_conn" wicket:id="conn" onmouseup="refreshPosition(this)">[resource]</div>
+ <span wicket:id="conns">
+ <span wicket:id="conns">
+ <div class="window" wicket:id="conn" onmouseup="refreshPosition(this)">[connector]</div>
+ </span>
</span>
<span wicket:id="resources">
<span wicket:id="resources">
- <div class="window topology_res" wicket:id="res" onmouseup="refreshPosition(this)">[resource]</div>
+ <div class="window" wicket:id="res" onmouseup="refreshPosition(this)">[resource]</div>
</span>
</span>
+ <div wicket:id="newlyCreatedContainer">
+ <span wicket:id="newlyCreated">
+ <div class="window" wicket:id="el" onmouseup="refreshPosition(this)">[resource]</div>
+ </span>
+ </div>
</div>
<span wicket:id="jsPlace"></span>
</div>
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyNodePanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyNodePanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyNodePanel.html
index ed238c7..6faea50 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyNodePanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/topology/TopologyNodePanel.html
@@ -19,41 +19,44 @@ under the License.
-->
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<wicket:panel>
- <div class="node-action-link btn-group">
- <a href="javascript:void(0);" data-toggle="dropdown">
- <i class="fa fa-sliders"></i>
- </a>
- <wicket:container wicket:id="actions" />
- </div>
-
+ <wicket:container wicket:id="actions" />
<p class="text-center text-primary" wicket:id="label"/>
- <wicket:fragment wicket:id="connectorWithResourceActions">
- <ul role="menu" class="dropdown-menu">
- <li><a href="#"><i class="fa fa-plus"></i></a></li>
- <li><a href="#"><i class="fa fa-pencil"></i></a></li>
- </ul>
- </wicket:fragment>
-
- <wicket:fragment wicket:id="connectorWithNoResourceActions">
- <ul role="menu" class="dropdown-menu">
- <li><a href="#" wicket:id="create"><i class="fa fa-plus"></i></a></li>
- <li><a href="#" wicket:id="delete"><i class="fa fa-minus"></i></a></li>
- <li><a href="#" wicket:id="edit"><i class="fa fa-pencil"></i></a></li>
- </ul>
+ <wicket:fragment wicket:id="connectorActions">
+ <div class="node-action-link btn-group">
+ <a href="javascript:void(0);" data-toggle="dropdown">
+ <i class="fa fa-sliders"></i>
+ </a>
+ <ul role="menu" class="dropdown-menu">
+ <li><a href="#" wicket:id="create"><i class="fa fa-plus"></i></a></li>
+ <li><a href="#" wicket:id="delete"><i class="fa fa-minus"></i></a></li>
+ <li><a href="#" wicket:id="edit"><i class="fa fa-pencil"></i></a></li>
+ </ul>
+ </div>
</wicket:fragment>
<wicket:fragment wicket:id="resourceActions">
- <ul role="menu" class="dropdown-menu">
- <li><a href="#" wicket:id="delete"><i class="fa fa-minus"></i></a></li>
- <li><a href="#" wicket:id="edit"><i class="fa fa-pencil"></i></a></li>
- </ul>
+ <div class="node-action-link btn-group">
+ <a href="javascript:void(0);" data-toggle="dropdown">
+ <i class="fa fa-sliders"></i>
+ </a>
+ <ul role="menu" class="dropdown-menu">
+ <li><a href="#" wicket:id="delete"><i class="fa fa-minus"></i></a></li>
+ <li><a href="#" wicket:id="edit"><i class="fa fa-pencil"></i></a></li>
+ </ul>
+ </div>
</wicket:fragment>
- <wicket:fragment wicket:id="syncopeActions">
- <ul role="menu" class="dropdown-menu">
- <li><a href="#"><i class="fa fa-plus"></i></a></li>
- </ul>
+ <wicket:fragment wicket:id="locationActions">
+ <div class="node-action-link btn-group">
+ <a href="javascript:void(0);" data-toggle="dropdown">
+ <i class="fa fa-sliders"></i>
+ </a>
+ <ul role="menu" class="dropdown-menu">
+ <li><a href="#" wicket:id="create"><i class="fa fa-plus"></i></a></li>
+ </ul>
+ </div>
</wicket:fragment>
+ <wicket:fragment wicket:id="syncopeActions" />
</wicket:panel>
</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
index cf51170..0f9d637 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.html
@@ -34,6 +34,10 @@ under the License.
<span wicket:id="panelExecute">[plus]</span>
<span wicket:id="panelEnable">[plus]</span>
<span wicket:id="panelSearch">[plus]</span>
+ <span wicket:id="panelMapping">[plus]</span>
+ <span wicket:id="panelAccountLink">[plus]</span>
+ <span wicket:id="panelResetTime">[plus]</span>
+ <span wicket:id="panelClone">[plus]</span>
<span wicket:id="panelCreate">[plus]</span>
<span wicket:id="panelUserTemplate">[plus]</span>
<span wicket:id="panelGroupTemplate">[plus]</span>
@@ -71,8 +75,24 @@ under the License.
<a href="#" wicket:id="manageGroupsLink"><img id="actionLink" src="img/actions/groups-icon.png" alt="manage groups icon" title="Manage groups"/></a>
</wicket:fragment>
+ <wicket:fragment wicket:id="fragmentMapping">
+ <a href="#" wicket:id="mappingLink" title="Mapping"><i class="fa fa-exchange"></i></a>
+ </wicket:fragment>
+
+ <wicket:fragment wicket:id="fragmentAccountLink">
+ <a href="#" wicket:id="accountLinkLink" title="Account Link"><i class="fa fa-external-link"></i></a>
+ </wicket:fragment>
+
+ <wicket:fragment wicket:id="fragmentResetTime">
+ <a href="#" wicket:id="resetTimeLink" title="Reset Time"><i class="fa fa-hourglass-start"></i></a>
+ </wicket:fragment>
+
+ <wicket:fragment wicket:id="fragmentClone">
+ <a href="#" wicket:id="cloneLink" title="Clone"><i class="fa fa-clone"></i></a>
+ </wicket:fragment>
+
<wicket:fragment wicket:id="fragmentCreate">
- <a href="#" wicket:id="createLink"><img id="actionLink" src="img/actions/create.png" alt="create icon" title="Create"/></a>
+ <a href="#" wicket:id="createLink" title="Create"><i class="fa fa-create"></i></a>
</wicket:fragment>
<wicket:fragment wicket:id="fragmentSearch">
@@ -100,7 +120,7 @@ under the License.
</wicket:fragment>
<wicket:fragment wicket:id="fragmentDelete">
- <a href="#" wicket:id="deleteLink"><img id="actionLink" src="img/actions/delete.png" alt="delete icon" title="Delete"/></a>
+ <a href="#" wicket:id="deleteLink" title="Delete"><i class="fa fa-minus"></i></a>
</wicket:fragment>
<wicket:fragment wicket:id="fragmentDryRun">
@@ -160,13 +180,13 @@ under the License.
</wicket:fragment>
<wicket:fragment wicket:id="fragmentZoomIn">
- <a href="#" wicket:id="zoomInLink"><i class="fa fa-search-plus"></i></a>
+ <a href="#" wicket:id="zoomInLink" title="Zoom In"><i class="fa fa-search-plus"></i></a>
</wicket:fragment>
-
+
<wicket:fragment wicket:id="fragmentZoomOut">
- <a href="#" wicket:id="zoomOutLink"><i class="fa fa-search-minus"></i></a>
+ <a href="#" wicket:id="zoomOutLink" title="Zoom Out"><i class="fa fa-search-minus"></i></a>
</wicket:fragment>
-
+
<wicket:fragment wicket:id="emptyFragment">
</wicket:fragment>
</wicket:panel>
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.html
index 52f1da9..af85a84 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.html
@@ -17,7 +17,9 @@ specific language governing permissions and limitations
under the License.
-->
<html>
- <wicket:panel>
- <span wicket:id="checkBoxMultipleChoice" />
- </wicket:panel>
+ <wicket:panel>
+ <div class="form-group">
+ <span wicket:id="checkBoxMultipleChoice" />
+ </div>
+ </wicket:panel>
</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$AccountLink.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$AccountLink.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$AccountLink.html
new file mode 100644
index 0000000..aa2e5ab
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$AccountLink.html
@@ -0,0 +1,23 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you 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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" >
+ <wicket:panel>
+ Specify here the account link .... work in progress
+ </wicket:panel>
+</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$Mapping.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$Mapping.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$Mapping.html
new file mode 100644
index 0000000..2147713
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$Mapping.html
@@ -0,0 +1,23 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you 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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <wicket:panel>
+ <span wicket:id="mapping" />
+ </wicket:panel>
+</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$ObjectType.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$ObjectType.html b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$ObjectType.html
new file mode 100644
index 0000000..e36f66d
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard$ObjectType.html
@@ -0,0 +1,30 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you 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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml">
+ <wicket:panel >
+ <div class="form-group">
+ <label>Object Type</label>
+ <input type="text" placeholder="Object Type ..." class="form-control" wicket:id="type">
+ </div>
+ <div class="form-group">
+ <label>Object Class</label>
+ <input type="text" placeholder="Object Class ..." class="form-control" wicket:id="class">
+ </div>
+ </wicket:panel>
+</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard.properties
new file mode 100644
index 0000000..535da53
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard.properties
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+type.title=Specify the type of the provisioning object
+type.summary=
+mapping.title=Specify the maping about the provisioning object
+mapping.summary=
+link.title=Specify the account link (if required)
+link.summary=
+
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_it.properties
new file mode 100644
index 0000000..535da53
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_it.properties
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+type.title=Specify the type of the provisioning object
+type.summary=
+mapping.title=Specify the maping about the provisioning object
+mapping.summary=
+link.title=Specify the account link (if required)
+link.summary=
+
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_pt_BR.properties
new file mode 100644
index 0000000..535da53
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wizards/ProvisionWizard_pt_BR.properties
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+
+type.title=Specify the type of the provisioning object
+type.summary=
+mapping.title=Specify the maping about the provisioning object
+mapping.summary=
+link.title=Specify the account link (if required)
+link.summary=
+
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index bea197f..26e5754 100644
--- a/pom.xml
+++ b/pom.xml
@@ -376,11 +376,11 @@ under the License.
<jquery-cookie.version>1.4.1-1</jquery-cookie.version>
<bootstrap.version>3.3.5</bootstrap.version>
<bootstrap-select.version>1.6.3</bootstrap-select.version>
- <font-awesome.version>4.3.0</font-awesome.version>
+ <font-awesome.version>4.4.0</font-awesome.version>
<ionicons.version>2.0.1</ionicons.version>
<highlightjs.version>8.4-4</highlightjs.version>
<codemirror.version>5.5</codemirror.version>
- <jsplumb.version>1.6.4</jsplumb.version>
+ <jsplumb.version>1.7.5</jsplumb.version>
<wicket.version>7.0.0</wicket.version>
<wicket-jqueryui.version>7.0.0</wicket-jqueryui.version>
@@ -1081,6 +1081,7 @@ under the License.
<configuration>
<source>${targetJdk}</source>
<target>${targetJdk}</target>
+ <useIncrementalCompilation>false</useIncrementalCompilation>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
<!--<compilerArgument>-Xlint:unchecked</compilerArgument>-->
[3/3] syncope git commit: [SYNCOPE-156] providing ListView table view
+ Provision wizard functionalities
Posted by fm...@apache.org.
[SYNCOPE-156] providing ListView table view + Provision wizard functionalities
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/ba7f1a5c
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/ba7f1a5c
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/ba7f1a5c
Branch: refs/heads/master
Commit: ba7f1a5ce9f852e9783853b7397a64a66ac4826c
Parents: 6ad532a
Author: fmartelli <fa...@gmail.com>
Authored: Wed Aug 12 15:55:08 2015 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Wed Aug 12 15:55:08 2015 +0200
----------------------------------------------------------------------
.../console/pages/BulkActionModalPage.java | 9 +-
.../console/pages/ProvisioningModalPage.java | 13 +-
.../console/panels/AbstractResourceModal.java | 78 +++++
.../console/panels/ActionDataTablePanel.java | 14 +-
.../console/panels/BeanReflectionModal.java | 36 ++
.../console/panels/BeanReflectionPanel.java | 339 +++++++++++++++++++
.../client/console/panels/ConnectorModal.java | 50 +--
.../client/console/panels/ListViewPanel.java | 322 ++++++++++++++++++
.../client/console/panels/ModalContent.java | 8 +-
.../console/panels/ResourceMappingPanel.java | 66 ++--
.../client/console/panels/ResourceModal.java | 94 +++--
.../client/console/topology/Topology.java | 337 ++++++++++--------
.../client/console/topology/TopologyNode.java | 5 +-
.../console/topology/TopologyNodePanel.java | 47 ++-
.../markup/html/form/AbstractFieldPanel.java | 2 +-
.../wicket/markup/html/form/ActionLink.java | 23 +-
.../markup/html/form/ActionLinksPanel.java | 261 +++++++++++---
.../form/CheckBoxMultipleChoiceFieldPanel.java | 13 +-
.../client/console/wizards/AjaxWizard.java | 125 +++++++
.../console/wizards/AjaxWizardButton.java | 66 ++++
.../console/wizards/AjaxWizardButtonBar.java | 111 ++++++
.../client/console/wizards/ProvisionWizard.java | 123 +++++++
.../META-INF/resources/css/syncopeConsole.css | 139 ++++----
.../resources/META-INF/resources/js/topology.js | 90 ++---
.../console/panels/BeanReflectionModal.html | 30 ++
.../console/panels/BeanReflectionPanel.html | 39 +++
.../client/console/panels/ConnectorModal.html | 41 +--
.../client/console/panels/ListViewPanel.html | 60 ++++
.../client/console/panels/ResourceModal.html | 14 +-
.../console/panels/ResourceModal.properties | 7 +
.../console/panels/ResourceModal_it.properties | 7 +
.../panels/ResourceModal_pt_BR.properties | 7 +
.../client/console/topology/Topology.html | 21 +-
.../console/topology/TopologyNodePanel.html | 59 ++--
.../markup/html/form/ActionLinksPanel.html | 32 +-
.../form/CheckBoxMultipleChoiceFieldPanel.html | 8 +-
.../wizards/ProvisionWizard$AccountLink.html | 23 ++
.../wizards/ProvisionWizard$Mapping.html | 23 ++
.../wizards/ProvisionWizard$ObjectType.html | 30 ++
.../console/wizards/ProvisionWizard.properties | 24 ++
.../wizards/ProvisionWizard_it.properties | 24 ++
.../wizards/ProvisionWizard_pt_BR.properties | 24 ++
pom.xml | 5 +-
43 files changed, 2350 insertions(+), 499 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
index 5567094..6172639 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/BulkActionModalPage.java
@@ -18,6 +18,7 @@
*/
package org.apache.syncope.client.console.pages;
+import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
@@ -39,7 +40,6 @@ import org.apache.wicket.extensions.markup.html.repeater.util.SortableDataProvid
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.springframework.beans.BeanUtils;
@@ -85,7 +85,8 @@ public class BulkActionModalPage<T, S> extends BaseModalPage {
Integer.MAX_VALUE).setVisible(items != null && !items.isEmpty()));
@SuppressWarnings("rawtypes")
- final ActionLinksPanel actionPanel = new ActionLinksPanel("actions", new Model(), getPageReference());
+ final ActionLinksPanel<Serializable> actionPanel
+ = ActionLinksPanel.builder(getPageReference()).build("actions");
add(actionPanel);
for (ActionLink.ActionType action : actions) {
@@ -118,12 +119,12 @@ public class BulkActionModalPage<T, S> extends BaseModalPage {
LOG.error("Bulk action type not supported");
}
- actionPanel.add(new ActionLink() {
+ actionPanel.add(new ActionLink<Serializable>() {
private static final long serialVersionUID = -3722207913631435501L;
@Override
- public void onClick(final AjaxRequestTarget target) {
+ public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
try {
final BulkActionResult res = (BulkActionResult) bulkActionExecutor.getClass().
getMethod("bulkAction", BulkAction.class).invoke(bulkActionExecutor, bulkAction);
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
index 9937e36..32a4921 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/ProvisioningModalPage.java
@@ -18,6 +18,7 @@
*/
package org.apache.syncope.client.console.pages;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
@@ -129,12 +130,12 @@ public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalP
final String pageId = "Resources";
- table.addAction(new ActionLink() {
+ table.addAction(new ActionLink<Serializable>() {
private static final long serialVersionUID = -3722207913631435501L;
@Override
- public void onClick(final AjaxRequestTarget target) {
+ public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
try {
bulkAssociationAction(target, ResourceDeassociationActionType.UNLINK, table, columns);
} catch (Exception e) {
@@ -145,12 +146,12 @@ public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalP
}
}, ActionLink.ActionType.UNLINK, pageId);
- table.addAction(new ActionLink() {
+ table.addAction(new ActionLink<Serializable>() {
private static final long serialVersionUID = -3722207913631435501L;
@Override
- public void onClick(final AjaxRequestTarget target) {
+ public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
try {
bulkAssociationAction(target, ResourceDeassociationActionType.DEPROVISION, table, columns);
} catch (Exception e) {
@@ -161,12 +162,12 @@ public class ProvisioningModalPage<T extends AnyTO> extends AbstractStatusModalP
}
}, ActionLink.ActionType.DEPROVISION, pageId);
- table.addAction(new ActionLink() {
+ table.addAction(new ActionLink<Serializable>() {
private static final long serialVersionUID = -3722207913631435501L;
@Override
- public void onClick(final AjaxRequestTarget target) {
+ public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
try {
bulkAssociationAction(target, ResourceDeassociationActionType.UNASSIGN, table, columns);
} catch (Exception e) {
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
new file mode 100644
index 0000000..1ed9050
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractResourceModal.java
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.syncope.client.console.panels;
+
+import java.io.Serializable;
+import org.apache.syncope.client.console.topology.TopologyNode;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+
+/**
+ * Modal window with Resource form.
+ */
+public abstract class AbstractResourceModal extends ModalContent {
+
+ private static final long serialVersionUID = 1734415311027284221L;
+
+ public AbstractResourceModal(final ModalWindow window, final PageReference pageRef) {
+ super(window, pageRef);
+ }
+
+ public static class CreateEvent extends ModalEvent {
+
+ private final Serializable key;
+
+ private final String displayName;
+
+ private final Serializable parent;
+
+ private final TopologyNode.Kind kind;
+
+ public CreateEvent(
+ final Serializable key,
+ final String displayName,
+ final TopologyNode.Kind kind,
+ final Serializable parent,
+ final AjaxRequestTarget target) {
+ super(target);
+ this.key = key;
+ this.displayName = displayName;
+ this.kind = kind;
+ this.parent = parent;
+ }
+
+ public Serializable getKey() {
+ return key;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public TopologyNode.Kind getKind() {
+ return kind;
+ }
+
+ public Serializable getParent() {
+ return parent;
+ }
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
index 80d05a1..837c89d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ActionDataTablePanel.java
@@ -18,6 +18,7 @@
*/
package org.apache.syncope.client.console.panels;
+import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import org.apache.syncope.client.console.commons.ActionTableCheckGroup;
@@ -37,7 +38,6 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.extensions.markup.html.repeater.data.table.ISortableDataProvider;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
@@ -48,7 +48,7 @@ public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
private final Form<T> bulkActionForm;
- private final ActionLinksPanel actionPanel;
+ private final ActionLinksPanel<Serializable> actionPanel;
private final PageReference pageRef;
@@ -93,7 +93,7 @@ public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
final WebMarkupContainer actionPanelContainer = new WebMarkupContainer("actionPanelContainer");
bulkActionForm.add(actionPanelContainer);
- actionPanel = new ActionLinksPanel("actions", new Model(), pageRef);
+ actionPanel = ActionLinksPanel.builder(pageRef).build("actions");
actionPanelContainer.add(actionPanel);
if (dataTable.getRowCount() == 0) {
@@ -111,11 +111,13 @@ public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
}.setVisible(false).setEnabled(false));
}
- public void addAction(final ActionLink action, final ActionType type, final String entitlements) {
- actionPanel.add(action, type, entitlements);
+ public void addAction(
+ final ActionLink<Serializable> action, final ActionType type, final String entitlements) {
+ actionPanel.add(action, type, entitlements, true);
}
- public void addAction(final ActionLink action, final ActionType type, final String pageId, final boolean enabled) {
+ public void addAction(
+ final ActionLink<Serializable> action, final ActionType type, final String pageId, final boolean enabled) {
actionPanel.add(action, type, pageId, enabled);
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionModal.java
new file mode 100644
index 0000000..a6859e8
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionModal.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.syncope.client.console.panels;
+
+import java.io.Serializable;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+
+/**
+ * Modal window with Resource form.
+ */
+public abstract class BeanReflectionModal extends ModalContent {
+
+ private static final long serialVersionUID = 1734415311027284222L;
+
+ public BeanReflectionModal(final Serializable bean, final ModalWindow window, final PageReference pageRef) {
+ super(window, pageRef);
+ add(new BeanReflectionPanel("bean", bean));
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionPanel.java
new file mode 100644
index 0000000..4f3f1d5
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanReflectionPanel.java
@@ -0,0 +1,339 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.syncope.client.console.panels;
+
+import java.beans.PropertyDescriptor;
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.rest.PolicyRestClient;
+import org.apache.syncope.client.console.rest.SchemaRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.form.AbstractFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.SpinnerFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.list.AltListView;
+import org.apache.syncope.common.lib.annotation.ClassList;
+import org.apache.syncope.common.lib.annotation.SchemaList;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.LoadableDetachableModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.util.ListModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.ClassUtils;
+import org.springframework.util.ReflectionUtils;
+import org.springframework.util.ReflectionUtils.FieldCallback;
+import org.springframework.util.ReflectionUtils.FieldFilter;
+
+public class BeanReflectionPanel extends Panel {
+
+ private static final long serialVersionUID = -3035998190456928143L;
+
+ /**
+ * Logger.
+ */
+ private static final Logger LOG = LoggerFactory.getLogger(BeanReflectionPanel.class);
+
+ @SpringBean
+ private SchemaRestClient schemaRestClient;
+
+ @SpringBean
+ private PolicyRestClient policyRestClient;
+
+ private final IModel<List<String>> userSchemas = new LoadableDetachableModel<List<String>>() {
+
+ private static final long serialVersionUID = -2012833443695917883L;
+
+ @Override
+ protected List<String> load() {
+ return schemaRestClient.getPlainSchemaNames();
+ }
+ };
+
+ private final IModel<List<String>> groupSchemas = new LoadableDetachableModel<List<String>>() {
+
+ private static final long serialVersionUID = 5275935387613157437L;
+
+ @Override
+ protected List<String> load() {
+ return schemaRestClient.getPlainSchemaNames();
+ }
+ };
+
+ private final IModel<List<String>> correlationRules = new LoadableDetachableModel<List<String>>() {
+
+ private static final long serialVersionUID = 5275935387613157437L;
+
+ @Override
+ protected List<String> load() {
+ return policyRestClient.getCorrelationRuleClasses();
+ }
+ };
+
+ public BeanReflectionPanel(final String id, final Serializable bean) {
+ super(id);
+
+ final List<FieldWrapper> items = new ArrayList<>();
+ ReflectionUtils.doWithFields(bean.getClass(),
+ new FieldCallback() {
+
+ @Override
+ public void doWith(final Field field) throws IllegalArgumentException, IllegalAccessException {
+ FieldWrapper fieldWrapper = new FieldWrapper();
+ fieldWrapper.setName(field.getName());
+ fieldWrapper.setType(field.getType());
+
+ final SchemaList schemaList = field.getAnnotation(SchemaList.class);
+ fieldWrapper.setSchemaList(schemaList);
+
+ final ClassList classList = field.getAnnotation(ClassList.class);
+ fieldWrapper.setClassList(classList);
+
+ items.add(fieldWrapper);
+ }
+ },
+ new FieldFilter() {
+
+ @Override
+ public boolean matches(final Field field) {
+ return !Modifier.isStatic(field.getModifiers()) && !"serialVersionUID".equals(field.getName());
+ }
+ });
+
+ final ListView<FieldWrapper> policies = new AltListView<FieldWrapper>("fields", items) {
+
+ private static final long serialVersionUID = 9101744072914090143L;
+
+ @Override
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ protected void populateItem(final ListItem<FieldWrapper> item) {
+ final FieldWrapper field = item.getModelObject();
+
+ final PropertyDescriptor propDesc = BeanUtils.getPropertyDescriptor(bean.getClass(), field.getName());
+
+ item.add(new Label("label", new ResourceModel(field.getName())));
+
+ AbstractFieldPanel component;
+ try {
+ if (field.getClassList() != null) {
+ component = new AjaxDropDownChoicePanel("field", field.getName(), new PropertyModel(bean,
+ field.getName()));
+
+ final List<String> rules = correlationRules.getObject();
+
+ if (rules != null && !rules.isEmpty()) {
+ ((AjaxDropDownChoicePanel) component).setChoices(correlationRules.getObject());
+ }
+
+ item.add(component);
+
+ item.add(getActivationControl(
+ component,
+ propDesc.getReadMethod().invoke(bean, new Object[] {}) != null,
+ null,
+ null));
+
+ } else if (field.getType().isEnum()) {
+ component = new AjaxDropDownChoicePanel("field", field.getName(), new PropertyModel(bean,
+ field.getName()));
+
+ final Serializable[] values = (Serializable[]) field.getType().getEnumConstants();
+
+ if (values != null && values.length > 0) {
+ ((AjaxDropDownChoicePanel) component).setChoices(Arrays.asList(values));
+ }
+
+ item.add(component);
+
+ item.add(getActivationControl(
+ component,
+ (Enum<?>) propDesc.getReadMethod().invoke(bean, new Object[] {}) != null,
+ values[0],
+ values[0]));
+
+ } else if (ClassUtils.isAssignable(Boolean.class, field.getType())) {
+ item.add(new AjaxCheckBoxPanel("check", field.getName(),
+ new PropertyModel<Boolean>(bean, field.getName())));
+
+ item.add(new Label("field", new Model(null)));
+ } else if (Collection.class.isAssignableFrom(field.getType())) {
+ if (field.getSchemaList() != null) {
+ final List<String> values = new ArrayList<>();
+ if (field.getName().charAt(0) == 'r') {
+ values.addAll(groupSchemas.getObject());
+
+ if (field.getSchemaList().extended()) {
+ values.add("name");
+ }
+ } else {
+ values.addAll(userSchemas.getObject());
+
+ if (field.getSchemaList().extended()) {
+ values.add("key");
+ values.add("username");
+ }
+ }
+
+ component = new AjaxPalettePanel("field", new PropertyModel(bean, field.getName()),
+ new ListModel<>(values));
+ item.add(component);
+
+ Collection<?> collection = (Collection) propDesc.getReadMethod().invoke(bean);
+ item.add(getActivationControl(component,
+ !collection.isEmpty(), new ArrayList<String>(), new ArrayList<String>()));
+ } else {
+ final FieldPanel panel = new AjaxTextFieldPanel("panel", field.getName(),
+ new Model<String>(null));
+ panel.setRequired(true);
+
+ component = new MultiFieldPanel<String>("field",
+ new PropertyModel(bean, field.getName()), panel);
+
+ item.add(component);
+
+ final List<String> reinitializedValue = new ArrayList<String>();
+
+ reinitializedValue.add("");
+
+ item.add(getActivationControl(component,
+ !((Collection) propDesc.getReadMethod().invoke(bean, new Object[] {})).isEmpty(),
+ new ArrayList<String>(), (Serializable) reinitializedValue));
+ }
+ } else if (ClassUtils.isAssignable(Number.class, field.getType())) {
+ component = new SpinnerFieldPanel<Number>("field", field.getName(),
+ (Class<Number>) field.getType(), new PropertyModel<Number>(bean, field.getName()),
+ null, null);
+ item.add(component);
+
+ item.add(getActivationControl(component,
+ (Integer) propDesc.getReadMethod().invoke(bean, new Object[] {}) > 0, 0, 0));
+ } else if (field.getType().equals(String.class)) {
+ component = new AjaxTextFieldPanel("field", field.getName(),
+ new PropertyModel(bean, field.getName()));
+
+ item.add(component);
+
+ item.add(getActivationControl(component,
+ propDesc.getReadMethod().invoke(bean, new Object[] {}) != null, null, null));
+ } else {
+ item.add(new AjaxCheckBoxPanel("check", field.getName(), new Model()));
+ item.add(new Label("field", new Model(null)));
+ }
+ } catch (Exception e) {
+ LOG.error("Error retrieving bean fields", e);
+ }
+ }
+ };
+
+ add(policies);
+ }
+
+ private <T extends Serializable> AjaxCheckBoxPanel getActivationControl(final AbstractFieldPanel<T> panel,
+ final Boolean checked, final T defaultModelObject, final T reinitializedValue) {
+
+ final AjaxCheckBoxPanel check = new AjaxCheckBoxPanel("check", "check", new Model<Boolean>(checked));
+
+ panel.setEnabled(checked);
+
+ check.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
+
+ private static final long serialVersionUID = -1107858522700306810L;
+
+ @Override
+ protected void onUpdate(final AjaxRequestTarget target) {
+ if (check.getModelObject()) {
+ panel.setEnabled(true);
+ panel.setModelObject(reinitializedValue);
+ } else {
+ panel.setModelObject(defaultModelObject);
+ panel.setEnabled(false);
+ }
+
+ target.add(panel);
+ }
+ });
+
+ return check;
+ }
+
+ private static class FieldWrapper implements Serializable {
+
+ private static final long serialVersionUID = -6770429509752964215L;
+
+ private Class<?> type;
+
+ private String name;
+
+ private transient SchemaList schemaList;
+
+ private transient ClassList classList;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(final String name) {
+ this.name = name;
+ }
+
+ public Class<?> getType() {
+ return type;
+ }
+
+ public void setType(final Class<?> type) {
+ this.type = type;
+ }
+
+ public SchemaList getSchemaList() {
+ return schemaList;
+ }
+
+ public void setSchemaList(final SchemaList schemaList) {
+ this.schemaList = schemaList;
+ }
+
+ public ClassList getClassList() {
+ return classList;
+ }
+
+ public void setClassList(final ClassList classList) {
+ this.classList = classList;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
index 40aefce..9db9bd2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnectorModal.java
@@ -30,8 +30,11 @@ import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.apache.syncope.client.console.commons.Constants;
import org.apache.syncope.client.console.pages.BasePage;
+import org.apache.syncope.client.console.topology.Topology;
+import org.apache.syncope.client.console.topology.TopologyNode;
import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
+import org.apache.syncope.client.console.wicket.markup.html.form.CheckBoxMultipleChoiceFieldPanel;
import org.apache.syncope.client.console.wicket.markup.html.form.SpinnerFieldPanel;
import org.apache.syncope.client.console.wicket.markup.html.list.ConnConfPropertyListView;
import org.apache.syncope.common.lib.SyncopeClientException;
@@ -48,11 +51,11 @@ import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.event.Broadcast;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
-import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.list.ListView;
@@ -67,7 +70,7 @@ import org.apache.wicket.validation.validator.RangeValidator;
/**
* Modal window with Connector form.
*/
-public class ConnectorModal extends ModalContent {
+public class ConnectorModal extends AbstractResourceModal {
private static final long serialVersionUID = -2025535531121434050L;
@@ -143,14 +146,14 @@ public class ConnectorModal extends ModalContent {
connectorForm.add(displayName);
final AjaxDropDownChoicePanel<String> location = new AjaxDropDownChoicePanel<>("location", "location",
- new Model<>(bundleTO == null ? null : bundleTO.getLocation()));
+ new Model<>(bundleTO == null ? connInstanceTO.getLocation() : bundleTO.getLocation()));
((DropDownChoice<String>) location.getField()).setNullValid(true);
location.setStyleSheet("long_dynamicsize");
location.setChoices(new ArrayList<>(mapConnBundleTOs.keySet()));
location.setRequired(true);
location.addRequiredLabel();
location.setOutputMarkupId(true);
- location.setEnabled(connInstanceTO.getKey() == 0);
+ location.setEnabled(connInstanceTO.getKey() == 0 && StringUtils.isBlank(connInstanceTO.getLocation()));
location.getField().setOutputMarkupId(true);
connectorForm.add(location);
@@ -160,11 +163,12 @@ public class ConnectorModal extends ModalContent {
((DropDownChoice<String>) connectorName.getField()).setNullValid(true);
connectorName.setStyleSheet("long_dynamicsize");
connectorName.setChoices(bundleTO == null
- ? new ArrayList<String>()
- : new ArrayList<>(mapConnBundleTOs.get(connInstanceTO.getLocation()).keySet()));
+ ? StringUtils.isBlank(connInstanceTO.getLocation())
+ ? new ArrayList<String>()
+ : new ArrayList<>(mapConnBundleTOs.get(connInstanceTO.getLocation()).keySet())
+ : new ArrayList<>(mapConnBundleTOs.get(bundleTO.getLocation()).keySet()));
connectorName.setRequired(true);
connectorName.addRequiredLabel();
- connectorName.setEnabled(connInstanceTO.getLocation() != null);
connectorName.setOutputMarkupId(true);
connectorName.setEnabled(connInstanceTO.getKey() == 0);
connectorName.getField().setOutputMarkupId(true);
@@ -176,7 +180,7 @@ public class ConnectorModal extends ModalContent {
version.setChoices(bundleTO == null
? new ArrayList<String>()
: new ArrayList<>(mapConnBundleTOs.get(connInstanceTO.getLocation()).
- get(connInstanceTO.getBundleName()).keySet()));
+ get(connInstanceTO.getBundleName()).keySet()));
version.setRequired(true);
version.addRequiredLabel();
version.setEnabled(connInstanceTO.getBundleName() != null);
@@ -313,19 +317,20 @@ public class ConnectorModal extends ModalContent {
connectorPropForm.add(check);
// form - third tab (capabilities)
- final IModel<List<ConnectorCapability>> capabilities =
- new LoadableDetachableModel<List<ConnectorCapability>>() {
+ final IModel<List<ConnectorCapability>> capabilities
+ = new LoadableDetachableModel<List<ConnectorCapability>>() {
- private static final long serialVersionUID = 5275935387613157437L;
+ private static final long serialVersionUID = 5275935387613157437L;
- @Override
- protected List<ConnectorCapability> load() {
- return Arrays.asList(ConnectorCapability.values());
- }
- };
- CheckBoxMultipleChoice<ConnectorCapability> capabilitiesPalette = new CheckBoxMultipleChoice<>(
- "capabilitiesPalette",
- new PropertyModel<List<ConnectorCapability>>(this, "selectedCapabilities"), capabilities);
+ @Override
+ protected List<ConnectorCapability> load() {
+ return Arrays.asList(ConnectorCapability.values());
+ }
+ };
+ CheckBoxMultipleChoiceFieldPanel<ConnectorCapability> capabilitiesPalette
+ = new CheckBoxMultipleChoiceFieldPanel<>(
+ "capabilitiesPalette",
+ new PropertyModel<List<ConnectorCapability>>(this, "selectedCapabilities"), capabilities);
capabilitiesPalette.add(new AjaxFormChoiceComponentUpdatingBehavior() {
@@ -373,6 +378,13 @@ public class ConnectorModal extends ModalContent {
try {
if (connInstanceTO.getKey() == 0) {
connectorRestClient.create(conn);
+ send(pageRef.getPage(), Broadcast.BREADTH, new CreateEvent(
+ conn.getKey(),
+ conn.getDisplayName(),
+ TopologyNode.Kind.CONNECTOR,
+ conn.getLocation().startsWith(Topology.CONNECTOR_SERVER_LOCATION_PREFIX)
+ ? conn.getLocation() : Topology.ROOT_NAME,
+ target));
} else {
connectorRestClient.update(conn);
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
new file mode 100644
index 0000000..f89aa9b
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
@@ -0,0 +1,322 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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 org.apache.syncope.client.console.panels;
+
+import java.beans.PropertyDescriptor;
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
+import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.IEvent;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.list.ListItem;
+import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.markup.html.panel.Fragment;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.ResourceModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class ListViewPanel<T extends Serializable> extends Panel {
+
+ private static final long serialVersionUID = -7982691107029848579L;
+
+ /**
+ * Logger.
+ */
+ private static final Logger LOG = LoggerFactory.getLogger(ListViewPanel.class);
+
+ private final ClearIndicatingAjaxButton addButton;
+
+ private AjaxWizard<T> newItemPanel;
+
+ private final WebMarkupContainer container;
+
+ private final Fragment initialFragment;
+
+ private final List<T> listOfItems;
+
+ /**
+ * Table view of a list of beans.
+ *
+ * @param id id.
+ * @param list list of item.
+ * @param reference list item reference class.
+ * @param includes Used to sort and restrict the set of bean's fields to be shown.
+ * @param actions item actions.
+ */
+ private ListViewPanel(
+ final String id,
+ final List<T> list,
+ final Class<T> reference,
+ final List<String> includes,
+ final ActionLinksPanel.Builder<T> actions,
+ final PageReference pageRef) {
+ super(id);
+ setOutputMarkupId(true);
+
+ container = new WebMarkupContainer("container");
+ add(container.setOutputMarkupId(true));
+
+ initialFragment = new Fragment("content", "table", this);
+ container.addOrReplace(initialFragment);
+
+ initialFragment.add(new Label("caption", new ResourceModel("listview.caption", StringUtils.EMPTY)));
+
+ final List<String> toBeIncluded;
+ if (includes == null || includes.isEmpty()) {
+ toBeIncluded = new ArrayList<String>();
+ for (Field field : Arrays.asList(reference.getDeclaredFields())) {
+ toBeIncluded.add(field.getName());
+ }
+ } else {
+ toBeIncluded = includes;
+ }
+
+ if (toBeIncluded.isEmpty()) {
+ LOG.warn("No field has been retrieved from {}", reference.getName());
+ listOfItems = Collections.<T>emptyList();
+ } else if (list == null || list.isEmpty()) {
+ LOG.info("No item to be shown");
+ listOfItems = Collections.<T>emptyList();
+ } else {
+ listOfItems = list;
+ if (LOG.isDebugEnabled()) {
+ for (String field : toBeIncluded) {
+ LOG.debug("Show field {}", field);
+ }
+ }
+ }
+
+ final ListView<String> names = new ListView<String>("names", toBeIncluded) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void populateItem(final ListItem<String> item) {
+ item.add(new Label("name", new ResourceModel(item.getModelObject(), item.getModelObject())));
+ }
+ };
+ initialFragment.add(names);
+
+ final ListView<T> beans = new ListView<T>("beans", listOfItems) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void populateItem(final ListItem<T> beanItem) {
+ final T bean = beanItem.getModelObject();
+
+ final ListView<String> fields = new ListView<String>("fields", toBeIncluded) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void populateItem(final ListItem<String> fieldItem) {
+ try {
+ LOG.error("Processing field {}", fieldItem.getModelObject());
+
+ final Object value = new PropertyDescriptor(fieldItem.getModelObject(), bean.getClass()).
+ getReadMethod().invoke(bean);
+
+ LOG.error("Field value {}", value);
+
+ fieldItem.add(value == null
+ ? new Label("field", StringUtils.EMPTY)
+ : new Label("field", new ResourceModel(value.toString(), value.toString())));
+
+ } catch (Exception e) {
+ LOG.error("Error retrieving value for field {}", fieldItem.getModelObject(), e);
+ fieldItem.add(new Label("field", StringUtils.EMPTY));
+ }
+ }
+ };
+ beanItem.add(fields);
+ beanItem.add(actions.build("actions", bean));
+ }
+ };
+ beans.setReuseItems(true);
+ initialFragment.add(beans);
+
+ addButton = new ClearIndicatingAjaxButton("add", pageRef) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onSubmitInternal(final AjaxRequestTarget target, final Form<?> form) {
+ final Fragment fragment = new Fragment("content", "wizard", ListViewPanel.this);
+ fragment.add(newItemPanel.clone());
+ container.addOrReplace(fragment);
+ target.add(container);
+ }
+ };
+
+ addButton.setEnabled(false);
+ addButton.setVisible(false);
+
+ initialFragment.add(addButton);
+ }
+
+ @Override
+ public void onEvent(final IEvent<?> event) {
+ if (event.getPayload() instanceof AjaxWizard.NewItemEvent) {
+ final AjaxRequestTarget target = AjaxWizard.NewItemEvent.class.cast(event.getPayload()).getTarget();
+
+ @SuppressWarnings("unchecked")
+ final T item = ((AjaxWizard.NewItemEvent<T>) event.getPayload()).getItem();
+
+ if (event.getPayload() instanceof AjaxWizard.NewItemFinishEvent) {
+ this.listOfItems.add(item);
+ }
+
+ container.addOrReplace(initialFragment);
+ target.add(container);
+ }
+ super.onEvent(event);
+ }
+
+ private ListViewPanel<T> addNewItemPanel(final AjaxWizard<T> panel) {
+ this.newItemPanel = panel;
+
+ if (this.newItemPanel != null) {
+ addButton.setEnabled(true);
+ addButton.setVisible(true);
+ }
+
+ return this;
+ }
+
+ public static <T extends Serializable> Builder<T> builder(final Class<T> reference, final PageReference pageRef) {
+ return new Builder<T>(reference, pageRef);
+ }
+
+ /**
+ * ListViewPanel builder.
+ *
+ * @param <T> list item reference type.
+ */
+ public static final class Builder<T extends Serializable> implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private final PageReference pageRef;
+
+ private final Class<T> reference;
+
+ private final List<String> includes = new ArrayList<>();
+
+ private final ActionLinksPanel.Builder<T> actions;
+
+ private List<T> items;
+
+ private AjaxWizard<T> newItemPanel;
+
+ private Builder(final Class<T> reference, final PageReference pageRef) {
+ this.pageRef = pageRef;
+ this.reference = reference;
+ this.items = null;
+ this.actions = ActionLinksPanel.<T>builder(pageRef);
+ }
+
+ /**
+ * Builds a list view.
+ *
+ * @param id component id.
+ * @return List view.
+ */
+ public ListViewPanel<T> build(final String id) {
+ return new ListViewPanel<T>(id, items, reference, includes, actions, pageRef).addNewItemPanel(newItemPanel);
+ }
+
+ /**
+ * Sets list of items.
+ *
+ * @param items list of items.
+ * @return current builder object.
+ */
+ public Builder<T> setItems(final List<T> items) {
+ this.items = items;
+ return this;
+ }
+
+ /**
+ * Adds item.
+ *
+ * @param item item.
+ * @return current builder object.
+ */
+ public Builder<T> addItem(final T item) {
+ if (item == null) {
+ return this;
+ }
+
+ if (this.items == null) {
+ this.items = new ArrayList<>();
+ }
+
+ this.items.add(item);
+ return this;
+ }
+
+ /**
+ * Gives fields to be shown. It could be used to give an order as well.
+ *
+ * @param includes field names to be shown.
+ * @return current builder object.
+ */
+ public Builder<T> includes(final String... includes) {
+ for (String include : includes) {
+ if (include != null && !this.includes.contains(include)) {
+ this.includes.add(include);
+ }
+ }
+ return this;
+ }
+
+ /**
+ * Add item action (the given order is ignored.
+ *
+ * @param link action link.
+ * @param type action type.
+ * @param entitlements entitlements.
+ * @return current builder object.
+ */
+ public Builder<T> addAction(
+ final ActionLink<T> link, final ActionLink.ActionType type, final String entitlements) {
+ actions.add(link, type, entitlements);
+ return this;
+ }
+
+ public Builder<T> addNewItemPanel(final AjaxWizard<T> panel) {
+ this.newItemPanel = panel;
+ return this;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalContent.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalContent.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalContent.java
index fbf8802..6a123c0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalContent.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ModalContent.java
@@ -54,9 +54,9 @@ public class ModalContent extends Panel {
protected NotificationPanel feedbackPanel;
- private final PageReference pageRef;
+ protected final PageReference pageRef;
- private final ModalWindow window;
+ protected final ModalWindow window;
public ModalContent(final ModalWindow window, final PageReference pageRef) {
super(window.getContentId());
@@ -68,6 +68,10 @@ public class ModalContent extends Panel {
add(feedbackPanel);
}
+ public NotificationPanel getFeedbackPanel() {
+ return feedbackPanel;
+ }
+
/**
* Generic modal event.
*/
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
index 17ae3bf..b210c86 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceMappingPanel.java
@@ -120,9 +120,9 @@ public class ResourceMappingPanel extends Panel {
private final ResourceTO resourceTO;
/**
- * User / group.
+ * External resource provisioning configuration instance to be updated.
*/
- private final AnyTypeKind anyTypeKind;
+ private final ProvisionTO provisionTO;
/**
* Mapping container.
@@ -134,31 +134,26 @@ public class ResourceMappingPanel extends Panel {
private final AjaxCheckBoxPanel connObjectLinkCheckbox;
private MappingTO getMapping() {
- ProvisionTO provision = resourceTO.getProvision(this.anyTypeKind.name());
- if (provision == null) {
- provision = new ProvisionTO();
- resourceTO.getProvisions().add(provision);
- }
- if (provision.getMapping() == null) {
- provision.setMapping(new MappingTO());
+ if (provisionTO.getMapping() == null) {
+ provisionTO.setMapping(new MappingTO());
}
- return provision.getMapping();
+ return provisionTO.getMapping();
}
/**
* Attribute Mapping Panel.
*
* @param id panel id
- * @param resourceTO external resource
- * @param anyTypeKind USER / GROUP
+ * @param resourceTO external resource to be updated.
+ * @param provisionTO external resource provisioning configuration instance.
*/
- public ResourceMappingPanel(final String id, final ResourceTO resourceTO, final AnyTypeKind anyTypeKind) {
+ public ResourceMappingPanel(final String id, final ResourceTO resourceTO, final ProvisionTO provisionTO) {
super(id);
setOutputMarkupId(true);
this.resourceTO = resourceTO;
- this.anyTypeKind = anyTypeKind;
+ this.provisionTO = provisionTO == null ? new ProvisionTO() : provisionTO;
this.mappingContainer = new WebMarkupContainer("mappingContainer");
this.mappingContainer.setOutputMarkupId(true);
@@ -168,9 +163,8 @@ public class ResourceMappingPanel extends Panel {
this.connObjectLinkContainer.setOutputMarkupId(true);
add(this.connObjectLinkContainer);
- if (this.resourceTO.getConnector() != null && this.resourceTO.getConnector() > 0) {
- schemaNames = getSchemaNames(this.resourceTO.getConnector(), this.resourceTO.getConnConfProperties());
-
+ if (resourceTO.getConnector() != null && resourceTO.getConnector() > 0) {
+ schemaNames = getSchemaNames(resourceTO.getConnector(), resourceTO.getConnConfProperties());
setEnabled();
} else {
schemaNames = Collections.<String>emptyList();
@@ -184,7 +178,8 @@ public class ResourceMappingPanel extends Panel {
final Label passwordLabel = new Label("passwordLabel", new ResourceModel("password"));
mappingContainer.add(passwordLabel);
- if (AnyTypeKind.USER != ResourceMappingPanel.this.anyTypeKind) {
+
+ if (!AnyTypeKind.USER.name().equals(this.provisionTO.getAnyType())) {
passwordLabel.setVisible(false);
}
@@ -284,9 +279,9 @@ public class ResourceMappingPanel extends Panel {
}
});
- final AjaxDropDownChoicePanel<String> intAttrNames =
- new AjaxDropDownChoicePanel<>("intAttrNames", getString("intAttrNames"),
- new PropertyModel<String>(mapItem, "intAttrName"), false);
+ final AjaxDropDownChoicePanel<String> intAttrNames = new AjaxDropDownChoicePanel<>("intAttrNames",
+ getString("intAttrNames"),
+ new PropertyModel<String>(mapItem, "intAttrName"), false);
intAttrNames.setChoices(schemaNames);
intAttrNames.setRequired(true);
intAttrNames.setStyleSheet(FIELD_STYLE);
@@ -301,22 +296,23 @@ public class ResourceMappingPanel extends Panel {
item.add(intAttrNames);
final List<IntMappingType> attrTypes = new ArrayList<>(getAttributeTypes(entity));
- final AjaxDropDownChoicePanel<IntMappingType> intMappingTypes =
- new AjaxDropDownChoicePanel<>("intMappingTypes",
- new ResourceModel("intMappingTypes", "intMappingTypes").getObject(),
- new PropertyModel<IntMappingType>(mapItem, "intMappingType"));
+ final AjaxDropDownChoicePanel<IntMappingType> intMappingTypes = new AjaxDropDownChoicePanel<>(
+ "intMappingTypes",
+ new ResourceModel("intMappingTypes", "intMappingTypes").getObject(),
+ new PropertyModel<IntMappingType>(mapItem, "intMappingType"));
intMappingTypes.setRequired(true);
intMappingTypes.setChoices(attrTypes);
intMappingTypes.setStyleSheet(FIELD_STYLE);
item.add(intMappingTypes);
- final AjaxDropDownChoicePanel<AnyTypeKind> entitiesPanel =
- new AjaxDropDownChoicePanel<>("entities",
- new ResourceModel("entities", "entities").getObject(),
- new Model<>(entity));
- entitiesPanel.setChoices(anyTypeKind == AnyTypeKind.GROUP
+ final AjaxDropDownChoicePanel<AnyTypeKind> entitiesPanel = new AjaxDropDownChoicePanel<>("entities",
+ new ResourceModel("entities", "entities").getObject(),
+ new Model<>(entity));
+
+ entitiesPanel.setChoices(provisionTO.getAnyType().equals(AnyTypeKind.GROUP.name())
? Collections.<AnyTypeKind>singletonList(AnyTypeKind.GROUP)
: Arrays.asList(AnyTypeKind.values()));
+
entitiesPanel.setStyleSheet(DEF_FIELD_STYLE);
entitiesPanel.getField().add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
@@ -399,7 +395,7 @@ public class ResourceMappingPanel extends Panel {
}
});
item.add(password);
- if (AnyTypeKind.USER != ResourceMappingPanel.this.anyTypeKind) {
+ if (!AnyTypeKind.USER.name().equals(provisionTO.getAnyType())) {
password.setVisible(false);
}
@@ -446,7 +442,7 @@ public class ResourceMappingPanel extends Panel {
}
};
addMappingBtn.setDefaultFormProcessing(false);
- addMappingBtn.setEnabled(this.resourceTO.getConnector() != null && this.resourceTO.getConnector() > 0);
+ addMappingBtn.setEnabled(resourceTO.getConnector() != null && resourceTO.getConnector() > 0);
mappingContainer.add(addMappingBtn);
boolean connObjectLinkEnabled = false;
@@ -495,10 +491,10 @@ public class ResourceMappingPanel extends Panel {
private void setEnabled() {
ConnInstanceTO connInstanceTO = new ConnInstanceTO();
- connInstanceTO.setKey(this.resourceTO.getConnector());
- connInstanceTO.getConfiguration().addAll(this.resourceTO.getConnConfProperties());
+ connInstanceTO.setKey(resourceTO.getConnector());
+ connInstanceTO.getConfiguration().addAll(resourceTO.getConnConfProperties());
- boolean enabled = resourceTO.getProvision(anyTypeKind.name()) != null;
+ boolean enabled = provisionTO != null;
this.mappingContainer.setEnabled(enabled);
this.mappingContainer.setVisible(enabled);
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
index 8627998..6390f01 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ResourceModal.java
@@ -26,10 +26,12 @@ import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.syncope.client.console.commons.Constants;
import org.apache.syncope.client.console.pages.AbstractBasePage;
+import org.apache.syncope.client.console.topology.TopologyNode;
+import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
+import org.apache.syncope.client.console.wizards.ProvisionWizard;
import org.apache.syncope.common.lib.to.MappingItemTO;
import org.apache.syncope.common.lib.to.ProvisionTO;
import org.apache.syncope.common.lib.to.ResourceTO;
-import org.apache.syncope.common.lib.types.AnyTypeKind;
import org.apache.syncope.common.lib.types.Entitlement;
import org.apache.wicket.PageReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -38,6 +40,7 @@ import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDa
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.ResourceModel;
@@ -45,7 +48,7 @@ import org.apache.wicket.model.ResourceModel;
/**
* Modal window with Resource form.
*/
-public class ResourceModal extends ModalContent {
+public class ResourceModal extends AbstractResourceModal {
private static final long serialVersionUID = 1734415311027284221L;
@@ -71,10 +74,61 @@ public class ResourceModal extends ModalContent {
//--------------------------------
//--------------------------------
- // Resource mapping panels
+ // Resource provision panels
//--------------------------------
- form.add(new ResourceMappingPanel("umapping", resourceTO, AnyTypeKind.USER));
- form.add(new ResourceMappingPanel("gmapping", resourceTO, AnyTypeKind.GROUP));
+ final WebMarkupContainer provisions = new WebMarkupContainer("pcontainer");
+ form.add(provisions.setOutputMarkupId(true));
+
+ final ListViewPanel.Builder<ProvisionTO> builder = ListViewPanel.builder(ProvisionTO.class, pageRef);
+ builder.setItems(resourceTO.getProvisions());
+ builder.includes("anyType", "objectClass");
+
+ builder.addAction(new ActionLink<ProvisionTO>() {
+
+ private static final long serialVersionUID = -3722207913631435504L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+
+ }
+ }, ActionLink.ActionType.MAPPING, Entitlement.RESOURCE_UPDATE).addAction(new ActionLink<ProvisionTO>() {
+
+ private static final long serialVersionUID = -3722207913631435514L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+
+ }
+ }, ActionLink.ActionType.ACCOUNT_LINK, Entitlement.RESOURCE_UPDATE).addAction(new ActionLink<ProvisionTO>() {
+
+ private static final long serialVersionUID = -3722207913631435524L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+
+ }
+ }, ActionLink.ActionType.RESET_TIME, Entitlement.RESOURCE_UPDATE).addAction(new ActionLink<ProvisionTO>() {
+
+ private static final long serialVersionUID = -3722207913631435534L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+
+ }
+ }, ActionLink.ActionType.CLONE, Entitlement.RESOURCE_CREATE).addAction(new ActionLink<ProvisionTO>() {
+
+ private static final long serialVersionUID = -3722207913631435544L;
+
+ @Override
+ public void onClick(final AjaxRequestTarget target, final ProvisionTO provisionTO) {
+ resourceTO.getProvisions().remove(provisionTO);
+ target.add(provisions);
+
+ }
+ }, ActionLink.ActionType.DELETE, Entitlement.RESOURCE_DELETE);
+
+ builder.addNewItemPanel(new ProvisionWizard("wizard", resourceTO, pageRef));
+ provisions.add(builder.build("provisions"));
//--------------------------------
//--------------------------------
@@ -129,7 +183,12 @@ public class ResourceModal extends ModalContent {
try {
if (createFlag) {
resourceRestClient.create(resourceTO);
- send(pageRef.getPage(), Broadcast.BREADTH, new ResourceCreateEvent(target, resourceTO));
+ send(pageRef.getPage(), Broadcast.BREADTH, new CreateEvent(
+ resourceTO.getKey(),
+ resourceTO.getKey(),
+ TopologyNode.Kind.RESOURCE,
+ resourceTO.getConnector(),
+ target));
} else {
resourceRestClient.update(resourceTO);
}
@@ -178,27 +237,4 @@ public class ResourceModal extends ModalContent {
MetaDataRoleAuthorizationStrategy.authorize(
submit, ENABLE, createFlag ? Entitlement.RESOURCE_CREATE : Entitlement.RESOURCE_UPDATE);
}
-
- public NotificationPanel getFeedbackPanel() {
- return feedbackPanel;
- }
-
- public static class ResourceCreateEvent extends ModalEvent {
-
- private final ResourceTO resourceTO;
-
- public ResourceCreateEvent(final AjaxRequestTarget target, final ResourceTO resourceTO) {
- super(target);
- this.resourceTO = resourceTO;
- }
-
- /**
- * Create resource getter.
- *
- * @return created resource.
- */
- public ResourceTO getResourceTO() {
- return resourceTO;
- }
- }
}
[2/3] syncope git commit: [SYNCOPE-156] providing ListView table view
+ Provision wizard functionalities
Posted by fm...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
index 5ec882c..4fc5a86 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
@@ -39,7 +39,7 @@ import org.apache.commons.lang3.tuple.Pair;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.syncope.client.console.SyncopeConsoleSession;
import org.apache.syncope.client.console.pages.BasePage;
-import org.apache.syncope.client.console.panels.ResourceModal.ResourceCreateEvent;
+import org.apache.syncope.client.console.panels.AbstractResourceModal.CreateEvent;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
import org.apache.syncope.common.lib.to.ConnInstanceTO;
@@ -49,6 +49,7 @@ import org.apache.syncope.common.rest.api.service.SyncopeService;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.IAjaxIndicatorAware;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.event.IEvent;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
@@ -57,9 +58,7 @@ import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
-import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.LoadableDetachableModel;
-import org.apache.wicket.model.Model;
import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
import org.apache.wicket.protocol.ws.api.message.TextMessage;
@@ -69,7 +68,9 @@ public class Topology extends BasePage {
private static final long serialVersionUID = -1100228004207271272L;
- private static final String CONNECTOR_SERVER_LOCATION_PREFIX = "connid://";
+ public static final String CONNECTOR_SERVER_LOCATION_PREFIX = "connid://";
+
+ public static final String ROOT_NAME = "Syncope";
private final int origX = 3100;
@@ -81,6 +82,10 @@ public class Topology extends BasePage {
private final ModalWindow modal;
+ private final WebMarkupContainer newlyCreatedContainer;
+
+ private final ListView<TopologyNode> newlyCreated;
+
private final LoadableDetachableModel<List<ResourceTO>> resModel = new LoadableDetachableModel<List<ResourceTO>>() {
private static final long serialVersionUID = 5275935387613157431L;
@@ -92,45 +97,51 @@ public class Topology extends BasePage {
}
};
- private final LoadableDetachableModel<Pair<List<ConnInstanceTO>, List<ConnInstanceTO>>> connModel =
- new LoadableDetachableModel<Pair<List<ConnInstanceTO>, List<ConnInstanceTO>>>() {
+ private final LoadableDetachableModel<Map<String, List<ConnInstanceTO>>> connModel
+ = new LoadableDetachableModel<Map<String, List<ConnInstanceTO>>>() {
- private static final long serialVersionUID = 5275935387613157432L;
+ private static final long serialVersionUID = 5275935387613157432L;
- @Override
- protected Pair<List<ConnInstanceTO>, List<ConnInstanceTO>> load() {
- final List<ConnInstanceTO> level1 = new ArrayList<>();
- final List<ConnInstanceTO> level2 = new ArrayList<>();
-
- for (ConnInstanceTO conn : connectorRestClient.getAllConnectors()) {
- if (conn.getLocation().startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
- level2.add(conn);
- } else {
- level1.add(conn);
+ @Override
+ protected Map<String, List<ConnInstanceTO>> load() {
+ final Map<String, List<ConnInstanceTO>> res = new HashMap<>();
+
+ for (ConnInstanceTO conn : connectorRestClient.getAllConnectors()) {
+ final List<ConnInstanceTO> conns;
+ if (res.containsKey(conn.getLocation())) {
+ conns = res.get(conn.getLocation());
+ } else {
+ conns = new ArrayList<>();
+ res.put(conn.getLocation(), conns);
+ }
+ conns.add(conn);
+ }
+
+ return res;
}
- }
+ };
- return Pair.of(level1, level2);
- }
- };
+ private final LoadableDetachableModel<Pair<List<URI>, List<URI>>> csModel
+ = new LoadableDetachableModel<Pair<List<URI>, List<URI>>>() {
- private final LoadableDetachableModel<List<URI>> csModel = new LoadableDetachableModel<List<URI>>() {
+ private static final long serialVersionUID = 5275935387613157433L;
- private static final long serialVersionUID = 5275935387613157433L;
+ @Override
+ protected Pair<List<URI>, List<URI>> load() {
+ final List<URI> connectorServers = new ArrayList<>();
+ final List<URI> filePaths = new ArrayList<>();
- @Override
- protected List<URI> load() {
- final List<URI> locations = new ArrayList<>();
+ for (String location : SyncopeConsoleSession.get().getSyncopeTO().getConnIdLocations()) {
+ if (location.startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
+ connectorServers.add(URI.create(location));
+ } else {
+ filePaths.add(URI.create(location));
+ }
+ }
- for (String location : SyncopeConsoleSession.get().getSyncopeTO().getConnIdLocations()) {
- if (location.startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
- locations.add(URI.create(location));
+ return Pair.of(connectorServers, filePaths);
}
- }
-
- return locations;
- }
- };
+ };
private enum SupportedOperation {
@@ -203,32 +214,33 @@ public class Topology extends BasePage {
// -----------------------------------------
// Add Zoom panel
// -----------------------------------------
- final ActionLinksPanel zoomActionPanel = new ActionLinksPanel("zoom", new Model<String>(), getPageReference());
- add(zoomActionPanel);
+ final ActionLinksPanel.Builder<Serializable> zoomActionPanel = ActionLinksPanel.builder(getPageReference());
- zoomActionPanel.add(new ActionLink() {
+ zoomActionPanel.add(new ActionLink<Serializable>() {
private static final long serialVersionUID = -3722207913631435501L;
@Override
- public void onClick(final AjaxRequestTarget target) {
+ public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
target.appendJavaScript("zoomIn($('#drawing')[0]);");
}
- }, ActionLink.ActionType.ZOOM_IN, Entitlement.RESOURCE_LIST).add(new ActionLink() {
+ }, ActionLink.ActionType.ZOOM_IN, Entitlement.RESOURCE_LIST).add(new ActionLink<Serializable>() {
private static final long serialVersionUID = -3722207913631435501L;
@Override
- public void onClick(final AjaxRequestTarget target) {
+ public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
target.appendJavaScript("zoomOut($('#drawing')[0]);");
}
}, ActionLink.ActionType.ZOOM_OUT, Entitlement.RESOURCE_LIST);
+
+ add(zoomActionPanel.build("zoom"));
// -----------------------------------------
// -----------------------------------------
// Add Syncope (root topologynode)
// -----------------------------------------
- final TopologyNode syncopeTopologyNode = new TopologyNode("Syncope", "Syncope", TopologyNode.Kind.SYNCOPE);
+ final TopologyNode syncopeTopologyNode = new TopologyNode(ROOT_NAME, ROOT_NAME, TopologyNode.Kind.SYNCOPE);
syncopeTopologyNode.setX(origX);
syncopeTopologyNode.setY(origY);
@@ -250,11 +262,11 @@ public class Topology extends BasePage {
// -----------------------------------------
// Add Connector Servers
// -----------------------------------------
- final ListView<URI> connectorServers = new ListView<URI>("connectorServers", csModel) {
+ final ListView<URI> connectorServers = new ListView<URI>("connectorServers", csModel.getObject().getLeft()) {
private static final long serialVersionUID = 6978621871488360380L;
- private final int size = csModel.getObject().size() + 1;
+ private final int size = csModel.getObject().getLeft().size() + 1;
@Override
protected void populateItem(final ListItem<URI> item) {
@@ -287,102 +299,114 @@ public class Topology extends BasePage {
// -----------------------------------------
// -----------------------------------------
- // Add Connector Intances (first level)
+ // Add File Paths
// -----------------------------------------
- final ListView<ConnInstanceTO> conn1 = new ListView<ConnInstanceTO>("conn1", connModel.getObject().getLeft()) {
+ final ListView<URI> filePaths = new ListView<URI>("filePaths", csModel.getObject().getRight()) {
- private static final long serialVersionUID = 6978621871488360381L;
+ private static final long serialVersionUID = 6978621871488360380L;
- private final int size = connModel.getObject().getLeft().size() + 1;
+ private final int size = csModel.getObject().getRight().size() + 1;
@Override
- protected void populateItem(final ListItem<ConnInstanceTO> item) {
- int kx = size >= 6 ? 800 : (130 * size);
+ protected void populateItem(final ListItem<URI> item) {
+ int kx = size >= 4 ? 800 : (200 * size);
int x = (int) Math.round(origX + kx * Math.cos(Math.PI * (item.getIndex() + 1) / size));
int y = (int) Math.round(origY + 100 * Math.sin(Math.PI * (item.getIndex() + 1) / size));
- final ConnInstanceTO conn = item.getModelObject();
- final TopologyNode topologynode = new TopologyNode(
- Long.valueOf(conn.getKey()), conn.getDisplayName(), TopologyNode.Kind.CONNECTOR);
- topologynode.setConnectinDisplayName(conn.getBundleName());
+ final URI location = item.getModelObject();
+ final String url = location.toASCIIString();
+
+ final TopologyNode topologynode = new TopologyNode(url, url, TopologyNode.Kind.FS_PATH);
+
+ topologynode.setHost(location.getHost());
+ topologynode.setPort(location.getPort());
topologynode.setX(x);
topologynode.setY(y);
- connectors.put(Long.class.cast(topologynode.getKey()), topologynode);
-
- item.add(topologyNodePanel("conn", topologynode));
+ servers.put(String.class.cast(topologynode.getKey()), topologynode);
- if (conn.getLocation().startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
- final Map<Serializable, TopologyNode> remoteConnections;
+ item.add(topologyNodePanel("fp", topologynode));
- if (connections.containsKey(conn.getLocation())) {
- remoteConnections = connections.get(conn.getLocation());
- } else {
- remoteConnections = new HashMap<>();
- connections.put(conn.getLocation(), remoteConnections);
- }
- remoteConnections.put(conn.getKey(), topologynode);
- } else {
- syncopeConnections.put(conn.getKey(), topologynode);
- }
+ syncopeConnections.put(url, topologynode);
+ connections.put(url, new HashMap<Serializable, TopologyNode>());
}
};
- conn1.setOutputMarkupId(true);
- add(conn1);
+ filePaths.setOutputMarkupId(true);
+ add(filePaths);
// -----------------------------------------
// -----------------------------------------
- // Add Connector Intances (second level)
+ // Add Connector Intances
// -----------------------------------------
- final ListView<ConnInstanceTO> conn2 = new ListView<ConnInstanceTO>("conn2", connModel.getObject().getRight()) {
+ final List<List<ConnInstanceTO>> allConns = new ArrayList<>(connModel.getObject().values());
- private static final long serialVersionUID = 6978621871488360381L;
+ final ListView<List<ConnInstanceTO>> conns = new ListView<List<ConnInstanceTO>>("conns", allConns) {
- private final int size = connModel.getObject().getRight().size() + 1;
+ private static final long serialVersionUID = 697862187148836036L;
@Override
- protected void populateItem(final ListItem<ConnInstanceTO> item) {
- final ConnInstanceTO conn = item.getModelObject();
+ protected void populateItem(final ListItem<List<ConnInstanceTO>> item) {
- final TopologyNode parent = servers.get(conn.getLocation());
+ final int size = item.getModelObject().size() + 1;
- int kx = size >= 6 ? 800 : (130 * size);
+ final ListView<ConnInstanceTO> conns = new ListView<ConnInstanceTO>("conns", item.getModelObject()) {
- int x = (int) Math.round((parent == null ? origX : parent.getX())
- + kx * Math.cos(Math.PI + Math.PI * (item.getIndex() + 1) / size));
- int y = (int) Math.round((parent == null ? origY : parent.getY())
- + 100 * Math.sin(Math.PI + Math.PI * (item.getIndex() + 1) / size));
+ private static final long serialVersionUID = 6978621871488360381L;
- final TopologyNode topologynode = new TopologyNode(
- Long.valueOf(conn.getKey()), conn.getDisplayName(), TopologyNode.Kind.CONNECTOR);
- topologynode.setConnectinDisplayName(conn.getBundleName());
- topologynode.setX(x);
- topologynode.setY(y);
+ @Override
+ protected void populateItem(final ListItem<ConnInstanceTO> item) {
+ final ConnInstanceTO conn = item.getModelObject();
- connectors.put(Long.class.cast(topologynode.getKey()), topologynode);
+ final TopologyNode topologynode = new TopologyNode(
+ Long.valueOf(conn.getKey()), conn.getDisplayName(), TopologyNode.Kind.CONNECTOR);
- item.add(topologyNodePanel("conn", topologynode));
+ // Define the parent note
+ final TopologyNode parent = servers.get(conn.getLocation());
- if (conn.getLocation().startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
- final Map<Serializable, TopologyNode> remoteConnections;
+ // Set the position
+ int kx = size >= 6 ? 800 : (130 * size);
- if (connections.containsKey(conn.getLocation())) {
- remoteConnections = connections.get(conn.getLocation());
- } else {
- remoteConnections = new HashMap<>();
- connections.put(conn.getLocation(), remoteConnections);
+ final double hpos;
+ if (conn.getLocation().startsWith(CONNECTOR_SERVER_LOCATION_PREFIX)) {
+ hpos = Math.PI;
+ } else {
+ hpos = 0.0;
+ }
+
+ int x = (int) Math.round((parent == null ? origX : parent.getX())
+ + kx * Math.cos(hpos + Math.PI * (item.getIndex() + 1) / size));
+ int y = (int) Math.round((parent == null ? origY : parent.getY())
+ + 100 * Math.sin(hpos + Math.PI * (item.getIndex() + 1) / size));
+
+ topologynode.setConnectionDisplayName(conn.getBundleName());
+ topologynode.setX(x);
+ topologynode.setY(y);
+
+ connectors.put(Long.class.cast(topologynode.getKey()), topologynode);
+ item.add(topologyNodePanel("conn", topologynode));
+
+ // Update connections
+ final Map<Serializable, TopologyNode> remoteConnections;
+
+ if (connections.containsKey(conn.getLocation())) {
+ remoteConnections = connections.get(conn.getLocation());
+ } else {
+ remoteConnections = new HashMap<>();
+ connections.put(conn.getLocation(), remoteConnections);
+ }
+ remoteConnections.put(conn.getKey(), topologynode);
}
- remoteConnections.put(conn.getKey(), topologynode);
- } else {
- syncopeConnections.put(conn.getKey(), topologynode);
- }
+ };
+
+ conns.setOutputMarkupId(true);
+ item.add(conns);
}
};
- conn2.setOutputMarkupId(true);
- add(conn2);
+ conns.setOutputMarkupId(true);
+ add(conns);
// -----------------------------------------
// -----------------------------------------
@@ -392,8 +416,6 @@ public class Topology extends BasePage {
for (ResourceTO resourceTO : resModel.getObject()) {
final TopologyNode topologynode = new TopologyNode(
resourceTO.getKey(), resourceTO.getKey(), TopologyNode.Kind.RESOURCE);
- topologynode.setX(origX);
- topologynode.setY(origY);
final Map<Serializable, TopologyNode> remoteConnections;
@@ -422,37 +444,37 @@ public class Topology extends BasePage {
final ListView<TopologyNode> innerListView = new ListView<TopologyNode>("resources",
new ArrayList<>(connections.get(connectorId).values())) {
- private static final long serialVersionUID = 1L;
-
- private final int size = getModelObject().size() + 1;
+ private static final long serialVersionUID = 1L;
- @Override
- protected void populateItem(final ListItem<TopologyNode> item) {
- final TopologyNode topologynode = item.getModelObject();
- final TopologyNode parent = connectors.get(connectorId);
+ private final int size = getModelObject().size() + 1;
- final double k;
+ @Override
+ protected void populateItem(final ListItem<TopologyNode> item) {
+ final TopologyNode topologynode = item.getModelObject();
+ final TopologyNode parent = connectors.get(connectorId);
- if (parent == null || parent.getY() < syncopeTopologyNode.getY()) {
- k = Math.PI;
- } else {
- k = 0.0;
- }
+ // Set position
+ int kx = size >= 16 ? 800 : (48 * size);
+ int ky = size < 4 ? 100 : size < 6 ? 350 : 750;
- int kx = size >= 16 ? 800 : (48 * size);
- int ky = size < 4 ? 100 : size < 6 ? 350 : 750;
+ final double hpos;
+ if (parent == null || parent.getY() < syncopeTopologyNode.getY()) {
+ hpos = Math.PI;
+ } else {
+ hpos = 0.0;
+ }
- int x = (int) Math.round((parent == null ? origX : parent.getX())
- + kx * Math.cos(k + Math.PI * (item.getIndex() + 1) / size));
- int y = (int) Math.round((parent == null ? origY : parent.getY())
- + ky * Math.sin(k + Math.PI * (item.getIndex() + 1) / size));
+ int x = (int) Math.round((parent == null ? origX : parent.getX())
+ + kx * Math.cos(hpos + Math.PI * (item.getIndex() + 1) / size));
+ int y = (int) Math.round((parent == null ? origY : parent.getY())
+ + ky * Math.sin(hpos + Math.PI * (item.getIndex() + 1) / size));
- topologynode.setX(x);
- topologynode.setY(y);
+ topologynode.setX(x);
+ topologynode.setY(y);
- item.add(topologyNodePanel("res", topologynode));
- }
- };
+ item.add(topologyNodePanel("res", topologynode));
+ }
+ };
innerListView.setOutputMarkupId(true);
item.add(innerListView);
@@ -466,7 +488,7 @@ public class Topology extends BasePage {
// -----------------------------------------
// Create connections
// -----------------------------------------
- final WebMarkupContainer jsPlace = new WebMarkupContainer("jsPlace");
+ final WebMarkupContainer jsPlace = new WebMarkupContainerNoVeil("jsPlace");
jsPlace.setOutputMarkupId(true);
add(jsPlace);
@@ -501,6 +523,24 @@ public class Topology extends BasePage {
}
});
// -----------------------------------------
+
+ newlyCreatedContainer = new WebMarkupContainer("newlyCreatedContainer");
+ newlyCreatedContainer.setOutputMarkupId(true);
+ add(newlyCreatedContainer);
+
+ newlyCreated = new ListView<TopologyNode>("newlyCreated", new ArrayList<TopologyNode>()) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void populateItem(final ListItem<TopologyNode> item) {
+ item.add(topologyNodePanel("el", item.getModelObject()));
+ }
+ };
+ newlyCreated.setOutputMarkupId(true);
+ newlyCreated.setReuseItems(true);
+
+ newlyCreatedContainer.add(newlyCreated);
}
private List<String> createConnections(final Map<Serializable, Map<Serializable, TopologyNode>> targets) {
@@ -517,9 +557,9 @@ public class Topology extends BasePage {
return list;
}
- private Panel topologyNodePanel(final String id, final TopologyNode node) {
+ private TopologyNodePanel topologyNodePanel(final String id, final TopologyNode node) {
- final Panel panel = new TopologyNodePanel(id, node, getPageReference(), modal);
+ final TopologyNodePanel panel = new TopologyNodePanel(id, node, getPageReference(), modal);
panel.setMarkupId(String.valueOf(node.getKey()));
panel.setOutputMarkupId(true);
@@ -538,24 +578,43 @@ public class Topology extends BasePage {
}
@Override
+ @SuppressWarnings("unchecked")
public void onEvent(final IEvent<?> event) {
super.onEvent(event);
- if (event.getPayload() instanceof ResourceCreateEvent) {
- final ResourceCreateEvent resourceCreateEvent = ResourceCreateEvent.class.cast(event.getPayload());
+ if (event.getPayload() instanceof CreateEvent) {
+ final CreateEvent resourceCreateEvent = CreateEvent.class.cast(event.getPayload());
+
+ final TopologyNode node = new TopologyNode(
+ resourceCreateEvent.getKey(),
+ resourceCreateEvent.getDisplayName(),
+ resourceCreateEvent.getKind());
+
+ ((List<TopologyNode>) newlyCreated.getModelObject()).add(node);
+ resourceCreateEvent.getTarget().add(newlyCreatedContainer);
+
resourceCreateEvent.getTarget().appendJavaScript(String.format(
"window.Wicket.WebSocket.send('"
+ "{\"kind\":\"%s\",\"target\":\"%s\",\"source\":\"%s\",\"scope\":\"%s\"}"
+ "');",
SupportedOperation.ADD_ENDPOINT,
- resourceCreateEvent.getResourceTO().getKey(),
- resourceCreateEvent.getResourceTO().getConnector(),
- TopologyNode.Kind.RESOURCE));
+ resourceCreateEvent.getKey(),
+ resourceCreateEvent.getParent(),
+ resourceCreateEvent.getKind()));
}
}
- @Override
- public String getAjaxIndicatorMarkupId() {
- return StringUtils.EMPTY;
+ private static class WebMarkupContainerNoVeil extends WebMarkupContainer implements IAjaxIndicatorAware {
+
+ private static final long serialVersionUID = 1L;
+
+ public WebMarkupContainerNoVeil(final String id) {
+ super(id);
+ }
+
+ @Override
+ public String getAjaxIndicatorMarkupId() {
+ return StringUtils.EMPTY;
+ }
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNode.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNode.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNode.java
index f7c8aaa..ab727a0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNode.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNode.java
@@ -27,6 +27,7 @@ public class TopologyNode implements Serializable {
RESOURCE,
CONNECTOR,
CONNECTOR_SERVER,
+ FS_PATH,
SYNCOPE
}
@@ -76,8 +77,8 @@ public class TopologyNode implements Serializable {
return connectionDisplayName;
}
- public void setConnectinDisplayName(final String connectinDisplayName) {
- this.connectionDisplayName = connectinDisplayName;
+ public void setConnectionDisplayName(final String connectionDisplayName) {
+ this.connectionDisplayName = connectionDisplayName;
}
public Kind getKind() {
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java
index 478260e..3dc7c48 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/TopologyNodePanel.java
@@ -27,11 +27,13 @@ import org.apache.syncope.client.console.rest.ConnectorRestClient;
import org.apache.syncope.client.console.rest.ResourceRestClient;
import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxLink;
import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.to.ConnInstanceTO;
import org.apache.syncope.common.lib.to.ResourceTO;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.PageReference;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
+import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Fragment;
@@ -72,20 +74,29 @@ public class TopologyNodePanel extends Panel {
switch (node.getKind()) {
case SYNCOPE:
title = "";
- add(getSyncopeFragment(node, pageRef));
+ add(getSyncopeFragment());
+ add(new AttributeAppender("class", "topology_root", " "));
break;
case CONNECTOR_SERVER:
title = node.getDisplayName();
- add(getConnectorServerFragment(node, pageRef));
+ add(getLocationFragment(node, pageRef));
+ add(new AttributeAppender("class", "topology_cs", " "));
+ break;
+ case FS_PATH:
+ title = node.getDisplayName();
+ add(getLocationFragment(node, pageRef));
+ add(new AttributeAppender("class", "topology_cs", " "));
break;
case CONNECTOR:
title = (StringUtils.isBlank(node.getConnectionDisplayName())
? "" : node.getConnectionDisplayName() + ":") + node.getDisplayName();
add(getConnectorFragment(node, pageRef));
+ add(new AttributeAppender("class", "topology_conn", " "));
break;
default:
title = node.getDisplayName().length() > 20 ? node.getDisplayName() : "";
add(getResurceFragment(node, pageRef));
+ add(new AttributeAppender("class", "topology_res", " "));
}
if (StringUtils.isNotEmpty(title)) {
@@ -97,20 +108,34 @@ public class TopologyNodePanel extends Panel {
this.modal = modal;
}
- private Fragment getSyncopeFragment(final TopologyNode node, final PageReference pageRef) {
- final Fragment fragment = new Fragment("actions", "syncopeActions", this);
- fragment.setOutputMarkupId(true);
- return fragment;
+ private Fragment getSyncopeFragment() {
+ return new Fragment("actions", "syncopeActions", this);
}
- private Fragment getConnectorServerFragment(final TopologyNode node, final PageReference pageRef) {
- final Fragment fragment = new Fragment("actions", "syncopeActions", this);
+ private Fragment getLocationFragment(final TopologyNode node, final PageReference pageRef) {
+ final Fragment fragment = new Fragment("actions", "locationActions", this);
+
+ final AjaxLink<String> create = new ClearIndicatingAjaxLink<String>("create", pageRef) {
+
+ private static final long serialVersionUID = 3776750333491622263L;
+
+ @Override
+ public void onClickInternal(final AjaxRequestTarget target) {
+
+ final ConnInstanceTO connectorTO = new ConnInstanceTO();
+ connectorTO.setLocation(node.getKey().toString());
+ modal.setContent(new ConnectorModal(modal, pageRef, connectorTO));
+ modal.setTitle(MessageFormat.format(getString("connector.new"), node.getKey()));
+ modal.show(target);
+ }
+ };
+ fragment.add(create);
+
return fragment;
}
private Fragment getConnectorFragment(final TopologyNode node, final PageReference pageRef) {
- final Fragment fragment = new Fragment("actions", "connectorWithNoResourceActions", this);
- fragment.setOutputMarkupId(true);
+ final Fragment fragment = new Fragment("actions", "connectorActions", this);
final AjaxLink<String> delete = new ClearIndicatingAjaxLink<String>("delete", pageRef) {
@@ -139,9 +164,7 @@ public class TopologyNodePanel extends Panel {
final ResourceTO resourceTO = new ResourceTO();
resourceTO.setConnector(Long.class.cast(node.getKey()));
resourceTO.setConnectorDisplayName(node.getDisplayName());
-
modal.setContent(new ResourceModal(modal, pageRef, resourceTO, true));
-
modal.setTitle(getString("resource.new"));
modal.show(target);
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractFieldPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractFieldPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractFieldPanel.java
index 30bb47c..41643ea 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractFieldPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AbstractFieldPanel.java
@@ -36,5 +36,5 @@ public abstract class AbstractFieldPanel<T> extends Panel {
super(id, model);
}
- public abstract AbstractFieldPanel setModelObject(T object);
+ public abstract AbstractFieldPanel<T> setModelObject(T object);
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
index 71bcc0f..ec405a2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLink.java
@@ -21,14 +21,27 @@ package org.apache.syncope.client.console.wicket.markup.html.form;
import java.io.Serializable;
import org.apache.wicket.ajax.AjaxRequestTarget;
-public abstract class ActionLink implements Serializable {
+public abstract class ActionLink<T> implements Serializable {
private static final long serialVersionUID = 7031329706998320639L;
private boolean reloadFeedbackPanel = true;
+ private T modelObject;
+
+ public ActionLink() {
+ }
+
+ public ActionLink(final T modelObject) {
+ this.modelObject = modelObject;
+ }
+
public enum ActionType {
+ MAPPING("update"),
+ ACCOUNT_LINK("update"),
+ RESET_TIME("update"),
+ CLONE("create"),
CREATE("create"),
EDIT("read"),
USER_TEMPLATE("read"),
@@ -69,7 +82,11 @@ public abstract class ActionLink implements Serializable {
}
}
- public abstract void onClick(final AjaxRequestTarget target);
+ public T getModelObject() {
+ return modelObject;
+ }
+
+ public abstract void onClick(final AjaxRequestTarget target, final T modelObject);
public void postClick() {
}
@@ -78,7 +95,7 @@ public abstract class ActionLink implements Serializable {
return reloadFeedbackPanel;
}
- public ActionLink feedbackPanelAutomaticReload(final boolean reloadFeedbackPanel) {
+ public ActionLink<T> feedbackPanelAutomaticReload(final boolean reloadFeedbackPanel) {
this.reloadFeedbackPanel = reloadFeedbackPanel;
return this;
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
index 433f9f5..868f6a2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/ActionLinksPanel.java
@@ -18,6 +18,11 @@
*/
package org.apache.syncope.client.console.wicket.markup.html.form;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.apache.commons.lang3.tuple.Triple;
import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxLink;
import org.apache.syncope.client.console.wicket.ajax.markup.html.IndicatingOnConfirmAjaxLink;
import org.apache.wicket.PageReference;
@@ -26,24 +31,34 @@ import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDa
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
/**
* This empty class must exist because there not seems to be alternative to provide specialized HTML for edit links.
+ *
+ * @param <T> model object type.
*/
-public class ActionLinksPanel extends Panel {
+public final class ActionLinksPanel<T extends Serializable> extends Panel {
private static final long serialVersionUID = 322966537010107771L;
private final PageReference pageRef;
- public ActionLinksPanel(final String componentId, final IModel<?> model, final PageReference pageRef) {
+ private final IModel<T> model;
+
+ private ActionLinksPanel(final String componentId, final IModel<T> model, final PageReference pageRef) {
super(componentId, model);
+ this.model = model;
this.pageRef = pageRef;
super.add(new Fragment("panelClaim", "emptyFragment", this));
super.add(new Fragment("panelManageResources", "emptyFragment", this));
super.add(new Fragment("panelManageUsers", "emptyFragment", this));
super.add(new Fragment("panelManageGroups", "emptyFragment", this));
+ super.add(new Fragment("panelMapping", "emptyFragment", this));
+ super.add(new Fragment("panelAccountLink", "emptyFragment", this));
+ super.add(new Fragment("panelResetTime", "emptyFragment", this));
+ super.add(new Fragment("panelClone", "emptyFragment", this));
super.add(new Fragment("panelCreate", "emptyFragment", this));
super.add(new Fragment("panelEdit", "emptyFragment", this));
super.add(new Fragment("panelReset", "emptyFragment", this));
@@ -68,29 +83,13 @@ public class ActionLinksPanel extends Panel {
super.add(new Fragment("panelProvision", "emptyFragment", this));
super.add(new Fragment("panelZoomIn", "emptyFragment", this));
super.add(new Fragment("panelZoomOut", "emptyFragment", this));
-
- }
-
- public ActionLinksPanel add(
- final ActionLink link, final ActionLink.ActionType type, final String entitlements) {
-
- return addWithRoles(link, type, entitlements, true);
}
- public ActionLinksPanel add(
- final ActionLink link, final ActionLink.ActionType type, final String entitlement, final boolean enabled) {
-
- return addWithRoles(link, type, entitlement, enabled);
- }
-
- public ActionLinksPanel addWithRoles(
- final ActionLink link, final ActionLink.ActionType type, final String entitlements) {
-
- return addWithRoles(link, type, entitlements, true);
- }
-
- public ActionLinksPanel addWithRoles(
- final ActionLink link, final ActionLink.ActionType type, final String entitlements, final boolean enabled) {
+ public ActionLinksPanel<T> add(
+ final ActionLink<T> link,
+ final ActionLink.ActionType type,
+ final String entitlements,
+ final boolean enabled) {
Fragment fragment = null;
@@ -105,7 +104,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -119,7 +118,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -133,7 +132,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -147,7 +146,63 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
+ }
+ }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
+ break;
+
+ case MAPPING:
+ fragment = new Fragment("panelMapping", "fragmentMapping", this);
+
+ fragment.addOrReplace(new ClearIndicatingAjaxLink<Void>("mappingLink", pageRef) {
+
+ private static final long serialVersionUID = -7978723352517770644L;
+
+ @Override
+ protected void onClickInternal(final AjaxRequestTarget target) {
+ link.onClick(target, model.getObject());
+ }
+ }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
+ break;
+
+ case ACCOUNT_LINK:
+ fragment = new Fragment("panelAccountLink", "fragmentAccountLink", this);
+
+ fragment.addOrReplace(new ClearIndicatingAjaxLink<Void>("accountLinkLink", pageRef) {
+
+ private static final long serialVersionUID = -7978723352517770644L;
+
+ @Override
+ protected void onClickInternal(final AjaxRequestTarget target) {
+ link.onClick(target, model.getObject());
+ }
+ }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
+ break;
+
+ case RESET_TIME:
+ fragment = new Fragment("panelResetTime", "fragmentResetTime", this);
+
+ fragment.addOrReplace(new ClearIndicatingAjaxLink<Void>("resetTimeLink", pageRef) {
+
+ private static final long serialVersionUID = -7978723352517770644L;
+
+ @Override
+ protected void onClickInternal(final AjaxRequestTarget target) {
+ link.onClick(target, model.getObject());
+ }
+ }.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
+ break;
+
+ case CLONE:
+ fragment = new Fragment("panelClone", "fragmentClone", this);
+
+ fragment.addOrReplace(new ClearIndicatingAjaxLink<Void>("cloneLink", pageRef) {
+
+ private static final long serialVersionUID = -7978723352517770644L;
+
+ @Override
+ protected void onClickInternal(final AjaxRequestTarget target) {
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -161,7 +216,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -175,7 +230,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
});
break;
@@ -189,7 +244,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -203,7 +258,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -217,7 +272,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -231,7 +286,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -245,7 +300,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -259,7 +314,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -273,7 +328,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -287,7 +342,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
@@ -302,7 +357,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
@@ -317,7 +372,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -331,7 +386,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -345,7 +400,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -359,7 +414,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -373,7 +428,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -388,7 +443,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -402,7 +457,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -417,7 +472,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -431,7 +486,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -446,7 +501,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -460,7 +515,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -473,7 +528,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -486,7 +541,7 @@ public class ActionLinksPanel extends Panel {
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- link.onClick(target);
+ link.onClick(target, model.getObject());
}
}.feedbackPanelAutomaticReload(link.feedbackPanelAutomaticReload()));
break;
@@ -521,6 +576,22 @@ public class ActionLinksPanel extends Panel {
super.addOrReplace(new Fragment("panelManageGroups", "emptyFragment", this));
break;
+ case MAPPING:
+ super.addOrReplace(new Fragment("panelMapping", "emptyFragment", this));
+ break;
+
+ case ACCOUNT_LINK:
+ super.addOrReplace(new Fragment("panelAccountLink", "emptyFragment", this));
+ break;
+
+ case RESET_TIME:
+ super.addOrReplace(new Fragment("panelResetTime", "emptyFragment", this));
+ break;
+
+ case CLONE:
+ super.addOrReplace(new Fragment("panelClone", "emptyFragment", this));
+ break;
+
case CREATE:
super.addOrReplace(new Fragment("panelCreate", "emptyFragment", this));
break;
@@ -606,4 +677,92 @@ public class ActionLinksPanel extends Panel {
// do nothing
}
}
+
+ public static <T extends Serializable> Builder<T> builder(final PageReference pageRef) {
+ return new Builder<T>(pageRef);
+ }
+
+ /**
+ * ActionLinksPanel builder.
+ *
+ * @param <T> model object type.
+ */
+ public static final class Builder<T extends Serializable> implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ private final Map<ActionLink.ActionType, Triple<ActionLink<T>, String, Boolean>> actions = new HashMap<>();
+
+ private final PageReference pageRef;
+
+ private Builder(final PageReference pageRef) {
+ this.pageRef = pageRef;
+ }
+
+ public Builder<T> add(
+ final ActionLink<T> link,
+ final ActionLink.ActionType type,
+ final String entitlements) {
+
+ return addWithRoles(link, type, entitlements, true);
+ }
+
+ public Builder<T> add(
+ final ActionLink<T> link,
+ final ActionLink.ActionType type,
+ final String entitlement,
+ final boolean enabled) {
+
+ return addWithRoles(link, type, entitlement, enabled);
+ }
+
+ public Builder<T> addWithRoles(
+ final ActionLink<T> link,
+ final ActionLink.ActionType type,
+ final String entitlements) {
+
+ return addWithRoles(link, type, entitlements, true);
+ }
+
+ public Builder<T> addWithRoles(
+ final ActionLink<T> link,
+ final ActionLink.ActionType type,
+ final String entitlements,
+ final boolean enabled) {
+ actions.put(type, Triple.of(link, entitlements, enabled));
+ return this;
+ }
+
+ /**
+ * Use this method to build an ation panel without any model reference.
+ *
+ * @param id Component id.
+ * @return Action link panel.
+ */
+ public ActionLinksPanel<T> build(final String id) {
+ return build(id, null);
+ }
+
+ /**
+ * Use this methos to build an action panel including a model reference.
+ *
+ * @param id Component id.
+ * @param modelObject model object.
+ * @return Action link panel.
+ */
+ public ActionLinksPanel<T> build(final String id, final T modelObject) {
+ final ActionLinksPanel<T> panel = modelObject == null
+ ? new ActionLinksPanel<T>(id, new Model<T>(), this.pageRef)
+ : new ActionLinksPanel<T>(id, new Model<T>(modelObject), this.pageRef);
+
+ for (Entry<ActionLink.ActionType, Triple<ActionLink<T>, String, Boolean>> action : actions.entrySet()) {
+ panel.add(
+ action.getValue().getLeft(),
+ action.getKey(),
+ action.getValue().getMiddle(),
+ action.getValue().getRight());
+ }
+ return panel;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.java
index 3c5119b..dc7bfec 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/CheckBoxMultipleChoiceFieldPanel.java
@@ -19,6 +19,9 @@
package org.apache.syncope.client.console.wicket.markup.html.form;
import java.util.List;
+import org.apache.wicket.Component;
+import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.markup.html.form.AbstractChoice;
import org.apache.wicket.markup.html.form.CheckBoxMultipleChoice;
import org.apache.wicket.model.IModel;
@@ -35,7 +38,10 @@ public class CheckBoxMultipleChoiceFieldPanel<E> extends AbstractFieldPanel<List
super(id, model);
field = new CheckBoxMultipleChoice<E>("checkBoxMultipleChoice", model, choices);
- add(field);
+ add(field.
+ setPrefix("<div class=\"checkbox\">").
+ setSuffix("</div>").
+ setLabelPosition(AbstractChoice.LabelPosition.WRAP_AFTER));
}
@Override
@@ -43,4 +49,9 @@ public class CheckBoxMultipleChoiceFieldPanel<E> extends AbstractFieldPanel<List
field.setModelObject(object);
return this;
}
+
+ @Override
+ public Component add(final Behavior... behaviors) {
+ return field.add(behaviors);
+ }
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
new file mode 100644
index 0000000..d9a42c1
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizard.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2015 The Apache Software Foundation.
+ *
+ * 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 org.apache.syncope.client.console.wizards;
+
+import java.io.Serializable;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.wicket.Component;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.event.Broadcast;
+import org.apache.wicket.extensions.wizard.Wizard;
+import org.apache.wicket.request.cycle.RequestCycle;
+
+public abstract class AjaxWizard<T extends Serializable> extends Wizard {
+
+ private static final long serialVersionUID = 1L;
+
+ private final PageReference pageRef;
+
+ private final T item;
+
+ /**
+ * Construct.
+ *
+ * @param id The component id
+ * @param item
+ * @param pageRef Caller page reference.
+ */
+ public AjaxWizard(final String id, final T item, final PageReference pageRef) {
+ super(id);
+ this.item = item;
+ this.pageRef = pageRef;
+ setOutputMarkupId(true);
+ }
+
+ @Override
+ protected Component newButtonBar(final String id) {
+ return new AjaxWizardButtonBar(id, this);
+ }
+
+ protected abstract void onCancelInternal();
+
+ protected abstract void onApplyInternal();
+
+ /**
+ * @see org.apache.wicket.extensions.wizard.Wizard#onCancel()
+ */
+ @Override
+ public final void onCancel() {
+ onCancelInternal();
+ send(pageRef.getPage(), Broadcast.DEPTH,
+ new NewItemCancelEvent<T>(item, RequestCycle.get().find(AjaxRequestTarget.class)));
+ }
+
+ /**
+ * @see org.apache.wicket.extensions.wizard.Wizard#onFinish()
+ */
+ @Override
+ public final void onFinish() {
+ onApplyInternal();
+ send(pageRef.getPage(), Broadcast.DEPTH,
+ new NewItemFinishEvent<T>(item, RequestCycle.get().find(AjaxRequestTarget.class)));
+ }
+
+ public T getItem() {
+ return item;
+ }
+
+ public abstract static class NewItemEvent<T> {
+ private final T item;
+
+ private final AjaxRequestTarget target;
+
+ public NewItemEvent(final T item, final AjaxRequestTarget target) {
+ this.item = item;
+ this.target = target;
+ }
+
+ public T getItem() {
+ return item;
+ }
+
+ public AjaxRequestTarget getTarget() {
+ return target;
+ }
+ }
+
+ public static class NewItemCancelEvent<T> extends NewItemEvent<T> {
+
+ public NewItemCancelEvent(final T item, final AjaxRequestTarget target) {
+ super(item, target);
+ }
+
+ }
+
+ public static class NewItemFinishEvent<T> extends NewItemEvent<T> {
+
+ public NewItemFinishEvent(final T item, final AjaxRequestTarget target) {
+ super(item, target);
+ }
+
+ }
+
+ /**
+ *
+ * @return
+ */
+ @Override
+ public AjaxWizard<T> clone() {
+ return SerializationUtils.clone(this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButton.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButton.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButton.java
new file mode 100644
index 0000000..a581954
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButton.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2015 The Apache Software Foundation.
+ *
+ * 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 org.apache.syncope.client.console.wizards;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.extensions.wizard.IWizard;
+import org.apache.wicket.extensions.wizard.IWizardModel;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.ResourceModel;
+
+public abstract class AjaxWizardButton extends AjaxButton {
+
+ private static final long serialVersionUID = 1L;
+
+ private final IWizard wizard;
+
+ public AjaxWizardButton(
+ final String id,
+ final IWizard wizard,
+ final Form<?> form,
+ final String labelResourceKey,
+ final boolean formprocessing) {
+ super(id, form);
+ this.setLabel(new ResourceModel(labelResourceKey));
+ this.wizard = wizard;
+ setDefaultFormProcessing(formprocessing);
+ }
+
+ public AjaxWizardButton(final String id, final IWizard wizard, final String labelResourceKey) {
+ this(id, wizard, null, labelResourceKey, true);
+ }
+
+ public AjaxWizardButton(
+ final String id, final IWizard wizard, final String labelResourceKey, final boolean formprocessing) {
+ this(id, wizard, null, labelResourceKey, formprocessing);
+ }
+
+ protected final IWizard getWizard() {
+ return wizard;
+ }
+
+ protected final IWizardModel getWizardModel() {
+ return getWizard().getWizardModel();
+ }
+
+ @Override
+ protected final void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+ onClick(target, form);
+ }
+
+ protected abstract void onClick(final AjaxRequestTarget target, final Form<?> form);
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButtonBar.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButtonBar.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButtonBar.java
new file mode 100644
index 0000000..4f31a26
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/AjaxWizardButtonBar.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2015 The Apache Software Foundation.
+ *
+ * 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 org.apache.syncope.client.console.wizards;
+
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.wizard.IWizardModel;
+import org.apache.wicket.extensions.wizard.IWizardStep;
+import org.apache.wicket.extensions.wizard.Wizard;
+import org.apache.wicket.extensions.wizard.WizardButtonBar;
+import org.apache.wicket.markup.html.form.Form;
+
+public class AjaxWizardButtonBar extends WizardButtonBar {
+
+ private static final long serialVersionUID = 1L;
+
+ public AjaxWizardButtonBar(final String id, final Wizard wizard) {
+ super(id, wizard);
+
+ addOrReplace(new AjaxWizardButton("next", wizard, "next") {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onClick(final AjaxRequestTarget target, final Form<?> form) {
+ IWizardModel wizardModel = getWizardModel();
+ IWizardStep step = wizardModel.getActiveStep();
+
+ // let the step apply any state
+ step.applyState();
+
+ // if the step completed after applying the state, move the model onward
+ if (step.isComplete()) {
+ wizardModel.next();
+ } else {
+ error(getLocalizer().getString(
+ "org.apache.wicket.extensions.wizard.NextButton.step.did.not.complete", this));
+ }
+
+ target.add(wizard);
+ }
+
+ @Override
+ public final boolean isEnabled() {
+ return super.isEnabled() && getWizardModel().isNextAvailable();
+ }
+ });
+
+ addOrReplace(new AjaxWizardButton("previous", wizard, "prev", false) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onClick(final AjaxRequestTarget target, final Form<?> form) {
+ getWizardModel().previous();
+ target.add(wizard);
+ }
+
+ @Override
+ public final boolean isEnabled() {
+ return super.isEnabled() && getWizardModel().isPreviousAvailable();
+ }
+ });
+
+ addOrReplace(new AjaxWizardButton("cancel", wizard, "cancel", false) {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onClick(final AjaxRequestTarget target, final Form<?> form) {
+ getWizardModel().cancel();
+ target.add(wizard);
+ }
+
+ @Override
+ public final boolean isEnabled() {
+ return true;
+ }
+ });
+
+ addOrReplace(new AjaxWizardButton("finish", wizard, "finish") {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ protected void onClick(final AjaxRequestTarget target, final Form<?> form) {
+ getWizardModel().finish();
+ target.add(wizard);
+ }
+
+ @Override
+ public final boolean isEnabled() {
+ final IWizardStep activeStep = getWizardModel().getActiveStep();
+ return (activeStep != null) && getWizardModel().isLastStep(activeStep) && super.isEnabled();
+ }
+ });
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/java/org/apache/syncope/client/console/wizards/ProvisionWizard.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/ProvisionWizard.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/ProvisionWizard.java
new file mode 100644
index 0000000..6c3c8e0
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/ProvisionWizard.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2015 The Apache Software Foundation.
+ *
+ * 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 org.apache.syncope.client.console.wizards;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.client.console.panels.ResourceMappingPanel;
+import org.apache.syncope.common.lib.to.ProvisionTO;
+import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.extensions.wizard.WizardModel;
+import org.apache.wicket.extensions.wizard.WizardStep;
+import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
+import org.apache.wicket.model.StringResourceModel;
+
+public class ProvisionWizard extends AjaxWizard<ProvisionTO> {
+
+ private static final long serialVersionUID = 1L;
+
+ private final ResourceTO resourceTO;
+
+ /**
+ * The object type specification step.
+ */
+ private final class ObjectType extends WizardStep {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Construct.
+ */
+ public ObjectType() {
+ super(new ResourceModel("type.title", StringUtils.EMPTY),
+ new ResourceModel("type.summary", StringUtils.EMPTY), new Model<ProvisionTO>(getItem()));
+
+ add(new TextField<String>(
+ "type", new PropertyModel<String>(getItem(), "anyType")).setRequired(true));
+ add(new TextField<String>(
+ "class", new PropertyModel<String>(getItem(), "objectClass")).setRequired(true));
+ }
+ }
+
+ /**
+ * Mapping definition step.
+ */
+ private final class Mapping extends WizardStep {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Construct.
+ */
+ public Mapping() {
+ setTitleModel(new ResourceModel("mapping.title", "Mapping"));
+ setSummaryModel(new StringResourceModel("mapping.summary", this, new Model<ProvisionTO>(getItem())));
+
+ add(new ResourceMappingPanel("mapping", resourceTO, getItem()));
+ }
+ }
+
+ /**
+ * AccountLink specification step.
+ */
+ private final class AccountLink extends WizardStep {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Construct.
+ */
+ public AccountLink() {
+ super(new ResourceModel("link.title", StringUtils.EMPTY),
+ new ResourceModel("link.summary", StringUtils.EMPTY));
+ }
+ }
+
+ /**
+ * Construct.
+ *
+ * @param id The component id
+ * @param resourceTO external resource to be updated.
+ * @param pageRef Caller page reference.
+ */
+ public ProvisionWizard(final String id, final ResourceTO resourceTO, final PageReference pageRef) {
+ super(id, new ProvisionTO(), pageRef);
+ this.resourceTO = resourceTO;
+
+ setDefaultModel(new CompoundPropertyModel<ProvisionWizard>(this));
+
+ final WizardModel model = new WizardModel();
+ model.add(new ObjectType());
+ model.add(new Mapping());
+ model.add(new AccountLink());
+
+ init(model);
+ }
+
+ @Override
+ protected void onCancelInternal() {
+ // d nothing
+ }
+
+ @Override
+ protected void onApplyInternal() {
+ // do nothing
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
index 1b8e565..484382e 100644
--- a/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
+++ b/client/console/src/main/resources/META-INF/resources/css/syncopeConsole.css
@@ -17,129 +17,134 @@
* under the License.
*/
.feedbackPanel {
- padding-left: 0px;
- text-align: center;
+ padding-left: 0px;
+ text-align: center;
}
.notificationpanel_row {
- list-style-type: none;
+ list-style-type: none;
}
.notificationpanel_row span {
- border:0 none;
+ border:0 none;
}
pre {
- white-space: -moz-pre-wrap; /* Mozilla, supported since 1999 */
- white-space: -pre-wrap; /* Opera */
- white-space: -o-pre-wrap; /* Opera */
- white-space: pre-wrap; /* CSS3 - Text module (Candidate Recommendation) http://www.w3.org/TR/css3-text/#white-space */
- word-wrap: break-word; /* IE 5.5+ */
+ white-space: -moz-pre-wrap; /* Mozilla, supported since 1999 */
+ white-space: -pre-wrap; /* Opera */
+ white-space: -o-pre-wrap; /* Opera */
+ white-space: pre-wrap; /* CSS3 - Text module (Candidate Recommendation) http://www.w3.org/TR/css3-text/#white-space */
+ word-wrap: break-word; /* IE 5.5+ */
}
#veil {
- display:none;
- position:absolute;
- top:0;
- left:0;
- z-index:99999;
- background-color:black;
- width:100%;
- height:20000px;
- color:white;
- opacity:0.3;
- filter:alpha(opacity=30);
+ display:none;
+ position:absolute;
+ top:0;
+ left:0;
+ z-index:99999;
+ background-color:black;
+ width:100%;
+ height:20000px;
+ color:white;
+ opacity:0.3;
+ filter:alpha(opacity=30);
}
#veil img {
- position:absolute;
- top:300px;
- left:50%;
- margin-left:-75px;
- width:150px;
+ position:absolute;
+ top:300px;
+ left:50%;
+ margin-left:-75px;
+ width:150px;
}
.block-sidebar {
- max-height: 100%;
- overflow: auto;
- padding-top: 90px;
- padding-bottom: 50px;
- position: fixed;
+ max-height: 100%;
+ overflow: auto;
+ padding-top: 90px;
+ padding-bottom: 50px;
+ position: fixed;
}
.inner-control-sidebar {
- position: fixed;
- height: auto;
+ position: fixed;
+ height: auto;
}
.content-margin-layout {
- margin: 0px 230px 0px 0px !important;
- padding: 20px !important;
+ margin: 0px 230px 0px 0px !important;
+ padding: 20px !important;
}
.admin-content-page {
- padding: 20px;
- background: #ecf0f5
+ padding: 20px;
+ background: #ecf0f5
}
.realms {
- min-height: 554px
+ min-height: 554px
}
.actions > li > a {
- padding-top: 5px !important;
- padding-bottom: 5px !important;
+ padding-top: 5px !important;
+ padding-bottom: 5px !important;
+}
+
+div.listview-actions a{
+ float:left;
+ padding-right:8px
}
.block-header {
- position: fixed;
- width: 100%;
- top: 0;
+ position: fixed;
+ width: 100%;
+ top: 0;
}
.block-footer {
- position: fixed;
- width: 100%;
- bottom: 0px;
+ position: fixed;
+ width: 100%;
+ bottom: 0px;
}
.logo-pos {
- padding-top: 4px !important;
- overflow: visible !important;
+ padding-top: 4px !important;
+ overflow: visible !important;
}
.angle {
- border: medium none !important;
- cursor: pointer;
- display: inline-table !important;
- float: right;
- height: 30px;
- overflow: hidden;
- position: relative !important;
- right: 0;
- top: -30px;
- width: 25%;
- z-index: 3;
+ border: medium none !important;
+ cursor: pointer;
+ display: inline-table !important;
+ float: right;
+ height: 30px;
+ overflow: hidden;
+ position: relative !important;
+ right: 0;
+ top: -30px;
+ width: 25%;
+ z-index: 3;
}
@media (min-width: 768px) {
- .main-header .logo {
- height: 54px;
- }
+ .main-header .logo {
+ height: 54px;
+ }
}
.w_caption h3 {
- font-size: 16px;
+ font-size: 16px;
}
div.wicket-modal div.w_content_3 {
- border: 1px solid #eee;
- border-radius: 20px;
- padding: 5px;
+ border: 1px solid #eee;
+ border-radius: 20px;
+ padding: 5px;
}
.tab-content {
- margin-bottom: 10px;
- margin-top: 10px;
+ margin-bottom: 10px;
+ margin-top: 10px;
}
a.help {
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/META-INF/resources/js/topology.js
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/js/topology.js b/client/console/src/main/resources/META-INF/resources/js/topology.js
index f2a7ac3..9327b01 100644
--- a/client/console/src/main/resources/META-INF/resources/js/topology.js
+++ b/client/console/src/main/resources/META-INF/resources/js/topology.js
@@ -107,18 +107,24 @@ var enabledEndpointStyle = {
};
window.disable = function(targetName){
- jsPlumb.select({target:targetName}).setPaintStyle(disabledConnectorStyle).setHoverPaintStyle(disabledConnectorHoverStyle);
- jsPlumb.selectEndpoints({element: [targetName]}).setPaintStyle(disabledEndpointStyle);
+ jsPlumb.ready(function(){
+ jsPlumb.select({target:targetName}).setPaintStyle(disabledConnectorStyle).setHoverPaintStyle(disabledConnectorHoverStyle);
+ jsPlumb.selectEndpoints({element: [targetName]}).setPaintStyle(disabledEndpointStyle);
+ });
}
window.enable = function(targetName){
- jsPlumb.select({target:targetName}).setPaintStyle(enabledConnectorStyle).setHoverPaintStyle(enabledConnectorHoverStyle);
- jsPlumb.selectEndpoints({element: [targetName]}).setPaintStyle(enabledEndpointStyle);
+ jsPlumb.ready(function(){
+ jsPlumb.select({target:targetName}).setPaintStyle(enabledConnectorStyle).setHoverPaintStyle(enabledConnectorHoverStyle);
+ jsPlumb.selectEndpoints({element: [targetName]}).setPaintStyle(enabledEndpointStyle);
+ });
}
window.failure = function(targetName){
- jsPlumb.select({target:targetName}).setPaintStyle(failedConnectorStyle).setHoverPaintStyle(failedConnectorHoverStyle);
- jsPlumb.selectEndpoints({element: [targetName]}).setPaintStyle(failedEndpointStyle);
+ jsPlumb.ready(function(){
+ jsPlumb.select({target:targetName}).setPaintStyle(failedConnectorStyle).setHoverPaintStyle(failedConnectorHoverStyle);
+ jsPlumb.selectEndpoints({element: [targetName]}).setPaintStyle(failedEndpointStyle);
+ });
}
window.unknown = function(targetName){
@@ -221,61 +227,57 @@ window.zoomOut = function(el, instance, transformOrigin) {
};
window.connect = function(source, target, scope){
- if(jsPlumb.select({source:source, target:target, scope: scope}) !=null){
- jsPlumb.connect({source:source, target:target, scope: scope}, def);
- }
+ jsPlumb.ready(function(){
+ if(jsPlumb.select({source:source, target:target, scope: scope}) != null){
+ jsPlumb.connect({source:source, target:target, scope: scope}, def);
+ }
+ });
}
window.activate = function(zoom){
- jsPlumb.draggable(jsPlumb.getSelector(".window"));
- jsPlumb.setContainer("drawing");
-
- $("#drawing").draggable({
- containment: 'topology',
- cursor: 'move'
+ jsPlumb.ready(function(){
+ jsPlumb.draggable(jsPlumb.getSelector(".window"));
+ jsPlumb.setContainer("drawing");
+
+ jsPlumb.Defaults.MaxConnections = 1000;
+
+ $("#drawing").draggable({
+ containment: 'topology',
+ cursor: 'move'
+ });
+
+ var val = getTopology();
+ if(val.__zoom__ == null){
+ setZoom($("#drawing")[0], zoom);
+ } else {
+ setZoom($("#drawing")[0], val.__zoom__);
+ }
});
-
- var val = getTopology();
- if(val.__zoom__ == null){
- setZoom($("#drawing")[0], zoom);
- } else {
- setZoom($("#drawing")[0], val.__zoom__);
- }
}
window.checkConnection = function() {
- jsPlumb.select({scope:"CONNECTOR"}).each(function(connection) {
- Wicket.WebSocket.send("{ \"kind\":\"CHECK_CONNECTOR\", \"target\":\"" + connection.target.id + "\" }");
- });
- jsPlumb.select({scope:"RESOURCE"}).each(function(connection) {
- Wicket.WebSocket.send("{ \"kind\":\"CHECK_RESOURCE\", \"target\":\"" + connection.target.id + "\" }");
+ jsPlumb.ready(function(){
+ jsPlumb.select({scope:"CONNECTOR"}).each(function(connection) {
+ Wicket.WebSocket.send("{ \"kind\":\"CHECK_CONNECTOR\", \"target\":\"" + connection.target.id + "\" }");
+ });
+ jsPlumb.select({scope:"RESOURCE"}).each(function(connection) {
+ Wicket.WebSocket.send("{ \"kind\":\"CHECK_RESOURCE\", \"target\":\"" + connection.target.id + "\" }");
+ });
});
}
window.addEndpoint = function(source, target, scope) {
var sourceElement = $('#' + source);
- var element = sourceElement.clone();
- element.attr('id', target);
- element.removeAttr('data-original-title');
var top = parseFloat(sourceElement.css("top")) + 10;
var left = parseFloat(sourceElement.css("left")) - 150;
- if(scope == 'RESOURCE'){
- var style = 'topology_res';
- }else{
- var style = 'topology_conn';
- }
-
- element.attr('class', 'window jsplumb-draggable _jsPlumb_endpoint_anchor_ ' + style);
-
- element.find('p').text(target);
-
- $('#drawing').append(element);
setPosition(target, left, top);
-
- jsPlumb.draggable(element);
- jsPlumb.connect({ source:source, target:target, scope:scope }, def);
+
+ jsPlumb.ready(function(){
+ jsPlumb.draggable(jsPlumb.getSelector("#" + target));
+ jsPlumb.connect({ source:source, target:target, scope:scope }, def);
+ });
}
jsPlumb.importDefaults({
http://git-wip-us.apache.org/repos/asf/syncope/blob/ba7f1a5c/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionModal.html
new file mode 100644
index 0000000..99693e7
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/BeanReflectionModal.html
@@ -0,0 +1,30 @@
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you 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.
+-->
+<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
+ <wicket:extend>
+ <form wicket:id="form">
+ <div class="bean">
+ <span wicket:id="bean">[Complex]</span>
+ <div class="modal-footer">
+ <input type="submit" class="btn btn-primary" wicket:id="apply"/>
+ <input type="button" class="btn btn-default" wicket:id="cancel"/>
+ </div>
+ </form>
+ </wicket:extend>
+</html>