diff --git a/demo-shell/src/app/components/trashcan/trashcan.component.html b/demo-shell/src/app/components/trashcan/trashcan.component.html index 38160376d1..a684003864 100644 --- a/demo-shell/src/app/components/trashcan/trashcan.component.html +++ b/demo-shell/src/app/components/trashcan/trashcan.component.html @@ -77,7 +77,7 @@ key="archivedAt" title="DOCUMENT_LIST.COLUMNS.DELETED_ON"> - {{ value | adfTimeAgo }} + {{ value | adfTimeAgo: currentLocale }} diff --git a/demo-shell/src/app/components/trashcan/trashcan.component.ts b/demo-shell/src/app/components/trashcan/trashcan.component.ts index a7fcc17ec1..49040e2c9c 100644 --- a/demo-shell/src/app/components/trashcan/trashcan.component.ts +++ b/demo-shell/src/app/components/trashcan/trashcan.component.ts @@ -37,12 +37,17 @@ export class TrashcanComponent { documentList: DocumentListComponent; supportedPages = []; + currentLocale; constructor(private preference: UserPreferencesService) { this.preference.select(UserPreferenceValues.SupportedPageSizes) .subscribe((pages) => { this.supportedPages = pages; }); + + this.preference.select(UserPreferenceValues.Locale).subscribe((locale) => { + this.currentLocale = locale; + }); } refresh() { diff --git a/lib/content-services/document-list/data/share-datatable-adapter.spec.ts b/lib/content-services/document-list/data/share-datatable-adapter.spec.ts index 39d5eb234e..c0e61cedd4 100644 --- a/lib/content-services/document-list/data/share-datatable-adapter.spec.ts +++ b/lib/content-services/document-list/data/share-datatable-adapter.spec.ts @@ -108,46 +108,6 @@ describe('ShareDataTableAdapter', () => { expect(check).toThrowError(adapter.ERR_COL_NOT_FOUND); }); - it('should covert cell value to formatted date', () => { - let rawValue = new Date(2015, 6, 15, 21, 43, 11); // Wed Jul 15 2015 21:43:11 GMT+0100 (BST); - let dateValue = 'Jul 15, 2015, 9:43:11 PM'; - - let file = new FileNode(); - file.entry.createdAt = rawValue; - - let col = { - key: 'createdAt', - type: 'date', - format: 'medium' // Jul 15, 2015, 9:43:11 PM - }; - - let row = new ShareDataRow(file, documentListService, null); - let adapter = new ShareDataTableAdapter(documentListService, null); - - let value = adapter.getValue(row, col); - expect(value).toBe(dateValue); - }); - - it('should use default date format as fallback', () => { - let rawValue = new Date(2015, 6, 15, 21, 43, 11); // Wed Jul 15 2015 21:43:11 GMT+0100 (BST); - let dateValue = 'Jul 15, 2015, 9:43:11 PM'; - - let file = new FileNode(); - file.entry.createdAt = rawValue; - - let col = { - key: 'createdAt', - type: 'date', - format: null - }; - - let row = new ShareDataRow(file, documentListService, null); - let adapter = new ShareDataTableAdapter(documentListService, null); - - let value = adapter.getValue(row, col); - expect(value).toBe(dateValue); - }); - it('should return date value as string', () => { let rawValue = new Date(2015, 6, 15, 21, 43, 11); // Wed Jul 15 2015 21:43:11 GMT+0100 (BST); @@ -166,26 +126,6 @@ describe('ShareDataTableAdapter', () => { expect(value).toBe(rawValue); }); - it('should log error when having date conversion issues', () => { - let dateValue = {}; - let file = new FileNode(); - file.entry.createdAt = dateValue; - - let col = { - key: 'createdAt', - type: 'date', - format: 'medium' - }; - - let row = new ShareDataRow(file, documentListService, null); - let adapter = new ShareDataTableAdapter(documentListService, null); - spyOn(console, 'error').and.stub(); - - let value = adapter.getValue(row, col); - expect(value).toBe('Error'); - expect(console.error).toHaveBeenCalled(); - }); - it('should generate fallback icon for a file thumbnail with missing mime type', () => { spyOn(documentListService, 'getDefaultMimeTypeIcon').and.returnValue(`assets/images/ft_ic_miscellaneouse.svg`); diff --git a/lib/content-services/document-list/data/share-datatable-adapter.ts b/lib/content-services/document-list/data/share-datatable-adapter.ts index 0faded42e5..694ffc0c26 100644 --- a/lib/content-services/document-list/data/share-datatable-adapter.ts +++ b/lib/content-services/document-list/data/share-datatable-adapter.ts @@ -16,8 +16,6 @@ */ import { DataColumn, DataRow, DataSorting, DataTableAdapter } from '@alfresco/adf-core'; -import { TimeAgoPipe } from '@alfresco/adf-core'; -import { DatePipe } from '@angular/common'; import { NodePaging } from 'alfresco-js-api'; import { PermissionStyleModel } from './../models/permissions-style.model'; import { DocumentListService } from './../services/document-list.service'; @@ -78,16 +76,6 @@ export class ShareDataTableAdapter implements DataTableAdapter { return dataRow.cache[col.key]; } - if (col.type === 'date') { - try { - const result = this.formatDate(col, value); - return dataRow.cacheValue(col.key, result); - } catch (err) { - console.error(`Error parsing date ${value} to format ${col.format}`); - return 'Error'; - } - } - if (col.key === '$thumbnail') { if (this.imageResolver) { @@ -132,21 +120,6 @@ export class ShareDataTableAdapter implements DataTableAdapter { return dataRow.cacheValue(col.key, value); } - formatDate(col: DataColumn, value: any): string { - if (col.type === 'date') { - const format = col.format || 'medium'; - if (format === 'timeAgo') { - const timeAgoPipe = new TimeAgoPipe(); - return timeAgoPipe.transform(value); - } else { - const datePipe = new DatePipe('en-US'); - return datePipe.transform(value, format); - } - } - - return value; - } - getSorting(): DataSorting { return this.sorting; } diff --git a/lib/core/datatable/components/datatable/datatable.component.html b/lib/core/datatable/components/datatable/datatable.component.html index d185c16a70..cf825b9a65 100644 --- a/lib/core/datatable/components/datatable/datatable.component.html +++ b/lib/core/datatable/components/datatable/datatable.component.html @@ -107,7 +107,7 @@ {{ data.getValue(row, col) }}
+ [attr.data-automation-id]="'date_' + (data.getValue(row, col) | date: 'medium') "> - {{value}} + + {{ value | adfTimeAgo: currentLocale }} + + + + {{ value | date:'medium' }} + + `, encapsulation: ViewEncapsulation.None, host: { class: 'adf-date-cell' } }) -export class DateCellComponent extends DataTableCellComponent {} +export class DateCellComponent extends DataTableCellComponent { + + currentLocale; + + constructor(userPreferenceService: UserPreferencesService) { + super(); + + userPreferenceService.select(UserPreferenceValues.Locale).subscribe((locale) => { + this.currentLocale = locale; + }); + } + +} diff --git a/lib/core/datatable/data/object-datatable-adapter.ts b/lib/core/datatable/data/object-datatable-adapter.ts index 7fbd5ab71b..dc737be03f 100644 --- a/lib/core/datatable/data/object-datatable-adapter.ts +++ b/lib/core/datatable/data/object-datatable-adapter.ts @@ -15,9 +15,6 @@ * limitations under the License. */ -import { DatePipe } from '@angular/common'; - -import { TimeAgoPipe } from '../../pipes'; import { DataColumn } from './data-column.model'; import { DataRow } from './data-row.model'; import { ObjectDataRow } from './object-datarow.model'; @@ -107,14 +104,6 @@ export class ObjectDataTableAdapter implements DataTableAdapter { let value = row.getValue(col.key); - if (col.type === 'date') { - try { - return this.formatDate(col, value); - } catch (err) { - console.error(`Error parsing date ${value} to format ${col.format}`); - } - } - if (col.type === 'icon') { const icon = row.getValue(col.key); return icon; @@ -123,21 +112,6 @@ export class ObjectDataTableAdapter implements DataTableAdapter { return value; } - formatDate(col: DataColumn, value: any): string { - if (col.type === 'date') { - const format = col.format || 'medium'; - if (format === 'timeAgo') { - const timeAgoPipe = new TimeAgoPipe(); - return timeAgoPipe.transform(value); - } else { - const datePipe = new DatePipe('en-US'); - return datePipe.transform(value, format); - } - } - - return value; - } - getSorting(): DataSorting { return this._sorting; } diff --git a/lib/core/pipes/time-ago.pipe.spec.ts b/lib/core/pipes/time-ago.pipe.spec.ts index 408ad750a5..9676488a24 100644 --- a/lib/core/pipes/time-ago.pipe.spec.ts +++ b/lib/core/pipes/time-ago.pipe.spec.ts @@ -16,14 +16,15 @@ */ import { TimeAgoPipe } from './time-ago.pipe'; +import { async } from '@angular/core/testing'; describe('TimeAgoPipe', () => { let pipe: TimeAgoPipe; - beforeEach(() => { + beforeEach(async(() => { pipe = new TimeAgoPipe(); - }); + })); it('should return time difference for a given date', () => { let date = new Date(); @@ -39,4 +40,13 @@ describe('TimeAgoPipe', () => { expect(pipe.transform(null)).toBe(''); expect(pipe.transform(undefined)).toBe(''); }); + + describe('When a locale is given', () => { + + it('should return a localised message', async(() => { + let date = new Date(); + const transformedDate = pipe.transform(date, 'de'); + expect(transformedDate).toBe('vor ein paar Sekunden'); + })); + }); }); diff --git a/lib/core/pipes/time-ago.pipe.ts b/lib/core/pipes/time-ago.pipe.ts index d412ffc774..866677ff21 100644 --- a/lib/core/pipes/time-ago.pipe.ts +++ b/lib/core/pipes/time-ago.pipe.ts @@ -16,7 +16,6 @@ */ import moment from 'moment-es6'; - import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ @@ -24,11 +23,14 @@ import { Pipe, PipeTransform } from '@angular/core'; }) export class TimeAgoPipe implements PipeTransform { - transform(value: Date) { + defaultLocale = 'en-US'; + + transform(value: Date, locale?: string) { if (value !== null && value !== undefined ) { + const actualLocale = locale ? locale : this.defaultLocale; const then = moment(value); - const diff = moment().diff(then, 'days'); - return diff > 7 ? then.format('DD/MM/YYYY HH:mm') : then.fromNow(); + const diff = moment().locale(actualLocale).diff(then, 'days'); + return diff > 7 ? then.locale(actualLocale).format('DD/MM/YYYY HH:mm') : then.locale(actualLocale).fromNow(); } return ''; }