From 135b3b4b5137a358f2af7691ed3751de5eebe2d5 Mon Sep 17 00:00:00 2001 From: Denys Vuika Date: Tue, 9 Apr 2024 13:13:57 -0400 Subject: [PATCH] [ACS-7462] cleanup deprecated api for DataTable and DocumentList (#9500) * refactor: cleanup gallery mode from DataTable/DocumentList * refactor: cleanup gallery mode from DataTable/DocumentList * refactor: cleanup gallery mode from DataTable/DocumentList [ci:force] * refactor: remove unused api [ci:force] * refactor: remove unused api [ci:force] * refactor: update and fix documentation [ci:force] * refactor: restore thumbnails, docs fixes [ci:force] * fix package lock --- .../app/components/files/files.component.html | 1 - .../app/components/files/files.component.ts | 18 +- .../components/document-list.component.md | 17 - docs/core/components/datatable.component.md | 302 +++++++++--------- .../images/document-list-card-view.png | Bin 52238 -> 0 bytes .../navigable-component.interface.ts | 22 -- .../src/lib/breadcrumb/public-api.ts | 1 - .../components/document-list.component.html | 1 - .../document-list.component.spec.ts | 17 - .../components/document-list.component.ts | 11 +- .../datatable/datatable.component.html | 32 +- .../datatable/datatable.component.scss | 138 -------- .../datatable/datatable.component.spec.ts | 46 +-- .../datatable/datatable.component.stories.ts | 41 ++- .../datatable/datatable.component.ts | 62 +--- package-lock.json | 3 +- 16 files changed, 210 insertions(+), 502 deletions(-) delete mode 100644 docs/docassets/images/document-list-card-view.png delete mode 100644 lib/content-services/src/lib/breadcrumb/navigable-component.interface.ts diff --git a/demo-shell/src/app/components/files/files.component.html b/demo-shell/src/app/components/files/files.component.html index 24a159af25..47815e5df6 100644 --- a/demo-shell/src/app/components/files/files.component.html +++ b/demo-shell/src/app/components/files/files.component.html @@ -99,7 +99,6 @@ [allowDropFiles]="allowDropFiles" [selectionMode]="selectionMode" [multiselect]="multiselect" - [display]="displayMode" [node]="nodeResult" [includeFields]="includeFields" [sorting]="sorting" diff --git a/demo-shell/src/app/components/files/files.component.ts b/demo-shell/src/app/components/files/files.component.ts index 935e2b9777..7ceb25b1f2 100644 --- a/demo-shell/src/app/components/files/files.component.ts +++ b/demo-shell/src/app/components/files/files.component.ts @@ -31,14 +31,7 @@ import { import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Params, Router } from '@angular/router'; import { NodeEntry, NodePaging, Pagination, Node, SearchEntry } from '@alfresco/js-api'; -import { - NotificationService, - UserPreferencesService, - PaginationComponent, - DisplayMode, - ShowHeaderMode, - FormRenderingService -} from '@alfresco/adf-core'; +import { NotificationService, UserPreferencesService, PaginationComponent, ShowHeaderMode, FormRenderingService } from '@alfresco/adf-core'; import { ContentService, FolderCreatedEvent, @@ -74,7 +67,6 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { showViewer = false; showVersions = false; allowDropFiles = true; - displayMode = DisplayMode.List; includeFields = ['isFavorite', 'isLocked', 'aspectNames', 'definition']; selectionModes = [ @@ -221,10 +213,6 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { if (params['id'] && this.currentFolderId !== params['id']) { this.currentFolderId = params['id']; } - - if (params['mode'] && params['mode'] === DisplayMode.Gallery) { - this.displayMode = DisplayMode.Gallery; - } }); } @@ -312,7 +300,7 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { } onFolderChange($event) { - this.router.navigate([this.navigationRoute, $event.value.id, 'display', this.displayMode]); + this.router.navigate([this.navigationRoute, $event.value.id]); } handlePermissionError(event: any) { @@ -507,7 +495,7 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { if (this.currentFolderId === '-my-') { this.router.navigate([this.navigationRoute, '']); } else { - this.router.navigate([this.navigationRoute, this.currentFolderId, 'display', this.displayMode]); + this.router.navigate([this.navigationRoute, this.currentFolderId]); } this.documentList.reload(); } diff --git a/docs/content-services/components/document-list.component.md b/docs/content-services/components/document-list.component.md index e6897f3f7e..f333e847e0 100644 --- a/docs/content-services/components/document-list.component.md +++ b/docs/content-services/components/document-list.component.md @@ -66,7 +66,6 @@ Displays the documents from a repository. | contentActionsPosition | `string` | "right" | Position of the content actions dropdown menu. Can be set to "left" or "right". | | contextMenuActions | `boolean` | false | Toggles context menus for each row | | currentFolderId | `string` | null | The ID of the folder node to display or a reserved string alias for special sources | -| display | `string` | DisplayMode.List | Change the display mode of the table. Can be "list" or "gallery". | | emptyFolderImageUrl | `string` | | Custom image for empty folder. Default value: './assets/images/empty_doc_lib.svg' | | filterValue | `any` | | Initial value for filter. | | headerFilters | `boolean` | false | Toggles the header filters mode. | @@ -175,22 +174,6 @@ You can use `ngIf` directives to provide conditional visibility support for the ``` -### Card view - -The Document List has an option to display items as "cards" instead of the -standard view: - -![card-view](../../docassets/images/document-list-card-view.png) - -Set the `[display]` property to "gallery" to enable card view mode: - -```html - - -``` - ### Pagination strategy The Document List by default supports 2 types of pagination: [Pagination component](../../core/components/pagination.component.md) and [Infinite pagination component](../../core/components/infinite-pagination.component.md) diff --git a/docs/core/components/datatable.component.md b/docs/core/components/datatable.component.md index d81ed66f66..44e146cfcf 100644 --- a/docs/core/components/datatable.component.md +++ b/docs/core/components/datatable.component.md @@ -26,7 +26,6 @@ See it live: [DataTable Quickstart](https://embed.plnkr.co/80qr4YFBeHjLMdAV0F6l/ - [Supplying data for the table](#supplying-data-for-the-table) - [Customizing columns](#customizing-columns) - [DataTable DOM Events](#datatable-dom-events) - - [Card view](#card-view) - [Using events](#using-events) - [Customizing the component's styles](#customizing-the-components-styles) - [Resolver Function](#resolver-function) @@ -306,7 +305,7 @@ export class FilesComponent implements OnInit { You can add [Data column component](data-column.component.md) instances to define columns for thetable as described in the usage examples and the [Customizing columns](#customizing-columns) section. ```html - + @@ -321,7 +320,7 @@ You can also supply a `` or an [Empty list component](empty-list.component.md) sub-component to show when the table is empty: ```html - + @@ -332,12 +331,12 @@ You can also supply a `` or an ``` ```html - + "'My custom Header'" "'My custom body'" "'My custom footer'" - "'HTML Layout'" + ``` @@ -346,7 +345,7 @@ Another useful transclusion is the ``, which is sh while the data for the table is loading: ```html - + @@ -360,10 +359,13 @@ while the data for the table is loading: ``` -```js +```ts +class MyComponent { isLoading(): boolean { - //your custom logic to identify if you are in a loading state + // custom logic to identify if you are in a loading state + return false; } +} ``` You can also show main menu for datatable using `` @@ -387,12 +389,12 @@ Provided template receives `let-mainMenuTrigger`, so you can programaticaly work For convenience, you can use `` which will allow you to change column visibility. -\###Styling transcluded content +### Styling transcluded content When adding your custom templates you can style them as you like. However, for an out of the box experience, if you want to apply datatable styles to your column you will need to follow this structure: ```html - + @@ -411,51 +413,50 @@ If you follow these structure you will be able to apply classes like `.adf-ellip Note that you can use both the `` and the `` together in the same datatable. -Learm more about styling your datatable: [Customizing the component's styles](#customizing-the-components-styles) +Learn more about styling your datatable: [Customizing the component's styles](#customizing-the-components-styles) ## Class members ### Properties -| Name | Type | Default value | Description | -| ---- | ---- | ------------- | ----------- | -| actions | `boolean` | false | Toggles the data actions column. | -| actionsPosition | `string` | "right" | Position of the actions dropdown menu. Can be "left" or "right". | -| actionsVisibleOnHover | `boolean` | false | Toggles whether the actions dropdown should only be visible if the row is hovered over or the dropdown menu is open. | -| allowFiltering | `boolean` | false | Flag that indicate if the datatable allow the use [facet widget](../../../lib/content-services/src/lib/search/models/facet-widget.interface.ts) search for filtering. | -| blurOnResize | `boolean` | true | Toggles blur when columns of the datatable are being resized. | -| columns | `any[]` | \[] | The columns that the datatable will show. | -| contextMenu | `boolean` | false | Toggles custom context menu for the component. | -| data | [`DataTableAdapter`](../../../lib/core/src/lib/datatable/data/datatable-adapter.ts) | | Data source for the table | -| display | `string` | DisplayMode.List | Selects the display mode of the table. Can be "list" or "gallery". | -| fallbackThumbnail | `string` | | Fallback image for rows where the thumbnail is missing. | -| isResizingEnabled | `boolean` | false | Flag that indicates if the datatable allows column resizing. | -| loading | `boolean` | false | Flag that indicates if the datatable is in loading state and needs to show the loading template (see the docs to learn how to configure a loading template). | -| mainTableAction | `boolean` | true | Toggles main data table action column. | -| multiselect | `boolean` | false | Toggles multiple row selection, which renders checkboxes at the beginning of each row. | -| noPermission | `boolean` | false | Flag that indicates if the datatable should show the "no permission" template. | -| resolverFn | `Function` | null | Custom resolver function which is used to parse dynamic column objects see the docs to learn how to configure a resolverFn. | -| rowMenuCacheEnabled | `boolean` | true | Should the items for the row actions menu be cached for reuse after they are loaded the first time? | -| rowStyle | `Function` | | The inline style to apply to every row. See [NgStyle](https://angular.io/docs/ts/latest/api/common/index/NgStyle-directive.html) docs for more details and usage examples. | -| rowStyleClass | `string` | "" | The CSS class to apply to every row. | -| rows | `any[]` | \[] | The rows that the datatable will show. | -| selectionMode | `string` | "single" | Row selection mode. Can be none, `single` or `multiple`. For `multiple` mode, you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for multiple rows. | -| showHeader | `ShowHeaderMode` | | Toggles the header. | -| showMainDatatableActions | `boolean` | false | Toggles the main datatable action. | -| sorting | `any[]` | \[] | Define the sort order of the datatable. Possible values are : [`created`, `desc`], [`created`, `asc`], [`due`, `desc`], [`due`, `asc`] | -| stickyHeader | `boolean` | false | Toggles the sticky header mode. | +| Name | Type | Default value | Description | +|--------------------------|-------------------------------------------------------------------------------------|---------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| actions | `boolean` | false | Toggles the data actions column. | +| actionsPosition | `string` | "right" | Position of the actions dropdown menu. Can be "left" or "right". | +| actionsVisibleOnHover | `boolean` | false | Toggles whether the actions dropdown should only be visible if the row is hovered over or the dropdown menu is open. | +| allowFiltering | `boolean` | false | Flag that indicate if the datatable allow the use [facet widget](../../../lib/content-services/src/lib/search/models/facet-widget.interface.ts) search for filtering. | +| blurOnResize | `boolean` | true | Toggles blur when columns of the datatable are being resized. | +| columns | `any[]` | \[] | The columns that the datatable will show. | +| contextMenu | `boolean` | false | Toggles custom context menu for the component. | +| data | [`DataTableAdapter`](../../../lib/core/src/lib/datatable/data/datatable-adapter.ts) | | Data source for the table | +| fallbackThumbnail | `string` | | Fallback image for rows where the thumbnail is missing. | +| isResizingEnabled | `boolean` | false | Flag that indicates if the datatable allows column resizing. | +| loading | `boolean` | false | Flag that indicates if the datatable is in loading state and needs to show the loading template (see the docs to learn how to configure a loading template). | +| mainTableAction | `boolean` | true | Toggles main data table action column. | +| multiselect | `boolean` | false | Toggles multiple row selection, which renders checkboxes at the beginning of each row. | +| noPermission | `boolean` | false | Flag that indicates if the datatable should show the "no permission" template. | +| resolverFn | `Function` | null | Custom resolver function which is used to parse dynamic column objects see the docs to learn how to configure a resolverFn. | +| rowMenuCacheEnabled | `boolean` | true | Should the items for the row actions menu be cached for reuse after they are loaded the first time? | +| rowStyle | `Function` | | The inline style to apply to every row. See [NgStyle](https://angular.io/docs/ts/latest/api/common/index/NgStyle-directive.html) docs for more details and usage examples. | +| rowStyleClass | `string` | "" | The CSS class to apply to every row. | +| rows | `any[]` | \[] | The rows that the datatable will show. | +| selectionMode | `string` | "single" | Row selection mode. Can be none, `single` or `multiple`. For `multiple` mode, you can use Cmd (macOS) or Ctrl (Win) modifier key to toggle selection for multiple rows. | +| showHeader | `ShowHeaderMode` | | Toggles the header. | +| showMainDatatableActions | `boolean` | false | Toggles the main datatable action. | +| sorting | `any[]` | \[] | Define the sort order of the datatable. Possible values are : [`created`, `desc`], [`created`, `asc`], [`due`, `desc`], [`due`, `asc`] | +| stickyHeader | `boolean` | false | Toggles the sticky header mode. | ### Events -| Name | Type | Description | -| ---- | ---- | ----------- | -| columnOrderChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataColumn`](../../../lib/core/src/lib/datatable/data/data-column.model.ts)`<>[]>` | Emitted when the column order is changed. | -| columnsWidthChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataColumn`](../../../lib/core/src/lib/datatable/data/data-column.model.ts)`<>[]>` | Emitted when the column width is changed. | -| executeRowAction | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataRowActionEvent`](../../../lib/core/src/lib/datatable/components/data-row-action.event.ts)`>` | Emitted when the user executes a row action. | -| rowClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataRowEvent`](../../../lib/core/src/lib/datatable/data/data-row-event.model.ts)`>` | Emitted when the user clicks a row. | -| rowDblClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataRowEvent`](../../../lib/core/src/lib/datatable/data/data-row-event.model.ts)`>` | Emitted when the user double-clicks a row. | -| showRowActionsMenu | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataCellEvent`](../../../lib/core/src/lib/datatable/components/data-cell.event.ts)`>` | Emitted before the actions menu is displayed for a row. | -| showRowContextMenu | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataCellEvent`](../../../lib/core/src/lib/datatable/components/data-cell.event.ts)`>` | Emitted before the context menu is displayed for a row. | +| Name | Type | Description | +|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------| +| columnOrderChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataColumn`](../../../lib/core/src/lib/datatable/data/data-column.model.ts)`<>[]>` | Emitted when the column order is changed. | +| columnsWidthChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataColumn`](../../../lib/core/src/lib/datatable/data/data-column.model.ts)`<>[]>` | Emitted when the column width is changed. | +| executeRowAction | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataRowActionEvent`](../../../lib/core/src/lib/datatable/components/data-row-action.event.ts)`>` | Emitted when the user executes a row action. | +| rowClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataRowEvent`](../../../lib/core/src/lib/datatable/data/data-row-event.model.ts)`>` | Emitted when the user clicks a row. | +| rowDblClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataRowEvent`](../../../lib/core/src/lib/datatable/data/data-row-event.model.ts)`>` | Emitted when the user double-clicks a row. | +| showRowActionsMenu | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataCellEvent`](../../../lib/core/src/lib/datatable/components/data-cell.event.ts)`>` | Emitted before the actions menu is displayed for a row. | +| showRowContextMenu | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataCellEvent`](../../../lib/core/src/lib/datatable/components/data-cell.event.ts)`>` | Emitted before the context menu is displayed for a row. | ## Details @@ -477,27 +478,29 @@ for more information. Below are the DOM events emitted by the DataTable component. These events bubble up the component tree and can be handled by any parent component. -| Name | Description | -| ---- | ----------- | -| row-click | Raised when user clicks a row | -| row-dblclick | Raised when user double-clicks a row | -| row-select | Raised after user selects a row | -| row-unselect | Raised after user unselects a row | -| row-keyup | Raised on the 'keyup' event for the focused row. | +| Name | Description | +|-----------------|------------------------------------------------------| +| row-click | Raised when user clicks a row | +| row-dblclick | Raised when user double-clicks a row | +| row-select | Raised after user selects a row | +| row-unselect | Raised after user unselects a row | +| row-keyup | Raised on the 'keyup' event for the focused row. | | sorting-changed | Raised after user clicks the sortable column header. | -| header-dragover | Raised when dragging content over the header. | -| header-drop | Raised when data is dropped on the column header. | -| cell-dragover | Raised when dragging data over the cell. | -| cell-drop | Raised when data is dropped on the column cell. | +| header-dragover | Raised when dragging content over the header. | +| header-drop | Raised when data is dropped on the column header. | +| cell-dragover | Raised when dragging data over the cell. | +| cell-drop | Raised when data is dropped on the column cell. | #### Sorting-changed sorting-changed event contains ```ts -direction: "asc" -key: "timestamp" -sortingKey: "" +{ + direction: "asc" + key: "timestamp" + sortingKey: "" +} ``` #### Drop Events @@ -540,16 +543,18 @@ Given that DataTable raises bubbling DOM events, you can handle drop behavior fr Where the implementation of the handlers can look like following: ```ts -onDragOver(event: CustomEvent) { - // always needed for custom drop handlers (!) - event.preventDefault(); -} +class MyComponent { + onDragOver(event: CustomEvent) { + // always needed for custom drop handlers (!) + event.preventDefault(); + } -onDrop(event: DataTableDropEvent) { - event.preventDefault(); + onDrop(event: DataTableDropEvent) { + event.preventDefault(); - const { column, row, target } = event.detail; - // do something with the details + const { column, row, target } = event.detail; + // do something with the details + } } ``` @@ -564,26 +569,15 @@ onDrop(event: DataTableDropEvent) { ``` ```ts -onRowClick(event) { - console.log(event); +class MyComponent { + onRowClick(event) { + console.log(event); + } } ``` ![](../../docassets/images/datatable-dom-events.png) -### Card view - -Set the `display` property to "gallery" to enable Card View mode: - -```html - - `name - ${users[index].firstName} ${users[index].lastName} status: ${status}` ).toString(); + return (value || []).map((status, index) => `name - ${users[index].firstName} ${users[index].lastName} status: ${status}`).toString(); } return value; } +} ``` ```html @@ -919,9 +923,11 @@ here is the sample resolver which merge the users property and status and it wil You can define the tooltip format for cells of type date using a configuration in `app.config.json`: ```json - "dateValues": { - "defaultTooltipDateFormat": "medium" - } +{ + "dateValues": { + "defaultTooltipDateFormat": "medium" + } +} ``` ## See also diff --git a/docs/docassets/images/document-list-card-view.png b/docs/docassets/images/document-list-card-view.png deleted file mode 100644 index d0ca556d04d01762852df946704beed92fcf613f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52238 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 F{|8`s<7NN= diff --git a/lib/content-services/src/lib/breadcrumb/navigable-component.interface.ts b/lib/content-services/src/lib/breadcrumb/navigable-component.interface.ts deleted file mode 100644 index d1eda45b39..0000000000 --- a/lib/content-services/src/lib/breadcrumb/navigable-component.interface.ts +++ /dev/null @@ -1,22 +0,0 @@ -/*! - * @license - * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Licensed 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 { Node } from '@alfresco/js-api'; - -export interface NavigableComponentInterface { - navigateTo(node: Node | string); -} diff --git a/lib/content-services/src/lib/breadcrumb/public-api.ts b/lib/content-services/src/lib/breadcrumb/public-api.ts index fb2941af43..5d5b39789b 100644 --- a/lib/content-services/src/lib/breadcrumb/public-api.ts +++ b/lib/content-services/src/lib/breadcrumb/public-api.ts @@ -17,6 +17,5 @@ export * from './breadcrumb.component'; export * from './dropdown-breadcrumb.component'; -export * from './navigable-component.interface'; export * from './breadcrumb.module'; diff --git a/lib/content-services/src/lib/document-list/components/document-list.component.html b/lib/content-services/src/lib/document-list/components/document-list.component.html index c19c66a860..ddf4c35d29 100644 --- a/lib/content-services/src/lib/document-list/components/document-list.component.html +++ b/lib/content-services/src/lib/document-list/components/document-list.component.html @@ -10,7 +10,6 @@ [rowStyleClass]="rowStyleClass" [showMainDatatableActions]="true" [loading]="loading" - [display]="display" [noPermission]="noPermission" [showHeader]="showHeader" [rowMenuCacheEnabled]="false" diff --git a/lib/content-services/src/lib/document-list/components/document-list.component.spec.ts b/lib/content-services/src/lib/document-list/components/document-list.component.spec.ts index 25dc7bf91e..f971a23f56 100644 --- a/lib/content-services/src/lib/document-list/components/document-list.component.spec.ts +++ b/lib/content-services/src/lib/document-list/components/document-list.component.spec.ts @@ -364,23 +364,6 @@ describe('DocumentList', () => { expect(documentList.resetSelection).toHaveBeenCalled(); }); - it('should use the cardview style if cardview is true', () => { - documentList.display = 'gallery'; - - fixture.detectChanges(); - - expect(element.querySelector('.adf-datatable-card')).toBeDefined(); - }); - - it('should use the base document list style if cardview is false', () => { - documentList.display = 'list'; - - fixture.detectChanges(); - - expect(element.querySelector('.adf-datatable-card')).toBe(null); - expect(element.querySelector('.adf-datatable')).toBeDefined(); - }); - it('should reset selection upon reload', () => { documentList.currentFolderId = 'id-folder'; spyOn(documentList, 'resetSelection').and.callThrough(); diff --git a/lib/content-services/src/lib/document-list/components/document-list.component.ts b/lib/content-services/src/lib/document-list/components/document-list.component.ts index 18319ec43d..800e5b9def 100644 --- a/lib/content-services/src/lib/document-list/components/document-list.component.ts +++ b/lib/content-services/src/lib/document-list/components/document-list.component.ts @@ -41,7 +41,6 @@ import { DataRowActionEvent, DataSorting, DataTableComponent, - DisplayMode, ShowHeaderMode, PaginatedComponent, AppConfigService, @@ -61,7 +60,6 @@ import { DataColumn } from '@alfresco/adf-core'; import { NodesApiService } from '../../common/services/nodes-api.service'; - import { Node, NodeEntry, NodePaging, NodesApi, Pagination } from '@alfresco/js-api'; import { Subject, BehaviorSubject, of } from 'rxjs'; import { ShareDataRow } from './../data/share-data-row.model'; @@ -70,7 +68,6 @@ import { presetsDefaultModel } from '../models/preset.model'; import { ContentActionModel } from './../models/content-action.model'; import { PermissionStyleModel } from './../models/permissions-style.model'; import { NodeEntityEvent, NodeEntryEvent } from './node.event'; -import { NavigableComponentInterface } from '../../breadcrumb/navigable-component.interface'; import { FilterSearch } from './../../search/models/filter-search.interface'; import { RowFilter } from '../data/row-filter.model'; import { DocumentListService } from '../services/document-list.service'; @@ -97,7 +94,7 @@ const BYTES_TO_MB_CONVERSION_VALUE = 1048576; encapsulation: ViewEncapsulation.None, host: { class: 'adf-document-list' } }) -export class DocumentListComponent extends DataTableSchema implements OnInit, OnChanges, OnDestroy, AfterContentInit, PaginatedComponent, NavigableComponentInterface { +export class DocumentListComponent extends DataTableSchema implements OnInit, OnChanges, OnDestroy, AfterContentInit, PaginatedComponent { static SINGLE_CLICK_NAVIGATION: string = 'click'; static DOUBLE_CLICK_NAVIGATION: string = 'dblclick'; @@ -133,10 +130,6 @@ export class DocumentListComponent extends DataTableSchema implements OnInit, On @Input() where: string; - /** Change the display mode of the table. Can be "list" or "gallery". */ - @Input() - display: string = DisplayMode.List; - /** * Define a set of CSS styles to apply depending on the permission * of the user on that node. See the Permission Style model @@ -479,7 +472,6 @@ export class DocumentListComponent extends DataTableSchema implements OnInit, On return defaultSorting; } - isMobile(): boolean { return !!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); } @@ -976,7 +968,6 @@ export class DocumentListComponent extends DataTableSchema implements OnInit, On return canNavigateFolder; } - private onDataReady(nodePaging: NodePaging) { this.ready.emit(nodePaging); this.pagination.next(nodePaging.list.pagination); diff --git a/lib/core/src/lib/datatable/components/datatable/datatable.component.html b/lib/core/src/lib/datatable/components/datatable/datatable.component.html index 4976da60fa..63f39b4c38 100644 --- a/lib/core/src/lib/datatable/components/datatable/datatable.component.html +++ b/lib/core/src/lib/datatable/components/datatable/datatable.component.html @@ -1,8 +1,7 @@
@@ -14,7 +13,6 @@ data-automation-id="datatable-row-header" [disabled]="!isHeaderVisible()" class="adf-datatable-row" - *ngIf="display === 'list'" role="row"> @@ -143,17 +141,6 @@
- - - - {{ col.title | translate}} - - -
-
+
-
-
+ class="adf-datatable-row adf-no-permission__row">
-
+
{ expect(dataTable.data.setColumns).toHaveBeenCalled(); })); - it('should use the cardview style if cardview is true', () => { - const newData = new ObjectDataTableAdapter([{ name: '1' }, { name: '2' }], [new ObjectDataColumn({ key: 'name' })]); - - dataTable.display = 'gallery'; - dataTable.ngOnChanges({ - data: new SimpleChange(null, newData, false) - }); - - fixture.detectChanges(); - - expect(element.querySelector('.adf-datatable-card')).not.toBeNull(); - expect(element.querySelector('.adf-datatable')).toBeNull(); - }); - it('should use the cardview style if cardview is false', () => { const newData = new ObjectDataTableAdapter([{ name: '1' }, { name: '2' }], [new ObjectDataColumn({ key: 'name' })]); @@ -299,22 +285,28 @@ describe('DataTable', () => { it('should sortPredicate from CdkDropList return true if column is enabled', () => { const dropList = getDropList(); - spyOn(dropList, 'getSortedItems').and.returnValue([{ - disabled: true - }, { - disabled: false - }] as CdkDrag[]); + spyOn(dropList, 'getSortedItems').and.returnValue([ + { + disabled: true + }, + { + disabled: false + } + ] as CdkDrag[]); expect(dropList.sortPredicate(1, undefined, dropList)).toBeTrue(); }); it('should sortPredicate from CdkDropList return false if column is disabled', () => { const dropList = getDropList(); - spyOn(dropList, 'getSortedItems').and.returnValue([{ - disabled: true - }, { - disabled: true - }] as CdkDrag[]); + spyOn(dropList, 'getSortedItems').and.returnValue([ + { + disabled: true + }, + { + disabled: true + } + ] as CdkDrag[]); expect(dropList.sortPredicate(1, undefined, dropList)).toBeFalse(); }); @@ -955,12 +947,6 @@ describe('DataTable', () => { expect(dataTable.asIconValue(row, column)).toBe(null); }); - it('should parse icon values to a valid i18n key', () => { - expect(dataTable.iconAltTextKey('custom')).toBe('ICONS.custom'); - expect(dataTable.iconAltTextKey('/path/to/custom')).toBe('ICONS.custom'); - expect(dataTable.iconAltTextKey('/path/to/custom.svg')).toBe('ICONS.custom'); - }); - it('should require column and direction to evaluate sorting state', () => { expect(dataTable.isColumnSorted(null, null)).toBeFalsy(); expect(dataTable.isColumnSorted({} as DataColumn, null)).toBeFalsy(); diff --git a/lib/core/src/lib/datatable/components/datatable/datatable.component.stories.ts b/lib/core/src/lib/datatable/components/datatable/datatable.component.stories.ts index 2da1bbeea5..19d69294aa 100644 --- a/lib/core/src/lib/datatable/components/datatable/datatable.component.stories.ts +++ b/lib/core/src/lib/datatable/components/datatable/datatable.component.stories.ts @@ -29,13 +29,7 @@ export default { title: 'Core/Datatable/Datatable', decorators: [ moduleMetadata({ - imports: [ - CoreStoryModule, - DataTableModule, - MatProgressSpinnerModule, - BrowserAnimationsModule, - RouterTestingModule - ] + imports: [CoreStoryModule, DataTableModule, MatProgressSpinnerModule, BrowserAnimationsModule, RouterTestingModule] }) ], argTypes: { @@ -136,9 +130,7 @@ export default { sorting: { control: 'object', defaultValue: ['id', 'asc'], - description: 'A string array.\n\n' + - 'First element describes the key to sort by.\n\n' + - 'Second element describes the sorting order.', + description: 'A string array.\n\n' + 'First element describes the key to sort by.\n\n' + 'Second element describes the sorting order.', table: { type: { summary: 'any[]' }, defaultValue: { summary: '[]' } @@ -149,11 +141,27 @@ export default { description: 'The columns that the datatable will show.', defaultValue: [ { type: 'text', key: 'id', title: 'Id', sortable: true }, - { type: 'text', key: 'textCol', title: 'Text Column', sortable: true, draggable: true, cssClass: 'adf-ellipsis-cell', copyContent: true }, + { + type: 'text', + key: 'textCol', + title: 'Text Column', + sortable: true, + draggable: true, + cssClass: 'adf-ellipsis-cell', + copyContent: true + }, { type: 'image', key: 'imageCol', title: 'Image Column', draggable: true, cssClass: 'adf-ellipsis-cell' }, { type: 'icon', key: 'iconCol', title: 'Icon Column', draggable: true, cssClass: 'adf-ellipsis-cell' }, { type: 'date', key: 'dateCol', title: 'Date Column', sortable: true, draggable: true, cssClass: 'adf-ellipsis-cell' }, - { type: 'date', key: 'dateCol', title: 'Date Time Ago Column', sortable: true, draggable: true, cssClass: 'adf-ellipsis-cell', dateConfig: { format: 'timeAgo' } }, + { + type: 'date', + key: 'dateCol', + title: 'Date Time Ago Column', + sortable: true, + draggable: true, + cssClass: 'adf-ellipsis-cell', + dateConfig: { format: 'timeAgo' } + }, { type: 'fileSize', key: 'fileSizeCol', title: 'File Size Column', sortable: true, draggable: true, cssClass: 'adf-ellipsis-cell' }, { type: 'location', format: '/files', key: 'locationCol', title: 'Location Column', draggable: true, cssClass: 'adf-ellipsis-cell' }, { type: 'boolean', key: 'booleanCol', title: 'Boolean Column', draggable: true, cssClass: 'adf-ellipsis-cell' }, @@ -257,7 +265,8 @@ export default { }, rowStyle: { control: 'object', - description: 'The inline style to apply to every row. See [NgStyle](https://angular.io/docs/ts/latest/api/common/index/NgStyle-directive.html) docs for more details and usage examples.', + description: + 'The inline style to apply to every row. See [NgStyle](https://angular.io/docs/ts/latest/api/common/index/NgStyle-directive.html) docs for more details and usage examples.', table: { category: 'Custom Row Styles', type: { summary: '{ [key: string]: any }' } @@ -365,9 +374,8 @@ export default { } } as Meta; -const insertContentToTemplate = (content: string): string => ( +const insertContentToTemplate = (content: string): string => ` ( (columnOrderChanged)=columnOrderChanged($event) > ${content} - ` -); + `; export const defaultDatatable: Story = (args: DataTableComponent) => ({ props: args, diff --git a/lib/core/src/lib/datatable/components/datatable/datatable.component.ts b/lib/core/src/lib/datatable/components/datatable/datatable.component.ts index c0a520485b..66633f8df5 100644 --- a/lib/core/src/lib/datatable/components/datatable/datatable.component.ts +++ b/lib/core/src/lib/datatable/components/datatable/datatable.component.ts @@ -62,12 +62,6 @@ import { MatIconRegistry } from '@angular/material/icon'; import { DomSanitizer } from '@angular/platform-browser'; import { ResizeEvent } from '../../directives/resizable/types'; -// eslint-disable-next-line no-shadow -export enum DisplayMode { - List = 'list', - Gallery = 'gallery' -} - // eslint-disable-next-line no-shadow export enum ShowHeaderMode { Never = 'never', @@ -95,10 +89,6 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, @Input() data: DataTableAdapter; - /** Selects the display mode of the table. Can be "list" or "gallery". */ - @Input() - display: string = DisplayMode.List; - /** The rows that the datatable will show. */ @Input() rows: any[] = []; @@ -241,8 +231,8 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, /** * Flag that indicates if the datatable should be blurred when resizing. */ - @Input() - blurOnResize = true; + @Input() + blurOnResize = true; headerFilterTemplate: TemplateRef; noContentTemplate: TemplateRef; @@ -259,9 +249,6 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, hoveredHeaderColumnIndex = -1; resizingColumnIndex = -1; - /** This array of fake rows fix the flex layout for the gallery view */ - fakeRows = []; - private keyManager: FocusKeyManager; private clickObserver: Observer; private click$: Observable; @@ -299,7 +286,6 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, }) ); } - this.datatableLayoutFix(); this.setTableSchema(); } @@ -347,10 +333,6 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, if (this.isPropertyChanged(changes['sorting'])) { this.setTableSorting(changes['sorting'].currentValue); } - - if (this.isPropertyChanged(changes['display'])) { - this.datatableLayoutFix(); - } } isColumnSortActive(column: DataColumn): boolean { @@ -514,7 +496,7 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, } if (row) { - const rowIndex = this.data.getRows().indexOf(row) + (this.isHeaderListVisible() ? 1 : 0); + const rowIndex = this.data.getRows().indexOf(row) + (this.isHeaderVisible() ? 1 : 0); this.keyManager.setActiveItem(rowIndex); const dataRowEvent = new DataRowEvent(row, mouseEvent, this); @@ -528,10 +510,6 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, } } - private isHeaderListVisible(): boolean { - return this.isHeaderVisible() && this.display === DisplayMode.List; - } - private handleRowSelection(row: DataRow, e: KeyboardEvent | MouseEvent) { if (this.data) { if (this.isSingleSelectionMode()) { @@ -726,10 +704,6 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, return null; } - iconAltTextKey(value: string): string { - return value ? 'ICONS.' + value.substring(value.lastIndexOf('/') + 1).replace(/\.[a-z]+/, '') : ''; - } - isColumnSorted(col: DataColumn, direction: string): boolean { if (col && direction) { const sorting = this.data.getSorting(); @@ -779,10 +753,6 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, return row.isDropTarget === true; } - hasSelectionMode(): boolean { - return this.isSingleSelectionMode() || this.isMultiSelectionMode(); - } - isSingleSelectionMode(): boolean { return this.selectionMode && this.selectionMode.toLowerCase() === 'single'; } @@ -811,14 +781,6 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, } } - getSortingKey(): string | null { - if (this.data.getSorting()) { - return this.data.getSorting().key; - } - - return null; - } - selectRow(row: DataRow, value: boolean) { if (row) { row.isSelected = value; @@ -909,18 +871,6 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, } } - private datatableLayoutFix() { - const maxGalleryRows = 25; - - if (this.display === 'gallery') { - for (let i = 0; i < maxGalleryRows; i++) { - this.fakeRows.push(''); - } - } else { - this.fakeRows = []; - } - } - getNameColumnValue() { return this.data.getColumns().find((el: any) => el.key.includes('name')); } @@ -1005,10 +955,8 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, } private isSortingEqual(col: DataColumn, direction: string, sorting: DataSorting): boolean { - return sorting && - (sorting.key === col.key || sorting.key === col.sortingKey) && - sorting.direction?.toLocaleLowerCase() === direction; - }; + return sorting && (sorting.key === col.key || sorting.key === col.sortingKey) && sorting.direction?.toLocaleLowerCase() === direction; + } get isResizing(): boolean { return this.resizingColumnIndex >= 0; diff --git a/package-lock.json b/package-lock.json index f5a9c40164..9195359a2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -161,7 +161,8 @@ }, "lib/eslint-angular": { "name": "@alfresco/eslint-plugin-eslint-angular", - "version": "6.7.1", + "version": "6.8.0", + "dev": true, "license": "Apache-2.0" }, "node_modules/@aashutoshrathi/word-wrap": {