mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2026-09-16 18:13:06 +00:00
Compare commits
35
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3de00b8a0b | ||
|
|
c43c0aa9a0 | ||
|
|
e9e5592e95 | ||
|
|
8be3175cf2 | ||
|
|
b7ecfe6fc4 | ||
|
|
6f2255faaa | ||
|
|
fcd9d640d2 | ||
|
|
72ea94e928 | ||
|
|
9cb01e2085 | ||
|
|
33b669cf1c | ||
|
|
548592b329 | ||
|
|
d1b6da953d | ||
|
|
53b29822c1 | ||
|
|
48d96760eb | ||
|
|
02257fb552 | ||
|
|
e4b9cf3dbe | ||
|
|
36eb19de67 | ||
|
|
2417f3bba2 | ||
|
|
a5a0b555e3 | ||
|
|
b2b9cb436c | ||
|
|
10cb71291c | ||
|
|
d86a67558c | ||
|
|
5d969ccca5 | ||
|
|
63d017350d | ||
|
|
dc444cfaa4 | ||
|
|
bca4d6cb65 | ||
|
|
8d34de2ff6 | ||
|
|
af9e916056 | ||
|
|
d91fba7259 | ||
|
|
0b3101698a | ||
|
|
c070a5ee3e | ||
|
|
4c8e53d983 | ||
|
|
63fa673709 | ||
|
|
dd03ae6617 | ||
|
|
5165fd1433 |
@@ -30,7 +30,7 @@ jobs:
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@2d790406f505036ef40ecba973cc774a50395aac # v3.25.13
|
||||
uses: github/codeql-action/init@afb54ba388a7dca6ecae48f608c4ff05ff4cc77a # v3.25.15
|
||||
# Override language selection by uncommenting this and choosing your languages
|
||||
with:
|
||||
languages: javascript
|
||||
@@ -39,7 +39,7 @@ jobs:
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@2d790406f505036ef40ecba973cc774a50395aac # v3.25.13
|
||||
uses: github/codeql-action/autobuild@afb54ba388a7dca6ecae48f608c4ff05ff4cc77a # v3.25.15
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
@@ -53,4 +53,4 @@ jobs:
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@2d790406f505036ef40ecba973cc774a50395aac # v3.25.13
|
||||
uses: github/codeql-action/analyze@afb54ba388a7dca6ecae48f608c4ff05ff4cc77a # v3.25.15
|
||||
|
||||
-1224
File diff suppressed because it is too large
Load Diff
+10
-17
@@ -81,18 +81,17 @@ for more information about installing and using the source code.
|
||||
|
||||
A collection of Angular components for generic use.
|
||||
|
||||
| Name | Description |
|
||||
|-----------------------------------------------|------------------------------|
|
||||
| [Avatar](core/components/avatar.component.md) | Displays user avatars. |
|
||||
| [Button](core/components/button.component.md) | A standard button component. |
|
||||
| Name | Description |
|
||||
|---------------------------------------------------|-------------------------------------------------|
|
||||
| [Avatar](core/components/avatar.component.md) | Displays user avatars. |
|
||||
| [Button](core/components/button.component.md) | A standard button component. |
|
||||
| [Progress](core/components/progress.component.md) | A progress bar component. |
|
||||
| [Header](core/components/adf-header.component.md) | A simple reusable application header component. |
|
||||
|
||||
### Components
|
||||
|
||||
| Name | Description | Source link |
|
||||
| ---- | ----------- | ----------- |
|
||||
| [About Application Modules Component](core/components/about-application.component.md)  | Shows which ADF libraries and plugins an application is using. | [Source](../lib/core/src/lib/about/about-application-modules/about-application-modules.component.ts) |
|
||||
| [About GitHub Link Component](core/components/about-github-link.component.md)  | Shows which version of the application is running based on the latest GitHub commit, as well as the server settings for the application. | [Source](../lib/core/src/lib/about/about-github-link/about-github-link.component.ts) |
|
||||
| [About Product Version Component](core/components/about-product-version.component.md)  | Shows which version of Process Services (BPM) and Content Services (ECM) an application is running. It also shows the relevant license information, application status and Alfresco modules running in an application. | [Source](../lib/core/src/lib/about/about-product-version/about-product-version.component.ts) |
|
||||
| [About Component](core/components/about.component.md) | Presentational component to display About information as a set of collapsible panels. | [Source](../lib/core/src/lib/about/about.component.ts) |
|
||||
| [Card View component](core/components/card-view.component.md) | Displays a configurable property list renderer. | [Source](../lib/core/src/lib/card-view/components/card-view/card-view.component.ts) |
|
||||
| [Comment list component](core/components/comment-list.component.md) | Shows a list of comments. | [Source](../lib/core/src/lib/comments/comment-list/comment-list.component.ts) |
|
||||
@@ -106,7 +105,6 @@ A collection of Angular components for generic use.
|
||||
| [Form field component](core/components/form-field.component.md) | Represents a UI field in a form. | [Source](../lib/core/src/lib/form/components/form-field/form-field.component.ts) |
|
||||
| [Form List Component](core/components/form-list.component.md) | Shows forms as a list. | [Source](../lib/process-services/src/lib/form/form-list/form-list.component.ts) |
|
||||
| [Header component](core/components/header.component.md) | Reusable header for Alfresco applications. | [Source](../lib/core/src/lib/layout/components/header/header.component.ts) |
|
||||
| [Host settings component](core/components/host-settings.component.md)  | Validates the URLs for ACS and APS and saves them in the user's local storage | [Source](../lib/core/src/lib/settings/host-settings.component.ts) |
|
||||
| [Icon Component](core/components/icon.component.md) | Provides a universal way of rendering registered and named icons. | [Source](../lib/core/src/lib/icon/icon.component.ts) |
|
||||
| [Identity User Info component](core/components/identity-user-info.component.md) | Shows user information for SSO mode. | [Source](../lib/core/src/lib/identity-user-info/identity-user-info.component.ts) |
|
||||
| [Infinite Pagination component](core/components/infinite-pagination.component.md) | Adds "infinite" pagination to the component it is used with. | [Source](../lib/core/src/lib/pagination/infinite-pagination.component.ts) |
|
||||
@@ -118,8 +116,7 @@ A collection of Angular components for generic use.
|
||||
| [Login Dialog Panel component](core/components/login-dialog-panel.component.md) | Shows and manages a login dialog. | [Source](../lib/core/src/lib/login/components/login-dialog-panel.component.ts) |
|
||||
| [Login Dialog component](core/components/login-dialog.component.md) | Allows a user to perform a login via a dialog. | [Source](../lib/core/src/lib/login/components/login-dialog.component.ts) |
|
||||
| [Login component](core/components/login.component.md) | Authenticates to Alfresco Content Services and Alfresco Process Services. | [Source](../lib/core/src/lib/login/components/login.component.ts) |
|
||||
| [Notification History component](core/components/notification-history.component.md)  | This component is in the current status just an experimental component. | |
|
||||
| The main purpose of the Notification history component is list all the notification received in the current session. They will disappear from the list after the refresh. | [Source](../lib/core/src/lib/notifications/components/notification-history.component.ts) | |
|
||||
| [Notification History component](core/components/notification-history.component.md)  | This component is in the current status just an experimental component. The main purpose of the Notification history component is list all the notification received in the current session. They will disappear from the list after the refresh. | [Source](../lib/core/src/lib/notifications/components/notification-history.component.ts) | |
|
||||
| [Pagination Component](core/components/pagination.component.md) | Adds pagination to the component it is used with. | [Source](../lib/core/src/lib/pagination/pagination.component.ts) |
|
||||
| [Search Text Input Component](core/components/search-text-input.component.md) | Displays a input text that supports autocompletion | [Source](<>) |
|
||||
| [Sidebar action menu component](core/components/sidebar-action-menu.component.md) | Displays a sidebar-action menu information panel. | [Source](../lib/core/src/lib/layout/components/sidebar-action/sidebar-action-menu.component.ts) |
|
||||
@@ -195,7 +192,7 @@ A collection of Angular components for generic use.
|
||||
### Services
|
||||
|
||||
| Name | Description | Source link |
|
||||
| ---- | ----------- | ----------- |
|
||||
| ---- | ----------- | -------- |
|
||||
| [APS Alfresco Content Service](core/services/activiti-alfresco.service.md) | Gets Alfresco Repository folder content based on a Repository account configured in Alfresco Process Services (APS). | [Source](../lib/process-services/src/lib/form/services/activiti-alfresco.service.ts) |
|
||||
| [Alfresco Api Service](core/services/alfresco-api.service.md) | Provides access to an initialized AlfrescoJSApi instance. | [Source](../lib/core/src/lib/services/alfresco-api.service.ts) |
|
||||
| [App Config service](core/services/app-config.service.md) | Supports app configuration settings, stored server side. | [Source](../lib/core/src/lib/app-config/app-config.service.ts) |
|
||||
@@ -207,17 +204,13 @@ A collection of Angular components for generic use.
|
||||
| [Authentication Service](core/services/authentication.service.md) | Provides authentication to ACS and APS. | [Source](../lib/core/src/lib/auth/services/authentication.service.ts) |
|
||||
| [Bpm User service](core/services/bpm-user.service.md) | Gets information about the current Process Services user. | [Source](../lib/core/src/lib/services/bpm-user.service.ts) |
|
||||
| [Card Item Type service](core/services/card-item-types.service.md) | Maps type names to field component types for the Card View component. | [Source](../lib/core/src/lib/card-view/services/card-item-types.service.ts) |
|
||||
| [Card View Update service](core/services/card-view-update.service.md) | Reports edits and clicks within fields of a Card View component. | |
|
||||
| Implements BaseCardViewUpdate. | [Source](../lib/core/src/lib/card-view/services/card-view-update.service.ts) | |
|
||||
| [Card View Update service](core/services/card-view-update.service.md) | Reports edits and clicks within fields of a Card View component. Implements BaseCardViewUpdate. | [Source](../lib/core/src/lib/card-view/services/card-view-update.service.ts) | |
|
||||
| [Clipboard service](core/services/clipboard.service.md) | Copies text to the clipboard. | [Source](../lib/core/src/lib/clipboard/clipboard.service.ts) |
|
||||
| [Comment Content service](core/services/comment-content.service.md) | Adds and retrieves comments for nodes in Content Services. | [Source](../lib/core/src/lib/services/comment-content.service.ts) |
|
||||
| [Comment Process service](core/services/comment-process.service.md) | Adds and retrieves comments for task and process instances in Process Services. | [Source](../lib/process-services/src/lib/process-comments/services/comment-process.service.ts) |
|
||||
| [Content service](core/services/content.service.md) | Accesses app-generated data objects via URLs and file downloads. | [Source](../lib/content-services/src/lib/common/services/content.service.ts) |
|
||||
| [Cookie service](core/services/cookie.service.md) | Stores key-value data items as browser cookies. | [Source](../lib/core/src/lib/common/services/cookie.service.ts) |
|
||||
| [DataTable service](core/services/datatable.service.md) | If you need to update one row of your datatable you can use the DataTableService to update it. | |
|
||||
|
||||
To update a single row you can use the rowUpdate subject.
|
||||
The model to update the DataTable require the ID of the row you want change and the new data Object of the row | [Source](../lib/core/src/lib/datatable/services/datatable.service.ts) |
|
||||
| [DataTable service](core/services/datatable.service.md) | If you need to update one row of your datatable you can use the DataTableService to update it. To update a single row you can use the rowUpdate subject. The model to update the DataTable require the ID of the row you want change and the new data Object of the row | [Source](../lib/core/src/lib/datatable/services/datatable.service.ts) |
|
||||
| [Deleted Nodes Api service](core/services/deleted-nodes-api.service.md) | Gets a list of Content Services nodes currently in the trash. | [Source](../lib/core/src/lib/services/deleted-nodes-api.service.ts) |
|
||||
| [Discovery Api service](core/services/discovery-api.service.md) | Gets version and license information for Process Services and Content Services. | [Source](../lib/content-services/src/lib/common/services/discovery-api.service.ts) |
|
||||
| [Download zip service](core/services/download-zip.service.md) | Creates and manages downloads. | [Source](../lib/content-services/src/lib/dialogs/download-zip/services/download-zip.service.ts) |
|
||||
|
||||
@@ -23,15 +23,16 @@ Indicates the current position within a navigation hierarchy.
|
||||
|
||||
### Properties
|
||||
|
||||
| Name | Type | Default value | Description |
|
||||
| ---- | ---- | ------------- | ----------- |
|
||||
| folderNode | `Node` | null | Active node, builds UI based on folderNode.path.elements collection. |
|
||||
| maxItems | `number` | | Maximum number of nodes to display before wrapping them with a dropdown element. |
|
||||
| readOnly | `boolean` | false | If true, prevents the user from navigating away from the active node. |
|
||||
| root | `string` | null | (optional) Name of the root element of the breadcrumb. You can use this property to rename "Company Home" to "Personal Files" for example. You can use an i18n resource key for the property value. |
|
||||
| rootId | `string` | null | (optional) The id of the root element. You can use this property to set a custom element the breadcrumb should start with. |
|
||||
| target | [`DocumentListComponent`](../../content-services/components/document-list.component.md) | | (optional) [Document List component](../../content-services/components/document-list.component.md) to operate with. The list will update when the breadcrumb is clicked. |
|
||||
| transform | `Function` | | Transformation to be performed on the chosen/folder node before building the breadcrumb UI. Can be useful when custom formatting is needed for the breadcrumb. You can change the path elements from the node that are used to build the breadcrumb using this function. |
|
||||
| Name | Type | Default value | Description |
|
||||
|-----------------------|-----------------------------------------------------------------------------------------|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| folderNode | `Node` | null | Active node, builds UI based on folderNode.path.elements collection. |
|
||||
| maxItems | `number` | | Maximum number of nodes to display before wrapping them with a dropdown element. |
|
||||
| readOnly | `boolean` | false | If true, prevents the user from navigating away from the active node. |
|
||||
| root | `string` | null | (optional) Name of the root element of the breadcrumb. You can use this property to rename "Company Home" to "Personal Files" for example. You can use an i18n resource key for the property value. |
|
||||
| rootId | `string` | null | (optional) The id of the root element. You can use this property to set a custom element the breadcrumb should start with. |
|
||||
| target | [`DocumentListComponent`](../../content-services/components/document-list.component.md) | | (optional) [Document List component](../../content-services/components/document-list.component.md) to operate with. The list will update when the breadcrumb is clicked. |
|
||||
| transform | `Function` | | Transformation to be performed on the chosen/folder node before building the breadcrumb UI. Can be useful when custom formatting is needed for the breadcrumb. You can change the path elements from the node that are used to build the breadcrumb using this function. |
|
||||
| selectedRowItemsCount | `number` | 0 | Number of table rows that are currently selected. |
|
||||
|
||||
### Events
|
||||
|
||||
|
||||
@@ -66,6 +66,7 @@ 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 |
|
||||
| displayCheckboxesOnHover | `boolean` | false | Enables checkboxes in datatable rows being displayed on hover only. |
|
||||
| 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. |
|
||||
@@ -98,19 +99,20 @@ Displays the documents from a repository.
|
||||
|
||||
### Events
|
||||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<any>` | Emitted when the API fails to get the Document List data |
|
||||
| filterSelection | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FilterSearch`](../../../lib/content-services/src/lib/search/models/filter-search.interface.ts)`[]>` | Emitted when a filter value is selected |
|
||||
| folderChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntryEvent`](../../../lib/content-services/src/lib/document-list/components/node.event.ts)`>` | Emitted when the current display folder changes |
|
||||
| nodeClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntityEvent`](../../../lib/content-services/src/lib/document-list/components/node.event.ts)`>` | Emitted when the user clicks a list node |
|
||||
| nodeDblClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntityEvent`](../../../lib/content-services/src/lib/document-list/components/node.event.ts)`>` | Emitted when the user double-clicks a list node |
|
||||
| nodeSelected | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)`[]>` | Emitted when the node selection change |
|
||||
| preview | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntityEvent`](../../../lib/content-services/src/lib/document-list/components/node.event.ts)`>` | Emitted when the user acts upon files with either single or double click (depends on `navigation-mode`). Useful for integration with the [Viewer component](../../core/components/viewer.component.md). |
|
||||
| ready | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/develop/src/api/content-rest-api/docs/NodePaging.md)`>` | Emitted when the Document List has loaded all items and is ready for use |
|
||||
| columnsVisibilityChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<{ [columnId: string]: boolean } \| undefined>` | Emitted when columns visibility change |
|
||||
| columnsWidthChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<{ [columnId: string]: number } \| undefined>` | Emitted when columns width change |
|
||||
| columnsOrderChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`< string[] \| undefined>` | Emitted when columns order change |
|
||||
| Name | Type | Description |
|
||||
|---------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<any>` | Emitted when the API fails to get the Document List data |
|
||||
| filterSelection | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`FilterSearch`](../../../lib/content-services/src/lib/search/models/filter-search.interface.ts)`[]>` | Emitted when a filter value is selected |
|
||||
| folderChange | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntryEvent`](../../../lib/content-services/src/lib/document-list/components/node.event.ts)`>` | Emitted when the current display folder changes |
|
||||
| nodeClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntityEvent`](../../../lib/content-services/src/lib/document-list/components/node.event.ts)`>` | Emitted when the user clicks a list node |
|
||||
| nodeDblClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntityEvent`](../../../lib/content-services/src/lib/document-list/components/node.event.ts)`>` | Emitted when the user double-clicks a list node |
|
||||
| nodeSelected | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntry`](https://github.com/Alfresco/alfresco-js-api/blob/master/src/alfresco-core-rest-api/docs/NodeEntry.md)`[]>` | Emitted when the node selection change |
|
||||
| preview | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodeEntityEvent`](../../../lib/content-services/src/lib/document-list/components/node.event.ts)`>` | Emitted when the user acts upon files with either single or double click (depends on `navigation-mode`). Useful for integration with the [Viewer component](../../core/components/viewer.component.md). |
|
||||
| ready | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`NodePaging`](https://github.com/Alfresco/alfresco-js-api/blob/develop/src/api/content-rest-api/docs/NodePaging.md)`>` | Emitted when the Document List has loaded all items and is ready for use |
|
||||
| columnsVisibilityChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<{ [columnId: string]: boolean } \| undefined>` | Emitted when columns visibility change |
|
||||
| columnsWidthChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<{ [columnId: string]: number } \| undefined>` | Emitted when columns width change |
|
||||
| columnsOrderChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`< string[] \| undefined>` | Emitted when columns order change |
|
||||
| selectedItemsCountChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`< number \| undefined>` | Emitted when items row count change |
|
||||
|
||||
## Details
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ Status: Active
|
||||
Last reviewed: 2024-03-12
|
||||
---
|
||||
|
||||
# [Category selector dialog component](../../../lib/content-services/src/lib/dialogs/category-selector.dialog.ts "Defined in category-selector.dialog.ts")
|
||||
# Category Selector Dialog
|
||||
|
||||
Allows the user to select one or multiple categories.
|
||||
|
||||
@@ -13,43 +13,41 @@ Allows the user to select one or multiple categories.
|
||||
|
||||
## Dialog inputs
|
||||
|
||||
| Name | Type | Default value | Description |
|
||||
| ---- |-----------| ------------- | ----------- |
|
||||
| select | [`Subject<Category[]>`](https://github.com/Alfresco/alfresco-ng2-components/blob/develop/lib/js-api/src/api/content-rest-api/docs/CategoriesApi.md) | | Emits an array of selected categories when the dialog closes |
|
||||
| multiSelect | `boolean` | `true` | (optional) Toggles multiselect mode |
|
||||
| Name | Type | Default value | Description |
|
||||
|-------------|-----------------------|---------------|--------------------------------------------------------------|
|
||||
| select | `Subject<Category[]>` | | Emits an array of selected categories when the dialog closes |
|
||||
| multiSelect | `boolean` | `true` | (optional) Toggles multiselect mode |
|
||||
|
||||
## Basic Usage
|
||||
|
||||
```ts
|
||||
constructor(private dialog: MatDialog) {}
|
||||
export class MyComponent {
|
||||
constructor(private dialog: MatDialog) {
|
||||
}
|
||||
|
||||
...
|
||||
openCatDialog() {
|
||||
const data: CategorySelectorDialogOptions = {
|
||||
select: new Subject<Category[]>(),
|
||||
multiSelect: false
|
||||
};
|
||||
|
||||
function openCatDialog() {
|
||||
const data: CategorySelectorDialogOptions = {
|
||||
select: new Subject<Category[]>(),
|
||||
multiSelect: false
|
||||
};
|
||||
this.dialog.open(CategorySelectorDialogComponent, {
|
||||
data,
|
||||
width: '400px'
|
||||
});
|
||||
|
||||
this.dialog.open(CategorySelectorDialogComponent, {
|
||||
data,
|
||||
width: '400px'
|
||||
});
|
||||
|
||||
data.select.subscribe(
|
||||
(selections: Category[]) => {
|
||||
...
|
||||
}
|
||||
);
|
||||
data.select.subscribe((selections) => {
|
||||
// ...
|
||||
});
|
||||
}
|
||||
}
|
||||
```
|
||||
All the results will be streamed to the select [subject](http://reactivex.io/rxjs/manual/overview.html#subject) present in the `CategorySelectorDialogOptions` object passed to the dialog.
|
||||
All the results will be streamed to the `select` subject present in the `CategorySelectorDialogOptions` object passed to the dialog.
|
||||
When the category is selected by clicking the `Select` button, the `options.select` stream will be completed.
|
||||
|
||||
## Details
|
||||
|
||||
This component lets the user select categories. Use the
|
||||
Angular [`MatDialog`](https://material.angular.io/components/dialog/overview)
|
||||
This component lets the user select categories. Use the Angular `MatDialog`
|
||||
service to open the dialog, as shown in the example, and pass a `options` object
|
||||
with properties.
|
||||
|
||||
|
||||
@@ -1,56 +0,0 @@
|
||||
---
|
||||
Title: Audit Service
|
||||
Added: v3.9.0
|
||||
Status: Active
|
||||
Last reviewed: 2020-08-12
|
||||
---
|
||||
|
||||
# [Audit Service](../../../lib/content-services/src/lib/audit/audit.service.ts "Defined in audit.service.ts")
|
||||
|
||||
Manages Audit apps and entries.
|
||||
|
||||
## Class members
|
||||
|
||||
### Methods
|
||||
|
||||
- **deleteAuditEntries**(auditApplicationId: `string`, where: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<any>`<br/>
|
||||
Permanently delete audit entries for an audit application.
|
||||
- _auditApplicationId:_ `string` - The identifier of an audit application.
|
||||
- _where:_ `string` - Audit entries to permanently delete for an audit application, given an inclusive time period or range of ids.
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<any>` -
|
||||
- **deleteAuditEntry**(auditApplicationId: `string`, auditEntryId: `string`): [`Observable`](http://reactivex.io/documentation/observable.html)`<any>`<br/>
|
||||
Permanently delete an audit entry.
|
||||
- _auditApplicationId:_ `string` - The identifier of an audit application.
|
||||
- _auditEntryId:_ `string` - The identifier of an audit entry.
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<any>` -
|
||||
- **getAuditApp**(auditApplicationId: `string`, opts?: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<AuditAppEntry>`<br/>
|
||||
Get audit application info.
|
||||
- _auditApplicationId:_ `string` - The identifier of an audit application.
|
||||
- _opts:_ `any` - (Optional) Options.
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<AuditAppEntry>` - status of an audit application.
|
||||
- **getAuditApps**(opts?: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<AuditAppPaging>`<br/>
|
||||
Gets a list of audit applications.
|
||||
- _opts:_ `any` - (Optional) Options.
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<AuditAppPaging>` - a list of the audit applications.
|
||||
- **getAuditEntries**(auditApplicationId: `string`, opts?: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<AuditEntryPaging>`<br/>
|
||||
List audit entries for an audit application.
|
||||
- _auditApplicationId:_ `string` - The identifier of an audit application.
|
||||
- _opts:_ `any` - (Optional) Options.
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<AuditEntryPaging>` - a list of audit entries.
|
||||
- **getAuditEntriesForNode**(nodeId: `string`, opts?: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<AuditEntryPaging>`<br/>
|
||||
List audit entries for a node.
|
||||
- _nodeId:_ `string` - The identifier of a node.
|
||||
- _opts:_ `any` - (Optional) Options.
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<AuditEntryPaging>` -
|
||||
- **getAuditEntry**(auditApplicationId: `string`, auditEntryId: `string`, opts?: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<AuditEntryEntry>`<br/>
|
||||
Get audit entry.
|
||||
- _auditApplicationId:_ `string` - The identifier of an audit application.
|
||||
- _auditEntryId:_ `string` - The identifier of an audit entry.
|
||||
- _opts:_ `any` - (Optional) Options.
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<AuditEntryEntry>` - audit entry.
|
||||
- **updateAuditApp**(auditApplicationId: `string`, auditAppBodyUpdate: `boolean`, opts?: `any`): [`Observable`](http://reactivex.io/documentation/observable.html)`<AuditApp|any>`<br/>
|
||||
Update audit application info.
|
||||
- _auditApplicationId:_ `string` - The identifier of an audit application.
|
||||
- _auditAppBodyUpdate:_ `boolean` - The audit application to update.
|
||||
- _opts:_ `any` - (Optional) Options.
|
||||
- **Returns** [`Observable`](http://reactivex.io/documentation/observable.html)`<AuditApp|any>` -
|
||||
@@ -1,40 +0,0 @@
|
||||
---
|
||||
Title: About Application Modules Component
|
||||
Added: v3.5.0
|
||||
Status: Experimental
|
||||
Last reviewed: 2019-09-09
|
||||
---
|
||||
|
||||
# [About Application Modules Component](lib/core/src/lib/about/about-application-modules/about-application-modules.component.ts "Defined in about-application-modules.component.ts")
|
||||
|
||||
Shows which ADF libraries and plugins an application is using.
|
||||
|
||||
## Basic Usage
|
||||
|
||||
With default input values:
|
||||
|
||||
```html
|
||||
<adf-about-application-modules></adf-about-application-modules>
|
||||
```
|
||||
|
||||
With custom input values:
|
||||
|
||||
```html
|
||||
<adf-about-application-modules
|
||||
[dependencies]="yourDependencies"
|
||||
[showExtensions]="true"
|
||||
[regexp]="^(@alfresco)">
|
||||
</adf-about-application-modules>
|
||||
```
|
||||
|
||||
### Properties
|
||||
|
||||
| Name | Type | Default value | Description |
|
||||
| ---- | ---- | ------------- | ----------- |
|
||||
| dependencies | `any` | | The dependencies value defined in the package.json |
|
||||
| showExtensions | `boolean` | true | Toggles showing/hiding of extensions block. |
|
||||
| regexp | `string` | "^(@alfresco)" | Regular expression for filtering dependencies packages. |
|
||||
|
||||
## Details
|
||||
|
||||
Use this component to display an overview of the dependencies and plugins used by an application.
|
||||
@@ -1,38 +0,0 @@
|
||||
---
|
||||
Title: About GitHub Link Component
|
||||
Added: v3.5.0
|
||||
Status: Experimental
|
||||
Last reviewed: 2019-09-09
|
||||
---
|
||||
|
||||
# [About GitHub Link Component](../../../lib/core/src/lib/about/about-github-link/about-github-link.component.ts "Defined in about-github-link.component.ts")
|
||||
|
||||
Shows which version of the application is running based on the latest GitHub commit, as well as the server settings for the application.
|
||||
|
||||
## Basic Usage
|
||||
|
||||
With default input values:
|
||||
|
||||
```html
|
||||
<adf-about-github-link></adf-about-github-link>
|
||||
```
|
||||
|
||||
With custom input values:
|
||||
|
||||
```html
|
||||
<adf-about-github-link
|
||||
[url]=yourUrl"
|
||||
[version]="yourVersion">
|
||||
</adf-about-github-link>
|
||||
```
|
||||
|
||||
### Properties
|
||||
|
||||
| Name | Type | Default value | Description |
|
||||
| ---- | ---- | ------------- | ----------- |
|
||||
| url | `string` | | The GitHub commit that corresponds to the version of ADF in use. |
|
||||
| version | `string` | "3.x.x" | A number displaying the version of ADF in use. |
|
||||
|
||||
## Details
|
||||
|
||||
Use this component to display an overview of the latest GitHub commit and the server settings used by an application.
|
||||
@@ -1,22 +0,0 @@
|
||||
---
|
||||
Title: About Product Version Component
|
||||
Added: v3.5.0
|
||||
Status: Experimental
|
||||
Last reviewed: 2019-09-09
|
||||
---
|
||||
|
||||
# [About Product Version Component](lib/core/src/lib/about/about-product-version/about-product-version.component.ts "Defined in about-product-version.component.ts")
|
||||
|
||||
Shows which version of Process Services (BPM) and Content Services (ECM) an application is running. It also shows the relevant license information, application status and Alfresco modules running in an application.
|
||||
|
||||
## Basic Usage
|
||||
|
||||
With default input values:
|
||||
|
||||
```html
|
||||
<adf-about-product-version></adf-about-product-version>
|
||||
```
|
||||
|
||||
## Details
|
||||
|
||||
Use this component to display an overview of which version of Process Services and Content Services an application is running as well as the associated license information. It also displays application status and any modules running.
|
||||
@@ -0,0 +1 @@
|
||||
../../../lib/core/src/lib/header/header.component.md
|
||||
@@ -429,6 +429,7 @@ Learn more about styling your datatable: [Customizing the component's styles](#c
|
||||
| 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 |
|
||||
| displayCheckboxesOnHover | `boolean` | false | Enables checkboxes in datatable rows being displayed on hover only. |
|
||||
| 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). |
|
||||
@@ -448,15 +449,16 @@ Learn more about styling your datatable: [Customizing the component's styles](#c
|
||||
|
||||
### 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. |
|
||||
| selectedItemsCountChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<number>` | Emitted when the item row count 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
|
||||
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
---
|
||||
Title: Host settings component
|
||||
Added: v2.0.0
|
||||
Status: Internal
|
||||
Last reviewed: 2019-01-16
|
||||
---
|
||||
|
||||
# [Host settings component](../../../lib/core/src/lib/settings/host-settings.component.ts "Defined in host-settings.component.ts")
|
||||
|
||||
Validates the URLs for ACS and APS and saves them in the user's local storage
|
||||
|
||||
**Note:** this is an internal component and is not meant to be used in production.
|
||||
|
||||

|
||||
|
||||
## Basic Usage
|
||||
|
||||
```html
|
||||
<adf-host-settings>
|
||||
</adf-host-settings>
|
||||
```
|
||||
|
||||
```ts
|
||||
@NgModule({
|
||||
providers: [
|
||||
{ provide: AppConfigService, useClass: DebugAppConfigService },
|
||||
]
|
||||
)]
|
||||
```
|
||||
|
||||
## Class members
|
||||
|
||||
### Properties
|
||||
|
||||
| Name | Type | Default value | Description |
|
||||
| ---- | ---- | ------------- | ----------- |
|
||||
| providers | `string[]` | | Tells the component which provider options are available. Possible valid values are "ECM" (Content), "BPM" (Process) , "ALL" (Content and Process), 'OAUTH2' SSO. |
|
||||
|
||||
### Events
|
||||
|
||||
| Name | Type | Description |
|
||||
| ---- | ---- | ----------- |
|
||||
| cancel | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<boolean>` | Emitted when the user cancels the changes. |
|
||||
| error | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<string>` | Emitted when the URL is invalid. |
|
||||
| success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<boolean>` | Emitted when the changes are successfully applied. |
|
||||
@@ -0,0 +1 @@
|
||||
../../../lib/core/src/lib/progress/progress.component.md
|
||||
@@ -35,7 +35,7 @@ export class ContentServicesPage {
|
||||
uploadBorder = $('#document-list-container');
|
||||
currentFolder = $('div[class*="adf-breadcrumb-item adf-active"] div');
|
||||
createFolderButton = $('button[data-automation-id="create-new-folder"]');
|
||||
uploadFileButton = $('.adf-upload-button-file-container button');
|
||||
uploadFileButton = $('.adf-upload-button-file-container label');
|
||||
uploadFileButtonInput = $('input[data-automation-id="upload-single-file"]');
|
||||
uploadMultipleFileButton = $('input[data-automation-id="upload-multiple-files"]');
|
||||
uploadFolderButton = $('input[data-automation-id="uploadFolder"]');
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
"C280063": "https://alfresco.atlassian.net/browse/ACS-4595",
|
||||
"C280064": "https://alfresco.atlassian.net/browse/ACS-4595",
|
||||
"C313200": "https://alfresco.atlassian.net/browse/APPS-2234",
|
||||
"C311318-3": "https://alfresco.atlassian.net/browse/APPS-2254",
|
||||
"C311319-2": "https://alfresco.atlassian.net/browse/APPS-2254",
|
||||
"C311318-3": "https://alfresco.atlassian.net/browse/APPS-2254",
|
||||
"C311319-4": "https://alfresco.atlassian.net/browse/APPS-2254",
|
||||
"C297691": "https://alfresco.atlassian.net/browse/APPS-2254",
|
||||
"C297692": "https://alfresco.atlassian.net/browse/ACS-6244",
|
||||
|
||||
Binary file not shown.
Generated
+2
-470
@@ -1,15 +1,14 @@
|
||||
{
|
||||
"name": "@alfresco/adf-cli",
|
||||
"version": "6.9.0",
|
||||
"version": "6.10.0-10195436594-10195436594",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@alfresco/adf-cli",
|
||||
"version": "6.9.0",
|
||||
"version": "6.10.0-10195436594-10195436594",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@alfresco/js-api": ">=7.7.0",
|
||||
"commander": "^6.2.1",
|
||||
"ejs": "^3.1.9",
|
||||
"license-checker": "^25.0.1",
|
||||
@@ -29,16 +28,6 @@
|
||||
"typescript": "^4.9.5"
|
||||
}
|
||||
},
|
||||
"node_modules/@alfresco/js-api": {
|
||||
"version": "7.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@alfresco/js-api/-/js-api-7.7.0.tgz",
|
||||
"integrity": "sha512-qD88MfQ+7fBv3vFi0Ju1oEaDAE9L+VxISlmpXZq1HYkBCNcSrqbFwi8ZCBPb3gZPnKG88edebTTqC6MYsusFmQ==",
|
||||
"dependencies": {
|
||||
"event-emitter": "^0.3.5",
|
||||
"superagent": "^9.0.1",
|
||||
"tslib": "^2.6.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/ejs": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.2.tgz",
|
||||
@@ -111,11 +100,6 @@
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
|
||||
"integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
|
||||
},
|
||||
"node_modules/asynckit": {
|
||||
"version": "0.4.0",
|
||||
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
|
||||
"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
|
||||
},
|
||||
"node_modules/balanced-match": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||
@@ -130,24 +114,6 @@
|
||||
"concat-map": "0.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/call-bind": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
|
||||
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
|
||||
"dependencies": {
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"set-function-length": "^1.2.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/chalk": {
|
||||
"version": "2.4.2",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
|
||||
@@ -174,17 +140,6 @@
|
||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
|
||||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
|
||||
},
|
||||
"node_modules/combined-stream": {
|
||||
"version": "1.0.8",
|
||||
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
|
||||
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
|
||||
"dependencies": {
|
||||
"delayed-stream": "~1.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/commander": {
|
||||
"version": "6.2.1",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
|
||||
@@ -193,46 +148,11 @@
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/component-emitter": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
|
||||
"integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
|
||||
},
|
||||
"node_modules/concat-map": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
|
||||
},
|
||||
"node_modules/cookiejar": {
|
||||
"version": "2.1.4",
|
||||
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
|
||||
"integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw=="
|
||||
},
|
||||
"node_modules/d": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
|
||||
"integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
|
||||
"dependencies": {
|
||||
"es5-ext": "^0.10.50",
|
||||
"type": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/debug": {
|
||||
"version": "4.3.4",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
|
||||
"integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
|
||||
"dependencies": {
|
||||
"ms": "2.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"supports-color": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/debuglog": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz",
|
||||
@@ -241,30 +161,6 @@
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/define-data-property": {
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
|
||||
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
|
||||
"dependencies": {
|
||||
"es-define-property": "^1.0.0",
|
||||
"es-errors": "^1.3.0",
|
||||
"gopd": "^1.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/delayed-stream": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
|
||||
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
|
||||
"engines": {
|
||||
"node": ">=0.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/dezalgo": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
|
||||
@@ -288,59 +184,6 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/es-define-property": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
|
||||
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.2.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es-errors": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
|
||||
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/es5-ext": {
|
||||
"version": "0.10.63",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.63.tgz",
|
||||
"integrity": "sha512-hUCZd2Byj/mNKjfP9jXrdVZ62B8KuA/VoK7X8nUh5qT+AxDmcbvZz041oDVZdbIN1qW6XY9VDNwzkvKnZvK2TQ==",
|
||||
"hasInstallScript": true,
|
||||
"dependencies": {
|
||||
"es6-iterator": "^2.0.3",
|
||||
"es6-symbol": "^3.1.3",
|
||||
"esniff": "^2.0.1",
|
||||
"next-tick": "^1.1.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/es6-iterator": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
|
||||
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
|
||||
"dependencies": {
|
||||
"d": "1",
|
||||
"es5-ext": "^0.10.35",
|
||||
"es6-symbol": "^3.1.1"
|
||||
}
|
||||
},
|
||||
"node_modules/es6-symbol": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
|
||||
"integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
|
||||
"dependencies": {
|
||||
"d": "^1.0.1",
|
||||
"ext": "^1.1.2"
|
||||
}
|
||||
},
|
||||
"node_modules/escape-string-regexp": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
|
||||
@@ -349,52 +192,6 @@
|
||||
"node": ">=0.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/esniff": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
|
||||
"integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
|
||||
"dependencies": {
|
||||
"d": "^1.0.1",
|
||||
"es5-ext": "^0.10.62",
|
||||
"event-emitter": "^0.3.5",
|
||||
"type": "^2.7.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/esniff/node_modules/type": {
|
||||
"version": "2.7.2",
|
||||
"resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
|
||||
"integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
|
||||
},
|
||||
"node_modules/event-emitter": {
|
||||
"version": "0.3.5",
|
||||
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
|
||||
"integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
|
||||
"dependencies": {
|
||||
"d": "1",
|
||||
"es5-ext": "~0.10.14"
|
||||
}
|
||||
},
|
||||
"node_modules/ext": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
|
||||
"integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
|
||||
"dependencies": {
|
||||
"type": "^2.7.2"
|
||||
}
|
||||
},
|
||||
"node_modules/ext/node_modules/type": {
|
||||
"version": "2.7.2",
|
||||
"resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz",
|
||||
"integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw=="
|
||||
},
|
||||
"node_modules/fast-safe-stringify": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
|
||||
"integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
|
||||
},
|
||||
"node_modules/filelist": {
|
||||
"version": "1.0.4",
|
||||
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
|
||||
@@ -422,32 +219,6 @@
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/form-data": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
|
||||
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
|
||||
"dependencies": {
|
||||
"asynckit": "^0.4.0",
|
||||
"combined-stream": "^1.0.8",
|
||||
"mime-types": "^2.1.12"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/formidable": {
|
||||
"version": "3.5.1",
|
||||
"resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz",
|
||||
"integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==",
|
||||
"dependencies": {
|
||||
"dezalgo": "^1.0.4",
|
||||
"hexoid": "^1.0.0",
|
||||
"once": "^1.4.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://ko-fi.com/tunnckoCore/commissions"
|
||||
}
|
||||
},
|
||||
"node_modules/fs.realpath": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||
@@ -461,24 +232,6 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/get-intrinsic": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
|
||||
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
|
||||
"dependencies": {
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"has-proto": "^1.0.1",
|
||||
"has-symbols": "^1.0.3",
|
||||
"hasown": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/glob": {
|
||||
"version": "7.1.6",
|
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
|
||||
@@ -498,17 +251,6 @@
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/gopd": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
||||
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
|
||||
"dependencies": {
|
||||
"get-intrinsic": "^1.1.3"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/graceful-fs": {
|
||||
"version": "4.2.4",
|
||||
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
|
||||
@@ -533,58 +275,6 @@
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/has-property-descriptors": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
|
||||
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
|
||||
"dependencies": {
|
||||
"es-define-property": "^1.0.0"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-proto": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
|
||||
"integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/has-symbols": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
|
||||
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/hasown": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
|
||||
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
|
||||
"dependencies": {
|
||||
"function-bind": "^1.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/hexoid": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz",
|
||||
"integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==",
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/hosted-git-info": {
|
||||
"version": "2.8.9",
|
||||
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
|
||||
@@ -745,55 +435,6 @@
|
||||
"semver": "bin/semver"
|
||||
}
|
||||
},
|
||||
"node_modules/lru-cache": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
|
||||
"integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
|
||||
"dependencies": {
|
||||
"yallist": "^4.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/methods": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
|
||||
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mime": {
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
|
||||
"integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
|
||||
"bin": {
|
||||
"mime": "cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-db": {
|
||||
"version": "1.45.0",
|
||||
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
|
||||
"integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==",
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/mime-types": {
|
||||
"version": "2.1.28",
|
||||
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
|
||||
"integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
|
||||
"dependencies": {
|
||||
"mime-db": "1.45.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/minimatch": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
||||
@@ -826,11 +467,6 @@
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
|
||||
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
|
||||
},
|
||||
"node_modules/next-tick": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
|
||||
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
|
||||
},
|
||||
"node_modules/node-fetch": {
|
||||
"version": "2.7.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
|
||||
@@ -905,14 +541,6 @@
|
||||
"resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
|
||||
"integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA=="
|
||||
},
|
||||
"node_modules/object-inspect": {
|
||||
"version": "1.13.1",
|
||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
|
||||
"integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/once": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||
@@ -959,20 +587,6 @@
|
||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
||||
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
|
||||
},
|
||||
"node_modules/qs": {
|
||||
"version": "6.12.1",
|
||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz",
|
||||
"integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==",
|
||||
"dependencies": {
|
||||
"side-channel": "^1.0.6"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.6"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/read-installed": {
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz",
|
||||
@@ -1059,36 +673,6 @@
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
|
||||
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
|
||||
},
|
||||
"node_modules/semver": {
|
||||
"version": "7.5.4",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
|
||||
"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
|
||||
"dependencies": {
|
||||
"lru-cache": "^6.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"semver": "bin/semver.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
}
|
||||
},
|
||||
"node_modules/set-function-length": {
|
||||
"version": "1.2.2",
|
||||
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
|
||||
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
|
||||
"dependencies": {
|
||||
"define-data-property": "^1.1.4",
|
||||
"es-errors": "^1.3.0",
|
||||
"function-bind": "^1.1.2",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"gopd": "^1.0.1",
|
||||
"has-property-descriptors": "^1.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/shelljs": {
|
||||
"version": "0.8.5",
|
||||
"resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
|
||||
@@ -1105,23 +689,6 @@
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/side-channel": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
|
||||
"integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
|
||||
"dependencies": {
|
||||
"call-bind": "^1.0.7",
|
||||
"es-errors": "^1.3.0",
|
||||
"get-intrinsic": "^1.2.4",
|
||||
"object-inspect": "^1.13.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 0.4"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/slide": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
|
||||
@@ -1191,26 +758,6 @@
|
||||
"spdx-ranges": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/superagent": {
|
||||
"version": "9.0.1",
|
||||
"resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.1.tgz",
|
||||
"integrity": "sha512-CcRSdb/P2oUVaEpQ87w9Obsl+E9FruRd6b2b7LdiBtJoyMr2DQt7a89anAfiX/EL59j9b2CbRFvf2S91DhuCww==",
|
||||
"dependencies": {
|
||||
"component-emitter": "^1.3.0",
|
||||
"cookiejar": "^2.1.4",
|
||||
"debug": "^4.3.4",
|
||||
"fast-safe-stringify": "^2.1.1",
|
||||
"form-data": "^4.0.0",
|
||||
"formidable": "^3.5.1",
|
||||
"methods": "^1.1.2",
|
||||
"mime": "2.6.0",
|
||||
"qs": "^6.11.0",
|
||||
"semver": "^7.3.8"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14.18.0"
|
||||
}
|
||||
},
|
||||
"node_modules/supports-color": {
|
||||
"version": "5.5.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
|
||||
@@ -1230,16 +777,6 @@
|
||||
"node": ">=0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/tslib": {
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
|
||||
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
|
||||
},
|
||||
"node_modules/type": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
|
||||
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
|
||||
},
|
||||
"node_modules/typescript": {
|
||||
"version": "4.9.5",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
|
||||
@@ -1271,11 +808,6 @@
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
|
||||
},
|
||||
"node_modules/yallist": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
|
||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@alfresco/adf-cli",
|
||||
"description": "Alfresco ADF cli and utils",
|
||||
"version": "6.9.0",
|
||||
"version": "6.10.0-10195436594-10195436594",
|
||||
"author": "Hyland Software, Inc. and its affiliates",
|
||||
"bin": {
|
||||
"adf-cli": "bin/adf-cli",
|
||||
@@ -20,7 +20,6 @@
|
||||
"dist": "rm -rf ../../dist/libs/cli && npm run build && cp -R ./bin ../../dist/libs/cli && cp -R ./resources ../../dist/libs/cli && cp -R ./templates ../../dist/libs/cli && cp ./package.json ../../dist/libs/cli"
|
||||
},
|
||||
"dependencies": {
|
||||
"@alfresco/js-api": ">=7.8.0",
|
||||
"commander": "^6.2.1",
|
||||
"ejs": "^3.1.9",
|
||||
"license-checker": "^25.0.1",
|
||||
|
||||
+2
-10
@@ -8,10 +8,7 @@
|
||||
"build": {
|
||||
"executor": "nx:run-commands",
|
||||
"options": {
|
||||
"command": "cd lib/cli && npm i && npm run dist",
|
||||
"stylePreprocessorOptions": {
|
||||
"includePaths": ["lib", "lib/core/src/lib"]
|
||||
}
|
||||
"command": "cd lib/cli && npm i && npm run dist"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
@@ -40,12 +37,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"dependsOn": [
|
||||
{
|
||||
"projects": "self",
|
||||
"target": "build"
|
||||
}
|
||||
]
|
||||
"dependsOn": ["build"]
|
||||
},
|
||||
"lint": {
|
||||
"executor": "@nrwl/linter:eslint",
|
||||
|
||||
@@ -51,7 +51,7 @@ export default function main(_args: string[], workingDir: string) {
|
||||
exit(0);
|
||||
}
|
||||
|
||||
const options = program.opts<AuditCommandArgs>();
|
||||
const options: AuditCommandArgs = program.opts();
|
||||
|
||||
let packagePath = path.resolve(workingDir, 'package.json');
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ export default async function main() {
|
||||
.option('-r, --retry [type]', 'retry ')
|
||||
.parse(argv);
|
||||
|
||||
const opts = program.opts<CheckCsEnvArgs>();
|
||||
const opts = program.opts();
|
||||
await checkEnv(opts);
|
||||
// TODO: https://alfresco.atlassian.net/browse/ACS-5873
|
||||
// await checkDiskSpaceFullEnv();
|
||||
|
||||
@@ -50,7 +50,7 @@ export default async function main() {
|
||||
.option('--ui, --uiName [type]', 'uiName', 'Deployed app UI type on activiti-cloud')
|
||||
.parse(argv);
|
||||
|
||||
const options = program.opts<CheckPluginArgs>();
|
||||
const options = program.opts();
|
||||
|
||||
pluginEnv = new CheckEnv(options.host, options.username, options.password, options.clientId);
|
||||
await pluginEnv.checkEnv();
|
||||
|
||||
@@ -755,7 +755,7 @@ export default async function main() {
|
||||
return;
|
||||
}
|
||||
|
||||
const options = initializeDefaultToken(program.opts());
|
||||
const options = initializeDefaultToken(program.opts() as ConfigArgs);
|
||||
|
||||
args = {
|
||||
host: options.host,
|
||||
|
||||
@@ -49,7 +49,7 @@ export default async function main() {
|
||||
.option('-u, --username [type]', 'username ')
|
||||
.parse(argv);
|
||||
|
||||
const opts = program.opts<InitAcsEnvArgs>();
|
||||
const opts = program.opts();
|
||||
await checkEnv(opts);
|
||||
|
||||
logger.info(`***** Step initialize ACS *****`);
|
||||
|
||||
@@ -65,7 +65,7 @@ export default async function main() {
|
||||
.option('--license [type]', 'APS license S3 path ')
|
||||
.parse(argv);
|
||||
|
||||
const opts = program.opts<InitApsEnvArgs>();
|
||||
const opts = program.opts();
|
||||
await checkEnv(opts);
|
||||
|
||||
logger.info(`***** Step 1 - Check License *****`);
|
||||
|
||||
@@ -115,7 +115,7 @@ export default function main(_args: string[], workingDir: string) {
|
||||
exit(0);
|
||||
}
|
||||
|
||||
const options = program.opts<LicensesCommandArgs>();
|
||||
const options: LicensesCommandArgs = program.opts();
|
||||
let packagePath = path.resolve(workingDir, 'package.json');
|
||||
|
||||
if (options.package) {
|
||||
|
||||
@@ -1,144 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright © 2005-2024 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 { Injectable } from '@angular/core';
|
||||
import { Observable, from } from 'rxjs';
|
||||
import { AlfrescoApiService } from '@alfresco/adf-core';
|
||||
import { AuditApi, AuditAppPaging, AuditApp, AuditEntryPaging, AuditEntryEntry } from '@alfresco/js-api';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class AuditService {
|
||||
private _auditApi: AuditApi;
|
||||
get auditApi(): AuditApi {
|
||||
this._auditApi = this._auditApi ?? new AuditApi(this.apiService.getInstance());
|
||||
return this._auditApi;
|
||||
}
|
||||
|
||||
constructor(private apiService: AlfrescoApiService) {}
|
||||
|
||||
/**
|
||||
* Gets a list of audit applications.
|
||||
*
|
||||
* @param opts Options.
|
||||
* @returns a list of the audit applications.
|
||||
*/
|
||||
getAuditApps(opts?: any): Observable<AuditAppPaging> {
|
||||
const defaultOptions = {
|
||||
skipCount: 0
|
||||
};
|
||||
const queryOptions = Object.assign({}, defaultOptions, opts);
|
||||
return from(this.auditApi.listAuditApps(queryOptions));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get audit application info.
|
||||
*
|
||||
* @param auditApplicationId The identifier of an audit application.
|
||||
* @param opts Options.
|
||||
* @returns status of an audit application.
|
||||
*/
|
||||
getAuditApp(auditApplicationId: string, opts?: any): Observable<AuditApp> {
|
||||
const defaultOptions = {
|
||||
auditApplicationId
|
||||
};
|
||||
const queryOptions = Object.assign({}, defaultOptions, opts);
|
||||
return from(this.auditApi.getAuditApp(queryOptions));
|
||||
}
|
||||
|
||||
/**
|
||||
* Update audit application info.
|
||||
*
|
||||
* @param auditApplicationId The identifier of an audit application.
|
||||
* @param auditAppBodyUpdate The audit application to update.
|
||||
* @param opts Options.
|
||||
* @returns audit application model
|
||||
*/
|
||||
updateAuditApp(auditApplicationId: string, auditAppBodyUpdate: boolean, opts?: any): Observable<AuditApp | any> {
|
||||
const defaultOptions = {};
|
||||
const queryOptions = Object.assign({}, defaultOptions, opts);
|
||||
return from(this.auditApi.updateAuditApp(auditApplicationId, { isEnabled: auditAppBodyUpdate }, queryOptions));
|
||||
}
|
||||
|
||||
/**
|
||||
* List audit entries for an audit application.
|
||||
*
|
||||
* @param auditApplicationId The identifier of an audit application.
|
||||
* @param opts Options.
|
||||
* @returns a list of audit entries.
|
||||
*/
|
||||
getAuditEntries(auditApplicationId: string, opts?: any): Observable<AuditEntryPaging> {
|
||||
const defaultOptions = {
|
||||
skipCount: 0,
|
||||
maxItems: 100
|
||||
};
|
||||
const queryOptions = Object.assign({}, defaultOptions, opts);
|
||||
return from(this.auditApi.listAuditEntriesForAuditApp(auditApplicationId, queryOptions));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get audit entry.
|
||||
*
|
||||
* @param auditApplicationId The identifier of an audit application.
|
||||
* @param auditEntryId The identifier of an audit entry.
|
||||
* @param opts Options.
|
||||
* @returns audit entry.
|
||||
*/
|
||||
getAuditEntry(auditApplicationId: string, auditEntryId: string, opts?: any): Observable<AuditEntryEntry> {
|
||||
const defaultOptions = {};
|
||||
const queryOptions = Object.assign({}, defaultOptions, opts);
|
||||
return from(this.auditApi.getAuditEntry(auditApplicationId, auditEntryId, queryOptions));
|
||||
}
|
||||
|
||||
/**
|
||||
* List audit entries for a node.
|
||||
*
|
||||
* @param nodeId The identifier of a node.
|
||||
* @param opts Options.
|
||||
* @returns audit entry list
|
||||
*/
|
||||
getAuditEntriesForNode(nodeId: string, opts?: any): Observable<AuditEntryPaging> {
|
||||
const defaultOptions = {
|
||||
nodeId
|
||||
};
|
||||
const queryOptions = Object.assign({}, defaultOptions, opts);
|
||||
return from(this.auditApi.listAuditEntriesForNode(queryOptions));
|
||||
}
|
||||
|
||||
/**
|
||||
* Permanently delete audit entries for an audit application.
|
||||
*
|
||||
* @param auditApplicationId The identifier of an audit application.
|
||||
* @param where Audit entries to permanently delete for an audit application, given an inclusive time period or range of ids.
|
||||
* @returns void operation
|
||||
*/
|
||||
deleteAuditEntries(auditApplicationId: string, where: string): Observable<any> {
|
||||
return from(this.auditApi.deleteAuditEntriesForAuditApp(auditApplicationId, where));
|
||||
}
|
||||
|
||||
/**
|
||||
* Permanently delete an audit entry.
|
||||
*
|
||||
* @param auditApplicationId The identifier of an audit application.
|
||||
* @param auditEntryId The identifier of an audit entry.
|
||||
* @returns void operation
|
||||
*/
|
||||
deleteAuditEntry(auditApplicationId: string, auditEntryId: string): Observable<any> {
|
||||
return from(this.auditApi.deleteAuditEntry(auditApplicationId, auditEntryId));
|
||||
}
|
||||
}
|
||||
@@ -57,7 +57,7 @@
|
||||
</a>
|
||||
|
||||
<div *ngSwitchDefault class="adf-breadcrumb-item-current" aria-current="location">
|
||||
{{ item.name | translate }}
|
||||
{{ (selectedRowItemsCount < 1 ? item.name : 'BREADCRUMB.HEADER.SELECTED') | translate: { count: selectedRowItemsCount } }}
|
||||
</div>
|
||||
|
||||
<mat-icon class="adf-breadcrumb-item-chevron" *ngIf="!last">
|
||||
|
||||
@@ -33,6 +33,9 @@ describe('Breadcrumb', () => {
|
||||
});
|
||||
let documentListComponent: DocumentListComponent;
|
||||
|
||||
const getBreadcrumbActionText = (): string =>
|
||||
fixture.debugElement.nativeElement.querySelector('.adf-breadcrumb-item-current').textContent.trim();
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [ContentTestingModule],
|
||||
@@ -300,4 +303,26 @@ describe('Breadcrumb', () => {
|
||||
expect(component.route[3].id).toBe('test-id');
|
||||
expect(component.route[3].name).toBe('test-name');
|
||||
});
|
||||
|
||||
it('should set title based on selectedRowItemsCount', () => {
|
||||
component.transform = (transformNode) => {
|
||||
transformNode.id = 'test-id';
|
||||
transformNode.name = 'test-name';
|
||||
return transformNode;
|
||||
};
|
||||
|
||||
component.folderNode = {
|
||||
path: { elements: [{ id: 'element-1-id', name: 'element-1-name' }] }
|
||||
} as Node;
|
||||
|
||||
component.ngOnChanges();
|
||||
fixture.detectChanges();
|
||||
|
||||
expect(getBreadcrumbActionText()).toEqual('test-name');
|
||||
|
||||
component.selectedRowItemsCount = 2;
|
||||
fixture.detectChanges();
|
||||
|
||||
expect(getBreadcrumbActionText()).toEqual('BREADCRUMB.HEADER.SELECTED');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -16,14 +16,19 @@
|
||||
*/
|
||||
|
||||
import { Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild, ViewEncapsulation, OnDestroy } from '@angular/core';
|
||||
import { MatSelect } from '@angular/material/select';
|
||||
import { MatSelect, MatSelectModule } from '@angular/material/select';
|
||||
import { Node, PathElement } from '@alfresco/js-api';
|
||||
import { DocumentListComponent } from '../document-list/components/document-list.component';
|
||||
import { Subject } from 'rxjs';
|
||||
import { takeUntil } from 'rxjs/operators';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-breadcrumb',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatIconModule, TranslateModule, MatSelectModule],
|
||||
templateUrl: './breadcrumb.component.html',
|
||||
styleUrls: ['./breadcrumb.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
@@ -72,6 +77,10 @@ export class BreadcrumbComponent implements OnInit, OnChanges, OnDestroy {
|
||||
@Input()
|
||||
maxItems: number;
|
||||
|
||||
/** Number of table rows that are currently selected. */
|
||||
@Input()
|
||||
selectedRowItemsCount = 0;
|
||||
|
||||
previousNodes: PathElement[];
|
||||
lastNodes: PathElement[];
|
||||
|
||||
|
||||
@@ -15,27 +15,15 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MaterialModule } from '../material.module';
|
||||
|
||||
import { BreadcrumbComponent } from './breadcrumb.component';
|
||||
import { DropdownBreadcrumbComponent } from './dropdown-breadcrumb.component';
|
||||
import { CoreModule } from '@alfresco/adf-core';
|
||||
|
||||
export const BREADCRUMB_DIRECTIVES = [BreadcrumbComponent, DropdownBreadcrumbComponent] as const;
|
||||
|
||||
/** @deprecated use `...BREADCRUMB_DIRECTIVES` instead */
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
MaterialModule,
|
||||
CoreModule
|
||||
],
|
||||
exports: [
|
||||
BreadcrumbComponent,
|
||||
DropdownBreadcrumbComponent
|
||||
],
|
||||
declarations: [
|
||||
BreadcrumbComponent,
|
||||
DropdownBreadcrumbComponent
|
||||
]
|
||||
imports: [...BREADCRUMB_DIRECTIVES],
|
||||
exports: [...BREADCRUMB_DIRECTIVES]
|
||||
})
|
||||
export class BreadcrumbModule {}
|
||||
|
||||
@@ -16,12 +16,17 @@
|
||||
*/
|
||||
|
||||
import { Component, OnChanges, ViewChild, ViewEncapsulation } from '@angular/core';
|
||||
import { MatSelect } from '@angular/material/select';
|
||||
import { MatSelect, MatSelectModule } from '@angular/material/select';
|
||||
import { PathElement, Node } from '@alfresco/js-api';
|
||||
import { BreadcrumbComponent } from './breadcrumb.component';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-dropdown-breadcrumb',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatIconModule, MatSelectModule, TranslateModule],
|
||||
templateUrl: './dropdown-breadcrumb.component.html',
|
||||
styleUrls: ['./dropdown-breadcrumb.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
|
||||
+1
-2
@@ -47,8 +47,7 @@ describe('CategoriesManagementComponent', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [CategoriesManagementComponent],
|
||||
imports: [ContentTestingModule],
|
||||
imports: [ContentTestingModule, CategoriesManagementComponent],
|
||||
providers: [
|
||||
{
|
||||
provide: CategoryService,
|
||||
|
||||
+21
-1
@@ -17,11 +17,19 @@
|
||||
|
||||
import { Category } from '@alfresco/js-api';
|
||||
import { Component, ElementRef, EventEmitter, Input, OnDestroy, OnInit, Output, ViewChild, ViewEncapsulation } from '@angular/core';
|
||||
import { FormControl, Validators } from '@angular/forms';
|
||||
import { FormControl, ReactiveFormsModule, Validators } from '@angular/forms';
|
||||
import { EMPTY, Observable, Subject, timer } from 'rxjs';
|
||||
import { debounce, first, map, takeUntil, tap } from 'rxjs/operators';
|
||||
import { CategoriesManagementMode } from './categories-management-mode';
|
||||
import { CategoryService } from '../services/category.service';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { AutoFocusDirective } from '../../directives';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatListModule } from '@angular/material/list';
|
||||
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
||||
|
||||
interface CategoryNameControlErrors {
|
||||
duplicatedExistingCategory?: boolean;
|
||||
@@ -32,6 +40,18 @@ interface CategoryNameControlErrors {
|
||||
|
||||
@Component({
|
||||
selector: 'adf-categories-management',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
TranslateModule,
|
||||
AutoFocusDirective,
|
||||
ReactiveFormsModule,
|
||||
MatFormFieldModule,
|
||||
MatButtonModule,
|
||||
MatIconModule,
|
||||
MatListModule,
|
||||
MatProgressSpinnerModule
|
||||
],
|
||||
templateUrl: './categories-management.component.html',
|
||||
styleUrls: ['./categories-management.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
|
||||
@@ -15,27 +15,12 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { CoreModule } from '@alfresco/adf-core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { ContentDirectiveModule } from '../directives/content-directive.module';
|
||||
import { MaterialModule } from '../material.module';
|
||||
import { CategoriesManagementComponent } from './categories-management/categories-management.component';
|
||||
|
||||
/** @deprecated use `CategoriesManagementComponent` standalone component instead */
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
CoreModule,
|
||||
MaterialModule,
|
||||
TranslateModule,
|
||||
ContentDirectiveModule
|
||||
],
|
||||
declarations: [
|
||||
CategoriesManagementComponent
|
||||
],
|
||||
exports: [
|
||||
CategoriesManagementComponent
|
||||
]
|
||||
imports: [CategoriesManagementComponent],
|
||||
exports: [CategoriesManagementComponent]
|
||||
})
|
||||
export class CategoriesModule {}
|
||||
|
||||
+3
-2
@@ -61,7 +61,8 @@ describe('ContentMetadataCardComponent', () => {
|
||||
MatDialogModule,
|
||||
PipeModule,
|
||||
MatSnackBarModule,
|
||||
MatTooltipModule
|
||||
MatTooltipModule,
|
||||
ContentMetadataCardComponent
|
||||
],
|
||||
providers: [
|
||||
{ provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock },
|
||||
@@ -69,7 +70,7 @@ describe('ContentMetadataCardComponent', () => {
|
||||
{
|
||||
provide: APP_INITIALIZER,
|
||||
useFactory: versionCompatibilityFactory,
|
||||
deps: [ VersionCompatibilityService ],
|
||||
deps: [VersionCompatibilityService],
|
||||
multi: true
|
||||
}
|
||||
]
|
||||
|
||||
+8
@@ -22,9 +22,17 @@ import { ContentMetadataCustomPanel, PresetConfig } from '../../interfaces/conte
|
||||
import { VersionCompatibilityService } from '../../../version-compatibility/version-compatibility.service';
|
||||
import { ContentService } from '../../../common/services/content.service';
|
||||
import { AllowableOperationsEnum } from '../../../common/models/allowable-operations.enum';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatCardModule } from '@angular/material/card';
|
||||
import { ContentMetadataComponent } from '../content-metadata/content-metadata.component';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-content-metadata-card',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatCardModule, ContentMetadataComponent, MatButtonModule, MatIconModule, TranslateModule],
|
||||
templateUrl: './content-metadata-card.component.html',
|
||||
styleUrls: ['./content-metadata-card.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
|
||||
+2
-1
@@ -195,7 +195,8 @@ describe('ContentMetadataComponent', () => {
|
||||
MatSnackBarModule,
|
||||
MatProgressBarModule,
|
||||
MatTooltipModule,
|
||||
PipeModule
|
||||
PipeModule,
|
||||
ContentMetadataComponent
|
||||
],
|
||||
providers: [
|
||||
{ provide: TranslationService, useClass: TranslationMock },
|
||||
|
||||
+38
-18
@@ -15,21 +15,14 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import {
|
||||
Component,
|
||||
Input,
|
||||
OnChanges,
|
||||
OnDestroy,
|
||||
OnInit,
|
||||
SimpleChanges,
|
||||
ViewEncapsulation
|
||||
} from '@angular/core';
|
||||
import { Component, Input, OnChanges, OnDestroy, OnInit, SimpleChanges, ViewEncapsulation } from '@angular/core';
|
||||
import { Category, CategoryEntry, CategoryLinkBody, CategoryPaging, Node, TagBody, TagEntry, TagPaging } from '@alfresco/js-api';
|
||||
import { forkJoin, Observable, of, Subject, zip } from 'rxjs';
|
||||
import {
|
||||
AppConfigService,
|
||||
CardViewBaseItemModel,
|
||||
CardViewItem,
|
||||
CardViewModule,
|
||||
NotificationService,
|
||||
TranslationService,
|
||||
UpdateNotification
|
||||
@@ -45,6 +38,17 @@ import { CategoryService } from '../../../category/services/category.service';
|
||||
import { CategoriesManagementMode } from '../../../category/categories-management/categories-management-mode';
|
||||
import { AllowableOperationsEnum } from '../../../common/models/allowable-operations.enum';
|
||||
import { ContentService } from '../../../common/services/content.service';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatExpansionModule } from '@angular/material/expansion';
|
||||
import { ContentMetadataHeaderComponent } from './content-metadata-header.component';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatChipsModule } from '@angular/material/chips';
|
||||
import { CategoriesManagementComponent } from '../../../category';
|
||||
import { DynamicExtensionComponent } from '@alfresco/adf-extensions';
|
||||
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
||||
import { TagsCreatorComponent } from '../../../tag';
|
||||
|
||||
const DEFAULT_SEPARATOR = ', ';
|
||||
|
||||
@@ -56,6 +60,21 @@ enum DefaultPanels {
|
||||
|
||||
@Component({
|
||||
selector: 'adf-content-metadata',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
MatExpansionModule,
|
||||
ContentMetadataHeaderComponent,
|
||||
MatButtonModule,
|
||||
TranslateModule,
|
||||
MatIconModule,
|
||||
CardViewModule,
|
||||
MatChipsModule,
|
||||
CategoriesManagementComponent,
|
||||
DynamicExtensionComponent,
|
||||
MatProgressBarModule,
|
||||
TagsCreatorComponent
|
||||
],
|
||||
templateUrl: './content-metadata.component.html',
|
||||
styleUrls: ['./content-metadata.component.scss'],
|
||||
host: { class: 'adf-content-metadata' },
|
||||
@@ -173,12 +192,10 @@ export class ContentMetadataComponent implements OnChanges, OnInit, OnDestroy {
|
||||
this.updateChanges(updatedNode.changed);
|
||||
});
|
||||
|
||||
this.cardViewContentUpdateService.updatedAspect$
|
||||
.pipe(debounceTime(500), takeUntil(this.onDestroy$))
|
||||
.subscribe((node) => {
|
||||
this.node.aspectNames = node?.aspectNames;
|
||||
this.loadProperties(node);
|
||||
});
|
||||
this.cardViewContentUpdateService.updatedAspect$.pipe(debounceTime(500), takeUntil(this.onDestroy$)).subscribe((node) => {
|
||||
this.node.aspectNames = node?.aspectNames;
|
||||
this.loadProperties(node);
|
||||
});
|
||||
|
||||
this.loadProperties(this.node);
|
||||
this.verifyAllowableOperations();
|
||||
@@ -210,7 +227,10 @@ export class ContentMetadataComponent implements OnChanges, OnInit, OnDestroy {
|
||||
}
|
||||
|
||||
isPanelEditing(panelTitle: string): boolean {
|
||||
return this.editing && ((this.currentPanel.panelTitle === panelTitle && this.editedPanelTitle === panelTitle) || this.editedPanelTitle === panelTitle);
|
||||
return (
|
||||
this.editing &&
|
||||
((this.currentPanel.panelTitle === panelTitle && this.editedPanelTitle === panelTitle) || this.editedPanelTitle === panelTitle)
|
||||
);
|
||||
}
|
||||
|
||||
protected handleUpdateError(error: Error) {
|
||||
@@ -250,7 +270,6 @@ export class ContentMetadataComponent implements OnChanges, OnInit, OnDestroy {
|
||||
if (changes.displayDefaultProperties?.currentValue) {
|
||||
this.expandPanel(this.DefaultPanels.PROPERTIES);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
@@ -365,7 +384,8 @@ export class ContentMetadataComponent implements OnChanges, OnInit, OnDestroy {
|
||||
}
|
||||
|
||||
keyDown(event: KeyboardEvent) {
|
||||
if (event.keyCode === 37 || event.keyCode === 39) { // ArrowLeft && ArrowRight
|
||||
if (event.keyCode === 37 || event.keyCode === 39) {
|
||||
// ArrowLeft && ArrowRight
|
||||
event.stopPropagation();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,35 +15,16 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MaterialModule } from '../material.module';
|
||||
import { CoreModule } from '@alfresco/adf-core';
|
||||
import { ContentMetadataComponent } from './components/content-metadata/content-metadata.component';
|
||||
import { ContentMetadataCardComponent } from './components/content-metadata-card/content-metadata-card.component';
|
||||
import { TagModule } from '../tag/tag.module';
|
||||
import { CategoriesModule } from '../category/category.module';
|
||||
import { ExtensionsModule } from '@alfresco/adf-extensions';
|
||||
import { ContentMetadataHeaderComponent } from './components/content-metadata/content-metadata-header.component';
|
||||
|
||||
export const CONTENT_METADATA_DIRECTIVES = [ContentMetadataComponent, ContentMetadataCardComponent, ContentMetadataHeaderComponent] as const;
|
||||
|
||||
/** @deprecated use `...CONTENT_METADATA_DIRECTIVES` instead */
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
MaterialModule,
|
||||
CoreModule,
|
||||
TagModule,
|
||||
CategoriesModule,
|
||||
ExtensionsModule,
|
||||
ContentMetadataHeaderComponent
|
||||
],
|
||||
exports: [
|
||||
ContentMetadataComponent,
|
||||
ContentMetadataCardComponent,
|
||||
ContentMetadataHeaderComponent
|
||||
],
|
||||
declarations: [
|
||||
ContentMetadataComponent,
|
||||
ContentMetadataCardComponent
|
||||
]
|
||||
imports: [...CONTENT_METADATA_DIRECTIVES],
|
||||
exports: [...CONTENT_METADATA_DIRECTIVES]
|
||||
})
|
||||
export class ContentMetadataModule {}
|
||||
|
||||
@@ -27,7 +27,7 @@ import { DocumentListService } from '../document-list/services/document-list.ser
|
||||
import { ContentNodeSelectorComponent } from './content-node-selector.component';
|
||||
import { ContentNodeSelectorComponentData } from './content-node-selector.component-data.interface';
|
||||
import { NodeAction } from '../document-list/models/node-action.enum';
|
||||
import { NodeLockDialogComponent } from '../dialogs/node-lock.dialog';
|
||||
import { NodeLockDialogComponent } from '../dialogs/node-lock/node-lock.dialog';
|
||||
import { switchMap } from 'rxjs/operators';
|
||||
import { SitesService } from '../common/services/sites.service';
|
||||
|
||||
@@ -36,26 +36,20 @@ import { SitesService } from '../common/services/sites.service';
|
||||
})
|
||||
// eslint-disable-next-line @angular-eslint/directive-class-suffix
|
||||
export class ContentNodeDialogService {
|
||||
static nonDocumentSiteContent = [
|
||||
'blog',
|
||||
'calendar',
|
||||
'dataLists',
|
||||
'discussions',
|
||||
'links',
|
||||
'wiki'
|
||||
];
|
||||
static nonDocumentSiteContent = ['blog', 'calendar', 'dataLists', 'discussions', 'links', 'wiki'];
|
||||
|
||||
/** Emitted when an error occurs. */
|
||||
@Output()
|
||||
error: EventEmitter<any> = new EventEmitter<any>();
|
||||
|
||||
constructor(private dialog: MatDialog,
|
||||
private contentService: ContentService,
|
||||
private documentListService: DocumentListService,
|
||||
private siteService: SitesService,
|
||||
private translation: TranslationService,
|
||||
private thumbnailService: ThumbnailService) {
|
||||
}
|
||||
constructor(
|
||||
private dialog: MatDialog,
|
||||
private contentService: ContentService,
|
||||
private documentListService: DocumentListService,
|
||||
private siteService: SitesService,
|
||||
private translation: TranslationService,
|
||||
private thumbnailService: ThumbnailService
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Opens a file browser at a chosen folder location.
|
||||
@@ -65,7 +59,9 @@ export class ContentNodeDialogService {
|
||||
* @returns Information about the selected file(s)
|
||||
*/
|
||||
openFileBrowseDialogByFolderId(folderNodeId: string): Observable<Node[]> {
|
||||
return this.documentListService.getFolderNode(folderNodeId).pipe(switchMap((nodeEntry: NodeEntry) => this.openUploadFileDialog(NodeAction.CHOOSE, nodeEntry.entry, true)));
|
||||
return this.documentListService
|
||||
.getFolderNode(folderNodeId)
|
||||
.pipe(switchMap((nodeEntry: NodeEntry) => this.openUploadFileDialog(NodeAction.CHOOSE, nodeEntry.entry, true)));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -102,7 +98,9 @@ export class ContentNodeDialogService {
|
||||
* @returns Information about the selected file(s)
|
||||
*/
|
||||
openFileBrowseDialogBySite(): Observable<Node[]> {
|
||||
return this.siteService.getSites().pipe(switchMap((response: SitePaging) => this.openFileBrowseDialogByFolderId(response.list.entries[0].entry.guid)));
|
||||
return this.siteService
|
||||
.getSites()
|
||||
.pipe(switchMap((response: SitePaging) => this.openFileBrowseDialogByFolderId(response.list.entries[0].entry.guid)));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -131,7 +129,9 @@ export class ContentNodeDialogService {
|
||||
* @returns Information about the selected folder(s)
|
||||
*/
|
||||
openFolderBrowseDialogByFolderId(folderNodeId: string): Observable<Node[]> {
|
||||
return this.documentListService.getFolderNode(folderNodeId).pipe(switchMap((node: NodeEntry) => this.openUploadFolderDialog(NodeAction.CHOOSE, node.entry)));
|
||||
return this.documentListService
|
||||
.getFolderNode(folderNodeId)
|
||||
.pipe(switchMap((node: NodeEntry) => this.openUploadFolderDialog(NodeAction.CHOOSE, node.entry)));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -145,7 +145,6 @@ export class ContentNodeDialogService {
|
||||
*/
|
||||
openCopyMoveDialog(action: NodeAction, contentEntry: Node, permission?: string, excludeSiteContent?: string[]): Observable<Node[]> {
|
||||
if (this.contentService.hasAllowableOperations(contentEntry, permission)) {
|
||||
|
||||
const select = new Subject<Node[]>();
|
||||
|
||||
const data: ContentNodeSelectorComponentData = {
|
||||
@@ -236,7 +235,11 @@ export class ContentNodeDialogService {
|
||||
return select;
|
||||
}
|
||||
|
||||
private openContentNodeDialog(data: ContentNodeSelectorComponentData, panelClass: string, width: string): MatDialogRef<ContentNodeSelectorComponent> {
|
||||
private openContentNodeDialog(
|
||||
data: ContentNodeSelectorComponentData,
|
||||
panelClass: string,
|
||||
width: string
|
||||
): MatDialogRef<ContentNodeSelectorComponent> {
|
||||
return this.dialog.open(ContentNodeSelectorComponent, {
|
||||
data,
|
||||
panelClass,
|
||||
@@ -275,5 +278,4 @@ export class ContentNodeDialogService {
|
||||
private isSite(entry) {
|
||||
return !!entry.guid || entry.nodeType === 'st:site' || entry.nodeType === 'st:sites';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -84,7 +84,7 @@ adf-content-node-selector {
|
||||
justify-content: space-between;
|
||||
color: var(--adf-theme-foreground-text-color);
|
||||
|
||||
button {
|
||||
label {
|
||||
text-transform: uppercase;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
+5
-5
@@ -294,7 +294,7 @@ describe('ContentNodeSelectorComponent', () => {
|
||||
const adfUploadButton = fixture.debugElement.query(By.css('adf-upload-button'));
|
||||
|
||||
expect(adfUploadButton).not.toBeNull();
|
||||
expect(adfUploadButton.nativeElement.textContent).toEqual('file_uploadFORM.FIELD.UPLOAD');
|
||||
expect(adfUploadButton.nativeElement.textContent).toEqual('file_upload FORM.FIELD.UPLOAD');
|
||||
});
|
||||
|
||||
it('should be able to disable UploadButton if showingSearch set to true', async () => {
|
||||
@@ -303,7 +303,7 @@ describe('ContentNodeSelectorComponent', () => {
|
||||
component.hasAllowableOperations = true;
|
||||
|
||||
fixture.detectChanges();
|
||||
const adfUploadButton = fixture.debugElement.query(By.css('adf-upload-button button'));
|
||||
const adfUploadButton = fixture.debugElement.query(By.css('adf-upload-button input'));
|
||||
|
||||
expect(adfUploadButton).not.toBeNull();
|
||||
expect(adfUploadButton.nativeElement.disabled).toBe(true);
|
||||
@@ -315,7 +315,7 @@ describe('ContentNodeSelectorComponent', () => {
|
||||
component.hasAllowableOperations = true;
|
||||
|
||||
fixture.detectChanges();
|
||||
const adfUploadButton = fixture.debugElement.query(By.css('adf-upload-button button'));
|
||||
const adfUploadButton = fixture.debugElement.query(By.css('adf-upload-button input'));
|
||||
|
||||
expect(adfUploadButton).not.toBeNull();
|
||||
expect(adfUploadButton.nativeElement.disabled).toBe(false);
|
||||
@@ -354,7 +354,7 @@ describe('ContentNodeSelectorComponent', () => {
|
||||
component.onTabSelectionChange(1);
|
||||
|
||||
fixture.detectChanges();
|
||||
const adfUploadButton = fixture.debugElement.query(By.css('adf-upload-button button'));
|
||||
const adfUploadButton = fixture.debugElement.query(By.css('adf-upload-button input'));
|
||||
|
||||
expect(adfUploadButton).not.toBeNull();
|
||||
expect(adfUploadButton.nativeElement.disabled).toBe(true);
|
||||
@@ -365,7 +365,7 @@ describe('ContentNodeSelectorComponent', () => {
|
||||
component.hasAllowableOperations = true;
|
||||
|
||||
fixture.detectChanges();
|
||||
const adfUploadButton = fixture.debugElement.query(By.css('adf-upload-button button'));
|
||||
const adfUploadButton = fixture.debugElement.query(By.css('adf-upload-button input'));
|
||||
|
||||
expect(adfUploadButton).not.toBeNull();
|
||||
expect(adfUploadButton.nativeElement.disabled).toBe(false);
|
||||
|
||||
@@ -21,14 +21,14 @@ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { MaterialModule } from '../material.module';
|
||||
import { ContentNodeSelectorPanelComponent } from './content-node-selector-panel/content-node-selector-panel.component';
|
||||
import { ContentNodeSelectorComponent } from './content-node-selector.component';
|
||||
import { BreadcrumbModule } from '../breadcrumb/breadcrumb.module';
|
||||
import { BREADCRUMB_DIRECTIVES } from '../breadcrumb/breadcrumb.module';
|
||||
import { SearchModule } from '../search/search.module';
|
||||
import { CoreModule } from '@alfresco/adf-core';
|
||||
import { DocumentListModule } from '../document-list/document-list.module';
|
||||
import { NameLocationCellComponent } from './name-location-cell/name-location-cell.component';
|
||||
import { UploadModule } from '../upload/upload.module';
|
||||
import { CONTENT_UPLOAD_DIRECTIVES } from '../upload/upload.module';
|
||||
import { SearchQueryBuilderService } from '../search/services/search-query-builder.service';
|
||||
import { ContentDirectiveModule } from '../directives/content-directive.module';
|
||||
import { CONTENT_DIRECTIVES } from '../directives/content-directive.module';
|
||||
import { DropdownSitesComponent } from './site-dropdown/sites-dropdown.component';
|
||||
|
||||
@NgModule({
|
||||
@@ -39,12 +39,12 @@ import { DropdownSitesComponent } from './site-dropdown/sites-dropdown.component
|
||||
CommonModule,
|
||||
MaterialModule,
|
||||
DropdownSitesComponent,
|
||||
BreadcrumbModule,
|
||||
...BREADCRUMB_DIRECTIVES,
|
||||
SearchModule,
|
||||
DocumentListModule,
|
||||
UploadModule,
|
||||
ContentDirectiveModule,
|
||||
NameLocationCellComponent
|
||||
NameLocationCellComponent,
|
||||
CONTENT_DIRECTIVES,
|
||||
...CONTENT_UPLOAD_DIRECTIVES
|
||||
],
|
||||
exports: [ContentNodeSelectorPanelComponent, NameLocationCellComponent, ContentNodeSelectorComponent],
|
||||
declarations: [ContentNodeSelectorPanelComponent, ContentNodeSelectorComponent],
|
||||
|
||||
@@ -83,7 +83,6 @@
|
||||
data-automation-id="adf-share-link"
|
||||
class="adf-share-link__input"
|
||||
matInput
|
||||
cdkFocusInitial
|
||||
placeholder="{{ 'SHARE.PUBLIC-LINK' | translate }}"
|
||||
[attr.aria-label]="'SHARE.PUBLIC-LINK' | translate"
|
||||
formControlName="sharedUrl"
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
*/
|
||||
|
||||
import { TestBed, ComponentFixture } from '@angular/core/testing';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA, MatDialog, MatDialogModule } from '@angular/material/dialog';
|
||||
import { of } from 'rxjs';
|
||||
import { NotificationService } from '@alfresco/adf-core';
|
||||
import { NodesApiService, RenditionService } from '../common';
|
||||
@@ -33,7 +33,6 @@ import { MatSlideToggleHarness } from '@angular/material/slide-toggle/testing';
|
||||
describe('ShareDialogComponent', () => {
|
||||
let loader: HarnessLoader;
|
||||
let node: NodeEntry;
|
||||
let matDialog: MatDialog;
|
||||
const notificationServiceMock = {
|
||||
openSnackMessage: jasmine.createSpy('openSnackMessage')
|
||||
};
|
||||
@@ -56,7 +55,7 @@ describe('ShareDialogComponent', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [ContentTestingModule],
|
||||
imports: [ContentTestingModule, MatDialogModule, ShareDialogComponent],
|
||||
providers: [
|
||||
{ provide: NotificationService, useValue: notificationServiceMock },
|
||||
{
|
||||
@@ -71,7 +70,6 @@ describe('ShareDialogComponent', () => {
|
||||
fixture = TestBed.createComponent(ShareDialogComponent);
|
||||
component = fixture.componentInstance;
|
||||
|
||||
matDialog = TestBed.inject(MatDialog);
|
||||
sharedLinksApiService = TestBed.inject(SharedLinksApiService);
|
||||
renditionService = TestBed.inject(RenditionService);
|
||||
nodesApiService = TestBed.inject(NodesApiService);
|
||||
@@ -179,7 +177,8 @@ describe('ShareDialogComponent', () => {
|
||||
});
|
||||
|
||||
it('should open a confirmation dialog when unshare button is triggered', async () => {
|
||||
spyOn(matDialog, 'open').and.returnValue({ beforeClosed: () => of(false) } as any);
|
||||
const dialog = fixture.debugElement.injector.get(MatDialog);
|
||||
const openSpy = spyOn(dialog, 'open').and.returnValue({ beforeClosed: () => of(false) } as any);
|
||||
spyOn(sharedLinksApiService, 'deleteSharedLink').and.callThrough();
|
||||
|
||||
node.entry.properties['qshare:sharedId'] = 'sharedId';
|
||||
@@ -194,11 +193,12 @@ describe('ShareDialogComponent', () => {
|
||||
const toggle = await loader.getHarness(MatSlideToggleHarness.with({ selector: shareToggleId }));
|
||||
await toggle.toggle();
|
||||
|
||||
expect(matDialog.open).toHaveBeenCalled();
|
||||
expect(openSpy).toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should unshare file when confirmation dialog returns true', async () => {
|
||||
spyOn(matDialog, 'open').and.returnValue({ beforeClosed: () => of(true) } as any);
|
||||
const dialog = fixture.debugElement.injector.get(MatDialog);
|
||||
spyOn(dialog, 'open').and.returnValue({ beforeClosed: () => of(true) } as any);
|
||||
spyOn(sharedLinksApiService, 'deleteSharedLink').and.returnValue(of({}));
|
||||
node.entry.properties['qshare:sharedId'] = 'sharedId';
|
||||
|
||||
@@ -208,6 +208,7 @@ describe('ShareDialogComponent', () => {
|
||||
};
|
||||
|
||||
fixture.detectChanges();
|
||||
await fixture.whenStable();
|
||||
|
||||
const toggle = await loader.getHarness(MatSlideToggleHarness.with({ selector: shareToggleId }));
|
||||
await toggle.toggle();
|
||||
@@ -216,7 +217,8 @@ describe('ShareDialogComponent', () => {
|
||||
});
|
||||
|
||||
it('should not unshare file when confirmation dialog returns false', async () => {
|
||||
spyOn(matDialog, 'open').and.returnValue({ beforeClosed: () => of(false) } as any);
|
||||
const dialog = fixture.debugElement.injector.get(MatDialog);
|
||||
spyOn(dialog, 'open').and.returnValue({ beforeClosed: () => of(false) } as any);
|
||||
spyOn(sharedLinksApiService, 'deleteSharedLink').and.callThrough();
|
||||
node.entry.properties['qshare:sharedId'] = 'sharedId';
|
||||
|
||||
|
||||
@@ -16,17 +16,24 @@
|
||||
*/
|
||||
|
||||
import { Component, Inject, OnInit, ViewEncapsulation, ViewChild, OnDestroy } from '@angular/core';
|
||||
import { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dialog';
|
||||
import { MatSlideToggleChange } from '@angular/material/slide-toggle';
|
||||
import { FormControl, FormGroup, Validators } from '@angular/forms';
|
||||
import { MAT_DIALOG_DATA, MatDialog, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
||||
import { MatSlideToggleChange, MatSlideToggleModule } from '@angular/material/slide-toggle';
|
||||
import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
|
||||
import { Subject } from 'rxjs';
|
||||
import { ContentService } from '../common/services/content.service';
|
||||
import { SharedLinksApiService } from './services/shared-links-api.service';
|
||||
import { SharedLinkBodyCreate } from '@alfresco/js-api';
|
||||
import { ConfirmDialogComponent } from '@alfresco/adf-core';
|
||||
import { ClipboardModule, ConfirmDialogComponent } from '@alfresco/adf-core';
|
||||
import { ContentNodeShareSettings } from './content-node-share.settings';
|
||||
import { RenditionService } from '../common/services/rendition.service';
|
||||
import { format, add, endOfDay, isBefore } from 'date-fns';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatDatepickerModule } from '@angular/material/datepicker';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
|
||||
interface SharedDialogFormProps {
|
||||
sharedUrl: FormControl<string>;
|
||||
@@ -35,6 +42,20 @@ interface SharedDialogFormProps {
|
||||
|
||||
@Component({
|
||||
selector: 'adf-share-dialog',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
TranslateModule,
|
||||
MatIconModule,
|
||||
MatDialogModule,
|
||||
ReactiveFormsModule,
|
||||
MatSlideToggleModule,
|
||||
MatFormFieldModule,
|
||||
MatDatepickerModule,
|
||||
MatInputModule,
|
||||
ClipboardModule,
|
||||
MatButtonModule
|
||||
],
|
||||
templateUrl: './content-node-share.dialog.html',
|
||||
styleUrls: ['./content-node-share.dialog.scss'],
|
||||
host: { class: 'adf-share-dialog' },
|
||||
|
||||
+4
-3
@@ -21,10 +21,12 @@ import { Component } from '@angular/core';
|
||||
import { DOCUMENT } from '@angular/common';
|
||||
import { ContentTestingModule } from '../testing/content.testing.module';
|
||||
import { CoreModule } from '@alfresco/adf-core';
|
||||
import { ContentNodeShareModule } from './content-node-share.module';
|
||||
import { NodeSharedDirective } from '@alfresco/adf-content-services';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-node-share-test-component',
|
||||
standalone: true,
|
||||
imports: [NodeSharedDirective],
|
||||
template: `
|
||||
<button
|
||||
[disabled]="!shareRef.isFile"
|
||||
@@ -51,8 +53,7 @@ describe('NodeSharedDirective', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [CoreModule.forRoot(), ContentTestingModule, ContentNodeShareModule],
|
||||
declarations: [NodeShareTestComponent]
|
||||
imports: [CoreModule.forRoot(), ContentTestingModule, NodeShareTestComponent]
|
||||
});
|
||||
fixture = TestBed.createComponent(NodeShareTestComponent);
|
||||
document = TestBed.inject(DOCUMENT);
|
||||
|
||||
@@ -26,6 +26,7 @@ import { takeUntil } from 'rxjs/operators';
|
||||
|
||||
@Directive({
|
||||
selector: '[adf-share]',
|
||||
standalone: true,
|
||||
exportAs: 'adfShare'
|
||||
})
|
||||
export class NodeSharedDirective implements OnChanges, OnDestroy {
|
||||
|
||||
@@ -16,15 +16,14 @@
|
||||
*/
|
||||
|
||||
import { NgModule } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { CoreModule } from '@alfresco/adf-core';
|
||||
import { MaterialModule } from '../material.module';
|
||||
import { ShareDialogComponent } from './content-node-share.dialog';
|
||||
import { NodeSharedDirective } from './content-node-share.directive';
|
||||
|
||||
export const CONTENT_NODE_SHARE_DIRECTIVES = [ShareDialogComponent, NodeSharedDirective] as const;
|
||||
|
||||
/** @deprecated use `...CONTENT_NODE_SHARE_DIRECTIVES` or import each directive individually */
|
||||
@NgModule({
|
||||
imports: [CoreModule, CommonModule, MaterialModule],
|
||||
declarations: [ShareDialogComponent, NodeSharedDirective],
|
||||
exports: [ShareDialogComponent, NodeSharedDirective]
|
||||
imports: [...CONTENT_NODE_SHARE_DIRECTIVES],
|
||||
exports: [...CONTENT_NODE_SHARE_DIRECTIVES]
|
||||
})
|
||||
export class ContentNodeShareModule {}
|
||||
|
||||
@@ -19,92 +19,93 @@ import { CommonModule } from '@angular/common';
|
||||
import { NgModule, ModuleWithProviders, APP_INITIALIZER } from '@angular/core';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { CoreModule, SearchTextModule, provideTranslations } from '@alfresco/adf-core';
|
||||
|
||||
import { MaterialModule } from './material.module';
|
||||
|
||||
import { TagModule } from './tag/tag.module';
|
||||
import { CONTENT_TAG_DIRECTIVES } from './tag/tag.module';
|
||||
import { DocumentListModule } from './document-list/document-list.module';
|
||||
import { UploadModule } from './upload/upload.module';
|
||||
import { SearchModule } from './search/search.module';
|
||||
import { BreadcrumbModule } from './breadcrumb/breadcrumb.module';
|
||||
import { VersionManagerModule } from './version-manager/version-manager.module';
|
||||
import { BREADCRUMB_DIRECTIVES } from './breadcrumb/breadcrumb.module';
|
||||
import { CONTENT_VERSION_DIRECTIVES } from './version-manager/version-manager.module';
|
||||
import { ContentNodeSelectorModule } from './content-node-selector/content-node-selector.module';
|
||||
import { ContentNodeShareModule } from './content-node-share/content-node-share.module';
|
||||
import { ContentDirectiveModule } from './directives/content-directive.module';
|
||||
import { DialogModule } from './dialogs/dialog.module';
|
||||
import { ContentMetadataModule } from './content-metadata/content-metadata.module';
|
||||
import { PermissionManagerModule } from './permission-manager/permission-manager.module';
|
||||
import { TreeViewModule } from './tree-view/tree-view.module';
|
||||
import { CONTENT_NODE_SHARE_DIRECTIVES } from './content-node-share/content-node-share.module';
|
||||
import { CONTENT_DIRECTIVES } from './directives/content-directive.module';
|
||||
import { CONTENT_DIALOG_DIRECTIVES } from './dialogs/dialog.module';
|
||||
import { CONTENT_METADATA_DIRECTIVES } from './content-metadata/content-metadata.module';
|
||||
import { CONTENT_PERMISSION_MANAGER_DIRECTIVES } from './permission-manager/permission-manager.module';
|
||||
import { ContentTypeModule } from './content-type/content-type.module';
|
||||
import { AspectListModule } from './aspect-list/aspect-list.module';
|
||||
import { VersionCompatibilityModule } from './version-compatibility/version-compatibility.module';
|
||||
import { versionCompatibilityFactory } from './version-compatibility/version-compatibility-factory';
|
||||
import { VersionCompatibilityService } from './version-compatibility/version-compatibility.service';
|
||||
import { CONTENT_PIPES } from './pipes/content-pipe.module';
|
||||
import { NodeCommentsModule } from './node-comments/node-comments.module';
|
||||
import { TreeModule } from './tree/tree.module';
|
||||
import { AlfrescoViewerModule } from './viewer/alfresco-viewer.module';
|
||||
import { CategoriesModule } from './category/category.module';
|
||||
import { contentAuthLoaderFactory } from './auth-loader/content-auth-loader-factory';
|
||||
import { ContentAuthLoaderService } from './auth-loader/content-auth-loader.service';
|
||||
import { DropdownSitesComponent } from './content-node-selector/site-dropdown/sites-dropdown.component';
|
||||
import { CategoriesManagementComponent } from './category';
|
||||
import { TreeComponent } from './tree';
|
||||
import { NewVersionUploaderDialogComponent } from './new-version-uploader';
|
||||
import { VersionCompatibilityDirective } from './version-compatibility';
|
||||
import { CONTENT_UPLOAD_DIRECTIVES } from './upload';
|
||||
import { TreeViewComponent } from './tree-view';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
...CONTENT_PIPES,
|
||||
CoreModule,
|
||||
TagModule,
|
||||
...CONTENT_TAG_DIRECTIVES,
|
||||
CommonModule,
|
||||
FormsModule,
|
||||
ReactiveFormsModule,
|
||||
DialogModule,
|
||||
...CONTENT_DIALOG_DIRECTIVES,
|
||||
SearchModule,
|
||||
DocumentListModule,
|
||||
UploadModule,
|
||||
...CONTENT_UPLOAD_DIRECTIVES,
|
||||
MaterialModule,
|
||||
DropdownSitesComponent,
|
||||
BreadcrumbModule,
|
||||
...BREADCRUMB_DIRECTIVES,
|
||||
ContentNodeSelectorModule,
|
||||
ContentNodeShareModule,
|
||||
ContentMetadataModule,
|
||||
ContentDirectiveModule,
|
||||
PermissionManagerModule,
|
||||
VersionManagerModule,
|
||||
TreeViewModule,
|
||||
...CONTENT_NODE_SHARE_DIRECTIVES,
|
||||
...CONTENT_METADATA_DIRECTIVES,
|
||||
...CONTENT_DIRECTIVES,
|
||||
...CONTENT_PERMISSION_MANAGER_DIRECTIVES,
|
||||
...CONTENT_VERSION_DIRECTIVES,
|
||||
TreeViewComponent,
|
||||
ContentTypeModule,
|
||||
AspectListModule,
|
||||
VersionCompatibilityModule,
|
||||
VersionCompatibilityDirective,
|
||||
NodeCommentsModule,
|
||||
TreeModule,
|
||||
TreeComponent,
|
||||
SearchTextModule,
|
||||
AlfrescoViewerModule,
|
||||
CategoriesModule
|
||||
CategoriesManagementComponent,
|
||||
NewVersionUploaderDialogComponent
|
||||
],
|
||||
providers: [provideTranslations('adf-content-services', 'assets/adf-content-services')],
|
||||
exports: [
|
||||
...CONTENT_PIPES,
|
||||
TagModule,
|
||||
...CONTENT_TAG_DIRECTIVES,
|
||||
DocumentListModule,
|
||||
UploadModule,
|
||||
...CONTENT_UPLOAD_DIRECTIVES,
|
||||
SearchModule,
|
||||
DropdownSitesComponent,
|
||||
BreadcrumbModule,
|
||||
...BREADCRUMB_DIRECTIVES,
|
||||
ContentNodeSelectorModule,
|
||||
ContentNodeShareModule,
|
||||
ContentMetadataModule,
|
||||
DialogModule,
|
||||
ContentDirectiveModule,
|
||||
PermissionManagerModule,
|
||||
VersionManagerModule,
|
||||
TreeViewModule,
|
||||
...CONTENT_NODE_SHARE_DIRECTIVES,
|
||||
...CONTENT_METADATA_DIRECTIVES,
|
||||
...CONTENT_DIALOG_DIRECTIVES,
|
||||
...CONTENT_DIRECTIVES,
|
||||
...CONTENT_PERMISSION_MANAGER_DIRECTIVES,
|
||||
...CONTENT_VERSION_DIRECTIVES,
|
||||
TreeViewComponent,
|
||||
AspectListModule,
|
||||
ContentTypeModule,
|
||||
VersionCompatibilityModule,
|
||||
VersionCompatibilityDirective,
|
||||
NodeCommentsModule,
|
||||
TreeModule,
|
||||
TreeComponent,
|
||||
SearchTextModule,
|
||||
AlfrescoViewerModule,
|
||||
CategoriesModule
|
||||
CategoriesManagementComponent,
|
||||
NewVersionUploaderDialogComponent
|
||||
]
|
||||
})
|
||||
export class ContentModule {
|
||||
|
||||
+9
-5
@@ -23,9 +23,8 @@ import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/materia
|
||||
import { By } from '@angular/platform-browser';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { AppConfigService, AppConfigServiceMock, TranslationMock, TranslationService } from '@alfresco/adf-core';
|
||||
import { CategoriesManagementComponent } from '../category';
|
||||
import { CategoriesManagementComponent } from '../../category';
|
||||
import { HttpClientTestingModule } from '@angular/common/http/testing';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
|
||||
describe('Category selector dialog component', () => {
|
||||
let fixture: ComponentFixture<CategorySelectorDialogComponent>;
|
||||
@@ -52,14 +51,19 @@ describe('Category selector dialog component', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [MatFormFieldModule, TranslateModule.forRoot(), MatDialogModule, HttpClientTestingModule],
|
||||
imports: [
|
||||
TranslateModule.forRoot(),
|
||||
MatDialogModule,
|
||||
HttpClientTestingModule,
|
||||
CategoriesManagementComponent,
|
||||
CategorySelectorDialogComponent
|
||||
],
|
||||
providers: [
|
||||
{ provide: AppConfigService, useClass: AppConfigServiceMock },
|
||||
{ provide: MatDialogRef, useValue: dialogRef },
|
||||
{ provide: MAT_DIALOG_DATA, useValue: options },
|
||||
{ provide: TranslationService, useClass: TranslationMock }
|
||||
],
|
||||
declarations: [CategoriesManagementComponent, CategorySelectorDialogComponent]
|
||||
]
|
||||
});
|
||||
dialogRef.close.calls.reset();
|
||||
fixture = TestBed.createComponent(CategorySelectorDialogComponent);
|
||||
+8
-4
@@ -16,10 +16,13 @@
|
||||
*/
|
||||
|
||||
import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
||||
import { Subject } from 'rxjs';
|
||||
import { Category } from '@alfresco/js-api';
|
||||
import { CategoriesManagementMode } from '../category';
|
||||
import { CategoriesManagementComponent, CategoriesManagementMode } from '../../category';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
|
||||
export interface CategorySelectorDialogOptions {
|
||||
select: Subject<Category[]>;
|
||||
@@ -28,6 +31,8 @@ export interface CategorySelectorDialogOptions {
|
||||
|
||||
@Component({
|
||||
selector: 'adf-category-selector-dialog',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatDialogModule, TranslateModule, CategoriesManagementComponent, MatButtonModule],
|
||||
templateUrl: './category-selector.dialog.html',
|
||||
styleUrls: ['./category-selector.dialog.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
@@ -40,8 +45,7 @@ export class CategorySelectorDialogComponent implements OnInit {
|
||||
constructor(
|
||||
private dialog: MatDialogRef<CategorySelectorDialogComponent, boolean>,
|
||||
@Inject(MAT_DIALOG_DATA) private options: CategorySelectorDialogOptions
|
||||
) {
|
||||
}
|
||||
) {}
|
||||
|
||||
ngOnInit() {
|
||||
this.multiSelect = this.options.multiSelect ?? true;
|
||||
@@ -15,44 +15,24 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { CoreModule } from '@alfresco/adf-core';
|
||||
|
||||
import { MaterialModule } from '../material.module';
|
||||
import { FolderDialogComponent } from './folder.dialog';
|
||||
import { NodeLockDialogComponent } from './node-lock.dialog';
|
||||
import { MatDatetimepickerModule } from '@mat-datetimepicker/core';
|
||||
import { FolderDialogComponent } from './folder/folder.dialog';
|
||||
import { NodeLockDialogComponent } from './node-lock/node-lock.dialog';
|
||||
import { LibraryDialogComponent } from './library/library.dialog';
|
||||
import { ContentDirectiveModule } from '../directives';
|
||||
import { DownloadZipDialogModule } from './download-zip/download-zip.dialog.module';
|
||||
import { CategorySelectorDialogComponent } from './category-selector.dialog';
|
||||
import { CategoriesModule } from '../category';
|
||||
import { CategorySelectorDialogComponent } from './category-selector/category-selector.dialog';
|
||||
|
||||
export const CONTENT_DIALOG_DIRECTIVES = [
|
||||
DownloadZipDialogModule,
|
||||
FolderDialogComponent,
|
||||
NodeLockDialogComponent,
|
||||
LibraryDialogComponent,
|
||||
CategorySelectorDialogComponent
|
||||
];
|
||||
|
||||
/** @deprecated use `..CONTENT_DIALOG_DIRECTIVES` or standalone component imports instead */
|
||||
@NgModule({
|
||||
imports: [
|
||||
CommonModule,
|
||||
MaterialModule,
|
||||
CoreModule,
|
||||
FormsModule,
|
||||
ReactiveFormsModule,
|
||||
MatDatetimepickerModule,
|
||||
ContentDirectiveModule,
|
||||
DownloadZipDialogModule,
|
||||
CategoriesModule
|
||||
],
|
||||
declarations: [
|
||||
FolderDialogComponent,
|
||||
NodeLockDialogComponent,
|
||||
LibraryDialogComponent,
|
||||
CategorySelectorDialogComponent
|
||||
],
|
||||
exports: [
|
||||
FolderDialogComponent,
|
||||
NodeLockDialogComponent,
|
||||
LibraryDialogComponent,
|
||||
CategorySelectorDialogComponent
|
||||
]
|
||||
imports: [...CONTENT_DIALOG_DIRECTIVES],
|
||||
exports: [...CONTENT_DIALOG_DIRECTIVES]
|
||||
})
|
||||
export class DialogModule {}
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
<h1 matDialogTitle>{{ 'CORE.DIALOG.DOWNLOAD_ZIP.TITLE' | translate }}</h1>
|
||||
<div mat-dialog-content>
|
||||
<mat-progress-bar color="primary" mode="indeterminate"></mat-progress-bar>
|
||||
<div mat-dialog-content class="adf-dialog-content">
|
||||
<mat-progress-bar value="{{ percentageDone }}" color="primary" mode="determinate"></mat-progress-bar>
|
||||
<div class="adf-dialog-content-progress-text">
|
||||
<span class="adf-dialog-content-progress-text-percentage">
|
||||
{{ percentageDone }}%
|
||||
</span>
|
||||
{{ 'CORE.DIALOG.DOWNLOAD_ZIP.COMPLETE' | translate }}
|
||||
</div>
|
||||
</div>
|
||||
<mat-dialog-actions align="end">
|
||||
<button class="adf-download-zip-dialog-button" mat-button color="primary" id="cancel-button" (click)="cancelDownload()">
|
||||
|
||||
@@ -1,3 +1,15 @@
|
||||
.adf-download-zip-dialog-button {
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.adf-dialog-content:has(.adf-dialog-content-progress-text) {
|
||||
padding: 0;
|
||||
|
||||
.adf-dialog-content-progress-text {
|
||||
margin-top: 4px;
|
||||
|
||||
&-percentage {
|
||||
font-weight: 900;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ import { TestBed, ComponentFixture } from '@angular/core/testing';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
|
||||
import { DownloadZipDialogComponent } from './download-zip.dialog';
|
||||
import { DownloadZipService } from './services/download-zip.service';
|
||||
import { DownloadEntry, FileDownloadStatus } from '@alfresco/js-api';
|
||||
import { EMPTY, Observable, of } from 'rxjs';
|
||||
import { AlfrescoApiService, AlfrescoApiServiceMock, RedirectAuthService, TranslationMock, TranslationService } from '@alfresco/adf-core';
|
||||
import { HttpClientTestingModule } from '@angular/common/http/testing';
|
||||
@@ -167,4 +168,28 @@ describe('DownloadZipDialogComponent', () => {
|
||||
expect(component.cancelDownload).toHaveBeenCalled();
|
||||
expect(component.download).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should waitForDownload and display correct download %', () => {
|
||||
const downloadEntry$: Observable<DownloadEntry> = new Observable((observer) => {
|
||||
observer.next({
|
||||
entry: {
|
||||
filesAdded: 10,
|
||||
bytesAdded: 1000,
|
||||
id: '1',
|
||||
totalFiles: 10,
|
||||
totalBytes: 1000,
|
||||
status: FileDownloadStatus.DONE
|
||||
}
|
||||
});
|
||||
observer.complete();
|
||||
});
|
||||
|
||||
const downloadZipSpy = spyOn(downloadZipService, 'getDownload').and.callFake(() => downloadEntry$);
|
||||
|
||||
component.waitAndDownload('1', 'testUrl', 'filename');
|
||||
fixture.detectChanges();
|
||||
|
||||
expect(downloadZipSpy).toHaveBeenCalledWith('1');
|
||||
expect(component.percentageDone).toBe(100);
|
||||
});
|
||||
});
|
||||
|
||||
+4
-3
@@ -19,6 +19,7 @@ import { Component, Input, OnInit, OnChanges } from '@angular/core';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { DownloadZipDialogComponent } from './download-zip.dialog';
|
||||
import { zipNode, downloadEntry } from './mock/download-zip-data.mock';
|
||||
import { FileDownloadStatus } from '@alfresco/js-api';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-download-zip-dialog-storybook',
|
||||
@@ -38,11 +39,11 @@ export class DownloadZipDialogStorybookComponent implements OnInit, OnChanges {
|
||||
this.setEntryStatus(this.showLoading);
|
||||
}
|
||||
|
||||
setEntryStatus(isLoading: boolean){
|
||||
setEntryStatus(isLoading: boolean) {
|
||||
if (!isLoading) {
|
||||
downloadEntry.entry.status = 'DONE';
|
||||
downloadEntry.entry.status = FileDownloadStatus.DONE;
|
||||
} else {
|
||||
downloadEntry.entry.status = 'PACKING';
|
||||
downloadEntry.entry.status = FileDownloadStatus.IN_PROGRESS;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||
import { NodesApiService } from '../../common/services/nodes-api.service';
|
||||
import { DownloadZipService } from './services/download-zip.service';
|
||||
import { ContentService } from '../../common/services/content.service';
|
||||
import { FileDownloadStatus } from '@alfresco/js-api';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-download-zip-dialog',
|
||||
@@ -32,6 +33,7 @@ export class DownloadZipDialogComponent implements OnInit {
|
||||
// flag for async threads
|
||||
cancelled = false;
|
||||
downloadId: string;
|
||||
percentageDone = 0;
|
||||
|
||||
constructor(
|
||||
private dialogRef: MatDialogRef<DownloadZipDialogComponent>,
|
||||
@@ -79,7 +81,12 @@ export class DownloadZipDialogComponent implements OnInit {
|
||||
|
||||
this.downloadZipService.getDownload(downloadId).subscribe((downloadEntry) => {
|
||||
if (downloadEntry.entry) {
|
||||
if (downloadEntry.entry.status === 'DONE') {
|
||||
if (downloadEntry.entry.status === FileDownloadStatus.IN_PROGRESS) {
|
||||
this.percentageDone = Number(((downloadEntry.entry.bytesAdded * 100) / downloadEntry.entry.totalBytes).toFixed(2));
|
||||
}
|
||||
|
||||
if (downloadEntry.entry.status === FileDownloadStatus.DONE) {
|
||||
this.percentageDone = 100;
|
||||
this.download(url, fileName);
|
||||
} else {
|
||||
setTimeout(() => {
|
||||
|
||||
+17
-11
@@ -24,23 +24,29 @@ export const forbidSpecialCharacters = ({ value }: UntypedFormControl) => {
|
||||
const specialCharacters: RegExp = /([\*\"\<\>\\\/\?\:\|])/;
|
||||
const isValid: boolean = !specialCharacters.test(value);
|
||||
|
||||
return (isValid) ? null : {
|
||||
message: `${I18N_ERRORS_PATH}.SPECIAL_CHARACTERS`
|
||||
};
|
||||
return isValid
|
||||
? null
|
||||
: {
|
||||
message: `${I18N_ERRORS_PATH}.SPECIAL_CHARACTERS`
|
||||
};
|
||||
};
|
||||
|
||||
export const forbidEndingDot = ({ value }: UntypedFormControl) => {
|
||||
const isValid: boolean = ((value || '').trim().split('').pop() !== '.');
|
||||
const isValid: boolean = (value || '').trim().split('').pop() !== '.';
|
||||
|
||||
return isValid ? null : {
|
||||
message: `${I18N_ERRORS_PATH}.ENDING_DOT`
|
||||
};
|
||||
return isValid
|
||||
? null
|
||||
: {
|
||||
message: `${I18N_ERRORS_PATH}.ENDING_DOT`
|
||||
};
|
||||
};
|
||||
|
||||
export const forbidOnlySpaces = ({ value }: UntypedFormControl) => {
|
||||
const isValid: boolean = !!((value || '')).trim();
|
||||
const isValid: boolean = !!(value || '').trim();
|
||||
|
||||
return isValid ? null : {
|
||||
message: `${I18N_ERRORS_PATH}.ONLY_SPACES`
|
||||
};
|
||||
return isValid
|
||||
? null
|
||||
: {
|
||||
message: `${I18N_ERRORS_PATH}.ONLY_SPACES`
|
||||
};
|
||||
};
|
||||
+2
-2
@@ -17,11 +17,11 @@
|
||||
|
||||
import { TestBed, ComponentFixture } from '@angular/core/testing';
|
||||
import { MatDialogRef } from '@angular/material/dialog';
|
||||
import { NodesApiService } from '../common/services/nodes-api.service';
|
||||
import { NodesApiService } from '../../common/services/nodes-api.service';
|
||||
|
||||
import { FolderDialogComponent } from './folder.dialog';
|
||||
import { BehaviorSubject, throwError } from 'rxjs';
|
||||
import { ContentTestingModule } from '../testing/content.testing.module';
|
||||
import { ContentTestingModule } from '../../testing/content.testing.module';
|
||||
import { By } from '@angular/platform-browser';
|
||||
|
||||
describe('FolderDialogComponent', () => {
|
||||
+20
-6
@@ -16,19 +16,33 @@
|
||||
*/
|
||||
|
||||
import { Observable } from 'rxjs';
|
||||
|
||||
import { Component, Inject, OnInit, Optional, EventEmitter, Output, ViewEncapsulation } from '@angular/core';
|
||||
import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||
|
||||
import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
|
||||
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
||||
import { Node } from '@alfresco/js-api';
|
||||
import { TranslationService } from '@alfresco/adf-core';
|
||||
import { NodesApiService } from '../common/services/nodes-api.service';
|
||||
|
||||
import { NodesApiService } from '../../common/services/nodes-api.service';
|
||||
import { forbidEndingDot, forbidOnlySpaces, forbidSpecialCharacters } from './folder-name.validators';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { AutoFocusDirective } from '../../directives';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-folder-dialog',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
MatDialogModule,
|
||||
TranslateModule,
|
||||
ReactiveFormsModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
AutoFocusDirective,
|
||||
MatButtonModule
|
||||
],
|
||||
templateUrl: './folder.dialog.html',
|
||||
styleUrls: ['./folder.dialog.scss'],
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
@@ -39,7 +39,7 @@ describe('LibraryDialogComponent', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [ContentTestingModule],
|
||||
imports: [ContentTestingModule, LibraryDialogComponent],
|
||||
providers: [{ provide: MatDialogRef, useValue: dialogRef }],
|
||||
schemas: [NO_ERRORS_SCHEMA]
|
||||
});
|
||||
|
||||
@@ -16,29 +16,44 @@
|
||||
*/
|
||||
|
||||
import { Observable, Subject } from 'rxjs';
|
||||
import {
|
||||
Component,
|
||||
OnInit,
|
||||
Output,
|
||||
EventEmitter,
|
||||
OnDestroy,
|
||||
ViewEncapsulation
|
||||
} from '@angular/core';
|
||||
import { Component, OnInit, Output, EventEmitter, OnDestroy, ViewEncapsulation } from '@angular/core';
|
||||
import {
|
||||
UntypedFormBuilder,
|
||||
UntypedFormGroup,
|
||||
Validators,
|
||||
UntypedFormControl,
|
||||
AbstractControl
|
||||
AbstractControl,
|
||||
ReactiveFormsModule,
|
||||
FormsModule
|
||||
} from '@angular/forms';
|
||||
import { MatDialogRef } from '@angular/material/dialog';
|
||||
import { MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
||||
import { QueriesApi, SiteBodyCreate, SiteEntry, SitePaging } from '@alfresco/js-api';
|
||||
import { AlfrescoApiService, NotificationService } from '@alfresco/adf-core';
|
||||
import { debounceTime, finalize, mergeMap, takeUntil } from 'rxjs/operators';
|
||||
import { SitesService } from '../../common/services/sites.service';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { AutoFocusDirective } from '../../directives';
|
||||
import { MatRadioModule } from '@angular/material/radio';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-library-dialog',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
MatDialogModule,
|
||||
TranslateModule,
|
||||
ReactiveFormsModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
AutoFocusDirective,
|
||||
MatRadioModule,
|
||||
FormsModule,
|
||||
MatButtonModule
|
||||
],
|
||||
styleUrls: ['./library.dialog.scss'],
|
||||
templateUrl: './library.dialog.html',
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
@@ -86,22 +101,12 @@ export class LibraryDialogComponent implements OnInit, OnDestroy {
|
||||
private formBuilder: UntypedFormBuilder,
|
||||
private dialog: MatDialogRef<LibraryDialogComponent>,
|
||||
private notificationService: NotificationService
|
||||
) {
|
||||
}
|
||||
) {}
|
||||
|
||||
ngOnInit() {
|
||||
const validators = {
|
||||
id: [
|
||||
Validators.required,
|
||||
Validators.maxLength(72),
|
||||
this.forbidSpecialCharacters
|
||||
],
|
||||
title: [
|
||||
Validators.required,
|
||||
this.forbidOnlySpaces,
|
||||
Validators.minLength(2),
|
||||
Validators.maxLength(256)
|
||||
],
|
||||
id: [Validators.required, Validators.maxLength(72), this.forbidSpecialCharacters],
|
||||
title: [Validators.required, this.forbidOnlySpaces, Validators.minLength(2), Validators.maxLength(256)],
|
||||
description: [Validators.maxLength(512)]
|
||||
};
|
||||
|
||||
@@ -165,13 +170,15 @@ export class LibraryDialogComponent implements OnInit, OnDestroy {
|
||||
}
|
||||
|
||||
this.disableCreateButton = true;
|
||||
this.create().pipe(finalize(() => this.disableCreateButton = false)).subscribe(
|
||||
(node: SiteEntry) => {
|
||||
this.success.emit(node);
|
||||
dialog.close(node);
|
||||
},
|
||||
(error) => this.handleError(error)
|
||||
);
|
||||
this.create()
|
||||
.pipe(finalize(() => (this.disableCreateButton = false)))
|
||||
.subscribe(
|
||||
(node: SiteEntry) => {
|
||||
this.success.emit(node);
|
||||
dialog.close(node);
|
||||
},
|
||||
(error) => this.handleError(error)
|
||||
);
|
||||
}
|
||||
|
||||
visibilityChangeHandler(event) {
|
||||
@@ -238,9 +245,9 @@ export class LibraryDialogComponent implements OnInit, OnDestroy {
|
||||
|
||||
private findLibraryByTitle(libraryTitle: string): Promise<SitePaging> {
|
||||
return this.queriesApi.findSites(libraryTitle, {
|
||||
maxItems: 1,
|
||||
fields: ['title']
|
||||
});
|
||||
maxItems: 1,
|
||||
fields: ['title']
|
||||
});
|
||||
}
|
||||
|
||||
private forbidSpecialCharacters({ value }: UntypedFormControl) {
|
||||
@@ -254,8 +261,8 @@ export class LibraryDialogComponent implements OnInit, OnDestroy {
|
||||
return isValid
|
||||
? null
|
||||
: {
|
||||
message: 'LIBRARY.ERRORS.ILLEGAL_CHARACTERS'
|
||||
};
|
||||
message: 'LIBRARY.ERRORS.ILLEGAL_CHARACTERS'
|
||||
};
|
||||
}
|
||||
|
||||
private forbidOnlySpaces({ value }: UntypedFormControl) {
|
||||
@@ -268,8 +275,8 @@ export class LibraryDialogComponent implements OnInit, OnDestroy {
|
||||
return isValid
|
||||
? null
|
||||
: {
|
||||
message: 'LIBRARY.ERRORS.ONLY_SPACES'
|
||||
};
|
||||
message: 'LIBRARY.ERRORS.ONLY_SPACES'
|
||||
};
|
||||
}
|
||||
|
||||
private createSiteIdValidator() {
|
||||
@@ -281,10 +288,14 @@ export class LibraryDialogComponent implements OnInit, OnDestroy {
|
||||
}
|
||||
|
||||
return new Promise((resolve) => {
|
||||
timer = setTimeout(() => this.sitesService.getSite(control.value).subscribe(
|
||||
() => resolve({ message: 'LIBRARY.ERRORS.EXISTENT_SITE' }),
|
||||
() => resolve(null)
|
||||
), 300);
|
||||
timer = setTimeout(
|
||||
() =>
|
||||
this.sitesService.getSite(control.value).subscribe(
|
||||
() => resolve({ message: 'LIBRARY.ERRORS.EXISTENT_SITE' }),
|
||||
() => resolve(null)
|
||||
),
|
||||
300
|
||||
);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
+2
-2
@@ -18,7 +18,7 @@
|
||||
import { TestBed, fakeAsync, tick, ComponentFixture } from '@angular/core/testing';
|
||||
import { MatDialogRef } from '@angular/material/dialog';
|
||||
import { NodeLockDialogComponent } from './node-lock.dialog';
|
||||
import { ContentTestingModule } from '../testing/content.testing.module';
|
||||
import { ContentTestingModule } from '../../testing/content.testing.module';
|
||||
import { addMinutes } from 'date-fns';
|
||||
|
||||
describe('NodeLockDialogComponent', () => {
|
||||
@@ -32,7 +32,7 @@ describe('NodeLockDialogComponent', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [ContentTestingModule],
|
||||
imports: [ContentTestingModule, NodeLockDialogComponent],
|
||||
providers: [{ provide: MatDialogRef, useValue: dialogRef }]
|
||||
});
|
||||
fixture = TestBed.createComponent(NodeLockDialogComponent);
|
||||
+21
-2
@@ -16,14 +16,33 @@
|
||||
*/
|
||||
|
||||
import { Component, Inject, OnInit, Optional, ViewEncapsulation } from '@angular/core';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||
import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
|
||||
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
||||
import { ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
|
||||
import { differenceInSeconds } from 'date-fns';
|
||||
import { NodeBodyLock, Node, NodeEntry, NodesApi } from '@alfresco/js-api';
|
||||
import { AlfrescoApiService } from '@alfresco/adf-core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatDatetimepickerModule } from '@mat-datetimepicker/core';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-node-lock',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
TranslateModule,
|
||||
MatDialogModule,
|
||||
ReactiveFormsModule,
|
||||
MatCheckboxModule,
|
||||
MatFormFieldModule,
|
||||
MatDatetimepickerModule,
|
||||
MatInputModule,
|
||||
MatButtonModule
|
||||
],
|
||||
templateUrl: './node-lock.dialog.html',
|
||||
encapsulation: ViewEncapsulation.None
|
||||
})
|
||||
@@ -15,9 +15,9 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
export * from './folder.dialog';
|
||||
export * from './node-lock.dialog';
|
||||
export * from './category-selector.dialog';
|
||||
export * from './folder/folder.dialog';
|
||||
export * from './node-lock/node-lock.dialog';
|
||||
export * from './category-selector/category-selector.dialog';
|
||||
|
||||
export * from './dialog.module';
|
||||
export * from './library/library.dialog';
|
||||
@@ -25,4 +25,4 @@ export * from './library/library.dialog';
|
||||
export * from './download-zip/download-zip.dialog';
|
||||
export * from './download-zip/download-zip.dialog.module';
|
||||
|
||||
export * from './folder-name.validators';
|
||||
export * from './folder/folder-name.validators';
|
||||
|
||||
@@ -17,11 +17,13 @@
|
||||
[allowFiltering]="allowFiltering"
|
||||
[isResizingEnabled]="isResizingEnabled"
|
||||
[blurOnResize]="blurOnResize"
|
||||
[displayCheckboxesOnHover]="displayCheckboxesOnHover"
|
||||
(showRowContextMenu)="onShowRowContextMenu($event)"
|
||||
(showRowActionsMenu)="onShowRowActionsMenu($event)"
|
||||
(executeRowAction)="onExecuteRowAction($event)"
|
||||
(columnsWidthChanged)="onColumnsWidthChange($event)"
|
||||
(columnOrderChanged)="onColumnOrderChange($event)"
|
||||
(selectedItemsCountChanged)="onSelectedItemsCountChanged($event)"
|
||||
(rowClick)="onNodeClick($event.value?.node)"
|
||||
(rowDblClick)="onNodeDblClick($event.value?.node)"
|
||||
(row-select)="onNodeSelect($any($event).detail)"
|
||||
|
||||
@@ -1467,6 +1467,12 @@ describe('DocumentList', () => {
|
||||
expect(documentList.reload).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should emit custom date range on date picker closed', () => {
|
||||
const selectedItemsCountChangedSpy = spyOn(documentList.selectedItemsCountChanged, 'emit');
|
||||
documentList.onSelectedItemsCountChanged(1);
|
||||
expect(selectedItemsCountChangedSpy).toHaveBeenCalledWith(1);
|
||||
});
|
||||
|
||||
it('should add includeFields in the server request when present', () => {
|
||||
documentList.includeFields = ['test-include'];
|
||||
documentList.currentFolderId = 'fake-id';
|
||||
|
||||
@@ -340,6 +340,10 @@ export class DocumentListComponent extends DataTableSchema implements OnInit, On
|
||||
@Input()
|
||||
blurOnResize = true;
|
||||
|
||||
/** Display checkboxes in datatable rows on hover only */
|
||||
@Input()
|
||||
displayCheckboxesOnHover = false;
|
||||
|
||||
/** Emitted when the user clicks a list node */
|
||||
@Output()
|
||||
nodeClick = new EventEmitter<NodeEntityEvent>();
|
||||
@@ -388,6 +392,10 @@ export class DocumentListComponent extends DataTableSchema implements OnInit, On
|
||||
@Output()
|
||||
columnsOrderChanged = new EventEmitter<string[] | undefined>();
|
||||
|
||||
/** Emitted when the selected row items count in the table changed. */
|
||||
@Output()
|
||||
selectedItemsCountChanged = new EventEmitter<number | undefined>();
|
||||
|
||||
@ViewChild('dataTable', { static: true })
|
||||
dataTable: DataTableComponent;
|
||||
|
||||
@@ -832,6 +840,10 @@ export class DocumentListComponent extends DataTableSchema implements OnInit, On
|
||||
this.columnsWidthChanged.emit(this.columnsWidths);
|
||||
}
|
||||
|
||||
onSelectedItemsCountChanged(count: number) {
|
||||
this.selectedItemsCountChanged.emit(count);
|
||||
}
|
||||
|
||||
onNodeClick(nodeEntry: NodeEntry) {
|
||||
const domEvent = new CustomEvent('node-click', {
|
||||
detail: {
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
import { Directive, ElementRef, HostListener, Input, Output, EventEmitter } from '@angular/core';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { Node } from '@alfresco/js-api';
|
||||
import { FolderDialogComponent } from '../dialogs/folder.dialog';
|
||||
import { FolderDialogComponent } from '../dialogs/folder/folder.dialog';
|
||||
import { ContentService } from '../common/services/content.service';
|
||||
|
||||
const DIALOG_WIDTH: number = 400;
|
||||
|
||||
@@ -656,6 +656,9 @@
|
||||
"ARIA-LABEL": {
|
||||
"BREADCRUMB": "Breadcrumb",
|
||||
"DROPDOWN": "Dropdown"
|
||||
},
|
||||
"HEADER": {
|
||||
"SELECTED": "Selected ({{ count }})"
|
||||
}
|
||||
},
|
||||
"NAME_COLUMN_LINK": {
|
||||
|
||||
@@ -38,6 +38,7 @@ import { MatSliderModule } from '@angular/material/slider';
|
||||
import { MatTreeModule } from '@angular/material/tree';
|
||||
import { MatBadgeModule } from '@angular/material/badge';
|
||||
|
||||
/** @deprecated this module is deprecated and will be removed in future versions */
|
||||
@NgModule({
|
||||
imports: [
|
||||
MatButtonModule,
|
||||
|
||||
+1
-10
@@ -19,8 +19,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { mockFile, mockNode } from '../mock';
|
||||
import { ContentTestingModule } from '../testing/content.testing.module';
|
||||
import { UploadVersionButtonComponent } from '../upload';
|
||||
import { VersionComparisonComponent, VersionListComponent, VersionUploadComponent } from '../version-manager';
|
||||
import { NewVersionUploaderDataAction } from './models';
|
||||
import { NewVersionUploaderDialogComponent } from './new-version-uploader.dialog';
|
||||
|
||||
@@ -44,14 +42,7 @@ describe('NewVersionUploaderDialog', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [ContentTestingModule],
|
||||
declarations: [
|
||||
NewVersionUploaderDialogComponent,
|
||||
VersionListComponent,
|
||||
VersionUploadComponent,
|
||||
UploadVersionButtonComponent,
|
||||
VersionComparisonComponent
|
||||
],
|
||||
imports: [ContentTestingModule, NewVersionUploaderDialogComponent],
|
||||
providers: [
|
||||
{ provide: MAT_DIALOG_DATA, useValue: { node: mockNode, showVersionsOnly, file: mockFile } },
|
||||
{
|
||||
|
||||
@@ -17,17 +17,23 @@
|
||||
|
||||
import { Node } from '@alfresco/js-api';
|
||||
import { Component, EventEmitter, Inject, OnInit, Output, ViewEncapsulation } from '@angular/core';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
|
||||
import { NewVersionUploaderDialogData, NewVersionUploaderData, NewVersionUploaderDataAction } from './models';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { VersionManagerModule } from '../version-manager';
|
||||
import { AppConfigPipe } from '@alfresco/adf-core';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-new-version-uploader-dialog',
|
||||
standalone: true,
|
||||
imports: [CommonModule, VersionManagerModule, MatDialogModule, AppConfigPipe, TranslateModule, MatButtonModule],
|
||||
templateUrl: './new-version-uploader.dialog.html',
|
||||
styleUrls: ['./new-version-uploader.dialog.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
})
|
||||
export class NewVersionUploaderDialogComponent implements OnInit {
|
||||
|
||||
/**
|
||||
* Dialog title to show into the header.
|
||||
* If data.title is not provided, a default title is set
|
||||
@@ -45,7 +51,7 @@ export class NewVersionUploaderDialogComponent implements OnInit {
|
||||
constructor(
|
||||
@Inject(MAT_DIALOG_DATA) public data: NewVersionUploaderDialogData,
|
||||
private dialogRef: MatDialogRef<NewVersionUploaderDialogComponent>
|
||||
) { }
|
||||
) {}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.setDialogTitle();
|
||||
@@ -79,5 +85,4 @@ export class NewVersionUploaderDialogComponent implements OnInit {
|
||||
refresh(node: Node) {
|
||||
this.dialogAction.emit({ action: NewVersionUploaderDataAction.refresh, node });
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -15,19 +15,12 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { FormsModule } from '@angular/forms';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MaterialModule } from '../material.module';
|
||||
|
||||
import { UploadModule } from '../upload/upload.module';
|
||||
import { CoreModule } from '@alfresco/adf-core';
|
||||
import { VersionManagerModule } from '../version-manager';
|
||||
import { NewVersionUploaderDialogComponent } from './new-version-uploader.dialog';
|
||||
|
||||
/** @deprecated use `NewVersionUploaderDialogComponent` standalone component instead */
|
||||
@NgModule({
|
||||
imports: [CommonModule, MaterialModule, CoreModule, UploadModule, FormsModule, VersionManagerModule],
|
||||
declarations: [NewVersionUploaderDialogComponent],
|
||||
exports: [NewVersionUploaderDialogComponent, FormsModule]
|
||||
imports: [NewVersionUploaderDialogComponent],
|
||||
exports: [NewVersionUploaderDialogComponent]
|
||||
})
|
||||
export class NewVersionUploaderModule {}
|
||||
|
||||
+1
-1
@@ -63,7 +63,7 @@ describe('AddPermissionDialog', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [ContentTestingModule],
|
||||
imports: [ContentTestingModule, AddPermissionDialogComponent],
|
||||
providers: [
|
||||
{ provide: MatDialogRef, useValue: dialogRef },
|
||||
{ provide: MAT_DIALOG_DATA, useValue: data }
|
||||
|
||||
+34
-10
@@ -16,13 +16,38 @@
|
||||
*/
|
||||
|
||||
import { Component, Inject, ViewEncapsulation } from '@angular/core';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||
import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog';
|
||||
import { NodeEntry, PermissionElement } from '@alfresco/js-api';
|
||||
import { AddPermissionDialogData } from './add-permission-dialog-data.interface';
|
||||
import { MemberModel } from '../../models/member.model';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { DataColumnComponent, DataColumnListComponent, DataTableComponent, DateColumnHeaderComponent } from '@alfresco/adf-core';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { AddPermissionPanelComponent } from './add-permission-panel.component';
|
||||
import { UserIconColumnComponent } from '../user-icon-column/user-icon-column.component';
|
||||
import { UserNameColumnComponent } from '../user-name-column/user-name-column.component';
|
||||
import { UserRoleColumnComponent } from '../user-role-column/user-role-column.component';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-add-permission-dialog',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
MatDialogModule,
|
||||
MatButtonModule,
|
||||
TranslateModule,
|
||||
DataTableComponent,
|
||||
DataColumnListComponent,
|
||||
DataColumnComponent,
|
||||
DateColumnHeaderComponent,
|
||||
MatIconModule,
|
||||
AddPermissionPanelComponent,
|
||||
UserIconColumnComponent,
|
||||
UserNameColumnComponent,
|
||||
UserRoleColumnComponent
|
||||
],
|
||||
templateUrl: './add-permission-dialog.component.html',
|
||||
styleUrls: ['./add-permission-dialog.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
@@ -34,8 +59,7 @@ export class AddPermissionDialogComponent {
|
||||
private existingMembers: PermissionElement[] = [];
|
||||
currentSelection: NodeEntry[] = [];
|
||||
|
||||
constructor(@Inject(MAT_DIALOG_DATA) public data: AddPermissionDialogData,
|
||||
private dialogRef: MatDialogRef<AddPermissionDialogComponent>) {
|
||||
constructor(@Inject(MAT_DIALOG_DATA) public data: AddPermissionDialogData, private dialogRef: MatDialogRef<AddPermissionDialogComponent>) {
|
||||
this.existingMembers = this.data.node.permissions.locallySet || [];
|
||||
}
|
||||
|
||||
@@ -44,18 +68,19 @@ export class AddPermissionDialogComponent {
|
||||
}
|
||||
|
||||
onAddClicked() {
|
||||
const selection = this.selectedMembers.filter(member => !member.readonly).map(member => member.toPermissionElement());
|
||||
const selection = this.selectedMembers.filter((member) => !member.readonly).map((member) => member.toPermissionElement());
|
||||
this.data.confirm.next(selection);
|
||||
this.data.confirm.complete();
|
||||
}
|
||||
|
||||
onSearchAddClicked() {
|
||||
const newMembers = this.currentSelection.map(item => MemberModel.parseFromSearchResult(item))
|
||||
.filter(({id}) => !this.selectedMembers.find((member) => member.id === id));
|
||||
const newMembers = this.currentSelection
|
||||
.map((item) => MemberModel.parseFromSearchResult(item))
|
||||
.filter(({ id }) => !this.selectedMembers.find((member) => member.id === id));
|
||||
this.selectedMembers = this.selectedMembers.concat(newMembers);
|
||||
|
||||
this.selectedMembers.forEach((member) => {
|
||||
const existingMember = this.existingMembers.find(({authorityId}) => authorityId === member.id);
|
||||
const existingMember = this.existingMembers.find(({ authorityId }) => authorityId === member.id);
|
||||
if (existingMember) {
|
||||
member.role = existingMember.name;
|
||||
member.accessStatus = existingMember.accessStatus;
|
||||
@@ -82,8 +107,7 @@ export class AddPermissionDialogComponent {
|
||||
}
|
||||
|
||||
onBulkUpdate(role: string) {
|
||||
this.selectedMembers.filter(member => !member.readonly)
|
||||
.forEach(member => (member.role = role));
|
||||
this.selectedMembers.filter((member) => !member.readonly).forEach((member) => (member.role = role));
|
||||
}
|
||||
|
||||
onMemberDelete({ id }: MemberModel) {
|
||||
@@ -101,6 +125,6 @@ export class AddPermissionDialogComponent {
|
||||
}
|
||||
|
||||
isValid(): boolean {
|
||||
return this.selectedMembers.filter(({readonly}) => !readonly).length && this.selectedMembers.every(({role}) => !!role);
|
||||
return this.selectedMembers.filter(({ readonly }) => !readonly).length && this.selectedMembers.every(({ role }) => !!role);
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -37,7 +37,7 @@ describe('AddPermissionPanelComponent', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [ContentTestingModule]
|
||||
imports: [ContentTestingModule, AddPermissionPanelComponent]
|
||||
});
|
||||
fixture = TestBed.createComponent(AddPermissionPanelComponent);
|
||||
loader = TestbedHarnessEnvironment.loader(fixture);
|
||||
|
||||
+21
-2
@@ -19,14 +19,33 @@ import { SearchConfigurationService } from '../../../search/services/search-conf
|
||||
import { SearchService } from '../../../search/services/search.service';
|
||||
import { Node, NodeEntry } from '@alfresco/js-api';
|
||||
import { Component, EventEmitter, Output, ViewChild, ViewEncapsulation } from '@angular/core';
|
||||
import { UntypedFormControl } from '@angular/forms';
|
||||
import { ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
|
||||
import { debounceTime } from 'rxjs/operators';
|
||||
import { SearchPermissionConfigurationService } from './search-config-permission.service';
|
||||
import { SearchComponent } from '../../../search/components/search.component';
|
||||
import { MatSelectionList } from '@angular/material/list';
|
||||
import { MatListModule, MatSelectionList } from '@angular/material/list';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { SearchModule } from '../../../search';
|
||||
import { UserIconColumnComponent } from '../user-icon-column/user-icon-column.component';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-add-permission-panel',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
MatFormFieldModule,
|
||||
MatInputModule,
|
||||
TranslateModule,
|
||||
ReactiveFormsModule,
|
||||
MatIconModule,
|
||||
SearchModule,
|
||||
MatListModule,
|
||||
UserIconColumnComponent
|
||||
],
|
||||
templateUrl: './add-permission-panel.component.html',
|
||||
styleUrls: ['./add-permission-panel.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
|
||||
+1
-3
@@ -1,6 +1,4 @@
|
||||
<adf-add-permission-panel
|
||||
(select)="onSelect($event)">
|
||||
</adf-add-permission-panel>
|
||||
<adf-add-permission-panel (select)="onSelect($event)"></adf-add-permission-panel>
|
||||
<div id="adf-add-permission-actions">
|
||||
<button mat-button
|
||||
id="adf-add-permission-action-button"
|
||||
|
||||
+1
-1
@@ -32,7 +32,7 @@ describe('AddPermissionComponent', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [ContentTestingModule]
|
||||
imports: [ContentTestingModule, AddPermissionComponent]
|
||||
});
|
||||
nodePermissionService = TestBed.inject(NodePermissionService);
|
||||
const response: any = { node: { id: 'fake-node', allowableOperations: ['updatePermissions'] }, roles: [{ label: 'Test', role: 'test' }] };
|
||||
|
||||
+19
-13
@@ -21,9 +21,15 @@ import { NodePermissionService } from '../../services/node-permission.service';
|
||||
import { RoleModel } from '../../models/role.model';
|
||||
import { ContentService } from '../../../common/services/content.service';
|
||||
import { AllowableOperationsEnum } from '../../../common/models/allowable-operations.enum';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { AddPermissionPanelComponent } from './add-permission-panel.component';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-add-permission',
|
||||
standalone: true,
|
||||
imports: [CommonModule, AddPermissionPanelComponent, MatButtonModule, TranslateModule],
|
||||
templateUrl: './add-permission.component.html',
|
||||
styleUrls: ['./add-permission.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
@@ -32,7 +38,6 @@ import { AllowableOperationsEnum } from '../../../common/models/allowable-operat
|
||||
* @deprecated in 4.4.0, use adf-add-permission-panel instead.
|
||||
*/
|
||||
export class AddPermissionComponent implements OnInit {
|
||||
|
||||
/** ID of the target node. */
|
||||
@Input()
|
||||
nodeId: string;
|
||||
@@ -49,11 +54,10 @@ export class AddPermissionComponent implements OnInit {
|
||||
currentNode: Node;
|
||||
currentNodeRoles: RoleModel[];
|
||||
|
||||
constructor(private nodePermissionService: NodePermissionService,
|
||||
private contentService: ContentService) { }
|
||||
constructor(private nodePermissionService: NodePermissionService, private contentService: ContentService) {}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.nodePermissionService.getNodeWithRoles(this.nodeId).subscribe(({node, roles }) => {
|
||||
this.nodePermissionService.getNodeWithRoles(this.nodeId).subscribe(({ node, roles }) => {
|
||||
this.currentNode = node;
|
||||
this.currentNodeRoles = roles;
|
||||
});
|
||||
@@ -64,20 +68,22 @@ export class AddPermissionComponent implements OnInit {
|
||||
}
|
||||
|
||||
isAddEnabled(): boolean {
|
||||
return this.contentService.hasAllowableOperations(this.currentNode, AllowableOperationsEnum.UPDATEPERMISSIONS) &&
|
||||
this.selectedItems.length !== 0;
|
||||
return (
|
||||
this.contentService.hasAllowableOperations(this.currentNode, AllowableOperationsEnum.UPDATEPERMISSIONS) && this.selectedItems.length !== 0
|
||||
);
|
||||
}
|
||||
|
||||
applySelection() {
|
||||
if (this.contentService.hasAllowableOperations(this.currentNode, AllowableOperationsEnum.UPDATEPERMISSIONS)) {
|
||||
const permissions = this.transformNodeToPermissionElement(this.selectedItems, this.currentNodeRoles[0].role);
|
||||
this.nodePermissionService.updateNodePermissions(this.nodeId, permissions)
|
||||
.subscribe((node) => {
|
||||
this.success.emit(node);
|
||||
},
|
||||
(error) => {
|
||||
this.error.emit(error);
|
||||
});
|
||||
this.nodePermissionService.updateNodePermissions(this.nodeId, permissions).subscribe(
|
||||
(node) => {
|
||||
this.success.emit(node);
|
||||
},
|
||||
(error) => {
|
||||
this.error.emit(error);
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+9
-9
@@ -24,13 +24,13 @@ import { AllowableOperationsEnum } from '../../common/models/allowable-operation
|
||||
|
||||
@Directive({
|
||||
selector: 'button[adf-inherit-permission], mat-button-toggle[adf-inherit-permission]',
|
||||
standalone: true,
|
||||
host: {
|
||||
role: 'button',
|
||||
'(click)': 'onInheritPermissionClicked()'
|
||||
}
|
||||
})
|
||||
export class InheritPermissionDirective {
|
||||
|
||||
/** ID of the node to add/remove inherited permissions. */
|
||||
@Input()
|
||||
nodeId: string;
|
||||
@@ -43,21 +43,21 @@ export class InheritPermissionDirective {
|
||||
@Output()
|
||||
error: EventEmitter<any> = new EventEmitter<any>();
|
||||
|
||||
constructor(private nodeService: NodesApiService,
|
||||
private contentService: ContentService) {
|
||||
}
|
||||
constructor(private nodeService: NodesApiService, private contentService: ContentService) {}
|
||||
|
||||
onInheritPermissionClicked() {
|
||||
this.nodeService.getNode(this.nodeId).subscribe((node: Node) => {
|
||||
if (this.contentService.hasAllowableOperations(node, AllowableOperationsEnum.UPDATEPERMISSIONS)) {
|
||||
const nodeBody = { permissions: { isInheritanceEnabled: !node?.permissions?.isInheritanceEnabled ?? false} };
|
||||
this.nodeService.updateNode(this.nodeId, nodeBody, { include: ['permissions'] }).subscribe((nodeUpdated: Node) => {
|
||||
this.updated.emit(nodeUpdated);
|
||||
}, (error) => this.error.emit(error));
|
||||
const nodeBody = { permissions: { isInheritanceEnabled: !node?.permissions?.isInheritanceEnabled ?? false } };
|
||||
this.nodeService.updateNode(this.nodeId, nodeBody, { include: ['permissions'] }).subscribe(
|
||||
(nodeUpdated: Node) => {
|
||||
this.updated.emit(nodeUpdated);
|
||||
},
|
||||
(error) => this.error.emit(error)
|
||||
);
|
||||
} else {
|
||||
this.error.emit('PERMISSION_MANAGER.ERROR.NOT-ALLOWED');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+4
-1
@@ -18,11 +18,14 @@
|
||||
import { Node } from '@alfresco/js-api';
|
||||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
import { CommonModule } from '@angular/common';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-node-path-column',
|
||||
standalone: true,
|
||||
imports: [CommonModule],
|
||||
template: `
|
||||
<span class="adf-user-name-column adf-datatable-cell-value" title="{{ displayText$ | async }}">
|
||||
<span class="adf-user-name-column adf-datatable-cell-value" title="{{ displayText$ | async }}">
|
||||
{{ displayText$ | async }}
|
||||
</span>
|
||||
`,
|
||||
|
||||
+38
-6
@@ -19,15 +19,47 @@ import { Component, EventEmitter, Input, OnChanges, Output, ViewEncapsulation }
|
||||
import { Node } from '@alfresco/js-api';
|
||||
import { PermissionDisplayModel } from '../../models/permission.model';
|
||||
import { RoleModel } from '../../models/role.model';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import {
|
||||
DataColumnComponent,
|
||||
DataColumnListComponent,
|
||||
DataTableComponent,
|
||||
DateColumnHeaderComponent,
|
||||
EmptyContentComponent,
|
||||
NoContentTemplateDirective
|
||||
} from '@alfresco/adf-core';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { UserIconColumnComponent } from '../user-icon-column/user-icon-column.component';
|
||||
import { UserNameColumnComponent } from '../user-name-column/user-name-column.component';
|
||||
import { NodePathColumnComponent } from '../node-path-column/node-path-column.component';
|
||||
import { UserRoleColumnComponent } from '../user-role-column/user-role-column.component';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-permission-container',
|
||||
templateUrl: './permission-container.component.html',
|
||||
styleUrls: ['./permission-container.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
selector: 'adf-permission-container',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
DataTableComponent,
|
||||
DataColumnListComponent,
|
||||
DataColumnComponent,
|
||||
TranslateModule,
|
||||
DateColumnHeaderComponent,
|
||||
MatButtonModule,
|
||||
MatIconModule,
|
||||
NoContentTemplateDirective,
|
||||
EmptyContentComponent,
|
||||
UserIconColumnComponent,
|
||||
UserNameColumnComponent,
|
||||
NodePathColumnComponent,
|
||||
UserRoleColumnComponent
|
||||
],
|
||||
templateUrl: './permission-container.component.html',
|
||||
styleUrls: ['./permission-container.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
})
|
||||
export class PermissionContainerComponent implements OnChanges {
|
||||
|
||||
@Input()
|
||||
node: Node;
|
||||
|
||||
@@ -48,7 +80,7 @@ export class PermissionContainerComponent implements OnChanges {
|
||||
|
||||
/** Emitted when the permission is updated. */
|
||||
@Output()
|
||||
update = new EventEmitter<{role: string; permission: PermissionDisplayModel}>();
|
||||
update = new EventEmitter<{ role: string; permission: PermissionDisplayModel }>();
|
||||
|
||||
@Output()
|
||||
updateAll = new EventEmitter<string>();
|
||||
|
||||
+1
-3
@@ -1,8 +1,6 @@
|
||||
<mat-card class="adf-permission-card" id="adf-permission-manager-card">
|
||||
<div *ngIf="(permissionList.data$ | async) === null && permissionList.loading$ | async" class="adf-permission-loader">
|
||||
<mat-progress-spinner [color]="'primary'"
|
||||
[mode]="'indeterminate'">
|
||||
</mat-progress-spinner>
|
||||
<mat-progress-spinner [color]="'primary'" [mode]="'indeterminate'"></mat-progress-spinner>
|
||||
</div>
|
||||
|
||||
<ng-container *ngIf="permissionList.error$ | async">
|
||||
|
||||
+22
-1
@@ -20,9 +20,30 @@ import { PermissionElement } from '@alfresco/js-api';
|
||||
import { Component, EventEmitter, Input, OnInit, Output, ViewEncapsulation } from '@angular/core';
|
||||
import { PermissionDisplayModel } from '../../models/permission.model';
|
||||
import { PermissionListService } from './permission-list.service';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatCardModule } from '@angular/material/card';
|
||||
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { PermissionContainerComponent } from '../permission-container/permission-container.component';
|
||||
import { PopOverDirective } from '../pop-over.directive';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-permission-list',
|
||||
standalone: true,
|
||||
imports: [
|
||||
CommonModule,
|
||||
MatCardModule,
|
||||
MatProgressSpinnerModule,
|
||||
MatIconModule,
|
||||
MatSlideToggleModule,
|
||||
TranslateModule,
|
||||
MatButtonModule,
|
||||
PermissionContainerComponent,
|
||||
PopOverDirective
|
||||
],
|
||||
templateUrl: './permission-list.component.html',
|
||||
styleUrls: ['./permission-list.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None
|
||||
@@ -64,7 +85,7 @@ export class PermissionListComponent implements OnInit {
|
||||
this.selectedPermissions = [];
|
||||
}
|
||||
|
||||
updatePermission({role, permission}) {
|
||||
updatePermission({ role, permission }) {
|
||||
this.permissionList.updateRole(role, permission);
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -22,6 +22,8 @@ import { By } from '@angular/platform-browser';
|
||||
import { OverlayModule } from '@angular/cdk/overlay';
|
||||
|
||||
@Component({
|
||||
standalone: true,
|
||||
imports: [PopOverDirective],
|
||||
template: `
|
||||
<div
|
||||
[adf-pop-over]="popOver"
|
||||
@@ -43,8 +45,7 @@ describe('PopOverDirective', () => {
|
||||
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [OverlayModule],
|
||||
declarations: [PopOverDirective, PopOverTestComponent]
|
||||
imports: [OverlayModule, PopOverTestComponent]
|
||||
});
|
||||
fixture = TestBed.createComponent(PopOverTestComponent);
|
||||
});
|
||||
|
||||
@@ -15,17 +15,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import {
|
||||
AfterViewInit,
|
||||
Directive,
|
||||
ElementRef,
|
||||
HostListener,
|
||||
Input,
|
||||
OnDestroy,
|
||||
OnInit,
|
||||
TemplateRef,
|
||||
ViewContainerRef
|
||||
} from '@angular/core';
|
||||
import { AfterViewInit, Directive, ElementRef, HostListener, Input, OnDestroy, OnInit, TemplateRef, ViewContainerRef } from '@angular/core';
|
||||
import { ConnectionPositionPair, Overlay, OverlayRef } from '@angular/cdk/overlay';
|
||||
import { TemplatePortal } from '@angular/cdk/portal';
|
||||
import { takeUntil } from 'rxjs/operators';
|
||||
@@ -34,8 +24,8 @@ import { ConfigurableFocusTrap, ConfigurableFocusTrapFactory } from '@angular/cd
|
||||
|
||||
@Directive({
|
||||
selector: '[adf-pop-over]',
|
||||
standalone: true,
|
||||
exportAs: 'adfPopOver'
|
||||
|
||||
})
|
||||
export class PopOverDirective implements OnInit, OnDestroy, AfterViewInit {
|
||||
get open(): boolean {
|
||||
@@ -58,7 +48,7 @@ export class PopOverDirective implements OnInit, OnDestroy, AfterViewInit {
|
||||
private overlay: Overlay,
|
||||
private vcr: ViewContainerRef,
|
||||
private focusTrapFactory: ConfigurableFocusTrapFactory
|
||||
) { }
|
||||
) {}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.createOverlay();
|
||||
|
||||
+7
-3
@@ -15,19 +15,23 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { User } from '@alfresco/adf-core';
|
||||
import { InitialUsernamePipe, User } from '@alfresco/adf-core';
|
||||
import { Group, NodeEntry } from '@alfresco/js-api';
|
||||
import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core';
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
import { NodePermissionService } from '../../services/node-permission.service';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-user-icon-column',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatIconModule, InitialUsernamePipe],
|
||||
template: `
|
||||
<div class="adf-cell-value" [attr.id]="group ? 'group-icon' : 'person-icon'" *ngIf="!isSelected">
|
||||
<div class="adf-cell-value" [attr.id]="group ? 'group-icon' : 'person-icon'" *ngIf="!isSelected">
|
||||
<ng-container *ngIf="displayText$ | async as user">
|
||||
<mat-icon *ngIf="group" class="adf-group-icon">people_alt_outline</mat-icon>
|
||||
<div *ngIf="!group" [outerHTML]="user | usernameInitials: 'adf-people-initial'"></div>
|
||||
<div *ngIf="!group" [outerHTML]="user | usernameInitials : 'adf-people-initial'"></div>
|
||||
</ng-container>
|
||||
</div>
|
||||
<div class="adf-cell-value" *ngIf="isSelected">
|
||||
|
||||
+3
@@ -20,9 +20,12 @@ import { BehaviorSubject } from 'rxjs';
|
||||
import { Group, NodeEntry } from '@alfresco/js-api';
|
||||
import { NodePermissionService } from '../../services/node-permission.service';
|
||||
import { EcmUserModel } from '../../../common/models/ecm-user.model';
|
||||
import { CommonModule } from '@angular/common';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-user-name-column',
|
||||
standalone: true,
|
||||
imports: [CommonModule],
|
||||
template: `
|
||||
<div class="adf-ellipsis-cell" [attr.data-automation-id]="displayText$ | async">
|
||||
<span class="adf-user-name-column" title="{{ displayText$ | async }}"> {{ displayText$ | async }}</span>
|
||||
|
||||
+7
@@ -17,9 +17,16 @@
|
||||
|
||||
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
||||
import { RoleModel } from '../../models/role.model';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { MatFormFieldModule } from '@angular/material/form-field';
|
||||
import { MatSelectModule } from '@angular/material/select';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
import { LocalizedRolePipe } from '@alfresco/adf-core';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-user-role-column',
|
||||
standalone: true,
|
||||
imports: [CommonModule, MatFormFieldModule, MatSelectModule, TranslateModule, LocalizedRolePipe],
|
||||
template: `
|
||||
<mat-form-field class="adf-role-selector-field" *ngIf="!readonly">
|
||||
<mat-select
|
||||
|
||||
@@ -15,17 +15,12 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { CoreModule, InitialUsernamePipe, PipeModule } from '@alfresco/adf-core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { NgModule } from '@angular/core';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { MaterialModule } from '../material.module';
|
||||
import { PermissionListComponent } from './components/permission-list/permission-list.component';
|
||||
import { AddPermissionComponent } from './components/add-permission/add-permission.component';
|
||||
import { AddPermissionDialogComponent } from './components/add-permission/add-permission-dialog.component';
|
||||
import { InheritPermissionDirective } from './components/inherited-button.directive';
|
||||
import { AddPermissionPanelComponent } from './components/add-permission/add-permission-panel.component';
|
||||
import { SearchModule } from '../search/search.module';
|
||||
import { UserNameColumnComponent } from './components/user-name-column/user-name-column.component';
|
||||
import { UserIconColumnComponent } from './components/user-icon-column/user-icon-column.component';
|
||||
import { UserRoleColumnComponent } from './components/user-role-column/user-role-column.component';
|
||||
@@ -33,32 +28,23 @@ import { NodePathColumnComponent } from './components/node-path-column/node-path
|
||||
import { PopOverDirective } from './components/pop-over.directive';
|
||||
import { PermissionContainerComponent } from './components/permission-container/permission-container.component';
|
||||
|
||||
export const CONTENT_PERMISSION_MANAGER_DIRECTIVES = [
|
||||
AddPermissionPanelComponent,
|
||||
AddPermissionComponent,
|
||||
AddPermissionDialogComponent,
|
||||
NodePathColumnComponent,
|
||||
PermissionContainerComponent,
|
||||
PermissionListComponent,
|
||||
UserNameColumnComponent,
|
||||
UserIconColumnComponent,
|
||||
UserRoleColumnComponent,
|
||||
InheritPermissionDirective,
|
||||
PopOverDirective
|
||||
] as const;
|
||||
|
||||
/** @deprecated use `...CONTENT_PERMISSION_MANAGER_DIRECTIVES` or import the standalone components directly */
|
||||
@NgModule({
|
||||
imports: [CoreModule, CommonModule, FormsModule, ReactiveFormsModule, MaterialModule, SearchModule, PipeModule, InitialUsernamePipe],
|
||||
declarations: [
|
||||
PermissionListComponent,
|
||||
AddPermissionPanelComponent,
|
||||
InheritPermissionDirective,
|
||||
AddPermissionComponent,
|
||||
AddPermissionDialogComponent,
|
||||
UserNameColumnComponent,
|
||||
UserIconColumnComponent,
|
||||
UserRoleColumnComponent,
|
||||
PopOverDirective,
|
||||
NodePathColumnComponent,
|
||||
PermissionContainerComponent
|
||||
],
|
||||
exports: [
|
||||
PermissionListComponent,
|
||||
AddPermissionPanelComponent,
|
||||
InheritPermissionDirective,
|
||||
AddPermissionComponent,
|
||||
AddPermissionDialogComponent,
|
||||
UserNameColumnComponent,
|
||||
UserIconColumnComponent,
|
||||
UserRoleColumnComponent,
|
||||
PopOverDirective,
|
||||
NodePathColumnComponent
|
||||
]
|
||||
imports: [...CONTENT_PERMISSION_MANAGER_DIRECTIVES],
|
||||
exports: [...CONTENT_PERMISSION_MANAGER_DIRECTIVES]
|
||||
})
|
||||
export class PermissionManagerModule {}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user