From 20ee286902c473bfaaba0a7617b64b511580ecb2 Mon Sep 17 00:00:00 2001 From: Denys Vuika Date: Tue, 7 May 2024 14:51:56 -0400 Subject: [PATCH] [ACS-7429] cleanup APS1 task-list before refactorings (#9650) --- CONTRIBUTING.md | 9 +- ...lfresco-app-dev-framework-architecture.png | Bin 33550 -> 0 bytes assets/alfresco.png | Bin 6117 -> 0 bytes demo-shell/src/app/app.module.ts | 2 - .../cloud/cloud-breadcrumb-component.html | 4 - .../cloud/cloud-breadcrumb-component.scss | 14 --- .../cloud/cloud-breadcrumb-component.ts | 43 ------- .../cloud/cloud-layout.component.html | 5 +- .../cloud/cloud-layout.component.scss | 12 +- .../cloud/cloud-layout.component.ts | 12 +- .../app/components/files/files.component.html | 2 - .../app/components/form/form.component.html | 2 +- .../src/app/components/form/form.component.ts | 33 +++--- .../custom-editor/custom-editor.component.ts | 53 --------- .../process-service.component.html | 25 ++-- .../process-service.component.ts | 100 ++++++---------- .../search/search-filter-chips.component.ts | 56 +++++---- .../add-permission-dialog.component.md | 54 +++++---- .../components/aspect-list.component.md | 42 ++++--- lib/cli/scripts/licenses.ts | 2 - .../components/checklist.component.ts | 8 +- .../components/task-details.component.html | 21 ++-- .../components/task-details.component.spec.ts | 12 +- .../components/task-details.component.ts | 27 +---- .../components/task-header.component.ts | 23 +++- .../components/task-list.component.html | 87 +++++++------- .../components/task-standalone.component.ts | 15 +-- tools/tslint-rules/.gitignore | 7 -- tools/tslint-rules/.npmignore | 15 --- tools/tslint-rules/README.md | 36 ------ tools/tslint-rules/adfClassNameRule.js | 44 ------- tools/tslint-rules/adfClassNameRule.ts | 78 ------------- tools/tslint-rules/adfFileNameRule.js | 55 --------- tools/tslint-rules/adfFileNameRule.ts | 66 ----------- tools/tslint-rules/adfPrefixNameRule.js | 34 ------ tools/tslint-rules/adfPrefixNameRule.ts | 60 ---------- tools/tslint-rules/index.js | 9 -- tools/tslint-rules/index.ts | 22 ---- tools/tslint-rules/package-lock.json | 108 ------------------ tools/tslint-rules/package.json | 34 ------ tools/tslint-rules/tsconfig.json | 22 ---- tools/tslint-rules/tslint.json | 5 - 42 files changed, 266 insertions(+), 992 deletions(-) delete mode 100644 assets/alfresco-app-dev-framework-architecture.png delete mode 100644 assets/alfresco.png delete mode 100644 demo-shell/src/app/components/cloud/cloud-breadcrumb-component.html delete mode 100644 demo-shell/src/app/components/cloud/cloud-breadcrumb-component.scss delete mode 100644 demo-shell/src/app/components/cloud/cloud-breadcrumb-component.ts delete mode 100644 demo-shell/src/app/components/process-service/custom-editor/custom-editor.component.ts delete mode 100644 tools/tslint-rules/.gitignore delete mode 100644 tools/tslint-rules/.npmignore delete mode 100644 tools/tslint-rules/README.md delete mode 100644 tools/tslint-rules/adfClassNameRule.js delete mode 100644 tools/tslint-rules/adfClassNameRule.ts delete mode 100644 tools/tslint-rules/adfFileNameRule.js delete mode 100644 tools/tslint-rules/adfFileNameRule.ts delete mode 100644 tools/tslint-rules/adfPrefixNameRule.js delete mode 100644 tools/tslint-rules/adfPrefixNameRule.ts delete mode 100644 tools/tslint-rules/index.js delete mode 100644 tools/tslint-rules/index.ts delete mode 100644 tools/tslint-rules/package-lock.json delete mode 100644 tools/tslint-rules/package.json delete mode 100644 tools/tslint-rules/tsconfig.json delete mode 100644 tools/tslint-rules/tslint.json diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f804748c26..54ce794bd4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,14 +45,11 @@ Note: If you need more information about how to sync your fork, see [this page]( ## Code style The code style for ADF follows the [Angular style guide](https://angular.io/guide/styleguide) plus some internal rules. -You don’t have to worry too much about those rules because they are automatically checked by tslint/codelyzer/adf-rules. -If your code is not compliant with one of these rules you will see an error when you build the project along with some help on how to fix it. -The ADF-Rules are as follows: +The codebase is also checked with: -* File name component/directive cannot start with Alfresco/Activiti/adf - this rule is to help developers find files easily -* Class names cannot start with Alfresco/Activiti/adf for the same reason as above -* scss is mandatory. All the classes need to have the `adf-` prefix +- ESLint tool +- Stylelint tool ## Test guide diff --git a/assets/alfresco-app-dev-framework-architecture.png b/assets/alfresco-app-dev-framework-architecture.png deleted file mode 100644 index 614475f8e5465c3d6ff5255a3fccd30a4fb9f19c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33550 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 diff --git a/demo-shell/src/app/app.module.ts b/demo-shell/src/app/app.module.ts index 78495a2a6d..294489a745 100644 --- a/demo-shell/src/app/app.module.ts +++ b/demo-shell/src/app/app.module.ts @@ -55,7 +55,6 @@ import { CloudViewerComponent } from './components/cloud/cloud-viewer.component' import { ProcessDetailsCloudDemoComponent } from './components/cloud/process-details-cloud-demo.component'; import { StartTaskCloudDemoComponent } from './components/cloud/start-task-cloud-demo.component'; import { StartProcessCloudDemoComponent } from './components/cloud/start-process-cloud-demo.component'; -import { CloudBreadcrumbsComponent } from './components/cloud/cloud-breadcrumb-component'; import { CloudFiltersDemoComponent } from './components/cloud/cloud-filters-demo.component'; import { FormCloudDemoComponent } from './components/app-layout/cloud/form-demo/cloud-form-demo.component'; import { environment } from '../environments/environment'; @@ -119,7 +118,6 @@ import { FolderDirectiveModule } from './folder-directive'; ProcessDetailsCloudDemoComponent, StartTaskCloudDemoComponent, StartProcessCloudDemoComponent, - CloudBreadcrumbsComponent, CloudFiltersDemoComponent, FormCloudDemoComponent, CustomEditorComponent, diff --git a/demo-shell/src/app/components/cloud/cloud-breadcrumb-component.html b/demo-shell/src/app/components/cloud/cloud-breadcrumb-component.html deleted file mode 100644 index 34fbb3295a..0000000000 --- a/demo-shell/src/app/components/cloud/cloud-breadcrumb-component.html +++ /dev/null @@ -1,4 +0,0 @@ - -
{{appName + ' >'}}
-
{{filterName | translate}}
-
diff --git a/demo-shell/src/app/components/cloud/cloud-breadcrumb-component.scss b/demo-shell/src/app/components/cloud/cloud-breadcrumb-component.scss deleted file mode 100644 index efd883e223..0000000000 --- a/demo-shell/src/app/components/cloud/cloud-breadcrumb-component.scss +++ /dev/null @@ -1,14 +0,0 @@ -app-cloud-breadcrumbs { - .app-app-crumb { - opacity: 0.5; - } - - .app-filter-crumb { - opacity: 0.8; - margin-left: 5px; - } - - adf-toolbar { - display: flex; - } -} diff --git a/demo-shell/src/app/components/cloud/cloud-breadcrumb-component.ts b/demo-shell/src/app/components/cloud/cloud-breadcrumb-component.ts deleted file mode 100644 index 667fdc194e..0000000000 --- a/demo-shell/src/app/components/cloud/cloud-breadcrumb-component.ts +++ /dev/null @@ -1,43 +0,0 @@ -/*! - * @license - * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Component, OnInit, ViewEncapsulation } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; - -@Component({ - selector: 'app-cloud-breadcrumbs', - templateUrl: './cloud-breadcrumb-component.html', - styleUrls: ['./cloud-breadcrumb-component.scss'], - encapsulation: ViewEncapsulation.None -}) -export class CloudBreadcrumbsComponent implements OnInit { - appName: string; - filterName: string; - - constructor(private route: ActivatedRoute) {} - - ngOnInit() { - this.route.parent.params.subscribe(params => { - this.appName = params.appName; - }); - this.route.queryParams.subscribe(params => { - if (params.filterName) { - this.filterName = params.filterName; - } - }); - } -} diff --git a/demo-shell/src/app/components/cloud/cloud-layout.component.html b/demo-shell/src/app/components/cloud/cloud-layout.component.html index 280f9f58f7..89820441c0 100644 --- a/demo-shell/src/app/components/cloud/cloud-layout.component.html +++ b/demo-shell/src/app/components/cloud/cloud-layout.component.html @@ -3,7 +3,10 @@ - +
+ {{appName}} + {{ ' > ' + (filterName | translate)}} +
diff --git a/demo-shell/src/app/components/cloud/cloud-layout.component.scss b/demo-shell/src/app/components/cloud/cloud-layout.component.scss index 7457ba1a16..ffe293b04a 100644 --- a/demo-shell/src/app/components/cloud/cloud-layout.component.scss +++ b/demo-shell/src/app/components/cloud/cloud-layout.component.scss @@ -2,10 +2,6 @@ overflow: auto; } -.app-cloud-layout-tab-body .mat-tab-body-wrapper { - height: 100%; -} - app-cloud-layout { .app-cloud-layout-tab-body { height: 100%; @@ -18,5 +14,13 @@ app-cloud-layout { box-sizing: border-box; display: flex; } + + & > div { + height: 100%; + } + } + + .app-cloud-layout-toolbar { + display: flex; } } diff --git a/demo-shell/src/app/components/cloud/cloud-layout.component.ts b/demo-shell/src/app/components/cloud/cloud-layout.component.ts index c8c85f8638..15603bf50b 100644 --- a/demo-shell/src/app/components/cloud/cloud-layout.component.ts +++ b/demo-shell/src/app/components/cloud/cloud-layout.component.ts @@ -26,14 +26,10 @@ import { CloudLayoutService } from './services/cloud-layout.service'; encapsulation: ViewEncapsulation.None }) export class CloudLayoutComponent implements OnInit { - displayMenu = true; appName: string; + filterName: string; - constructor( - private router: Router, - private route: ActivatedRoute, - private cloudLayoutService: CloudLayoutService - ) { } + constructor(private router: Router, private route: ActivatedRoute, private cloudLayoutService: CloudLayoutService) {} ngOnInit() { let root: string = ''; @@ -53,6 +49,10 @@ export class CloudLayoutComponent implements OnInit { if (root === 'processes' && params.id) { this.cloudLayoutService.setCurrentProcessFilterParam({ id: params.id }); } + + if (params.filterName) { + this.filterName = params.filterName; + } }); } diff --git a/demo-shell/src/app/components/files/files.component.html b/demo-shell/src/app/components/files/files.component.html index 2ab363c090..f66a7bab96 100644 --- a/demo-shell/src/app/components/files/files.component.html +++ b/demo-shell/src/app/components/files/files.component.html @@ -347,7 +347,6 @@
-
+

Error log:

Error {{ error.name }} {{error.validationSummary.message | translate}}

diff --git a/demo-shell/src/app/components/form/form.component.ts b/demo-shell/src/app/components/form/form.component.ts index f70a8ceb6a..a2c66968fc 100644 --- a/demo-shell/src/app/components/form/form.component.ts +++ b/demo-shell/src/app/components/form/form.component.ts @@ -15,8 +15,16 @@ * limitations under the License. */ -import { Component, Inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; -import { FormModel, FormFieldModel, FormService, FormOutcomeEvent, NotificationService, CoreAutomationService, FormRenderingService } from '@alfresco/adf-core'; +import { Component, inject, OnDestroy, OnInit, ViewEncapsulation } from '@angular/core'; +import { + FormModel, + FormFieldModel, + FormService, + FormOutcomeEvent, + NotificationService, + CoreAutomationService, + FormRenderingService +} from '@alfresco/adf-core'; import { ProcessFormRenderingService } from '@alfresco/adf-process-services'; import { InMemoryFormService } from '../../services/in-memory-form.service'; import { Subject } from 'rxjs'; @@ -33,6 +41,10 @@ import { takeUntil } from 'rxjs/operators'; encapsulation: ViewEncapsulation.None }) export class FormComponent implements OnInit, OnDestroy { + private formService = inject(FormService); + private notificationService = inject(NotificationService); + private automationService = inject(CoreAutomationService); + form: FormModel; errorFields: FormFieldModel[] = []; formConfig: string; @@ -49,25 +61,16 @@ export class FormComponent implements OnInit, OnDestroy { private onDestroy$ = new Subject(); - constructor(@Inject(FormService) private formService: InMemoryFormService, - private notificationService: NotificationService, - private automationService: CoreAutomationService) { - } - logErrors(errorFields: FormFieldModel[]) { this.errorFields = errorFields; } ngOnInit() { - this.formService.executeOutcome - .pipe(takeUntil(this.onDestroy$)) - .subscribe((formOutcomeEvent: FormOutcomeEvent) => { - formOutcomeEvent.preventDefault(); - }); + this.formService.executeOutcome.pipe(takeUntil(this.onDestroy$)).subscribe((formOutcomeEvent: FormOutcomeEvent) => { + formOutcomeEvent.preventDefault(); + }); - this.formConfig = JSON.stringify( - this.automationService.forms.getFormDefinition() - ); + this.formConfig = JSON.stringify(this.automationService.forms.getFormDefinition()); this.parseForm(); } diff --git a/demo-shell/src/app/components/process-service/custom-editor/custom-editor.component.ts b/demo-shell/src/app/components/process-service/custom-editor/custom-editor.component.ts deleted file mode 100644 index ca9316bafb..0000000000 --- a/demo-shell/src/app/components/process-service/custom-editor/custom-editor.component.ts +++ /dev/null @@ -1,53 +0,0 @@ -/*! - * @license - * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* eslint-disable */ - -import { Component, NgModule } from '@angular/core'; -import { WidgetComponent } from '@alfresco/adf-core'; - -@Component({ - selector: 'custom-editor', - template: ` -
Look, I'm a custom editor!
- ` -}) -export class CustomEditorComponent extends WidgetComponent { - - constructor() { - super(); - } -} - -@Component({ - selector: 'custom-stencil-01', - template: `
ADF version of custom ProcessService stencil
` -}) -export class CustomStencil01 extends WidgetComponent { - - constructor() { - super(); - } -} - -@NgModule({ - declarations: [ CustomEditorComponent, CustomStencil01 ], - exports: [ CustomEditorComponent, CustomStencil01 ] -}) -export class CustomEditorsModule { - -} diff --git a/demo-shell/src/app/components/process-service/process-service.component.html b/demo-shell/src/app/components/process-service/process-service.component.html index 5b4f3ea667..be580abb80 100644 --- a/demo-shell/src/app/components/process-service/process-service.component.html +++ b/demo-shell/src/app/components/process-service/process-service.component.html @@ -50,17 +50,16 @@ class="app-grid-item app-tasks-details" *ngIf="!isStartTaskMode()" data-automation-id="app-tasks-details"> - +
@@ -129,14 +128,12 @@ + (changePageSize)="onChangePageSize($event)">
(); private scriptFileApi: ScriptFilesApi; - constructor(private elementRef: ElementRef, - private route: ActivatedRoute, - private router: Router, - private apiService: AlfrescoApiService, - private appConfig: AppConfigService, - private preview: PreviewService, - formRenderingService: FormRenderingService, - formService: FormService, - private location: Location, - private notificationService: NotificationService, - private preferenceService: UserPreferencesService) { - + constructor( + private elementRef: ElementRef, + private route: ActivatedRoute, + private router: Router, + private apiService: AlfrescoApiService, + private appConfig: AppConfigService, + private preview: PreviewService, + formService: FormService, + private location: Location, + private notificationService: NotificationService, + private preferenceService: UserPreferencesService + ) { this.scriptFileApi = new ScriptFilesApi(this.apiService.getInstance()); this.defaultProcessName = this.appConfig.get('adf-start-process.name'); this.defaultProcessDefinitionName = this.appConfig.get('adf-start-process.processDefinitionName'); this.defaultTaskName = this.appConfig.get('adf-start-task.name'); this.processDefinitionName = this.defaultProcessDefinitionName; - // Uncomment this line to replace all 'text' field editors with custom component - // formRenderingService.setComponentTypeResolver('text', () => CustomEditorComponent, true); - - // Uncomment this line to map 'custom_stencil_01' to local editor component - formRenderingService.setComponentTypeResolver('custom_stencil_01', () => CustomStencil01, true); this.preferenceService .select(UserPreferenceValues.PaginationSize) @@ -177,22 +149,18 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit formService.validateDynamicTableRow .pipe(takeUntil(this.onDestroy$)) - .subscribe( - (validateDynamicTableRowEvent: ValidateDynamicTableRowEvent) => { - const row: DynamicTableRow = validateDynamicTableRowEvent.row; - if (row?.value && row.value.name === 'admin') { - validateDynamicTableRowEvent.summary.isValid = false; - validateDynamicTableRowEvent.summary.message = 'Sorry, wrong value. You cannot use "admin".'; - validateDynamicTableRowEvent.preventDefault(); - } + .subscribe((validateDynamicTableRowEvent: ValidateDynamicTableRowEvent) => { + const row: DynamicTableRow = validateDynamicTableRowEvent.row; + if (row?.value && row.value.name === 'admin') { + validateDynamicTableRowEvent.summary.isValid = false; + validateDynamicTableRowEvent.summary.message = 'Sorry, wrong value. You cannot use "admin".'; + validateDynamicTableRowEvent.preventDefault(); } - ); - - formService.formContentClicked - .pipe(takeUntil(this.onDestroy$)) - .subscribe((content) => { - this.showContentPreview(content); }); + + formService.formContentClicked.pipe(takeUntil(this.onDestroy$)).subscribe((content) => { + this.showContentPreview(content); + }); } ngOnInit() { diff --git a/demo-shell/src/app/components/search/search-filter-chips.component.ts b/demo-shell/src/app/components/search/search-filter-chips.component.ts index 81692d0781..a3aabada0a 100644 --- a/demo-shell/src/app/components/search/search-filter-chips.component.ts +++ b/demo-shell/src/app/components/search/search-filter-chips.component.ts @@ -18,7 +18,7 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute, Params, Router } from '@angular/router'; import { Pagination, ResultSetPaging } from '@alfresco/js-api'; -import { SearchConfiguration, SearchForm, SearchQueryBuilderService, SearchService } from '@alfresco/adf-content-services'; +import { SearchConfiguration, SearchQueryBuilderService, SearchService } from '@alfresco/adf-content-services'; import { ShowHeaderMode, UserPreferencesService } from '@alfresco/adf-core'; import { combineLatest, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -26,11 +26,10 @@ import { takeUntil } from 'rxjs/operators'; @Component({ selector: 'app-search-filter-chips', templateUrl: './search-filter-chips.component.html', - styleUrls: [ './search-filter-chips.component.scss' ], + styleUrls: ['./search-filter-chips.component.scss'], providers: [SearchService] }) export class SearchFilterChipsComponent implements OnInit, OnDestroy { - queryParamName = 'q'; searchedWord = ''; data: ResultSetPaging; @@ -38,15 +37,16 @@ export class SearchFilterChipsComponent implements OnInit, OnDestroy { isLoading = true; sorting = ['name', 'asc']; - searchForms: SearchForm[]; showHeader = ShowHeaderMode.Always; private onDestroy$ = new Subject(); - constructor(public router: Router, - private preferences: UserPreferencesService, - private queryBuilder: SearchQueryBuilderService, - private route: ActivatedRoute) { + constructor( + public router: Router, + private preferences: UserPreferencesService, + private queryBuilder: SearchQueryBuilderService, + private route: ActivatedRoute + ) { combineLatest([this.route.params, this.queryBuilder.configUpdated]) .pipe(takeUntil(this.onDestroy$)) .subscribe(([params, searchConfig]) => { @@ -56,7 +56,7 @@ export class SearchFilterChipsComponent implements OnInit, OnDestroy { if (query) { this.queryBuilder.userQuery = query; } - }); + }); queryBuilder.paging = { maxItems: this.preferences.paginationSize, @@ -69,21 +69,17 @@ export class SearchFilterChipsComponent implements OnInit, OnDestroy { this.sorting = this.getSorting(); - this.queryBuilder.updated - .pipe(takeUntil(this.onDestroy$)) - .subscribe(() => { - this.sorting = this.getSorting(); - this.isLoading = true; - }); + this.queryBuilder.updated.pipe(takeUntil(this.onDestroy$)).subscribe(() => { + this.sorting = this.getSorting(); + this.isLoading = true; + }); - this.queryBuilder.executed - .pipe(takeUntil(this.onDestroy$)) - .subscribe((resultSetPaging: ResultSetPaging) => { - this.queryBuilder.paging.skipCount = 0; + this.queryBuilder.executed.pipe(takeUntil(this.onDestroy$)).subscribe((resultSetPaging: ResultSetPaging) => { + this.queryBuilder.paging.skipCount = 0; - this.onSearchResultLoaded(resultSetPaging); - this.isLoading = false; - }); + this.onSearchResultLoaded(resultSetPaging); + this.isLoading = false; + }); if (this.route) { this.route.params.forEach((params: Params) => { @@ -92,18 +88,20 @@ export class SearchFilterChipsComponent implements OnInit, OnDestroy { this.queryBuilder.update(); } else { this.queryBuilder.userQuery = null; - this.queryBuilder.executed.next(new ResultSetPaging({ - list: { - pagination: { totalItems: 0 }, - entries: [] - } - })); + this.queryBuilder.executed.next( + new ResultSetPaging({ + list: { + pagination: { totalItems: 0 }, + entries: [] + } + }) + ); } }); } } - private formatSearchQuery(userInput: string, fields = ['cm:name']) { + private formatSearchQuery(userInput: string, fields = ['cm:name']) { if (!userInput) { return null; } diff --git a/docs/content-services/components/add-permission-dialog.component.md b/docs/content-services/components/add-permission-dialog.component.md index 18bbd744ab..2453ce2b49 100644 --- a/docs/content-services/components/add-permission-dialog.component.md +++ b/docs/content-services/components/add-permission-dialog.component.md @@ -2,10 +2,12 @@ Title: Add Permission Dialog Component Added: v2.4.0 Status: Active -Last reviewed: 2018-11-13 +Last reviewed: 2024-05-07 --- -# [Add Permission Dialog Component](../../../lib/content-services/src/lib/permission-manager/components/add-permission/add-permission-dialog.component.ts "Defined in add-permission-dialog.component.ts") +# Add Permission Dialog Component + +`import { NodePermissionDialogService } from '@alfresco/adf-content-services';` Displays a dialog to search for people or groups to add to the current node permissions. @@ -15,41 +17,53 @@ Displays a dialog to search for people or groups to add to the current node perm ```ts import { NodePermissionDialogService } from '@alfresco/adf-content-services'; +import { inject } from '@angular/core'; - constructor(private nodePermissionDialogService: nodePermissionDialogService) { +export class MyComponent { + private nodePermissionDialogService = inject(NodePermissionDialogService); + + showDialog() { + this.nodePermissionDialogService + .openAddPermissionDialog(this.nodeId) + .subscribe((selectedNodes) => { + //action for selected nodes + }, + (error) => { + this.showErrorMessage(error); + }); } - - this.nodePermissionDialogService.openAddPermissionDialog(this.nodeId).subscribe((selectedNodes) => { - //action for selected nodes - }, - (error) => { - this.showErrorMessage(error); - }); +} ``` ## Details This component extends the [Add permission panel component](add-permission-panel.component.md) to apply the chosen selection of permissions when they are accepted. + You can open the dialog with the `openAddPermissionDialog` method from the [Node Permission Dialog Service](../services/node-permission-dialog.service.md). This returns an [`Observable`](http://reactivex.io/documentation/observable.html) -that you can subscribe to so you can get the details of the node after the update. -Use the `updateNodePermissionByDialog` nethod from the service to update node permissions, as shown in +that you can subscribe to, so you can get the details of the node after the update. + +Use the `updateNodePermissionByDialog` method from the service to update node permissions, as shown in the following example: ```ts import { NodePermissionDialogService } from '@alfresco/adf-content-services'; +import { inject } from '@angular/core'; - constructor(private nodePermissionDialogService: nodePermissionDialogService) { +export class MyComponent { + private nodePermissionDialogService = inject(NodePermissionDialogService); + + updateNodePermissions() { + this.nodePermissionDialogService.updateNodePermissionByDialog(this.nodeId).subscribe((node) => { + //updated node + }, + (error) => { + this.showErrorMessage(error); + }); } - - this.nodePermissionDialogService.updateNodePermissionByDialog(this.nodeId).subscribe((node) => { - //updated node - }, - (error) => { - this.showErrorMessage(error); - }); +} ``` ## See also diff --git a/docs/content-services/components/aspect-list.component.md b/docs/content-services/components/aspect-list.component.md index 3b79c983b5..c413afa02d 100644 --- a/docs/content-services/components/aspect-list.component.md +++ b/docs/content-services/components/aspect-list.component.md @@ -2,42 +2,52 @@ Title: Aspect List component Added: v2.0.0 Status: Active -Last reviewed: 2021-01-20 +Last reviewed: 2024-05-07 --- -# [Aspect List component](../../../lib/content-services/src/lib/aspect-list/aspect-list.component.ts "Defined in aspect-list.component.ts") +# Aspect List Component + +`import { AspectListComponent } from '@alfresco/adf-content-services';` This component will show in an expandable row list with checkboxes all the aspect of a node, if a node id is given, or otherwise a complete list. -The aspect are filtered via the app.config.json in this way : + +The aspects are filtered via the `app.config.json` in the following way : ```json - "aspect-visible": { - "default" : ["as:aspectThatWillBeShowedIfPresent"] - } +{ + "aspect-visible": { + "default": [ + "as:aspectThatWillBeShowedIfPresent" + ] + } +} ``` ## Basic Usage ```html - - + + ``` ## Class members ### Properties -| Name | Type | Default value | Description | -| ---- | ---- | ------------- | ----------- | -| nodeId | `string` | "" | Node Id of the node that we want to update | -| excludedAspects | `string[]` | undefined | List of aspects' ids which should not be displayed. | +| Name | Type | Default value | Description | +|-----------------|------------|---------------|-----------------------------------------------------| +| nodeId | `string` | "" | Node Id of the node that we want to update | +| excludedAspects | `string[]` | undefined | List of aspects' ids which should not be displayed. | ### Events -| Name | Type | Description | -| ---- | ---- | ----------- | -| valueChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted every time the user select a new aspect | -| updateCounter | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted every time the number of selected aspects changes | +| Name | Type | Description | +|---------------|------------------------------------------------------------------------|-----------------------------------------------------------| +| valueChanged | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted every time the user select a new aspect | +| updateCounter | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted every time the number of selected aspects changes | ## See also diff --git a/lib/cli/scripts/licenses.ts b/lib/cli/scripts/licenses.ts index 45e99d5889..0cb42e25cf 100644 --- a/lib/cli/scripts/licenses.ts +++ b/lib/cli/scripts/licenses.ts @@ -50,8 +50,6 @@ const missingRepositories = { '@webassemblyjs/helper-fsm': 'https://github.com/xtuc/webassemblyjs', '@webassemblyjs/ieee754': 'https://github.com/xtuc/webassemblyjs', '@webassemblyjs/leb128': 'https://github.com/xtuc/webassemblyjs', - 'adf-tslint-rules': 'https://github.com/Alfresco/alfresco-ng2-components', - 'adf-monaco-extension': 'https://github.com/eromano/aca-monaco-extension', indexof: 'https://github.com/component/indexof', 'rxjs-compat': 'https://github.com/ReactiveX/rxjs/tree/master/compat' }; diff --git a/lib/process-services/src/lib/task-list/components/checklist.component.ts b/lib/process-services/src/lib/task-list/components/checklist.component.ts index 3f9d25e894..e61c9ede54 100644 --- a/lib/process-services/src/lib/task-list/components/checklist.component.ts +++ b/lib/process-services/src/lib/task-list/components/checklist.component.ts @@ -62,7 +62,7 @@ export class ChecklistComponent implements OnChanges { checklist: TaskDetailsModel[] = []; - constructor(private activitiTaskList: TaskListService, private dialog: MatDialog) {} + constructor(private taskListService: TaskListService, private dialog: MatDialog) {} ngOnChanges(changes: SimpleChanges) { const taskId = changes['taskId']; @@ -75,7 +75,7 @@ export class ChecklistComponent implements OnChanges { getTaskChecklist() { this.checklist = []; if (this.taskId) { - this.activitiTaskList.getTaskChecklist(this.taskId).subscribe( + this.taskListService.getTaskChecklist(this.taskId).subscribe( (taskDetailsModel) => { taskDetailsModel.forEach((task) => { this.checklist.push(task); @@ -100,7 +100,7 @@ export class ChecklistComponent implements OnChanges { parentTaskId: this.taskId, assignee: { id: this.assignee } }); - this.activitiTaskList.addTask(newTask).subscribe( + this.taskListService.addTask(newTask).subscribe( (taskDetailsModel) => { this.checklist.push(taskDetailsModel); this.checklistTaskCreated.emit(taskDetailsModel); @@ -114,7 +114,7 @@ export class ChecklistComponent implements OnChanges { } public delete(taskId: string) { - this.activitiTaskList.deleteTask(taskId).subscribe( + this.taskListService.deleteTask(taskId).subscribe( () => { this.checklist = this.checklist.filter((check) => check.id !== taskId); this.checklistTaskDeleted.emit(taskId); diff --git a/lib/process-services/src/lib/task-list/components/task-details.component.html b/lib/process-services/src/lib/task-list/components/task-details.component.html index e1b64b52eb..f0dae0ab7c 100644 --- a/lib/process-services/src/lib/task-list/components/task-details.component.html +++ b/lib/process-services/src/lib/task-list/components/task-details.component.html @@ -18,7 +18,7 @@
- + (error)="onFormError($event)"> - - @@ -79,7 +79,6 @@ @@ -92,12 +91,12 @@
- +
diff --git a/lib/process-services/src/lib/task-list/components/task-details.component.spec.ts b/lib/process-services/src/lib/task-list/components/task-details.component.spec.ts index e7730ca36f..eb22920f32 100644 --- a/lib/process-services/src/lib/task-list/components/task-details.component.spec.ts +++ b/lib/process-services/src/lib/task-list/components/task-details.component.spec.ts @@ -311,7 +311,7 @@ describe('TaskDetailsComponent', () => { component.taskDetails.endDate = new Date('2017-10-03T17:03:57.311+0000'); fixture.detectChanges(); - expect((component.activitiComments as any).readOnly).toBe(true); + expect(component.isReadOnlyComment()).toBe(true); }); it('should comments be readonly if the task is complete and user are NOT involved', () => { @@ -323,7 +323,7 @@ describe('TaskDetailsComponent', () => { component.taskDetails.endDate = new Date('2017-10-03T17:03:57.311+0000'); fixture.detectChanges(); - expect((component.activitiComments as any).readOnly).toBe(true); + expect(component.isReadOnlyComment()).toBe(true); }); it('should comments NOT be readonly if the task is NOT complete and user are NOT involved', () => { @@ -335,7 +335,7 @@ describe('TaskDetailsComponent', () => { component.taskDetails.endDate = null; fixture.detectChanges(); - expect((component.activitiComments as any).readOnly).toBe(false); + expect(component.isReadOnlyComment()).toBe(false); }); it('should comments NOT be readonly if the task is complete and user are involved', () => { @@ -347,7 +347,7 @@ describe('TaskDetailsComponent', () => { component.taskDetails.endDate = new Date('2017-10-03T17:03:57.311+0000'); fixture.detectChanges(); - expect((component.activitiComments as any).readOnly).toBe(false); + expect(component.isReadOnlyComment()).toBe(false); }); it('should comments be present if showComments is true', () => { @@ -358,7 +358,7 @@ describe('TaskDetailsComponent', () => { component.taskDetails = new TaskDetailsModel(taskDetailsMock); fixture.detectChanges(); - expect(component.activitiComments).toBeDefined(); + expect(component.showComments).toBe(true); }); it('should comments NOT be present if showComments is false', () => { @@ -368,7 +368,7 @@ describe('TaskDetailsComponent', () => { component.taskDetails = new TaskDetailsModel(taskDetailsMock); fixture.detectChanges(); - expect(component.activitiComments).not.toBeDefined(); + expect(component.showComments).toBeFalse(); }); }); diff --git a/lib/process-services/src/lib/task-list/components/task-details.component.ts b/lib/process-services/src/lib/task-list/components/task-details.component.ts index d939bf2c47..6b57618ff6 100644 --- a/lib/process-services/src/lib/task-list/components/task-details.component.ts +++ b/lib/process-services/src/lib/task-list/components/task-details.component.ts @@ -18,7 +18,6 @@ import { CardViewUpdateService, ClickNotification, - CommentsComponent, ContentLinkModel, FormFieldValidator, FormModel, @@ -55,22 +54,12 @@ import { PeopleProcessService } from '../../common/services/people-process.servi encapsulation: ViewEncapsulation.None }) export class TaskDetailsComponent implements OnInit, OnChanges, OnDestroy { - @ViewChild('activitiComments') - activitiComments: CommentsComponent; - - @ViewChild('activitiChecklist') - activitiChecklist: any; - @ViewChild('errorDialog') errorDialog: TemplateRef; - @ViewChild('activitiTaskForm') + @ViewChild('taskForm') taskFormComponent: TaskFormComponent; - /** Toggles debug mode. */ - @Input() - debugMode: boolean = false; - /** (**required**) The id of the task whose details we are asking for. */ @Input() taskId: string; @@ -177,9 +166,9 @@ export class TaskDetailsComponent implements OnInit, OnChanges, OnDestroy { taskFormName: string = null; taskPeople: UserProcessModel[] = []; noTaskDetailsTemplateComponent: TemplateRef; - showAssignee: boolean = false; - showAttachForm: boolean = false; - internalReadOnlyForm: boolean = false; + showAssignee = false; + showAttachForm = false; + internalReadOnlyForm = false; errorDialogRef: MatDialogRef>; peopleSearch: Observable; data: any; @@ -222,14 +211,6 @@ export class TaskDetailsComponent implements OnInit, OnChanges, OnDestroy { } } - isShowAttachForm(): boolean { - return this.showAttachForm; - } - - isTaskActive() { - return this.taskDetails && this.taskDetails.duration === null; - } - isAssigned(): boolean { return !!this.taskDetails.assignee; } diff --git a/lib/process-services/src/lib/task-list/components/task-header.component.ts b/lib/process-services/src/lib/task-list/components/task-header.component.ts index d9e5d70e0d..e89dd3423a 100644 --- a/lib/process-services/src/lib/task-list/components/task-header.component.ts +++ b/lib/process-services/src/lib/task-list/components/task-header.component.ts @@ -58,7 +58,6 @@ export class TaskHeaderComponent implements OnChanges, OnInit { unclaim: EventEmitter = new EventEmitter(); properties: any[] = []; - inEdit: boolean = false; displayDateClearAction = false; dateFormat: string; dateLocale: string; @@ -196,10 +195,20 @@ export class TaskHeaderComponent implements OnChanges, OnInit { return this.taskDetails?.isCompleted() ? 'Completed' : 'Running'; } + /** + * Emit the claim event + * + * @param taskId the id of the task to claim + */ onClaimTask(taskId: string) { this.claim.emit(taskId); } + /** + * Emit the unclaim event + * + * @param taskId the id of the task to unclaim + */ onUnclaimTask(taskId: string) { this.unclaim.emit(taskId); } @@ -213,15 +222,25 @@ export class TaskHeaderComponent implements OnChanges, OnInit { return !!this.taskDetails?.endDate; } + /** + * Check if the form is clickable + * + * @returns `true` if the form is clickable, otherwise `false` + */ isFormClickable(): boolean { return !!this.formName && !this.isCompleted(); } + /** + * Get the task duration + * + * @returns the task duration in milliseconds + */ getTaskDuration(): string { return this.taskDetails.duration ? `${this.taskDetails.duration} ms` : ''; } - private initDefaultProperties(parentInfoMap): any[] { + private initDefaultProperties(parentInfoMap: Map): any[] { return [ new CardViewTextItemModel({ label: 'ADF_TASK_LIST.PROPERTIES.ASSIGNEE', diff --git a/lib/process-services/src/lib/task-list/components/task-list.component.html b/lib/process-services/src/lib/task-list/components/task-list.component.html index 19ee13df37..8f78264a08 100644 --- a/lib/process-services/src/lib/task-list/components/task-list.component.html +++ b/lib/process-services/src/lib/task-list/components/task-list.component.html @@ -1,43 +1,44 @@ -
{{ 'ADF_TASK_LIST.FILTERS.MESSAGES.NONE' | translate }}
- - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
{{ 'ADF_TASK_LIST.FILTERS.MESSAGES.NONE' | translate }}
+
diff --git a/lib/process-services/src/lib/task-list/components/task-standalone.component.ts b/lib/process-services/src/lib/task-list/components/task-standalone.component.ts index 7d5616eb2a..5a23b302fc 100644 --- a/lib/process-services/src/lib/task-list/components/task-standalone.component.ts +++ b/lib/process-services/src/lib/task-list/components/task-standalone.component.ts @@ -23,29 +23,26 @@ import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angu styleUrls: ['./task-standalone.component.scss'], encapsulation: ViewEncapsulation.None }) - export class TaskStandaloneComponent { - /** Name of the task. */ @Input() - taskName; + taskName: string; /** Id of the task. */ @Input() - taskId; + taskId: string; /** If true then Task completed message is shown and `Complete` and `Cancel` buttons are hidden. */ @Input() - isCompleted: boolean = false; + isCompleted = false; /** Toggles rendering of the `Complete` button. */ @Input() - hasCompletePermission: boolean = true; + hasCompletePermission = true; - // TODO: rename all with show prefix /** Toggles rendering of the `Cancel` button. */ @Input() - hideCancelButton: boolean = true; + hideCancelButton = true; /** Emitted when the "Cancel" button is clicked. */ @Output() @@ -59,8 +56,6 @@ export class TaskStandaloneComponent { @Output() showAttachForm = new EventEmitter(); - constructor() { } - onCancelButtonClick(): void { this.cancel.emit(); } diff --git a/tools/tslint-rules/.gitignore b/tools/tslint-rules/.gitignore deleted file mode 100644 index f8e69431f5..0000000000 --- a/tools/tslint-rules/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -/npm-debug.log -/.idea -node_modules -coverage -/temp/ -local.log -/rules/*.js diff --git a/tools/tslint-rules/.npmignore b/tools/tslint-rules/.npmignore deleted file mode 100644 index 42b34c30e7..0000000000 --- a/tools/tslint-rules/.npmignore +++ /dev/null @@ -1,15 +0,0 @@ -.idea - -coverage/ -node_modules -temp/ -test/ - -/.editorconfig -/gulpfile.js -/.npmignore - -*.tgz - -/assets/ -local.log diff --git a/tools/tslint-rules/README.md b/tools/tslint-rules/README.md deleted file mode 100644 index a07b864ea6..0000000000 --- a/tools/tslint-rules/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# adf-tslint-rules - - -A set of [TSLint](https://github.com/palantir/tslint) rules used on [ADF](https://github.com/Alfresco/alfresco-ng2-components) project. - -## Installation - -```sh - npm install adf-tslint-rules -``` - -## Configuration - -```javascript -{ - "rulesDirectory": [ - "node_modules/codelyzer", - "node_modules/adf-tslint-rules" - ], - "rules": { - "adf-file-name": true, - "adf-class-name": true, - "adf-no-on-prefix-output-name": true - } -} -``` - -Supported Rules ------ - -Rule Name | Description | ----------- | ------------ | -`adf-file-name` | The name of the File should not start with ADF Alfresco or Activiti prefix | -`adf-class-name` | The name of the class should not start with ADF Alfresco or Activiti prefix | -`adf-no-on-prefix-output-name` | Angular allows for an alternative syntax on-*. If the event itself was prefixed with on this would result in an on-onEvent binding expression | -| diff --git a/tools/tslint-rules/adfClassNameRule.js b/tools/tslint-rules/adfClassNameRule.js deleted file mode 100644 index a18bcb23a2..0000000000 --- a/tools/tslint-rules/adfClassNameRule.js +++ /dev/null @@ -1,44 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Lint = require("tslint"); -const sprintf_js_1 = require("sprintf-js"); -const walkerFactory_1 = require("codelyzer/walkerFactory/walkerFactory"); -const walkerFn_1 = require("codelyzer/walkerFactory/walkerFn"); -const function_1 = require("codelyzer/util/function"); -class Rule extends Lint.Rules.AbstractRule { - static invalidName(className) { - var whiteList = ['ActivitiContentComponent', 'ActivitiForm']; - var classNameReg = /^(alfresco|activiti|adf|activity)/ig; - var classNameMatch = classNameReg.exec(className); - var isWhiteListName = whiteList.find((currentWhiteListName) => { - return currentWhiteListName === className; - }); - if (classNameMatch && !isWhiteListName) { - return true; - } - return false; - } - apply(sourceFile) { - return this.applyWithWalker(Rule.walkerBuilder(sourceFile, this.getOptions())); - } -} -Rule.metadata = { - ruleName: 'adf-class-name', - type: 'maintainability', - description: `Enforce consistent name avoid prefix`, - descriptionDetails: `See more at https://angular.io/styleguide#style-05-13.`, - rationale: `Consistent conventions make it easy to quickly identify class when you search with autocomplete.`, - options: null, - optionsDescription: "Not configurable.", - typescriptOnly: true, -}; -Rule.FAILURE_STRING = 'The name of the class should not start with ADF Alfresco or Activiti prefix '; -Rule.walkerBuilder = walkerFn_1.all(walkerFn_1.validateComponent((meta, suffixList) => function_1.Maybe.lift(meta.controller) - .fmap(controller => controller.name) - .fmap(name => { - const className = name.text; - if (Rule.invalidName(className)) { - return [new walkerFactory_1.Failure(name, sprintf_js_1.sprintf(Rule.FAILURE_STRING + className, className, suffixList))]; - } -}))); -exports.Rule = Rule; diff --git a/tools/tslint-rules/adfClassNameRule.ts b/tools/tslint-rules/adfClassNameRule.ts deleted file mode 100644 index 597188dcb1..0000000000 --- a/tools/tslint-rules/adfClassNameRule.ts +++ /dev/null @@ -1,78 +0,0 @@ -/*! - * @license - * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as Lint from 'tslint'; -import * as ts from 'typescript'; -import { sprintf } from 'sprintf-js'; -import { ComponentMetadata } from 'codelyzer/angular/metadata'; -import { Failure } from 'codelyzer/walkerFactory/walkerFactory'; -import { all, validateComponent } from 'codelyzer/walkerFactory/walkerFn'; -import { Maybe, F2 } from 'codelyzer/util/function'; -import { IOptions } from 'tslint'; -import { NgWalker } from 'codelyzer/angular/ngWalker'; - -export class Rule extends Lint.Rules.AbstractRule { - - public static metadata: Lint.IRuleMetadata = { - ruleName: 'adf-class-name', - type: 'maintainability', - description: `Enforce consistent name avoid prefix`, - descriptionDetails: `See more at https://angular.io/styleguide#style-05-13.`, - rationale: `Consistent conventions make it easy to quickly identify class when you search with autocomplete.`, - options: null, - optionsDescription: "Not configurable.", - typescriptOnly: true, - }; - - public static FAILURE_STRING = 'The name of the class should not start with ADF Alfresco or Activiti prefix '; - - static walkerBuilder: F2 = - all( - validateComponent((meta: ComponentMetadata, suffixList?: string[]) => - Maybe.lift(meta.controller) - .fmap(controller => controller.name) - .fmap(name => { - const className = name.text; - if (Rule.invalidName(className)) { - return [new Failure(name, sprintf(Rule.FAILURE_STRING + className, className, suffixList))]; - } - }) - )); - - static invalidName(className: string): boolean { - var whiteList = ['ActivitiContentComponent', 'ActivitiForm']; - - var classNameReg = /^(alfresco|activiti|adf|activity)/ig; - var classNameMatch = classNameReg.exec(className); - - var isWhiteListName = whiteList.find((currentWhiteListName) => { - return currentWhiteListName === className; - }); - - if (classNameMatch && !isWhiteListName) { - return true; - } - - return false; - } - - public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { - return this.applyWithWalker( - Rule.walkerBuilder(sourceFile, this.getOptions()) - ); - } -} diff --git a/tools/tslint-rules/adfFileNameRule.js b/tools/tslint-rules/adfFileNameRule.js deleted file mode 100644 index f37a4e3299..0000000000 --- a/tools/tslint-rules/adfFileNameRule.js +++ /dev/null @@ -1,55 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Lint = require("tslint"); -class Rule extends Lint.Rules.AbstractRule { - apply(sourceFile) { - return this.applyWithWalker(new AdfFileName(sourceFile, this.getOptions())); - } -} -Rule.metadata = { - ruleName: 'adf-file-name', - type: 'maintainability', - description: `Enforce consistent name avoid prefix`, - descriptionDetails: `See more at https://angular.io/styleguide#style-05-13.`, - rationale: `Consistent conventions make it easy to quickly identify files when you search with autocomplete.`, - options: null, - optionsDescription: "Not configurable.", - typescriptOnly: true, -}; -Rule.FAILURE_STRING = 'The name of the File should not start with ADF Alfresco or Activiti prefix '; -Rule.FAILURE_STRING_UNDERSCORE = 'The name of the File should not have _ in the name but you can use - prefer the kebab case'; -Rule.FAILURE_STRING_UPPERCASE = 'The name of the File should not start with uppercase'; -exports.Rule = Rule; -class AdfFileName extends Lint.RuleWalker { - visitSourceFile(node) { - var whiteList = ['activiti-alfresco.service.ts', 'activiti-alfresco.service.spec.ts', - 'alfresco-api.service.ts', 'alfresco-api.service.spects']; - var fileName = this.getFilename(); - var fileNameReg = /^(alfresco|activiti|adf|activity)/ig; - var filenameMatch = fileNameReg.exec(fileName); - var isWhiteListName = whiteList.find((currentWhiteListName) => { - return currentWhiteListName === fileName; - }); - if (filenameMatch && !isWhiteListName) { - this.addFailure(this.createFailure(node.getStart(), node.getWidth(), Rule.FAILURE_STRING + fileName)); - super.visitSourceFile(node); - } - if (fileName.indexOf('_') >= 0) { - this.addFailure(this.createFailure(node.getStart(), node.getWidth(), Rule.FAILURE_STRING_UNDERSCORE + fileName)); - super.visitSourceFile(node); - } - - if (fileName[0] == fileName[0].toUpperCase()) { - this.addFailure(this.createFailure(node.getStart(), node.getWidth(), Rule.FAILURE_STRING_UPPERCASE + fileName)); - super.visitSourceFile(node); - } - } - getFilename() { - const filename = this.getSourceFile().fileName; - const lastSlash = filename.lastIndexOf('/'); - if (lastSlash > -1) { - return filename.substring(lastSlash + 1); - } - return filename; - } -} diff --git a/tools/tslint-rules/adfFileNameRule.ts b/tools/tslint-rules/adfFileNameRule.ts deleted file mode 100644 index 9db32672e2..0000000000 --- a/tools/tslint-rules/adfFileNameRule.ts +++ /dev/null @@ -1,66 +0,0 @@ -import * as ts from "typescript"; -import * as Lint from "tslint"; - - -export class Rule extends Lint.Rules.AbstractRule { - public static metadata: Lint.IRuleMetadata = { - ruleName: 'adf-file-name', - type: 'maintainability', - description: `Enforce consistent name avoid prefix`, - descriptionDetails: `See more at https://angular.io/styleguide#style-05-13.`, - rationale: `Consistent conventions make it easy to quickly identify files when you search with autocomplete.`, - options: null, - optionsDescription: "Not configurable.", - typescriptOnly: true, - }; - - public static FAILURE_STRING = 'The name of the File should not start with ADF Alfresco or Activiti prefix '; - public static FAILURE_STRING_UNDERSCORE = 'The name of the File should not have _ in the name but you can use - '; - public static FAILURE_STRING_UPPERCASE = 'The name of the File should not start with uppercase'; - - public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { - return this.applyWithWalker(new AdfFileName(sourceFile, this.getOptions())); - } -} - -// The walker takes care of all the work. -class AdfFileName extends Lint.RuleWalker { - public visitSourceFile(node: ts.SourceFile) { - var whiteList = ['activiti-alfresco.service.ts', 'activiti-alfresco.service.spec.ts', - 'alfresco-api.service.ts', 'alfresco-api.service.spects']; - - var fileName = this.getFilename(); - - var fileNameReg = /^(alfresco|activiti|adf|activity)/ig; - var filenameMatch = fileNameReg.exec(fileName); - - var isWhiteListName = whiteList.find((currentWhiteListName) => { - return currentWhiteListName === fileName; - }); - - console.log('error'); - if (filenameMatch && !isWhiteListName) { - this.addFailure(this.createFailure(node.getStart(), node.getWidth(), Rule.FAILURE_STRING + fileName)); - super.visitSourceFile(node); - } - - if (fileName.indexOf('-') >= 0) { - this.addFailure(this.createFailure(node.getStart(), node.getWidth(), Rule.FAILURE_STRING_UNDERSCORE + fileName)); - super.visitSourceFile(node); - } - - if (fileName[0] == fileName[0].toUpperCase()) { - this.addFailure(this.createFailure(node.getStart(), node.getWidth(), Rule.FAILURE_STRING_UPPERCASE + fileName)); - super.visitSourceFile(node); - } - } - - private getFilename(): string { - const filename = this.getSourceFile().fileName; - const lastSlash = filename.lastIndexOf('/'); - if (lastSlash > -1) { - return filename.substring(lastSlash + 1); - } - return filename; - } -} diff --git a/tools/tslint-rules/adfPrefixNameRule.js b/tools/tslint-rules/adfPrefixNameRule.js deleted file mode 100644 index ef1f438a24..0000000000 --- a/tools/tslint-rules/adfPrefixNameRule.js +++ /dev/null @@ -1,34 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const Lint = require("tslint"); -const sprintf_js_1 = require("sprintf-js"); -const ngWalker_1 = require("codelyzer/angular/ngWalker"); -class Rule extends Lint.Rules.AbstractRule { - apply(sourceFile) { - return this.applyWithWalker(new ADFOutputPrefixNameRule(sourceFile, this.getOptions())); - } -} -Rule.metadata = { - ruleName: 'adf-prefix-name', - type: 'maintainability', - description: `Name events without the prefix on`, - descriptionDetails: `See more at https://angular.io/guide/styleguide#dont-prefix-output-properties`, - rationale: `Angular allows for an alternative syntax on-*. If the event itself was prefixed with on this would result in an on-onEvent binding expression`, - options: null, - optionsDescription: `Not configurable.`, - typescriptOnly: true, -}; -Rule.FAILURE_STRING = 'In the class "%s", the output ' + - 'property "%s" should not be prefixed with on'; -exports.Rule = Rule; -class ADFOutputPrefixNameRule extends ngWalker_1.NgWalker { - visitNgOutput(property, output, args) { - let className = property.parent.name.text; - let memberName = property.name.text; - if (memberName && memberName.startsWith('on')) { - let failureConfig = [className, memberName]; - failureConfig.unshift(Rule.FAILURE_STRING); - this.addFailure(this.createFailure(property.getStart(), property.getWidth(), sprintf_js_1.sprintf.apply(this, failureConfig))); - } - } -} diff --git a/tools/tslint-rules/adfPrefixNameRule.ts b/tools/tslint-rules/adfPrefixNameRule.ts deleted file mode 100644 index 77f9a2fc3a..0000000000 --- a/tools/tslint-rules/adfPrefixNameRule.ts +++ /dev/null @@ -1,60 +0,0 @@ -/*! - * @license - * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as Lint from 'tslint'; -import * as ts from 'typescript'; -import { sprintf } from 'sprintf-js'; -import { NgWalker } from 'codelyzer/angular/ngWalker'; - -export class Rule extends Lint.Rules.AbstractRule { - public static metadata: Lint.IRuleMetadata = { - ruleName: 'adf-prefix-name', - type: 'maintainability', - description: `Name events without the prefix on`, - descriptionDetails: `See more at https://angular.io/guide/styleguide#dont-prefix-output-properties`, - rationale: `Angular allows for an alternative syntax on-*. If the event itself was prefixed with on this would result in an on-onEvent binding expression`, - options: null, - optionsDescription: `Not configurable.`, - typescriptOnly: true - }; - - static FAILURE_STRING: string = 'In the class "%s", the output ' + - 'property "%s" should not be prefixed with on'; - - public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] { - return this.applyWithWalker( - new ADFOutputPrefixNameRule(sourceFile, - this.getOptions())); - } -} - -class ADFOutputPrefixNameRule extends NgWalker { - visitNgOutput(property: ts.PropertyDeclaration, output: ts.Decorator, args: string[]) { - const className = (property).parent.name.text; - const memberName = (property.name).text; - - if (memberName && memberName.startsWith('on')) { - const failureConfig: string[] = [className, memberName]; - failureConfig.unshift(Rule.FAILURE_STRING); - this.addFailure( - this.createFailure( - property.getStart(), - property.getWidth(), - sprintf.apply(this, failureConfig))); - } - } -} diff --git a/tools/tslint-rules/index.js b/tools/tslint-rules/index.js deleted file mode 100644 index 2b3de2cfb1..0000000000 --- a/tools/tslint-rules/index.js +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -var adfClassNameRule_1 = require("./adfClassNameRule"); -exports.ADFClassNameRule = adfClassNameRule_1.Rule; -var adfFileNameRule_1 = require("./adfFileNameRule"); -exports.ADFComponentSelectorRule = adfFileNameRule_1.Rule; -var adfPrefixNameRule_1 = require("./adfPrefixNameRule"); -exports.ADFOutputPrefixNameRule = adfPrefixNameRule_1.Rule; -exports.rulesDirectory = '.'; diff --git a/tools/tslint-rules/index.ts b/tools/tslint-rules/index.ts deleted file mode 100644 index bac82f93a8..0000000000 --- a/tools/tslint-rules/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -/*! - * @license - * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -export { Rule as ADFClassNameRule } from './adfClassNameRule'; -export { Rule as ADFComponentSelectorRule } from './adfFileNameRule'; -export { Rule as ADFOutputPrefixNameRule } from './adfPrefixNameRule'; - -export const rulesDirectory = '.'; diff --git a/tools/tslint-rules/package-lock.json b/tools/tslint-rules/package-lock.json deleted file mode 100644 index 72121e854b..0000000000 --- a/tools/tslint-rules/package-lock.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "name": "adf-tslint-rules", - "version": "0.0.7", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "app-root-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", - "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=" - }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", - "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" - } - }, - "cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", - "requires": { - "through": "X.X.X" - } - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=" - }, - "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=" - }, - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" - }, - "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=" - }, - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" - } - }, - "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" - }, - "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", - "requires": { - "jsesc": "~0.5.0" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - }, - "semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", - "requires": { - "semver": "^5.3.0" - } - }, - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "typescript": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.0.tgz", - "integrity": "sha1-rvWo1AS+ujatM5q/B53d3/+6ht0=", - "dev": true - } - } -} diff --git a/tools/tslint-rules/package.json b/tools/tslint-rules/package.json deleted file mode 100644 index 51da3c25c7..0000000000 --- a/tools/tslint-rules/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "adf-tslint-rules", - "description": "Custom Rules for the ADF project", - "version": "0.0.7", - "author": "Hyland Software, Inc. and its affiliates", - "scripts": { - "build": "tsc", - "tscv": "tsc --version", - "tsc": "tsc", - "tsc:watch": "tsc --w" - }, - "contributors": [ - { - "name": "Eugenio Romano", - "email": "eugenio.romano@alfresco.com" - } - ], - "devDependencies": { - "typescript": "2.4.0" - }, - "peerDependencies": { - "tslint": ">=5.0.0", - "codelyzer": ">=4.5.0" - }, - "dependencies": { - "app-root-path": "2.0.1", - "css-selector-tokenizer": "0.7.0", - "cssauron": "1.4.0", - "semver-dsl": "1.0.1", - "source-map": "0.5.6", - "sprintf-js": "1.0.3" - }, - "license": "Apache-2.0" -} diff --git a/tools/tslint-rules/tsconfig.json b/tools/tslint-rules/tsconfig.json deleted file mode 100644 index d30452c301..0000000000 --- a/tools/tslint-rules/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "compilerOptions": { - "experimentalDecorators": true, - "target": "es6", - "module": "commonjs", - "declaration": false, - "noImplicitAny": false, - "removeComments": true, - "lib": ["es6", "es2015", "dom"], - "noLib": false, - "typeRoots": [ - "./node_modules/@types", - "./node_modules" - ], - "types": [ - "mocha", - "chai", - "node", - "sprintf-js" - ] - } -} diff --git a/tools/tslint-rules/tslint.json b/tools/tslint-rules/tslint.json deleted file mode 100644 index 73a54c9c7d..0000000000 --- a/tools/tslint-rules/tslint.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "adf-file-naming": true - } -}