summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--app/access-control/controllers/certificate-controller.html5
-rw-r--r--app/access-control/styles/certificate.scss36
-rw-r--r--app/assets/icons/icon-replace.svg2
-rw-r--r--app/common/directives/certificate-modal-remove.html21
-rw-r--r--app/common/directives/certificate.html12
-rw-r--r--app/common/directives/certificate.js63
-rw-r--r--app/common/services/api-utils.js10
7 files changed, 134 insertions, 15 deletions
diff --git a/app/access-control/controllers/certificate-controller.html b/app/access-control/controllers/certificate-controller.html
index d2db65c..2166676 100644
--- a/app/access-control/controllers/certificate-controller.html
+++ b/app/access-control/controllers/certificate-controller.html
@@ -40,7 +40,7 @@
<!-- TODO: Replace table with resusable table component -->
<div class="section-content certificate__table">
<div class="table__row-header">
- <div class="row column">
+ <div class="row">
<div class="certificate__type-header">
Certificate
</div>
@@ -57,6 +57,9 @@
<div class="certificate__date-header">
Valid until
</div>
+ <div class="certificate__actions-header">
+ Actions
+ </div>
</div>
</div>
<div ng-if="certificates.length < 1" class="empty__logs">
diff --git a/app/access-control/styles/certificate.scss b/app/access-control/styles/certificate.scss
index 2d882f4..cf3ab37 100644
--- a/app/access-control/styles/certificate.scss
+++ b/app/access-control/styles/certificate.scss
@@ -15,7 +15,7 @@
}
.certificate__type-header {
@include mediaQuery(small) {
- width: 20%;
+ width: 18%;
background: transparent;
}
width: 100%;
@@ -26,14 +26,14 @@
display: none;
padding: 0.8em;
@include mediaQuery(small) {
- width: 20%;
+ width: 18%;
display: block;
}
}
.certificate__date-header {
padding: 0.8em;
@include mediaQuery(small) {
- width: 12%;
+ width: 11%;
display: block;
}
display: none;
@@ -46,13 +46,22 @@
}
display: none;
}
+ .certificate__actions-header {
+ padding: 0.8em;
+ @include mediaQuery(small) {
+ width: auto;
+ padding-left: 30px;
+ display: block;
+ }
+ display: none;
+ }
.certificate__type-cell {
width: 100%;
padding: 0.8em 0.8em 0.8em 1.5em;
word-wrap: break-word;
background: $background-02;
@include mediaQuery(small) {
- width: 20%;
+ width: 18%;
background: transparent;
}
}
@@ -60,7 +69,7 @@
padding: 0.8em;
word-wrap: break-word;
@include mediaQuery(small) {
- width: 20%;
+ width: 18%;
}
width: 70%;
}
@@ -69,7 +78,7 @@
padding: 0.8em;
word-wrap: break-word;
@include mediaQuery(small) {
- width: 12%;
+ width: 11%;
}
}
.certificate__status-cell {
@@ -88,12 +97,19 @@
}
.certificate__buttons-cell {
@include mediaQuery(small) {
- width: 10%;
- padding-top: 0.5em;
+ padding: 0.2em 0 0 2em;
+ .btn {
+ padding-left: 40px;
+ padding-right: 5px;
+ }
}
- width: 100%;
+ display: block;
text-align: right;
- padding: 0 1.5em 0 0;
+ padding: 0.3em 0.8em 0.8em 1.0em;
+ .btn {
+ padding-left: 5px;
+ padding-right: 5px;
+ }
}
.certificate__title-inline {
@include mediaQuery(small) {
diff --git a/app/assets/icons/icon-replace.svg b/app/assets/icons/icon-replace.svg
index edfd5f4..7f1d65c 100644
--- a/app/assets/icons/icon-replace.svg
+++ b/app/assets/icons/icon-replace.svg
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg"><path fill-rule="nonzero" d="M5.452 9.452l-1.529.898-.54-.947L6.53 7.516l1.937 3.151-.87.562-1.07-1.7a3.323 3.323 0 0 0 3.689 4.997l.636 1.018a4.395 4.395 0 0 1-5.4-6.091zm8.224 2.945l1.467-.871.555 1.004-3.146 1.886-1.937-3.15.98-.624.938 1.545a3.328 3.328 0 0 0-2.626-4.136L9.25 7.002 9.395 7a4.395 4.395 0 0 1 4.281 5.397zM7 1H1.455C1.204 1 1 1.265 1 1.59v11.82c0 .325.204.59.455.59h3.263c.211.363.464.698.751 1H1.385C.62 15 0 14.225 0 13.27V1.73C0 .776.62 0 1.385 0h6c.122 0 .24.06.326.169l4.154 4.399a.657.657 0 0 1 .135.407v1.743a5.299 5.299 0 0 0-1-.45V5.011H7.727c-.401 0-.727-.556-.727-1.01V1zm1 .863v2.139h2.045L8 1.862z"/></svg> \ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg"><path fill-rule="nonzero" transform="translate(7,3)" d="M5.452 9.452l-1.529.898-.54-.947L6.53 7.516l1.937 3.151-.87.562-1.07-1.7a3.323 3.323 0 0 0 3.689 4.997l.636 1.018a4.395 4.395 0 0 1-5.4-6.091zm8.224 2.945l1.467-.871.555 1.004-3.146 1.886-1.937-3.15.98-.624.938 1.545a3.328 3.328 0 0 0-2.626-4.136L9.25 7.002 9.395 7a4.395 4.395 0 0 1 4.281 5.397zM7 1H1.455C1.204 1 1 1.265 1 1.59v11.82c0 .325.204.59.455.59h3.263c.211.363.464.698.751 1H1.385C.62 15 0 14.225 0 13.27V1.73C0 .776.62 0 1.385 0h6c.122 0 .24.06.326.169l4.154 4.399a.657.657 0 0 1 .135.407v1.743a5.299 5.299 0 0 0-1-.45V5.011H7.727c-.401 0-.727-.556-.727-1.01V1zm1 .863v2.139h2.045L8 1.862z"/></svg> \ No newline at end of file
diff --git a/app/common/directives/certificate-modal-remove.html b/app/common/directives/certificate-modal-remove.html
new file mode 100644
index 0000000..8de06f9
--- /dev/null
+++ b/app/common/directives/certificate-modal-remove.html
@@ -0,0 +1,21 @@
+<div class="uib-modal__content modal__local-certificates-remove">
+ <div class="modal-header">
+ <h2 class="modal-title" id="dialog_label">
+ Remove certificate
+ </h2>
+ <button type="button" class="btn btn--close float-right" ng-click="$dismiss()" aria-label="Close">
+ <icon file="icon-close.svg" aria-hidden="true"></icon>
+ </button>
+ </div>
+ <div class="modal-body">
+ <p>Are you sure you want to remove certificate issued by '{{modalCtrl.certificate.Issuer.CommonName}}' certificate? This action cannot be undone.</p>
+ </div>
+ <div class="modal-footer">
+ <button class="btn btn-secondary" ng-click="$dismiss()" type="button">
+ Cancel
+ </button>
+ <button class="btn btn-primary" ng-click="$close()" type="button">
+ Remove
+ </button>
+ </div>
+</div>
diff --git a/app/common/directives/certificate.html b/app/common/directives/certificate.html
index cf7b46d..86d0dc7 100644
--- a/app/common/directives/certificate.html
+++ b/app/common/directives/certificate.html
@@ -39,7 +39,10 @@
<div class="certificate__date-cell">
{{cert.ValidNotAfter | date:medium}}
</div>
- <div class="certificate__buttons-cell">
+ <div class="certificate__title-inline">
+ Actions:
+ </div>
+ <div class="certificate__buttons-cell row">
<button
type="button"
ng-click="cert.upload = true"
@@ -47,6 +50,13 @@
class="btn btn-tertiary certificate__button">
<icon file="icon-replace.svg" aria-hidden="true"></icon>
</button>
+ <button type="button"
+ ng-click="confirmDeleteCert(cert)"
+ aria-label="Delete certificate"
+ class="btn btn-tertiary certificate__button"
+ ng-disabled="!isDeletable(cert)">
+ <icon file="icon-trashcan.svg" aria-hidden="true"></icon>
+ </button>
</div>
<div ng-show="cert.upload === true" class="upload__certificate">
<div class="close-btn">
diff --git a/app/common/directives/certificate.js b/app/common/directives/certificate.js
index 45b8c99..48fa851 100644
--- a/app/common/directives/certificate.js
+++ b/app/common/directives/certificate.js
@@ -9,8 +9,8 @@ window.angular && (function(angular) {
'template': require('./certificate.html'),
'scope': {'cert': '=', 'reload': '&'},
'controller': [
- '$scope', 'APIUtils', 'toastService', 'Constants',
- function($scope, APIUtils, toastService, Constants) {
+ '$scope', 'APIUtils', 'toastService', 'Constants', '$uibModal',
+ function($scope, APIUtils, toastService, Constants, $uibModal) {
var certificateType = 'PEM';
var availableCertificateTypes = Constants.CERTIFICATE_TYPES;
@@ -35,6 +35,65 @@ window.angular && (function(angular) {
}
};
+ $scope.isDeletable = function(certificate) {
+ return certificate.Description == 'TrustStore Certificate';
+ };
+
+ $scope.confirmDeleteCert = function(certificate) {
+ initRemoveModal(certificate);
+ };
+
+ /**
+ * Intiate remove certificate modal
+ * @param {*} certificate
+ */
+ function initRemoveModal(certificate) {
+ const template = require('./certificate-modal-remove.html');
+ $uibModal
+ .open({
+ template,
+ windowTopClass: 'uib-modal',
+ ariaLabelledBy: 'dialog_label',
+ controllerAs: 'modalCtrl',
+ controller: function() {
+ this.certificate = certificate;
+ }
+ })
+ .result
+ .then(() => {
+ deleteCert(certificate);
+ })
+ .catch(
+ () => {
+ // do nothing
+ })
+ };
+
+ /**
+ * Removes certificate
+ * @param {*} certificate
+ */
+ function deleteCert(certificate) {
+ $scope.confirm_delete = false;
+ APIUtils.deleteRedfishObject(certificate['@odata.id'])
+ .then(
+ function(data) {
+ $scope.loading = false;
+ toastService.success(
+ $scope.getCertificateName(certificate.Description) +
+ ' was deleted.');
+ $scope.reload();
+ },
+ function(error) {
+ console.log(error);
+ $scope.loading = false;
+ toastService.error(
+ 'Unable to delete ' +
+ $scope.getCertificateName(certificate.Description));
+ });
+ return;
+ };
+
$scope.replaceCertificate = function(certificate) {
$scope.loading = true;
if (certificate.file.name.split('.').pop() !==
diff --git a/app/common/services/api-utils.js b/app/common/services/api-utils.js
index e3f6136..4298884 100644
--- a/app/common/services/api-utils.js
+++ b/app/common/services/api-utils.js
@@ -1432,6 +1432,16 @@ window.angular && (function(angular) {
return response.data;
});
},
+ deleteRedfishObject: function(objectPath) {
+ return $http({
+ method: 'DELETE',
+ url: DataService.getHost() + objectPath,
+ withCredentials: true
+ })
+ .then(function(response) {
+ return response.data;
+ });
+ },
getHardwares: function(callback) {
$http({
method: 'GET',
OpenPOWER on IntegriCloud