[ADF-1012] Hide delete checklist button when the checklist is in readonly mode (#2325)

* disable button to delete when the checklist is in readonly mode

* style issues

* fix test
This commit is contained in:
Eugenio Romano 2017-09-12 14:39:33 +01:00 committed by Popovics András
parent 1f4b1231c6
commit a516d72304
10 changed files with 132 additions and 46 deletions

View File

@ -24,7 +24,7 @@ module.exports = {
"ng2-alfresco-datatable": helpers.root('../ng2-alfresco-datatable/index.ts'), "ng2-alfresco-datatable": helpers.root('../ng2-alfresco-datatable/index.ts'),
"ng2-activiti-form": helpers.root('../ng2-activiti-form/index.ts') "ng2-activiti-form": helpers.root('../ng2-activiti-form/index.ts')
}, },
extensions: ['.ts', '.js'], extensions: ['.ts', '.js', '.scss'],
symlinks: false, symlinks: false,
modules: [helpers.root('../../ng2-components'), helpers.root('node_modules')] modules: [helpers.root('../../ng2-components'), helpers.root('node_modules')]
}, },

View File

@ -4,16 +4,5 @@ const commonConfig = require('./webpack.common.js');
module.exports = webpackMerge(commonConfig, { module.exports = webpackMerge(commonConfig, {
devtool: 'inline-source-map', devtool: 'inline-source-map'
resolve: {
alias: {
"ng2-alfresco-form": helpers.root('../ng2-alfresco-form/index.ts'),
"ng2-alfresco-core": helpers.root('../ng2-alfresco-core/index.ts'),
"ng2-alfresco-datatable": helpers.root('../ng2-alfresco-datatable/index.ts')
},
extensions: ['.ts', '.js'],
symlinks: false,
modules: [helpers.root('../../ng2-components'), helpers.root('node_modules')]
}
}); });

View File

@ -17,14 +17,14 @@
import { DatePipe } from '@angular/common'; import { DatePipe } from '@angular/common';
import { ModuleWithProviders, NgModule } from '@angular/core'; import { ModuleWithProviders, NgModule } from '@angular/core';
import { MdAutocompleteModule, MdButtonModule, MdCardModule, MdDatepickerModule, MdGridListModule,
MdIconModule, MdInputModule, MdNativeDateModule, MdProgressSpinnerModule, MdRippleModule, MdSelectModule } from '@angular/material';
import { ActivitiFormModule } from 'ng2-activiti-form'; import { ActivitiFormModule } from 'ng2-activiti-form';
import { CoreModule, TRANSLATION_PROVIDER } from 'ng2-alfresco-core'; import { CoreModule, TRANSLATION_PROVIDER } from 'ng2-alfresco-core';
import { DataTableModule } from 'ng2-alfresco-datatable'; import { DataTableModule } from 'ng2-alfresco-datatable';
import { PeopleService } from './src/services/people.service'; import { PeopleService } from './src/services/people.service';
import { ProcessUploadService } from './src/services/process-upload.service'; import { ProcessUploadService } from './src/services/process-upload.service';
import { TaskListService } from './src/services/tasklist.service'; import { TaskListService } from './src/services/tasklist.service';
import { MaterialModule } from './src/components/material.module';
import { AppsListComponent } from './src/components/apps-list.component'; import { AppsListComponent } from './src/components/apps-list.component';
import { ChecklistComponent } from './src/components/checklist.component'; import { ChecklistComponent } from './src/components/checklist.component';
@ -156,17 +156,7 @@ export const ACTIVITI_TASKLIST_PROVIDERS: any[] = [
CoreModule, CoreModule,
DataTableModule, DataTableModule,
ActivitiFormModule, ActivitiFormModule,
MdIconModule, MaterialModule
MdButtonModule,
MdInputModule,
MdCardModule,
MdProgressSpinnerModule,
MdDatepickerModule,
MdNativeDateModule,
MdSelectModule,
MdAutocompleteModule,
MdGridListModule,
MdRippleModule
], ],
declarations: [ declarations: [
...ACTIVITI_TASKLIST_DIRECTIVES ...ACTIVITI_TASKLIST_DIRECTIVES
@ -185,8 +175,7 @@ export const ACTIVITI_TASKLIST_PROVIDERS: any[] = [
], ],
exports: [ exports: [
...ACTIVITI_TASKLIST_DIRECTIVES, ...ACTIVITI_TASKLIST_DIRECTIVES,
MdIconModule, MaterialModule
MdButtonModule
] ]
}) })
export class ActivitiTaskListModule { export class ActivitiTaskListModule {

View File

@ -1,20 +1,19 @@
<span class="activiti-label mdl-badge" id="checklist-label" <span class="activiti-label mdl-badge" id="checklist-label"
[attr.data-badge]="checklist?.length">{{ 'TASK_DETAILS.LABELS.CHECKLIST' | translate }}</span> [attr.data-badge]="checklist?.length">{{ 'TASK_DETAILS.LABELS.CHECKLIST' | translate }}</span>
<div *ngIf="!readOnly" id="addChecklist" (click)="showDialog()" id="add-checklist" class="icon material-icons">add</div> <div *ngIf="!readOnly" id="add-checklist" (click)="showDialog()" class="icon material-icons">add</div>
<div *ngIf="!readOnly" class="mdl-tooltip" for="add-checklist"> <div *ngIf="!readOnly" class="mdl-tooltip" for="add-checklist">
Add a checklist Add a checklist
</div> </div>
<div class="menu-container" *ngIf="checklist?.length > 0"> <div class="adf-checklist-menu-container" *ngIf="checklist?.length > 0">
<ul class='mdl-list'> <md-chip-list class="mat-chip-list-stacked">
<li class="mdl-list__item" *ngFor="let check of checklist"> <md-chip id="check-{{check.id}}" *ngFor="let check of checklist">
<span class="mdl-chip mdl-chip--deletable" id="check-{{check.id}}"> <span>{{check.name}}</span>
<span class="mdl-chip__text">{{check.name}}</span> <button type="button" class="adf-checklist-cancel-button" (click)="delete(check.id)">
<button type="button" class="mdl-chip__action" (click)="delete(check.id)"> <md-icon *ngIf="!readOnly" id="remove-{{check.id}}" mdChipRemove >cancel</md-icon>
<i id="remove-{{check.id}}" class="material-icons">cancel</i>
</button> </button>
</span> </md-chip>
</li> </md-chip-list>
</ul>
</div> </div>
<div *ngIf="checklist?.length === 0" id="checklist-none-message"> <div *ngIf="checklist?.length === 0" id="checklist-none-message">
{{ 'TASK_DETAILS.CHECKLIST.NONE' | translate }} {{ 'TASK_DETAILS.CHECKLIST.NONE' | translate }}

View File

@ -21,3 +21,12 @@
.mat-input-container { .mat-input-container {
width: 100%; width: 100%;
} }
.adf-checklist-cancel-button {
margin: -3px;
float: right;
}
.adf-checklist-menu-container{
margin-top: 10px;
}

View File

@ -23,6 +23,7 @@ import { TranslationMock } from '../assets/translation.service.mock';
import { TaskDetailsModel } from '../models/task-details.model'; import { TaskDetailsModel } from '../models/task-details.model';
import { TaskListService } from '../services/tasklist.service'; import { TaskListService } from '../services/tasklist.service';
import { ChecklistComponent } from './checklist.component'; import { ChecklistComponent } from './checklist.component';
import { MaterialModule } from './material.module';
declare let jasmine: any; declare let jasmine: any;
@ -41,7 +42,8 @@ describe('ChecklistComponent', () => {
beforeEach(async(() => { beforeEach(async(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [ imports: [
CoreModule.forRoot() CoreModule.forRoot(),
MaterialModule
], ],
declarations: [ declarations: [
ChecklistComponent ChecklistComponent
@ -60,7 +62,7 @@ describe('ChecklistComponent', () => {
}); });
})); }));
it('should show people component title', () => { it('should show checklist component title', () => {
expect(element.querySelector('#checklist-label')).toBeDefined(); expect(element.querySelector('#checklist-label')).toBeDefined();
expect(element.querySelector('#checklist-label')).not.toBeNull(); expect(element.querySelector('#checklist-label')).not.toBeNull();
}); });
@ -70,11 +72,54 @@ describe('ChecklistComponent', () => {
expect(element.querySelector('#checklist-none-message').textContent).toContain('TASK_DETAILS.CHECKLIST.NONE'); expect(element.querySelector('#checklist-none-message').textContent).toContain('TASK_DETAILS.CHECKLIST.NONE');
}); });
describe('when interact with people dialog', () => { describe('when is readonly mode', () => {
beforeEach(() => {
checklistComponent.taskId = 'fake-task-id';
checklistComponent.checklist.push(fakeTaskDetail);
checklistComponent.readOnly = true;
fixture.detectChanges();
showChecklistDialog = <HTMLElement> element.querySelector('#add-checklist');
closeCheckDialogButton = <HTMLElement> element.querySelector('#close-check-dialog');
});
it('should NOT show add checklist button', () => {
expect(element.querySelector('#add-checklist')).toBeNull();
});
it('should NOT show cancel checklist button', () => {
expect(element.querySelector('#remove-fake-check-id')).toBeNull();
});
});
describe('when is not in readonly mode', () => {
beforeEach(() => {
checklistComponent.taskId = 'fake-task-id';
checklistComponent.readOnly = false;
checklistComponent.checklist.push(fakeTaskDetail);
fixture.detectChanges();
showChecklistDialog = <HTMLElement> element.querySelector('#add-checklist');
closeCheckDialogButton = <HTMLElement> element.querySelector('#close-check-dialog');
});
it('should show add checklist button', () => {
expect(element.querySelector('#add-checklist')).not.toBeNull();
});
it('should show cancel checklist button', () => {
expect(element.querySelector('#remove-fake-check-id')).not.toBeNull();
});
});
describe('when interact with checklist dialog', () => {
beforeEach(() => { beforeEach(() => {
checklistComponent.taskId = 'fake-task-id'; checklistComponent.taskId = 'fake-task-id';
checklistComponent.checklist = []; checklistComponent.checklist = [];
fixture.detectChanges(); fixture.detectChanges();
showChecklistDialog = <HTMLElement> element.querySelector('#add-checklist'); showChecklistDialog = <HTMLElement> element.querySelector('#add-checklist');
closeCheckDialogButton = <HTMLElement> element.querySelector('#close-check-dialog'); closeCheckDialogButton = <HTMLElement> element.querySelector('#close-check-dialog');

View File

@ -25,7 +25,7 @@ declare let dialogPolyfill: any;
@Component({ @Component({
selector: 'adf-checklist, activiti-checklist', selector: 'adf-checklist, activiti-checklist',
templateUrl: './checklist.component.html', templateUrl: './checklist.component.html',
styleUrls: ['./checklist.component.css'], styleUrls: ['./checklist.component.scss'],
providers: [TaskListService] providers: [TaskListService]
}) })
export class ChecklistComponent implements OnInit, OnChanges { export class ChecklistComponent implements OnInit, OnChanges {

View File

@ -0,0 +1,56 @@
/*!
* @license
* Copyright 2016 Alfresco Software, Ltd.
*
* 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 { NgModule } from '@angular/core';
import {
MdAutocompleteModule,
MdButtonModule,
MdCardModule,
MdChipsModule,
MdDatepickerModule,
MdGridListModule,
MdIconModule,
MdInputModule,
MdNativeDateModule,
MdProgressSpinnerModule,
MdRippleModule,
MdSelectModule
} from '@angular/material';
export function modules() {
return [
MdIconModule,
MdButtonModule,
MdInputModule,
MdCardModule,
MdProgressSpinnerModule,
MdDatepickerModule,
MdNativeDateModule,
MdSelectModule,
MdAutocompleteModule,
MdGridListModule,
MdRippleModule,
MdChipsModule
];
}
@NgModule({
imports: modules(),
exports: modules()
})
export class MaterialModule {
}

View File

@ -117,7 +117,6 @@ export class TaskListComponent implements OnChanges, OnInit, AfterContentInit {
} }
} }
ngOnInit() { ngOnInit() {
if (this.data === undefined) { if (this.data === undefined) {
this.data = new ObjectDataTableAdapter(); this.data = new ObjectDataTableAdapter();

View File

@ -2,7 +2,7 @@
<md-chip class="adf-tag-chips adf-primary-background-color" *ngFor="let currentEntry of tagsEntries; let idx = index"> <md-chip class="adf-tag-chips adf-primary-background-color" *ngFor="let currentEntry of tagsEntries; let idx = index">
<span id="tag_name_{{idx}}">{{currentEntry.entry.tag}}</span> <span id="tag_name_{{idx}}">{{currentEntry.entry.tag}}</span>
<button class="adf-tag-chips-delete" id="tag_delete_{{idx}}" type="button" (click)="removeTag(currentEntry.entry.id)"> <button class="adf-tag-chips-delete" id="tag_delete_{{idx}}" type="button" (click)="removeTag(currentEntry.entry.id)">
<md-icon class="adf-tag-chips-delete-icon adf-primary-contrast-text-color">cancel</md-icon> <md-icon class="adf-tag-chips-delete-icon adf-primary-contrast-text-color" mdChipRemove>cancel</md-icon>
</button> </button>
</md-chip> </md-chip>
</md-chip-list> </md-chip-list>