You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by md...@apache.org on 2015/08/28 18:40:42 UTC
[1/4] syncope git commit: Add AdminLTe theme provider,
new Modal dialog, new Realms tab
Repository: syncope
Updated Branches:
refs/heads/SYNCOPE-156 b2eda9980 -> 0419594e8
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/themes/js/AdminLTE-app.min.js
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/themes/js/AdminLTE-app.min.js b/client/console/src/main/resources/org/apache/syncope/client/console/themes/js/AdminLTE-app.min.js
new file mode 100644
index 0000000..e61cc0f
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/themes/js/AdminLTE-app.min.js
@@ -0,0 +1,13 @@
+/*! AdminLTE app.js
+ * ================
+ * Main JS application file for AdminLTE v2. This file
+ * should be included in all pages. It controls some layout
+ * options and implements exclusive AdminLTE plugins.
+ *
+ * @Author Almsaeed Studio
+ * @Support <http://www.almsaeedstudio.com>
+ * @Email <su...@almsaeedstudio.com>
+ * @version 2.1.0
+ * @license MIT <http://opensource.org/licenses/MIT>
+ */
+"use strict";function _init(){$.AdminLTE.layout={activate:function(){var a=this;a.fix(),a.fixSidebar(),$(window,".wrapper").resize(function(){a.fix(),a.fixSidebar()})},fix:function(){var a=$(".main-header").outerHeight()+$(".main-footer").outerHeight(),b=$(window).height(),c=$(".sidebar").height();if($("body").hasClass("fixed"))$(".content-wrapper, .right-side").css("min-height",b-$(".main-footer").outerHeight());else{var d;b>=c?($(".content-wrapper, .right-side").css("min-height",b-a),d=b-a):($(".content-wrapper, .right-side").css("min-height",c),d=c);var e=$($.AdminLTE.options.controlSidebarOptions.selector);"undefined"!=typeof e&&e.height()>d&&$(".content-wrapper, .right-side").css("min-height",e.height())}},fixSidebar:function(){return $("body").hasClass("fixed")?("undefined"==typeof $.fn.slimScroll&&console&&console.error("Error: the fixed layout requires the slimscroll plugin!"),void($.AdminLTE.options.sidebarSlimScroll&&"undefined"!=typeof $.fn.slimScroll&&($(".sidebar").slim
Scroll({destroy:!0}).height("auto"),$(".sidebar").slimscroll({height:$(window).height()-$(".main-header").height()+"px",color:"rgba(0,0,0,0.2)",size:"3px"})))):void("undefined"!=typeof $.fn.slimScroll&&$(".sidebar").slimScroll({destroy:!0}).height("auto"))}},$.AdminLTE.pushMenu={activate:function(a){var b=$.AdminLTE.options.screenSizes;$(a).on("click",function(a){a.preventDefault(),$(window).width()>b.sm-1?$("body").toggleClass("sidebar-collapse"):$("body").hasClass("sidebar-open")?($("body").removeClass("sidebar-open"),$("body").removeClass("sidebar-collapse")):$("body").addClass("sidebar-open")}),$(".content-wrapper").click(function(){$(window).width()<=b.sm-1&&$("body").hasClass("sidebar-open")&&$("body").removeClass("sidebar-open")}),($.AdminLTE.options.sidebarExpandOnHover||$("body").hasClass("fixed")&&$("body").hasClass("sidebar-mini"))&&this.expandOnHover()},expandOnHover:function(){var a=this,b=$.AdminLTE.options.screenSizes.sm-1;$(".main-sidebar").hover(function(){$("body")
.hasClass("sidebar-mini")&&$("body").hasClass("sidebar-collapse")&&$(window).width()>b&&a.expand()},function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-expanded-on-hover")&&$(window).width()>b&&a.collapse()})},expand:function(){$("body").removeClass("sidebar-collapse").addClass("sidebar-expanded-on-hover")},collapse:function(){$("body").hasClass("sidebar-expanded-on-hover")&&$("body").removeClass("sidebar-expanded-on-hover").addClass("sidebar-collapse")}},$.AdminLTE.tree=function(a){var b=this;$("li a",$(a)).on("click",function(a){var c=$(this),d=c.next();if(d.is(".treeview-menu")&&d.is(":visible"))d.slideUp("normal",function(){d.removeClass("menu-open")}),d.parent("li").removeClass("active");else if(d.is(".treeview-menu")&&!d.is(":visible")){var e=c.parents("ul").first(),f=e.find("ul:visible").slideUp("normal");f.removeClass("menu-open");var g=c.parent("li");d.slideDown("normal",function(){d.addClass("menu-open"),e.find("li.active").removeClass("active"),g.ad
dClass("active"),b.layout.fix()})}d.is(".treeview-menu")&&a.preventDefault()})},$.AdminLTE.controlSidebar={activate:function(){var a=this,b=$.AdminLTE.options.controlSidebarOptions,c=$(b.selector),d=$(b.toggleBtnSelector);d.on("click",function(d){d.preventDefault(),c.hasClass("control-sidebar-open")||$("body").hasClass("control-sidebar-open")?a.close(c,b.slide):a.open(c,b.slide)});var e=$(".control-sidebar-bg");a._fix(e),$("body").hasClass("fixed")?a._fixForFixed(c):$(".content-wrapper, .right-side").height()<c.height()&&a._fixForContent(c)},open:function(a,b){b?a.addClass("control-sidebar-open"):$("body").addClass("control-sidebar-open")},close:function(a,b){b?a.removeClass("control-sidebar-open"):$("body").removeClass("control-sidebar-open")},_fix:function(a){var b=this;$("body").hasClass("layout-boxed")?(a.css("position","absolute"),a.height($(".wrapper").height()),$(window).resize(function(){b._fix(a)})):a.css({position:"fixed",height:"auto"})},_fixForFixed:function(a){a.css({po
sition:"fixed","max-height":"100%",overflow:"auto","padding-bottom":"50px"})},_fixForContent:function(a){$(".content-wrapper, .right-side").css("min-height",a.height())}},$.AdminLTE.boxWidget={selectors:$.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,icons:$.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,activate:function(){var a=this;$(a.selectors.collapse).on("click",function(b){b.preventDefault(),a.collapse($(this))}),$(a.selectors.remove).on("click",function(b){b.preventDefault(),a.remove($(this))})},collapse:function(a){var b=this,c=a.parents(".box").first(),d=c.find("> .box-body, > .box-footer");c.hasClass("collapsed-box")?(a.children(":first").removeClass(b.icons.open).addClass(b.icons.collapse),d.slideDown(300,function(){c.removeClass("collapsed-box")})):(a.children(":first").removeClass(b.icons.collapse).addClass(b.icons.open),d.slideUp(300,function(){c.addClass("collapsed-box")}))},remove:function(a){var b=a.parents(".box").first();b.slideUp()}}}if("undefined"==ty
peof jQuery)throw new Error("AdminLTE requires jQuery");$.AdminLTE={},$.AdminLTE.options={navbarMenuSlimscroll:!0,navbarMenuSlimscrollWidth:"3px",navbarMenuHeight:"200px",sidebarToggleSelector:"[data-toggle='offcanvas']",sidebarPushMenu:!0,sidebarSlimScroll:!0,sidebarExpandOnHover:!1,enableBoxRefresh:!0,enableBSToppltip:!0,BSTooltipSelector:"[data-toggle='tooltip']",enableFastclick:!0,enableControlSidebar:!0,controlSidebarOptions:{toggleBtnSelector:"[data-toggle='control-sidebar']",selector:".control-sidebar",slide:!0},enableBoxWidget:!0,boxWidgetOptions:{boxWidgetIcons:{collapse:"fa-minus",open:"fa-plus",remove:"fa-times"},boxWidgetSelectors:{remove:'[data-widget="remove"]',collapse:'[data-widget="collapse"]'}},directChat:{enable:!0,contactToggleSelector:'[data-widget="chat-pane-toggle"]'},colors:{lightBlue:"#3c8dbc",red:"#f56954",green:"#00a65a",aqua:"#00c0ef",yellow:"#f39c12",blue:"#0073b7",navy:"#001F3F",teal:"#39CCCC",olive:"#3D9970",lime:"#01FF70",orange:"#FF851B",fuchsia:"#F0
12BE",purple:"#8E24AA",maroon:"#D81B60",black:"#222222",gray:"#d2d6de"},screenSizes:{xs:480,sm:768,md:992,lg:1200}},$(function(){"undefined"!=typeof AdminLTEOptions&&$.extend(!0,$.AdminLTE.options,AdminLTEOptions);var a=$.AdminLTE.options;_init(),$.AdminLTE.layout.activate(),$.AdminLTE.tree(".sidebar"),a.enableControlSidebar&&$.AdminLTE.controlSidebar.activate(),a.navbarMenuSlimscroll&&"undefined"!=typeof $.fn.slimscroll&&$(".navbar .menu").slimscroll({height:a.navbarMenuHeight,alwaysVisible:!1,size:a.navbarMenuSlimscrollWidth}).css("width","100%"),a.sidebarPushMenu&&$.AdminLTE.pushMenu.activate(a.sidebarToggleSelector),a.enableBSToppltip&&$("body").tooltip({selector:a.BSTooltipSelector}),a.enableBoxWidget&&$.AdminLTE.boxWidget.activate(),a.enableFastclick&&"undefined"!=typeof FastClick&&FastClick.attach(document.body),a.directChat.enable&&$(a.directChat.contactToggleSelector).on("click",function(){var a=$(this).parents(".direct-chat").first();a.toggleClass("direct-chat-contacts-ope
n")}),$('.btn-group[data-toggle="btn-toggle"]').each(function(){var a=$(this);$(this).find(".btn").on("click",function(b){a.find(".btn.active").removeClass("active"),$(this).addClass("active"),b.preventDefault()})})}),function(a){a.fn.boxRefresh=function(b){function c(a){a.append(f),e.onLoadStart.call(a)}function d(a){a.find(f).remove(),e.onLoadDone.call(a)}var e=a.extend({trigger:".refresh-btn",source:"",onLoadStart:function(a){},onLoadDone:function(a){}},b),f=a('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>');return this.each(function(){if(""===e.source)return void(console&&console.log("Please specify a source first - boxRefresh()"));var b=a(this),f=b.find(e.trigger).first();f.on("click",function(a){a.preventDefault(),c(b),b.find(".box-body").load(e.source,function(){d(b)})})})}}(jQuery),function(a){a.fn.todolist=function(b){var c=a.extend({onCheck:function(a){},onUncheck:function(a){}},b);return this.each(function(){"undefined"!=typeof a.fn.iCheck?(a("input
",this).on("ifChecked",function(b){var d=a(this).parents("li").first();d.toggleClass("done"),c.onCheck.call(d)}),a("input",this).on("ifUnchecked",function(b){var d=a(this).parents("li").first();d.toggleClass("done"),c.onUncheck.call(d)})):a("input",this).on("change",function(b){var d=a(this).parents("li").first();d.toggleClass("done"),c.onCheck.call(d)})})}}(jQuery);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/wicket/ajax/markup/html/navigation/paging/AjaxDataNavigationToolbar.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/ajax/markup/html/navigation/paging/AjaxDataNavigationToolbar.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/ajax/markup/html/navigation/paging/AjaxDataNavigationToolbar.html
new file mode 100644
index 0000000..7b7d593
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/ajax/markup/html/navigation/paging/AjaxDataNavigationToolbar.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<!--
+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="span">
+ <div class="row">
+ <div class="col-sm-5">
+ <div class="dataTables_info"><span wicket:id="navigatorLabel">[navigatorLabel]</span></div>
+ </div>
+ <div class="col-sm-7">
+ <div class="dataTables_paginate paging_simple_numbers"><ul wicket:id="navigator">[navigator]</ul></div>
+ </div>
+ </div>
+ </span>
+ </wicket:panel>
+</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.html
new file mode 100644
index 0000000..fe62bae
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.html
@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<!--
+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 class="modal-dialog" wicket:id="dialog">
+ <div class="modal-content">
+ <div wicket:id="header" class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+ <h4 wicket:id="header-label" class="modal-title">Modal header</h4>
+ </div>
+ <div class="modal-body">
+ <div wicket:id="container">
+ <span wicket:id="modalContent">[modalContent]</span>
+ </div>
+ </div>
+ <div class="modal-footer" wicket:id="footer">
+ <wicket:fragment wicket:id="buttons">
+ <button type="button" wicket:id="button"></button>
+ </wicket:fragment>
+ <wicket:fragment wicket:id="inputs">
+ <button wicket:id="input"><wicket:message key="submit"/></button>
+ </wicket:fragment>
+ </div>
+ </div>
+ </div>
+ </wicket:panel>
+</html>
+
+
+
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.properties
new file mode 100644
index 0000000..4d672e8
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.properties
@@ -0,0 +1,21 @@
+# 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.
+submit=Save
+add=Add
+remove=Delete
+cancel=Cancel
+createRealm=Create new realm
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal_it.properties
new file mode 100644
index 0000000..34c0fc4
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal_it.properties
@@ -0,0 +1,21 @@
+# 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.
+submit=Salva
+add=Aggiungi
+remove=Elimina
+cancel=Annulla
+createRealm=Crea nuovo realm
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal_pt_BR.properties
new file mode 100644
index 0000000..9c86bdc
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal_pt_BR.properties
@@ -0,0 +1,21 @@
+# 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.
+submit=Salvar
+add=Adicionar
+remove=Remover
+cancel=Cancelar
+createRealm=Criar novo dom\u00ednio
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.html
index e6f1d7c..c512d77 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.html
@@ -18,6 +18,10 @@ under the License.
-->
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<wicket:extend>
- <input type="text" class="ui-widget-content ui-corner-all long_dynamicsize" wicket:id="textField"/>
+ <div class="input-group">
+ <span id="basic-addon1" class="input-group-addon" wicket:id="label">[label]</span>
+ <input type="text" aria-describedby="basic-addon1" class="form-control" wicket:id="textField"/>
+ </div>
+ <br/>
</wicket:extend>
</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel_1.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel_1.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel_1.html
deleted file mode 100644
index e6f1d7c..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel_1.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-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>
- <input type="text" class="ui-widget-content ui-corner-all long_dynamicsize" wicket:id="textField"/>
- </wicket:extend>
-</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel_1.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel_1.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel_1.html
deleted file mode 100644
index 55a77e1..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel_1.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
-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:head></wicket:head>
- <wicket:panel>
-
- <wicket:fragment wicket:id="requiredFragment">
- <span wicket:id="requiredLabel"/>
- </wicket:fragment>
-
- <wicket:fragment wicket:id="notRequiredFragment">
- </wicket:fragment>
-
- <wicket:child />
-
- <span wicket:id="required"/>
- </wicket:panel>
-</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/LinkPanel_1.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/LinkPanel_1.html b/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/LinkPanel_1.html
deleted file mode 100644
index c4b75f0..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/wicket/markup/html/form/LinkPanel_1.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!--
-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.
--->
-<wicket:panel>
- <a href="#" wicket:id="link">
- <span wicket:id="linkTitle"/>
- </a>
-</wicket:panel>
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index a61c8c8..6e323f8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -376,6 +376,7 @@ 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>
+ <wicket-bootstrap.version>0.10.3</wicket-bootstrap.version>
<font-awesome.version>4.4.0</font-awesome.version>
<ionicons.version>2.0.1</ionicons.version>
<highlightjs.version>8.7</highlightjs.version>
@@ -880,6 +881,16 @@ under the License.
<artifactId>wicket-native-websocket-javax</artifactId>
<version>${wicket.version}</version>
</dependency>
+ <dependency>
+ <groupId>de.agilecoders.wicket</groupId>
+ <artifactId>wicket-bootstrap-core</artifactId>
+ <version>${wicket-bootstrap.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>de.agilecoders.wicket</groupId>
+ <artifactId>wicket-bootstrap-extensions</artifactId>
+ <version>${wicket-bootstrap.version}</version>
+ </dependency>
<!-- /Wicket -->
<dependency>
@@ -974,8 +985,8 @@ under the License.
<artifactId>jquery-cookie</artifactId>
<version>${jquery-cookie.version}</version>
</dependency>
-
-
+
+
<dependency>
<groupId>com.beust</groupId>
<artifactId>jcommander</artifactId>
[4/4] syncope git commit: Add AdminLTe theme provider,
new Modal dialog, new Realms tab
Posted by md...@apache.org.
Add AdminLTe theme provider, new Modal dialog, new Realms tab
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/0419594e
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/0419594e
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/0419594e
Branch: refs/heads/SYNCOPE-156
Commit: 0419594e89a7416470bd8950b1cc8cd75d023833
Parents: b2eda99
Author: Marco Di Sabatino Di Diodoro <md...@apache.org>
Authored: Fri Aug 28 18:37:47 2015 +0200
Committer: Marco Di Sabatino Di Diodoro <md...@apache.org>
Committed: Fri Aug 28 18:37:47 2015 +0200
----------------------------------------------------------------------
client/console/pom.xml | 16 +-
.../console/SyncopeConsoleApplication.java | 10 +
.../console/pages/EditRealmModalPage.java | 41 -
.../client/console/pages/RealmModalPage.java | 142 -
.../syncope/client/console/pages/Realms.java | 185 +-
.../console/panels/AbstractModalPanel.java | 120 +
.../panels/AbstractSearchResultPanel.java | 3 +-
.../console/panels/ActionDataTablePanel.java | 4 +-
.../console/panels/AjaxDataTablePanel.java | 13 +-
.../console/panels/AnySearchResultPanel.java | 16 +-
.../client/console/panels/DataTablePanel.java | 4 +-
.../console/panels/EditRealmModalPanel.java | 40 +
.../console/panels/FailureMessageModal.java | 40 +
.../client/console/panels/GroupModalPanel.java | 122 +
.../client/console/panels/GroupPanel.java | 75 +
.../console/panels/GroupSearchResultPanel.java | 64 +-
.../syncope/client/console/panels/Realm.java | 107 +-
.../client/console/panels/RealmDetails.java | 30 +-
.../client/console/panels/RealmModalPanel.java | 119 +
.../console/panels/UserSearchResultPanel.java | 7 +-
.../console/rest/AnyObjectRestClient.java | 17 +
.../client/console/rest/RealmRestClient.java | 2 +-
.../syncope/client/console/themes/AdminLTE.java | 44 +
.../themes/AdminLTECssResourceReference.java | 48 +
.../paging/AjaxDataNavigationToolbar.java | 52 +
.../data/table/AjaxFallbackDataTable.java | 51 +
.../buttons/DefaultModalCloseButton.java | 34 +
.../bootstrap/buttons/PrimaryModalButton.java | 35 +
.../markup/html/bootstrap/dialog/BaseModal.java | 110 +
.../markup/html/form/AjaxTextFieldPanel.java | 8 +-
.../wicket/markup/html/form/FieldPanel.java | 6 +
.../dataTables/dataTables.bootstrap.css | 369 ++
.../META-INF/resources/js/AdminLTE-app.min.js | 13 -
.../client/console/pages/BaseModalPage.html | 9 +-
.../syncope/client/console/pages/BasePage.html | 9 +-
.../syncope/client/console/pages/Login.html | 5 -
.../client/console/pages/RealmModalPage.html | 70 -
.../syncope/client/console/pages/Realms.html | 4 +-
.../console/panels/AbstractModalPanel.html | 45 +
.../panels/AbstractSearchResultPanel.html | 13 +-
.../console/panels/AnyAjaxTabbedPanel.html | 35 +
.../client/console/panels/GroupModalPanel.html | 52 +
.../console/panels/GroupModalPanel.properties | 48 +
.../panels/GroupModalPanel_it.properties | 50 +
.../panels/GroupModalPanel_pt_BR.properties | 48 +
.../client/console/panels/ModalContent.html | 34 +-
.../syncope/client/console/panels/Realm.html | 14 +-
.../client/console/panels/RealmDetails.html | 25 +-
.../client/console/panels/RealmModalPanel.html | 27 +
.../console/panels/ResourceModalPage.html | 56 +
.../console/panels/ResourceModalPage.properties | 60 +
.../client/console/themes/css/AdminLTE.css | 4366 ++++++++++++++++++
.../console/themes/js/AdminLTE-app.min.js | 13 +
.../paging/AjaxDataNavigationToolbar.html | 33 +
.../markup/html/bootstrap/dialog/BaseModal.html | 47 +
.../html/bootstrap/dialog/BaseModal.properties | 21 +
.../bootstrap/dialog/BaseModal_it.properties | 21 +
.../bootstrap/dialog/BaseModal_pt_BR.properties | 21 +
.../markup/html/form/AjaxTextFieldPanel.html | 6 +-
.../markup/html/form/AjaxTextFieldPanel_1.html | 23 -
.../wicket/markup/html/form/FieldPanel_1.html | 34 -
.../wicket/markup/html/form/LinkPanel_1.html | 23 -
pom.xml | 15 +-
63 files changed, 6553 insertions(+), 621 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/pom.xml
----------------------------------------------------------------------
diff --git a/client/console/pom.xml b/client/console/pom.xml
index 2a0f283..18f9a91 100644
--- a/client/console/pom.xml
+++ b/client/console/pom.xml
@@ -48,7 +48,7 @@ under the License.
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
-
+
<dependency>
<groupId>org.apache.wicket</groupId>
<artifactId>wicket</artifactId>
@@ -78,6 +78,14 @@ under the License.
<groupId>org.apache.wicket</groupId>
<artifactId>wicket-native-websocket-javax</artifactId>
</dependency>
+ <dependency>
+ <groupId>de.agilecoders.wicket</groupId>
+ <artifactId>wicket-bootstrap-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>de.agilecoders.wicket</groupId>
+ <artifactId>wicket-bootstrap-extensions</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
@@ -92,7 +100,7 @@ under the License.
<dependency>
<groupId>org.webjars</groupId>
- <artifactId>bootstrap</artifactId>
+ <artifactId>font-awesome</artifactId>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
@@ -100,10 +108,6 @@ under the License.
</dependency>
<dependency>
<groupId>org.webjars</groupId>
- <artifactId>font-awesome</artifactId>
- </dependency>
- <dependency>
- <groupId>org.webjars</groupId>
<artifactId>ionicons</artifactId>
</dependency>
<dependency>
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
index 2bff477..9c5a1d8 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
@@ -18,6 +18,10 @@
*/
package org.apache.syncope.client.console;
+import de.agilecoders.wicket.core.Bootstrap;
+import de.agilecoders.wicket.core.settings.BootstrapSettings;
+import de.agilecoders.wicket.core.settings.IBootstrapSettings;
+import de.agilecoders.wicket.core.settings.SingleThemeProvider;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -29,6 +33,7 @@ import org.apache.syncope.client.console.pages.Login;
import org.apache.syncope.client.console.resources.FilesystemResource;
import org.apache.syncope.client.console.resources.WorkflowDefGETResource;
import org.apache.syncope.client.console.resources.WorkflowDefPUTResource;
+import org.apache.syncope.client.console.themes.AdminLTE;
import org.apache.wicket.Page;
import org.apache.wicket.authroles.authentication.AbstractAuthenticatedWebSession;
import org.apache.wicket.authroles.authentication.AuthenticatedWebApplication;
@@ -61,7 +66,12 @@ public class SyncopeConsoleApplication extends AuthenticatedWebApplication {
@Override
protected void init() {
super.init();
+ IBootstrapSettings settings = new BootstrapSettings();
+ settings.setThemeProvider(new SingleThemeProvider(new AdminLTE()));
+ Bootstrap.install(this, settings);
+ // best place to do this is in Application#init()
+ //Bootstrap.install(this);
getComponentInstantiationListeners().add(new SpringComponentInjector(this));
getResourceSettings().setThrowExceptionOnMissingResource(true);
getJavaScriptLibrarySettings().setJQueryReference(new DynamicJQueryResourceReference());
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/pages/EditRealmModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/EditRealmModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/EditRealmModalPage.java
deleted file mode 100644
index 248162e..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/EditRealmModalPage.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.pages;
-
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.RealmTO;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
-
-public class EditRealmModalPage<T extends AnyTO> extends RealmModalPage {
-
- private static final long serialVersionUID = -4285220460543213901L;
-
- public EditRealmModalPage(
- final PageReference pageRef,
- final ModalWindow window,
- final RealmTO realmTO,
- final String parentPath,
- final String entitlement) {
-
- super(pageRef, window, realmTO, parentPath, entitlement);
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/pages/RealmModalPage.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/RealmModalPage.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/RealmModalPage.java
deleted file mode 100644
index 5b8526d..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/RealmModalPage.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * 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.pages;
-
-import static org.apache.syncope.client.console.pages.AbstractBasePage.CANCEL;
-import static org.apache.wicket.Component.ENABLE;
-
-import org.apache.syncope.client.console.SyncopeConsoleSession;
-import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.panels.RealmDetails;
-import org.apache.syncope.client.console.rest.RealmRestClient;
-import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.RealmTO;
-import org.apache.wicket.PageReference;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
-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.form.Form;
-import org.apache.wicket.model.CompoundPropertyModel;
-import org.apache.wicket.model.ResourceModel;
-import org.apache.wicket.spring.injection.annot.SpringBean;
-
-public class RealmModalPage<T extends AnyTO> extends BaseModalPage {
-
- private static final long serialVersionUID = -4285220460543213901L;
-
- private static final int ROWS_PER_PAGE = 10;
-
- protected RealmTO realmTO;
-
- private final PageReference pageRef;
-
- private final ModalWindow window;
-
- @SpringBean
- private RealmRestClient realmRestClient;
-
- private final String parentPath;
-
- public RealmModalPage(
- final PageReference pageRef,
- final ModalWindow window,
- final RealmTO realmTO,
- final String parentPath,
- final String entitlement) {
-
- super();
-
- this.pageRef = pageRef;
- this.window = window;
- this.realmTO = realmTO;
- this.parentPath = parentPath;
-
- final Form<RealmTO> form = new Form<RealmTO>("RealmForm");
- form.setModel(new CompoundPropertyModel<RealmTO>(realmTO));
-
- RealmDetails realmDetail = new RealmDetails("details", realmTO);
- if (SyncopeConsoleSession.get().owns(entitlement)) {
- MetaDataRoleAuthorizationStrategy.authorize(realmDetail, ENABLE, entitlement);
- }
- form.add(realmDetail);
-
- final AjaxButton submit = getOnSubmit();
- form.add(submit);
- form.setDefaultButton(submit);
-
- final AjaxButton cancel = new AjaxButton(CANCEL, new ResourceModel(CANCEL)) {
-
- private static final long serialVersionUID = 530608535790823587L;
-
- @Override
- protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
- window.close(target);
- }
-
- @Override
- protected void onError(final AjaxRequestTarget target, final Form<?> form) {
- }
- };
-
- cancel.setDefaultFormProcessing(false);
- form.add(cancel);
-
- add(form);
- }
-
- protected AjaxButton getOnSubmit() {
- return new IndicatingAjaxButton(APPLY, new ResourceModel(SUBMIT)) {
-
- private static final long serialVersionUID = -958724007591692537L;
-
- @Override
- protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
- try {
- submitAction(target, form);
-
- if (pageRef.getPage() instanceof BasePage) {
- ((BasePage) pageRef.getPage()).setModalResult(true);
- }
-
- closeAction(target, form);
- } catch (Exception e) {
- LOG.error("While creating or updating user", e);
- error(getString(Constants.ERROR) + ": " + e.getMessage());
- feedbackPanel.refresh(target);
- }
- }
-
- @Override
- protected void onError(final AjaxRequestTarget target, final Form<?> form) {
- feedbackPanel.refresh(target);
- }
- };
- }
-
- protected void submitAction(final AjaxRequestTarget target, final Form<?> form) {
- final RealmTO updatedRealmTO = (RealmTO) form.getModelObject();
- realmRestClient.create(this.parentPath, updatedRealmTO);
- }
-
- protected void closeAction(final AjaxRequestTarget target, final Form<?> form) {
- this.window.close(target);
- }
-}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
index 3c35ba3..914e5df 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/Realms.java
@@ -20,6 +20,9 @@ package org.apache.syncope.client.console.pages;
import static org.apache.wicket.Component.ENABLE;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.behavior.Draggable;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.behavior.DraggableConfig;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.behavior.Resizable;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
@@ -28,24 +31,29 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.panels.EditRealmModalPanel;
import org.apache.syncope.client.console.panels.Realm;
+import org.apache.syncope.client.console.panels.RealmModalPanel;
import org.apache.syncope.client.console.rest.RealmRestClient;
import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxLink;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.buttons.DefaultModalCloseButton;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
import org.apache.syncope.common.lib.to.RealmTO;
import org.apache.syncope.common.lib.types.Entitlement;
import org.apache.wicket.MarkupContainer;
-import org.apache.wicket.Page;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.event.IEvent;
-import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow.WindowClosedCallback;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.repeater.RepeatingView;
+import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
+import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
@@ -58,70 +66,37 @@ public class Realms extends BasePage {
private final WebMarkupContainer content;
- private final ModalWindow editModalWin;
-
protected RealmTO currentRealm;
public Realms(final PageParameters parameters) {
super(parameters);
-
+
final List<RealmTO> realms = realmRestClient.list();
Collections.sort(realms, new RealmNameComparator());
- add(getParentMap(realms), 0L, Realms.this);
+ addRealmTree(getParentMap(realms), 0L, Realms.this);
+ setCurrentRealm(realms.get(0));
content = new WebMarkupContainer("content");
- content.setOutputMarkupId(true);
- add(content);
-
content.add(new Label("header", "Root realm"));
content.add(new Label("body", "Root realm"));
-
- //create new realms
- final AjaxLink<Void> createLink = new ClearIndicatingAjaxLink<Void>("createLink", getPageReference()) {
-
- private static final long serialVersionUID = -7978723352517770644L;
-
- @Override
- protected void onClickInternal(final AjaxRequestTarget target) {
- editModalWin.setPageCreator(new ModalWindow.PageCreator() {
-
- private static final long serialVersionUID = -7834632442532690940L;
-
- @Override
- public Page createPage() {
- return new RealmModalPage(Realms.this.getPageReference(), editModalWin, new RealmTO(),
- Realms.this.getCurrentRealm().getFullPath(), Entitlement.REALM_CREATE);
- }
- });
-
- editModalWin.show(target);
- }
- };
- if (SyncopeConsoleSession.get().owns(Entitlement.REALM_CREATE)) {
- MetaDataRoleAuthorizationStrategy.authorize(createLink, ENABLE, Entitlement.REALM_CREATE);
- }
- content.add(createLink);
-
- // Modal window for editing realms
- editModalWin = new ModalWindow("editModal");
- editModalWin.setCssClassName(ModalWindow.CSS_CLASS_GRAY);
- editModalWin.setCookieName("edit-modal");
-
- content.add(editModalWin);
- setCurrentRealm(realms.get(0));
+ content.setOutputMarkupId(true);
+ updateRealmContent(currentRealm);
+ add(content);
}
- private void add(final Map<Long, List<RealmTO>> parentMap, final Long key, final MarkupContainer container) {
+ private MarkupContainer addRealmTree(
+ final Map<Long, List<RealmTO>> parentMap, final Long key, final MarkupContainer container) {
final RepeatingView listItems = new RepeatingView("list");
- container.add(listItems);
+ listItems.setOutputMarkupId(true);
+ container.addOrReplace(listItems);
for (final RealmTO realm : parentMap.get(key)) {
final Fragment fragment;
final AjaxLink<Void> link = new AjaxLink<Void>("link") {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = -7978723352517770644L;
@Override
public void onClick(final AjaxRequestTarget target) {
@@ -130,18 +105,21 @@ public class Realms extends BasePage {
}
};
- link.add(new Label("name", new PropertyModel<String>(realm, "name")));
+ link.addOrReplace(new Label("name", new PropertyModel<String>(realm, "name")));
if (parentMap.containsKey(realm.getKey()) && !parentMap.get(realm.getKey()).isEmpty()) {
fragment = new Fragment(String.valueOf(realm.getKey()), "withChildren", Realms.this);
- add(parentMap, realm.getKey(), fragment);
+ addRealmTree(parentMap, realm.getKey(), fragment);
} else {
fragment = new Fragment(String.valueOf(realm.getKey()), "withoutChildren", Realms.this);
}
- fragment.add(link);
- listItems.add(fragment);
+ fragment.addOrReplace(link);
+ fragment.setOutputMarkupId(true);
+ listItems.addOrReplace(fragment);
}
+
+ return container;
}
private Map<Long, List<RealmTO>> getParentMap(final List<RealmTO> realms) {
@@ -190,40 +168,114 @@ public class Realms extends BasePage {
if (event.getPayload() instanceof ControlSidebarClick) {
@SuppressWarnings("unchecked")
final ControlSidebarClick<RealmTO> controlSidebarClick = ControlSidebarClick.class.cast(event.getPayload());
- content.addOrReplace(new Label("header", controlSidebarClick.getObj().getName()));
- content.addOrReplace(new Realm("body", controlSidebarClick.getObj(), getPageReference()));
+ updateRealmContent(controlSidebarClick.getObj());
controlSidebarClick.getTarget().add(content);
}
}
- public void setCurrentRealm(final RealmTO realmTO) {
+ private void setCurrentRealm(final RealmTO realmTO) {
this.currentRealm = realmTO;
- setupEditModalPage(currentRealm);
}
public RealmTO getCurrentRealm() {
return this.currentRealm;
}
- public void setupEditModalPage(final RealmTO realmTO) {
- final AjaxLink<Void> edit = new ClearIndicatingAjaxLink<Void>("edit", getPageReference()) {
+ private void updateRealmContent(final RealmTO realmTO) {
+ content.addOrReplace(new Label("header", realmTO.getName()));
+ content.addOrReplace(new Realm("body", realmTO, getPageReference()));
+ setupCreateModal();
+ setupEditModal();
+ }
+
+ private void setupCreateModal() {
+ final BaseModal<RealmTO> createModal = new BaseModal<>("createModal");
+ createModal.add(new Resizable().withChildSelector(".modal-content"));
+ createModal.add(new Draggable(new DraggableConfig().withHandle(".modal-header").withCursor("move")));
+ createModal.addButton(new DefaultModalCloseButton());
+ createModal.header(new ResourceModel("createRealm"));
+ createModal.setUseKeyboard(true);
+ createModal.setFadeIn(true);
+
+ createModal.setWindowClosedCallback(new WindowClosedCallback() {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 8804221891699487139L;
+
+ @Override
+ public void onClose(final AjaxRequestTarget target) {
+ final List<RealmTO> realms = realmRestClient.list();
+ Collections.sort(realms, new RealmNameComparator());
+ target.add(addRealmTree(getParentMap(realms), 0L, Realms.this));
+ }
+ });
+
+ content.addOrReplace(createModal);
+
+ final RealmModalPanel realmModalPanel = new RealmModalPanel(BaseModal.getModalContentId(),
+ this.getPageReference(), createModal,
+ new RealmTO(), this.getCurrentRealm().getFullPath(), Entitlement.REALM_CREATE);
+
+ realmModalPanel.setOutputMarkupId(true);
+ createModal.addOrReplace(realmModalPanel);
+
+ //create new realms
+ final AjaxLink<Void> createLink = new ClearIndicatingAjaxLink<Void>("createLink", getPageReference()) {
+
+ private static final long serialVersionUID = -7978723352517770644L;
@Override
protected void onClickInternal(final AjaxRequestTarget target) {
- editModalWin.setPageCreator(new ModalWindow.PageCreator() {
+ createModal.addOrReplace(realmModalPanel);
+ createModal.show(target);
+ }
+
+ };
+ if (SyncopeConsoleSession.get().owns(Entitlement.REALM_CREATE)) {
+ MetaDataRoleAuthorizationStrategy.authorize(createLink, ENABLE, Entitlement.REALM_CREATE);
+ }
+ content.addOrReplace(createLink);
+ }
+
+ private void setupEditModal() {
+
+ final BaseModal<RealmTO> editModal = new BaseModal<>("editModal");
+ editModal.add(new Resizable().withChildSelector(".modal-content"));
+ editModal.add(new Draggable(new DraggableConfig().withHandle(".modal-header").withCursor("move")));
+ editModal.addButton(new DefaultModalCloseButton());
+ editModal.header(Model.of(getCurrentRealm().getName()));
+ editModal.setUseKeyboard(true);
+ editModal.setFadeIn(true);
+
+ editModal.setWindowClosedCallback(new WindowClosedCallback() {
+
+ private static final long serialVersionUID = 8804221891699487139L;
+
+ @Override
+ public void onClose(final AjaxRequestTarget target) {
+ final List<RealmTO> realms = realmRestClient.list();
+ Collections.sort(realms, new RealmNameComparator());
+ target.add(addRealmTree(getParentMap(realms), 0L, Realms.this));
+ }
+ });
+
+ content.addOrReplace(editModal);
+
+ final RealmModalPanel ediRealmModalPanel =
+ new EditRealmModalPanel(BaseModal.getModalContentId(),
+ Realms.this.getPageReference(),
+ editModal, getCurrentRealm(), Realms.this.getCurrentRealm().getFullPath(),
+ Entitlement.REALM_UPDATE);
+
+ ediRealmModalPanel.setOutputMarkupId(true);
+ editModal.addOrReplace(ediRealmModalPanel);
- private static final long serialVersionUID = -7834632442532690940L;
+ final AjaxLink<Void> edit = new ClearIndicatingAjaxLink<Void>("edit", getPageReference()) {
- @Override
- public Page createPage() {
- return new EditRealmModalPage(Realms.this.getPageReference(), editModalWin, realmTO,
- Realms.this.getCurrentRealm().getFullPath(), Entitlement.REALM_UPDATE);
- }
- });
+ private static final long serialVersionUID = -6957616042924610290L;
- editModalWin.show(target);
+ @Override
+ protected void onClickInternal(final AjaxRequestTarget target) {
+ editModal.show(target);
}
};
content.addOrReplace(edit);
@@ -248,6 +300,5 @@ public class Realms extends BasePage {
public AjaxRequestTarget getTarget() {
return target;
}
-
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
new file mode 100644
index 0000000..c704d41
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractModalPanel.java
@@ -0,0 +1,120 @@
+/*
+ * 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 org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.init.MIMETypesLoader;
+import org.apache.syncope.client.console.rest.ConfigurationRestClient;
+import org.apache.syncope.client.console.rest.ConnectorRestClient;
+import org.apache.syncope.client.console.rest.ReportRestClient;
+import org.apache.syncope.client.console.rest.ResourceRestClient;
+import org.apache.syncope.client.console.rest.GroupRestClient;
+import org.apache.syncope.client.console.rest.SchemaRestClient;
+import org.apache.syncope.client.console.rest.TaskRestClient;
+import org.apache.syncope.client.console.rest.UserRestClient;
+import org.apache.syncope.client.console.rest.UserSelfRestClient;
+import org.apache.syncope.client.console.wicket.markup.head.MetaHeaderItem;
+import org.apache.wicket.markup.head.HeaderItem;
+import org.apache.wicket.markup.head.IHeaderResponse;
+import org.apache.wicket.markup.head.PriorityHeaderItem;
+import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class AbstractModalPanel extends Panel {
+
+ private static final long serialVersionUID = 8611724965544132636L;
+
+ protected static final Logger LOG = LoggerFactory.getLogger(AbstractModalPanel.class);
+
+ protected static final String CANCEL = "cancel";
+
+ protected static final String SUBMIT = "submit";
+
+ protected static final String APPLY = "apply";
+
+ protected static final String FORM = "form";
+
+ protected final HeaderItem meta = new MetaHeaderItem("X-UA-Compatible", "IE=edge");
+
+ @SpringBean
+ protected UserRestClient userRestClient;
+
+ @SpringBean
+ protected UserSelfRestClient userSelfRestClient;
+
+ @SpringBean
+ protected GroupRestClient groupRestClient;
+
+ @SpringBean
+ protected TaskRestClient taskRestClient;
+
+ @SpringBean
+ protected SchemaRestClient schemaRestClient;
+
+ @SpringBean
+ protected ResourceRestClient resourceRestClient;
+
+ @SpringBean
+ protected ConnectorRestClient connectorRestClient;
+
+ @SpringBean
+ protected ReportRestClient reportRestClient;
+
+ @SpringBean
+ protected ConfigurationRestClient confRestClient;
+
+ @SpringBean
+ protected MIMETypesLoader mimeTypesInitializer;
+
+ protected NotificationPanel feedbackPanel;
+
+ /**
+ * Response flag set by the Modal Window after the operation is completed.
+ */
+ protected boolean modalResult = false;
+
+ public AbstractModalPanel(final String id) {
+ super(id);
+
+ feedbackPanel = new NotificationPanel(Constants.FEEDBACK);
+ feedbackPanel.setOutputMarkupId(true);
+ add(feedbackPanel);
+ }
+
+ public NotificationPanel getFeedbackPanel() {
+ return feedbackPanel;
+ }
+
+ public boolean isModalResult() {
+ return modalResult;
+ }
+
+ public void setModalResult(final boolean modalResult) {
+ this.modalResult = modalResult;
+ }
+
+ @Override
+ public void renderHead(final IHeaderResponse response) {
+ super.renderHead(response);
+ response.render(new PriorityHeaderItem(meta));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
index d91c083..5bda1fd 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.java
@@ -270,7 +270,8 @@ public abstract class AbstractSearchResultPanel extends Panel implements IEventS
restClient,
"key",
getPageId(),
- page.getPageReference());
+ page.getPageReference(),
+ container);
resultTable.setCurrentPage(currentPage);
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/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 837c89d..289cf26 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
@@ -23,6 +23,7 @@ import java.util.Collection;
import java.util.List;
import org.apache.syncope.client.console.commons.ActionTableCheckGroup;
import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.CheckGroupColumn;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
@@ -33,7 +34,6 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
-import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
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;
@@ -87,7 +87,7 @@ public class ActionDataTablePanel<T, S> extends DataTablePanel<T, S> {
bulkActionForm.add(group);
columns.add(0, new CheckGroupColumn<T, S>(group));
- dataTable = new AjaxFallbackDefaultDataTable<>("dataTable", columns, dataProvider, rowsPerPage);
+ dataTable = new AjaxFallbackDataTable<>("dataTable", columns, dataProvider, rowsPerPage, this);
group.add(dataTable);
final WebMarkupContainer actionPanelContainer = new WebMarkupContainer("actionPanelContainer");
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
index 7c77228..b98ba71 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AjaxDataTablePanel.java
@@ -28,6 +28,7 @@ import org.apache.syncope.client.console.commons.Constants;
import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.CheckGroupColumn;
import org.apache.syncope.client.console.wicket.ajax.markup.html.ClearIndicatingAjaxButton;
import org.apache.syncope.client.console.pages.BulkActionModalPage;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.Page;
import org.apache.wicket.PageReference;
@@ -35,9 +36,9 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior;
import org.apache.wicket.event.Broadcast;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
-import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
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.CheckGroup;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.Fragment;
@@ -55,7 +56,8 @@ public class AjaxDataTablePanel<T, S> extends DataTablePanel<T, S> {
final BaseRestClient bulkActionExecutor,
final String itemKeyField,
final String pageId,
- final PageReference pageRef) {
+ final PageReference pageRef,
+ final WebMarkupContainer container) {
super(id);
@@ -110,10 +112,9 @@ public class AjaxDataTablePanel<T, S> extends DataTablePanel<T, S> {
bulkActionForm.add(group);
columns.add(0, new CheckGroupColumn<T, S>(group));
- dataTable = new AjaxFallbackDefaultDataTable<>("dataTable", columns, dataProvider, rowsPerPage);
- dataTable.add(new AttributeModifier("class",
- "ui-widget ui-widget-content table-hover table table-striped table-bordered"));
-
+ dataTable = new AjaxFallbackDataTable<>("dataTable", columns, dataProvider, rowsPerPage, container);
+ dataTable.add(new AttributeModifier("class", "table table-bordered table-hover dataTable"));
+
group.add(dataTable);
fragment.add(new ClearIndicatingAjaxButton("bulkActionLink", bulkActionForm, pageRef) {
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java
index a1c822e..e9b137d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnySearchResultPanel.java
@@ -58,8 +58,6 @@ public class AnySearchResultPanel extends AbstractSearchResultPanel {
protected static final Logger LOG = LoggerFactory.getLogger(AnySearchResultPanel.class);
- private String customMarkupId;
-
@SpringBean
protected SchemaRestClient schemaRestClient;
@@ -68,14 +66,14 @@ public class AnySearchResultPanel extends AbstractSearchResultPanel {
protected final List<String> dSchemaNames;
protected final String pageID = "Any";
-
+
private final String entitlement = "USER_LIST";
- public AnySearchResultPanel(final String type, final String parentId, final String markupId, final boolean filtered,
+ public AnySearchResultPanel(final String type, final String parentId, final boolean filtered,
final String fiql, final PageReference callerRef, final AbstractAnyRestClient restClient,
final List<AnyTypeClassTO> anyTypeClassTOs, final String realm) {
super(parentId, filtered, fiql, callerRef, restClient, realm, type);
- setCustomMarkupId(markupId);
+ //setCustomMarkupId(markupId);
add(new Label("name", type));
this.schemaNames = new ArrayList<String>();
@@ -90,14 +88,6 @@ public class AnySearchResultPanel extends AbstractSearchResultPanel {
initResultTable();
}
- public String getCustomMarkupId() {
- return customMarkupId;
- }
-
- public void setCustomMarkupId(final String markupId) {
- this.customMarkupId = markupId;
- }
-
@Override
protected List<IColumn<AnyTO, String>> getColumns() {
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/DataTablePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/DataTablePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/DataTablePanel.java
index 1800d54..46237ab 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/DataTablePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/DataTablePanel.java
@@ -22,8 +22,8 @@ import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
+import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AjaxFallbackDataTable;
import org.apache.wicket.Component;
-import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackDefaultDataTable;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.DataGridView;
import org.apache.wicket.markup.html.form.CheckGroup;
import org.apache.wicket.markup.html.panel.Panel;
@@ -43,7 +43,7 @@ public abstract class DataTablePanel<T, S> extends Panel {
protected CheckGroup<T> group;
- protected AjaxFallbackDefaultDataTable<T, S> dataTable;
+ protected AjaxFallbackDataTable<T, S> dataTable;
protected IModel<Collection<T>> model;
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/EditRealmModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/EditRealmModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/EditRealmModalPanel.java
new file mode 100644
index 0000000..c4ddfa1
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/EditRealmModalPanel.java
@@ -0,0 +1,40 @@
+/*
+ * 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 org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.common.lib.to.RealmTO;
+import org.apache.wicket.PageReference;
+
+public class EditRealmModalPanel extends RealmModalPanel {
+
+ private static final long serialVersionUID = -4285220460543213901L;
+
+ public EditRealmModalPanel(
+ final String id,
+ final PageReference pageRef,
+ final BaseModal<RealmTO> window,
+ final RealmTO realmTO,
+ final String parentPath,
+ final String entitlement) {
+
+ super(id, pageRef, window, realmTO, parentPath, entitlement);
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
new file mode 100644
index 0000000..38edbf0
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/FailureMessageModal.java
@@ -0,0 +1,40 @@
+/*
+ * 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 org.apache.wicket.PageReference;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.model.Model;
+
+public class FailureMessageModal extends ModalContent {
+
+ private static final long serialVersionUID = 9216117990503199258L;
+
+ public FailureMessageModal(final PageReference pageRef, final ModalWindow window, final String failureMessage) {
+ super(window, pageRef);
+ final Label executionFailureMessage;
+ if (!failureMessage.isEmpty()) {
+ executionFailureMessage = new Label("failureMessage", new Model<String>(failureMessage));
+ } else {
+ executionFailureMessage = new Label("failureMessage");
+ }
+ add(executionFailureMessage.setOutputMarkupId(true));
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupModalPanel.java
new file mode 100644
index 0000000..9594e3f
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupModalPanel.java
@@ -0,0 +1,122 @@
+/*
+ * 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 de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import org.apache.commons.lang3.SerializationUtils;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.commons.Mode;
+import org.apache.syncope.common.lib.AnyOperations;
+import org.apache.syncope.common.lib.mod.GroupMod;
+import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.extensions.ajax.markup.html.IndicatingAjaxButton;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.model.ResourceModel;
+
+/**
+ * Modal window with Group form.
+ */
+public class GroupModalPanel extends AbstractModalPanel {
+
+ private static final long serialVersionUID = -1732493223434085205L;
+
+ protected final Mode mode;
+
+ protected final boolean createFlag;
+
+ protected final GroupPanel groupPanel;
+
+ protected GroupTO originalGroupTO;
+
+ public GroupModalPanel(final String id, final Modal window, final GroupTO groupTO) {
+ this(id, window, groupTO, Mode.ADMIN);
+ }
+
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public GroupModalPanel(final String id, final Modal window, final GroupTO groupTO, final Mode mode) {
+
+ super(id);
+
+ this.mode = mode;
+
+ this.createFlag = groupTO.getKey() == 0;
+ if (!createFlag) {
+ originalGroupTO = SerializationUtils.clone(groupTO);
+ }
+
+ final Form<GroupTO> form = new Form<>("groupForm");
+ form.setMultiPart(true);
+
+ add(new Label("displayName", groupTO.getKey() == 0 ? "" : groupTO.getDisplayName()));
+
+ form.setModel(new CompoundPropertyModel<>(groupTO));
+
+ this.groupPanel = new GroupPanel.Builder("groupPanel").
+ form(form).groupTO(groupTO).groupModalPageMode(mode).build();
+ form.add(groupPanel);
+
+ final AjaxButton submit = new IndicatingAjaxButton(SUBMIT, new ResourceModel(SUBMIT)) {
+
+ private static final long serialVersionUID = -958724007591692537L;
+
+ @Override
+ protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+ try {
+ submitAction(target, form);
+
+ } catch (Exception e) {
+ LOG.error("Failure managing groupTO {}", groupTO, e);
+ error(getString(Constants.ERROR) + ": " + e.getMessage());
+ feedbackPanel.refresh(target);
+ }
+ }
+
+ @Override
+ protected void onError(final AjaxRequestTarget target, final Form<?> form) {
+ feedbackPanel.refresh(target);
+ }
+ };
+ form.add(submit);
+ form.setDefaultButton(submit);
+ }
+
+ protected void submitAction(final AjaxRequestTarget target, final Form<?> form) {
+ final GroupTO groupTO = (GroupTO) form.getDefaultModelObject();
+
+ GroupTO result;
+ if (createFlag) {
+ result = groupRestClient.create(groupTO);
+ } else {
+ GroupMod groupMod = AnyOperations.diff(groupTO, groupTO);
+
+ // update group just if it is changed
+ if (groupMod.isEmpty()) {
+ result = groupTO;
+ } else {
+ result = groupRestClient.update(originalGroupTO.getETagValue(), groupMod);
+ }
+ }
+
+ //setResponsePage(new ResultStatusModal.Builder(window, result).build());
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupPanel.java
new file mode 100644
index 0000000..3e58e61
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupPanel.java
@@ -0,0 +1,75 @@
+/*
+ * 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.commons.Mode;
+import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.panel.Panel;
+
+public final class GroupPanel extends Panel {
+
+ private static final long serialVersionUID = 4216376097320768369L;
+
+ public static class Builder implements Serializable {
+
+ private static final long serialVersionUID = 8150440254654306070L;
+
+ private String id;
+
+ private Form form;
+
+ private GroupTO groupTO;
+
+ private Mode mode;
+
+ private PageReference pageReference;
+
+ public Builder(final String id) {
+ this.id = id;
+ }
+
+ public Builder form(final Form form) {
+ this.form = form;
+ return this;
+ }
+
+ public Builder groupTO(final GroupTO groupTO) {
+ this.groupTO = groupTO;
+ return this;
+ }
+
+ public Builder groupModalPageMode(final Mode mode) {
+ this.mode = mode;
+ return this;
+ }
+
+ public GroupPanel build() {
+ return new GroupPanel(this);
+ }
+ }
+
+ private GroupPanel(final Builder builder) {
+ super(builder.id);
+
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
index 45b5239..b58acd8 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/GroupSearchResultPanel.java
@@ -18,6 +18,9 @@
*/
package org.apache.syncope.client.console.panels;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.behavior.Draggable;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.behavior.DraggableConfig;
+import de.agilecoders.wicket.extensions.markup.html.bootstrap.behavior.Resizable;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
@@ -28,9 +31,9 @@ import java.util.List;
import org.apache.syncope.client.console.commons.Constants;
import org.apache.syncope.client.console.pages.GroupDisplayAttributesModalPage;
import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
-import org.apache.syncope.client.console.rest.GroupRestClient;
import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.ActionColumn;
import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AttrColumn;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink.ActionType;
import org.apache.syncope.client.console.wicket.markup.html.form.ActionLinksPanel;
@@ -59,18 +62,28 @@ public class GroupSearchResultPanel extends AnySearchResultPanel {
private final String entitlement = "GROUP_READ";
- public GroupSearchResultPanel(final String type, final String parentId, final String markupId,
+ private final BaseModal<AbstractModalPanel> editModal;
+
+ public GroupSearchResultPanel(final String type, final String parentId,
final boolean filtered, final String fiql, final PageReference callerRef,
final AbstractAnyRestClient restClient, final List<AnyTypeClassTO> anyTypeClassTOs, final String realm) {
- super(type, parentId, markupId, filtered, fiql, callerRef, restClient, anyTypeClassTOs, realm);
+ super(type, parentId, filtered, fiql, callerRef, restClient, anyTypeClassTOs, realm);
+
+ editModal = new BaseModal<>("editModal");
+ editModal.add(new Resizable().withChildSelector(".modal-content"));
+ editModal.add(new Draggable(new DraggableConfig().withHandle(".modal-header").withCursor("move")));
+ editModal.setUseKeyboard(true).addCloseButton();
+ editModal.setFadeIn(true);
+ editModal.setFooterVisible(true);
+ editModal.setHeaderVisible(true);
+ editModal.setOutputMarkupId(true);
}
@Override
protected List<IColumn<AnyTO, String>> getColumns() {
- final List<IColumn<AnyTO, String>> columns =
- new ArrayList<IColumn<AnyTO, String>>();
+ final List<IColumn<AnyTO, String>> columns = new ArrayList<>();
for (String name : prefMan.getList(getRequest(), Constants.PREF_GROUP_DETAILS_VIEW)) {
final Field field = ReflectionUtils.findField(GroupTO.class, name);
@@ -84,7 +97,7 @@ public class GroupSearchResultPanel extends AnySearchResultPanel {
new PropertyColumn<AnyTO, String>(new ResourceModel(name, name), name, name));
}
}
-
+
for (String name : prefMan.getList(getRequest(), Constants.PREF_GROUP_ATTRIBUTES_VIEW)) {
if (schemaNames.contains(name)) {
columns.add(new AttrColumn(name, SchemaType.PLAIN));
@@ -116,26 +129,18 @@ public class GroupSearchResultPanel extends AnySearchResultPanel {
public ActionLinksPanel getActions(final String componentId, final IModel<AnyTO> model) {
final ActionLinksPanel.Builder<AnyTO> panel = ActionLinksPanel.builder(page.getPageReference());
-
+
panel.add(new ActionLink<AnyTO>() {
private static final long serialVersionUID = -7978723352517770644L;
@Override
public void onClick(final AjaxRequestTarget target, final AnyTO anyTO) {
- editmodal.setPageCreator(new ModalWindow.PageCreator() {
+ editModal.addOrReplace(new GroupModalPanel(
+ BaseModal.getModalContentId(), editModal, (GroupTO) model.getObject()));
- private static final long serialVersionUID = -7834632442532690940L;
-
- @Override
- public Page createPage() {
- // SYNCOPE-294: re-read groupTO before edit
- GroupTO groupTO = ((GroupRestClient) restClient).read(model.getObject().getKey());
- return null;
- }
- });
-
- editmodal.show(target);
+ target.add(editModal);
+ editModal.show(target);
}
}, ActionLink.ActionType.EDIT, entitlement).add(new ActionLink<AnyTO>() {
@@ -147,19 +152,12 @@ public class GroupSearchResultPanel extends AnySearchResultPanel {
final GroupTO groupTO = (GroupTO) restClient.
delete(model.getObject().getETagValue(), model.getObject().getKey());
- page.setModalResult(true);
-
- editmodal.setPageCreator(new ModalWindow.PageCreator() {
-
- private static final long serialVersionUID = -7834632442532690940L;
-
- @Override
- public Page createPage() {
- return null;
- }
- });
-
- editmodal.show(target);
+ //editmodal.setContent(new ResultStatusModal.Builder(editmodal, groupTO).build());
+// editModal.addOrReplace(new GroupModalPanel(
+// BaseModal.getModalContentId(), editModal, (GroupTO) model.getObject()));
+//
+// target.add(editModal);
+// editModal.show(target);
} catch (SyncopeClientException scce) {
error(getString(Constants.OPERATION_ERROR) + ": " + scce.getMessage());
feedbackPanel.refresh(target);
@@ -216,7 +214,7 @@ public class GroupSearchResultPanel extends AnySearchResultPanel {
@Override
protected <T extends AnyTO> Collection<ActionLink.ActionType> getBulkActions() {
- final List<ActionType> bulkActions = new ArrayList<ActionType>();
+ final List<ActionType> bulkActions = new ArrayList<>();
bulkActions.add(ActionType.DELETE);
bulkActions.add(ActionType.SUSPEND);
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
index 5c37e14..49ab781 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
@@ -20,6 +20,8 @@ package org.apache.syncope.client.console.panels;
import static org.apache.syncope.common.lib.types.AnyTypeKind.USER;
+import com.googlecode.wicket.jquery.core.panel.LabelPanel;
+import de.agilecoders.wicket.core.markup.html.bootstrap.tabs.AjaxBootstrapTabbedPanel;
import java.util.ArrayList;
import java.util.List;
import org.apache.syncope.client.console.rest.AnyObjectRestClient;
@@ -28,11 +30,11 @@ import org.apache.syncope.client.console.rest.GroupRestClient;
import org.apache.syncope.client.console.rest.UserRestClient;
import org.apache.syncope.common.lib.to.AnyTypeTO;
import org.apache.syncope.common.lib.to.RealmTO;
-import org.apache.wicket.AttributeModifier;
import org.apache.wicket.PageReference;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
+import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
+import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.panel.Panel;
+import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -45,7 +47,7 @@ public class Realm extends Panel {
private final RealmTO realmTO;
- private static Integer MARKUP_ID = 0;
+ private final List<AnyTypeTO> anyTypeTOs;
@SpringBean
private AnyTypeRestClient anyTypeRestClient;
@@ -59,71 +61,70 @@ public class Realm extends Panel {
@SpringBean
private AnyObjectRestClient anyObjectRestClient;
+ @SuppressWarnings({ "unchecked", "unchecked" })
public Realm(final String id, final RealmTO realmTO, final PageReference pageReference) {
super(id);
this.realmTO = realmTO;
+ this.anyTypeTOs = anyTypeRestClient.getAll();
- List<AnyTypeMenuItem> anyMenu = new ArrayList<>();
- List<AnySearchResultPanel> anyList = new ArrayList<>();
+ add(new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList(pageReference)));
+ }
- for (AnyTypeTO anyTypeTO : anyTypeRestClient.getAll()) {
- anyMenu.add(new AnyTypeMenuItem(anyTypeTO.getKey(), MARKUP_ID.toString()));
+ public RealmTO getRealmTO() {
+ return realmTO;
+ }
- switch (anyTypeTO.getKind()) {
- case USER:
- anyList.add(
- new UserSearchResultPanel(anyTypeTO.getKey(), "anytype-contentitem", MARKUP_ID.toString(),
- false, null, pageReference, userRestClient, anyTypeRestClient.getAnyTypeClass(
- anyTypeTO.getClasses()), realmTO.getFullPath()));
- break;
- case GROUP:
- anyList.add(
- new GroupSearchResultPanel(anyTypeTO.getKey(), "anytype-contentitem", MARKUP_ID.toString(),
- false, null, pageReference, groupRestClient, anyTypeRestClient.getAnyTypeClass(
- anyTypeTO.getClasses()), realmTO.getFullPath()));
- break;
- case ANY_OBJECT:
- anyList.add(
- new AnySearchResultPanel(anyTypeTO.getKey(), "anytype-contentitem", MARKUP_ID.toString(),
- false, null, pageReference, anyObjectRestClient, anyTypeRestClient.getAnyTypeClass(
- anyTypeTO.getClasses()), realmTO.getFullPath()));
- break;
- default:
- }
- MARKUP_ID++;
- }
+ private List<ITab> buildTabList(final PageReference pageReference) {
- ListView<AnyTypeMenuItem> menuListView = new ListView<AnyTypeMenuItem>("anytype-menu", anyMenu) {
+ final List<ITab> tabs = new ArrayList<>();
- private static final long serialVersionUID = 4949588177564901031L;
+ tabs.add(new AbstractTab(new Model<>("DETAILS")) {
+
+ private static final long serialVersionUID = -5861786415855103549L;
@Override
- protected void populateItem(final ListItem<AnyTypeMenuItem> item) {
- item.add(item.getModelObject());
- if (item.getIndex() == 0) {
- item.add(new AttributeModifier("class", "active"));
- }
+ public Panel getPanel(final String panelId) {
+ return new RealmDetails(panelId, realmTO);
}
- };
- add(menuListView);
+ });
- add(new ListView<AnySearchResultPanel>("anytype-content", anyList) {
+ for (final AnyTypeTO anyTypeTO : anyTypeTOs) {
- private static final long serialVersionUID = 4949588177564901031L;
+ tabs.add(new AbstractTab(new Model<>(anyTypeTO.getKey())) {
- @Override
- protected void populateItem(final ListItem<AnySearchResultPanel> item) {
- item.setMarkupId(item.getModelObject().getCustomMarkupId());
- item.add(item.getModelObject());
- if (item.getIndex() == 0) {
- item.add(new AttributeModifier("class", "tab-pane active"));
+ private static final long serialVersionUID = -5861786415855103549L;
+
+ @Override
+ public Panel getPanel(final String panelId) {
+ return getAnyPanel(panelId, pageReference, anyTypeTO);
}
- }
- });
+ });
+ }
+ return tabs;
}
- public RealmTO getRealmTO() {
- return realmTO;
- }
+ private Panel getAnyPanel(final String id, final PageReference pageReference, final AnyTypeTO anyTypeTO) {
+ final Panel panel;
+ switch (anyTypeTO.getKind()) {
+ case USER:
+ panel = new UserSearchResultPanel(anyTypeTO.getKey(), id,
+ false, null, pageReference, userRestClient, anyTypeRestClient.getAnyTypeClass(
+ anyTypeTO.getClasses()), realmTO.getFullPath());
+ break;
+ case GROUP:
+ panel = new GroupSearchResultPanel(anyTypeTO.getKey(), id,
+ false, null, pageReference, groupRestClient, anyTypeRestClient.getAnyTypeClass(
+ anyTypeTO.getClasses()), realmTO.getFullPath());
+ break;
+ case ANY_OBJECT:
+ panel = new AnySearchResultPanel(anyTypeTO.getKey(), id,
+ false, null, pageReference, anyObjectRestClient, anyTypeRestClient.getAnyTypeClass(
+ anyTypeTO.getClasses()), realmTO.getFullPath());
+ break;
+ default:
+ panel = new LabelPanel(id, null);
+ }
+ return panel;
+ }
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
index 8797d13..a106402 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
@@ -18,14 +18,14 @@
*/
package org.apache.syncope.client.console.panels;
-import org.apache.syncope.common.lib.to.RealmTO;
-import org.apache.wicket.markup.html.form.TextField;
+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.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.PropertyModel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class RealmDetails extends Panel {
+public class RealmDetails<RealmTO> extends Panel {
private static final long serialVersionUID = -1100228004207271270L;
@@ -33,10 +33,24 @@ public class RealmDetails extends Panel {
public RealmDetails(final String id, final RealmTO realmTO) {
super(id);
- add(new TextField<>("name", new PropertyModel<>(realmTO, "name")));
- add(new TextField<>("path", new PropertyModel<>(realmTO, "fullPath")));
- add(new TextField<>("accountPolicy", new PropertyModel<>(realmTO, "accountPolicy")));
- add(new TextField<>("passwordPolicy", new PropertyModel<>(realmTO, "passwordPolicy")));
- }
+ final FieldPanel<String> name =
+ new AjaxTextFieldPanel("name", "name", new PropertyModel<String>(realmTO, "name"));
+ name.addRequiredLabel();
+ add(name);
+
+ final FieldPanel<String> fullPath =
+ new AjaxTextFieldPanel("fullPath", "fullPath", new PropertyModel<String>(realmTO, "fullPath"));
+ fullPath.setEnabled(false);
+ add(fullPath);
+ final FieldPanel<String> accountPolicy =
+ new AjaxTextFieldPanel("accountPolicy",
+ "accountPolicy", new PropertyModel<String>(realmTO, "accountPolicy"));
+ add(accountPolicy);
+
+ final FieldPanel<String> passwordPolicy =
+ new AjaxTextFieldPanel("passwordPolicy",
+ "passwordPolicy", new PropertyModel<String>(realmTO, "passwordPolicy"));
+ add(passwordPolicy);
+ }
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmModalPanel.java
new file mode 100644
index 0000000..36409e8
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmModalPanel.java
@@ -0,0 +1,119 @@
+/*
+ * 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 static org.apache.wicket.Component.ENABLE;
+
+import com.googlecode.wicket.jquery.ui.markup.html.link.AjaxSubmitLink;
+import org.apache.syncope.client.console.SyncopeConsoleSession;
+import org.apache.syncope.client.console.commons.Constants;
+import org.apache.syncope.client.console.pages.BasePage;
+import org.apache.syncope.client.console.rest.RealmRestClient;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.buttons.PrimaryModalButton;
+import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
+import org.apache.syncope.common.lib.to.RealmTO;
+import org.apache.wicket.PageReference;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.model.CompoundPropertyModel;
+import org.apache.wicket.spring.injection.annot.SpringBean;
+
+public class RealmModalPanel extends AbstractModalPanel {
+
+ private static final long serialVersionUID = -4285220460543213901L;
+
+ protected RealmTO realmTO;
+
+ private final PageReference pageRef;
+
+ private final BaseModal<RealmTO> modal;
+
+ @SpringBean
+ private RealmRestClient realmRestClient;
+
+ private final String parentPath;
+
+ public RealmModalPanel(
+ final String id,
+ final PageReference pageRef,
+ final BaseModal<RealmTO> modal,
+ final RealmTO realmTO,
+ final String parentPath,
+ final String entitlement) {
+
+ super(id);
+
+ this.pageRef = pageRef;
+ this.modal = modal;
+ this.realmTO = realmTO;
+ this.parentPath = parentPath;
+
+ final Form<RealmTO> form = new Form<>("realmForm");
+ form.setModel(new CompoundPropertyModel<>(realmTO));
+
+ final RealmDetails<RealmTO> realmDetail = new RealmDetails<>("details", realmTO);
+ if (SyncopeConsoleSession.get().owns(entitlement)) {
+ MetaDataRoleAuthorizationStrategy.authorize(realmDetail, ENABLE, entitlement);
+ }
+ form.add(realmDetail);
+
+ final AjaxSubmitLink submit = getOnSubmit(form);
+ modal.addFooterInput(submit);
+ add(form);
+ }
+
+ protected PrimaryModalButton getOnSubmit(final Form form) {
+ return new PrimaryModalButton(modal.getModalInputId(), "submit", form) {
+
+ private static final long serialVersionUID = -958724007591692537L;
+
+ @Override
+ protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
+ try {
+ submitAction(target, form);
+
+ if (pageRef.getPage() instanceof BasePage) {
+ ((BasePage) pageRef.getPage()).setModalResult(true);
+ }
+
+ closeAction(target, form);
+ } catch (Exception e) {
+ LOG.error("While creating or updating realm", e);
+ error(getString(Constants.ERROR) + ": " + e.getMessage());
+ feedbackPanel.refresh(target);
+ }
+ }
+
+ @Override
+ protected void onError(final AjaxRequestTarget target, final Form<?> form) {
+ feedbackPanel.refresh(target);
+ }
+ };
+ }
+
+ protected void submitAction(final AjaxRequestTarget target, final Form<?> form) {
+ final RealmTO updatedRealmTO = (RealmTO) form.getModelObject();
+ realmRestClient.create(this.parentPath, updatedRealmTO);
+ }
+
+ protected void closeAction(final AjaxRequestTarget target, final Form<?> form) {
+ this.modal.close(target);
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
index 3dd2b4e..de4d65a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/UserSearchResultPanel.java
@@ -60,18 +60,17 @@ public class UserSearchResultPanel extends AnySearchResultPanel {
private final String entitlement = "USER_LIST";
- public UserSearchResultPanel(final String type, final String parentId, final String markupId,
+ public UserSearchResultPanel(final String type, final String parentId,
final boolean filtered, final String fiql, final PageReference callerRef,
final AbstractAnyRestClient restClient, final List<AnyTypeClassTO> anyTypeClassTOs, final String realm) {
- super(type, parentId, markupId, filtered, fiql, callerRef, restClient, anyTypeClassTOs, realm);
+ super(type, parentId, filtered, fiql, callerRef, restClient, anyTypeClassTOs, realm);
}
@Override
protected List<IColumn<AnyTO, String>> getColumns() {
- final List<IColumn<AnyTO, String>> columns =
- new ArrayList<IColumn<AnyTO, String>>();
+ final List<IColumn<AnyTO, String>> columns = new ArrayList<IColumn<AnyTO, String>>();
for (String name : prefMan.getList(getRequest(), Constants.PREF_USERS_DETAILS_VIEW)) {
final Field field = ReflectionUtils.findField(UserTO.class, name);
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java
index 3fd98bd..b4a4642 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyObjectRestClient.java
@@ -19,8 +19,10 @@
package org.apache.syncope.client.console.rest;
import java.util.List;
+import javax.ws.rs.core.Response;
import org.apache.syncope.client.lib.SyncopeClient;
import org.apache.syncope.common.lib.SyncopeClientException;
+import org.apache.syncope.common.lib.mod.AnyObjectMod;
import org.apache.syncope.common.lib.to.AnyObjectTO;
import org.apache.syncope.common.lib.to.AnyTO;
import org.apache.syncope.common.lib.to.BulkAction;
@@ -83,6 +85,21 @@ public class AnyObjectRestClient extends AbstractAnyRestClient {
return anyObjectTO;
}
+ public AnyObjectTO create(final AnyObjectTO anyObjectTO) {
+ final Response response = getService(AnyObjectService.class).create(anyObjectTO);
+ return response.readEntity(AnyObjectTO.class);
+ }
+
+ public AnyObjectTO update(final String etag, final AnyObjectMod anyObjectMod) {
+ AnyObjectTO result;
+ synchronized (this) {
+ AnyObjectService service = getService(etag, AnyObjectService.class);
+ result = service.update(anyObjectMod).readEntity(AnyObjectTO.class);
+ resetClient(AnyObjectService.class);
+ }
+ return result;
+ }
+
@Override
public AnyTO delete(final String etag, final Long key) {
throw new UnsupportedOperationException("Not supported yet.");
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
index 779495b..cb2bccc 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/RealmRestClient.java
@@ -36,6 +36,6 @@ public class RealmRestClient extends BaseRestClient {
}
public void create(final String parentPath, final RealmTO realmTO) {
- getService(RealmService.class).create(parentPath, realmTO);
+ getService(RealmService.class).create(parentPath, realmTO);
}
}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/themes/AdminLTE.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/themes/AdminLTE.java b/client/console/src/main/java/org/apache/syncope/client/console/themes/AdminLTE.java
new file mode 100644
index 0000000..0d19213
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/themes/AdminLTE.java
@@ -0,0 +1,44 @@
+/*
+ * 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.themes;
+
+import de.agilecoders.wicket.core.settings.Theme;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.wicket.markup.head.CssHeaderItem;
+import org.apache.wicket.markup.head.HeaderItem;
+import org.apache.wicket.markup.head.JavaScriptHeaderItem;
+import org.apache.wicket.resource.JQueryPluginResourceReference;
+
+public class AdminLTE extends Theme {
+
+ public AdminLTE() {
+ super("adminLTE");
+ }
+
+ @Override
+ public List<HeaderItem> getDependencies() {
+ final List<HeaderItem> references = new ArrayList<>();
+ references.add(JavaScriptHeaderItem.forReference(
+ new JQueryPluginResourceReference(AdminLTE.class, "js/AdminLTE-app.min.js")));
+ references.add(CssHeaderItem.forReference(AdminLTECssResourceReference.INSTANCE));
+ references.addAll(super.getDependencies());
+ return references;
+ }
+}
[2/4] syncope git commit: Add AdminLTe theme provider,
new Modal dialog, new Realms tab
Posted by md...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/themes/css/AdminLTE.css
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/themes/css/AdminLTE.css b/client/console/src/main/resources/org/apache/syncope/client/console/themes/css/AdminLTE.css
new file mode 100644
index 0000000..2587b84
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/themes/css/AdminLTE.css
@@ -0,0 +1,4366 @@
+@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic);
+/*!
+ * AdminLTE v2.1.0
+ * Author: Almsaeed Studio
+ * Website: Almsaeed Studio <http://almsaeedstudio.com>
+ * License: Open source - MIT
+ * Please visit http://opensource.org/licenses/MIT for more information
+!*/
+/*
+ * Core: Genral Layout Style
+ * -------------------------
+ */
+html,
+body {
+ min-height: 100%;
+}
+.layout-boxed html,
+.layout-boxed body {
+ height: 100%;
+}
+body {
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
+ font-weight: 400;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+/* Layout */
+.wrapper {
+ min-height: 100%;
+ position: relative;
+ overflow: hidden!important;
+}
+.wrapper:before,
+.wrapper:after {
+ content: " ";
+ display: table;
+}
+.wrapper:after {
+ clear: both;
+}
+.layout-boxed .wrapper {
+ max-width: 1250px;
+ margin: 0 auto;
+ min-height: 100%;
+ box-shadow: 0 0 8px rgba(0, 0, 0, 0.5);
+ position: relative;
+}
+.layout-boxed {
+ background: url('../img/boxed-bg.jpg') repeat fixed;
+}
+/*
+ * Content Wrapper - contains the main content
+ * ```.right-side has been deprecated as of v2.0.0 in favor of .content-wrapper ```
+ */
+.content-wrapper,
+.right-side,
+.main-footer {
+ -webkit-transition: -webkit-transform 0.3s ease-in-out, margin 0.3s ease-in-out;
+ -moz-transition: -moz-transform 0.3s ease-in-out, margin 0.3s ease-in-out;
+ -o-transition: -o-transform 0.3s ease-in-out, margin 0.3s ease-in-out;
+ transition: transform 0.3s ease-in-out, margin 0.3s ease-in-out;
+ margin-left: 230px;
+ z-index: 820;
+}
+.layout-top-nav .content-wrapper,
+.layout-top-nav .right-side,
+.layout-top-nav .main-footer {
+ margin-left: 0;
+}
+@media (max-width: 767px) {
+ .content-wrapper,
+ .right-side,
+ .main-footer {
+ margin-left: 0;
+ }
+}
+@media (min-width: 768px) {
+ .sidebar-collapse .content-wrapper,
+ .sidebar-collapse .right-side,
+ .sidebar-collapse .main-footer {
+ margin-left: 0;
+ }
+}
+@media (max-width: 767px) {
+ .sidebar-open .content-wrapper,
+ .sidebar-open .right-side,
+ .sidebar-open .main-footer {
+ -webkit-transform: translate(230px, 0);
+ -ms-transform: translate(230px, 0);
+ -o-transform: translate(230px, 0);
+ transform: translate(230px, 0);
+ }
+}
+.content-wrapper,
+.right-side {
+ min-height: 100%;
+ background-color: #ecf0f5;
+ z-index: 800;
+}
+.main-footer {
+ background: #fff;
+ padding: 15px;
+ color: #444;
+ border-top: 1px solid #d2d6de;
+}
+/* Fixed layout */
+.fixed .main-header,
+.fixed .main-sidebar,
+.fixed .left-side {
+ position: fixed;
+}
+.fixed .main-header {
+ top: 0;
+ right: 0;
+ left: 0;
+}
+.fixed .content-wrapper,
+.fixed .right-side {
+ padding-top: 50px;
+}
+@media (max-width: 767px) {
+ .fixed .content-wrapper,
+ .fixed .right-side {
+ padding-top: 100px;
+ }
+}
+.fixed.layout-boxed .wrapper {
+ max-width: 100%;
+}
+/* Content */
+.content {
+ min-height: 250px;
+ padding: 15px;
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 15px;
+ padding-right: 15px;
+}
+/* H1 - H6 font */
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+.h1,
+.h2,
+.h3,
+.h4,
+.h5,
+.h6 {
+ font-family: 'Source Sans Pro', sans-serif;
+}
+/* General Links */
+a {
+ color: #3c8dbc;
+}
+a:hover,
+a:active,
+a:focus {
+ outline: none;
+ text-decoration: none;
+ color: #72afd2;
+}
+/* Page Header */
+.page-header {
+ margin: 10px 0 20px 0;
+ font-size: 22px;
+}
+.page-header > small {
+ color: #666;
+ display: block;
+ margin-top: 5px;
+}
+/*
+ * Component: Main Header
+ * ----------------------
+ */
+.main-header {
+ position: relative;
+ max-height: 100px;
+ z-index: 1030;
+}
+.main-header > .navbar {
+ -webkit-transition: margin-left 0.3s ease-in-out;
+ -o-transition: margin-left 0.3s ease-in-out;
+ transition: margin-left 0.3s ease-in-out;
+ margin-bottom: 0;
+ margin-left: 230px;
+ border: none;
+ min-height: 50px;
+ border-radius: 0;
+}
+.layout-top-nav .main-header > .navbar {
+ margin-left: 0!important;
+}
+.main-header #navbar-search-input {
+ background: rgba(255, 255, 255, 0.2);
+ border-color: transparent;
+}
+.main-header #navbar-search-input:focus,
+.main-header #navbar-search-input:active {
+ border-color: rgba(0, 0, 0, 0.1) !important;
+ background: rgba(255, 255, 255, 0.9);
+}
+.main-header #navbar-search-input::-moz-placeholder {
+ color: #ccc;
+ opacity: 1;
+}
+.main-header #navbar-search-input:-ms-input-placeholder {
+ color: #ccc;
+}
+.main-header #navbar-search-input::-webkit-input-placeholder {
+ color: #ccc;
+}
+.main-header .navbar-custom-menu,
+.main-header .navbar-right {
+ float: right;
+}
+@media (max-width: 991px) {
+ .main-header .navbar-custom-menu a,
+ .main-header .navbar-right a {
+ color: inherit;
+ background: transparent;
+ }
+}
+@media (max-width: 767px) {
+ .main-header .navbar-right {
+ float: none;
+ }
+ .navbar-collapse .main-header .navbar-right {
+ margin: 7.5px -15px;
+ }
+ .main-header .navbar-right > li {
+ color: inherit;
+ border: 0;
+ }
+}
+.main-header .sidebar-toggle {
+ float: left;
+ background-color: transparent;
+ background-image: none;
+ padding: 15px 15px;
+ font-family: fontAwesome;
+}
+.main-header .sidebar-toggle:before {
+ content: "\f0c9";
+}
+.main-header .sidebar-toggle:hover {
+ color: #fff;
+}
+.main-header .sidebar-toggle:focus,
+.main-header .sidebar-toggle:active {
+ background: transparent;
+}
+.main-header .sidebar-toggle .icon-bar {
+ display: none;
+}
+.main-header .navbar .nav > li.user > a > .fa,
+.main-header .navbar .nav > li.user > a > .glyphicon,
+.main-header .navbar .nav > li.user > a > .ion {
+ margin-right: 5px;
+}
+.main-header .navbar .nav > li > a > .label {
+ position: absolute;
+ top: 9px;
+ right: 7px;
+ text-align: center;
+ font-size: 9px;
+ padding: 2px 3px;
+ line-height: .9;
+}
+.main-header .logo {
+ -webkit-transition: width 0.3s ease-in-out;
+ -o-transition: width 0.3s ease-in-out;
+ transition: width 0.3s ease-in-out;
+ display: block;
+ float: left;
+ height: 50px;
+ font-size: 20px;
+ line-height: 50px;
+ text-align: center;
+ width: 230px;
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ padding: 0 15px;
+ font-weight: 300;
+ overflow: hidden;
+}
+.main-header .logo .logo-lg {
+ display: block;
+}
+.main-header .logo .logo-mini {
+ display: none;
+}
+.main-header .navbar-brand {
+ color: #fff;
+}
+.content-header {
+ position: relative;
+ padding: 15px 15px 0 15px;
+}
+.content-header > h1 {
+ margin: 0;
+ font-size: 24px;
+}
+.content-header > h1 > small {
+ font-size: 15px;
+ display: inline-block;
+ padding-left: 4px;
+ font-weight: 300;
+}
+.content-header > .breadcrumb {
+ float: right;
+ background: transparent;
+ margin-top: 0px;
+ margin-bottom: 0;
+ font-size: 12px;
+ padding: 7px 5px;
+ position: absolute;
+ top: 15px;
+ right: 10px;
+ border-radius: 2px;
+}
+.content-header > .breadcrumb > li > a {
+ color: #444;
+ text-decoration: none;
+ display: inline-block;
+}
+.content-header > .breadcrumb > li > a > .fa,
+.content-header > .breadcrumb > li > a > .glyphicon,
+.content-header > .breadcrumb > li > a > .ion {
+ margin-right: 5px;
+}
+.content-header > .breadcrumb > li + li:before {
+ content: '>\00a0';
+}
+@media (max-width: 991px) {
+ .content-header > .breadcrumb {
+ position: relative;
+ margin-top: 5px;
+ top: 0;
+ right: 0;
+ float: none;
+ background: #d2d6de;
+ padding-left: 10px;
+ }
+ .content-header > .breadcrumb li:before {
+ color: #97a0b3;
+ }
+}
+.navbar-toggle {
+ color: #fff;
+ border: 0;
+ margin: 0;
+ padding: 15px 15px;
+}
+@media (max-width: 991px) {
+ .navbar-custom-menu .navbar-nav > li {
+ float: left;
+ }
+ .navbar-custom-menu .navbar-nav {
+ margin: 0;
+ float: left;
+ }
+ .navbar-custom-menu .navbar-nav > li > a {
+ padding-top: 15px;
+ padding-bottom: 15px;
+ line-height: 20px;
+ }
+}
+@media (max-width: 767px) {
+ .main-header {
+ position: relative;
+ }
+ .main-header .logo,
+ .main-header .navbar {
+ width: 100%;
+ float: none;
+ position: relative!important;
+ }
+ .main-header .navbar {
+ margin: 0;
+ }
+ .main-header .navbar-custom-menu {
+ float: right;
+ }
+ .main-sidebar,
+ .left-side {
+ padding-top: 100px!important;
+ }
+}
+@media (max-width: 991px) {
+ .navbar-collapse.pull-left {
+ float: none!important;
+ }
+ .navbar-collapse.pull-left + .navbar-custom-menu {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 40px;
+ }
+}
+/*
+ * Component: Sidebar
+ * ------------------
+ */
+.main-sidebar,
+.left-side {
+ position: absolute;
+ top: 0;
+ left: 0;
+ padding-top: 50px;
+ min-height: 100%;
+ width: 230px;
+ z-index: 810;
+ -webkit-transition: -webkit-transform 0.3s ease-in-out, width 0.3s ease-in-out;
+ -moz-transition: -moz-transform 0.3s ease-in-out, width 0.3s ease-in-out;
+ -o-transition: -o-transform 0.3s ease-in-out, width 0.3s ease-in-out;
+ transition: transform 0.3s ease-in-out, width 0.3s ease-in-out;
+}
+@media (max-width: 767px) {
+ .main-sidebar,
+ .left-side {
+ -webkit-transform: translate(-230px, 0);
+ -ms-transform: translate(-230px, 0);
+ -o-transform: translate(-230px, 0);
+ transform: translate(-230px, 0);
+ }
+}
+@media (min-width: 768px) {
+ .sidebar-collapse .main-sidebar,
+ .sidebar-collapse .left-side {
+ -webkit-transform: translate(-230px, 0);
+ -ms-transform: translate(-230px, 0);
+ -o-transform: translate(-230px, 0);
+ transform: translate(-230px, 0);
+ }
+}
+@media (max-width: 767px) {
+ .sidebar-open .main-sidebar,
+ .sidebar-open .left-side {
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ -o-transform: translate(0, 0);
+ transform: translate(0, 0);
+ }
+}
+.sidebar {
+ padding-bottom: 10px;
+}
+.sidebar-form input:focus {
+ border-color: transparent!important;
+}
+.user-panel {
+ position: relative;
+ width: 100%;
+ padding: 10px;
+ overflow: hidden;
+}
+.user-panel:before,
+.user-panel:after {
+ content: " ";
+ display: table;
+}
+.user-panel:after {
+ clear: both;
+}
+.user-panel > .image > img {
+ width: 100%;
+ max-width: 45px;
+ height: auto;
+}
+.user-panel > .info {
+ padding: 5px 5px 5px 15px;
+ line-height: 1;
+ position: absolute;
+ left: 55px;
+}
+.user-panel > .info > p {
+ font-weight: 600;
+ margin-bottom: 9px;
+}
+.user-panel > .info > a {
+ text-decoration: none;
+ padding-right: 5px;
+ margin-top: 3px;
+ font-size: 11px;
+}
+.user-panel > .info > a > .fa,
+.user-panel > .info > a > .ion,
+.user-panel > .info > a > .glyphicon {
+ margin-right: 3px;
+}
+.sidebar-menu {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+.sidebar-menu > li {
+ position: relative;
+ margin: 0;
+ padding: 0;
+}
+.sidebar-menu > li > a {
+ padding: 12px 5px 12px 15px;
+ display: block;
+}
+.sidebar-menu > li > a > .fa,
+.sidebar-menu > li > a > .glyphicon,
+.sidebar-menu > li > a > .ion {
+ width: 20px;
+}
+.sidebar-menu > li .label,
+.sidebar-menu > li .badge {
+ margin-top: 3px;
+ margin-right: 5px;
+}
+.sidebar-menu li.header {
+ padding: 10px 25px 10px 15px;
+ font-size: 12px;
+}
+.sidebar-menu li > a > .fa-angle-left {
+ width: auto;
+ height: auto;
+ padding: 0;
+ margin-right: 10px;
+ margin-top: 3px;
+}
+.sidebar-menu li.active > a > .fa-angle-left {
+ -webkit-transform: rotate(-90deg);
+ -ms-transform: rotate(-90deg);
+ -o-transform: rotate(-90deg);
+ transform: rotate(-90deg);
+}
+.sidebar-menu li.active > .treeview-menu {
+ display: block;
+}
+.sidebar-menu .treeview-menu {
+ display: none;
+ list-style: none;
+ padding: 0;
+ margin: 0;
+ padding-left: 5px;
+}
+.sidebar-menu .treeview-menu .treeview-menu {
+ padding-left: 20px;
+}
+.sidebar-menu .treeview-menu > li {
+ margin: 0;
+}
+.sidebar-menu .treeview-menu > li > a {
+ padding: 5px 5px 5px 15px;
+ display: block;
+ font-size: 14px;
+}
+.sidebar-menu .treeview-menu > li > a > .fa,
+.sidebar-menu .treeview-menu > li > a > .glyphicon,
+.sidebar-menu .treeview-menu > li > a > .ion {
+ width: 20px;
+}
+.sidebar-menu .treeview-menu > li > a > .fa-angle-left,
+.sidebar-menu .treeview-menu > li > a > .fa-angle-down {
+ width: auto;
+}
+/*
+ * Component: Sidebar Mini
+ */
+@media (min-width: 768px) {
+ .sidebar-mini.sidebar-collapse .content-wrapper,
+ .sidebar-mini.sidebar-collapse .right-side,
+ .sidebar-mini.sidebar-collapse .main-footer {
+ margin-left: 50px!important;
+ z-index: 840;
+ }
+ .sidebar-mini.sidebar-collapse .main-sidebar {
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ -o-transform: translate(0, 0);
+ transform: translate(0, 0);
+ width: 50px!important;
+ z-index: 850;
+ }
+ .sidebar-mini.sidebar-collapse .sidebar-menu > li {
+ position: relative;
+ }
+ .sidebar-mini.sidebar-collapse .sidebar-menu > li > a {
+ margin-right: 0;
+ }
+ .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span {
+ border-top-right-radius: 4px;
+ }
+ .sidebar-mini.sidebar-collapse .sidebar-menu > li:not(.treeview) > a > span {
+ border-bottom-right-radius: 4px;
+ }
+ .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu {
+ padding-top: 5px;
+ padding-bottom: 5px;
+ border-bottom-right-radius: 4px;
+ }
+ .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span:not(.pull-right),
+ .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu {
+ display: block!important;
+ position: absolute;
+ width: 180px;
+ left: 50px;
+ }
+ .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > span {
+ top: 0;
+ margin-left: -3px;
+ padding: 12px 5px 12px 20px;
+ background-color: inherit;
+ }
+ .sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu {
+ top: 44px;
+ margin-left: 0;
+ }
+ .sidebar-mini.sidebar-collapse .main-sidebar .user-panel > .info,
+ .sidebar-mini.sidebar-collapse .sidebar-form,
+ .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > span,
+ .sidebar-mini.sidebar-collapse .sidebar-menu > li > .treeview-menu,
+ .sidebar-mini.sidebar-collapse .sidebar-menu > li > a > .pull-right,
+ .sidebar-mini.sidebar-collapse .sidebar-menu li.header {
+ display: none!important;
+ }
+ .sidebar-mini.sidebar-collapse .main-header .logo {
+ width: 50px;
+ }
+ .sidebar-mini.sidebar-collapse .main-header .logo > .logo-mini {
+ display: block;
+ margin-left: -15px;
+ margin-right: -15px;
+ font-size: 18px;
+ }
+ .sidebar-mini.sidebar-collapse .main-header .logo > .logo-lg {
+ display: none;
+ }
+ .sidebar-mini.sidebar-collapse .main-header .navbar {
+ margin-left: 50px;
+ }
+}
+.sidebar-menu,
+.main-sidebar .user-panel,
+.sidebar-menu > li.header {
+ white-space: nowrap!important;
+ overflow: hidden;
+}
+.sidebar-menu:hover {
+ overflow: visible;
+}
+.sidebar-form,
+.sidebar-menu > li.header {
+ overflow: hidden;
+ text-overflow: clip;
+}
+.sidebar-menu li > a {
+ position: relative;
+}
+.sidebar-menu li > a > .pull-right {
+ position: absolute;
+ top: 50%;
+ right: 10px;
+ margin-top: -7px;
+}
+/*
+ * Component: Control sidebar. By default, this is the right sidebar.
+ */
+.control-sidebar-bg {
+ position: fixed;
+ z-index: 1000;
+ bottom: 0;
+}
+.control-sidebar-bg,
+.control-sidebar {
+ top: 0;
+ right: -230px;
+ width: 230px;
+ -webkit-transition: right 0.3s ease-in-out;
+ -o-transition: right 0.3s ease-in-out;
+ transition: right 0.3s ease-in-out;
+}
+.control-sidebar {
+ position: absolute;
+ padding-top: 50px;
+ z-index: 1010;
+}
+@media (max-width: 768px) {
+ .control-sidebar {
+ padding-top: 100px;
+ }
+}
+.control-sidebar > .tab-content {
+ padding: 10px 15px;
+}
+.control-sidebar.control-sidebar-open,
+.control-sidebar.control-sidebar-open + .control-sidebar-bg {
+ right: 0;
+}
+.control-sidebar-open .control-sidebar-bg,
+.control-sidebar-open .control-sidebar {
+ right: 0;
+}
+@media (min-width: 768px) {
+ .control-sidebar-open .content-wrapper,
+ .control-sidebar-open .right-side,
+ .control-sidebar-open .main-footer {
+ margin-right: 230px;
+ }
+}
+.control-sidebar-tabs > li:first-of-type > a {
+ margin-left: 1px;
+}
+.control-sidebar-tabs > li:first-of-type > a,
+.control-sidebar-tabs > li:first-of-type > a:hover {
+ border-left-width: 0!important;
+}
+.control-sidebar-tabs > li > a {
+ border-radius: 0 !important;
+}
+.control-sidebar-tabs > li > a,
+.control-sidebar-tabs > li > a:hover {
+ border-top: none;
+ border-right: none;
+ border-left: 1px solid transparent!important;
+ border-bottom: 1px solid transparent!important;
+}
+.control-sidebar-tabs > li > a .icon {
+ font-size: 16px;
+}
+.control-sidebar-tabs > li.active > a,
+.control-sidebar-tabs > li.active > a:hover,
+.control-sidebar-tabs > li.active > a:focus,
+.control-sidebar-tabs > li.active > a:active {
+ border-top: none!important;
+ border-right: none!important;
+ border-bottom: none!important;
+}
+@media (max-width: 768px) {
+ .control-sidebar-tabs {
+ display: table;
+ }
+ .control-sidebar-tabs > li {
+ display: table-cell !important;
+ }
+}
+.control-sidebar-heading {
+ font-weight: 400;
+ font-size: 16px;
+ padding: 10px 0;
+ margin-bottom: 10px;
+}
+.control-sidebar-subheading {
+ display: block;
+ font-weight: 400;
+ font-size: 14px;
+}
+.control-sidebar-menu {
+ list-style: none;
+ padding: 0;
+ margin: 0 -15px;
+}
+.control-sidebar-menu > li > a {
+ display: block;
+ padding: 10px 15px;
+}
+.control-sidebar-menu > li > a:before,
+.control-sidebar-menu > li > a:after {
+ content: " ";
+ display: table;
+}
+.control-sidebar-menu > li > a:after {
+ clear: both;
+}
+.control-sidebar-menu > li > a > .control-sidebar-subheading {
+ margin-top: 0;
+}
+.control-sidebar-menu .menu-icon {
+ float: left;
+ width: 35px;
+ height: 35px;
+ border-radius: 50%;
+ text-align: center;
+ line-height: 35px;
+}
+.control-sidebar-menu .menu-info {
+ margin-left: 45px;
+ margin-top: 3px;
+}
+.control-sidebar-menu .menu-info > .control-sidebar-subheading {
+ margin: 0;
+}
+.control-sidebar-menu .menu-info > p {
+ margin: 0;
+ font-size: 11px;
+}
+.control-sidebar-menu .progress {
+ margin: 0;
+}
+.control-sidebar-dark {
+ color: #b8c7ce;
+}
+.control-sidebar-dark,
+.control-sidebar-dark + .control-sidebar-bg {
+ background: #222d32;
+}
+.control-sidebar-dark .control-sidebar-tabs {
+ border-bottom: #1c2529;
+}
+.control-sidebar-dark .control-sidebar-tabs > li > a {
+ background: #181f23;
+ color: #b8c7ce;
+}
+.control-sidebar-dark .control-sidebar-tabs > li > a,
+.control-sidebar-dark .control-sidebar-tabs > li > a:hover {
+ border-left-color: #141a1d !important;
+ border-bottom-color: #141a1d !important;
+}
+.control-sidebar-dark .control-sidebar-tabs > li > a:hover,
+.control-sidebar-dark .control-sidebar-tabs > li > a:focus,
+.control-sidebar-dark .control-sidebar-tabs > li > a:active {
+ background: #1c2529;
+}
+.control-sidebar-dark .control-sidebar-tabs > li.active > a,
+.control-sidebar-dark .control-sidebar-tabs > li.active > a:hover,
+.control-sidebar-dark .control-sidebar-tabs > li.active > a:focus,
+.control-sidebar-dark .control-sidebar-tabs > li.active > a:active {
+ background: #222d32;
+ color: #fff;
+}
+.control-sidebar-dark .control-sidebar-heading,
+.control-sidebar-dark .control-sidebar-subheading {
+ color: #fff;
+}
+.control-sidebar-dark .control-sidebar-menu > li > a:hover {
+ background: #1e282c;
+}
+.control-sidebar-dark .control-sidebar-menu > li > a .menu-info > p {
+ color: #b8c7ce;
+}
+.control-sidebar-light {
+ color: #5e5e5e;
+}
+.control-sidebar-light,
+.control-sidebar-light + .control-sidebar-bg {
+ background: #f9fafc;
+ border-left: 1px solid #d2d6de;
+}
+.control-sidebar-light .control-sidebar-tabs {
+ border-bottom: #d2d6de;
+}
+.control-sidebar-light .control-sidebar-tabs > li > a {
+ background: #e8ecf4;
+ color: #444444;
+}
+.control-sidebar-light .control-sidebar-tabs > li > a,
+.control-sidebar-light .control-sidebar-tabs > li > a:hover {
+ border-left-color: #d2d6de !important;
+ border-bottom-color: #d2d6de !important;
+}
+.control-sidebar-light .control-sidebar-tabs > li > a:hover,
+.control-sidebar-light .control-sidebar-tabs > li > a:focus,
+.control-sidebar-light .control-sidebar-tabs > li > a:active {
+ background: #eff1f7;
+}
+.control-sidebar-light .control-sidebar-tabs > li.active > a,
+.control-sidebar-light .control-sidebar-tabs > li.active > a:hover,
+.control-sidebar-light .control-sidebar-tabs > li.active > a:focus,
+.control-sidebar-light .control-sidebar-tabs > li.active > a:active {
+ background: #f9fafc;
+ color: #111;
+}
+.control-sidebar-light .control-sidebar-heading,
+.control-sidebar-light .control-sidebar-subheading {
+ color: #111;
+}
+.control-sidebar-light .control-sidebar-menu {
+ margin-left: -14px;
+}
+.control-sidebar-light .control-sidebar-menu > li > a:hover {
+ background: #f4f4f5;
+}
+.control-sidebar-light .control-sidebar-menu > li > a .menu-info > p {
+ color: #5e5e5e;
+}
+/*
+ * Component: Dropdown menus
+ * -------------------------
+ */
+/*Dropdowns in general*/
+.dropdown-menu {
+ box-shadow: none;
+ border-color: #eee;
+}
+.dropdown-menu > li > a {
+ color: #777;
+}
+.dropdown-menu > li > a > .glyphicon,
+.dropdown-menu > li > a > .fa,
+.dropdown-menu > li > a > .ion {
+ margin-right: 10px;
+}
+.dropdown-menu > li > a:hover {
+ background-color: #e1e3e9;
+ color: #333;
+}
+.dropdown-menu > .divider {
+ background-color: #eee;
+}
+.navbar-nav .dropdown-menu {
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important;
+}
+.navbar-nav > .notifications-menu,
+.navbar-nav > .messages-menu,
+.navbar-nav > .tasks-menu {
+ position: relative;
+}
+.navbar-nav > .notifications-menu > .dropdown-menu,
+.navbar-nav > .messages-menu > .dropdown-menu,
+.navbar-nav > .tasks-menu > .dropdown-menu {
+ width: 280px;
+ padding: 0 0 0 0!important;
+ margin: 0!important;
+ top: 100%;
+}
+.navbar-nav > .notifications-menu > .dropdown-menu > li,
+.navbar-nav > .messages-menu > .dropdown-menu > li,
+.navbar-nav > .tasks-menu > .dropdown-menu > li {
+ position: relative;
+}
+.navbar-nav > .notifications-menu > .dropdown-menu > li.header,
+.navbar-nav > .messages-menu > .dropdown-menu > li.header,
+.navbar-nav > .tasks-menu > .dropdown-menu > li.header {
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+ background-color: #ffffff;
+ padding: 7px 10px;
+ border-bottom: 1px solid #f4f4f4;
+ color: #444444;
+ font-size: 14px;
+}
+.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a,
+.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a,
+.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a {
+ border-top-left-radius: 0px;
+ border-top-right-radius: 0px;
+ border-bottom-right-radius: 4px;
+ border-bottom-left-radius: 4px;
+ font-size: 12px;
+ background-color: #fff;
+ padding: 7px 10px;
+ border-bottom: 1px solid #eeeeee;
+ color: #444!important;
+ text-align: center;
+}
+@media (max-width: 991px) {
+ .navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a,
+ .navbar-nav > .messages-menu > .dropdown-menu > li.footer > a,
+ .navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a {
+ background: #fff!important;
+ color: #444!important;
+ }
+}
+.navbar-nav > .notifications-menu > .dropdown-menu > li.footer > a:hover,
+.navbar-nav > .messages-menu > .dropdown-menu > li.footer > a:hover,
+.navbar-nav > .tasks-menu > .dropdown-menu > li.footer > a:hover {
+ text-decoration: none;
+ font-weight: normal;
+}
+.navbar-nav > .notifications-menu > .dropdown-menu > li .menu,
+.navbar-nav > .messages-menu > .dropdown-menu > li .menu,
+.navbar-nav > .tasks-menu > .dropdown-menu > li .menu {
+ max-height: 200px;
+ margin: 0;
+ padding: 0;
+ list-style: none;
+ overflow-x: hidden;
+}
+.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a,
+.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a,
+.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a {
+ display: block;
+ white-space: nowrap;
+ /* Prevent text from breaking */
+ border-bottom: 1px solid #f4f4f4;
+}
+.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a:hover,
+.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:hover,
+.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a:hover {
+ background: #f4f4f4;
+ text-decoration: none;
+}
+.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a {
+ color: #444444;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ padding: 10px;
+}
+.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .glyphicon,
+.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .fa,
+.navbar-nav > .notifications-menu > .dropdown-menu > li .menu > li > a > .ion {
+ width: 20px;
+}
+.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a {
+ margin: 0px;
+ padding: 10px 10px;
+}
+.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > div > img {
+ margin: auto 10px auto auto;
+ width: 40px;
+ height: 40px;
+}
+.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 {
+ padding: 0;
+ margin: 0 0 0 45px;
+ color: #444444;
+ font-size: 15px;
+ position: relative;
+}
+.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > h4 > small {
+ color: #999999;
+ font-size: 10px;
+ position: absolute;
+ top: 0px;
+ right: 0px;
+}
+.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a > p {
+ margin: 0 0 0 45px;
+ font-size: 12px;
+ color: #888888;
+}
+.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:before,
+.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after {
+ content: " ";
+ display: table;
+}
+.navbar-nav > .messages-menu > .dropdown-menu > li .menu > li > a:after {
+ clear: both;
+}
+.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a {
+ padding: 10px;
+}
+.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > h3 {
+ font-size: 14px;
+ padding: 0;
+ margin: 0 0 10px 0;
+ color: #666666;
+}
+.navbar-nav > .tasks-menu > .dropdown-menu > li .menu > li > a > .progress {
+ padding: 0;
+ margin: 0;
+}
+.navbar-nav > .user-menu > .dropdown-menu {
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+ padding: 1px 0 0 0;
+ border-top-width: 0;
+ width: 280px;
+}
+.navbar-nav > .user-menu > .dropdown-menu,
+.navbar-nav > .user-menu > .dropdown-menu > .user-body {
+ border-bottom-right-radius: 4px;
+ border-bottom-left-radius: 4px;
+}
+.navbar-nav > .user-menu > .dropdown-menu > li.user-header {
+ height: 175px;
+ padding: 10px;
+ text-align: center;
+}
+.navbar-nav > .user-menu > .dropdown-menu > li.user-header > img {
+ z-index: 5;
+ height: 90px;
+ width: 90px;
+ border: 3px solid;
+ border-color: transparent;
+ border-color: rgba(255, 255, 255, 0.2);
+}
+.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p {
+ z-index: 5;
+ color: #fff;
+ color: rgba(255, 255, 255, 0.8);
+ font-size: 17px;
+ margin-top: 10px;
+}
+.navbar-nav > .user-menu > .dropdown-menu > li.user-header > p > small {
+ display: block;
+ font-size: 12px;
+}
+.navbar-nav > .user-menu > .dropdown-menu > .user-body {
+ padding: 15px;
+ border-bottom: 1px solid #f4f4f4;
+ border-top: 1px solid #dddddd;
+}
+.navbar-nav > .user-menu > .dropdown-menu > .user-body:before,
+.navbar-nav > .user-menu > .dropdown-menu > .user-body:after {
+ content: " ";
+ display: table;
+}
+.navbar-nav > .user-menu > .dropdown-menu > .user-body:after {
+ clear: both;
+}
+.navbar-nav > .user-menu > .dropdown-menu > .user-body a {
+ color: #444 !important;
+}
+@media (max-width: 991px) {
+ .navbar-nav > .user-menu > .dropdown-menu > .user-body a {
+ background: #fff !important;
+ color: #444 !important;
+ }
+}
+.navbar-nav > .user-menu > .dropdown-menu > .user-footer {
+ background-color: #f9f9f9;
+ padding: 10px;
+}
+.navbar-nav > .user-menu > .dropdown-menu > .user-footer:before,
+.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after {
+ content: " ";
+ display: table;
+}
+.navbar-nav > .user-menu > .dropdown-menu > .user-footer:after {
+ clear: both;
+}
+.navbar-nav > .user-menu > .dropdown-menu > .user-footer .btn-default {
+ color: #666666;
+}
+.navbar-nav > .user-menu .user-image {
+ float: left;
+ width: 25px;
+ height: 25px;
+ border-radius: 50%;
+ margin-right: 10px;
+ margin-top: -2px;
+}
+@media (max-width: 767px) {
+ .navbar-nav > .user-menu .user-image {
+ float: none;
+ margin-right: 0;
+ margin-top: -8px;
+ line-height: 10px;
+ }
+}
+/* Add fade animation to dropdown menus by appending
+ the class .animated-dropdown-menu to the .dropdown-menu ul (or ol)*/
+.open:not(.dropup) > .animated-dropdown-menu {
+ backface-visibility: visible !important;
+ -webkit-animation: flipInX 0.7s both;
+ -o-animation: flipInX 0.7s both;
+ animation: flipInX 0.7s both;
+}
+@keyframes flipInX {
+ 0% {
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ transition-timing-function: ease-in;
+ opacity: 0;
+ }
+ 40% {
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ transition-timing-function: ease-in;
+ }
+ 60% {
+ transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+ opacity: 1;
+ }
+ 80% {
+ transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+ }
+ 100% {
+ transform: perspective(400px);
+ }
+}
+@-webkit-keyframes flipInX {
+ 0% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
+ -webkit-transition-timing-function: ease-in;
+ opacity: 0;
+ }
+ 40% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
+ -webkit-transition-timing-function: ease-in;
+ }
+ 60% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
+ opacity: 1;
+ }
+ 80% {
+ -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
+ }
+ 100% {
+ -webkit-transform: perspective(400px);
+ }
+}
+/* Fix dropdown menu in navbars */
+.navbar-custom-menu > .navbar-nav > li {
+ position: relative;
+}
+.navbar-custom-menu > .navbar-nav > li > .dropdown-menu {
+ position: absolute;
+ right: 0;
+ left: auto;
+}
+@media (max-width: 991px) {
+ .navbar-custom-menu > .navbar-nav {
+ float: right;
+ }
+ .navbar-custom-menu > .navbar-nav > li {
+ position: static;
+ }
+ .navbar-custom-menu > .navbar-nav > li > .dropdown-menu {
+ position: absolute;
+ right: 5%;
+ left: auto;
+ border: 1px solid #ddd;
+ background: #fff;
+ }
+}
+/*
+ * Component: Form
+ * ---------------
+ */
+.form-control {
+ border-radius: 0px !important;
+ box-shadow: none;
+ border-color: #d2d6de;
+}
+.form-control:focus {
+ border-color: #3c8dbc !important;
+ box-shadow: none;
+}
+.form-control::-moz-placeholder {
+ color: #bbb;
+ opacity: 1;
+}
+.form-control:-ms-input-placeholder {
+ color: #bbb;
+}
+.form-control::-webkit-input-placeholder {
+ color: #bbb;
+}
+.form-control:not(select) {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+.form-group.has-success label {
+ color: #00a65a;
+}
+.form-group.has-success .form-control {
+ border-color: #00a65a !important;
+ box-shadow: none;
+}
+.form-group.has-warning label {
+ color: #f39c12;
+}
+.form-group.has-warning .form-control {
+ border-color: #f39c12 !important;
+ box-shadow: none;
+}
+.form-group.has-error label {
+ color: #dd4b39;
+}
+.form-group.has-error .form-control {
+ border-color: #dd4b39 !important;
+ box-shadow: none;
+}
+/* Input group */
+.input-group .input-group-addon {
+ border-radius: 0px;
+ border-color: #d2d6de;
+ background-color: #fff;
+}
+/* button groups */
+.btn-group-vertical .btn.btn-flat:first-of-type,
+.btn-group-vertical .btn.btn-flat:last-of-type {
+ border-radius: 0;
+}
+.icheck > label {
+ padding-left: 0;
+}
+/*
+ * Component: Progress Bar
+ * -----------------------
+ */
+.progress,
+.progress > .progress-bar {
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.progress,
+.progress > .progress-bar,
+.progress .progress-bar,
+.progress > .progress-bar .progress-bar {
+ border-radius: 1px;
+}
+/* size variation */
+.progress.sm,
+.progress-sm {
+ height: 10px;
+}
+.progress.sm,
+.progress-sm,
+.progress.sm .progress-bar,
+.progress-sm .progress-bar {
+ border-radius: 1px;
+}
+.progress.xs,
+.progress-xs {
+ height: 7px;
+}
+.progress.xs,
+.progress-xs,
+.progress.xs .progress-bar,
+.progress-xs .progress-bar {
+ border-radius: 1px;
+}
+.progress.xxs,
+.progress-xxs {
+ height: 3px;
+}
+.progress.xxs,
+.progress-xxs,
+.progress.xxs .progress-bar,
+.progress-xxs .progress-bar {
+ border-radius: 1px;
+}
+/* Vertical bars */
+.progress.vertical {
+ position: relative;
+ width: 30px;
+ height: 200px;
+ display: inline-block;
+ margin-right: 10px;
+}
+.progress.vertical > .progress-bar {
+ width: 100%!important;
+ position: absolute;
+ bottom: 0;
+}
+.progress.vertical.sm,
+.progress.vertical.progress-sm {
+ width: 20px;
+}
+.progress.vertical.xs,
+.progress.vertical.progress-xs {
+ width: 10px;
+}
+.progress.vertical.xxs,
+.progress.vertical.progress-xxs {
+ width: 3px;
+}
+.progress-group .progress-text {
+ font-weight: 600;
+}
+.progress-group .progress-number {
+ float: right;
+}
+/* Remove margins from progress bars when put in a table */
+.table tr > td .progress {
+ margin: 0;
+}
+.progress-bar-light-blue,
+.progress-bar-primary {
+ background-color: #3c8dbc;
+}
+.progress-striped .progress-bar-light-blue,
+.progress-striped .progress-bar-primary {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-bar-green,
+.progress-bar-success {
+ background-color: #00a65a;
+}
+.progress-striped .progress-bar-green,
+.progress-striped .progress-bar-success {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-bar-aqua,
+.progress-bar-info {
+ background-color: #00c0ef;
+}
+.progress-striped .progress-bar-aqua,
+.progress-striped .progress-bar-info {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-bar-yellow,
+.progress-bar-warning {
+ background-color: #f39c12;
+}
+.progress-striped .progress-bar-yellow,
+.progress-striped .progress-bar-warning {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+.progress-bar-red,
+.progress-bar-danger {
+ background-color: #dd4b39;
+}
+.progress-striped .progress-bar-red,
+.progress-striped .progress-bar-danger {
+ background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+ background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+}
+/*
+ * Component: Small Box
+ * --------------------
+ */
+.small-box {
+ border-radius: 2px;
+ position: relative;
+ display: block;
+ margin-bottom: 20px;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+.small-box > .inner {
+ padding: 10px;
+}
+.small-box > .small-box-footer {
+ position: relative;
+ text-align: center;
+ padding: 3px 0;
+ color: #fff;
+ color: rgba(255, 255, 255, 0.8);
+ display: block;
+ z-index: 10;
+ background: rgba(0, 0, 0, 0.1);
+ text-decoration: none;
+}
+.small-box > .small-box-footer:hover {
+ color: #fff;
+ background: rgba(0, 0, 0, 0.15);
+}
+.small-box h3 {
+ font-size: 38px;
+ font-weight: bold;
+ margin: 0 0 10px 0;
+ white-space: nowrap;
+ padding: 0;
+}
+.small-box p {
+ font-size: 15px;
+}
+.small-box p > small {
+ display: block;
+ color: #f9f9f9;
+ font-size: 13px;
+ margin-top: 5px;
+}
+.small-box h3,
+.small-box p {
+ z-index: 5px;
+}
+.small-box .icon {
+ -webkit-transition: all 0.3s linear;
+ -o-transition: all 0.3s linear;
+ transition: all 0.3s linear;
+ position: absolute;
+ top: -10px;
+ right: 10px;
+ z-index: 0;
+ font-size: 90px;
+ color: rgba(0, 0, 0, 0.15);
+}
+.small-box:hover {
+ text-decoration: none;
+ color: #f9f9f9;
+}
+.small-box:hover .icon {
+ font-size: 95px;
+}
+@media (max-width: 767px) {
+ .small-box {
+ text-align: center;
+ }
+ .small-box .icon {
+ display: none;
+ }
+ .small-box p {
+ font-size: 12px;
+ }
+}
+/*
+ * Component: Box
+ * --------------
+ */
+.box {
+ position: relative;
+ border-radius: 3px;
+ background: #ffffff;
+ border-top: 3px solid #d2d6de;
+ margin-bottom: 20px;
+ width: 100%;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+}
+.box.box-primary {
+ border-top-color: #3c8dbc;
+}
+.box.box-info {
+ border-top-color: #00c0ef;
+}
+.box.box-danger {
+ border-top-color: #dd4b39;
+}
+.box.box-warning {
+ border-top-color: #f39c12;
+}
+.box.box-success {
+ border-top-color: #00a65a;
+}
+.box.box-default {
+ border-top-color: #d2d6de;
+}
+.box.collapsed-box .box-body,
+.box.collapsed-box .box-footer {
+ display: none;
+}
+.box .nav-stacked > li {
+ border-bottom: 1px solid #f4f4f4;
+ margin: 0;
+}
+.box .nav-stacked > li:last-of-type {
+ border-bottom: none;
+}
+.box.height-control .box-body {
+ max-height: 300px;
+ overflow: auto;
+}
+.box .border-right {
+ border-right: 1px solid #f4f4f4;
+}
+.box .border-left {
+ border-left: 1px solid #f4f4f4;
+}
+.box.box-solid {
+ border-top: 0px;
+}
+.box.box-solid > .box-header .btn.btn-default {
+ background: transparent;
+}
+.box.box-solid > .box-header .btn:hover,
+.box.box-solid > .box-header a:hover {
+ background: rgba(0, 0, 0, 0.1) !important;
+}
+.box.box-solid.box-default {
+ border: 1px solid #d2d6de;
+}
+.box.box-solid.box-default > .box-header {
+ color: #444444;
+ background: #d2d6de;
+ background-color: #d2d6de;
+}
+.box.box-solid.box-default > .box-header a,
+.box.box-solid.box-default > .box-header .btn {
+ color: #444444;
+}
+.box.box-solid.box-primary {
+ border: 1px solid #3c8dbc;
+}
+.box.box-solid.box-primary > .box-header {
+ color: #ffffff;
+ background: #3c8dbc;
+ background-color: #3c8dbc;
+}
+.box.box-solid.box-primary > .box-header a,
+.box.box-solid.box-primary > .box-header .btn {
+ color: #ffffff;
+}
+.box.box-solid.box-info {
+ border: 1px solid #00c0ef;
+}
+.box.box-solid.box-info > .box-header {
+ color: #ffffff;
+ background: #00c0ef;
+ background-color: #00c0ef;
+}
+.box.box-solid.box-info > .box-header a,
+.box.box-solid.box-info > .box-header .btn {
+ color: #ffffff;
+}
+.box.box-solid.box-danger {
+ border: 1px solid #dd4b39;
+}
+.box.box-solid.box-danger > .box-header {
+ color: #ffffff;
+ background: #dd4b39;
+ background-color: #dd4b39;
+}
+.box.box-solid.box-danger > .box-header a,
+.box.box-solid.box-danger > .box-header .btn {
+ color: #ffffff;
+}
+.box.box-solid.box-warning {
+ border: 1px solid #f39c12;
+}
+.box.box-solid.box-warning > .box-header {
+ color: #ffffff;
+ background: #f39c12;
+ background-color: #f39c12;
+}
+.box.box-solid.box-warning > .box-header a,
+.box.box-solid.box-warning > .box-header .btn {
+ color: #ffffff;
+}
+.box.box-solid.box-success {
+ border: 1px solid #00a65a;
+}
+.box.box-solid.box-success > .box-header {
+ color: #ffffff;
+ background: #00a65a;
+ background-color: #00a65a;
+}
+.box.box-solid.box-success > .box-header a,
+.box.box-solid.box-success > .box-header .btn {
+ color: #ffffff;
+}
+.box.box-solid > .box-header > .box-tools .btn {
+ border: 0;
+ box-shadow: none;
+}
+.box.box-solid[class*='bg'] > .box-header {
+ color: #fff;
+}
+.box .box-group > .box {
+ margin-bottom: 5px;
+}
+.box .knob-label {
+ text-align: center;
+ color: #333;
+ font-weight: 100;
+ font-size: 12px;
+ margin-bottom: 0.3em;
+}
+.box > .overlay,
+.overlay-wrapper > .overlay,
+.box > .loading-img,
+.overlay-wrapper > .loading-img {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+.box .overlay,
+.overlay-wrapper .overlay {
+ z-index: 50;
+ background: rgba(255, 255, 255, 0.7);
+ border-radius: 3px;
+}
+.box .overlay > .fa,
+.overlay-wrapper .overlay > .fa {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-left: -15px;
+ margin-top: -15px;
+ color: #000;
+ font-size: 30px;
+}
+.box .overlay.dark,
+.overlay-wrapper .overlay.dark {
+ background: rgba(0, 0, 0, 0.5);
+}
+.box-header:before,
+.box-body:before,
+.box-footer:before,
+.box-header:after,
+.box-body:after,
+.box-footer:after {
+ content: " ";
+ display: table;
+}
+.box-header:after,
+.box-body:after,
+.box-footer:after {
+ clear: both;
+}
+.box-header {
+ color: #444;
+ display: block;
+ padding: 10px;
+ position: relative;
+}
+.box-header.with-border {
+ border-bottom: 1px solid #f4f4f4;
+}
+.collapsed-box .box-header.with-border {
+ border-bottom: none;
+}
+.box-header > .fa,
+.box-header > .glyphicon,
+.box-header > .ion,
+.box-header .box-title {
+ display: inline-block;
+ font-size: 18px;
+ margin: 0;
+ line-height: 1;
+}
+.box-header > .fa,
+.box-header > .glyphicon,
+.box-header > .ion {
+ margin-right: 5px;
+}
+.box-header > .box-tools {
+ position: absolute;
+ right: 10px;
+ top: 5px;
+}
+.box-header > .box-tools [data-toggle="tooltip"] {
+ position: relative;
+}
+.box-header > .box-tools.pull-right .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+.btn-box-tool {
+ padding: 5px;
+ font-size: 12px;
+ background: transparent;
+ box-shadow: none!important;
+ color: #97a0b3;
+}
+.open .btn-box-tool,
+.btn-box-tool:hover {
+ color: #606c84;
+}
+.btn-box-tool:active {
+ outline: none!important;
+}
+.box-body {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+ padding: 10px;
+}
+.no-header .box-body {
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+}
+.box-body > .table {
+ margin-bottom: 0;
+}
+.box-body .fc {
+ margin-top: 5px;
+}
+.box-body .full-width-chart {
+ margin: -19px;
+}
+.box-body.no-padding .full-width-chart {
+ margin: -9px;
+}
+.box-body .box-pane {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 3px;
+}
+.box-body .box-pane-right {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 0;
+}
+.box-footer {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+ border-top: 1px solid #f4f4f4;
+ padding: 10px;
+ background-color: #ffffff;
+}
+.chart-legend {
+ margin: 10px 0;
+}
+@media (max-width: 991px) {
+ .chart-legend > li {
+ float: left;
+ margin-right: 10px;
+ }
+}
+/* Widget: TODO LIST */
+.todo-list {
+ margin: 0;
+ padding: 0px 0px;
+ list-style: none;
+ overflow: auto;
+}
+.todo-list > li {
+ border-radius: 2px;
+ padding: 10px;
+ background: #f4f4f4;
+ margin-bottom: 2px;
+ border-left: 2px solid #e6e7e8;
+ color: #444;
+}
+.todo-list > li:last-of-type {
+ margin-bottom: 0;
+}
+.todo-list > li.danger {
+ border-left-color: #dd4b39;
+}
+.todo-list > li.warning {
+ border-left-color: #f39c12;
+}
+.todo-list > li.info {
+ border-left-color: #00c0ef;
+}
+.todo-list > li.success {
+ border-left-color: #00a65a;
+}
+.todo-list > li.primary {
+ border-left-color: #3c8dbc;
+}
+.todo-list > li > input[type='checkbox'] {
+ margin: 0 10px 0 5px;
+}
+.todo-list > li .text {
+ display: inline-block;
+ margin-left: 5px;
+ font-weight: 600;
+}
+.todo-list > li .label {
+ margin-left: 10px;
+ font-size: 9px;
+}
+.todo-list > li .tools {
+ display: none;
+ float: right;
+ color: #dd4b39;
+}
+.todo-list > li .tools > .fa,
+.todo-list > li .tools > .glyphicon,
+.todo-list > li .tools > .ion {
+ margin-right: 5px;
+ cursor: pointer;
+}
+.todo-list > li:hover .tools {
+ display: inline-block;
+}
+.todo-list > li.done {
+ color: #999;
+}
+.todo-list > li.done .text {
+ text-decoration: line-through;
+ font-weight: 500;
+}
+.todo-list > li.done .label {
+ background: #d2d6de !important;
+}
+.todo-list .handle {
+ display: inline-block;
+ cursor: move;
+ margin: 0 5px;
+}
+/* Chat widget (DEPRECATED - this will be removed in the next major release. Use Direct Chat instead)*/
+.chat {
+ padding: 5px 20px 5px 10px;
+}
+.chat .item {
+ margin-bottom: 10px;
+}
+.chat .item:before,
+.chat .item:after {
+ content: " ";
+ display: table;
+}
+.chat .item:after {
+ clear: both;
+}
+.chat .item > img {
+ width: 40px;
+ height: 40px;
+ border: 2px solid transparent;
+ border-radius: 50% !important;
+}
+.chat .item > img.online {
+ border: 2px solid #00a65a;
+}
+.chat .item > img.offline {
+ border: 2px solid #dd4b39;
+}
+.chat .item > .message {
+ margin-left: 55px;
+ margin-top: -40px;
+}
+.chat .item > .message > .name {
+ display: block;
+ font-weight: 600;
+}
+.chat .item > .attachment {
+ border-radius: 3px;
+ background: #f4f4f4;
+ margin-left: 65px;
+ margin-right: 15px;
+ padding: 10px;
+}
+.chat .item > .attachment > h4 {
+ margin: 0 0 5px 0;
+ font-weight: 600;
+ font-size: 14px;
+}
+.chat .item > .attachment > p,
+.chat .item > .attachment > .filename {
+ font-weight: 600;
+ font-size: 13px;
+ font-style: italic;
+ margin: 0;
+}
+.chat .item > .attachment:before,
+.chat .item > .attachment:after {
+ content: " ";
+ display: table;
+}
+.chat .item > .attachment:after {
+ clear: both;
+}
+.box-input {
+ max-width: 200px;
+}
+/*
+ * Component: Info Box
+ * -------------------
+ */
+.info-box {
+ display: block;
+ min-height: 90px;
+ background: #fff;
+ width: 100%;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ border-radius: 2px;
+ margin-bottom: 15px;
+}
+.info-box small {
+ font-size: 14px;
+}
+.info-box .progress {
+ background: rgba(0, 0, 0, 0.2);
+ margin: 5px -10px 5px -10px;
+ height: 2px;
+}
+.info-box .progress,
+.info-box .progress .progress-bar {
+ border-radius: 0;
+}
+.info-box .progress .progress-bar {
+ background: #fff;
+}
+.info-box-icon {
+ border-top-left-radius: 2px;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 2px;
+ display: block;
+ float: left;
+ height: 90px;
+ width: 90px;
+ text-align: center;
+ font-size: 45px;
+ line-height: 90px;
+ background: rgba(0, 0, 0, 0.2);
+}
+.info-box-content {
+ padding: 5px 10px;
+ margin-left: 90px;
+}
+.info-box-number {
+ display: block;
+ font-weight: bold;
+ font-size: 18px;
+}
+.progress-description,
+.info-box-text {
+ display: block;
+ font-size: 14px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.info-box-text {
+ text-transform: uppercase;
+}
+.info-box-more {
+ display: block;
+}
+.progress-description {
+ margin: 0;
+}
+/*
+ * Component: Timeline
+ * -------------------
+ */
+.timeline {
+ position: relative;
+ margin: 0 0 30px 0;
+ padding: 0;
+ list-style: none;
+}
+.timeline:before {
+ content: '';
+ position: absolute;
+ top: 0px;
+ bottom: 0;
+ width: 4px;
+ background: #ddd;
+ left: 31px;
+ margin: 0;
+ border-radius: 2px;
+}
+.timeline > li {
+ position: relative;
+ margin-right: 10px;
+ margin-bottom: 15px;
+}
+.timeline > li:before,
+.timeline > li:after {
+ content: " ";
+ display: table;
+}
+.timeline > li:after {
+ clear: both;
+}
+.timeline > li > .timeline-item {
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ border-radius: 3px;
+ margin-top: 0px;
+ background: #fff;
+ color: #444;
+ margin-left: 60px;
+ margin-right: 15px;
+ padding: 0;
+ position: relative;
+}
+.timeline > li > .timeline-item > .time {
+ color: #999;
+ float: right;
+ padding: 10px;
+ font-size: 12px;
+}
+.timeline > li > .timeline-item > .timeline-header {
+ margin: 0;
+ color: #555;
+ border-bottom: 1px solid #f4f4f4;
+ padding: 10px;
+ font-size: 16px;
+ line-height: 1.1;
+}
+.timeline > li > .timeline-item > .timeline-header > a {
+ font-weight: 600;
+}
+.timeline > li > .timeline-item > .timeline-body,
+.timeline > li > .timeline-item > .timeline-footer {
+ padding: 10px;
+}
+.timeline > li.time-label > span {
+ font-weight: 600;
+ padding: 5px;
+ display: inline-block;
+ background-color: #fff;
+ border-radius: 4px;
+}
+.timeline > li > .fa,
+.timeline > li > .glyphicon,
+.timeline > li > .ion {
+ width: 30px;
+ height: 30px;
+ font-size: 15px;
+ line-height: 30px;
+ position: absolute;
+ color: #666;
+ background: #d2d6de;
+ border-radius: 50%;
+ text-align: center;
+ left: 18px;
+ top: 0;
+}
+/*
+ * Component: Button
+ * -----------------
+ */
+.btn {
+ border-radius: 3px;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border: 1px solid transparent;
+}
+.btn.uppercase {
+ text-transform: uppercase;
+}
+.btn.btn-flat {
+ border-radius: 0;
+ -webkit-box-shadow: none;
+ -moz-box-shadow: none;
+ box-shadow: none;
+ border-width: 1px;
+}
+.btn:active {
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn:focus {
+ outline: none;
+}
+.btn.btn-file {
+ position: relative;
+ overflow: hidden;
+}
+.btn.btn-file > input[type='file'] {
+ position: absolute;
+ top: 0;
+ right: 0;
+ min-width: 100%;
+ min-height: 100%;
+ font-size: 100px;
+ text-align: right;
+ opacity: 0;
+ filter: alpha(opacity=0);
+ outline: none;
+ background: white;
+ cursor: inherit;
+ display: block;
+}
+.btn-default {
+ background-color: #f4f4f4;
+ color: #444;
+ border-color: #ddd;
+}
+.btn-default:hover,
+.btn-default:active,
+.btn-default.hover {
+ background-color: #e7e7e7 !important;
+}
+.btn-primary {
+ background-color: #3c8dbc;
+ border-color: #367fa9;
+}
+.btn-primary:hover,
+.btn-primary:active,
+.btn-primary.hover {
+ background-color: #367fa9;
+}
+.btn-success {
+ background-color: #00a65a;
+ border-color: #008d4c;
+}
+.btn-success:hover,
+.btn-success:active,
+.btn-success.hover {
+ background-color: #008d4c;
+}
+.btn-info {
+ background-color: #00c0ef;
+ border-color: #00acd6;
+}
+.btn-info:hover,
+.btn-info:active,
+.btn-info.hover {
+ background-color: #00acd6;
+}
+.btn-danger {
+ background-color: #dd4b39;
+ border-color: #d73925;
+}
+.btn-danger:hover,
+.btn-danger:active,
+.btn-danger.hover {
+ background-color: #d73925;
+}
+.btn-warning {
+ background-color: #f39c12;
+ border-color: #e08e0b;
+}
+.btn-warning:hover,
+.btn-warning:active,
+.btn-warning.hover {
+ background-color: #e08e0b;
+}
+.btn-outline {
+ border: 1px solid #fff;
+ background: transparent;
+ color: #fff;
+}
+.btn-outline:hover,
+.btn-outline:focus,
+.btn-outline:active {
+ color: rgba(255, 255, 255, 0.7);
+ border-color: rgba(255, 255, 255, 0.7);
+}
+.btn-link {
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.btn[class*='bg-']:hover {
+ -webkit-box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2);
+ box-shadow: inset 0 0 100px rgba(0, 0, 0, 0.2);
+}
+.btn-app {
+ border-radius: 3px;
+ position: relative;
+ padding: 15px 5px;
+ margin: 0 0 10px 10px;
+ min-width: 80px;
+ height: 60px;
+ text-align: center;
+ color: #666;
+ border: 1px solid #ddd;
+ background-color: #f4f4f4;
+ font-size: 12px;
+}
+.btn-app > .fa,
+.btn-app > .glyphicon,
+.btn-app > .ion {
+ font-size: 20px;
+ display: block;
+}
+.btn-app:hover {
+ background: #f4f4f4;
+ color: #444;
+ border-color: #aaa;
+}
+.btn-app:active,
+.btn-app:focus {
+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ -moz-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
+}
+.btn-app > .badge {
+ position: absolute;
+ top: -3px;
+ right: -10px;
+ font-size: 10px;
+ font-weight: 400;
+}
+/*
+ * Component: Callout
+ * ------------------
+ */
+.callout {
+ border-radius: 3px;
+ margin: 0 0 20px 0;
+ padding: 15px 30px 15px 15px;
+ border-left: 5px solid #eee;
+}
+.callout a {
+ color: #fff;
+ text-decoration: underline;
+}
+.callout a:hover {
+ color: #eee;
+}
+.callout h4 {
+ margin-top: 0;
+ font-weight: 600;
+}
+.callout p:last-child {
+ margin-bottom: 0;
+}
+.callout code,
+.callout .highlight {
+ background-color: #fff;
+}
+.callout.callout-danger {
+ border-color: #c23321;
+}
+.callout.callout-warning {
+ border-color: #c87f0a;
+}
+.callout.callout-info {
+ border-color: #0097bc;
+}
+.callout.callout-success {
+ border-color: #00733e;
+}
+/*
+ * Component: alert
+ * ----------------
+ */
+.alert {
+ border-radius: 3px;
+}
+.alert h4 {
+ font-weight: 600;
+}
+.alert .icon {
+ margin-right: 10px;
+}
+.alert .close {
+ color: #000;
+ opacity: 0.2;
+ filter: alpha(opacity=20);
+}
+.alert .close:hover {
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+.alert a {
+ color: #fff;
+ text-decoration: underline;
+}
+.alert-success {
+ border-color: #008d4c;
+}
+.alert-danger,
+.alert-error {
+ border-color: #d73925;
+}
+.alert-warning {
+ border-color: #e08e0b;
+}
+.alert-info {
+ border-color: #00acd6;
+}
+/*
+ * Component: Nav
+ * --------------
+ */
+.nav > li > a:hover,
+.nav > li > a:active,
+.nav > li > a:focus {
+ color: #444;
+ background: #f7f7f7;
+}
+/* NAV PILLS */
+.nav-pills > li > a {
+ border-radius: 0;
+ border-top: 3px solid transparent;
+ color: #444;
+}
+.nav-pills > li > a > .fa,
+.nav-pills > li > a > .glyphicon,
+.nav-pills > li > a > .ion {
+ margin-right: 5px;
+}
+.nav-pills > li.active > a,
+.nav-pills > li.active > a:hover,
+.nav-pills > li.active > a:focus {
+ border-top-color: #3c8dbc;
+}
+.nav-pills > li.active > a {
+ font-weight: 600;
+}
+/* NAV STACKED */
+.nav-stacked > li > a {
+ border-radius: 0;
+ border-top: 0;
+ border-left: 3px solid transparent;
+ color: #444;
+}
+.nav-stacked > li.active > a,
+.nav-stacked > li.active > a:hover {
+ border-top: 0;
+ border-left-color: #3c8dbc;
+}
+.nav-stacked > li.header {
+ border-bottom: 1px solid #ddd;
+ color: #777;
+ margin-bottom: 10px;
+ padding: 5px 10px;
+ text-transform: uppercase;
+}
+/* NAV TABS */
+.nav-tabs-custom {
+ margin-bottom: 20px;
+ background: #fff;
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ border-radius: 3px;
+}
+.nav-tabs-custom > .nav-tabs {
+ margin: 0;
+ border-bottom-color: #f4f4f4;
+ border-top-right-radius: 3px;
+ border-top-left-radius: 3px;
+}
+.nav-tabs-custom > .nav-tabs > li {
+ border-top: 3px solid transparent;
+ margin-bottom: -2px;
+ margin-right: 5px;
+}
+.nav-tabs-custom > .nav-tabs > li > a {
+ color: #444;
+ border-radius: 0 !important;
+}
+.nav-tabs-custom > .nav-tabs > li > a,
+.nav-tabs-custom > .nav-tabs > li > a:hover {
+ background: transparent;
+ margin: 0;
+}
+.nav-tabs-custom > .nav-tabs > li > a:hover {
+ color: #999;
+}
+.nav-tabs-custom > .nav-tabs > li:not(.active) > a:hover,
+.nav-tabs-custom > .nav-tabs > li:not(.active) > a:focus,
+.nav-tabs-custom > .nav-tabs > li:not(.active) > a:active {
+ border-color: transparent;
+}
+.nav-tabs-custom > .nav-tabs > li.active {
+ border-top-color: #3c8dbc;
+}
+.nav-tabs-custom > .nav-tabs > li.active > a,
+.nav-tabs-custom > .nav-tabs > li.active:hover > a {
+ background-color: #fff;
+ color: #444;
+}
+.nav-tabs-custom > .nav-tabs > li.active > a {
+ border-top-color: transparent;
+ border-left-color: #f4f4f4;
+ border-right-color: #f4f4f4;
+}
+.nav-tabs-custom > .nav-tabs > li:first-of-type {
+ margin-left: 0;
+}
+.nav-tabs-custom > .nav-tabs > li:first-of-type.active > a {
+ border-left-color: transparent;
+}
+.nav-tabs-custom > .nav-tabs.pull-right {
+ float: none!important;
+}
+.nav-tabs-custom > .nav-tabs.pull-right > li {
+ float: right;
+}
+.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type {
+ margin-right: 0;
+}
+.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type > a {
+ border-left-width: 1px;
+}
+.nav-tabs-custom > .nav-tabs.pull-right > li:first-of-type.active > a {
+ border-left-color: #f4f4f4;
+ border-right-color: transparent;
+}
+.nav-tabs-custom > .nav-tabs > li.header {
+ line-height: 35px;
+ padding: 0 10px;
+ font-size: 20px;
+ color: #444;
+}
+.nav-tabs-custom > .nav-tabs > li.header > .fa,
+.nav-tabs-custom > .nav-tabs > li.header > .glyphicon,
+.nav-tabs-custom > .nav-tabs > li.header > .ion {
+ margin-right: 5px;
+}
+.nav-tabs-custom > .tab-content {
+ background: #fff;
+ padding: 10px;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+.nav-tabs-custom .dropdown.open > a:active,
+.nav-tabs-custom .dropdown.open > a:focus {
+ background: transparent;
+ color: #999;
+}
+/* PAGINATION */
+.pagination > li > a {
+ background: #fafafa;
+ color: #666;
+ border-radius: 0 !important;
+}
+/*
+ * Component: Products List
+ * ------------------------
+ */
+.products-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+.products-list > .item {
+ border-radius: 3px;
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
+ padding: 10px 0;
+ background: #fff;
+}
+.products-list > .item:before,
+.products-list > .item:after {
+ content: " ";
+ display: table;
+}
+.products-list > .item:after {
+ clear: both;
+}
+.products-list .product-img {
+ float: left;
+}
+.products-list .product-img img {
+ width: 50px;
+ height: 50px;
+}
+.products-list .product-info {
+ margin-left: 60px;
+}
+.products-list .product-title {
+ font-weight: 600;
+}
+.products-list .product-description {
+ display: block;
+ color: #999;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+.product-list-in-box > .item {
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border-radius: 0;
+ border-bottom: 1px solid #f4f4f4;
+}
+.product-list-in-box > .item:last-of-type {
+ border-bottom-width: 0;
+}
+/*
+ * Component: Table
+ * ----------------
+ */
+.table > thead > tr > th,
+.table > tbody > tr > th,
+.table > tfoot > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > td,
+.table > tfoot > tr > td {
+ border-top: 1px solid #f4f4f4;
+}
+.table > thead > tr > th {
+ border-bottom: 2px solid #f4f4f4;
+}
+.table tr td .progress {
+ margin-top: 5px;
+}
+.table-bordered {
+ border: 1px solid #f4f4f4;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > tbody > tr > th,
+.table-bordered > tfoot > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > td {
+ border: 1px solid #f4f4f4;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+ border-bottom-width: 2px;
+}
+.table.no-border,
+.table.no-border td,
+.table.no-border th {
+ border: 0;
+}
+/* .text-center in tables */
+table.text-center,
+table.text-center td,
+table.text-center th {
+ text-align: center;
+}
+.table.align th {
+ text-align: left;
+}
+.table.align td {
+ text-align: right;
+}
+/*
+ * Component: Label
+ * ----------------
+ */
+.label-default {
+ background-color: #d2d6de;
+ color: #444;
+}
+/*
+ * Component: Direct Chat
+ * ----------------------
+ */
+.direct-chat .box-body {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+ position: relative;
+ overflow-x: hidden;
+ padding: 0;
+}
+.direct-chat.chat-pane-open .direct-chat-contacts {
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ -o-transform: translate(0, 0);
+ transform: translate(0, 0);
+}
+.direct-chat-messages {
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ -o-transform: translate(0, 0);
+ transform: translate(0, 0);
+ padding: 10px;
+ height: 250px;
+ overflow: auto;
+}
+.direct-chat-msg,
+.direct-chat-text {
+ display: block;
+}
+.direct-chat-msg {
+ margin-bottom: 10px;
+}
+.direct-chat-msg:before,
+.direct-chat-msg:after {
+ content: " ";
+ display: table;
+}
+.direct-chat-msg:after {
+ clear: both;
+}
+.direct-chat-messages,
+.direct-chat-contacts {
+ -webkit-transition: -webkit-transform 0.5s ease-in-out;
+ -moz-transition: -moz-transform 0.5s ease-in-out;
+ -o-transition: -o-transform 0.5s ease-in-out;
+ transition: transform 0.5s ease-in-out;
+}
+.direct-chat-text {
+ border-radius: 5px;
+ position: relative;
+ padding: 5px 10px;
+ background: #d2d6de;
+ border: 1px solid #d2d6de;
+ margin: 5px 0 0 50px;
+ color: #444444;
+}
+.direct-chat-text:after,
+.direct-chat-text:before {
+ position: absolute;
+ right: 100%;
+ top: 15px;
+ border: solid transparent;
+ border-right-color: #d2d6de;
+ content: ' ';
+ height: 0;
+ width: 0;
+ pointer-events: none;
+}
+.direct-chat-text:after {
+ border-width: 5px;
+ margin-top: -5px;
+}
+.direct-chat-text:before {
+ border-width: 6px;
+ margin-top: -6px;
+}
+.right .direct-chat-text {
+ margin-right: 50px;
+ margin-left: 0;
+}
+.right .direct-chat-text:after,
+.right .direct-chat-text:before {
+ right: auto;
+ left: 100%;
+ border-right-color: transparent;
+ border-left-color: #d2d6de;
+}
+.direct-chat-img {
+ border-radius: 50%;
+ float: left;
+ width: 40px;
+ height: 40px;
+}
+.right .direct-chat-img {
+ float: right;
+}
+.direct-chat-info {
+ display: block;
+ margin-bottom: 2px;
+ font-size: 12px;
+}
+.direct-chat-name {
+ font-weight: 600;
+}
+.direct-chat-timestamp {
+ color: #999;
+}
+.direct-chat-contacts-open .direct-chat-contacts {
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ -o-transform: translate(0, 0);
+ transform: translate(0, 0);
+}
+.direct-chat-contacts {
+ -webkit-transform: translate(101%, 0);
+ -ms-transform: translate(101%, 0);
+ -o-transform: translate(101%, 0);
+ transform: translate(101%, 0);
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ height: 250px;
+ width: 100%;
+ background: #222d32;
+ color: #fff;
+ overflow: auto;
+}
+.contacts-list > li {
+ border-bottom: 1px solid rgba(0, 0, 0, 0.2);
+ padding: 10px;
+ margin: 0;
+}
+.contacts-list > li:before,
+.contacts-list > li:after {
+ content: " ";
+ display: table;
+}
+.contacts-list > li:after {
+ clear: both;
+}
+.contacts-list > li:last-of-type {
+ border-bottom: none;
+}
+.contacts-list-img {
+ border-radius: 50%;
+ width: 40px;
+ float: left;
+}
+.contacts-list-info {
+ margin-left: 45px;
+ color: #fff;
+}
+.contacts-list-name,
+.contacts-list-status {
+ display: block;
+}
+.contacts-list-name {
+ font-weight: 600;
+}
+.contacts-list-status {
+ font-size: 12px;
+}
+.contacts-list-date {
+ color: #aaa;
+ font-weight: normal;
+}
+.contacts-list-msg {
+ color: #999;
+}
+.direct-chat-danger .right > .direct-chat-text {
+ background: #dd4b39;
+ border-color: #dd4b39;
+ color: #ffffff;
+}
+.direct-chat-danger .right > .direct-chat-text:after,
+.direct-chat-danger .right > .direct-chat-text:before {
+ border-left-color: #dd4b39;
+}
+.direct-chat-primary .right > .direct-chat-text {
+ background: #3c8dbc;
+ border-color: #3c8dbc;
+ color: #ffffff;
+}
+.direct-chat-primary .right > .direct-chat-text:after,
+.direct-chat-primary .right > .direct-chat-text:before {
+ border-left-color: #3c8dbc;
+}
+.direct-chat-warning .right > .direct-chat-text {
+ background: #f39c12;
+ border-color: #f39c12;
+ color: #ffffff;
+}
+.direct-chat-warning .right > .direct-chat-text:after,
+.direct-chat-warning .right > .direct-chat-text:before {
+ border-left-color: #f39c12;
+}
+.direct-chat-info .right > .direct-chat-text {
+ background: #00c0ef;
+ border-color: #00c0ef;
+ color: #ffffff;
+}
+.direct-chat-info .right > .direct-chat-text:after,
+.direct-chat-info .right > .direct-chat-text:before {
+ border-left-color: #00c0ef;
+}
+.direct-chat-success .right > .direct-chat-text {
+ background: #00a65a;
+ border-color: #00a65a;
+ color: #ffffff;
+}
+.direct-chat-success .right > .direct-chat-text:after,
+.direct-chat-success .right > .direct-chat-text:before {
+ border-left-color: #00a65a;
+}
+/*
+ * Component: Users List
+ * ---------------------
+ */
+.users-list > li {
+ width: 25%;
+ float: left;
+ padding: 10px;
+ text-align: center;
+}
+.users-list > li img {
+ border-radius: 50%;
+ max-width: 100%;
+ height: auto;
+}
+.users-list > li > a:hover,
+.users-list > li > a:hover .users-list-name {
+ color: #999;
+}
+.users-list-name,
+.users-list-date {
+ display: block;
+}
+.users-list-name {
+ font-weight: 600;
+ color: #444;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+.users-list-date {
+ color: #999;
+ font-size: 12px;
+}
+/*
+ * Component: Carousel
+ * -------------------
+ */
+.carousel-control {
+ background-image: none!important;
+}
+.carousel-control > .fa {
+ font-size: 40px;
+ position: absolute;
+ top: 50%;
+ z-index: 5;
+ display: inline-block;
+ margin-top: -20px;
+}
+/*
+ * Component: modal
+ * ----------------
+ */
+.modal {
+ background: rgba(0, 0, 0, 0.3);
+}
+.modal-content {
+ border-radius: 0;
+ -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125) !important;
+ box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125) !important;
+ border: 0;
+}
+@media (min-width: 768px) {
+ .modal-content {
+ -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125) !important;
+ box-shadow: 0 2px 3px rgba(0, 0, 0, 0.125) !important;
+ }
+}
+.modal-header {
+ border-bottom-color: #f4f4f4;
+}
+.modal-footer {
+ border-top-color: #f4f4f4;
+}
+.modal-primary .modal-header,
+.modal-primary .modal-footer {
+ border-color: #307095;
+}
+.modal-warning .modal-header,
+.modal-warning .modal-footer {
+ border-color: #c87f0a;
+}
+.modal-info .modal-header,
+.modal-info .modal-footer {
+ border-color: #0097bc;
+}
+.modal-success .modal-header,
+.modal-success .modal-footer {
+ border-color: #00733e;
+}
+.modal-danger .modal-header,
+.modal-danger .modal-footer {
+ border-color: #c23321;
+}
+/*
+ * Page: Mailbox
+ * -------------
+ */
+.mailbox-messages > .table {
+ margin: 0;
+}
+.mailbox-controls {
+ padding: 5px;
+}
+.mailbox-controls.with-border {
+ border-bottom: 1px solid #f4f4f4;
+}
+.mailbox-read-info {
+ border-bottom: 1px solid #f4f4f4;
+ padding: 10px;
+}
+.mailbox-read-info h3 {
+ font-size: 20px;
+ margin: 0;
+}
+.mailbox-read-info h5 {
+ margin: 0;
+ padding: 5px 0 0 0;
+}
+.mailbox-read-time {
+ color: #999;
+ font-size: 13px;
+}
+.mailbox-read-message {
+ padding: 10px;
+}
+.mailbox-attachments li {
+ float: left;
+ width: 200px;
+ border: 1px solid #eee;
+ margin-bottom: 10px;
+ margin-right: 10px;
+}
+.mailbox-attachment-name {
+ font-weight: bold;
+ color: #666;
+}
+.mailbox-attachment-icon,
+.mailbox-attachment-info,
+.mailbox-attachment-size {
+ display: block;
+}
+.mailbox-attachment-info {
+ padding: 10px;
+ background: #f4f4f4;
+}
+.mailbox-attachment-size {
+ color: #999;
+ font-size: 12px;
+}
+.mailbox-attachment-icon {
+ text-align: center;
+ font-size: 65px;
+ color: #666;
+ padding: 20px 10px;
+}
+.mailbox-attachment-icon.has-img {
+ padding: 0;
+}
+.mailbox-attachment-icon.has-img > img {
+ max-width: 100%;
+ height: auto;
+}
+/*
+ * Page: Lock Screen
+ * -----------------
+ */
+/* ADD THIS CLASS TO THE <BODY> TAG */
+.lockscreen {
+ background: #d2d6de;
+}
+.lockscreen-logo {
+ font-size: 35px;
+ text-align: center;
+ margin-bottom: 25px;
+ font-weight: 300;
+}
+.lockscreen-logo a {
+ color: #444;
+}
+.lockscreen-wrapper {
+ max-width: 400px;
+ margin: 0 auto;
+ margin-top: 10%;
+}
+/* User name [optional] */
+.lockscreen .lockscreen-name {
+ text-align: center;
+ font-weight: 600;
+}
+/* Will contain the image and the sign in form */
+.lockscreen-item {
+ border-radius: 4px;
+ padding: 0;
+ background: #fff;
+ position: relative;
+ margin: 10px auto 30px auto;
+ width: 290px;
+}
+/* User image */
+.lockscreen-image {
+ border-radius: 50%;
+ position: absolute;
+ left: -10px;
+ top: -25px;
+ background: #fff;
+ padding: 5px;
+ z-index: 10;
+}
+.lockscreen-image > img {
+ border-radius: 50%;
+ width: 70px;
+ height: 70px;
+}
+/* Contains the password input and the login button */
+.lockscreen-credentials {
+ margin-left: 70px;
+}
+.lockscreen-credentials .form-control {
+ border: 0 !important;
+}
+.lockscreen-credentials .btn {
+ background-color: #fff;
+ border: 0;
+ padding: 0 10px;
+}
+.lockscreen-footer {
+ margin-top: 10px;
+}
+/*
+ * Page: Login & Register
+ * ----------------------
+ */
+.login-logo,
+.register-logo {
+ font-size: 35px;
+ text-align: center;
+ margin-bottom: 25px;
+ font-weight: 300;
+}
+.login-logo a,
+.register-logo a {
+ color: #444;
+}
+.login-page,
+.register-page {
+ background: #d2d6de;
+}
+.login-box,
+.register-box {
+ width: 360px;
+ margin: 7% auto;
+}
+@media (max-width: 768px) {
+ .login-box,
+ .register-box {
+ width: 90%;
+ margin-top: 20px;
+ }
+}
+.login-box-body,
+.register-box-body {
+ background: #fff;
+ padding: 20px;
+ color: #444;
+ border-top: 0;
+ color: #666;
+}
+.login-box-body .form-control-feedback,
+.register-box-body .form-control-feedback {
+ color: #777;
+}
+.login-box-msg,
+.register-box-msg {
+ margin: 0;
+ text-align: center;
+ padding: 0 20px 20px 20px;
+}
+.social-auth-links {
+ margin: 10px 0;
+}
+/*
+ * Page: 400 and 500 error pages
+ * ------------------------------
+ */
+.error-page {
+ width: 600px;
+ margin: 20px auto 0 auto;
+}
+@media (max-width: 991px) {
+ .error-page {
+ width: 100%;
+ }
+}
+.error-page > .headline {
+ float: left;
+ font-size: 100px;
+ font-weight: 300;
+}
+@media (max-width: 991px) {
+ .error-page > .headline {
+ float: none;
+ text-align: center;
+ }
+}
+.error-page > .error-content {
+ margin-left: 190px;
+ display: block;
+}
+@media (max-width: 991px) {
+ .error-page > .error-content {
+ margin-left: 0;
+ }
+}
+.error-page > .error-content > h3 {
+ font-weight: 300;
+ font-size: 25px;
+}
+@media (max-width: 991px) {
+ .error-page > .error-content > h3 {
+ text-align: center;
+ }
+}
+/*
+ * Page: Invoice
+ * -------------
+ */
+.invoice {
+ position: relative;
+ background: #fff;
+ border: 1px solid #f4f4f4;
+ padding: 20px;
+ margin: 10px 25px;
+}
+.invoice-title {
+ margin-top: 0;
+}
+/*
+ * Plugin: Social Buttons
+ * ----------------------
+ */
+.btn-social {
+ position: relative;
+ padding-left: 44px !important;
+ text-align: left;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+.btn-social :first-child {
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ width: 32px !important;
+ line-height: 34px !important;
+ font-size: 1.6em!important;
+ text-align: center;
+ border-right: 1px solid rgba(0, 0, 0, 0.2);
+}
+.btn-social.btn-lg {
+ padding-left: 61px !important;
+}
+.btn-social.btn-lg :first-child {
+ line-height: 45px;
+ width: 45px;
+ font-size: 1.8em;
+}
+.btn-social.btn-sm {
+ padding-left: 38px !important;
+}
+.btn-social.btn-sm :first-child {
+ line-height: 28px;
+ width: 28px;
+ font-size: 1.4em;
+}
+.btn-social.btn-xs {
+ padding-left: 30px !important;
+}
+.btn-social.btn-xs :first-child {
+ line-height: 20px;
+ width: 20px;
+ font-size: 1.2em;
+}
+.btn-social-icon {
+ position: relative;
+ padding-left: 44px !important;
+ text-align: left;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ height: 34px;
+ width: 34px;
+ padding: 0;
+}
+.btn-social-icon :first-child {
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ width: 32px !important;
+ line-height: 34px !important;
+ font-size: 1.6em!important;
+ text-align: center;
+ border-right: 1px solid rgba(0, 0, 0, 0.2);
+}
+.btn-social-icon.btn-lg {
+ padding-left: 61px !important;
+}
+.btn-social-icon.btn-lg :first-child {
+ line-height: 45px;
+ width: 45px;
+ font-size: 1.8em;
+}
+.btn-social-icon.btn-sm {
+ padding-left: 38px !important;
+}
+.btn-social-icon.btn-sm :first-child {
+ line-height: 28px;
+ width: 28px;
+ font-size: 1.4em;
+}
+.btn-social-icon.btn-xs {
+ padding-left: 30px !important;
+}
+.btn-social-icon.btn-xs :first-child {
+ line-height: 20px;
+ width: 20px;
+ font-size: 1.2em;
+}
+.btn-social-icon :first-child {
+ border: none;
+ text-align: center;
+ width: 100%!important;
+}
+.btn-social-icon.btn-lg {
+ height: 45px;
+ width: 45px;
+ padding-left: 0;
+ padding-right: 0;
+}
+.btn-social-icon.btn-sm {
+ height: 30px;
+ width: 30px;
+ padding-left: 0;
+ padding-right: 0;
+}
+.btn-social-icon.btn-xs {
+ height: 22px;
+ width: 22px;
+ padding-left: 0;
+ padding-right: 0;
+}
+.btn-bitbucket {
+ color: #ffffff;
+ background-color: #205081;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-bitbucket:hover,
+.btn-bitbucket:focus,
+.btn-bitbucket.focus,
+.btn-bitbucket:active,
+.btn-bitbucket.active,
+.open > .dropdown-toggle.btn-bitbucket {
+ color: #ffffff;
+ background-color: #163758;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-bitbucket:active,
+.btn-bitbucket.active,
+.open > .dropdown-toggle.btn-bitbucket {
+ background-image: none;
+}
+.btn-bitbucket.disabled,
+.btn-bitbucket[disabled],
+fieldset[disabled] .btn-bitbucket,
+.btn-bitbucket.disabled:hover,
+.btn-bitbucket[disabled]:hover,
+fieldset[disabled] .btn-bitbucket:hover,
+.btn-bitbucket.disabled:focus,
+.btn-bitbucket[disabled]:focus,
+fieldset[disabled] .btn-bitbucket:focus,
+.btn-bitbucket.disabled.focus,
+.btn-bitbucket[disabled].focus,
+fieldset[disabled] .btn-bitbucket.focus,
+.btn-bitbucket.disabled:active,
+.btn-bitbucket[disabled]:active,
+fieldset[disabled] .btn-bitbucket:active,
+.btn-bitbucket.disabled.active,
+.btn-bitbucket[disabled].active,
+fieldset[disabled] .btn-bitbucket.active {
+ background-color: #205081;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-bitbucket .badge {
+ color: #205081;
+ background-color: #ffffff;
+}
+.btn-dropbox {
+ color: #ffffff;
+ background-color: #1087dd;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-dropbox:hover,
+.btn-dropbox:focus,
+.btn-dropbox.focus,
+.btn-dropbox:active,
+.btn-dropbox.active,
+.open > .dropdown-toggle.btn-dropbox {
+ color: #ffffff;
+ background-color: #0d6aad;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-dropbox:active,
+.btn-dropbox.active,
+.open > .dropdown-toggle.btn-dropbox {
+ background-image: none;
+}
+.btn-dropbox.disabled,
+.btn-dropbox[disabled],
+fieldset[disabled] .btn-dropbox,
+.btn-dropbox.disabled:hover,
+.btn-dropbox[disabled]:hover,
+fieldset[disabled] .btn-dropbox:hover,
+.btn-dropbox.disabled:focus,
+.btn-dropbox[disabled]:focus,
+fieldset[disabled] .btn-dropbox:focus,
+.btn-dropbox.disabled.focus,
+.btn-dropbox[disabled].focus,
+fieldset[disabled] .btn-dropbox.focus,
+.btn-dropbox.disabled:active,
+.btn-dropbox[disabled]:active,
+fieldset[disabled] .btn-dropbox:active,
+.btn-dropbox.disabled.active,
+.btn-dropbox[disabled].active,
+fieldset[disabled] .btn-dropbox.active {
+ background-color: #1087dd;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-dropbox .badge {
+ color: #1087dd;
+ background-color: #ffffff;
+}
+.btn-facebook {
+ color: #ffffff;
+ background-color: #3b5998;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-facebook:hover,
+.btn-facebook:focus,
+.btn-facebook.focus,
+.btn-facebook:active,
+.btn-facebook.active,
+.open > .dropdown-toggle.btn-facebook {
+ color: #ffffff;
+ background-color: #2d4373;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-facebook:active,
+.btn-facebook.active,
+.open > .dropdown-toggle.btn-facebook {
+ background-image: none;
+}
+.btn-facebook.disabled,
+.btn-facebook[disabled],
+fieldset[disabled] .btn-facebook,
+.btn-facebook.disabled:hover,
+.btn-facebook[disabled]:hover,
+fieldset[disabled] .btn-facebook:hover,
+.btn-facebook.disabled:focus,
+.btn-facebook[disabled]:focus,
+fieldset[disabled] .btn-facebook:focus,
+.btn-facebook.disabled.focus,
+.btn-facebook[disabled].focus,
+fieldset[disabled] .btn-facebook.focus,
+.btn-facebook.disabled:active,
+.btn-facebook[disabled]:active,
+fieldset[disabled] .btn-facebook:active,
+.btn-facebook.disabled.active,
+.btn-facebook[disabled].active,
+fieldset[disabled] .btn-facebook.active {
+ background-color: #3b5998;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-facebook .badge {
+ color: #3b5998;
+ background-color: #ffffff;
+}
+.btn-flickr {
+ color: #ffffff;
+ background-color: #ff0084;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-flickr:hover,
+.btn-flickr:focus,
+.btn-flickr.focus,
+.btn-flickr:active,
+.btn-flickr.active,
+.open > .dropdown-toggle.btn-flickr {
+ color: #ffffff;
+ background-color: #cc006a;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-flickr:active,
+.btn-flickr.active,
+.open > .dropdown-toggle.btn-flickr {
+ background-image: none;
+}
+.btn-flickr.disabled,
+.btn-flickr[disabled],
+fieldset[disabled] .btn-flickr,
+.btn-flickr.disabled:hover,
+.btn-flickr[disabled]:hover,
+fieldset[disabled] .btn-flickr:hover,
+.btn-flickr.disabled:focus,
+.btn-flickr[disabled]:focus,
+fieldset[disabled] .btn-flickr:focus,
+.btn-flickr.disabled.focus,
+.btn-flickr[disabled].focus,
+fieldset[disabled] .btn-flickr.focus,
+.btn-flickr.disabled:active,
+.btn-flickr[disabled]:active,
+fieldset[disabled] .btn-flickr:active,
+.btn-flickr.disabled.active,
+.btn-flickr[disabled].active,
+fieldset[disabled] .btn-flickr.active {
+ background-color: #ff0084;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-flickr .badge {
+ color: #ff0084;
+ background-color: #ffffff;
+}
+.btn-foursquare {
+ color: #ffffff;
+ background-color: #0072b1;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-foursquare:hover,
+.btn-foursquare:focus,
+.btn-foursquare.focus,
+.btn-foursquare:active,
+.btn-foursquare.active,
+.open > .dropdown-toggle.btn-foursquare {
+ color: #ffffff;
+ background-color: #00517e;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-foursquare:active,
+.btn-foursquare.active,
+.open > .dropdown-toggle.btn-foursquare {
+ background-image: none;
+}
+.btn-foursquare.disabled,
+.btn-foursquare[disabled],
+fieldset[disabled] .btn-foursquare,
+.btn-foursquare.disabled:hover,
+.btn-foursquare[disabled]:hover,
+fieldset[disabled] .btn-foursquare:hover,
+.btn-foursquare.disabled:focus,
+.btn-foursquare[disabled]:focus,
+fieldset[disabled] .btn-foursquare:focus,
+.btn-foursquare.disabled.focus,
+.btn-foursquare[disabled].focus,
+fieldset[disabled] .btn-foursquare.focus,
+.btn-foursquare.disabled:active,
+.btn-foursquare[disabled]:active,
+fieldset[disabled] .btn-foursquare:active,
+.btn-foursquare.disabled.active,
+.btn-foursquare[disabled].active,
+fieldset[disabled] .btn-foursquare.active {
+ background-color: #0072b1;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-foursquare .badge {
+ color: #0072b1;
+ background-color: #ffffff;
+}
+.btn-github {
+ color: #ffffff;
+ background-color: #444444;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-github:hover,
+.btn-github:focus,
+.btn-github.focus,
+.btn-github:active,
+.btn-github.active,
+.open > .dropdown-toggle.btn-github {
+ color: #ffffff;
+ background-color: #2b2b2b;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-github:active,
+.btn-github.active,
+.open > .dropdown-toggle.btn-github {
+ background-image: none;
+}
+.btn-github.disabled,
+.btn-github[disabled],
+fieldset[disabled] .btn-github,
+.btn-github.disabled:hover,
+.btn-github[disabled]:hover,
+fieldset[disabled] .btn-github:hover,
+.btn-github.disabled:focus,
+.btn-github[disabled]:focus,
+fieldset[disabled] .btn-github:focus,
+.btn-github.disabled.focus,
+.btn-github[disabled].focus,
+fieldset[disabled] .btn-github.focus,
+.btn-github.disabled:active,
+.btn-github[disabled]:active,
+fieldset[disabled] .btn-github:active,
+.btn-github.disabled.active,
+.btn-github[disabled].active,
+fieldset[disabled] .btn-github.active {
+ background-color: #444444;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-github .badge {
+ color: #444444;
+ background-color: #ffffff;
+}
+.btn-google-plus {
+ color: #ffffff;
+ background-color: #dd4b39;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-google-plus:hover,
+.btn-google-plus:focus,
+.btn-google-plus.focus,
+.btn-google-plus:active,
+.btn-google-plus.active,
+.open > .dropdown-toggle.btn-google-plus {
+ color: #ffffff;
+ background-color: #c23321;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-google-plus:active,
+.btn-google-plus.active,
+.open > .dropdown-toggle.btn-google-plus {
+ background-image: none;
+}
+.btn-google-plus.disabled,
+.btn-google-plus[disabled],
+fieldset[disabled] .btn-google-plus,
+.btn-google-plus.disabled:hover,
+.btn-google-plus[disabled]:hover,
+fieldset[disabled] .btn-google-plus:hover,
+.btn-google-plus.disabled:focus,
+.btn-google-plus[disabled]:focus,
+fieldset[disabled] .btn-google-plus:focus,
+.btn-google-plus.disabled.focus,
+.btn-google-plus[disabled].focus,
+fieldset[disabled] .btn-google-plus.focus,
+.btn-google-plus.disabled:active,
+.btn-google-plus[disabled]:active,
+fieldset[disabled] .btn-google-plus:active,
+.btn-google-plus.disabled.active,
+.btn-google-plus[disabled].active,
+fieldset[disabled] .btn-google-plus.active {
+ background-color: #dd4b39;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-google-plus .badge {
+ color: #dd4b39;
+ background-color: #ffffff;
+}
+.btn-instagram {
+ color: #ffffff;
+ background-color: #3f729b;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-instagram:hover,
+.btn-instagram:focus,
+.btn-instagram.focus,
+.btn-instagram:active,
+.btn-instagram.active,
+.open > .dropdown-toggle.btn-instagram {
+ color: #ffffff;
+ background-color: #305777;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-instagram:active,
+.btn-instagram.active,
+.open > .dropdown-toggle.btn-instagram {
+ background-image: none;
+}
+.btn-instagram.disabled,
+.btn-instagram[disabled],
+fieldset[disabled] .btn-instagram,
+.btn-instagram.disabled:hover,
+.btn-instagram[disabled]:hover,
+fieldset[disabled] .btn-instagram:hover,
+.btn-instagram.disabled:focus,
+.btn-instagram[disabled]:focus,
+fieldset[disabled] .btn-instagram:focus,
+.btn-instagram.disabled.focus,
+.btn-instagram[disabled].focus,
+fieldset[disabled] .btn-instagram.focus,
+.btn-instagram.disabled:active,
+.btn-instagram[disabled]:active,
+fieldset[disabled] .btn-instagram:active,
+.btn-instagram.disabled.active,
+.btn-instagram[disabled].active,
+fieldset[disabled] .btn-instagram.active {
+ background-color: #3f729b;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-instagram .badge {
+ color: #3f729b;
+ background-color: #ffffff;
+}
+.btn-linkedin {
+ color: #ffffff;
+ background-color: #007bb6;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-linkedin:hover,
+.btn-linkedin:focus,
+.btn-linkedin.focus,
+.btn-linkedin:active,
+.btn-linkedin.active,
+.open > .dropdown-toggle.btn-linkedin {
+ color: #ffffff;
+ background-color: #005983;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-linkedin:active,
+.btn-linkedin.active,
+.open > .dropdown-toggle.btn-linkedin {
+ background-image: none;
+}
+.btn-linkedin.disabled,
+.btn-linkedin[disabled],
+fieldset[disabled] .btn-linkedin,
+.btn-linkedin.disabled:hover,
+.btn-linkedin[disabled]:hover,
+fieldset[disabled] .btn-linkedin:hover,
+.btn-linkedin.disabled:focus,
+.btn-linkedin[disabled]:focus,
+fieldset[disabled] .btn-linkedin:focus,
+.btn-linkedin.disabled.focus,
+.btn-linkedin[disabled].focus,
+fieldset[disabled] .btn-linkedin.focus,
+.btn-linkedin.disabled:active,
+.btn-linkedin[disabled]:active,
+fieldset[disabled] .btn-linkedin:active,
+.btn-linkedin.disabled.active,
+.btn-linkedin[disabled].active,
+fieldset[disabled] .btn-linkedin.active {
+ background-color: #007bb6;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-linkedin .badge {
+ color: #007bb6;
+ background-color: #ffffff;
+}
+.btn-tumblr {
+ color: #ffffff;
+ background-color: #2c4762;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-tumblr:hover,
+.btn-tumblr:focus,
+.btn-tumblr.focus,
+.btn-tumblr:active,
+.btn-tumblr.active,
+.open > .dropdown-toggle.btn-tumblr {
+ color: #ffffff;
+ background-color: #1c2d3f;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-tumblr:active,
+.btn-tumblr.active,
+.open > .dropdown-toggle.btn-tumblr {
+ background-image: none;
+}
+.btn-tumblr.disabled,
+.btn-tumblr[disabled],
+fieldset[disabled] .btn-tumblr,
+.btn-tumblr.disabled:hover,
+.btn-tumblr[disabled]:hover,
+fieldset[disabled] .btn-tumblr:hover,
+.btn-tumblr.disabled:focus,
+.btn-tumblr[disabled]:focus,
+fieldset[disabled] .btn-tumblr:focus,
+.btn-tumblr.disabled.focus,
+.btn-tumblr[disabled].focus,
+fieldset[disabled] .btn-tumblr.focus,
+.btn-tumblr.disabled:active,
+.btn-tumblr[disabled]:active,
+fieldset[disabled] .btn-tumblr:active,
+.btn-tumblr.disabled.active,
+.btn-tumblr[disabled].active,
+fieldset[disabled] .btn-tumblr.active {
+ background-color: #2c4762;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-tumblr .badge {
+ color: #2c4762;
+ background-color: #ffffff;
+}
+.btn-twitter {
+ color: #ffffff;
+ background-color: #55acee;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-twitter:hover,
+.btn-twitter:focus,
+.btn-twitter.focus,
+.btn-twitter:active,
+.btn-twitter.active,
+.open > .dropdown-toggle.btn-twitter {
+ color: #ffffff;
+ background-color: #2795e9;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-twitter:active,
+.btn-twitter.active,
+.open > .dropdown-toggle.btn-twitter {
+ background-image: none;
+}
+.btn-twitter.disabled,
+.btn-twitter[disabled],
+fieldset[disabled] .btn-twitter,
+.btn-twitter.disabled:hover,
+.btn-twitter[disabled]:hover,
+fieldset[disabled] .btn-twitter:hover,
+.btn-twitter.disabled:focus,
+.btn-twitter[disabled]:focus,
+fieldset[disabled] .btn-twitter:focus,
+.btn-twitter.disabled.focus,
+.btn-twitter[disabled].focus,
+fieldset[disabled] .btn-twitter.focus,
+.btn-twitter.disabled:active,
+.btn-twitter[disabled]:active,
+fieldset[disabled] .btn-twitter:active,
+.btn-twitter.disabled.active,
+.btn-twitter[disabled].active,
+fieldset[disabled] .btn-twitter.active {
+ background-color: #55acee;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-twitter .badge {
+ color: #55acee;
+ background-color: #ffffff;
+}
+.btn-vk {
+ color: #ffffff;
+ background-color: #587ea3;
+ border-color: rgba(0, 0, 0, 0.2);
+}
+.btn-vk:hover,
+.btn-vk:focus,
+.btn-vk.focus,
+.btn-vk:active,
+.btn-vk.active,
+.open > .dropdown-togg
<TRUNCATED>
[3/4] syncope git commit: Add AdminLTe theme provider,
new Modal dialog, new Realms tab
Posted by md...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/themes/AdminLTECssResourceReference.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/themes/AdminLTECssResourceReference.java b/client/console/src/main/java/org/apache/syncope/client/console/themes/AdminLTECssResourceReference.java
new file mode 100644
index 0000000..4eacbbd
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/themes/AdminLTECssResourceReference.java
@@ -0,0 +1,48 @@
+/*
+ * 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.themes;
+
+import de.agilecoders.wicket.core.Bootstrap;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.wicket.markup.head.CssHeaderItem;
+import org.apache.wicket.markup.head.HeaderItem;
+import org.apache.wicket.request.resource.CssResourceReference;
+
+public class AdminLTECssResourceReference extends CssResourceReference {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Singleton instance of this reference
+ */
+ public static final AdminLTECssResourceReference INSTANCE = new AdminLTECssResourceReference();
+
+ public AdminLTECssResourceReference() {
+ super(AdminLTECssResourceReference.class, "css/AdminLTE.css");
+ }
+
+ @Override
+ public List<HeaderItem> getDependencies() {
+ final List<HeaderItem> dependencies = new ArrayList<>();
+ dependencies.add(CssHeaderItem.forReference(Bootstrap.getSettings().getCssResourceReference()));
+ dependencies.addAll(super.getDependencies());
+ return dependencies;
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/markup/html/navigation/paging/AjaxDataNavigationToolbar.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/markup/html/navigation/paging/AjaxDataNavigationToolbar.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/markup/html/navigation/paging/AjaxDataNavigationToolbar.java
new file mode 100644
index 0000000..077521b
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/ajax/markup/html/navigation/paging/AjaxDataNavigationToolbar.java
@@ -0,0 +1,52 @@
+/*
+ * 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.wicket.ajax.markup.html.navigation.paging;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.navigation.ajax.BootstrapAjaxPagingNavigator;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxNavigationToolbar;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.navigation.paging.PagingNavigator;
+
+public class AjaxDataNavigationToolbar extends AjaxNavigationToolbar {
+
+ private static final long serialVersionUID = -225570234877133351L;
+
+ private final WebMarkupContainer container;
+
+ public AjaxDataNavigationToolbar(final DataTable<?, ?> table, final WebMarkupContainer container) {
+ super(table);
+ this.container = container;
+ }
+
+ @Override
+ protected PagingNavigator newPagingNavigator(final String navigatorId, final DataTable<?, ?> table) {
+ return new BootstrapAjaxPagingNavigator(navigatorId, table) {
+
+ private static final long serialVersionUID = -5254490177324296529L;
+
+ @Override
+ protected void onAjaxEvent(final AjaxRequestTarget target) {
+ target.add(table);
+ target.add(container);
+ }
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/AjaxFallbackDataTable.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/AjaxFallbackDataTable.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/AjaxFallbackDataTable.java
new file mode 100644
index 0000000..53096b2
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/AjaxFallbackDataTable.java
@@ -0,0 +1,51 @@
+/*
+ * 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.wicket.extensions.markup.html.repeater.data.table;
+
+import java.util.List;
+import org.apache.syncope.client.console.wicket.ajax.markup.html.navigation.paging.AjaxDataNavigationToolbar;
+import org.apache.wicket.extensions.ajax.markup.html.repeater.data.table.AjaxFallbackHeadersToolbar;
+import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable;
+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.extensions.markup.html.repeater.data.table.NoRecordsToolbar;
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.repeater.Item;
+import org.apache.wicket.markup.repeater.OddEvenItem;
+import org.apache.wicket.model.IModel;
+
+public class AjaxFallbackDataTable<T, S> extends DataTable<T, S> {
+
+ private static final long serialVersionUID = 6861105496141602937L;
+
+ public AjaxFallbackDataTable(final String id, final List<? extends IColumn<T, S>> columns,
+ final ISortableDataProvider<T, S> dataProvider, final int rowsPerPage, final WebMarkupContainer container) {
+ super(id, columns, dataProvider, rowsPerPage);
+ setOutputMarkupId(true);
+ setVersioned(false);
+ addTopToolbar(new AjaxDataNavigationToolbar(this, container));
+ addTopToolbar(new AjaxFallbackHeadersToolbar<>(this, dataProvider));
+ addBottomToolbar(new NoRecordsToolbar(this));
+ }
+
+ @Override
+ protected Item<T> newRowItem(final String id, final int index, final IModel<T> model) {
+ return new OddEvenItem<>(id, index, model);
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/buttons/DefaultModalCloseButton.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/buttons/DefaultModalCloseButton.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/buttons/DefaultModalCloseButton.java
new file mode 100644
index 0000000..7e1fc1d
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/buttons/DefaultModalCloseButton.java
@@ -0,0 +1,34 @@
+/*
+ * 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.wicket.markup.html.bootstrap.buttons;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.ModalCloseButton;
+import org.apache.wicket.behavior.AttributeAppender;
+import org.apache.wicket.model.ResourceModel;
+
+public class DefaultModalCloseButton extends ModalCloseButton {
+
+ private static final long serialVersionUID = -1097993976905448580L;
+
+ public DefaultModalCloseButton() {
+ super(new ResourceModel("cancel", "Cancel"));
+
+ add(new AttributeAppender("class", " pull-left"));
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/buttons/PrimaryModalButton.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/buttons/PrimaryModalButton.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/buttons/PrimaryModalButton.java
new file mode 100644
index 0000000..890b9a7
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/buttons/PrimaryModalButton.java
@@ -0,0 +1,35 @@
+/*
+ * 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.wicket.markup.html.bootstrap.buttons;
+
+import com.googlecode.wicket.jquery.ui.markup.html.link.AjaxSubmitLink;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.ButtonBehavior;
+import de.agilecoders.wicket.core.markup.html.bootstrap.button.Buttons;
+import org.apache.wicket.markup.html.form.Form;
+
+public class PrimaryModalButton extends AjaxSubmitLink {
+
+ private static final long serialVersionUID = -1097993976905448580L;
+
+ public PrimaryModalButton(final String id, final String name, final Form<?> form) {
+ super(id, form);
+ add(new ButtonBehavior(Buttons.Type.Primary, Buttons.Size.Medium));
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
new file mode 100644
index 0000000..8591ee2
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
@@ -0,0 +1,110 @@
+/*
+ * 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.wicket.markup.html.bootstrap.dialog;
+
+import de.agilecoders.wicket.core.markup.html.bootstrap.dialog.Modal;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.syncope.client.console.panels.NotificationPanel;
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow.WindowClosedCallback;
+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.EmptyPanel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BaseModal<T> extends Modal<T> {
+
+ private static final long serialVersionUID = -6142277554912316095L;
+
+ protected static final Logger LOG = LoggerFactory.getLogger(BaseModal.class);
+
+ private static final String CONTENT = "modalContent";
+
+ private static final String INPUT = "input";
+
+ protected NotificationPanel feedbackPanel;
+
+ private final List<Component> components;
+
+ private final WebMarkupContainer container;
+
+ private WindowClosedCallback windowClosedCallback;
+
+ public BaseModal(final String id) {
+ super(id);
+ container = new WebMarkupContainer("container");
+ container.add(new EmptyPanel(CONTENT));
+ container.setOutputMarkupId(true);
+ add(container);
+ setUseCloseHandler(true);
+ this.windowClosedCallback = null;
+ components = new ArrayList<>();
+ }
+
+ @Override
+ public MarkupContainer addOrReplace(final Component... component) {
+ return container.addOrReplace(component);
+ }
+
+ public static String getModalContentId() {
+ return CONTENT;
+ }
+
+ public static String getModalInputId() {
+ return INPUT;
+ }
+
+ public BaseModal<T> setWindowClosedCallback(final WindowClosedCallback callback) {
+ windowClosedCallback = callback;
+ return this;
+ }
+
+ @Override
+ protected void onClose(final IPartialPageRequestHandler target) {
+ if (windowClosedCallback != null) {
+ windowClosedCallback.onClose((AjaxRequestTarget) target);
+ }
+ }
+
+ public void addFooterInput(final Component component) {
+ this.components.add(component);
+ }
+
+ @Override
+ protected void onInitialize() {
+ super.onInitialize();
+
+ final WebMarkupContainer footer = (WebMarkupContainer) this.get("dialog:footer");
+ footer.addOrReplace(new ListView<Component>("inputs", components) {
+
+ private static final long serialVersionUID = 4949588177564901031L;
+
+ @Override
+ protected void populateItem(final ListItem<Component> item) {
+ item.add(item.getModelObject());
+ }
+ }.setOutputMarkupId(true));
+ }
+}
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java
index 2ba29f8..f42b67f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxTextFieldPanel.java
@@ -28,8 +28,9 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteSettings;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
+import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.validation.IValidator;
public class AjaxTextFieldPanel extends FieldPanel<String> implements Cloneable {
@@ -69,7 +70,8 @@ public class AjaxTextFieldPanel extends FieldPanel<String> implements Cloneable
return result.iterator();
}
};
- add(field.setLabel(new Model<>(name)).setOutputMarkupId(true));
+
+ add(field.setLabel(new ResourceModel(name, name)).setOutputMarkupId(true));
if (enableOnChange && !isReadOnly()) {
field.add(new AjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
@@ -82,6 +84,8 @@ public class AjaxTextFieldPanel extends FieldPanel<String> implements Cloneable
}
});
}
+
+ add(new Label("label", new ResourceModel(name, name)));
}
public void addValidator(final IValidator<? super String> validator) {
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel.java
index e0f2f3e..ed95c4c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/FieldPanel.java
@@ -29,6 +29,7 @@ import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
+import org.apache.wicket.model.ResourceModel;
public abstract class FieldPanel<T> extends AbstractFieldPanel<T> implements Cloneable {
@@ -53,6 +54,11 @@ public abstract class FieldPanel<T> extends AbstractFieldPanel<T> implements Clo
return field;
}
+ public FieldPanel<T> setPlaceholder(final String id) {
+ field.add(new AttributeModifier("placeholder", new ResourceModel(id, id)));
+ return this;
+ }
+
public FieldPanel<T> setTitle(final String title) {
this.title = title;
field.add(AttributeModifier.replace("title", title != null
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/META-INF/resources/css/AdminLTE_plugins/dataTables/dataTables.bootstrap.css
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/css/AdminLTE_plugins/dataTables/dataTables.bootstrap.css b/client/console/src/main/resources/META-INF/resources/css/AdminLTE_plugins/dataTables/dataTables.bootstrap.css
new file mode 100644
index 0000000..864b68e
--- /dev/null
+++ b/client/console/src/main/resources/META-INF/resources/css/AdminLTE_plugins/dataTables/dataTables.bootstrap.css
@@ -0,0 +1,369 @@
+div.dataTables_length label {
+ font-weight: normal;
+ text-align: left;
+ white-space: nowrap;
+}
+
+div.dataTables_length select {
+ width: 75px;
+ display: inline-block;
+}
+
+div.dataTables_filter {
+ text-align: right;
+}
+
+div.dataTables_filter label {
+ font-weight: normal;
+ white-space: nowrap;
+ text-align: left;
+}
+
+div.dataTables_filter input {
+ margin-left: 0.5em;
+ display: inline-block;
+ width: auto;
+}
+
+div.dataTables_info {
+ padding-top: 8px;
+ white-space: nowrap;
+}
+
+div.dataTables_paginate {
+ margin: 0;
+ white-space: nowrap;
+ text-align: right;
+}
+
+div.dataTables_paginate ul.pagination {
+ margin: 2px 0;
+ white-space: nowrap;
+}
+
+@media screen and (max-width: 767px) {
+ div.dataTables_wrapper > div.row > div,
+ div.dataTables_length,
+ div.dataTables_filter,
+ div.dataTables_info,
+ div.dataTables_paginate {
+ text-align: center;
+ }
+
+ div.DTTT {
+ margin-bottom: 0.5em;
+ }
+}
+
+table.dataTable td,
+table.dataTable th {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+table.dataTable {
+ clear: both;
+ margin-top: 6px !important;
+ margin-bottom: 6px !important;
+ max-width: none !important;
+}
+
+table.dataTable thead .sorting,
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting_asc_disabled,
+table.dataTable thead .sorting_desc_disabled {
+ cursor: pointer;
+ position: relative;
+}
+
+table.dataTable thead .sorting:after,
+table.dataTable thead .sorting_asc:after,
+table.dataTable thead .sorting_desc:after {
+ position: absolute;
+ top: 8px;
+ right: 8px;
+ display: block;
+ font-family: 'Glyphicons Halflings';
+ opacity: 0.5;
+}
+table.dataTable thead .sorting:after {
+ opacity: 0.2;
+ content: "\e150"; /* sort */
+}
+table.dataTable thead .sorting_asc:after {
+ content: "\e155"; /* sort-by-attributes */
+}
+table.dataTable thead .sorting_desc:after {
+ content: "\e156"; /* sort-by-attributes-alt */
+}
+div.dataTables_scrollBody table.dataTable thead .sorting:after,
+div.dataTables_scrollBody table.dataTable thead .sorting_asc:after,
+div.dataTables_scrollBody table.dataTable thead .sorting_desc:after {
+ display: none;
+}
+
+table.dataTable thead .sorting_asc_disabled:after,
+table.dataTable thead .sorting_desc_disabled:after {
+ color: #eee;
+}
+
+table.dataTable thead > tr > th {
+ padding-right: 30px;
+}
+
+table.dataTable th:active {
+ outline: none;
+}
+
+/* Condensed */
+table.dataTable.table-condensed thead > tr > th {
+ padding-right: 20px;
+}
+
+table.dataTable.table-condensed thead .sorting:after,
+table.dataTable.table-condensed thead .sorting_asc:after,
+table.dataTable.table-condensed thead .sorting_desc:after {
+ top: 6px;
+ right: 6px;
+}
+
+/* Scrolling */
+div.dataTables_scrollHead table {
+ margin-bottom: 0 !important;
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+div.dataTables_scrollHead table thead tr:last-child th:first-child,
+div.dataTables_scrollHead table thead tr:last-child td:first-child {
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+}
+
+div.dataTables_scrollBody table {
+ border-top: none;
+ margin-top: 0 !important;
+ margin-bottom: 0 !important;
+}
+
+div.dataTables_scrollBody tbody tr:first-child th,
+div.dataTables_scrollBody tbody tr:first-child td {
+ border-top: none;
+}
+
+div.dataTables_scrollFoot table {
+ margin-top: 0 !important;
+ border-top: none;
+}
+
+/* Frustratingly the border-collapse:collapse used by Bootstrap makes the column
+ width calculations when using scrolling impossible to align columns. We have
+ to use separate
+*/
+table.table-bordered.dataTable {
+ border-collapse: separate !important;
+}
+table.table-bordered thead th,
+table.table-bordered thead td {
+ border-left-width: 0;
+ border-top-width: 0;
+}
+table.table-bordered tbody th,
+table.table-bordered tbody td {
+ border-left-width: 0;
+ border-bottom-width: 0;
+}
+table.table-bordered tfoot th,
+table.table-bordered tfoot td {
+ border-left-width: 0;
+ border-bottom-width: 0;
+}
+table.table-bordered th:last-child,
+table.table-bordered td:last-child {
+ border-right-width: 0;
+}
+div.dataTables_scrollHead table.table-bordered {
+ border-bottom-width: 0;
+}
+
+
+
+
+/*
+ * TableTools styles
+ */
+.table.dataTable tbody tr.active td,
+.table.dataTable tbody tr.active th {
+ background-color: #08C;
+ color: white;
+}
+
+.table.dataTable tbody tr.active:hover td,
+.table.dataTable tbody tr.active:hover th {
+ background-color: #0075b0 !important;
+}
+
+.table.dataTable tbody tr.active th > a,
+.table.dataTable tbody tr.active td > a {
+ color: white;
+}
+
+.table-striped.dataTable tbody tr.active:nth-child(odd) td,
+.table-striped.dataTable tbody tr.active:nth-child(odd) th {
+ background-color: #017ebc;
+}
+
+table.DTTT_selectable tbody tr {
+ cursor: pointer;
+}
+
+div.DTTT .btn:hover {
+ text-decoration: none !important;
+}
+
+ul.DTTT_dropdown.dropdown-menu {
+ z-index: 2003;
+}
+
+ul.DTTT_dropdown.dropdown-menu a {
+ color: #333 !important; /* needed only when demo_page.css is included */
+}
+
+ul.DTTT_dropdown.dropdown-menu li {
+ position: relative;
+}
+
+ul.DTTT_dropdown.dropdown-menu li:hover a {
+ background-color: #0088cc;
+ color: white !important;
+}
+
+div.DTTT_collection_background {
+ z-index: 2002;
+}
+
+/* TableTools information display */
+div.DTTT_print_info {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ width: 400px;
+ height: 150px;
+ margin-left: -200px;
+ margin-top: -75px;
+ text-align: center;
+ color: #333;
+ padding: 10px 30px;
+ opacity: 0.95;
+
+ background-color: white;
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 6px;
+
+ -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
+ box-shadow: 0 3px 7px rgba(0, 0, 0, 0.5);
+}
+
+div.DTTT_print_info h6 {
+ font-weight: normal;
+ font-size: 28px;
+ line-height: 28px;
+ margin: 1em;
+}
+
+div.DTTT_print_info p {
+ font-size: 14px;
+ line-height: 20px;
+}
+
+div.dataTables_processing {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 100%;
+ height: 60px;
+ margin-left: -50%;
+ margin-top: -25px;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ text-align: center;
+ font-size: 1.2em;
+ background-color: white;
+ background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));
+ background: -webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
+ background: -moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
+ background: -ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
+ background: -o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
+ background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);
+}
+
+
+
+/*
+ * FixedColumns styles
+ */
+div.DTFC_LeftHeadWrapper table,
+div.DTFC_LeftFootWrapper table,
+div.DTFC_RightHeadWrapper table,
+div.DTFC_RightFootWrapper table,
+table.DTFC_Cloned tr.even {
+ background-color: white;
+ margin-bottom: 0;
+}
+
+div.DTFC_RightHeadWrapper table ,
+div.DTFC_LeftHeadWrapper table {
+ border-bottom: none !important;
+ margin-bottom: 0 !important;
+ border-top-right-radius: 0 !important;
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+}
+
+div.DTFC_RightHeadWrapper table thead tr:last-child th:first-child,
+div.DTFC_RightHeadWrapper table thead tr:last-child td:first-child,
+div.DTFC_LeftHeadWrapper table thead tr:last-child th:first-child,
+div.DTFC_LeftHeadWrapper table thead tr:last-child td:first-child {
+ border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important;
+}
+
+div.DTFC_RightBodyWrapper table,
+div.DTFC_LeftBodyWrapper table {
+ border-top: none;
+ margin: 0 !important;
+}
+
+div.DTFC_RightBodyWrapper tbody tr:first-child th,
+div.DTFC_RightBodyWrapper tbody tr:first-child td,
+div.DTFC_LeftBodyWrapper tbody tr:first-child th,
+div.DTFC_LeftBodyWrapper tbody tr:first-child td {
+ border-top: none;
+}
+
+div.DTFC_RightFootWrapper table,
+div.DTFC_LeftFootWrapper table {
+ border-top: none;
+ margin-top: 0 !important;
+}
+
+
+div.DTFC_LeftBodyWrapper table.dataTable thead .sorting:after,
+div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_asc:after,
+div.DTFC_LeftBodyWrapper table.dataTable thead .sorting_desc:after,
+div.DTFC_RightBodyWrapper table.dataTable thead .sorting:after,
+div.DTFC_RightBodyWrapper table.dataTable thead .sorting_asc:after,
+div.DTFC_RightBodyWrapper table.dataTable thead .sorting_desc:after {
+ display: none;
+}
+
+
+/*
+ * FixedHeader styles
+ */
+div.FixedHeader_Cloned table {
+ margin: 0 !important
+}
+
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/META-INF/resources/js/AdminLTE-app.min.js
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/META-INF/resources/js/AdminLTE-app.min.js b/client/console/src/main/resources/META-INF/resources/js/AdminLTE-app.min.js
deleted file mode 100644
index e61cc0f..0000000
--- a/client/console/src/main/resources/META-INF/resources/js/AdminLTE-app.min.js
+++ /dev/null
@@ -1,13 +0,0 @@
-/*! AdminLTE app.js
- * ================
- * Main JS application file for AdminLTE v2. This file
- * should be included in all pages. It controls some layout
- * options and implements exclusive AdminLTE plugins.
- *
- * @Author Almsaeed Studio
- * @Support <http://www.almsaeedstudio.com>
- * @Email <su...@almsaeedstudio.com>
- * @version 2.1.0
- * @license MIT <http://opensource.org/licenses/MIT>
- */
-"use strict";function _init(){$.AdminLTE.layout={activate:function(){var a=this;a.fix(),a.fixSidebar(),$(window,".wrapper").resize(function(){a.fix(),a.fixSidebar()})},fix:function(){var a=$(".main-header").outerHeight()+$(".main-footer").outerHeight(),b=$(window).height(),c=$(".sidebar").height();if($("body").hasClass("fixed"))$(".content-wrapper, .right-side").css("min-height",b-$(".main-footer").outerHeight());else{var d;b>=c?($(".content-wrapper, .right-side").css("min-height",b-a),d=b-a):($(".content-wrapper, .right-side").css("min-height",c),d=c);var e=$($.AdminLTE.options.controlSidebarOptions.selector);"undefined"!=typeof e&&e.height()>d&&$(".content-wrapper, .right-side").css("min-height",e.height())}},fixSidebar:function(){return $("body").hasClass("fixed")?("undefined"==typeof $.fn.slimScroll&&console&&console.error("Error: the fixed layout requires the slimscroll plugin!"),void($.AdminLTE.options.sidebarSlimScroll&&"undefined"!=typeof $.fn.slimScroll&&($(".sidebar").slim
Scroll({destroy:!0}).height("auto"),$(".sidebar").slimscroll({height:$(window).height()-$(".main-header").height()+"px",color:"rgba(0,0,0,0.2)",size:"3px"})))):void("undefined"!=typeof $.fn.slimScroll&&$(".sidebar").slimScroll({destroy:!0}).height("auto"))}},$.AdminLTE.pushMenu={activate:function(a){var b=$.AdminLTE.options.screenSizes;$(a).on("click",function(a){a.preventDefault(),$(window).width()>b.sm-1?$("body").toggleClass("sidebar-collapse"):$("body").hasClass("sidebar-open")?($("body").removeClass("sidebar-open"),$("body").removeClass("sidebar-collapse")):$("body").addClass("sidebar-open")}),$(".content-wrapper").click(function(){$(window).width()<=b.sm-1&&$("body").hasClass("sidebar-open")&&$("body").removeClass("sidebar-open")}),($.AdminLTE.options.sidebarExpandOnHover||$("body").hasClass("fixed")&&$("body").hasClass("sidebar-mini"))&&this.expandOnHover()},expandOnHover:function(){var a=this,b=$.AdminLTE.options.screenSizes.sm-1;$(".main-sidebar").hover(function(){$("body")
.hasClass("sidebar-mini")&&$("body").hasClass("sidebar-collapse")&&$(window).width()>b&&a.expand()},function(){$("body").hasClass("sidebar-mini")&&$("body").hasClass("sidebar-expanded-on-hover")&&$(window).width()>b&&a.collapse()})},expand:function(){$("body").removeClass("sidebar-collapse").addClass("sidebar-expanded-on-hover")},collapse:function(){$("body").hasClass("sidebar-expanded-on-hover")&&$("body").removeClass("sidebar-expanded-on-hover").addClass("sidebar-collapse")}},$.AdminLTE.tree=function(a){var b=this;$("li a",$(a)).on("click",function(a){var c=$(this),d=c.next();if(d.is(".treeview-menu")&&d.is(":visible"))d.slideUp("normal",function(){d.removeClass("menu-open")}),d.parent("li").removeClass("active");else if(d.is(".treeview-menu")&&!d.is(":visible")){var e=c.parents("ul").first(),f=e.find("ul:visible").slideUp("normal");f.removeClass("menu-open");var g=c.parent("li");d.slideDown("normal",function(){d.addClass("menu-open"),e.find("li.active").removeClass("active"),g.ad
dClass("active"),b.layout.fix()})}d.is(".treeview-menu")&&a.preventDefault()})},$.AdminLTE.controlSidebar={activate:function(){var a=this,b=$.AdminLTE.options.controlSidebarOptions,c=$(b.selector),d=$(b.toggleBtnSelector);d.on("click",function(d){d.preventDefault(),c.hasClass("control-sidebar-open")||$("body").hasClass("control-sidebar-open")?a.close(c,b.slide):a.open(c,b.slide)});var e=$(".control-sidebar-bg");a._fix(e),$("body").hasClass("fixed")?a._fixForFixed(c):$(".content-wrapper, .right-side").height()<c.height()&&a._fixForContent(c)},open:function(a,b){b?a.addClass("control-sidebar-open"):$("body").addClass("control-sidebar-open")},close:function(a,b){b?a.removeClass("control-sidebar-open"):$("body").removeClass("control-sidebar-open")},_fix:function(a){var b=this;$("body").hasClass("layout-boxed")?(a.css("position","absolute"),a.height($(".wrapper").height()),$(window).resize(function(){b._fix(a)})):a.css({position:"fixed",height:"auto"})},_fixForFixed:function(a){a.css({po
sition:"fixed","max-height":"100%",overflow:"auto","padding-bottom":"50px"})},_fixForContent:function(a){$(".content-wrapper, .right-side").css("min-height",a.height())}},$.AdminLTE.boxWidget={selectors:$.AdminLTE.options.boxWidgetOptions.boxWidgetSelectors,icons:$.AdminLTE.options.boxWidgetOptions.boxWidgetIcons,activate:function(){var a=this;$(a.selectors.collapse).on("click",function(b){b.preventDefault(),a.collapse($(this))}),$(a.selectors.remove).on("click",function(b){b.preventDefault(),a.remove($(this))})},collapse:function(a){var b=this,c=a.parents(".box").first(),d=c.find("> .box-body, > .box-footer");c.hasClass("collapsed-box")?(a.children(":first").removeClass(b.icons.open).addClass(b.icons.collapse),d.slideDown(300,function(){c.removeClass("collapsed-box")})):(a.children(":first").removeClass(b.icons.collapse).addClass(b.icons.open),d.slideUp(300,function(){c.addClass("collapsed-box")}))},remove:function(a){var b=a.parents(".box").first();b.slideUp()}}}if("undefined"==ty
peof jQuery)throw new Error("AdminLTE requires jQuery");$.AdminLTE={},$.AdminLTE.options={navbarMenuSlimscroll:!0,navbarMenuSlimscrollWidth:"3px",navbarMenuHeight:"200px",sidebarToggleSelector:"[data-toggle='offcanvas']",sidebarPushMenu:!0,sidebarSlimScroll:!0,sidebarExpandOnHover:!1,enableBoxRefresh:!0,enableBSToppltip:!0,BSTooltipSelector:"[data-toggle='tooltip']",enableFastclick:!0,enableControlSidebar:!0,controlSidebarOptions:{toggleBtnSelector:"[data-toggle='control-sidebar']",selector:".control-sidebar",slide:!0},enableBoxWidget:!0,boxWidgetOptions:{boxWidgetIcons:{collapse:"fa-minus",open:"fa-plus",remove:"fa-times"},boxWidgetSelectors:{remove:'[data-widget="remove"]',collapse:'[data-widget="collapse"]'}},directChat:{enable:!0,contactToggleSelector:'[data-widget="chat-pane-toggle"]'},colors:{lightBlue:"#3c8dbc",red:"#f56954",green:"#00a65a",aqua:"#00c0ef",yellow:"#f39c12",blue:"#0073b7",navy:"#001F3F",teal:"#39CCCC",olive:"#3D9970",lime:"#01FF70",orange:"#FF851B",fuchsia:"#F0
12BE",purple:"#8E24AA",maroon:"#D81B60",black:"#222222",gray:"#d2d6de"},screenSizes:{xs:480,sm:768,md:992,lg:1200}},$(function(){"undefined"!=typeof AdminLTEOptions&&$.extend(!0,$.AdminLTE.options,AdminLTEOptions);var a=$.AdminLTE.options;_init(),$.AdminLTE.layout.activate(),$.AdminLTE.tree(".sidebar"),a.enableControlSidebar&&$.AdminLTE.controlSidebar.activate(),a.navbarMenuSlimscroll&&"undefined"!=typeof $.fn.slimscroll&&$(".navbar .menu").slimscroll({height:a.navbarMenuHeight,alwaysVisible:!1,size:a.navbarMenuSlimscrollWidth}).css("width","100%"),a.sidebarPushMenu&&$.AdminLTE.pushMenu.activate(a.sidebarToggleSelector),a.enableBSToppltip&&$("body").tooltip({selector:a.BSTooltipSelector}),a.enableBoxWidget&&$.AdminLTE.boxWidget.activate(),a.enableFastclick&&"undefined"!=typeof FastClick&&FastClick.attach(document.body),a.directChat.enable&&$(a.directChat.contactToggleSelector).on("click",function(){var a=$(this).parents(".direct-chat").first();a.toggleClass("direct-chat-contacts-ope
n")}),$('.btn-group[data-toggle="btn-toggle"]').each(function(){var a=$(this);$(this).find(".btn").on("click",function(b){a.find(".btn.active").removeClass("active"),$(this).addClass("active"),b.preventDefault()})})}),function(a){a.fn.boxRefresh=function(b){function c(a){a.append(f),e.onLoadStart.call(a)}function d(a){a.find(f).remove(),e.onLoadDone.call(a)}var e=a.extend({trigger:".refresh-btn",source:"",onLoadStart:function(a){},onLoadDone:function(a){}},b),f=a('<div class="overlay"><div class="fa fa-refresh fa-spin"></div></div>');return this.each(function(){if(""===e.source)return void(console&&console.log("Please specify a source first - boxRefresh()"));var b=a(this),f=b.find(e.trigger).first();f.on("click",function(a){a.preventDefault(),c(b),b.find(".box-body").load(e.source,function(){d(b)})})})}}(jQuery),function(a){a.fn.todolist=function(b){var c=a.extend({onCheck:function(a){},onUncheck:function(a){}},b);return this.each(function(){"undefined"!=typeof a.fn.iCheck?(a("input
",this).on("ifChecked",function(b){var d=a(this).parents("li").first();d.toggleClass("done"),c.onCheck.call(d)}),a("input",this).on("ifUnchecked",function(b){var d=a(this).parents("li").first();d.toggleClass("done"),c.onUncheck.call(d)})):a("input",this).on("change",function(b){var d=a(this).parents("li").first();d.toggleClass("done"),c.onCheck.call(d)})})}}(jQuery);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/pages/BaseModalPage.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BaseModalPage.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BaseModalPage.html
index c1be88b..995b1ef 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BaseModalPage.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BaseModalPage.html
@@ -20,19 +20,16 @@ under the License.
<head>
<title></title>
- <link href="webjars/bootstrap/${bootstrap.version}/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<link href="webjars/bootstrap-select/${bootstrap-select.version}/dist/css/bootstrap-select.min.css" rel="stylesheet" type="text/css" />
<link href="webjars/font-awesome/${font-awesome.version}/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
<link href="webjars/ionicons/${ionicons.version}/css/ionicons.min.css" rel="stylesheet" type="text/css" />
- <link href="css/AdminLTE.css" rel="stylesheet" type="text/css" />
+
+ <link href="css/AdminLTE_plugins/dataTables/dataTables.bootstrap.css" rel="stylesheet" type="text/css" />
<link href="css/AdminLTE_skins/skin-green.css" rel="stylesheet" type="text/css" />
<link href="css/syncopeConsole.css" rel="stylesheet" type="text/css" />
<link href="css/fieldstyle.css" rel="stylesheet" type="text/css" />
- <script type="text/javascript" src="webjars/jquery-ui/${jquery-ui.version}/jquery-ui.min.js"></script>
- <script type="text/javascript" src="webjars/bootstrap/${bootstrap.version}/js/bootstrap.min.js"></script>
- <script type="text/javascript" src="webjars/bootstrap-select/${bootstrap-select.version}/dist/js/bootstrap-select.min.js"></script>
- <script type="text/javascript" src="js/AdminLTE-app.min.js"></script>
+ <script type="text/javascript" src="webjars/jquery-ui/${jquery-ui.version}/jquery-ui.min.js"></script>>
<script type="text/javascript">
var notificationShownTimes = 0;
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
index 857ae9c..233dae8 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/BasePage.html
@@ -25,20 +25,17 @@ under the License.
<title>Apache Syncope</title>
<link rel="shortcut icon" href="img/favicon.png" type="image/png"/>
-
- <link href="webjars/bootstrap/${bootstrap.version}/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<link href="webjars/bootstrap-select/${bootstrap-select.version}/dist/css/bootstrap-select.min.css" rel="stylesheet" type="text/css" />
<link href="webjars/font-awesome/${font-awesome.version}/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
<link href="webjars/ionicons/${ionicons.version}/css/ionicons.min.css" rel="stylesheet" type="text/css" />
- <link href="css/AdminLTE.css" rel="stylesheet" type="text/css" />
+
+ <link href="css/plugins/AdminLTE_plugins/dataTables.bootstrap.css" rel="stylesheet" type="text/css" />
<link href="css/AdminLTE_skins/skin-green.css" rel="stylesheet" type="text/css" />
<link href="css/syncopeConsole.css" rel="stylesheet" type="text/css" />
<link href="css/fieldstyle.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="webjars/jquery-ui/${jquery-ui.version}/jquery-ui.min.js"></script>
- <script type="text/javascript" src="webjars/bootstrap/${bootstrap.version}/js/bootstrap.min.js"></script>
<script type="text/javascript" src="webjars/bootstrap-select/${bootstrap-select.version}/dist/js/bootstrap-select.min.js"></script>
- <script type="text/javascript" src="js/AdminLTE-app.min.js"></script>
<script type="text/javascript">
var notificationShownTimes = 0;
@@ -160,4 +157,4 @@ under the License.
$('#spanYear').html(new Date().getFullYear());
</script>
</body>
-</html>
\ No newline at end of file
+</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/pages/Login.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Login.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Login.html
index e6230db..3b8a3d4 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Login.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Login.html
@@ -26,16 +26,11 @@ under the License.
<title>Apache Syncope - Login</title>
<link rel="shortcut icon" href="img/favicon.png" type="image/png"/>
-
- <link href="webjars/bootstrap/${bootstrap.version}/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
<link href="webjars/bootstrap-select/${bootstrap-select.version}/dist/css/bootstrap-select.min.css" rel="stylesheet" type="text/css" />
<link href="webjars/font-awesome/${font-awesome.version}/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
<link href="webjars/ionicons/${ionicons.version}/css/ionicons.min.css" rel="stylesheet" type="text/css" />
- <link href="css/AdminLTE.css" rel="stylesheet" type="text/css" />
<link href="css/login.css" rel="stylesheet" type="text/css" />
<link href="css/syncopeConsole.css" rel="stylesheet" type="text/css" />
-
- <script type="text/javascript" src="webjars/bootstrap/${bootstrap.version}/js/bootstrap.min.js"></script>
<script type="text/javascript" src="webjars/bootstrap-select/${bootstrap-select.version}/dist/js/bootstrap-select.min.js"></script>
</head>
<body class="skin-green">
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/pages/RealmModalPage.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/RealmModalPage.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/RealmModalPage.html
deleted file mode 100644
index e655aa1..0000000
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/RealmModalPage.html
+++ /dev/null
@@ -1,70 +0,0 @@
-<!--
-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">
- <head>
- <title></title>
-
- <link href="webjars/bootstrap/${bootstrap.version}/css/bootstrap.min.css" rel="stylesheet" type="text/css" />
- <link href="webjars/bootstrap-select/${bootstrap-select.version}/dist/css/bootstrap-select.min.css" rel="stylesheet" type="text/css" />
- <link href="webjars/font-awesome/${font-awesome.version}/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
- <link href="webjars/ionicons/${ionicons.version}/css/ionicons.min.css" rel="stylesheet" type="text/css" />
- <link href="css/AdminLTE.css" rel="stylesheet" type="text/css" />
- <link href="css/AdminLTE_skins/skin-green.css" rel="stylesheet" type="text/css" />
- <link href="css/syncopeConsole.css" rel="stylesheet" type="text/css" />
- <link href="css/fieldstyle.css" rel="stylesheet" type="text/css" />
-
- <script type="text/javascript" src="webjars/jquery-ui/${jquery-ui.version}/jquery-ui.min.js"></script>
- <script type="text/javascript" src="webjars/bootstrap/${bootstrap.version}/js/bootstrap.min.js"></script>
- <script type="text/javascript" src="webjars/bootstrap-select/${bootstrap-select.version}/dist/js/bootstrap-select.min.js"></script>
- <script type="text/javascript" src="js/AdminLTE-app.min.js"></script>
-
- <script type="text/javascript">
- var notificationShownTimes = 0;
-
- function showNotification(componentId, messagecount) {
- notificationShownTimes++;
- timeout = 1700 + (messagecount * 500) + notificationShownTimes * 200;
- $('div#' + componentId).fadeTo('normal', 1.0);
- setTimeout("$('div#" + componentId + "').fadeOut('normal')", timeout);
- }
- </script>
-
- <style type="text/css">
- table.palette td.header {
- background:url("images/ui-bg_glass_75_e6e6e6_1x400.png")
- repeat-x scroll 50% 50% #E6E6E6 !important;
- }
- </style>
- </head>
- <body onload="setTimeout('window.focus();', 0);">
- <div wicket:id="feedback"/>
- <form data-example-id="simple-input-groups" class="bs-example bs-example-form" wicket:id="RealmForm">
- <wicket:container wicket:id="details"/>
- <wicket:child />
- <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>
- </body>
-</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.html b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.html
index 7eaf56d..dc3fa89 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/pages/Realms.html
@@ -20,7 +20,6 @@ under the License.
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:wicket="http://xmlns.jcp.org/jsf/composite">
<wicket:extend>
-
<div class="wrapper">
<div class="admin-content-page content-margin-layout" wicket:id="content">
<div class="box box-solid box-primary">
@@ -42,7 +41,6 @@ under the License.
</a>
</li>
</ul>
- <div wicket:id="editModal" ></div>
</div><!-- /.box-tools -->
</div><!-- /.box-header -->
<div class="box-body">
@@ -51,6 +49,8 @@ under the License.
</div>
</div>
</div>
+ <div wicket:id="createModal"></div>
+ <div wicket:id="editModal"></div>
</div>
<aside class="control-sidebar control-sidebar-dark control-sidebar-open block-sidebar">
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractModalPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractModalPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractModalPanel.html
new file mode 100644
index 0000000..631c38b
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractModalPanel.html
@@ -0,0 +1,45 @@
+<!--
+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:head>
+ <script type="text/javascript">
+ var notificationShownTimes = 0;
+
+ function showNotification(componentId, messagecount) {
+ notificationShownTimes++;
+ timeout = 1700 + (messagecount * 500) + notificationShownTimes * 200;
+ $('div#' + componentId).fadeTo('normal', 1.0);
+ setTimeout("$('div#" + componentId + "').fadeOut('normal')", timeout);
+ }
+ </script>
+
+ <style type="text/css">
+ table.palette td.header {
+ background:url("images/ui-bg_glass_75_e6e6e6_1x400.png")
+ repeat-x scroll 50% 50% #E6E6E6 !important;
+ }
+ </style>
+ </wicket:head>-->
+
+ <wicket:panel>
+ <div wicket:id="feedback"/>
+ <wicket:child />
+ </wicket:panel>
+</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.html
index 487165b..e543318 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AbstractSearchResultPanel.html
@@ -18,14 +18,19 @@ under the License.
-->
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<wicket:panel>
-
<div wicket:id="container">
<span wicket:id="resultTable">[Table]</span>
-
+
<span style="float:right">
<form wicket:id="paginator" style="display:inline">
- <label><wicket:message key="displayRows"/></label>
- <select class="text ui-widget-content ui-corner-all" wicket:id="rowsChooser"/>
+ <div class="col-sm-6">
+ <div class="dataTables_length">
+ <label>
+ <wicket:message key="displayRows"/>
+ <select class="form-control input-sm" wicket:id="rowsChooser"/>
+ </label>
+ </div>
+ </div>
</form>
</span>
</div>
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyAjaxTabbedPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyAjaxTabbedPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyAjaxTabbedPanel.html
new file mode 100644
index 0000000..ce63b0d
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/AnyAjaxTabbedPanel.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<!--
+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 class="tabbable tabs-left" style="margin-right: 0; border-right: 0;">
+ <ul class="nav nav-tabs" style="margin-right: 0; border-right: 0;" wicket:id="tabs-container">
+ <li wicket:id="tabs">
+ <a data-toggle="tab" href="#" wicket:id="link">
+ <span wicket:id="title">[tab title]</span>
+ </a>
+ </li>
+ </ul>
+ <div class="tab-content" style="min-height: 100%; padding-left: 20px; border-left: 1px solid #ddd;">
+ <div wicket:id="panel" class="tab-pane active">[tab]</div>
+ </div>
+ </div>
+ </wicket:panel>
+</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel.html
new file mode 100644
index 0000000..bbcd878
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel.html
@@ -0,0 +1,52 @@
+<!--
+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>
+ <div style="margin: 5px;">
+ <p class="ui-widget ui-corner-all ui-widget-header">
+ <wicket:message key="title"/> <span wicket:id="displayName"/>
+ </p>
+ <form wicket:id="groupForm">
+ <div id="tabs">
+ <div style="display: block; clear: both">
+ <ul>
+ <li><a href="#details"><span><wicket:message key="details"/></span></a></li>
+ <li><a href="#templates"><span><wicket:message key="templates"/></span></a></li>
+ <li><a href="#plainAttrs"><span><wicket:message key="plainAttrs"/></span></a></li>
+ <li><a href="#derAttrs"><span><wicket:message key="derAttrs"/></span></a></li>
+ <li><a href="#virAttrs"><span><wicket:message key="virAttrs"/></span></a></li>
+ <li><a href="#resources"><span><wicket:message key="resources"/></span></a></li>
+ <li><a href="#entitlements"><span><wicket:message key="entitlements"/></span></a></li>
+ <li><a href="#security"><span><wicket:message key="security"/></span></a></li>
+ </ul>
+ </div>
+ <div wicket:id="groupPanel"></div>
+ </div>
+ <div style="bottom:0;margin:10px">
+ <input type="submit"
+ class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
+ wicket:id="submit"/>
+ <input type="button"
+ class="ui-button ui-widget ui-state-default ui-corner-all ui-button-text-only"
+ wicket:id="cancel"/>
+ </div>
+ </form>
+ </div>
+ </wicket:extend>
+</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel.properties
new file mode 100644
index 0000000..4ffa2fb
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel.properties
@@ -0,0 +1,48 @@
+# 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.
+required_alert=All form fields are required.
+title=Group
+details=Details
+plainAttrs=Plain attributes
+tab3=Derived attributes
+tab4=Virtual attributes
+resources=Resources
+entitlements=Entitlements
+security=Security
+add=+
+drop=-
+error=Generic error occurred during the operation
+firstResourcesList=Group's resources
+secondResourcesList=Available resources
+firstEntitlementsList=Group's entitlements
+secondEntitlementsList=Available entitlements
+derAttrs=Derived Attributes
+derAttrToRemove=Delete
+derAttrName=Name
+derAttrValue=Derived value
+
+virAttrs=Virtual Attributes
+virAttrToRemove=Delete
+virAttrName=Name
+virAttrValue=Virtual value
+
+addAttributeBtn=Add
+
+inheritPlainAttrs=Inherit plain attributes
+inheritDerAttrs=Inherit derived attributes
+inheritVirAttrs=Inherit virtual attributes
+templates=Templates
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel_it.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel_it.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel_it.properties
new file mode 100644
index 0000000..1c6efec
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel_it.properties
@@ -0,0 +1,50 @@
+# 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.
+required_alert=All form fields are required.
+title=Gruppo
+details=Dettagli
+plainAttrs=Attributi normali
+tab3=Attributi derivati
+tab4=Attributi virtuali
+resources=Risorse
+entitlements=Entitlement
+security=Sicurezza
+add=+
+drop=-
+error=Errore generico durante l'operazione
+firstResourcesList=Risorse ruolo
+secondResourcesList=Risorse disponibili
+firstResourcesList=Risorse gruppo
+secondResourcesList=Risorse disponibili
+derAttrs=Attributi derivati
+derAttrToRemove=Elimina
+derAttrName=Nome
+derAttrValue=Valore derivato
+
+virAttrs=Attributi virtuali
+virAttrToRemove=Elimina
+virAttrName=Nome
+virAttrValue=Valore virtuale
+
+addAttributeBtn=Aggiungi
+
+inheritPlainAttrs=Eredita attributi normali
+inheritDerAttrs=Eredita attributi derivati
+inheritVirAttrs=Eredita attributi virtuali
+templates=Modelo
+secondEntitlementsList=Entitlement disponibili
+firstEntitlementsList=Entitlement gruppo
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel_pt_BR.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel_pt_BR.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel_pt_BR.properties
new file mode 100644
index 0000000..0649585
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/GroupModalPanel_pt_BR.properties
@@ -0,0 +1,48 @@
+# 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.
+required_alert=Todos os campos s\u00e3o obrigat\u00f3rios
+title=Grupo
+details=Detalhes
+plainAttrs=Atributos Normal
+tab3=Atributos Derivados
+tab4=Atributos Virtuais
+resources=Recursos
+entitlements=Direitos
+security=Seguran\u00e7a
+add=+
+drop=-
+error=Um erro gen\u00e9rico ocorreu durante a opera\u00e7\u00e3o
+firstResourcesList=Recursos de grupos
+secondResourcesList=Recursos dispon\u00edveis
+firstEntitlementsList=Direitos de grupos
+secondEntitlementsList=Direitos dispon\u00edveis
+derAttrs=Atributos derivados
+derAttrToRemove=Exluir
+derAttrName=Nome
+derAttrValue=Valor Derivado
+
+virAttrs=Atributos Virtuais
+virAttrToRemove=Excluir
+virAttrName=Nome
+virAttrValue=Valor Virtual
+
+addAttributeBtn=Adicionar
+
+inheritPlainAttrs=Atributos Herdados Normal
+inheritDerAttrs=Atributos Derivados Herdados
+inheritVirAttrs=Atributos Virtuais Herdados
+templates=Modelli
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/panels/ModalContent.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ModalContent.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ModalContent.html
index 471a985..e1fbeff 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ModalContent.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ModalContent.html
@@ -19,23 +19,23 @@ under the License.
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<wicket:head>
- <script type="text/javascript">
- var notificationShownTimes = 0;
-
- function showNotification(componentId, messagecount) {
- notificationShownTimes++;
- timeout = 1700 + (messagecount * 500) + notificationShownTimes * 200;
- $('div#' + componentId).fadeTo('normal', 1.0);
- setTimeout("$('div#" + componentId + "').fadeOut('normal')", timeout);
- }
- </script>
-
- <style type="text/css">
- table.palette td.header {
- background:url("images/ui-bg_glass_75_e6e6e6_1x400.png")
- repeat-x scroll 50% 50% #E6E6E6 !important;
- }
- </style>
+ <script type="text/javascript">
+ var notificationShownTimes = 0;
+
+ function showNotification(componentId, messagecount) {
+ notificationShownTimes++;
+ timeout = 1700 + (messagecount * 500) + notificationShownTimes * 200;
+ $('div#' + componentId).fadeTo('normal', 1.0);
+ setTimeout("$('div#" + componentId + "').fadeOut('normal')", timeout);
+ }
+ </script>
+
+ <style type="text/css">
+ table.palette td.header {
+ background:url("images/ui-bg_glass_75_e6e6e6_1x400.png")
+ repeat-x scroll 50% 50% #E6E6E6 !important;
+ }
+ </style>
</wicket:head>
<wicket:panel>
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/panels/Realm.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/Realm.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/Realm.html
index a38698a..9a6f9ef 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/Realm.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/Realm.html
@@ -23,19 +23,7 @@ under the License.
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://xmlns.jcp.org/jsf/composite">
<body>
<wicket:panel>
-
- <div class="tabbable tabs-left">
- <ul class="nav nav-tabs realm">
- <li wicket:id="anytype-menu">
- <wicket:container wicket:id="anytype-menuitem"/>
- </li>
- </ul>
- <div class="tab-content">
- <div class="tab-pane" wicket:id="anytype-content">
- <wicket:container wicket:id="anytype-contentitem"/>
- </div>
- </div>
- </div>
+ <div wicket:id="tabbedPanel"></div>
</wicket:panel>
</body>
</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html
index f75f98d..281ddd1 100644
--- a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmDetails.html
@@ -23,27 +23,10 @@ under the License.
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://xmlns.jcp.org/jsf/composite">
<body>
<wicket:panel>
- <div class="input-group">
- <span id="basic-addon1" class="input-group-addon">Name</span>
- <input type="text" aria-describedby="basic-addon1" placeholder="name" class="form-control" wicket:id="name" />
- </div>
- <br />
- <div class="input-group">
- <span id="basic-addon1" class="input-group-addon">Path</span>
- <input type="text" aria-describedby="basic-addon1" placeholder="path" class="form-control" wicket:id="path" />
- </div>
- <br />
- <div class="input-group">
- <span id="basic-addon1" class="input-group-addon">Account Policy</span>
- <input type="text" aria-describedby="basic-addon1" placeholder="accountPolicy" class="form-control"
- wicket:id="accountPolicy" />
- </div>
- <br />
- <div class="input-group">
- <span id="basic-addon1" class="input-group-addon">Password Policy</span>
- <input type="text" aria-describedby="basic-addon1" placeholder="passwordPolicy" class="form-control"
- wicket:id="passwordPolicy" />
- </div>
+ <span wicket:id="name">[name]</span>
+ <span wicket:id="fullPath">[fullPath]</span>
+ <span wicket:id="accountPolicy">[accountPolicy]</span>
+ <span wicket:id="passwordPolicy">[passwordPolicy]</span>
</wicket:panel>
</body>
</html>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmModalPanel.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmModalPanel.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmModalPanel.html
new file mode 100644
index 0000000..2f01a50
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/RealmModalPanel.html
@@ -0,0 +1,27 @@
+<!--
+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>
+ <div wicket:id="feedback"/>
+ <form data-example-id="simple-input-groups" class="bs-example bs-example-form" wicket:id="realmForm">
+ <div wicket:id="details">[details]</div>
+ <wicket:child />
+ </form>
+ </wicket:extend>
+</html>
http://git-wip-us.apache.org/repos/asf/syncope/blob/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModalPage.html
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModalPage.html b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModalPage.html
new file mode 100644
index 0000000..8cb22f0
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModalPage.html
@@ -0,0 +1,56 @@
+<!--
+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="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="#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>
+ <div class="tab-content">
+ <div id="resource" class="tab-pane active">
+ <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>
+ <div id="connectorProperties" class="tab-pane">
+ <span wicket:id="connconf">[connconf]</span>
+ </div>
+ <div id="security" class="tab-pane">
+ <span wicket:id="security">[security]</span>
+ </div>
+ </div>
+ </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/0419594e/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModalPage.properties
----------------------------------------------------------------------
diff --git a/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModalPage.properties b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModalPage.properties
new file mode 100644
index 0000000..789919b
--- /dev/null
+++ b/client/console/src/main/resources/org/apache/syncope/client/console/panels/ResourceModalPage.properties
@@ -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.
+resource=Resource details
+umapping=User mapping
+connectorProperties=Connector properties
+security=Security
+required_alert=All form fields are required
+connector=Connector
+existing_resources=Existing resources
+action=Action
+edit_attribute=Edit resource
+title=Resource
+extAttrNames=External attributes
+intMappingTypes=Internal mapping types
+entity=Entity
+groupSchema=Group Schema
+connObjectKey=ConnObjectKey
+mandatoryCondition=Mandatory
+password=Password
+purpose=Purpose
+mappingUserSchema=Mapping User Schema
+mappingGroupSchema=Mapping Group Schema
+delete=Delete
+intAttrNames=Internal attributes
+enforceMandatoryCondition=Enforce mandatory condition
+fieldName=Field name
+
+connObjectKeyValidation=There must be exactly one ConnObjectKey
+propagationMode=Propagation mode
+connObjectLink=ConnObjectLink
+enable=Enable
+
+createTraceLevel=Create trace level
+updateTraceLevel=Update trace level
+deleteTraceLevel=Delete trace level
+syncTraceLevel=Synchronization trace level
+propagationPriority=Propagation priority
+propagationPrimary=Propagation primary
+
+success_connection=Successful connection
+error_connection=Connection failure
+check=Check connection
+actionsClasses=Actions classes
+gmapping=Group mapping
+new=New resource
+randomPwdIfNotProvided=Generate random passwords when missing