- {showNodeDetails(sm, nodeAndGlobalMode, None, inventoryStatus, salt)}
+
+
+ {showNodeHeader(sm)}
-
- {showInventoryVerticalMenu(sm, nodeAndGlobalMode.map(_._1))}
+
+
+
+ {showNodeDetails(sm, nodeAndGlobalMode, None, inventoryStatus, salt)}
+
+
+ {showInventoryVerticalMenu(sm, nodeAndGlobalMode.map(_._1))}
+
}
+ def removeNode(node: NodeSummary): JsCmd = {
+ implicit val cc: ChangeContext = ChangeContext(
+ ModificationId(uuidGen.newUuid),
+ CurrentUser.actor,
+ DateTime.now(),
+ None,
+ S.request.map(_.remoteAddr).toOption
+ )
+
+ // only erase for Rudder 8.0
+ removeNodeService.removeNodePure(node.id, DeleteMode.Erase).toBox match {
+ case Full(_) =>
+ asyncDeploymentAgent ! AutomaticStartDeployment(cc.modId, cc.actor)
+ onSuccess(node)
+ case eb: EmptyBox =>
+ val message = s"There was an error while deleting node '${node.hostname}' [${node.id.value}]"
+ val e = eb ?~! message
+ NodeLoggerPure.Delete.logEffect.error(e.messageChain)
+ onFailure(node, message)
+ }
+ }
+
+ private[this] def onFailure(
+ node: NodeSummary,
+ message: String
+ ): JsCmd = {
+ RegisterToasts.register(
+ ToastNotification.Error(
+ s"An error happened when trying to delete node '${node.hostname}' [${node.id.value}]. " +
+ "Please contact your server admin to resolve the problem. " +
+ s"Error was: '${message}'"
+ )
+ )
+ RedirectTo("/secure/nodeManager/nodes")
+ }
+
+ private[this] def onSuccess(node: NodeSummary): JsCmd = {
+ RegisterToasts.register(ToastNotification.Success(s"Node '${node.hostname}' [${node.id.value}] was correctly deleted"))
+ RedirectTo("/secure/nodeManager/nodes")
+ }
+
+ private[this] def isRootNode(n: NodeId): Boolean = {
+ n.value.equals("root");
+ }
+
+ def showNodeHeader(sm: FullInventory, optNode: Option[NodeInfo] = None): NodeSeq = {
+ val machineTooltip: String = {
+ s"""
+ |
Machine details
+ |
+ |
+ | Type: ${displayMachineType(sm.machine)}
+ | Total physical memory (RAM): ${xml.Utility.escape(
+ sm.node.ram.map(_.toStringMo).getOrElse("-")
+ )}
+ | Manufacturer: ${xml.Utility.escape(
+ sm.machine.flatMap(x => x.manufacturer).map(x => x.name).getOrElse("-")
+ )}
+ | Total swap space: ${xml.Utility.escape(sm.node.swap.map(_.toStringMo).getOrElse("-"))}
+ | System serial number: ${xml.Utility.escape(
+ sm.machine.flatMap(x => x.systemSerialNumber).getOrElse("-")
+ )}
+ | Time zone: ${xml.Utility.escape(
+ sm.node.timezone
+ .map(x => if (x.name.toLowerCase == "utc") "UTC" else s"${x.name} (UTC ${x.offset})")
+ .getOrElse("unknown")
+ )}
+ | ${sm.machine
+ .map(_.id.value)
+ .map(machineId => "Machine ID: " ++ { xml.Utility.escape(machineId) })
+ .getOrElse("Machine Information are missing for that node ")}
+ |
+ |
+ |""".stripMargin.replaceAll("\n", " ")
+ }
+
+ val deleteBtn = {
+ sm.node.main.status match {
+ case AcceptedInventory =>
+
+ {
+ if (!isRootNode(sm.node.main.id)) {
+
+ Delete
+
+
+ } else { NodeSeq.Empty }
+ }
+
+ case _ => NodeSeq.Empty
+ }
+ }
+
+ val osTooltip: String = {
+ s"""
+ |
Operating system details
+ |
+ |
+ | Type: ${xml.Utility.escape(sm.node.main.osDetails.os.kernelName)}
+ | Name: ${xml.Utility.escape(S.?("os.name." + sm.node.main.osDetails.os.name))}
+ | Version: ${xml.Utility.escape(sm.node.main.osDetails.version.value)}
+ | Service pack: ${xml.Utility.escape(sm.node.main.osDetails.servicePack.getOrElse("None"))}
+ | Architecture: ${xml.Utility.escape(sm.node.archDescription.getOrElse("None"))}
+ | Kernel version: ${xml.Utility.escape(sm.node.main.osDetails.kernelVersion.value)}
+ |
+ |
""".stripMargin.replaceAll("\n", " ")
+ }
+
+ val nodeStateIcon = (optNode
+ .map(n =>
)
+ .getOrElse(NodeSeq.Empty))
+
+ ++ Script(OnLoad(JsRaw(s"""new ClipboardJS('[data-clipboard-text]');""")))
+ }
+
// mimic the content of server_details/ShowNodeDetailsFromNode
def showNodeDetails(
sm: FullInventory,
@@ -407,101 +548,8 @@ object DisplayNode extends Loggable {
None
}
- val deleteButton: NodeSeq = {
- sm.node.main.status match {
- case AcceptedInventory =>
-
-
-
-
-
-
- {
- if (!isRootNode(sm.node.main.id)) {
-
-
- {showDeleteButton(sm.node.main)}
-
-
- } else { NodeSeq.Empty }
- }
-
- case _ => NodeSeq.Empty
- }
- }
- val osIcon = sm.node.main.osDetails.os.name.toLowerCase();
-
- val osTooltip: String = {
- s"""
-
Operating system details
-
-
- Type: ${escape(sm.node.main.osDetails.os.kernelName)}
- Name: ${escape(S.?("os.name." + sm.node.main.osDetails.os.name))}
- Version: ${escape(sm.node.main.osDetails.version.value)}
- Service pack: ${escape(sm.node.main.osDetails.servicePack.getOrElse("None"))}
- Architecture: ${escape(sm.node.archDescription.getOrElse("None"))}
- Kernel version: ${escape(sm.node.main.osDetails.kernelVersion.value)}
-
-
- """
- }
- val machineTooltip: String = {
- s"""
-
Operating system details
-
-
- Total physical memory (RAM): ${escape(sm.node.ram.map(_.toStringMo).getOrElse("-"))}
- Manufacturer: ${escape(sm.machine.flatMap(x => x.manufacturer).map(x => x.name).getOrElse("-"))}
- Total swap space: ${escape(sm.node.swap.map(_.toStringMo).getOrElse("-"))}
- System serial number: ${escape(sm.machine.flatMap(x => x.systemSerialNumber).getOrElse("-"))}
- Time zone:
- ${escape(
- sm.node.timezone
- .map(x => if (x.name.toLowerCase == "utc") "UTC" else s"${x.name} (UTC ${x.offset})")
- .getOrElse("unknown")
- )}
-
-
- ${sm.machine
- .map(_.id.value)
- .map(machineId => "Machine ID: " ++ { escape(machineId) })
- .getOrElse("""Machine Information are missing for that node """)}
-
-
-
- """
- }
-
-
-
-
-
Hostname: {sm.node.main.hostname}{
- nodeAndGlobalMode match {
- case Some((n, _)) =>
- case None => NodeSeq.Empty
- }
- }
-
-
Node ID: {sm.node.main.id.value}
-
Operating system: {
- escape(sm.node.main.osDetails.fullName)
- }
-
- Machine: {displayMachineType(sm.machine)}
- {sm.node.ram.map(_.toStringMo).getOrElse("-")}
-
-
-
-
-
-
Rudder information
@@ -617,7 +665,6 @@ object DisplayNode extends Loggable {
Software updates available: {sm.node.softwareUpdates.size}
- {deleteButton}
++ Script(OnLoad(JsRaw(s"""
$$(".node-compliance-bar").html(buildComplianceBar(${compliance.toJsCmd}))
@@ -679,7 +726,7 @@ object DisplayNode extends Loggable {
}
}
- private def displayMachineType(opt: Option[MachineInventory]): NodeSeq = {
+ def displayMachineType(opt: Option[MachineInventory]): NodeSeq = {
opt match {
case None => NodeSeq.Empty
case Some(machine) => (
@@ -1112,90 +1159,8 @@ object DisplayNode extends Loggable {
}
}
- private[this] def showDeleteButton(node: NodeSummary) = {
- def toggleDeletion(): JsCmd = {
- JsRaw(""" $('#deleteButton').toggle(300); $('#confirmDeletion').toggle(300) """)
- }
- SHtml.ajaxButton(
- "Delete",
- () => { toggleDeletion() },
- ("id", "deleteButton"),
- ("class", "btn btn-danger")
- ) ++
-
-
-
-
- Are you sure you want to delete this node?
-
-
If you choose to remove this node from Rudder, it won't be managed anymore,
- and all information about it will be removed from the application.
-
-
-
-
- {
- SHtml.ajaxButton("Cancel", () => { toggleDeletion() }, ("class", "btn btn-default"))
- }
- {
- SHtml.ajaxButton("Confirm", () => { removeNode(node) }, ("class", "btn btn-danger"))
- }
-
-
-
-
-
- }
-
- private[this] def removeNode(node: NodeSummary): JsCmd = {
- implicit val cc: ChangeContext = ChangeContext(
- ModificationId(uuidGen.newUuid),
- CurrentUser.actor,
- DateTime.now(),
- None,
- S.request.map(_.remoteAddr).toOption
- )
-
- // only erase for Rudder 8.0
- removeNodeService.removeNodePure(node.id, DeleteMode.Erase).toBox match {
- case Full(_) =>
- asyncDeploymentAgent ! AutomaticStartDeployment(cc.modId, cc.actor)
- onSuccess(node)
- case eb: EmptyBox =>
- val message = s"There was an error while deleting node '${node.hostname}' [${node.id.value}]"
- val e = eb ?~! message
- NodeLoggerPure.Delete.logEffect.error(e.messageChain)
- onFailure(node, message, e.messageChain, None)
- }
- }
-
- private[this] def onFailure(
- node: NodeSummary,
- message: String,
- details: String,
- hookError: Option[HookReturnCode.Error]
- ): JsCmd = {
- RegisterToasts.register(
- ToastNotification.Error(
- s"An error happened when trying to delete node '${node.hostname}' [${node.id.value}]. " +
- "Please contact your server admin to resolve the problem. " +
- s"Error was: '${message}'"
- )
- )
- RedirectTo("/secure/nodeManager/nodes")
- }
-
- private[this] def onSuccess(node: NodeSummary): JsCmd = {
- RegisterToasts.register(ToastNotification.Success(s"Node '${node.hostname}' [${node.id.value}] was correctly deleted"))
- RedirectTo("/secure/nodeManager/nodes")
- }
-
- private[this] def isRootNode(n: NodeId): Boolean = {
- return n.value.equals("root");
- }
-
import com.normation.rudder.domain.nodes.NodeState
- private[this] def getNodeState(nodeState: NodeState): String = {
+ def getNodeState(nodeState: NodeState): String = {
S.?(s"node.states.${nodeState.name}")
}
}
diff --git a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/snippet/node/AcceptNode.scala b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/snippet/node/AcceptNode.scala
index 9c0ce9048fb..ea9e94ae15c 100644
--- a/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/snippet/node/AcceptNode.scala
+++ b/webapp/sources/rudder/rudder-web/src/main/scala/com/normation/rudder/web/snippet/node/AcceptNode.scala
@@ -279,12 +279,6 @@ class AcceptNode extends Loggable {
},
("class", "btn btn-danger")
)
- & "servergrid-close" #>
- SHtml.ajaxButton(
- "Cancel",
- () => JsRaw(" $('#confirmPopup')hideBsModal;$('#refusePopup')hideBsModal;"): JsCmd,
- ("class", "btn btn-default")
- )
)(template)
)
case e: EmptyBox =>
diff --git a/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-main.css b/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-main.css
index 54bfaed39ab..1943e8cd770 100644
--- a/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-main.css
+++ b/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-main.css
@@ -261,10 +261,15 @@ pre.json-beautify code.elmsh {
.content-wrapper .btn-default .fa,
.modal .btn-danger .fa,
.modal .btn-default .fa{
+ transition-duration: .2s;
color: #738195;
}
.content-wrapper .btn.btn-danger:hover .fa,
-.modal .btn.btn-danger:hover .fa{
+.modal .btn.btn-danger:hover .fa,
+.content-wrapper .btn.btn-danger:active .fa,
+.modal .btn.btn-danger:active .fa,
+.content-wrapper .btn.btn-danger:focus .fa,
+.modal .btn.btn-danger:focus .fa{
color: #fff;
}
.content-wrapper .dataTables_wrapper_top .btn-default,
@@ -526,13 +531,14 @@ pre.json-beautify code.elmsh {
min-width: 95px;
}
/* --- NODE PAGE --- */
-.ui-tabs-nav.list-tabs-invetory{
+.ui-tabs-nav.list-tabs-inventory{
margin-bottom: 15px;
float: left;
width: 12em;
border-bottom: none;
+ padding-left: 0;
}
-.ui-tabs-nav.list-tabs-invetory > .ui-tabs-tab {
+.ui-tabs-nav.list-tabs-inventory > .ui-tabs-tab {
display: block;
border: 1px solid #e8e8e8;
border-top: none;
@@ -540,11 +546,11 @@ pre.json-beautify code.elmsh {
transition-duration: .2s;
padding: 0;
}
-.ui-tabs-nav.list-tabs-invetory > .ui-tabs-tab {
+.ui-tabs-nav.list-tabs-inventory > .ui-tabs-tab {
border: 1px solid #e8e8e8;
position: relative;
}
-.ui-tabs-nav.list-tabs-invetory > .ui-tabs-tab.ui-tabs-active:after{
+.ui-tabs-nav.list-tabs-inventory > .ui-tabs-tab.ui-tabs-active:after{
content: "";
position: absolute;
top: calc(50% - 4px);
@@ -557,20 +563,20 @@ pre.json-beautify code.elmsh {
transform: rotate(45deg);
background-color: #fff;
}
-.ui-tabs-nav.list-tabs-invetory > .ui-tabs-tab.ui-tabs-active:before{
+.ui-tabs-nav.list-tabs-inventory > .ui-tabs-tab.ui-tabs-active:before{
content:initial;
}
-.ui-tabs-nav.list-tabs-invetory > .ui-tabs-tab > a{
+.ui-tabs-nav.list-tabs-inventory > .ui-tabs-tab > a{
transition-property : background-color;
background-color: #F8F9FC;
padding: 6px 10px;
transition-duration: .2s;
display: block;
}
-.ui-tabs-nav.list-tabs-invetory > .ui-tabs-tab > a:hover{
+.ui-tabs-nav.list-tabs-inventory > .ui-tabs-tab > a:hover{
background-color:#fff;
}
-.ui-tabs-nav.list-tabs-invetory > .ui-tabs-tab.ui-tabs-active > a{
+.ui-tabs-nav.list-tabs-inventory > .ui-tabs-tab.ui-tabs-active > a{
background-color: #fff;
}
#nodeInventory > .sInventory > div{
@@ -907,6 +913,9 @@ form .tooltip-content p {
.tooltip > .tooltip-inner .tooltip-content p{
margin-bottom: 5px;
}
+.tooltip > .tooltip-inner .tooltip-content > ul{
+ padding-left: 0;
+}
.tooltip > .tooltip-inner .tooltip-content > ul:last-child,
.tooltip > .tooltip-inner .tooltip-content > p:last-child{
margin-bottom : 0;
@@ -3015,19 +3024,6 @@ table a > i.fa-pencil:hover{
margin-bottom: 15px;
display: flex;
}
-.id-card .card-img {
- width: 150px;
- background-size: contain;
- background-repeat: no-repeat;
- background-position: center;
- opacity: 0.5;
- margin-left: -10px;
-}
-@media (max-width: 992px){
- .id-card .card-img {
- display: none !important
- }
-}
.id-card .card-info {
flex: auto;
}
diff --git a/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-node.css b/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-node.css
deleted file mode 100644
index 0817ceb99f2..00000000000
--- a/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-node.css
+++ /dev/null
@@ -1,454 +0,0 @@
-/*
-*************************************************************************************
-* Copyright 2019 Normation SAS
-*************************************************************************************
-*
-* This file is part of Rudder.
-*
-* Rudder is free software: you can redistribute it and/or modify
-* it under the terms of the GNU General Public License as published by
-* the Free Software Foundation, either version 3 of the License, or
-* (at your option) any later version.
-*
-* In accordance with the terms of section 7 (7. Additional Terms.) of
-* the GNU General Public License version 3, the copyright holders add
-* the following Additional permissions:
-* Notwithstanding to the terms of section 5 (5. Conveying Modified Source
-* Versions) and 6 (6. Conveying Non-Source Forms.) of the GNU General
-* Public License version 3, when you create a Related Module, this
-* Related Module is not considered as a part of the work and may be
-* distributed under the license agreement of your choice.
-* A "Related Module" means a set of sources files including their
-* documentation that, without modification of the Source Code, enables
-* supplementary functions or services in addition to those offered by
-* the Software.
-*
-* Rudder is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-* GNU General Public License for more details.
-*
-* You should have received a copy of the GNU General Public License
-* along with Rudder. If not, see
.
-
-*
-*************************************************************************************
-*/
-.rudder-template .one-col .main-header{
- border-bottom: none !important;
-}
-
-#queryParameters{
- padding: 0 15px;
-}
-#submitSearch{
- margin-bottom: 15px;
-}
-.rudder_col>.portlet{
- padding: 0 !important;
-}
-.portlet-header.ui-widget-header.page-title{
- margin: 0 !important;
- border-bottom: none !important;
- padding: 15px 15px 10px;
- color: #041922 !important;
- font-size: 24px !important;
-}
-
-.page-title-description{
- padding: 0 15px;
- margin-bottom: 8px;
- font-size: 1.2em;
- color: #738195;
-}
-
-.rudder-ui-tabs ~ .ui-tabs-panel{
- padding: 0 15px 15px 15px;
- float: left;
- width: 100%;
-}
-#node_summary{
- display: flex;
- padding: 0 !important;
-}
-
-.rudder-ui-tabs {
- border-bottom: 2px solid #d6deef;
- margin: 0 0 15px 0;
- position: relative;
- background-color: #fff;
- z-index: 10;
-}
-.rudder-ui-tabs > .ui-tabs-tab{
- display: inline-block;
- padding: 6px 0px;
- margin: 0 0 0 15px;
- outline: none !important;
- position: relative;
-}
-
-#nodeDetails {
- flex: 70;
- padding: 0 15px 0 0;
-}
-.details #nodeDetails {
- padding: 0;
-}
-#nodeGroups {
- flex: 30;
- border-left: 2px solid #d6deef;
- margin-top: -15px;
-}
-.jstree-anchor > i.jstree-icon.fa.fa-folder,
-.jstree-anchor > .treeGroupCategoryName {
- position: relative;
- top: 2px;
-}
-#nodeGroups > h3 {
- color: #041922;
- padding: 15px 15px 10px !important;
- margin: 0;
- font-size: 20px;
- background-color: #f7f7f7;
-}
-.id-card .node-state{
- float: right;
- text-transform: uppercase;
- font-size: .8em;
- color: #04192299;
- display: inline-block;
- position: relative;
- padding-right: 26px;
-}
-.id-card .node-state:before{
- content: "ENABLED";
-}
-.id-card .node-state.ignored:before{
- content: "IGNORED";
-}
-.id-card .node-state.empty-policies:before{
- content: "EMPTY POLICIES";
-}
-.id-card .node-state.initializing:before{
- content: "INITIALIZING";
-}
-.id-card .node-state.preparing-eol:before{
- content: "PREPARING EOL";
-}
-.id-card .node-state:after{
- content: "";
- display: inline-block;
- height: 16px;
- width: 16px;
- position: absolute;
- right: 0px;
- top: 2px;
- border-radius: 50%;
- background-color: #4eb934;
-}
-.id-card .node-state.ignored:after{
- background-color: #a4aebf;
-}
-.id-card .node-state.empty-policies:after{
- background-color: #7591c599;
-}
-.id-card .node-state.initializing:after{
- color: #08a3ef;
- content: "\f1ce";
- font: normal normal normal 14px/1 inherit;
- font-family: "Font Awesome 5 Free";
- font-weight: 900;
- background-color: transparent;
- font-weight: bold;
- font-size: 1.1em;
- animation: fa-spin 2s infinite linear;
- height: 14px;
- width: auto;
-}
-.id-card .node-state.preparing-eol:after{
- background-color: #EF9600;
-}
-
-.machine-info{
- position: relative;
- padding-left: 60px;
-}
-.machine-info:after{
- content: "";
- position: absolute;
- top: calc(50% - 4px);
- left: 6px;
- width: 8px;
- height: 8px;
- background-color: #041922;
- opacity: .5;
- border-radius: 50%;
-}
-.machine-info:before{
- content: "";
- display: inline-block;
- position: absolute;
- width: 40px;
- height: 28px;
- top: calc(50% - 14px);
- left: 20px;
- background-size: contain;
- background-repeat: no-repeat;
- background-position: center;
-}
-.machine-info.ram:before{
- background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgaWQ9InN2ZzEwIgogICB2ZXJzaW9uPSIxLjEiCiAgIHZpZXdCb3g9IjAgLTEwMyA1MTIgNTEyIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExNiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+PC9kYzp0aXRsZT4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczE0IiAvPgogIDxwYXRoCiAgICAgaWQ9InJlY3Q4NDUtNSIKICAgICBkPSJtIDU5LjkxNiw3LjQwNjE3NjkgYyAtMzAuNjQ0MTE2LDAgLTU1LjMxMzU3NTcsMjQuNjY5NDQ1MSAtNTUuMzEzNTc1Nyw1NS4zMTM1NzYxIFYgMjIyLjMwODAzIGMgMCwyNS4xNzcyOCAxNi42NTgwMDM3LDQ2LjMxMDQ1IDM5LjU5NDk3NzcsNTMuMDUzNjggdiAyMy42NDMzNCBjIDAsMi4xNzU3NCAxLjc1MTQsMy45MjcxNCAzLjkyNzEzOCwzLjkyNzE0IGggMjEuNjA5MjkgYyAyLjE3NTczOCwwIDMuOTI3MTMyLC0xLjc1MTQgMy45MjcxMzIsLTMuOTI3MTQgdiAtMjEuMzgyIGggMjguMTc0NjU4IHYgMjEuMzgyIGMgMCwyLjE3NTc0IDEuNzUxMzksMy45MjcxNCAzLjkyNzEyLDMuOTI3MTQgaCAyMS42MDkzIGMgMi4xNzU3NCwwIDMuOTI4NTcsLTEuNzUxNCAzLjkyODU3LC0zLjkyNzE0IHYgLTIxLjM4MiBoIDI4LjE3MzIyIHYgMjEuMzgyIGMgMCwyLjE3NTc0IDEuNzUxMzksMy45MjcxNCAzLjkyNzEzLDMuOTI3MTQgaCAyMS42MTA3MyBjIDIuMTc1NzQsMCAzLjkyNzEzLC0xLjc1MTQgMy45MjcxMywtMy45MjcxNCB2IC0yMS4zODIgaCAyOC4xNzMyMSB2IDIxLjM4MiBjIDAsMi4xNzU3NCAxLjc1Mjg0LDMuOTI3MTQgMy45Mjg1NywzLjkyNzE0IGggMjEuNjA5MjkgYyAyLjE3NTc0LDAgMy45MjcxNCwtMS43NTE0IDMuOTI3MTQsLTMuOTI3MTQgdiAtMjEuMzgyIGggMjguMTc0NjUgdiAyMS4zODIgYyAwLDIuMTc1NzQgMS43NTEzOSwzLjkyNzE0IDMuOTI3MTMsMy45MjcxNCBoIDIxLjYwOTI5IGMgMi4xNzU3NCwwIDMuOTI3MTMsLTEuNzUxNCAzLjkyNzEzLC0zLjkyNzE0IHYgLTIxLjM4MiBoIDI4LjE3NDY2IHYgMjEuMzgyIGMgMCwyLjE3NTc0IDEuNzUxMzksMy45MjcxNCAzLjkyNzEzLDMuOTI3MTQgaCAyMS42MDkyOCBjIDIuMTc1NzUsMCAzLjkyODU4LC0xLjc1MTQgMy45Mjg1OCwtMy45MjcxNCB2IC0yMS4zODIgaCAyOC4xNzMyNSB2IDIxLjM4MiBjIDAsMi4xNzU3NCAxLjc1MTM2LDMuOTI3MTQgMy45MjcxMSwzLjkyNzE0IGggMjEuNjEwNzMgYyAyLjE3NTc0LDAgMy45MjcxMSwtMS43NTE0IDMuOTI3MTEsLTMuOTI3MTQgdiAtMjEuMzgyIGggMjguMTczMjUgdiAyMS4zODIgYyAwLDIuMTc1NzQgMS43NTI4MywzLjkyNzE0IDMuOTI4NTgsMy45MjcxNCBoIDIxLjYwOTI2IGMgMi4xNzU3NCwwIDMuOTI3MTEsLTEuNzUxNCAzLjkyNzExLC0zLjkyNzE0IHYgLTI3LjM0NDY0IGMgMTcuOTg0OTMsLTkuMTEwNDcgMzAuMjY2MjgsLTI3LjczOTA1IDMwLjI2NjI4LC00OS4zNTIzOCBWIDYyLjcxOTc1MyBjIDAsLTMwLjY0NDEzMSAtMjQuNjcwODksLTU1LjMxMzU3NjEgLTU1LjMxNTAxLC01NS4zMTM1NzYxIHogTSA3Mi43NTQ2OTksNDEuNDkzMTA1IEggNDM5LjI0MzgxIGMgMTguMzIyNDksMCAzMy4wNzI3OCwxNC43NTAzOTUgMzMuMDcyNzgsMzMuMDcyNzggViAyMTAuNDYxOSBjIDAsMTguMzIyMzkgLTE0Ljc1MDI5LDMzLjA3Mjc5IC0zMy4wNzI3OCwzMy4wNzI3OCBIIDcyLjc1NDY5OSBjIC0xOC4zMjI0LDAgLTMzLjA3Mjc4LC0xNC43NTAzOSAtMzMuMDcyNzczLC0zMy4wNzI3OCBWIDc0LjU2NTg4NSBjIDAsLTE4LjMyMjM4NSAxNC43NTAzNzMsLTMzLjA3Mjc4IDMzLjA3Mjc3MywtMzMuMDcyNzggeiBtIDM4LjI5MDI2MSw1NC4zNDY5MDQgYyAtOS45NzY1LDAgLTE4LjAwNzI3NSw4LjAzMjIwMSAtMTguMDA3Mjc1LDE4LjAwODcwMSB2IDU3LjMzMzI0IGMgMCw5Ljk3NjUgOC4wMzA3NzUsMTguMDA3MjggMTguMDA3Mjc1LDE4LjAwNzI4IGggNTIuOTg0NjMgYyA5Ljk3NjQ4LDAgMTguMDA3MjYsLTguMDMwNzggMTguMDA3MjYsLTE4LjAwNzI4IHYgLTU3LjMzMzI0IGMgMCwtOS45NzY1IC04LjAzMDc4LC0xOC4wMDg3MDEgLTE4LjAwNzI2LC0xOC4wMDg3MDEgeiBtIDExOC40NjQxNCwwIGMgLTkuOTc2NDgsMCAtMTguMDA3MjYsOC4wMzIyMDEgLTE4LjAwNzI2LDE4LjAwODcwMSB2IDU3LjMzMzI0IGMgMCw5Ljk3NjUgOC4wMzA3OCwxOC4wMDcyOCAxOC4wMDcyNiwxOC4wMDcyOCBoIDUyLjk4NDY0IGMgOS45NzY0OSwwIDE4LjAwNzI3LC04LjAzMDc4IDE4LjAwNzI3LC0xOC4wMDcyOCB2IC01Ny4zMzMyNCBjIC0xZS01LC05Ljk3NjUgLTguMDMwNzgsLTE4LjAwODcwMSAtMTguMDA3MjcsLTE4LjAwODcwMSB6IG0gMTE4LjQ2NDIsMCBjIC05Ljk3NjQ5LDAgLTE4LjAwNzMsOC4wMzIyMDEgLTE4LjAwNzMsMTguMDA4NzAxIHYgNTcuMzMzMjQgYyAwLDkuOTc2NSA4LjAzMDgxLDE4LjAwNzI4IDE4LjAwNzMsMTguMDA3MjggaCA1Mi45ODQ1OSBjIDkuOTc2NDksMCAxOC4wMDcyNSwtOC4wMzA3OCAxOC4wMDcyNSwtMTguMDA3MjggdiAtNTcuMzMzMjQgYyAwLC05Ljk3NjUgLTguMDMwNzYsLTE4LjAwODcwMSAtMTguMDA3MjUsLTE4LjAwODcwMSB6IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojMjIyZDQyO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDo3LjM2NTE3MDQ4O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+Cjwvc3ZnPgo=);
-}
-
-.rudder-info,
-.status-info,
-.accounts-info{
- margin-bottom: 15px;
-}
-.rudder-info > h3,
-.status-info > h3,
-.accounts-info > h3{
- color: #0419228a;
- padding: 5px 0 !important;
- display: block;
- margin-bottom: 10px;
- line-height: inherit;
- border: 0;
- border-bottom: 2px solid #d6deef;
- font-size: 18px;
-}
-.rudder-info > div,
-.status-info > div,
-.accounts-info > div,
-.security-info > div{
- margin-bottom: 8px;
-}
-.rudder-info > div label,
-.status-info > div label,
-.accounts-info > div label{
- font-size: 14px;
- display: inline-block;
- margin-bottom: 0;
-}
-.rudder-info .rudder-label {
- font-size: 12px;
- margin-bottom: -4px;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- padding: 0 18px !important;
- height: 20px;
-}
-
-.details .ui-tabs-nav.list-tabs-invetory {
- margin-right: 15px;
-}
-
-/* OS ICONS */
-.id-card .card-img{
- background-image: url(../../images/os/unknown-logo.svg);
-}
-.id-card .card-img.linux{
- background-image: url(../../images/os/linux-logo.svg);
-}
-.id-card .card-img.debian{
- background-image: url(../../images/os/debian-logo.svg);
-}
-.id-card .card-img.kali{
- background-image: url(../../images/os/kali-logo.svg);
-}
-.id-card .card-img.ubuntu{
- background-image: url(../../images/os/ubuntu-logo.svg);
-}
-.id-card .card-img.redhat{
- background-image: url(../../images/os/redhat-logo.svg);
-}
-.id-card .card-img.centos{
- background-image: url(../../images/os/centos-logo.svg);
-}
-.id-card .card-img.fedora{
- background-image: url(../../images/os/fedora-logo.svg);
-}
-.id-card .card-img.suse{
- background-image: url(../../images/os/suse-logo.svg);
-}
-.id-card .card-img.android{
- background-image: url(../../images/os/android-logo.svg);
-}
-.id-card .card-img.oracle{
- background-image: url(../../images/os/oracle-logo.svg);
-}
-.id-card .card-img.scientific{
- background-image: url(../../images/os/scientific-logo.svg);
-}
-.id-card .card-img.slackware{
- background-image: url(../../images/os/slackware-logo.svg);
-}
-.id-card .card-img.mint{
- background-image: url(../../images/os/mint-logo.svg);
-}
-.id-card .card-img.rockylinux{
- background-image: url(../../images/os/rocky-logo.svg);
-}
-.id-card .card-img.almalinux{
- background-image: url(../../images/os/alma-logo.svg);
-}
-.id-card .card-img.raspbian{
- background-image: url(../../images/os/raspbian-logo.svg);
-}
-.id-card .card-img.windowsxp,
-.id-card .card-img.windowsvista,
-.id-card .card-img.windowsseven,
-.id-card .card-img.windows10,
-.id-card .card-img.windows2000,
-.id-card .card-img.windows2003,
-.id-card .card-img.windows2008,
-.id-card .card-img.windows2008r2{
- background-image: url(../../images/os/windows-logo.svg);
-}
-.id-card .card-img.windows,
-.id-card .card-img.windows2012,
-.id-card .card-img.windows2012r2,
-.id-card .card-img.windows2016,
-.id-card .card-img.windows2016r2,
-.id-card .card-img.windows2019{
- background-image: url(../../images/os/windows-2012-logo.svg);
-}
-.id-card .card-img.aix{
- background-image: url(../../images/os/aix-logo.svg);
-}
-.id-card .card-img.solaris{
- background-image: url(../../images/os/solaris-logo.svg);
-}
-.id-card .card-img.bsd{
- background-image: url(../../images/os/bsd-logo.svg);
-}
-.id-card .card-img.freebsd{
- background-image: url(../../images/os/freebsd-logo.svg);
-}
-.callout-fade.callout-info p .glyphicon{
- margin-right: 5px;
- color: #1b809e;
-}
-.btn.toggle-security-info{
- min-width: 155px;
- margin-top: 8px;
- transition-duration: .2;
-}
-.btn.toggle-security-info:before{
- content: "Show ";
-}
-.btn.toggle-security-info.opened:before{
- content: "Hide ";
-}
-.btn.toggle-security-info.opened{
- border-bottom-left-radius: 0;
- border-bottom-right-radius: 0;
- margin-bottom: -1px;
-}
-.security-info{
- width: 100%;
- overflow: auto;
-}
-pre.display-keys{
- padding: 12px;
- border-top-left-radius: 0;
-}
-pre.display-keys > label:first-child{
- margin-top:0;
-}
-pre.display-keys > label{
- display:block;
- margin-top:12px;
- font-weight:bold;
-}
-.node-compliance-bar .progress{
- margin : 0px;
- border-radius : 3px;
- height : 25px;
-}
-.node-compliance-bar .progress-bar span{
- vertical-align : middle;
- horizontal-align: middle;
-}
-
-#filterLogs {
- margin-bottom: 10px;
-}
-
-/* NODE ERROR */
-.info-card{
- border-radius: 4px;
- overflow: hidden;
- border: 1px solid #e1e3e6;
- border-left: 4px solid #337ab7;
- max-width: 780px;
- padding: 10px;
- margin-bottom: 20px;
- font-size: 14px;
-}
-.info-card .card-info h4{
- color: #337ab7;
- margin-top: 0;
- padding-left: 30px;
- position: relative;
-}
-.info-card .card-info h4 .info-icon{
- font-size: 25px;
- position: absolute;
- top: -2px;
- left: 0;
-}
-.info-card.critical{
- border-left-color: #C80004;
- background-color: #ff040908;
-}
-.info-card.critical .card-info h4{
- color: #C80004;
-}
-/* PROPERIES TAB */
-#inventoryVariables .dataTable .btn-clipboard{
- margin-left: 4px;
- visibility: hidden;
-}
-#inventoryVariables .dataTable tr.head th.sorting{
- cursor: default !important;
- color: #041922;
-}
-#inventoryVariables .dataTable tr:hover .btn-clipboard{
- visibility: visible;
-}
-#nodeProperties > div > h3.page-title:first-child{
- margin-top: 0;
-}
-.variable-syntax:before,
-.variable-syntax:after{
- content:"`";
-}
-#nodeProp .tab-table-content{
- margin-top: 20px;
-}
-#nodeProp .table-header, #nodeProp .table-container {
- width: 100%;
- margin: 0;
-}
-#nodeProp .table-header,
-#nodeProp .table-container > .dataTable{
- border-left: 1px solid #d6deef;
- border-right: 1px solid #d6deef;
-}
-/* SETTINGS TAB */
-#nodeState > h3.page-title:first-child,
-#logsDetails h3.page-title{
- margin-top: 0;
- padding-top: 0 !important;
-}
-.node-submit + .currentNodeState {
- display: none;
-}
-.currentNodeState {
- font-size: 14px;
-}
-#reporting-mode-title{
- display: none;
-}
\ No newline at end of file
diff --git a/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-node.scss b/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-node.scss
new file mode 100644
index 00000000000..e78e00ccfb0
--- /dev/null
+++ b/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-node.scss
@@ -0,0 +1,471 @@
+/*
+*************************************************************************************
+* Copyright 2023 Normation SAS
+*************************************************************************************
+*
+* This file is part of Rudder.
+*
+* Rudder is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* In accordance with the terms of section 7 (7. Additional Terms.) of
+* the GNU General Public License version 3, the copyright holders add
+* the following Additional permissions:
+* Notwithstanding to the terms of section 5 (5. Conveying Modified Source
+* Versions) and 6 (6. Conveying Non-Source Forms.) of the GNU General
+* Public License version 3, when you create a Related Module, this
+* Related Module is not considered as a part of the work and may be
+* distributed under the license agreement of your choice.
+* A "Related Module" means a set of sources files including their
+* documentation that, without modification of the Source Code, enables
+* supplementary functions or services in addition to those offered by
+* the Software.
+*
+* Rudder is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with Rudder. If not, see
.
+
+*
+*************************************************************************************
+*/
+
+// Variables
+$node-state-size: 14px;
+$node-logo-size: 50px;
+
+// Override Rudder template
+.rudder-template {
+ .header-title{
+ justify-content: start;
+ align-items: center;
+ }
+ .one-col .main-header{
+ border-bottom: none !important;
+ }
+ .header-buttons {
+ margin-left: auto;
+ }
+}
+
+#queryParameters{
+ padding: 0 15px;
+}
+#submitSearch{
+ margin-bottom: 15px;
+}
+.rudder_col>.portlet{
+ padding: 0 !important;
+}
+.portlet-header.ui-widget-header.page-title{
+ margin: 0 !important;
+ border-bottom: none !important;
+ padding: 15px 15px 10px;
+ color: #041922 !important;
+ font-size: 24px !important;
+}
+
+.page-title-description{
+ padding: 0 15px;
+ margin-bottom: 8px;
+ font-size: 1.2em;
+ color: #738195;
+}
+
+.rudder-ui-tabs ~ .ui-tabs-panel{
+ padding: 0 15px 15px 15px;
+ float: left;
+ width: 100%;
+}
+#node_summary{
+ display: flex;
+ padding: 0 !important;
+}
+
+.rudder-ui-tabs {
+ border-bottom: 2px solid #d6deef;
+ margin: 0 0 15px 0;
+ position: relative;
+ background-color: #fff;
+ z-index: 10;
+}
+.rudder-ui-tabs > .ui-tabs-tab{
+ display: inline-block;
+ padding: 6px 0px;
+ outline: none !important;
+ position: relative;
+}
+
+#nodeDetails {
+ flex: 70;
+ padding: 0 15px 0 0;
+}
+.details .tabs > .ui-tabs-panel {
+ padding: 10px 15px;
+}
+
+#nodeGroups {
+ flex: 30;
+ border-left: 2px solid #d6deef;
+ margin-top: -15px;
+}
+.jstree-anchor > i.jstree-icon.fa.fa-folder,
+.jstree-anchor > .treeGroupCategoryName {
+ position: relative;
+ top: 2px;
+}
+#nodeGroups > h3 {
+ color: #041922;
+ padding: 15px 15px 10px !important;
+ margin: 0;
+ font-size: 20px;
+ background-color: #f7f7f7;
+}
+
+.node-state{
+ display: inline-block;
+ width: $node-state-size;
+ height: $node-state-size;
+ border-radius: 50%;
+ background-color: #4eb934;
+
+ &.ignored:after{
+ background-color: #a4aebf;
+ }
+ &.empty-policies:after{
+ background-color: #7591c599;
+ }
+ &.initializing:after{
+ color: #08a3ef;
+ content: "\f1ce";
+ font: normal normal normal 14px/1 inherit;
+ font-family: "Font Awesome 5 Free";
+ font-weight: 900;
+ background-color: transparent;
+ font-weight: bold;
+ font-size: 1.1em;
+ animation: fa-spin 2s infinite linear;
+ height: 14px;
+ width: auto;
+ }
+ &.preparing-eol:after{
+ background-color: #EF9600;
+ }
+}
+.machine-os-info {
+ font-size: .8rem;
+ color: #72829D;
+
+ .icon-info{
+ font-size : 1rem;
+ }
+}
+.machine-info{
+ position: relative;
+ padding-left: 24px;
+ margin-right: 4px;
+
+ &:after{
+ content: "";
+ position: absolute;
+ top: calc(50% - 4px);
+ left: 6px;
+ width: 8px;
+ height: 8px;
+ background-color: #72829D;
+ border-radius: 50%;
+ }
+ &:before{
+ content: "";
+ display: inline-block;
+ position: absolute;
+ width: 40px;
+ height: 28px;
+ top: calc(50% - 14px);
+ left: 20px;
+ background-size: contain;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+ &.ram{
+ padding-left: 60px;
+ &:before{
+ background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgaWQ9InN2ZzEwIgogICB2ZXJzaW9uPSIxLjEiCiAgIHZpZXdCb3g9IjAgLTEwMyA1MTIgNTEyIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6Y2M9Imh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL25zIyIKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICA8bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGExNiI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgPC9jYzpXb3JrPgogICAgPC9yZGY6UkRGPgogIDwvbWV0YWRhdGE+CiAgPGRlZnMKICAgICBpZD0iZGVmczE0IiAvPgogIDxwYXRoCiAgICAgaWQ9InJlY3Q4NDUtNSIKICAgICBkPSJtIDU5LjkxNiw3LjQwNjE3NjkgYyAtMzAuNjQ0MTE2LDAgLTU1LjMxMzU3NTcsMjQuNjY5NDQ1MSAtNTUuMzEzNTc1Nyw1NS4zMTM1NzYxIFYgMjIyLjMwODAzIGMgMCwyNS4xNzcyOCAxNi42NTgwMDM3LDQ2LjMxMDQ1IDM5LjU5NDk3NzcsNTMuMDUzNjggdiAyMy42NDMzNCBjIDAsMi4xNzU3NCAxLjc1MTQsMy45MjcxNCAzLjkyNzEzOCwzLjkyNzE0IGggMjEuNjA5MjkgYyAyLjE3NTczOCwwIDMuOTI3MTMyLC0xLjc1MTQgMy45MjcxMzIsLTMuOTI3MTQgdiAtMjEuMzgyIGggMjguMTc0NjU4IHYgMjEuMzgyIGMgMCwyLjE3NTc0IDEuNzUxMzksMy45MjcxNCAzLjkyNzEyLDMuOTI3MTQgaCAyMS42MDkzIGMgMi4xNzU3NCwwIDMuOTI4NTcsLTEuNzUxNCAzLjkyODU3LC0zLjkyNzE0IHYgLTIxLjM4MiBoIDI4LjE3MzIyIHYgMjEuMzgyIGMgMCwyLjE3NTc0IDEuNzUxMzksMy45MjcxNCAzLjkyNzEzLDMuOTI3MTQgaCAyMS42MTA3MyBjIDIuMTc1NzQsMCAzLjkyNzEzLC0xLjc1MTQgMy45MjcxMywtMy45MjcxNCB2IC0yMS4zODIgaCAyOC4xNzMyMSB2IDIxLjM4MiBjIDAsMi4xNzU3NCAxLjc1Mjg0LDMuOTI3MTQgMy45Mjg1NywzLjkyNzE0IGggMjEuNjA5MjkgYyAyLjE3NTc0LDAgMy45MjcxNCwtMS43NTE0IDMuOTI3MTQsLTMuOTI3MTQgdiAtMjEuMzgyIGggMjguMTc0NjUgdiAyMS4zODIgYyAwLDIuMTc1NzQgMS43NTEzOSwzLjkyNzE0IDMuOTI3MTMsMy45MjcxNCBoIDIxLjYwOTI5IGMgMi4xNzU3NCwwIDMuOTI3MTMsLTEuNzUxNCAzLjkyNzEzLC0zLjkyNzE0IHYgLTIxLjM4MiBoIDI4LjE3NDY2IHYgMjEuMzgyIGMgMCwyLjE3NTc0IDEuNzUxMzksMy45MjcxNCAzLjkyNzEzLDMuOTI3MTQgaCAyMS42MDkyOCBjIDIuMTc1NzUsMCAzLjkyODU4LC0xLjc1MTQgMy45Mjg1OCwtMy45MjcxNCB2IC0yMS4zODIgaCAyOC4xNzMyNSB2IDIxLjM4MiBjIDAsMi4xNzU3NCAxLjc1MTM2LDMuOTI3MTQgMy45MjcxMSwzLjkyNzE0IGggMjEuNjEwNzMgYyAyLjE3NTc0LDAgMy45MjcxMSwtMS43NTE0IDMuOTI3MTEsLTMuOTI3MTQgdiAtMjEuMzgyIGggMjguMTczMjUgdiAyMS4zODIgYyAwLDIuMTc1NzQgMS43NTI4MywzLjkyNzE0IDMuOTI4NTgsMy45MjcxNCBoIDIxLjYwOTI2IGMgMi4xNzU3NCwwIDMuOTI3MTEsLTEuNzUxNCAzLjkyNzExLC0zLjkyNzE0IHYgLTI3LjM0NDY0IGMgMTcuOTg0OTMsLTkuMTEwNDcgMzAuMjY2MjgsLTI3LjczOTA1IDMwLjI2NjI4LC00OS4zNTIzOCBWIDYyLjcxOTc1MyBjIDAsLTMwLjY0NDEzMSAtMjQuNjcwODksLTU1LjMxMzU3NjEgLTU1LjMxNTAxLC01NS4zMTM1NzYxIHogTSA3Mi43NTQ2OTksNDEuNDkzMTA1IEggNDM5LjI0MzgxIGMgMTguMzIyNDksMCAzMy4wNzI3OCwxNC43NTAzOTUgMzMuMDcyNzgsMzMuMDcyNzggViAyMTAuNDYxOSBjIDAsMTguMzIyMzkgLTE0Ljc1MDI5LDMzLjA3Mjc5IC0zMy4wNzI3OCwzMy4wNzI3OCBIIDcyLjc1NDY5OSBjIC0xOC4zMjI0LDAgLTMzLjA3Mjc4LC0xNC43NTAzOSAtMzMuMDcyNzczLC0zMy4wNzI3OCBWIDc0LjU2NTg4NSBjIDAsLTE4LjMyMjM4NSAxNC43NTAzNzMsLTMzLjA3Mjc4IDMzLjA3Mjc3MywtMzMuMDcyNzggeiBtIDM4LjI5MDI2MSw1NC4zNDY5MDQgYyAtOS45NzY1LDAgLTE4LjAwNzI3NSw4LjAzMjIwMSAtMTguMDA3Mjc1LDE4LjAwODcwMSB2IDU3LjMzMzI0IGMgMCw5Ljk3NjUgOC4wMzA3NzUsMTguMDA3MjggMTguMDA3Mjc1LDE4LjAwNzI4IGggNTIuOTg0NjMgYyA5Ljk3NjQ4LDAgMTguMDA3MjYsLTguMDMwNzggMTguMDA3MjYsLTE4LjAwNzI4IHYgLTU3LjMzMzI0IGMgMCwtOS45NzY1IC04LjAzMDc4LC0xOC4wMDg3MDEgLTE4LjAwNzI2LC0xOC4wMDg3MDEgeiBtIDExOC40NjQxNCwwIGMgLTkuOTc2NDgsMCAtMTguMDA3MjYsOC4wMzIyMDEgLTE4LjAwNzI2LDE4LjAwODcwMSB2IDU3LjMzMzI0IGMgMCw5Ljk3NjUgOC4wMzA3OCwxOC4wMDcyOCAxOC4wMDcyNiwxOC4wMDcyOCBoIDUyLjk4NDY0IGMgOS45NzY0OSwwIDE4LjAwNzI3LC04LjAzMDc4IDE4LjAwNzI3LC0xOC4wMDcyOCB2IC01Ny4zMzMyNCBjIC0xZS01LC05Ljk3NjUgLTguMDMwNzgsLTE4LjAwODcwMSAtMTguMDA3MjcsLTE4LjAwODcwMSB6IG0gMTE4LjQ2NDIsMCBjIC05Ljk3NjQ5LDAgLTE4LjAwNzMsOC4wMzIyMDEgLTE4LjAwNzMsMTguMDA4NzAxIHYgNTcuMzMzMjQgYyAwLDkuOTc2NSA4LjAzMDgxLDE4LjAwNzI4IDE4LjAwNzMsMTguMDA3MjggaCA1Mi45ODQ1OSBjIDkuOTc2NDksMCAxOC4wMDcyNSwtOC4wMzA3OCAxOC4wMDcyNSwtMTguMDA3MjggdiAtNTcuMzMzMjQgYyAwLC05Ljk3NjUgLTguMDMwNzYsLTE4LjAwODcwMSAtMTguMDA3MjUsLTE4LjAwODcwMSB6IgogICAgIHN0eWxlPSJvcGFjaXR5OjE7ZmlsbDojNzI4MjlkO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDo3LjM2NTE3MDQ4O3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lO3N0cm9rZS1vcGFjaXR5OjEiIC8+Cjwvc3ZnPgo=);
+ }
+ }
+}
+
+.rudder-info,
+.status-info,
+.accounts-info{
+ margin-bottom: 15px;
+}
+.rudder-info > h3,
+.status-info > h3,
+.accounts-info > h3{
+ color: #0419228a;
+ padding: 5px 0 !important;
+ display: block;
+ margin-bottom: 10px;
+ line-height: inherit;
+ border: 0;
+ border-bottom: 2px solid #d6deef;
+ font-size: 18px;
+}
+.rudder-info > div,
+.status-info > div,
+.accounts-info > div,
+.security-info > div{
+ margin-bottom: 8px;
+}
+.rudder-info > div label,
+.status-info > div label,
+.accounts-info > div label{
+ font-size: 14px;
+ display: inline-block;
+ margin-bottom: 0;
+}
+.rudder-info .rudder-label {
+ font-size: 12px;
+ margin-bottom: -4px;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0 18px !important;
+ height: 20px;
+}
+
+.details .ui-tabs-nav.list-tabs-inventory {
+ margin-right: 15px;
+}
+
+/* OS ICONS */
+.os-logo {
+ width: $node-logo-size;
+ height: $node-logo-size;
+ background-size: contain;
+ background-repeat: no-repeat;
+ background-position: center;
+ opacity: 0.5;
+ margin-right: 10px;
+ cursor: help;
+ background-image: url(../../images/os/unknown-logo.svg);
+
+ @media (max-width: 992px){
+ & {
+ display: none !important
+ }
+ }
+
+ &.linux{
+ background-image: url(../../images/os/linux-logo.svg);
+ }
+ &.debian{
+ background-image: url(../../images/os/debian-logo.svg);
+ }
+ &.kali{
+ background-image: url(../../images/os/kali-logo.svg);
+ }
+ &.ubuntu{
+ background-image: url(../../images/os/ubuntu-logo.svg);
+ }
+ &.redhat{
+ background-image: url(../../images/os/redhat-logo.svg);
+ }
+ &.centos{
+ background-image: url(../../images/os/centos-logo.svg);
+ }
+ &.fedora{
+ background-image: url(../../images/os/fedora-logo.svg);
+ }
+ &.suse{
+ background-image: url(../../images/os/suse-logo.svg);
+ }
+ &.android{
+ background-image: url(../../images/os/android-logo.svg);
+ }
+ &.oracle{
+ background-image: url(../../images/os/oracle-logo.svg);
+ }
+ &.scientific{
+ background-image: url(../../images/os/scientific-logo.svg);
+ }
+ &.slackware{
+ background-image: url(../../images/os/slackware-logo.svg);
+ }
+ &.mint{
+ background-image: url(../../images/os/mint-logo.svg);
+ }
+ &.rockylinux{
+ background-image: url(../../images/os/rocky-logo.svg);
+ }
+ &.almalinux{
+ background-image: url(../../images/os/alma-logo.svg);
+ }
+ &.raspbian{
+ background-image: url(../../images/os/raspbian-logo.svg);
+ }
+ &.windowsxp,
+ &.windowsvista,
+ &.windowsseven,
+ &.windows10,
+ &.windows2000,
+ &.windows2003,
+ &.windows2008,
+ &.windows2008r2{
+ background-image: url(../../images/os/windows-logo.svg);
+ }
+ &.windows,
+ &.windows2012,
+ &.windows2012r2,
+ &.windows2016,
+ &.windows2016r2,
+ &.windows2019{
+ background-image: url(../../images/os/windows-2012-logo.svg);
+ }
+ &.aix{
+ background-image: url(../../images/os/aix-logo.svg);
+ }
+ &.solaris{
+ background-image: url(../../images/os/solaris-logo.svg);
+ }
+ &.bsd{
+ background-image: url(../../images/os/bsd-logo.svg);
+ }
+ &.freebsd{
+ background-image: url(../../images/os/freebsd-logo.svg);
+ }
+}
+
+
+.callout-fade.callout-info p .glyphicon{
+ margin-right: 5px;
+ color: #1b809e;
+}
+.btn.toggle-security-info{
+ min-width: 155px;
+ margin-top: 8px;
+ transition-duration: .2;
+}
+.btn.toggle-security-info:before{
+ content: "Show ";
+}
+.btn.toggle-security-info.opened:before{
+ content: "Hide ";
+}
+.btn.toggle-security-info.opened{
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+ margin-bottom: -1px;
+}
+.security-info{
+ width: 100%;
+ overflow: auto;
+}
+pre.display-keys{
+ padding: 12px;
+ border-top-left-radius: 0;
+}
+pre.display-keys > label:first-child{
+ margin-top:0;
+}
+pre.display-keys > label{
+ display:block;
+ margin-top:12px;
+ font-weight:bold;
+}
+.node-compliance-bar .progress{
+ margin : 0px;
+ border-radius : 3px;
+ height : 25px;
+}
+.node-compliance-bar .progress-bar span{
+ vertical-align : middle;
+ horizontal-align: middle;
+}
+
+#filterLogs {
+ margin-bottom: 10px;
+}
+
+/* NODE ERROR */
+.info-card{
+ border-radius: 4px;
+ overflow: hidden;
+ border: 1px solid #e1e3e6;
+ border-left: 4px solid #337ab7;
+ max-width: 780px;
+ padding: 10px;
+ margin-bottom: 20px;
+ font-size: 14px;
+}
+.info-card .card-info h4{
+ color: #337ab7;
+ margin-top: 0;
+ padding-left: 30px;
+ position: relative;
+}
+.info-card .card-info h4 .info-icon{
+ font-size: 25px;
+ position: absolute;
+ top: -2px;
+ left: 0;
+}
+.info-card.critical{
+ border-left-color: #C80004;
+ background-color: #ff040908;
+}
+.info-card.critical .card-info h4{
+ color: #C80004;
+}
+/* PROPERIES TAB */
+#inventoryVariables .dataTable .btn-clipboard{
+ margin-left: 4px;
+ visibility: hidden;
+}
+#inventoryVariables .dataTable tr.head th.sorting{
+ cursor: default !important;
+ color: #041922;
+}
+#inventoryVariables .dataTable tr:hover .btn-clipboard{
+ visibility: visible;
+}
+#nodeProperties > div > h3.page-title:first-child{
+ margin-top: 0;
+}
+.variable-syntax:before,
+.variable-syntax:after{
+ content:"`";
+}
+#nodeProp .tab-table-content{
+ margin-top: 20px;
+}
+#nodeProp .table-header, #nodeProp .table-container {
+ width: 100%;
+ margin: 0;
+}
+#nodeProp .table-header,
+#nodeProp .table-container > .dataTable{
+ border-left: 1px solid #d6deef;
+ border-right: 1px solid #d6deef;
+}
+/* SETTINGS TAB */
+#nodeState > h3.page-title:first-child,
+#logsDetails h3.page-title{
+ margin-top: 0;
+ padding-top: 0 !important;
+}
+.node-submit + .currentNodeState {
+ display: none;
+}
+.currentNodeState {
+ font-size: 14px;
+}
+#reporting-mode-title{
+ display: none;
+}
\ No newline at end of file
diff --git a/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-template.css b/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-template.css
index 7de70fa20b7..c9b3b970a7b 100644
--- a/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-template.css
+++ b/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder-template.css
@@ -35,6 +35,10 @@
*/
/* === RESET === */
+ul {
+ list-style-type: none;
+}
+
.content-wrapper > .rudder_col{
padding: 0;
}
@@ -166,6 +170,34 @@
.rudder-template .header-title h1.item-disabled {
color: #828894;
}
+.rudder-template .header-subtitle{
+ font-size: .8rem;
+ font-weight: normal;
+ color: #F8F9FC;
+ margin-top: 4px;
+
+ .clipboard{
+ color: #72829d;
+ transition-duration: .2s;
+ padding: 4px;
+ cursor: pointer;
+ border-radius: 4px;
+ .ion-clipboard{
+ opacity: 0;
+ transition-duration: .2s;
+ font-size: 1rem;
+ margin-left: 4px;
+ }
+
+ &:hover{
+ background-color: #F8F9FC;
+
+ .ion-clipboard{
+ opacity: 1;
+ }
+ }
+ }
+}
.rudder-template .header-buttons {
white-space: nowrap;
}
@@ -1216,7 +1248,8 @@
}
/* === BTN GOTO === */
-.rudder-template .btn-goto{
+.rudder-template .btn-goto,
+.rudder-template .btn-clipboard{
padding: 3px 6px;
border-radius: 4px;
margin-left: 4px;
diff --git a/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder.css b/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder.css
index 5c2e668bc87..f087be7ee9c 100644
--- a/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder.css
+++ b/webapp/sources/rudder/rudder-web/src/main/style/rudder/rudder.css
@@ -631,15 +631,6 @@ table .innerDetails li{
height: 25px;
}
-.popupButton {
- padding: 5px;
- float: right;
-}
-
-.popupButton span {
- float: none;
-}
-
/*****************************************
* Popup creation groupe/category
******************************************/
diff --git a/webapp/sources/rudder/rudder-web/src/main/webapp/secure/nodeManager/node.html b/webapp/sources/rudder/rudder-web/src/main/webapp/secure/nodeManager/node.html
index 7887553ec87..8faf7415262 100644
--- a/webapp/sources/rudder/rudder-web/src/main/webapp/secure/nodeManager/node.html
+++ b/webapp/sources/rudder/rudder-web/src/main/webapp/secure/nodeManager/node.html
@@ -16,13 +16,6 @@
-
-
-
diff --git a/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/Popup/accept_new_server.html b/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/Popup/accept_new_server.html
index 4b97c9c394b..60ae96603ed 100644
--- a/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/Popup/accept_new_server.html
+++ b/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/Popup/accept_new_server.html
@@ -14,9 +14,9 @@
Accept nodes in Rudder
-
+
Please confirm that you wish to accept the following nodes in Rudder
-
+
@@ -40,10 +40,8 @@
diff --git a/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/Popup/refuse_new_server.html b/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/Popup/refuse_new_server.html
index 36570eb3514..c49759e98f5 100644
--- a/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/Popup/refuse_new_server.html
+++ b/webapp/sources/rudder/rudder-web/src/main/webapp/templates-hidden/Popup/refuse_new_server.html
@@ -14,9 +14,9 @@ Refuse nodes in Rudder
-
+
Please confirm that you wish to refuse the following nodes in Rudder
-
+
@@ -45,7 +45,7 @@
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 5e73e95d35c..91cc947b67c 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
@@ -62,6 +62,7 @@
This part is the detail of a node
+
+
+
+
+
+
+
+
+
+
+ Are you sure you want to delete this node?
+
+
+
+
+ If you choose to remove this node from Rudder, it won't be managed anymore,
+ and all information about it will be removed from the application.
+
+
+
+
+
+
+