From 05f77758de4cc5a2d992534319ac07664be87f97 Mon Sep 17 00:00:00 2001 From: Raphael Gauthier Date: Wed, 8 Jan 2020 13:52:29 +0100 Subject: [PATCH] Work in progress --- .../components/NodeGroupCategoryForm.scala | 2 +- .../rudder/web/components/NodeGroupForm.scala | 98 ++++++------ .../web/components/SearchNodeComponent.scala | 40 ++++- .../rudder/web/snippet/node/Groups.scala | 11 +- .../main/webapp/javascript/rudder/rudder.js | 2 - .../webapp/secure/nodeManager/groups.html | 97 ++++-------- .../webapp/style/rudder/rudder-datatable.css | 1 + .../webapp/style/rudder/rudder-groups.css | 143 ++++++++++-------- .../main/webapp/style/rudder/rudder-menu.css | 92 +++++++++-- .../src/main/webapp/style/rudder/rudder.css | 25 +-- .../ComponentDirectiveEditForm.html | 2 +- .../components/NodeGroupForm.html | 139 ++++++++--------- .../server/server_details.html | 36 +++-- 13 files changed, 373 insertions(+), 315 deletions(-) diff --git a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/components/NodeGroupCategoryForm.scala b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/components/NodeGroupCategoryForm.scala index ae5eb70081b..ab350ed0337 100644 --- a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/components/NodeGroupCategoryForm.scala +++ b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/components/NodeGroupCategoryForm.scala @@ -273,7 +273,7 @@ class NodeGroupCategoryForm( private[this] def onFailure : JsCmd = { formTracker.addFormError(error("There was problem with your request.")) - updateFormClientSide & JsRaw("""scrollToElement("notifications","#groupDetails");""") + updateFormClientSide & JsRaw("""scrollToElement("notifications","#ajaxItemContainer");""") } private[this] def onSubmit() : JsCmd = { diff --git a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/components/NodeGroupForm.scala b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/components/NodeGroupForm.scala index 97c514f19de..eae86a11949 100644 --- a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/components/NodeGroupForm.scala +++ b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/components/NodeGroupForm.scala @@ -180,85 +180,83 @@ class NodeGroupForm( val rules = dependencyService.targetDependencies(target).map( _.rules.toSet.filter(!_.isSystem).map(_.id)).toOption RuleGrid.staticInit ++ ruleGrid.rulesGridWithUpdatedInfo(None, false, false) ++ Script(OnLoad(ruleGrid.asyncDisplayAllRules(rules).applied)) } - + private[this] val groupNameString = nodeGroup.fold( + t => rootCategory.allTargets.get(t).map(_.name).getOrElse(t.target) + , _.name + ) private[this] def showFormNodeGroup(nodeGroup: NodeGroup): CssSel = { + val nodesSel = "#gridResult" #> NodeSeq.Empty + val nodes = nodesSel(searchNodeComponent.get match { + case Full(req) => req.buildQuery + case eb:EmptyBox => Error when retrieving the request, please try again + }) ( - "group-pendingchangerequest" #> PendingChangeRequestDisplayer.checkByGroup(pendingChangeRequestXml,nodeGroup.id) + "#group-name" #> groupNameString + & "group-pendingchangerequest" #> PendingChangeRequestDisplayer.checkByGroup(pendingChangeRequestXml,nodeGroup.id) & "group-name" #> groupName.toForm_! & "group-rudderid" #>
& "group-cfeclasses" #>
- - - - - -
& "#longDescriptionField *" #> (groupDescription.toForm_! ++ Script(OnLoad(JsRaw(s"""setupMarkdown(${Str(nodeGroup.description).toJsCmd}, "longDescriptionField")""")))) & "group-container" #> groupContainer.toForm_! & "group-static" #> groupStatic.toForm_! - & "group-showgroup" #> (searchNodeComponent.get match { - case Full(req) => req.buildQuery - case eb:EmptyBox => Error when retrieving the request, please try again - }) + & "group-showgroup" #> nodes & "group-clone" #> { if (CurrentUser.checkRights(AuthorizationType.Group.Write)) SHtml.ajaxButton("Clone", () => showCloneGroupPopup()) % ("id" -> "groupCloneButtonId") % ("class" -> " btn btn-default") else NodeSeq.Empty } & "group-save" #> { if (CurrentUser.checkRights(AuthorizationType.Group.Edit)) -
{ + { SHtml.ajaxSubmit("Save", onSubmit _) % ("id" -> saveButtonId) % ("class" -> " btn btn-success") - }
+ } else NodeSeq.Empty } & "group-delete" #> SHtml.ajaxButton("Delete", () => onSubmitDelete(), ("class" -> " btn btn-danger")) & "group-notifications" #> updateAndDisplayNotifications() & "#groupRuleTabsContent" #> showRulesForTarget(GroupTarget(nodeGroup.id)) + & "#group-shownodestable *" #> (searchNodeComponent.get match { + case Full(req) => req.displayNodesTable + case eb:EmptyBox => Error when retrieving the request, please try again + }) ) } private[this] def showFormTarget(target: SimpleTarget): CssSel = { - // we want to remove the query part which doesn't mean anything for - // system group - val nodesSel = "#SearchForm" #> NodeSeq.Empty - val nodes = nodesSel(searchNodeComponent.get match { - case Full(req) => req.buildQuery - case eb:EmptyBox => Error when retrieving the request, please try again - }) - - ( - "group-pendingchangerequest" #> NodeSeq.Empty - & "group-name" #> groupName.readOnlyValue - & "group-rudderid" #>
- - -
- & "group-cfeclasses" #> NodeSeq.Empty - & "#longDescriptionField" #> (groupDescription.toForm_! ++ Script(JsRaw(s"""setupMarkdown("", "longDescriptionField")"""))) - & "group-container" #> groupContainer.readOnlyValue - & "group-static" #> NodeSeq.Empty - & "group-showgroup" #> nodes - & "group-clone" #> NodeSeq.Empty - & "group-save" #> NodeSeq.Empty - & "group-delete" #> NodeSeq.Empty - & "group-notifications" #> NodeSeq.Empty - & "#groupRuleTabsContent" #> showRulesForTarget(target) + ( "group-pendingchangerequest" #> NodeSeq.Empty + & "group-name" #> groupName.readOnlyValue + & "group-rudderid" #>
+ + +
+ & "group-cfeclasses" #> NodeSeq.Empty + & "#longDescriptionField" #> (groupDescription.toForm_! ++ Script(JsRaw(s"""setupMarkdown("", "longDescriptionField")"""))) + & "group-container" #> groupContainer.readOnlyValue + & "group-static" #> NodeSeq.Empty + & "group-showgroup" #> NodeSeq.Empty + & "group-clone" #> NodeSeq.Empty + & "group-save" #> NodeSeq.Empty + & "group-delete" #> NodeSeq.Empty + & "group-notifications" #> NodeSeq.Empty + & "#groupRuleTabsContent" #> showRulesForTarget(target) + & "#group-shownodestable *" #> (searchNodeComponent.get match { + case Full(req) => req.displayNodesTable + case eb:EmptyBox => Error when retrieving the request, please try again + }) ) - } ///////////// fields for category settings /////////////////// + private[this] val groupName = { - val name = nodeGroup.fold( - t => rootCategory.allTargets.get(t).map(_.name).getOrElse(t.target) - , _.name - ) - new WBTextField("Group name", name) { + new WBTextField("Group name", groupNameString) { override def setFilter = notNull _ :: trim _ :: Nil override def className = "form-control" override def labelClassName = "" @@ -309,13 +307,13 @@ class NodeGroupForm( } ) { override def setFilter = notNull _ :: trim _ :: Nil - override def className = "" + override def className = "switch" override def labelClassName = "" override def subContainerClassName = "" } } - private[this] val groupContainer = new WBSelectField("Group container", + private[this] val groupContainer = new WBSelectField("Category", (categoryHierarchyDisplayer.getCategoriesHierarchy(rootCategory, None).map { case (id, name) => (id.value -> name)}), parentCategoryId.value) { override def className = "form-control" @@ -333,7 +331,7 @@ class NodeGroupForm( private[this] def onFailure : JsCmd = { formTracker.addFormError(error("There was problem with your request.")) - updateFormClientSide() & JsRaw("""scrollToElement("errorNotification","#groupDetails");""") + updateFormClientSide() & JsRaw("""scrollToElement("errorNotification","#ajaxItemContainer");""") } private[this] def onSubmit() : JsCmd = { diff --git a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/components/SearchNodeComponent.scala b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/components/SearchNodeComponent.scala index 56c8b37fcd4..da1f4d444a4 100644 --- a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/components/SearchNodeComponent.scala +++ b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/components/SearchNodeComponent.scala @@ -95,7 +95,10 @@ class SearchNodeComponent( List("templates-hidden", "server", "server_details") , "query-searchnodes" ) - + private[this] def nodesTable = ChooseTemplate( + List("templates-hidden", "server", "server_details") + , "nodes-table" + ) private[this] def queryline = { @@ -212,15 +215,15 @@ class SearchNodeComponent( lines.append(cl) val initJs = cl.attribute.cType.initForm("v_"+index) - val inputAttributes = ("id","v_"+index) :: ("class", "queryInputValue") :: {if (cl.comparator.hasValue) Nil else ("disabled", "disabled") :: Nil } + val inputAttributes = ("id","v_"+index) :: ("class", "queryInputValue form-control input-sm") :: {if (cl.comparator.hasValue) Nil else ("disabled", "disabled") :: Nil } val input = cl.attribute.cType.toForm(cl.value, (x => lines(index) = lines(index).copy(value=x)), inputAttributes:_*) ( ".removeLine *" #> { if(addRemove) - SHtml.ajaxSubmit("-", () => removeLine(index), ("class", "removeLineButton btn btn-default btn-xs")) + SHtml.ajaxSubmit("-", () => removeLine(index), ("class", "removeLineButton btn btn-danger btn-xs")) else NodeSeq.Empty } & - ".addLine *" #> SHtml.ajaxSubmit("+", () => addLine(index), ("class", "removeLineButton btn btn-default btn-xs")) & + ".addLine *" #> SHtml.ajaxSubmit("+", () => addLine(index), ("class", "removeLineButton btn btn-success btn-xs")) & ".objectType *" #> objectTypeSelect(cl.objectType,lines,index) & ".attributeName *" #> attributeNameSelect(cl.objectType,cl.attribute,lines,index) & ".comparator *" #> comparatorSelect(cl.objectType,cl.attribute,cl.comparator,lines,index) & @@ -300,6 +303,16 @@ class SearchNodeComponent( showQueryAndGridContent() ++ Script(OnLoad(ajaxGridRefresh)) } + def displayNodesTable: NodeSeq = { + def showQueryAndGridContent() : NodeSeq = { + ( + "content-query" #> NodeSeq.Empty + & "update-nodestable" #> srvGrid.displayAndInit(Seq(),"groupNodesTable") // we need to set something, or IE moans + )(nodesTable) + } + showQueryAndGridContent() ++ Script(OnLoad(ajaxNodesTableRefresh)) + } + /** * Refresh the grid result * A small trick of the trade : since the Showing x of xx is moved out of the ajax refresh @@ -310,7 +323,20 @@ class SearchNodeComponent( activateButtonOnChange & gridResult } + def ajaxNodesTableRefresh() : JsCmd = { + srvList match { + case Full(seq) => + val refresh = srvGrid.refreshData(() => seq, onClickCallback, "groupNodesTable") + JsRaw(s"""(${refresh.toJsCmd}());createTooltip();""") + case Empty => + Noop + + case f@Failure(_,_,_) => + logger.error(s"Could not update node table result cause is: ${f.msg}" ) + Noop + } + } /** * When we change the form, we can update the query * @return @@ -541,7 +567,7 @@ object SearchNodeComponent { }), ("id","ot_"+i), ("onchange", ajaxAttr(lines,i)._2.toJsCmd), - ("class","selectField") + ("class","selectField form-control input-sm") ) } @@ -555,7 +581,7 @@ object SearchNodeComponent { }), ("id","at_"+i), ("onchange", ajaxComp(lines,i)._2.toJsCmd), - ("class","selectField") + ("class","selectField form-control input-sm") ) } @@ -568,7 +594,7 @@ object SearchNodeComponent { }), ("id","ct_"+i), ("onchange", ajaxVal(lines,i)._2.toJsCmd), - ("class","selectComparator") + ("class","selectComparator form-control input-sm") ) } diff --git a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/snippet/node/Groups.scala b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/snippet/node/Groups.scala index bf08159b2d2..b3115f625b7 100644 --- a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/snippet/node/Groups.scala +++ b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/snippet/node/Groups.scala @@ -317,12 +317,6 @@ class Groups extends StatefulSnippet with DefaultExtendableSnippet[Groups] with $$.jstree.rollback(data.rlbk); } }); - adjustHeight('#groupsTree'); - adjustHeight('#groupDetails'); - $$(window).on('resize',function(){ - adjustHeight('#groupsTree'); - adjustHeight('#groupDetails'); - }); """)) )} } @@ -427,7 +421,7 @@ class Groups extends StatefulSnippet with DefaultExtendableSnippet[Groups] with selectedCategoryId = Full(category.id) //update UI - no modification here, so no refreshGroupLib refreshRightPanel(CategoryForm(category)) & - JsRaw("""$('#groupDetails').show();""") + JsRaw("""$('#ajaxItemContainer').show();""") } //adaptater @@ -440,10 +434,9 @@ class Groups extends StatefulSnippet with DefaultExtendableSnippet[Groups] with } refreshRightPanel(GroupForm(g, parentCategoryId))& JsRaw(s""" - jQuery('#groupDetails').show(); + jQuery('#ajaxItemContainer').show(); var groupId = JSON.stringify({${js}}); window.location.hash = "#"+groupId; - adjustHeight('#groupDetails'); """) } diff --git a/webapp/sources/rudder/rudder-web/src/main/webapp/javascript/rudder/rudder.js b/webapp/sources/rudder/rudder-web/src/main/webapp/javascript/rudder/rudder.js index 8e1f5683d1a..d6e30925226 100644 --- a/webapp/sources/rudder/rudder-web/src/main/webapp/javascript/rudder/rudder.js +++ b/webapp/sources/rudder/rudder-web/src/main/webapp/javascript/rudder/rudder.js @@ -825,8 +825,6 @@ function generateMarkdown(text, container) { } function setupMarkdown(initialValue, id) { - console.log($("#" + id)) - console.log($("#" + id + " textarea")) $("#" + id + " textarea").keyup(function() { var value = $(this).val() console.log(value) diff --git a/webapp/sources/rudder/rudder-web/src/main/webapp/secure/nodeManager/groups.html b/webapp/sources/rudder/rudder-web/src/main/webapp/secure/nodeManager/groups.html index 9211638b328..3a8f9fd5ff3 100644 --- a/webapp/sources/rudder/rudder-web/src/main/webapp/secure/nodeManager/groups.html +++ b/webapp/sources/rudder/rudder-web/src/main/webapp/secure/nodeManager/groups.html @@ -3,86 +3,49 @@ Rudder - Node Groups Management - + -
-
-
-
- Group hierarchy - -
Here comes the New item Button
-
-
-
-
-
-
-
- -
- -
- -
+
+ + + +
- -
diff --git a/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/components/NodeGroupForm.html b/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/components/NodeGroupForm.html index b09523f88f2..8ecd5f144d7 100644 --- a/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/components/NodeGroupForm.html +++ b/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/components/NodeGroupForm.html @@ -29,83 +29,74 @@ -
- - -
- -
-
-
- Group details -
-
-
- - - - - - -
- -
-
-

No description defined, click on to edit

-
-
-
-
- Here comes the longDescription field -
-
- -
-
-
- - - -
-
Group criteria
-
- -
- - - -
-
-
- - -
-
- -
If your 'Save' button is disabled, it means that you have updated the query without Searching for new Nodes. - Please click on 'Search' to enable saving again
-
-
-
-
+
+
+
+

+ + +

+ +
+ + + +
+ If your 'Save' button is disabled, it means that you have updated the query without Searching for new Nodes. + Please click on 'Search' to enable saving again +
-
-
+ +
-
-
- This group is used in following rule targets (either as a target or exception group): + +
+
+ + + +
+ +
+
+

No description defined, click on to edit

+
+
+
+
+ Here comes the longDescription field +
+
+ +
+
+
+ + +
-
+
+
+ This group is used in following rule targets (either as a target or exception group): +
+
+
+
+ +
+ +
+
+
+
diff --git a/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/server/server_details.html b/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/server/server_details.html index ef868f0d17d..4417cf4888f 100644 --- a/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/server/server_details.html +++ b/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/server/server_details.html @@ -6,16 +6,28 @@
-
-
- - -
- - Match the criteria below with this operand: - - - +
+
    +
  • +
    + + +
    +
  • +
+
+ +
+ +
@@ -29,6 +41,10 @@ + + + + This part is the detail of a node