Skip to content

Commit

Permalink
Merge branch 'develop' into ADF-5543-enable-lint-accessibility
Browse files Browse the repository at this point in the history
  • Loading branch information
tomson7777 authored Mar 22, 2024
2 parents 9dbcd04 + ff60cb5 commit 60a48fb
Show file tree
Hide file tree
Showing 49 changed files with 850 additions and 78 deletions.
4 changes: 2 additions & 2 deletions .github/actions/artifact-append/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ runs:
- run: echo "Artifact Append"
shell: bash
- name: Download artifact
uses: actions/upload-artifact@1eb3cb2b3e0f29609092a73eb033bb759a334595 # v4.1.0
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: ${{ inputs.artifact-name }}
pattern: ${{ inputs.artifact-name }}-*
Expand Down Expand Up @@ -85,7 +85,7 @@ runs:
}
}
- name: Upload artifact
uses: actions/upload-artifact@1eb3cb2b3e0f29609092a73eb033bb759a334595 # v4.1.0
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: ${{ inputs.artifact-name }}
path: ${{ inputs.file-name }}
Expand Down
2 changes: 1 addition & 1 deletion .github/actions/artifact-extract/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ runs:
- run: echo "Artifact Extract"
shell: bash
- name: Download artifact
uses: actions/upload-artifact@a8a3f3ad30e3422c9c7b888a15615d19a852ae32 # v3.1.3
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: ${{ inputs.artifact-name }}
pattern: ${{ inputs.artifact-name }}-*
Expand Down
2 changes: 1 addition & 1 deletion .github/actions/artifact-initialize/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ runs:
echo "${{inputs.content}}" > ${{ inputs.file-name }}

- name: Upload artifact
uses: actions/upload-artifact@1eb3cb2b3e0f29609092a73eb033bb759a334595 # v4.1.0
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: ${{ inputs.artifact-name }}
path: ${{ inputs.file-name }}
2 changes: 1 addition & 1 deletion .github/actions/e2e/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ runs:
- name: upload artifacts on gh
id: upload_gh
if: ${{ steps.determine-affected.outputs.isAffected == 'true' }}
uses: actions/upload-artifact@1eb3cb2b3e0f29609092a73eb033bb759a334595 # v4.1.0
uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1
with:
name: e2e-artifact-output-${{inputs.e2e-artifact-id}}
path: /home/runner/work/alfresco-ng2-components/alfresco-ng2-components/e2e-output-*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ Component allows to both assign/unassign categories to content and create multip
[parentId]="parentId"
[managementMode]="categoriesManagementMode"
[classifiableChanged]="classifiableChanged"
[multiSelect]="multiSelect"
(categoriesChange)="storeCategoriesToAssign($event)">
</adf-categories-management>
```
Expand All @@ -35,6 +36,7 @@ Component allows to both assign/unassign categories to content and create multip
| disableRemoval | `boolean` | false | Determines if categories assigned/created can be unassigned/removed from the list. |
| managementMode | `CategoriesManagementMode` | | Management mode determines if component works in assign/unassign mode or create mode. |
| parentId | `string` | | (optional) ID of a parent category that new categories will be created under. |
| multiSelect | `boolean` | true | (optional) Toggles multiselect mode. |

### Events

Expand Down
58 changes: 58 additions & 0 deletions docs/content-services/dialogs/category-selector.dialog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
---
Title: Category selector dialog component
Added: v6.8.0
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")

Allows the user to select one or multiple categories.

![Category selector dialog component](../../docassets/images/adf-category-selector-dialog.png)

## 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 |

## Basic Usage

```ts
constructor(private dialog: MatDialog) {}

...

function openCatDialog() {
const data: CategorySelectorDialogOptions = {
select: new Subject<Category[]>(),
multiSelect: false
};

this.dialog.open(CategorySelectorDialogComponent, {
data,
width: '400px'
});

data.select.subscribe(
(selections: Category[]) => {
...
}
);
}
```
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.
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)
service to open the dialog, as shown in the example, and pass a `options` object
with properties.

## See also

- [Categories management component](../components/categories-management.component.md)
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 9 additions & 0 deletions docs/versionIndex.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ backend services have been tested with each released version of ADF.

## Versions

- [v6.8.0](#v680)
- [v6.7.0](#v670)
- [v6.4.0](#v640)
- [v6.2.0](#v620)
Expand Down Expand Up @@ -45,6 +46,14 @@ backend services have been tested with each released version of ADF.
- [v2.1.0](#v210)
- [v2.0.0](#v200)

## v6.8.0

<!--680 start-->

- [Category selector dialog component](content-services/dialogs/category-selector.dialog.md)

<!--680 end-->

## v6.7.0

<!--670 start-->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
{{ existingCategoriesMsg | translate }}
</p>
<mat-list
[disabled]="isCRUDMode"
[disabled]="isCRUDMode || !multiSelect && categories.length > 0"
class="adf-categories-management-list">
<mat-list-item
*ngFor="let category of existingCategories"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@
overflow-wrap: anywhere;
padding: 5px 0;
font-size: 14px;
background-color: inherit;
color: inherit;

&:hover {
cursor: pointer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,14 @@ describe('CategoriesManagementComponent', () => {
discardPeriodicTasks();
flush();
}));

it ('should disable existing categories list if category already selected and multiSelect is false', fakeAsync(() => {
component.multiSelect = false;
fixture.detectChanges();
typeCategory('test');

expect(getSelectionList().disabled).toBeTrue();
}));
});

describe('CRUD mode', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,10 @@ export class CategoriesManagementComponent implements OnInit, OnDestroy {
@Input()
parentId: string;

/** Toggles multiselect mode */
@Input()
multiSelect = true;

/** Emits when state of upper categories list changes */
@Output()
categoriesChange = new EventEmitter<Category[]>();
Expand Down Expand Up @@ -159,13 +163,15 @@ export class CategoriesManagementComponent implements OnInit, OnDestroy {
if (!this.isCRUDMode) {
this._categoryNameControl.removeValidators(Validators.required);
this.categories.forEach((category) => this.initialCategories.push(category));
this.classifiableChanged
.pipe(takeUntil(this.onDestroy$))
.subscribe(() => {
this.categories = [];
this.categoryNameControlVisible = false;
this.categoryNameControlVisibleChange.emit(false);
});
if (this.classifiableChanged) {
this.classifiableChanged
.pipe(takeUntil(this.onDestroy$))
.subscribe(() => {
this.categories = [];
this.categoryNameControlVisible = false;
this.categoryNameControlVisibleChange.emit(false);
});
}
}
}

Expand Down
28 changes: 28 additions & 0 deletions lib/content-services/src/lib/dialogs/category-selector.dialog.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<h1 mat-dialog-title>
{{ 'CATEGORIES_MANAGEMENT.SELECT_EXISTING_CATEGORY' | translate }}
</h1>

<mat-dialog-content class="adf-dialog-content">
<adf-categories-management
(categoriesChange)="categories = $event"
[categoryNameControlVisible]="true"
[managementMode]="categoriesManagementMode"
[multiSelect]="multiSelect">
</adf-categories-management>
</mat-dialog-content>
<mat-dialog-actions align="end">
<button
data-automation-id="category-selector-dialog-cancel-button"
mat-button
mat-dialog-close>
{{ 'NODE_SELECTOR.CANCEL' | translate }}
</button>
<button
(click)="selectCategories()"
[disabled]="!categories.length"
color="primary"
data-automation-id="category-selector-dialog-select-button"
mat-button>
{{ 'NODE_SELECTOR.CHOOSE' | translate }}
</button>
</mat-dialog-actions>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
adf-category-selector-dialog {
.adf-dialog-content {
height: 400px;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import { ComponentFixture, TestBed } from '@angular/core/testing';
import { CategorySelectorDialogComponent, CategorySelectorDialogOptions } from './category-selector.dialog';
import { Subject } from 'rxjs';
import { Category } from '@alfresco/js-api';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { CoreTestingModule } from '@alfresco/adf-core';
import { By } from '@angular/platform-browser';

describe('Category selector dialog component', () => {
let fixture: ComponentFixture<CategorySelectorDialogComponent>;
let component: CategorySelectorDialogComponent;
let selectButton: HTMLButtonElement;

const dialogRef = {
close: jasmine.createSpy('close')
};

const options: CategorySelectorDialogOptions = {
select: new Subject<Category[]>()
};

const categories: Category[] = [{id: 'id1', name: 'cat1'}, {id: 'id2', name: 'cat3'}];

const setCategories = () => {
component.categories = categories;
fixture.detectChanges();
};

beforeEach(() => {
TestBed.configureTestingModule({
imports: [CoreTestingModule],
providers: [
{ provide: MatDialogRef, useValue: dialogRef },
{ provide: MAT_DIALOG_DATA, useValue: options }
]
});
dialogRef.close.calls.reset();
fixture = TestBed.createComponent(CategorySelectorDialogComponent);
component = fixture.componentInstance;

fixture.detectChanges();

selectButton = fixture.debugElement.query(By.css(`[data-automation-id="category-selector-dialog-select-button"]`)).nativeElement;
});

it('should set params if they are provided as dialog options', () => {
options.multiSelect = true;
component.ngOnInit();

expect(component.multiSelect).toBeTrue();
});

it('should close dialog on cancel button click', () => {
fixture.debugElement.query(By.css(`[data-automation-id="category-selector-dialog-cancel-button"]`)).nativeElement.click();
expect(dialogRef.close).toHaveBeenCalled();
});

it('should close dialog if category is selected and Select button was clicked', () => {
selectButton.click();
expect(dialogRef.close).not.toHaveBeenCalled();

setCategories();
selectButton.click();

expect(dialogRef.close).toHaveBeenCalled();
});

it('should provide selected categories as observable on Select click', () => {
spyOn(options.select, 'next');
setCategories();
selectButton.click();

expect(options.select.next).toHaveBeenCalledWith(categories);
});

it('should disable select button if no categories were selected', () => {
expect(selectButton.disabled).toBeTruthy();
setCategories();
expect(selectButton.disabled).toBeFalse();
});
});
54 changes: 54 additions & 0 deletions lib/content-services/src/lib/dialogs/category-selector.dialog.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*!
* @license
* Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import { Subject } from 'rxjs';
import { Category } from '@alfresco/js-api';
import { CategoriesManagementMode } from '../category';

export interface CategorySelectorDialogOptions {
select: Subject<Category[]>;
multiSelect?: boolean;
}

@Component({
selector: 'adf-category-selector-dialog',
templateUrl: './category-selector.dialog.html',
styleUrls: ['./category-selector.dialog.scss'],
encapsulation: ViewEncapsulation.None
})
export class CategorySelectorDialogComponent implements OnInit {
categories: Category[] = [];
categoriesManagementMode = CategoriesManagementMode.ASSIGN;
multiSelect = true;

constructor(
private dialog: MatDialogRef<CategorySelectorDialogComponent, boolean>,
@Inject(MAT_DIALOG_DATA) private options: CategorySelectorDialogOptions
) {
}

ngOnInit() {
this.multiSelect = this.options.multiSelect ?? true;
}

selectCategories() {
this.options.select.next(this.categories);
this.dialog.close(true);
}
}
Loading

0 comments on commit 60a48fb

Please sign in to comment.