diff --git a/app/docker/components/host-view-panels/node-labels-table/node-labels-table-controller.js b/app/docker/components/host-view-panels/node-labels-table/node-labels-table-controller.js
index e80dc3d0d..ec00f1fa2 100644
--- a/app/docker/components/host-view-panels/node-labels-table/node-labels-table-controller.js
+++ b/app/docker/components/host-view-panels/node-labels-table/node-labels-table-controller.js
@@ -3,12 +3,14 @@ angular.module('portainer.docker').controller('NodeLabelsTableController', [
var ctrl = this;
ctrl.removeLabel = removeLabel;
ctrl.updateLabel = updateLabel;
+ ctrl.save = save;
+ ctrl.hasChanges = false;
+ ctrl.cancelChanges = cancelChanges;
function removeLabel(index) {
- var removedElement = ctrl.labels.splice(index, 1);
- if (removedElement !== null) {
- console.log(ctrl.labels);
- ctrl.onChangedLabels({labels: ctrl.labels});
+ var label = ctrl.labels.splice(index, 1);
+ if (label !== null) {
+ ctrl.hasChanges = true;
}
}
@@ -17,8 +19,26 @@ angular.module('portainer.docker').controller('NodeLabelsTableController', [
label.value !== label.originalValue ||
label.key !== label.originalKey
) {
- ctrl.onChangedLabels({labels: ctrl.labels});
+ ctrl.hasChanges = true;
}
}
+
+ function save() {
+ ctrl.onChangedLabels({ labels: ctrl.labels });
+ }
+
+ function cancelChanges() {
+ ctrl.labels = ctrl.labels
+ .filter(function(label) {
+ return label.originalValue || label.originalKey;
+ })
+ .map(function(label) {
+ return Object.assign(label, {
+ value: label.originalValue,
+ key: label.originalKey
+ });
+ });
+ ctrl.hasChanges = false;
+ }
}
]);
diff --git a/app/docker/components/host-view-panels/node-labels-table/node-labels-table.html b/app/docker/components/host-view-panels/node-labels-table/node-labels-table.html
index e8076f265..aceaff848 100644
--- a/app/docker/components/host-view-panels/node-labels-table/node-labels-table.html
+++ b/app/docker/components/host-view-panels/node-labels-table/node-labels-table.html
@@ -36,14 +36,14 @@
diff --git a/app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel-controller.js b/app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel-controller.js
index 0d2eda943..12365ceac 100644
--- a/app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel-controller.js
+++ b/app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel-controller.js
@@ -2,18 +2,40 @@ angular
.module('portainer.docker')
.controller('SwarmNodeDetailsPanelController', [
function SwarmNodeDetailsPanelController() {
- this.$onInit = initView;
this.state = {
managerAddress: ''
};
-
+ this.$onInit = initView;
+ this.$onChanges = $onChanges;
+ this.addLabel = addLabel;
+ this.updateNodeLabels = updateNodeLabels;
var managerRole = 'manager';
function initView() {
+
+ }
+
+ function $onChanges() {
+ if (!this.details) {
+ return;
+ }
if (this.details.role === managerRole) {
this.state.managerAddress =
'(Manager address: ' + this.details.managerAddress + ')';
}
}
+
+ function addLabel() {
+ this.details.nodeLabels.push({
+ key: '',
+ value: '',
+ originalValue: '',
+ originalKey: ''
+ });
+ }
+
+ function updateNodeLabels(labels) {
+ this.onChangedLabels({labels: labels});
+ }
}
]);
diff --git a/app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel.html b/app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel.html
index 3dd61877a..830ece9f5 100644
--- a/app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel.html
+++ b/app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel.html
@@ -26,8 +26,19 @@
| {{ $ctrl.details.engineLabels | commaSeperated }} |
- Node Labels |
- {{ $ctrl.details.nodeLabels | commaSeperated }} |
+
+
+ Node Labels
+ |
+
+
+ |
diff --git a/app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel.js b/app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel.js
index 36c7dd752..8785f956e 100644
--- a/app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel.js
+++ b/app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel.js
@@ -3,6 +3,7 @@ angular.module('portainer.docker').component('swarmNodeDetailsPanel', {
'app/docker/components/host-view-panels/swarm-node-details-panel/swarm-node-details-panel.html',
controller: 'SwarmNodeDetailsPanelController',
bindings: {
- details: '<'
+ details: '<',
+ onChangedLabels: '&'
}
});
diff --git a/app/docker/views/nodes/node-details/node-details-view-controller.js b/app/docker/views/nodes/node-details/node-details-view-controller.js
index d5a4305cd..eeed1dc3e 100644
--- a/app/docker/views/nodes/node-details/node-details-view-controller.js
+++ b/app/docker/views/nodes/node-details/node-details-view-controller.js
@@ -1,13 +1,26 @@
angular.module('portainer.docker').controller('NodeDetailsViewController', [
'$stateParams',
'NodeService',
- function NodeDetailsViewController($stateParams, NodeService) {
+ 'NodeHelper',
+ 'LabelHelper',
+ 'Notifications',
+ '$state',
+ function NodeDetailsViewController(
+ $stateParams,
+ NodeService,
+ NodeHelper,
+ LabelHelper,
+ Notifications,
+ $state
+ ) {
var ctrl = this;
-
+ var originalNode;
ctrl.$onInit = initView;
+ ctrl.updateLabels = updateLabels;
function initView() {
NodeService.node($stateParams.id).then(function(node) {
+ originalNode = node;
ctrl.hostDetails = buildHostDetails(node);
ctrl.engineDetails = buildEngineDetails(node);
ctrl.nodeDetails = buildNodeDetails(node);
@@ -52,6 +65,35 @@ angular.module('portainer.docker').controller('NodeDetailsViewController', [
};
}
+ function updateLabels(labels) {
+ originalNode.labels = labels;
+ updateNode(originalNode);
+ }
+
+ function updateNode(node) {
+ var config = {
+ Name: node.Name,
+ Availability: node.Availability,
+ Role: node.Role,
+ Labels: LabelHelper.fromKeyValueToLabelHash(node.Labels),
+ Id: node.Id,
+ Version: node.Version
+ };
+
+ NodeService.updateNode(config)
+ .then(onUpdateSuccess)
+ .catch(notifyOnError);
+
+ function onUpdateSuccess() {
+ Notifications.success('Node successfully updated', 'Node updated');
+ $state.go('docker.nodes.node', { id: node.Id }, { reload: true });
+ }
+
+ function notifyOnError(error) {
+ Notifications.error('Failure', error, 'Failed to update node');
+ }
+ }
+
function getPlugins(pluginsList, type) {
return pluginsList
.filter(function(plugin) {