Browse Source

feat(admin-ui): Display customer last login time

Michael Bromley 5 years ago
parent
commit
0f9dd1c029

+ 10 - 10
packages/admin-ui/i18n-coverage.json

@@ -1,34 +1,34 @@
 {
 {
-  "generatedOn": "2020-06-25T08:48:13.322Z",
-  "lastCommit": "96f923a0a1d0b8d3ac575dce30148f9d75360069",
+  "generatedOn": "2020-06-25T09:38:44.987Z",
+  "lastCommit": "bdfc43d36aba9241598a3d5ce121a0399d44c990",
   "translationStatus": {
   "translationStatus": {
     "de": {
     "de": {
-      "tokenCount": 652,
+      "tokenCount": 654,
       "translatedCount": 609,
       "translatedCount": 609,
       "percentage": 93
       "percentage": 93
     },
     },
     "en": {
     "en": {
-      "tokenCount": 652,
-      "translatedCount": 651,
+      "tokenCount": 654,
+      "translatedCount": 652,
       "percentage": 100
       "percentage": 100
     },
     },
     "es": {
     "es": {
-      "tokenCount": 652,
+      "tokenCount": 654,
       "translatedCount": 467,
       "translatedCount": 467,
-      "percentage": 72
+      "percentage": 71
     },
     },
     "pl": {
     "pl": {
-      "tokenCount": 652,
+      "tokenCount": 654,
       "translatedCount": 566,
       "translatedCount": 566,
       "percentage": 87
       "percentage": 87
     },
     },
     "zh_Hans": {
     "zh_Hans": {
-      "tokenCount": 652,
+      "tokenCount": 654,
       "translatedCount": 550,
       "translatedCount": 550,
       "percentage": 84
       "percentage": 84
     },
     },
     "zh_Hant": {
     "zh_Hant": {
-      "tokenCount": 652,
+      "tokenCount": 654,
       "translatedCount": 550,
       "translatedCount": 550,
       "percentage": 84
       "percentage": 84
     }
     }

+ 16 - 0
packages/admin-ui/src/lib/core/src/shared/pipes/time-ago.pipe.spec.ts

@@ -68,4 +68,20 @@ describe('TimeAgoPipe', () => {
         pipe.transform('2020-01-03T17:14:20.500Z', '2020-02-04T16:15:10.500Z');
         pipe.transform('2020-01-03T17:14:20.500Z', '2020-02-04T16:15:10.500Z');
         expect(mockI18nService.translate.calls.argsFor(2)).toEqual(['datetime.ago-days', { count: 31 }]);
         expect(mockI18nService.translate.calls.argsFor(2)).toEqual(['datetime.ago-days', { count: 31 }]);
     });
     });
+
+    it('years ago', () => {
+        const pipe = new TimeAgoPipe(mockI18nService);
+
+        pipe.transform('2019-02-04T12:00:00.000Z', '2020-02-04T12:00:00.000Z');
+        expect(mockI18nService.translate.calls.argsFor(0)).toEqual(['datetime.ago-years', { count: 1 }]);
+
+        pipe.transform('2018-02-04T12:00:01.000Z', '2020-02-04T12:00:00.000Z');
+        expect(mockI18nService.translate.calls.argsFor(1)).toEqual(['datetime.ago-years', { count: 1 }]);
+
+        pipe.transform('2018-02-04T12:00:00.000Z', '2020-02-04T12:00:00.000Z');
+        expect(mockI18nService.translate.calls.argsFor(2)).toEqual(['datetime.ago-years', { count: 2 }]);
+
+        pipe.transform('2010-01-04T12:00:00.000Z', '2020-02-04T12:00:00.000Z');
+        expect(mockI18nService.translate.calls.argsFor(3)).toEqual(['datetime.ago-years', { count: 10 }]);
+    });
 });
 });

+ 2 - 1
packages/admin-ui/src/lib/core/src/shared/pipes/time-ago.pipe.ts

@@ -22,7 +22,8 @@ export class TimeAgoPipe implements PipeTransform {
             [60, _('datetime.ago-seconds')],
             [60, _('datetime.ago-seconds')],
             [3600, _('datetime.ago-minutes')],
             [3600, _('datetime.ago-minutes')],
             [86400, _('datetime.ago-hours')],
             [86400, _('datetime.ago-hours')],
-            [Number.MAX_SAFE_INTEGER, _('datetime.ago-days')],
+            [31536000, _('datetime.ago-days')],
+            [Number.MAX_SAFE_INTEGER, _('datetime.ago-years')],
         ];
         ];
 
 
         let lastUpperBound = 1;
         let lastUpperBound = 1;

+ 3 - 0
packages/admin-ui/src/lib/customer/src/components/customer-detail/customer-detail.component.html

@@ -3,6 +3,9 @@
         <div class="flex clr-align-items-center">
         <div class="flex clr-align-items-center">
             <vdr-entity-info [entity]="entity$ | async"></vdr-entity-info>
             <vdr-entity-info [entity]="entity$ | async"></vdr-entity-info>
             <vdr-customer-status-label [customer]="entity$ | async"></vdr-customer-status-label>
             <vdr-customer-status-label [customer]="entity$ | async"></vdr-customer-status-label>
+            <div class="last-login" *ngIf="(entity$ | async)?.user.lastLogin as lastLogin" [title]="lastLogin | date:'medium'">
+                {{ 'customer.last-login' | translate }}: {{ lastLogin | timeAgo }}
+            </div>
         </div>
         </div>
     </vdr-ab-left>
     </vdr-ab-left>
 
 

+ 6 - 0
packages/admin-ui/src/lib/customer/src/components/customer-detail/customer-detail.component.scss

@@ -0,0 +1,6 @@
+@import "variables";
+
+.last-login {
+    margin-left: 6px;
+    color: $color-grey-500;
+}

+ 2 - 0
packages/admin-ui/src/lib/static/i18n-messages/de.json

@@ -242,6 +242,7 @@
     "history-customer-verified": "",
     "history-customer-verified": "",
     "history-using-external-auth-strategy": "",
     "history-using-external-auth-strategy": "",
     "history-using-native-auth-strategy": "",
     "history-using-native-auth-strategy": "",
+    "last-login": "",
     "last-name": "Nachname",
     "last-name": "Nachname",
     "name": "Name",
     "name": "Name",
     "new-email-address": "",
     "new-email-address": "",
@@ -271,6 +272,7 @@
     "ago-hours": "{count, plural, one {Vor einer Stunde} other {Vor {count} Stunden}}",
     "ago-hours": "{count, plural, one {Vor einer Stunde} other {Vor {count} Stunden}}",
     "ago-minutes": "{count, plural, one {Vor einer Minute} other {Vor {count} Minuten}}",
     "ago-minutes": "{count, plural, one {Vor einer Minute} other {Vor {count} Minuten}}",
     "ago-seconds": "{count, plural, =0 {Gerade eben} one {Vor einer Sekunde} other {Vor {count} Sekunden}}",
     "ago-seconds": "{count, plural, =0 {Gerade eben} one {Vor einer Sekunde} other {Vor {count} Sekunden}}",
+    "ago-years": "",
     "duration-milliseconds": "{ms}ms",
     "duration-milliseconds": "{ms}ms",
     "duration-minutes:seconds": "{m}:{s}m",
     "duration-minutes:seconds": "{m}:{s}m",
     "duration-seconds": "{s}s",
     "duration-seconds": "{s}s",

+ 2 - 0
packages/admin-ui/src/lib/static/i18n-messages/en.json

@@ -242,6 +242,7 @@
     "history-customer-verified": "Customer verified",
     "history-customer-verified": "Customer verified",
     "history-using-external-auth-strategy": "using { strategy }",
     "history-using-external-auth-strategy": "using { strategy }",
     "history-using-native-auth-strategy": "using email address",
     "history-using-native-auth-strategy": "using email address",
+    "last-login": "Last login",
     "last-name": "Last name",
     "last-name": "Last name",
     "name": "Name",
     "name": "Name",
     "new-email-address": "New email address",
     "new-email-address": "New email address",
@@ -271,6 +272,7 @@
     "ago-hours": "{count, plural, one {1 hr} other {{count} hrs}} ago",
     "ago-hours": "{count, plural, one {1 hr} other {{count} hrs}} ago",
     "ago-minutes": "{count, plural, one {1 min} other {{count} mins}} ago",
     "ago-minutes": "{count, plural, one {1 min} other {{count} mins}} ago",
     "ago-seconds": "{count, plural, =0 {just now} one {1 sec ago} other {{count} secs ago}}",
     "ago-seconds": "{count, plural, =0 {just now} one {1 sec ago} other {{count} secs ago}}",
+    "ago-years": "",
     "duration-milliseconds": "{ms}ms",
     "duration-milliseconds": "{ms}ms",
     "duration-minutes:seconds": "{m}:{s}m",
     "duration-minutes:seconds": "{m}:{s}m",
     "duration-seconds": "{s}s",
     "duration-seconds": "{s}s",

+ 2 - 0
packages/admin-ui/src/lib/static/i18n-messages/es.json

@@ -242,6 +242,7 @@
     "history-customer-verified": "",
     "history-customer-verified": "",
     "history-using-external-auth-strategy": "",
     "history-using-external-auth-strategy": "",
     "history-using-native-auth-strategy": "",
     "history-using-native-auth-strategy": "",
+    "last-login": "",
     "last-name": "Apellidos",
     "last-name": "Apellidos",
     "name": "Nombre",
     "name": "Nombre",
     "new-email-address": "",
     "new-email-address": "",
@@ -271,6 +272,7 @@
     "ago-hours": "",
     "ago-hours": "",
     "ago-minutes": "",
     "ago-minutes": "",
     "ago-seconds": "",
     "ago-seconds": "",
+    "ago-years": "",
     "duration-milliseconds": "",
     "duration-milliseconds": "",
     "duration-minutes:seconds": "",
     "duration-minutes:seconds": "",
     "duration-seconds": "",
     "duration-seconds": "",

+ 2 - 0
packages/admin-ui/src/lib/static/i18n-messages/pl.json

@@ -242,6 +242,7 @@
     "history-customer-verified": "",
     "history-customer-verified": "",
     "history-using-external-auth-strategy": "",
     "history-using-external-auth-strategy": "",
     "history-using-native-auth-strategy": "",
     "history-using-native-auth-strategy": "",
+    "last-login": "",
     "last-name": "Nazwisko",
     "last-name": "Nazwisko",
     "name": "Nazwa",
     "name": "Nazwa",
     "new-email-address": "",
     "new-email-address": "",
@@ -271,6 +272,7 @@
     "ago-hours": "{count, plural, one {1 godzinę} other {{count} godzin}} temu",
     "ago-hours": "{count, plural, one {1 godzinę} other {{count} godzin}} temu",
     "ago-minutes": "{count, plural, one {1 minutę} other {{count} minut}} temu",
     "ago-minutes": "{count, plural, one {1 minutę} other {{count} minut}} temu",
     "ago-seconds": "{count, plural, =0 {przed chwilą} one {1 sekundę temu} other {{count} sekund temu}}",
     "ago-seconds": "{count, plural, =0 {przed chwilą} one {1 sekundę temu} other {{count} sekund temu}}",
+    "ago-years": "",
     "duration-milliseconds": "{ms}ms",
     "duration-milliseconds": "{ms}ms",
     "duration-minutes:seconds": "{m}:{s}m",
     "duration-minutes:seconds": "{m}:{s}m",
     "duration-seconds": "{s}s",
     "duration-seconds": "{s}s",

+ 2 - 0
packages/admin-ui/src/lib/static/i18n-messages/zh_Hans.json

@@ -242,6 +242,7 @@
     "history-customer-verified": "",
     "history-customer-verified": "",
     "history-using-external-auth-strategy": "",
     "history-using-external-auth-strategy": "",
     "history-using-native-auth-strategy": "",
     "history-using-native-auth-strategy": "",
+    "last-login": "",
     "last-name": "姓",
     "last-name": "姓",
     "name": "姓名",
     "name": "姓名",
     "new-email-address": "",
     "new-email-address": "",
@@ -271,6 +272,7 @@
     "ago-hours": "",
     "ago-hours": "",
     "ago-minutes": "",
     "ago-minutes": "",
     "ago-seconds": "",
     "ago-seconds": "",
+    "ago-years": "",
     "duration-milliseconds": "",
     "duration-milliseconds": "",
     "duration-minutes:seconds": "",
     "duration-minutes:seconds": "",
     "duration-seconds": "",
     "duration-seconds": "",

+ 2 - 0
packages/admin-ui/src/lib/static/i18n-messages/zh_Hant.json

@@ -242,6 +242,7 @@
     "history-customer-verified": "",
     "history-customer-verified": "",
     "history-using-external-auth-strategy": "",
     "history-using-external-auth-strategy": "",
     "history-using-native-auth-strategy": "",
     "history-using-native-auth-strategy": "",
+    "last-login": "",
     "last-name": "姓",
     "last-name": "姓",
     "name": "姓名",
     "name": "姓名",
     "new-email-address": "",
     "new-email-address": "",
@@ -271,6 +272,7 @@
     "ago-hours": "",
     "ago-hours": "",
     "ago-minutes": "",
     "ago-minutes": "",
     "ago-seconds": "",
     "ago-seconds": "",
+    "ago-years": "",
     "duration-milliseconds": "",
     "duration-milliseconds": "",
     "duration-minutes:seconds": "",
     "duration-minutes:seconds": "",
     "duration-seconds": "",
     "duration-seconds": "",

+ 1 - 1
packages/admin-ui/src/lib/static/vendure-ui-config.json

@@ -2,7 +2,7 @@
   "apiHost": "http://localhost",
   "apiHost": "http://localhost",
   "apiPort": "3000",
   "apiPort": "3000",
   "adminApiPath": "admin-api",
   "adminApiPath": "admin-api",
-  "tokenMethod": "cookie",
+  "tokenMethod": "bearer",
   "authTokenHeaderKey": "vendure-auth-token",
   "authTokenHeaderKey": "vendure-auth-token",
   "defaultLanguage": "en",
   "defaultLanguage": "en",
   "availableLanguages": ["en", "es", "zh_Hant", "zh_Hans", "pl", "de"]
   "availableLanguages": ["en", "es", "zh_Hant", "zh_Hans", "pl", "de"]