You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dlab.apache.org by dg...@apache.org on 2020/09/25 14:28:58 UTC

[incubator-dlab] branch develop updated: [DLAB-1778]: Added localization (#923)

This is an automated email from the ASF dual-hosted git repository.

dgnatyshyn pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/incubator-dlab.git


The following commit(s) were added to refs/heads/develop by this push:
     new f7a938a  [DLAB-1778]: Added localization  (#923)
f7a938a is described below

commit f7a938a62f275c6a44d8a7ff8d6330901400630d
Author: Dmytro Gnatyshyn <42...@users.noreply.github.com>
AuthorDate: Fri Sep 25 17:28:47 2020 +0300

    [DLAB-1778]: Added localization  (#923)
    
    [DLAB-1778] Added localization support
---
 .../java/com/epam/dlab/dto/bucket/BucketDTO.java   |   2 +-
 .../dlab/backendapi/service/BucketService.java     |   1 -
 .../service/impl/aws/BucketServiceAwsImpl.java     |  12 +-
 .../service/impl/azure/BucketServiceAzureImpl.java |   5 +-
 .../service/impl/gcp/BucketServiceGcpImpl.java     |   6 +-
 .../src/main/resources/webapp/package-lock.json    | 430 ++++++++++++++++++---
 .../src/main/resources/webapp/package.json         |   1 +
 .../ssn-monitor/ssn-monitor.component.ts           |   1 -
 .../main/resources/webapp/src/app/app.module.ts    |  10 +-
 .../pipes/local-currency-pipe}/index.ts            |  16 +-
 .../local-currency-pipe/local-currency.pipe.ts}    |  45 ++-
 .../pipes/local-date-pipe}/index.ts                |  16 +-
 .../core/pipes/local-date-pipe/local-date.pipe.ts} |  24 +-
 .../src/app/core/services/localization.service.ts  |  56 +++
 .../audit/audit-grid/audit-grid.component.html     |   2 +-
 .../audit/audit-grid/audit-grid.component.ts       |   2 +
 .../src/app/reports/audit/audit.component.ts       |  14 +-
 .../webapp/src/app/reports/audit/audit.module.ts   |  24 +-
 .../reporting-grid/reporting-grid.component.html   |  18 +-
 .../src/app/reports/reporting/reporting.module.ts  |  20 +-
 .../bucket-browser/bucket-browser.component.html   |   3 +-
 .../bucket-browser/bucket-browser.component.ts     |  15 +-
 .../bucket-browser/bucket-browser.module.ts        |  22 +-
 .../bucket-browser/bucket-data.service.ts          |  61 ++-
 .../cluster-details/cluster-details.component.ts   |  15 +-
 .../cost-details-dialog.component.html             |  10 +-
 .../exploratory/cost-details-dialog/index.ts       |   4 +-
 .../detail-dialog/detail-dialog.component.ts       |   3 +-
 .../resources/scheduler/scheduler.calculations.ts  |   8 +
 .../resources/scheduler/scheduler.component.html   |   8 +-
 .../app/resources/scheduler/scheduler.component.ts |  30 +-
 .../webapp/src/app/shared/time-picker/index.ts     |   3 +-
 .../shared/time-picker/time-picker.component.ts    |  16 +-
 .../main/resources/webapp/src/assets/svg/logo.svg  |   3 -
 .../src/main/resources/webapp/src/polyfills.ts     |   4 +
 .../service/impl/BucketServiceImplTest.java        |   4 +-
 36 files changed, 669 insertions(+), 245 deletions(-)

diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDTO.java b/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDTO.java
index 369c866..74e0a8b 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDTO.java
+++ b/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDTO.java
@@ -30,5 +30,5 @@ public class BucketDTO {
     private final String bucket;
     private final String object;
     private final String size;
-    private final String lastModifiedDate;
+    private final long lastModifiedDate;
 }
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java
index 47b001b..de77e93 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/BucketService.java
@@ -27,7 +27,6 @@ import java.io.InputStream;
 import java.util.List;
 
 public interface BucketService {
-    String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
 
     List<BucketDTO> getObjects(String bucket);
 
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/aws/BucketServiceAwsImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/aws/BucketServiceAwsImpl.java
index 6c5673d..1657677 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/aws/BucketServiceAwsImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/aws/BucketServiceAwsImpl.java
@@ -38,8 +38,6 @@ import software.amazon.awssdk.services.s3.model.S3Object;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
-import java.text.SimpleDateFormat;
-import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -141,13 +139,11 @@ public class BucketServiceAwsImpl implements BucketService {
     }
 
     private BucketDTO toBucketDTO(String bucket, S3Object s3Object) {
-        Date date = Date.from(s3Object.lastModified());
-        SimpleDateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
         return BucketDTO.builder()
-                .bucket(bucket)
-                .object(s3Object.key())
-                .size(String.valueOf(s3Object.size()))
-                .lastModifiedDate(formatter.format(date))
+		        .bucket(bucket)
+		        .object(s3Object.key())
+		        .size(String.valueOf(s3Object.size()))
+		        .lastModifiedDate(s3Object.lastModified().toEpochMilli())
                 .build();
     }
 }
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/azure/BucketServiceAzureImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/azure/BucketServiceAzureImpl.java
index 073aca2..6ee1089 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/azure/BucketServiceAzureImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/azure/BucketServiceAzureImpl.java
@@ -44,12 +44,12 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.stream.Collectors;
 
 @Slf4j
 public class BucketServiceAzureImpl implements BucketService {
+
     private final AzureAuthFile azureAuthFile;
 
     @Inject
@@ -124,12 +124,11 @@ public class BucketServiceAzureImpl implements BucketService {
     }
 
     private BucketDTO toBucketDTO(String bucket, BlobItem blob) {
-        String lastModifiedDate = blob.getProperties().getLastModified().format(DateTimeFormatter.ofPattern(DATE_FORMAT));
         return BucketDTO.builder()
                 .bucket(bucket)
                 .object(blob.getName())
-                .lastModifiedDate(lastModifiedDate)
                 .size(String.valueOf(blob.getProperties().getContentLength()))
+                .lastModifiedDate(blob.getProperties().getLastModified().toEpochSecond())
                 .build();
     }
 
diff --git a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
index 4a28bf6..faf99a7 100644
--- a/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
+++ b/services/provisioning-service/src/main/java/com/epam/dlab/backendapi/service/impl/gcp/BucketServiceGcpImpl.java
@@ -34,8 +34,6 @@ import lombok.extern.slf4j.Slf4j;
 import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
-import java.text.SimpleDateFormat;
-import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
@@ -120,13 +118,11 @@ public class BucketServiceGcpImpl implements BucketService {
     }
 
     private BucketDTO toBucketDTO(BlobInfo blobInfo) {
-        Date date = new Date(blobInfo.getUpdateTime());
-        SimpleDateFormat formatter = new SimpleDateFormat(DATE_FORMAT);
         return BucketDTO.builder()
                 .bucket(blobInfo.getBucket())
                 .object(blobInfo.getName())
                 .size(String.valueOf(blobInfo.getSize()))
-                .lastModifiedDate(formatter.format(date))
+                .lastModifiedDate(blobInfo.getUpdateTime())
                 .build();
     }
 }
diff --git a/services/self-service/src/main/resources/webapp/package-lock.json b/services/self-service/src/main/resources/webapp/package-lock.json
index f8cfcc8..78dee68 100644
--- a/services/self-service/src/main/resources/webapp/package-lock.json
+++ b/services/self-service/src/main/resources/webapp/package-lock.json
@@ -642,6 +642,335 @@
         "tslib": "^1.9.0"
       }
     },
+    "@angular/localize": {
+      "version": "9.1.12",
+      "resolved": "https://registry.npmjs.org/@angular/localize/-/localize-9.1.12.tgz",
+      "integrity": "sha512-31OalfES+dLrxN0VXCxxtT5dWoOSlQ40KYmzMS8X+mQ20gy9eFiZK4qf3DEq3JPqRltBMdEDnwR38uGIMAu2gQ==",
+      "requires": {
+        "@babel/core": "7.8.3",
+        "glob": "7.1.2",
+        "yargs": "15.3.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+          "requires": {
+            "@babel/highlight": "^7.10.4"
+          }
+        },
+        "@babel/core": {
+          "version": "7.8.3",
+          "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.3.tgz",
+          "integrity": "sha512-4XFkf8AwyrEG7Ziu3L2L0Cv+WyY47Tcsp70JFmpftbAA1K7YL/sgE9jh9HyNj08Y/U50ItUchpN0w6HxAoX1rA==",
+          "requires": {
+            "@babel/code-frame": "^7.8.3",
+            "@babel/generator": "^7.8.3",
+            "@babel/helpers": "^7.8.3",
+            "@babel/parser": "^7.8.3",
+            "@babel/template": "^7.8.3",
+            "@babel/traverse": "^7.8.3",
+            "@babel/types": "^7.8.3",
+            "convert-source-map": "^1.7.0",
+            "debug": "^4.1.0",
+            "gensync": "^1.0.0-beta.1",
+            "json5": "^2.1.0",
+            "lodash": "^4.17.13",
+            "resolve": "^1.3.2",
+            "semver": "^5.4.1",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/generator": {
+          "version": "7.11.6",
+          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.6.tgz",
+          "integrity": "sha512-DWtQ1PV3r+cLbySoHrwn9RWEgKMBLLma4OBQloPRyDYvc5msJM9kvTLo1YnlJd1P/ZuKbdli3ijr5q3FvAF3uA==",
+          "requires": {
+            "@babel/types": "^7.11.5",
+            "jsesc": "^2.5.1",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-function-name": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
+          "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+          "requires": {
+            "@babel/helper-get-function-arity": "^7.10.4",
+            "@babel/template": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/helper-get-function-arity": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
+          "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+          "requires": {
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/helper-split-export-declaration": {
+          "version": "7.11.0",
+          "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
+          "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+          "requires": {
+            "@babel/types": "^7.11.0"
+          }
+        },
+        "@babel/helpers": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz",
+          "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==",
+          "requires": {
+            "@babel/template": "^7.10.4",
+            "@babel/traverse": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/highlight": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+          "requires": {
+            "@babel/helper-validator-identifier": "^7.10.4",
+            "chalk": "^2.0.0",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "@babel/parser": {
+          "version": "7.11.5",
+          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.5.tgz",
+          "integrity": "sha512-X9rD8qqm695vgmeaQ4fvz/o3+Wk4ZzQvSHkDBgpYKxpD4qTAUm88ZKtHkVqIOsYFFbIQ6wQYhC6q7pjqVK0E0Q=="
+        },
+        "@babel/template": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
+          "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/parser": "^7.10.4",
+            "@babel/types": "^7.10.4"
+          }
+        },
+        "@babel/traverse": {
+          "version": "7.11.5",
+          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.5.tgz",
+          "integrity": "sha512-EjiPXt+r7LiCZXEfRpSJd+jUMnBd4/9OUv7Nx3+0u9+eimMwJmG0Q98lw4/289JCoxSE8OolDMNZaaF/JZ69WQ==",
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/generator": "^7.11.5",
+            "@babel/helper-function-name": "^7.10.4",
+            "@babel/helper-split-export-declaration": "^7.11.0",
+            "@babel/parser": "^7.11.5",
+            "@babel/types": "^7.11.5",
+            "debug": "^4.1.0",
+            "globals": "^11.1.0",
+            "lodash": "^4.17.19"
+          },
+          "dependencies": {
+            "lodash": {
+              "version": "4.17.20",
+              "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+              "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+            }
+          }
+        },
+        "@babel/types": {
+          "version": "7.11.5",
+          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.5.tgz",
+          "integrity": "sha512-bvM7Qz6eKnJVFIn+1LPtjlBFPVN5jNDc1XmN15vWe7Q3DPBufWWsLiIvUu7xW87uTG6QoggpIDnUgLQvPheU+Q==",
+          "requires": {
+            "@babel/helper-validator-identifier": "^7.10.4",
+            "lodash": "^4.17.19",
+            "to-fast-properties": "^2.0.0"
+          },
+          "dependencies": {
+            "lodash": {
+              "version": "4.17.20",
+              "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+              "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA=="
+            }
+          }
+        },
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "ansi-styles": {
+          "version": "4.2.1",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "requires": {
+            "@types/color-name": "^1.1.1",
+            "color-convert": "^2.0.1"
+          }
+        },
+        "cliui": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+          "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+          "requires": {
+            "string-width": "^4.2.0",
+            "strip-ansi": "^6.0.0",
+            "wrap-ansi": "^6.2.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+        },
+        "convert-source-map": {
+          "version": "1.7.0",
+          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+          "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+          "requires": {
+            "safe-buffer": "~5.1.1"
+          }
+        },
+        "debug": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "get-caller-file": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+          "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+        },
+        "json5": {
+          "version": "2.1.3",
+          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
+          "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+          "requires": {
+            "minimist": "^1.2.5"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "minimist": {
+          "version": "1.2.5",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+          "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+        },
+        "require-main-filename": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+          "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+        },
+        "string-width": {
+          "version": "4.2.0",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "yargs": {
+          "version": "15.3.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.0.tgz",
+          "integrity": "sha512-g/QCnmjgOl1YJjGsnUg2SatC7NUYEiLXJqxNOQU9qSpjzGtGXda9b+OKccr1kLTy8BN9yqEyqfq5lxlwdc13TA==",
+          "requires": {
+            "cliui": "^6.0.0",
+            "decamelize": "^1.2.0",
+            "find-up": "^4.1.0",
+            "get-caller-file": "^2.0.1",
+            "require-directory": "^2.1.1",
+            "require-main-filename": "^2.0.0",
+            "set-blocking": "^2.0.0",
+            "string-width": "^4.2.0",
+            "which-module": "^2.0.0",
+            "y18n": "^4.0.0",
+            "yargs-parser": "^18.1.0"
+          }
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
     "@angular/material": {
       "version": "8.2.0",
       "resolved": "https://registry.npmjs.org/@angular/material/-/material-8.2.0.tgz",
@@ -942,6 +1271,11 @@
         "@babel/types": "^7.4.4"
       }
     },
+    "@babel/helper-validator-identifier": {
+      "version": "7.10.4",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+      "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw=="
+    },
     "@babel/helper-wrap-function": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz",
@@ -1629,6 +1963,11 @@
         }
       }
     },
+    "@types/color-name": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+      "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
+    },
     "@types/events": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
@@ -2014,7 +2353,6 @@
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
       "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
       "requires": {
         "color-convert": "^1.9.0"
       }
@@ -2644,7 +2982,6 @@
       "version": "1.1.8",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
       "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
-      "dev": true,
       "requires": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
@@ -2653,8 +2990,7 @@
         "balanced-match": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-          "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-          "dev": true
+          "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
         }
       }
     },
@@ -2939,8 +3275,7 @@
     "camelcase": {
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
     },
     "caniuse-lite": {
       "version": "1.0.30000989",
@@ -2964,7 +3299,6 @@
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
       "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-      "dev": true,
       "requires": {
         "ansi-styles": "^3.2.1",
         "escape-string-regexp": "^1.0.5",
@@ -3277,7 +3611,6 @@
       "version": "1.9.3",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
       "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
       "requires": {
         "color-name": "1.1.3"
       }
@@ -3285,8 +3618,7 @@
     "color-name": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
     },
     "combined-stream": {
       "version": "1.0.8",
@@ -3344,8 +3676,7 @@
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
     },
     "concat-stream": {
       "version": "1.6.2",
@@ -3748,8 +4079,7 @@
     "decamelize": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
     },
     "decode-uri-component": {
       "version": "0.2.0",
@@ -4187,8 +4517,7 @@
     "escape-string-regexp": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
-      "dev": true
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
     },
     "eslint-scope": {
       "version": "4.0.3",
@@ -4929,8 +5258,7 @@
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
     },
     "fsevents": {
       "version": "1.2.9",
@@ -5558,6 +5886,11 @@
       "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==",
       "dev": true
     },
+    "gensync": {
+      "version": "1.0.0-beta.1",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
+      "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg=="
+    },
     "get-caller-file": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
@@ -5592,7 +5925,6 @@
       "version": "7.1.2",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
       "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
-      "dev": true,
       "requires": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -5626,8 +5958,7 @@
     "globals": {
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
     },
     "globby": {
       "version": "7.1.1",
@@ -5728,8 +6059,7 @@
     "has-flag": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
     },
     "has-symbols": {
       "version": "1.0.0",
@@ -6090,7 +6420,6 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
       "requires": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -6099,8 +6428,7 @@
     "inherits": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-      "dev": true
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
     },
     "ini": {
       "version": "1.3.5",
@@ -6549,8 +6877,7 @@
     "js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
-      "dev": true
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
     },
     "js-yaml": {
       "version": "3.13.1",
@@ -6571,8 +6898,7 @@
     "jsesc": {
       "version": "2.5.2",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
     },
     "json-parse-better-errors": {
       "version": "1.0.2",
@@ -6741,8 +7067,7 @@
     "lodash": {
       "version": "4.17.15",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
-      "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
-      "dev": true
+      "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
     },
     "lodash.clonedeep": {
       "version": "4.5.0",
@@ -7008,7 +7333,6 @@
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
       "requires": {
         "brace-expansion": "^1.1.7"
       }
@@ -7582,7 +7906,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
       "requires": {
         "wrappy": "1"
       }
@@ -7698,7 +8021,6 @@
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
       "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
-      "dev": true,
       "requires": {
         "p-try": "^2.0.0"
       }
@@ -7730,8 +8052,7 @@
     "p-try": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
     },
     "pacote": {
       "version": "9.5.5",
@@ -7886,8 +8207,7 @@
     "path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
     },
     "path-is-inside": {
       "version": "1.0.2",
@@ -7904,8 +8224,7 @@
     "path-parse": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
-      "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
-      "dev": true
+      "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
     },
     "path-to-regexp": {
       "version": "0.1.7",
@@ -8609,8 +8928,7 @@
     "require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "dev": true
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
     },
     "require-main-filename": {
       "version": "1.0.1",
@@ -8628,7 +8946,6 @@
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz",
       "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==",
-      "dev": true,
       "requires": {
         "path-parse": "^1.0.5"
       }
@@ -8745,8 +9062,7 @@
     "safe-buffer": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
-      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
-      "dev": true
+      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
     },
     "safe-regex": {
       "version": "1.1.0",
@@ -8828,8 +9144,7 @@
     "semver": {
       "version": "5.4.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
-      "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
-      "dev": true
+      "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg=="
     },
     "semver-dsl": {
       "version": "1.0.1",
@@ -8934,8 +9249,7 @@
     "set-blocking": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
     },
     "set-value": {
       "version": "2.0.0",
@@ -9239,8 +9553,7 @@
     "source-map": {
       "version": "0.5.7",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
-      "dev": true
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
     },
     "source-map-loader": {
       "version": "0.2.4",
@@ -9715,7 +10028,6 @@
       "version": "5.5.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
       "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
       "requires": {
         "has-flag": "^3.0.0"
       }
@@ -9902,8 +10214,7 @@
     "to-fast-properties": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
-      "dev": true
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
     },
     "to-object-path": {
       "version": "0.3.0",
@@ -11123,8 +11434,7 @@
     "which-module": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-      "dev": true
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
     },
     "worker-farm": {
       "version": "1.7.0",
@@ -11179,8 +11489,7 @@
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
     },
     "ws": {
       "version": "6.2.1",
@@ -11205,8 +11514,7 @@
     "y18n": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
-      "dev": true
+      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
     },
     "yallist": {
       "version": "3.0.3",
diff --git a/services/self-service/src/main/resources/webapp/package.json b/services/self-service/src/main/resources/webapp/package.json
index 1284d50..87f060f 100644
--- a/services/self-service/src/main/resources/webapp/package.json
+++ b/services/self-service/src/main/resources/webapp/package.json
@@ -21,6 +21,7 @@
     "@angular/compiler": "^8.2.6",
     "@angular/core": "^8.2.6",
     "@angular/forms": "^8.2.6",
+    "@angular/localize": "^9.1.12",
     "@angular/material": "^8.2.0",
     "@angular/material-moment-adapter": "^8.2.0",
     "@angular/platform-browser": "^8.2.6",
diff --git a/services/self-service/src/main/resources/webapp/src/app/administration/management/ssn-monitor/ssn-monitor.component.ts b/services/self-service/src/main/resources/webapp/src/app/administration/management/ssn-monitor/ssn-monitor.component.ts
index 2791353..b371013 100644
--- a/services/self-service/src/main/resources/webapp/src/app/administration/management/ssn-monitor/ssn-monitor.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/administration/management/ssn-monitor/ssn-monitor.component.ts
@@ -20,7 +20,6 @@
 import { Component, OnInit, ViewEncapsulation } from '@angular/core';
 import { MatDialogRef } from '@angular/material/dialog';
 import { ToastrService } from 'ngx-toastr';
-
 import { DICTIONARY } from '../../../../dictionary/global.dictionary';
 import { HealthStatusService } from '../../../core/services';
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/app.module.ts b/services/self-service/src/main/resources/webapp/src/app/app.module.ts
index 91ec87d..a9a9b43 100644
--- a/services/self-service/src/main/resources/webapp/src/app/app.module.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/app.module.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { NgModule } from '@angular/core';
+import {LOCALE_ID, NgModule} from '@angular/core';
 import { FormsModule, ReactiveFormsModule } from '@angular/forms';
 import { RouterModule } from '@angular/router';
 import { LocationStrategy, HashLocationStrategy } from '@angular/common';
@@ -40,7 +40,9 @@ import { WebterminalModule } from './webterminal';
 import { CoreModule } from './core/core.module';
 import { SwaggerAPIModule } from './swagger';
 import {ReportsModule} from './reports/reports.module';
+import {LocalizationService} from './core/services/localization.service';
 
+LocalizationService.registerCulture(window.navigator.language);
 
 @NgModule({
   declarations: [AppComponent],
@@ -70,7 +72,11 @@ import {ReportsModule} from './reports/reports.module';
     provide: LocationStrategy,
     useClass: HashLocationStrategy,
     useValue: '/'
-  }],
+  },
+    // { provide: LOCALE_ID,
+    //   deps: [LocalizationService],
+    //   useFactory: (localizationService) => localizationService.getLocale() }
+  ],
   bootstrap: [AppComponent]
 })
 export class AppModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-currency-pipe/index.ts
similarity index 68%
copy from services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts
copy to services/self-service/src/main/resources/webapp/src/app/core/pipes/local-currency-pipe/index.ts
index b95c183..43b33ca 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-currency-pipe/index.ts
@@ -19,16 +19,12 @@
 
 import { NgModule } from '@angular/core';
 import { CommonModule } from '@angular/common';
-
-import { MaterialModule } from '../../../shared/material.module';
-import { CostDetailsDialogComponent } from './cost-details-dialog.component';
-
-export * from './cost-details-dialog.component';
+import { LocalCurrencyPipe } from './local-currency.pipe';
 
 @NgModule({
-  imports: [CommonModule, MaterialModule],
-  declarations: [CostDetailsDialogComponent],
-  entryComponents: [CostDetailsDialogComponent],
-  exports: [CostDetailsDialogComponent]
+  imports: [CommonModule],
+  declarations: [LocalCurrencyPipe],
+  exports: [LocalCurrencyPipe]
 })
-export class CostDetailsDialogModule {}
+
+export class LocalCurrencyModule { }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.calculations.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-currency-pipe/local-currency.pipe.ts
similarity index 51%
copy from services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.calculations.ts
copy to services/self-service/src/main/resources/webapp/src/app/core/pipes/local-currency-pipe/local-currency.pipe.ts
index 1174e74..41c2988 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.calculations.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-currency-pipe/local-currency.pipe.ts
@@ -17,27 +17,32 @@
  * under the License.
  */
 
-export class SchedulerCalculations {
-  public static convertTimeFormat(time24: any) {
-    let result;
-    if (typeof time24 === 'string') {
-      const spl = time24.split(':');
+import { Pipe, PipeTransform } from '@angular/core';
+import {formatCurrency, getCurrencySymbol} from '@angular/common';
+import {LocalizationService} from '../../services/localization.service';
 
-      result = {
-        hour: +spl[0] % 12 || 12,
-        minute: +spl[1],
-        meridiem: +spl[0] < 12 || +spl[0] === 24 ? 'AM' : 'PM'
-      };
-    } else {
-      let hours = time24.hour;
-      const minutes = (time24.minute < 10) ? '0' + time24.minute : time24.minute;
+@Pipe({ name: 'localcurrency' })
 
-      if (time24.meridiem === 'PM' && time24.hour < 12) hours = time24.hour + 12;
-      if (time24.meridiem === 'AM' &&  time24.hour === 12) hours = time24.hour - 12;
-      hours = hours < 10 ? '0' + hours : hours;
-
-      result = `${hours}:${minutes}`;
-    }
-    return result;
+export class LocalCurrencyPipe implements PipeTransform {
+  constructor(private localizationService: LocalizationService) { }
+  transform(
+    value: number,
+    currencyCode: string = 'USD',
+    display:
+      | 'code'
+      | 'symbol'
+      | 'symbol-narrow'
+      | string
+      | boolean = 'symbol',
+    digitsInfo: string = '',
+    locale: string = this.localizationService.locale,
+  ): string | null {
+    return formatCurrency(
+      value,
+      locale,
+      getCurrencySymbol(currencyCode, 'wide'),
+      currencyCode,
+      digitsInfo,
+    );
   }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-date-pipe/index.ts
similarity index 68%
copy from services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts
copy to services/self-service/src/main/resources/webapp/src/app/core/pipes/local-date-pipe/index.ts
index b95c183..2f29b6a 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-date-pipe/index.ts
@@ -19,16 +19,12 @@
 
 import { NgModule } from '@angular/core';
 import { CommonModule } from '@angular/common';
-
-import { MaterialModule } from '../../../shared/material.module';
-import { CostDetailsDialogComponent } from './cost-details-dialog.component';
-
-export * from './cost-details-dialog.component';
+import {LocalDatePipe} from './local-date.pipe';
 
 @NgModule({
-  imports: [CommonModule, MaterialModule],
-  declarations: [CostDetailsDialogComponent],
-  entryComponents: [CostDetailsDialogComponent],
-  exports: [CostDetailsDialogComponent]
+  imports: [CommonModule],
+  declarations: [LocalDatePipe],
+  exports: [LocalDatePipe]
 })
-export class CostDetailsDialogModule {}
+
+export class LocalDatePipeModule { }
diff --git a/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDTO.java b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-date-pipe/local-date.pipe.ts
similarity index 62%
copy from services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDTO.java
copy to services/self-service/src/main/resources/webapp/src/app/core/pipes/local-date-pipe/local-date.pipe.ts
index 369c866..c55953b 100644
--- a/services/dlab-model/src/main/java/com/epam/dlab/dto/bucket/BucketDTO.java
+++ b/services/self-service/src/main/resources/webapp/src/app/core/pipes/local-date-pipe/local-date.pipe.ts
@@ -17,18 +17,18 @@
  * under the License.
  */
 
-package com.epam.dlab.dto.bucket;
+import { Pipe, PipeTransform } from '@angular/core';
+import {LocalizationService} from '../../services/localization.service';
+import {formatDate} from '@angular/common';
 
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import lombok.Builder;
-import lombok.Data;
+@Pipe({ name: 'localDate' })
 
-@Data
-@Builder
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class BucketDTO {
-    private final String bucket;
-    private final String object;
-    private final String size;
-    private final String lastModifiedDate;
+export class LocalDatePipe implements PipeTransform {
+  constructor(private localizationService: LocalizationService) { }
+
+  transform(value: any, format: string = 'shortDate') {
+    if (!value) { return ; }
+
+    return formatDate(value, format, this.localizationService.locale);
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/core/services/localization.service.ts b/services/self-service/src/main/resources/webapp/src/app/core/services/localization.service.ts
new file mode 100644
index 0000000..ab19752
--- /dev/null
+++ b/services/self-service/src/main/resources/webapp/src/app/core/services/localization.service.ts
@@ -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.
+ */
+
+import { Injectable } from '@angular/core';
+import { registerLocaleData } from '@angular/common';
+import * as _moment from 'moment';
+import 'moment-timezone';
+
+
+@Injectable({
+  providedIn: 'root'
+})
+export class LocalizationService {
+  public timezone = _moment().format('Z');
+  private _locale;
+
+  constructor() { }
+
+  get locale() {
+    if (!this._locale) {
+      let locale = window.navigator.language;
+      if (locale.indexOf('-') !== -1 && locale !== 'en-GB') {
+        locale = locale.substr(0, locale.indexOf('-'));
+      }
+      this._locale = locale;
+    }
+    return this._locale;
+  }
+
+  public static registerCulture(culture: string) {
+    console.log(culture);
+    if (culture.indexOf('-') !== -1 && culture !== 'en-GB') {
+      culture = culture.substr(0, culture.indexOf('-'));
+    }
+    /* webpackInclude: /(uk|sv)\.js$/ */
+    import(
+      `@angular/common/locales/${culture}.js`
+      ).then(module => registerLocaleData(module.default));
+  }
+}
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.html b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.html
index 538fec1..e5087d9 100644
--- a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.html
@@ -29,7 +29,7 @@
           </i>
         </button>
       </th>
-      <td mat-cell *matCellDef="let element"> {{element.timestamp | date: 'dd/MM/yyyy hh:mm:ss aa'}} </td>
+      <td mat-cell *matCellDef="let element"> {{element.timestamp | localDate : 'short'}} </td>
       <td mat-footer-cell *matFooterCellDef class="table-footer">
       </td>
     </ng-container>
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.ts b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.ts
index faf887d..cc63092 100644
--- a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit-grid/audit-grid.component.ts
@@ -22,6 +22,7 @@ import {FilterAuditModel} from '../filter-audit.model';
 import {MAT_DIALOG_DATA, MatDialog, MatDialogRef} from '@angular/material/dialog';
 import {AuditService} from '../../../core/services/audit.service';
 import {SortUtils} from '../../../core/util';
+import {LocalizationService} from '../../../core/services/localization.service';
 
 
 export interface AuditItem {
@@ -64,6 +65,7 @@ export class AuditGridComponent implements OnInit {
     public dialogRef: MatDialogRef<AuditInfoDialogComponent>,
     public dialog: MatDialog,
     private auditService: AuditService,
+    private localizationService: LocalizationService,
   ) {
   }
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.component.ts b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.component.ts
index 14a99be..c04dd20 100644
--- a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.component.ts
@@ -18,27 +18,17 @@
  */
 
 
-import {Component, OnInit, OnDestroy, ViewChild, Inject} from '@angular/core';
+import {Component, OnInit, OnDestroy, ViewChild} from '@angular/core';
 import { ToastrService } from 'ngx-toastr';
 import {HealthStatusService} from '../../core/services';
 import { DICTIONARY} from '../../../dictionary/global.dictionary';
 import {AuditToolbarComponent} from './audit-toolbar/audit-toolbar.component';
 import {AuditGridComponent} from './audit-grid/audit-grid.component';
-import {AuditService} from '../../core/services/audit.service';
-import {Endpoint} from '../../administration/project/project.component';
-import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
-
 
 @Component({
   selector: 'dlab-reporting',
   template: `
   <div class="base-retreat">
-<!--    <dlab-toolbar (rebuildReport)="rebuildBillingReport()"-->
-<!--                  (exportReport)="exportBillingReport()"-->
-<!--                  (setRangeOption)="setRangeOption($event)">-->
-<!--    </dlab-toolbar>-->
-<!--    <mat-divider></mat-divider>-->
-<!--    <dlab-reporting-grid (filterReport)="filterReport($event)" (resetRangePicker)="resetRangePicker()"></dlab-reporting-grid>-->
     <audit-toolbar (rebuildAudit)="rebuildAuditGrid()" (setRangeOption)="setRangeOption($event)">
     </audit-toolbar>
     <mat-divider></mat-divider>
@@ -67,8 +57,6 @@ export class AuditComponent implements OnInit, OnDestroy {
   @ViewChild(AuditGridComponent, { static: true }) auditGrid: AuditGridComponent;
   @ViewChild(AuditToolbarComponent, { static: true }) auditToolbar: AuditToolbarComponent;
 
-  public availablePeriod: any;
-
   constructor(
     private healthStatusService: HealthStatusService,
     public toastr: ToastrService,
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.module.ts b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.module.ts
index d2887a0..dbffc6a 100644
--- a/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.module.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/audit/audit.module.ts
@@ -26,18 +26,22 @@ import { KeysPipeModule, LineBreaksPipeModule, ConvertActionPipeModule } from '.
 import {AuditComponent} from './audit.component';
 import {AuditGridComponent, AuditInfoDialogComponent} from './audit-grid/audit-grid.component';
 import {AuditToolbarComponent} from './audit-toolbar/audit-toolbar.component';
+import {LocalDatePipeModule} from '../../core/pipes/local-date-pipe';
+import {LocalCurrencyModule} from '../../core/pipes/local-currency-pipe';
 
 @NgModule({
-  imports: [
-    CommonModule,
-    FormsModule,
-    FormControlsModule,
-    ConvertActionPipeModule,
-    KeysPipeModule,
-    LineBreaksPipeModule,
-    NgDateRangePickerModule,
-    MaterialModule
-  ],
+    imports: [
+        CommonModule,
+        FormsModule,
+        FormControlsModule,
+        ConvertActionPipeModule,
+        KeysPipeModule,
+        LineBreaksPipeModule,
+        NgDateRangePickerModule,
+        MaterialModule,
+        LocalDatePipeModule,
+        LocalCurrencyModule
+    ],
   declarations: [
     AuditGridComponent,
     AuditToolbarComponent,
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting-grid/reporting-grid.component.html b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting-grid/reporting-grid.component.html
index 081c711..0d1e72b 100644
--- a/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting-grid/reporting-grid.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting-grid/reporting-grid.component.html
@@ -19,19 +19,6 @@
 <div class="billing-page-wrapper scrolling" #pageWrapper [ngClass]="{'scroll': reportData?.length < 5}" (scroll)="scrollTable($event)">
   <div class="wrapper" #wrapper>
     <section class="table-wrapper" id="scrolling" #tableWrapper (scroll)="scrollTable($event)" [ngClass]="{'scroll': reportData?.length > 4, 'shadow-none': reportData?.length < 5}">
-
-      <!--  <div class="navigation-btn">-->
-      <!--    <div class="left">-->
-      <!--      <button mat-fab aria-label="Scroll left">-->
-      <!--        <mat-icon>keyboard_arrow_left</mat-icon>-->
-      <!--      </button>-->
-      <!--    </div>-->
-      <!--    <div class="right">-->
-      <!--      <button mat-fab aria-label="Scroll right">-->
-      <!--        <mat-icon>keyboard_arrow_right</mat-icon>-->
-      <!--      </button>-->
-      <!--    </div>-->
-      <!--  </div>-->
       <table mat-table [dataSource]="reportData" class="data-grid reporting mat-elevation-z6" #table>
 
         <ng-container matColumnDef="name">
@@ -168,8 +155,7 @@
           </td>
           <td mat-footer-cell *matFooterCellDef class="table-footer total-cost" [colSpan]="2" [ngClass]="{'right-sticky': reportData?.length < 5}">
         <span class="strong">
-            Total <span *ngIf="reportData?.length"> {{ fullReport['total_cost'] }}
-          {{ fullReport['currency'] }}</span>
+            Total <span *ngIf="reportData?.length">{{fullReport['total_cost'] | localcurrency}}</span>
         </span>
           </td>
         </ng-container>
@@ -188,7 +174,7 @@
           </th>
 
           <td mat-cell *matCellDef="let element" [ngClass]="{'right-sticky': reportData?.length < 5}" >
-            {{ element.cost }} {{ element['currency'] }}
+            {{element.cost | localcurrency }}
           </td >
           <td mat-footer-cell *matFooterCellDef class="table-footer total-cost d-none">
           </td>
diff --git a/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting.module.ts b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting.module.ts
index 2e3ccb6..65d7ea9 100644
--- a/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting.module.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/reports/reporting/reporting.module.ts
@@ -28,17 +28,19 @@ import { ReportingComponent } from './reporting.component';
 import { KeysPipeModule, LineBreaksPipeModule } from '../../core/pipes';
 import { ReportingGridComponent } from './reporting-grid/reporting-grid.component';
 import { ToolbarComponent } from './toolbar/toolbar.component';
+import {LocalCurrencyModule} from '../../core/pipes/local-currency-pipe';
 
 @NgModule({
-  imports: [
-    CommonModule,
-    FormsModule,
-    FormControlsModule,
-    KeysPipeModule,
-    LineBreaksPipeModule,
-    NgDateRangePickerModule,
-    MaterialModule
-  ],
+    imports: [
+        CommonModule,
+        FormsModule,
+        FormControlsModule,
+        KeysPipeModule,
+        LineBreaksPipeModule,
+        NgDateRangePickerModule,
+        MaterialModule,
+        LocalCurrencyModule
+    ],
   declarations: [
     ReportingComponent,
     ReportingGridComponent,
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
index 03c8f03..3fd2680 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.html
@@ -190,8 +190,7 @@
                 </span>
               </div>
               <div class="size">{{file.object?.size | convertFileSize}}</div>
-              <div class="date" *ngIf="!file.isDownloading">{{convertDate(file.object?.lastModifiedDate) | date: 'dd/MM/yyyy hh:mm:ss aa'  }}</div>
-<!--              <div class="date" *ngIf="!file.isDownloading">{{file.object?.lastModifiedDate}}</div>-->
+              <div class="date" *ngIf="!file.isDownloading">{{file.object?.lastModifiedDate | localDate : 'short' }}</div>
               <div class="progress-wrapper" *ngIf="file.isDownloading">
                 <div class="progres">
                   <span class="progress-bar-text">{{file.progress || 0}}% Downloading...</span>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
index d179780..8372e41 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.component.ts
@@ -130,11 +130,11 @@ export class BucketBrowserComponent implements OnInit, OnDestroy {
 
 
   public toggleSelectedFile(file, type) {
-  type === 'file' ?  file.isSelected = !file.isSelected : file.isFolderSelected = !file.isFolderSelected;
-  this.selected = this.folderItems.filter(item => item.isSelected);
-  this.selectedFolderForAction = this.folderItems.filter(item => item.isFolderSelected);
-  this.selectedItems = [...this.selected, ...this.selectedFolderForAction];
-  this.isActionsOpen = false;
+    type === 'file' ?  file.isSelected = !file.isSelected : file.isFolderSelected = !file.isFolderSelected;
+    this.selected = this.folderItems.filter(item => item.isSelected);
+    this.selectedFolderForAction = this.folderItems.filter(item => item.isFolderSelected);
+    this.selectedItems = [...this.selected, ...this.selectedFolderForAction];
+    this.isActionsOpen = false;
   }
 
   filesPicked(files) {
@@ -466,11 +466,6 @@ export class BucketBrowserComponent implements OnInit, OnDestroy {
     this.filterObjects();
   }
 
-  public convertDate(date) {
-    const utcDate = new Date(date);
-    return new Date(utcDate.setTime( utcDate.getTime() - utcDate.getTimezoneOffset() * 60 * 1000 ));
-  }
-
 }
 
 
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.module.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.module.ts
index 2654704..66fd74d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.module.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-browser.module.ts
@@ -32,18 +32,20 @@ import {BucketDataService} from './bucket-data.service';
 import {BucketConfirmationDialogComponent} from './bucket-confirmation-dialog/bucket-confirmation-dialog.component';
 import {BucketTreeComponent} from './buckets-tree/bucket-tree.component';
 import {ConvertFileSizePipeModule} from '../../core/pipes/convert-file-size';
+import {LocalDatePipeModule} from '../../core/pipes/local-date-pipe';
 
 @NgModule({
-  imports: [
-    CommonModule,
-    FormsModule,
-    ReactiveFormsModule,
-    ResourcesGridModule,
-    ExploratoryEnvironmentCreateModule,
-    MaterialModule,
-    MatTreeModule,
-    ConvertFileSizePipeModule
-  ],
+    imports: [
+        CommonModule,
+        FormsModule,
+        ReactiveFormsModule,
+        ResourcesGridModule,
+        ExploratoryEnvironmentCreateModule,
+        MaterialModule,
+        MatTreeModule,
+        ConvertFileSizePipeModule,
+        LocalDatePipeModule
+    ],
   declarations: [
     BucketBrowserComponent,
     FolderTreeComponent,
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-data.service.ts b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-data.service.ts
index 2dce58e..8573105 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-data.service.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/bucket-browser/bucket-data.service.ts
@@ -19,12 +19,61 @@
 
 import { Injectable } from '@angular/core';
 import { BehaviorSubject} from 'rxjs';
-import {BucketBrowserService, TodoItemNode} from '../../core/services/bucket-browser.service';
-
-
-const array = [{'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder11/', 'size': '18 bytes', 'lastModifiedDate': '21-4-2020 11:36:36'}, {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder11/dsafaraorueajkegrgavhsfnvgahsfgsdjfhagsdjfg497frgfhsdajfsgdafjsxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzdvcfdvbgffgsdfgdsafaraorueajkegrgavhsfnvgahsfgsdjfhagsdjfg497frgfhsdajfsgdafjsxzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzdvcfdvbgffgsdfgdsfgsdfgggggg', ' [...]
-{'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '<script>alert("hello")' + ' </script>', 'size': '5 bytes', 'lastModifiedDate': '14-4-2020 09:36:16'}, {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '2.jpg', 'size': '52 bytes', 'lastModifiedDate': '17-4-2020 12:13:26'}, {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '1test', 'size': '112 bytes', 'lastModifiedDate': '14-4-2020 04:55:02'}, {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test.pem', 'size': '1 KB', 'las [...]
-{'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '5.jpg', 'size': '52 bytes', 'lastModifiedDate': '17-4-2020 12:13:26'}, {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test', 'size': '12 bytes', 'lastModifiedDate': '14-4-2020 04:55:02'}, {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test.pem', 'size': '1 KB', 'lastModifiedDate': '14-4-2020 04:57:54'}, {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test1', 'size': '52 bytes', 'lastModifiedDate': '17-4-2020 11:22: [...]
+import { BucketBrowserService, TodoItemNode } from '../../core/services/bucket-browser.service';
+
+
+const array = [{'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder11/', 'size': '18', 'lastModifiedDate': '1600846214842'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '51.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'Untitlsed', 'size': '5', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'adassdas', 'size': '1', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'downloadTest.txt', 'size': '16', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/', 'size': '11', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/2.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder31/3.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/folder1/folder1/folder1/folder1/test.pem', 'size': '1', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder12/', 'size': '11', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder3/1.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'objectName', 'size': '5', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'sss.txt', 'size': '52', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test', 'size': '12', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test.pem', 'size': '1', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test1', 'size': '52', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test2', 'size': '52', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'zzz', 'size': '12', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '4.txt/dsafaraorueajkegrgavhsfnvgahsfgsdjfhagsdjfg497frgfhsdajfsgdafj', 'size': '18', 'lastModifiedDate': '1600846214842'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '5.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'Untitled', 'size': '5', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'adasdas', 'size': '1', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'downloadTest.txt', 'size': '16', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/', 'size': '11', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/2.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder31/3.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+{'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder31/folder1/3.txt', 'size': '5', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '2.jpg', 'size': '52', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '1test', 'size': '112', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test.pem', 'size': '1', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test11', 'size': '52', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test2', 'size': '52', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'zzsz', 'size': '12', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '4.txt/dsafaraorueajkegrgavhsfnvgahsfgsdjfhagsdjfg497frgfhsdajfsgdafj', 'size': '18', 'lastModifiedDate': '1600846214842'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '5.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'Untitled', 'size': '5', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'adasdas', 'size': '1', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'downloadTest.txt', 'size': '16', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1212/', 'size': '11', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/2.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder1/3.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'fol2der1/folder1/folder1/folder1/2folder1/test.pem',
+    'size': '1', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder2/', 'size': '11', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'folder3/1.txt', 'size': '18', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'objectName', 'size': '5', 'lastModifiedDate': '1600846212142'},
+{'bucket': 'ofuks-1304-prj1-local-bucket', 'object': '5.jpg', 'size': '52', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test', 'size': '12', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test.pem', 'size': '1', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test1', 'size': '52', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'test2', 'size': '52', 'lastModifiedDate': '1600846212142'},
+  {'bucket': 'ofuks-1304-prj1-local-bucket', 'object': 'zzz', 'size': '12', 'lastModifiedDate': '1600846212142'}];
 
 @Injectable()
 export class BucketDataService {
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.ts
index e2892b5..da84112 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/computational/cluster-details/cluster-details.component.ts
@@ -71,7 +71,8 @@ export class DetailComputationalResourcesComponent implements OnInit {
 
 
     this.upTimeInHours = (this.resource.up_time) ? DateUtils.diffBetweenDatesInHours(this.resource.up_time) : 0;
-    this.upTimeSince = (this.resource.up_time) ? new Date(this.resource.up_time).toString() : '';
+    this.upTimeSince = (this.resource.up_time) ?
+      new Date(this.resource.up_time).toString().substr(0, new Date(this.resource.up_time).toString().indexOf('(')) : '';
     this.initFormModel();
 
     if (this.resource.image === 'docker.dlab-dataengine') this.getClusterConfiguration();
@@ -101,7 +102,13 @@ export class DetailComputationalResourcesComponent implements OnInit {
 
   public editClusterConfiguration(data): void {
     this.dataengineConfigurationService
-      .editClusterConfiguration(data.configuration_parameters, this.environment.project, this.environment.name, this.resource.computational_name, this.PROVIDER)
+      .editClusterConfiguration(
+        data.configuration_parameters,
+        this.environment.project,
+        this.environment.name,
+        this.resource.computational_name,
+        this.PROVIDER
+      )
       .subscribe(result => {
         this.dialogRef.close();
       },
@@ -129,7 +136,9 @@ export class DetailComputationalResourcesComponent implements OnInit {
       clusterType: resource.dataEngineType === 'dataengine-service' ? 'Hadoop' : 'Master'
     };
 
-    this.auditService.sendDataToAudit({resource_name: resource.computational_name, info: JSON.stringify(clusterInfo), type: 'COMPUTE'}).subscribe();
+    this.auditService.sendDataToAudit(
+      {resource_name: resource.computational_name, info: JSON.stringify(clusterInfo), type: 'COMPUTE'}
+      ).subscribe();
   }
 
   copyBucketName(url: string) {
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.html
index d916d94..b3ae086 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/cost-details-dialog.component.html
@@ -50,16 +50,16 @@
                 </div>
                 <div class="service">{{ item.product }}</div>
 <!--                <div class="resource-type" >{{ item.resourse_type }}</div>-->
-                <div class="usage-date-start">{{ item.from.join('/') | date }}</div>
-                <div class="usage-date-end">{{ item.to.join('/') | date }}</div>
-                <div class="cost-currency">{{ item.cost }} {{ item.currency }}</div>
+                <div class="usage-date-start">{{ item.from.join('/') | localDate : 'shortDate'}}</div>
+                <div class="usage-date-end">{{ item.to.join('/') | localDate : 'shortDate'}}</div>
+                <div class="cost-currency">{{ item.cost | localcurrency }}</div>
               </mat-list-item>
             </div>
 
         </mat-list>
         <div class="total">
-          <strong>Total: </strong>{{ notebook.cost }} {{ notebook.currency_code }}</div>
+          <strong>Total: </strong>{{ notebook.cost | localcurrency }}</div>
       </div>
     </div>
-  </div>
+  </div>:'USD':'code'
 </div>
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts
index b95c183..647257d 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/cost-details-dialog/index.ts
@@ -22,11 +22,13 @@ import { CommonModule } from '@angular/common';
 
 import { MaterialModule } from '../../../shared/material.module';
 import { CostDetailsDialogComponent } from './cost-details-dialog.component';
+import {LocalCurrencyModule} from '../../../core/pipes/local-currency-pipe';
+import {LocalDatePipeModule} from '../../../core/pipes/local-date-pipe';
 
 export * from './cost-details-dialog.component';
 
 @NgModule({
-  imports: [CommonModule, MaterialModule],
+  imports: [CommonModule, MaterialModule, LocalCurrencyModule, LocalDatePipeModule],
   declarations: [CostDetailsDialogComponent],
   entryComponents: [CostDetailsDialogComponent],
   exports: [CostDetailsDialogComponent]
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
index a3f55ff..22c4bfa 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/exploratory/detail-dialog/detail-dialog.component.ts
@@ -73,7 +73,8 @@ export class DetailDialogComponent implements OnInit {
       this.tooltip = false;
 
       this.upTimeInHours = (this.notebook.time) ? DateUtils.diffBetweenDatesInHours(this.notebook.time) : 0;
-      this.upTimeSince = (this.notebook.time) ? new Date(this.notebook.time).toString() : '';
+      this.upTimeSince = (this.notebook.time) ?
+        new Date(this.notebook.time).toString().substr(0, new Date(this.notebook.time).toString().indexOf('(')) : '';
       this.initFormModel();
       this.getClusterConfiguration();
     if (this.notebook.edgeNodeStatus === 'terminated' ||
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.calculations.ts b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.calculations.ts
index 1174e74..fe8a1ae 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.calculations.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.calculations.ts
@@ -40,4 +40,12 @@ export class SchedulerCalculations {
     }
     return result;
   }
+
+  public static setTimeInMiliseconds(time) {
+    const minutes = (Number(time.minute) < 10) ? ('0' + time.minute) : time.minute;
+    const timeMilisec = new Date().setMinutes(+minutes);
+
+    if (time.meridiem === 'PM' && time.hour < 13) time.hour += 12;
+    return new Date(timeMilisec).setHours(time.hour);
+  }
 }
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.html b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.html
index a983827..c24094e 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.html
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.html
@@ -101,17 +101,17 @@
 
           <div class="row-wrap" *ngIf="destination.image !== 'docker.dlab-dataengine-service'">
             <div class="control-group col-3 time-range">
-              <dlab-time-picker [(pickTime)]="startTime" [label]="'Choose start time'"
+              <dlab-time-picker [(pickTime)]="startTime" [(milisecTime)]="startTimeMilliseconds" [label]="'Choose start time'"
                 [disable]="destination.type === 'СOMPUTATIONAL' && inherit || !enableSchedule">
                 {{destination.type}}
               </dlab-time-picker>
             </div>
             <div class="control-group col-3 time-range">
-              <dlab-time-picker [(pickTime)]="endTime" [label]="'Choose finish time'" [disable]="destination.type === 'СOMPUTATIONAL' && inherit ||!enableSchedule">
+              <dlab-time-picker [(pickTime)]="endTime" [(milisecTime)]="endTimeMilliseconds" [label]="'Choose finish time'" [disable]="destination.type === 'СOMPUTATIONAL' && inherit ||!enableSchedule">
               </dlab-time-picker>
             </div>
             <div class="control-group col-3 time-range" *ngIf="destination.type === 'СOMPUTATIONAL'">
-              <dlab-time-picker [(pickTime)]="terminateTime" [label]="'Choose terminate time'"
+              <dlab-time-picker [(pickTime)]="terminateTime" [(milisecTime)]="terminateTimeMilliseconds" [label]="'Choose terminate time'"
                 [disable]="!enableSchedule"></dlab-time-picker>
             </div>
             <div *ngIf="timeReqiered" class="error term m-bott-10 mt-5"><span>At least one of time range fields
@@ -166,7 +166,7 @@
                 </mat-form-field>
               </div>
               <div class="control-group col-3 time-range" *ngIf="destination.type === 'СOMPUTATIONAL'">
-                <dlab-time-picker [(pickTime)]="terminateTime" [label]="'Choose terminate time'"
+                <dlab-time-picker [(pickTime)]="terminateTime" [(milisecTime)]="terminateTimeMilliseconds" [label]="'Choose terminate time'"
                   [disable]="!enableSchedule"></dlab-time-picker>
               </div>
               <div class="col-3">
diff --git a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.ts b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.ts
index 845b9ad..0e180b3 100644
--- a/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/resources/scheduler/scheduler.component.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { Component, OnInit, ViewChild, Output, EventEmitter, ViewEncapsulation, ChangeDetectorRef, Inject } from '@angular/core';
+import {Component, OnInit, ViewChild, ViewEncapsulation, ChangeDetectorRef, Inject, LOCALE_ID} from '@angular/core';
 import { FormGroup, FormBuilder, Validators } from '@angular/forms';
 import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
 import { ToastrService } from 'ngx-toastr';
@@ -31,7 +31,6 @@ import { SchedulerModel, WeekdaysModel } from './scheduler.model';
 import { SchedulerCalculations } from './scheduler.calculations';
 import { HTTP_STATUS_CODES, CheckUtils } from '../../core/util';
 import { ScheduleSchema } from './scheduler.model';
-import { map } from 'rxjs/operators';
 
 @Component({
   selector: 'dlab-scheduler',
@@ -64,9 +63,12 @@ export class SchedulerComponent implements OnInit {
   public destination: any;
   public zones: {};
   public tzOffset: string = _moment().format('Z');
-  public startTime = { hour: 9, minute: 0, meridiem: 'AM' };
-  public endTime = { hour: 8, minute: 0, meridiem: 'PM' };
+  public startTime = SchedulerCalculations.convertTimeFormat('09:00');
+  public startTimeMilliseconds: number = SchedulerCalculations.setTimeInMiliseconds(this.startTime);
+  public endTime = SchedulerCalculations.convertTimeFormat('20:00');
+  public endTimeMilliseconds: number = SchedulerCalculations.setTimeInMiliseconds(this.endTime);
   public terminateTime = null;
+  public terminateTimeMilliseconds: number;
 
   public inactivityLimits = { min: 120, max: 10080 };
   public integerRegex: string = '^[0-9]*$';
@@ -158,8 +160,10 @@ export class SchedulerComponent implements OnInit {
       ? this.schedulerForm.get('startDate').enable()
       : this.schedulerForm.get('startDate').disable();
 
-    this.enableSchedule && this.destination.type !== 'СOMPUTATIONAL' ? this.schedulerForm.get('finishDate').enable() : this.schedulerForm.get('finishDate').disable();
-    this.enableSchedule ? this.schedulerForm.get('terminateDate').enable() : this.schedulerForm.get('terminateDate').disable();
+    this.enableSchedule && this.destination.type !== 'СOMPUTATIONAL' ?
+      this.schedulerForm.get('finishDate').enable() : this.schedulerForm.get('finishDate').disable();
+    this.enableSchedule ?
+      this.schedulerForm.get('terminateDate').enable() : this.schedulerForm.get('terminateDate').disable();
 
     if (this.enableSchedule && $event.source) this.enableIdleTimeView = false;
   }
@@ -258,7 +262,11 @@ export class SchedulerComponent implements OnInit {
   }
 
   private setScheduleByInactivity() {
-    const data = { sync_start_required: this.parentInherit, check_inactivity_required: this.enableIdleTime, max_inactivity: this.schedulerForm.controls.inactivityTime.value };
+    const data = {
+      sync_start_required: this.parentInherit,
+      check_inactivity_required: this.enableIdleTime,
+      max_inactivity: this.schedulerForm.controls.inactivityTime.value
+    };
     (this.destination.type === 'СOMPUTATIONAL')
       ? this.setInactivity(this.notebook.project, this.notebook.name, data, this.destination.computational_name)
       : this.setInactivity(this.notebook.project, this.notebook.name, { ...data, consider_inactivity: this.considerInactivity });
@@ -282,8 +290,11 @@ export class SchedulerComponent implements OnInit {
           params.stop_days_repeat.filter(key => (this.selectedStopWeekDays[key.toLowerCase()] = true));
           this.inherit = params.sync_start_required;
           this.tzOffset = params.timezone_offset ? params.timezone_offset : this.tzOffset;
-          this.startTime = params.start_time ? SchedulerCalculations.convertTimeFormat(params.start_time) : null;
-          this.endTime = params.end_time ? SchedulerCalculations.convertTimeFormat(params.end_time) : null;
+          this.startTime = params.start_time ? SchedulerCalculations.convertTimeFormat(params.start_time) : this.startTime;
+          this.startTimeMilliseconds = SchedulerCalculations.setTimeInMiliseconds(this.startTime);
+          this.endTime = params.end_time ? SchedulerCalculations.convertTimeFormat(params.end_time) : this.endTime;
+          this.endTimeMilliseconds = SchedulerCalculations.setTimeInMiliseconds(this.endTime);
+
           this.formInit(params.begin_date, params.finish_date, params.terminate_datetime);
           this.schedulerForm.controls.inactivityTime.setValue(params.max_inactivity || this.inactivityLimits.min);
           this.enableIdleTime = params.check_inactivity_required;
@@ -293,6 +304,7 @@ export class SchedulerComponent implements OnInit {
             const terminate_datetime = params.terminate_datetime.split(' ');
             this.schedulerForm.controls.terminateDate.setValue(terminate_datetime[0]);
             this.terminateTime = SchedulerCalculations.convertTimeFormat(terminate_datetime[1]);
+            this.terminateTimeMilliseconds = SchedulerCalculations.setTimeInMiliseconds(this.terminateTime);
           }
 
           (this.enableIdleTime && params.max_inactivity)
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/index.ts b/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/index.ts
index 9161e89..4133045 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/index.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/index.ts
@@ -28,11 +28,12 @@ import {
   TimePickerComponent,
   TimePickerDialogComponent
 } from './time-picker.component';
+import {LocalDatePipeModule} from '../../core/pipes/local-date-pipe';
 
 export * from './time-picker.component';
 
 @NgModule({
-  imports: [CommonModule, FormsModule, ReactiveFormsModule, MaterialModule],
+    imports: [CommonModule, FormsModule, ReactiveFormsModule, MaterialModule, LocalDatePipeModule],
   declarations: [TimePickerComponent, TimePickerDialogComponent, TimeCoverComponent, TickerComponent],
   entryComponents: [TimePickerDialogComponent],
   exports: [TimePickerComponent]
diff --git a/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/time-picker.component.ts b/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/time-picker.component.ts
index 020872e..cce289c 100644
--- a/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/time-picker.component.ts
+++ b/services/self-service/src/main/resources/webapp/src/app/shared/time-picker/time-picker.component.ts
@@ -21,14 +21,15 @@ import { Component, OnInit, Inject, Input, Output, EventEmitter } from '@angular
 import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
 
 import { CLOCK_TYPE, TimeFormat } from './ticker.component';
+import {SchedulerCalculations} from '../../resources/scheduler/scheduler.calculations';
 type TimeFormatAlias = TimeFormat;
-     
+
 @Component({
   selector: 'dlab-time-picker',
   template: `
     <div class="time-picker">
       <mat-form-field class="time-select">
-        <input matInput placeholder="{{ label }}" [value]="selectedTime" (input)="checkEmpty($event.target.value)" [disabled]="disable">
+        <input matInput placeholder="{{ label }}" [value]="selectedTime | localDate : 'shortTime'" (input)="checkEmpty($event.target['value'])" [disabled]="disable">
         <mat-icon matSuffix [ngClass]="{'not-allowed': disable}" (click)="openDatePickerDialog($event)" disabled="disable">access_time</mat-icon>
       </mat-form-field>
     </div>`,
@@ -38,14 +39,16 @@ export class TimePickerComponent implements OnInit {
   @Input() pickTime: TimeFormatAlias;
   @Input() label: string = 'Select time';
   @Input() disable: boolean = false;
+  @Input() milisecTime: number;
   @Output() pickTimeChange: EventEmitter<TimeFormatAlias> = new EventEmitter();
+  @Output() milisecTimeChange: EventEmitter<TimeFormatAlias> = new EventEmitter();
 
   constructor(private dialog: MatDialog) { }
 
   ngOnInit() { }
 
-  public get selectedTime(): string {
-    return !this.pickTime ? '' : `${this.pickTime.hour}:${this.getFullMinutes()} ${this.pickTime.meridiem}`;
+  public get selectedTime(): string | number {
+    return !this.pickTime ? '' : this.milisecTime;
   }
 
   public getFullMinutes() {
@@ -58,7 +61,7 @@ export class TimePickerComponent implements OnInit {
         time: {
           hour: this.pickTime ? this.pickTime.hour : 0,
           minute: this.pickTime ? this.pickTime.minute : 0,
-          meridiem: this.pickTime ? this.pickTime.meridiem : 'AM' 
+          meridiem: this.pickTime ? this.pickTime.meridiem : 'AM'
         }
       }
     });
@@ -67,13 +70,14 @@ export class TimePickerComponent implements OnInit {
       if (result === undefined) return;
       if (result !== -1) {
         this.pickTime = result;
+        this.milisecTime = SchedulerCalculations.setTimeInMiliseconds(this.pickTime);
         this.emitpickTimeSelection();
       }
     });
     return false;
   }
 
-  checkEmpty(searchValue : string ) {
+  checkEmpty(searchValue: string ) {
     if (!searchValue.length) {
       this.pickTime = null;
       this.emitpickTimeSelection();
diff --git a/services/self-service/src/main/resources/webapp/src/assets/svg/logo.svg b/services/self-service/src/main/resources/webapp/src/assets/svg/logo.svg
deleted file mode 100644
index b0b4da0..0000000
--- a/services/self-service/src/main/resources/webapp/src/assets/svg/logo.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 140.5 47.1" style="enable-background:new 0 0 140.5 47.1;" xml:space="preserve">
-    <path fill="#35AFD5" d="M0.9,46C0.3,45.4,0,44.6,0,43.7V3.1c0-0.8,0.3-1.7,0.9-2.2C1.5,0.3,2.3,0,3.1,0H14c4.2-0.1,8.3,1,12,3 c3.5,1.9,6.3,4.8,8.2,8.3c2,3.7,3,7.9,3,12.1c0.1,4.2-0.9,8.4-2.9,12.1c-1.9,3.5-4.8,6.4-8.3,8.3c-3.7,2-7.8,3.1-12.1,3H3.1 C2.3,46.9,1.5,46.6,0.9,46z M14,41.3c3.1,0.1,6.2-0.7,8.9-2.3c2.6-1.5,4.7-3.7,6.1-6.4c1.5-2.9,2.2-6,2.2-9.3 c0.1-3.2-0.7-6.4-2.2-9.2c-1.4-2.7-3.5-4.9-6.1-6.4c-2.7-1.5-5.8-2.3-8.9-2.3H6.2v35.8H14z M41.8,46.2C41.3,45.6,41,44.8,41,44V3.4 c0-0.8,0.3-1 [...]
-</svg>
\ No newline at end of file
diff --git a/services/self-service/src/main/resources/webapp/src/polyfills.ts b/services/self-service/src/main/resources/webapp/src/polyfills.ts
index 3e45a73..4358780 100644
--- a/services/self-service/src/main/resources/webapp/src/polyfills.ts
+++ b/services/self-service/src/main/resources/webapp/src/polyfills.ts
@@ -1,3 +1,7 @@
+/***************************************************************************************************
+ * Load `$localize` onto the global scope - used if i18n tags appear in Angular templates.
+ */
+import '@angular/localize/init';
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
diff --git a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/BucketServiceImplTest.java b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/BucketServiceImplTest.java
index 641100d..d34722f 100644
--- a/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/BucketServiceImplTest.java
+++ b/services/self-service/src/test/java/com/epam/dlab/backendapi/service/impl/BucketServiceImplTest.java
@@ -42,6 +42,7 @@ import javax.ws.rs.core.Response;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.time.LocalDate;
 import java.util.Collections;
 import java.util.List;
 
@@ -58,6 +59,7 @@ import static org.mockito.Mockito.when;
 
 @RunWith(MockitoJUnitRunner.class)
 public class BucketServiceImplTest extends TestBase {
+
 	private static final String BUCKET_GET_OBJECTS = "%sbucket/%s";
 	private static final String BUCKET_UPLOAD_OBJECT = "%sbucket/upload";
 	private static final String BUCKET_UPLOAD_FOLDER = "%sbucket/folder/upload";
@@ -66,7 +68,7 @@ public class BucketServiceImplTest extends TestBase {
 	private static final String BUCKET = "bucket";
 	private static final String OBJECT = "object";
 	private static final String SIZE = "size";
-	private static final String DATE = "date";
+	private static final long DATE = LocalDate.now().toEpochDay();
 	private static final String FOLDER = "folder/";
 
 	@Mock


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@dlab.apache.org
For additional commands, e-mail: commits-help@dlab.apache.org