CC License Submission Step - feedback

This commit is contained in:
Samuel
2020-06-18 15:20:55 +02:00
parent 470c21d8d8
commit e963aa9af0
17 changed files with 115 additions and 108 deletions

View File

@@ -145,10 +145,10 @@ import { Version } from './shared/version.model';
import { VersionHistory } from './shared/version-history.model';
import { WorkflowActionDataService } from './data/workflow-action-data.service';
import { WorkflowAction } from './tasks/models/workflow-action-object.model';
import { SubmissionCcLicenseDataService } from './data/submission-cc-license-data.service';
import { SubmissionCcLicence } from './shared/submission-cc-license.model';
import { SubmissionCcLicenceUrl } from './shared/submission-cc-license-url.model';
import { SubmissionCcLicenseUrlDataService } from './data/submission-cc-license-url-data.service';
import { SubmissionCcLicenseDataService } from './submission/submission-cc-license-data.service';
import { SubmissionCcLicence } from './submission/models/submission-cc-license.model';
import { SubmissionCcLicenceUrl } from './submission/models/submission-cc-license-url.model';
import { SubmissionCcLicenseUrlDataService } from './submission/submission-cc-license-url-data.service';
/**
* When not in production, endpoint responses can be mocked for testing purposes

View File

@@ -1,4 +1,4 @@
import { ResourceType } from './resource-type';
import { ResourceType } from '../../shared/resource-type';
/**
* The resource type for License

View File

@@ -1,4 +1,4 @@
import { ResourceType } from './resource-type';
import { ResourceType } from '../../shared/resource-type';
/**
* The resource type for License

View File

@@ -1,8 +1,8 @@
import { autoserialize, inheritSerialization } from 'cerialize';
import { typedObject } from '../cache/builders/build-decorators';
import { excludeFromEquals } from '../utilities/equals.decorators';
import { ResourceType } from './resource-type';
import { HALResource } from './hal-resource.model';
import { typedObject } from '../../cache/builders/build-decorators';
import { excludeFromEquals } from '../../utilities/equals.decorators';
import { ResourceType } from '../../shared/resource-type';
import { HALResource } from '../../shared/hal-resource.model';
import { SUBMISSION_CC_LICENSE_URL } from './submission-cc-licence-link.resource-type';
@typedObject

View File

@@ -1,8 +1,8 @@
import { autoserialize, inheritSerialization } from 'cerialize';
import { typedObject } from '../cache/builders/build-decorators';
import { excludeFromEquals } from '../utilities/equals.decorators';
import { ResourceType } from './resource-type';
import { HALResource } from './hal-resource.model';
import { typedObject } from '../../cache/builders/build-decorators';
import { excludeFromEquals } from '../../utilities/equals.decorators';
import { ResourceType } from '../../shared/resource-type';
import { HALResource } from '../../shared/hal-resource.model';
import { SUBMISSION_CC_LICENSE } from './submission-cc-licence.resource-type';
@typedObject

View File

@@ -1,4 +1,4 @@
import {Option} from '../../shared/submission-cc-license.model';
import { Option } from './submission-cc-license.model';
/**
* An interface to represent the submission's creative commons license section data.

View File

@@ -7,11 +7,11 @@ import { RemoteDataBuildService } from '../cache/builders/remote-data-build.serv
import { ObjectCacheService } from '../cache/object-cache.service';
import { CoreState } from '../core.reducers';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import { DataService } from './data.service';
import { RequestService } from './request.service';
import { SUBMISSION_CC_LICENSE } from '../shared/submission-cc-licence.resource-type';
import { Field, Option, SubmissionCcLicence } from '../shared/submission-cc-license.model';
import { DefaultChangeAnalyzer } from './default-change-analyzer.service';
import { DataService } from '../data/data.service';
import { RequestService } from '../data/request.service';
import { SUBMISSION_CC_LICENSE } from './models/submission-cc-licence.resource-type';
import { Field, Option, SubmissionCcLicence } from './models/submission-cc-license.model';
import { DefaultChangeAnalyzer } from '../data/default-change-analyzer.service';
import {
getRemoteDataPayload,
getSucceededRemoteData,

View File

@@ -7,11 +7,11 @@ import { RemoteDataBuildService } from '../cache/builders/remote-data-build.serv
import { ObjectCacheService } from '../cache/object-cache.service';
import { CoreState } from '../core.reducers';
import { HALEndpointService } from '../shared/hal-endpoint.service';
import { DataService } from './data.service';
import { RequestService } from './request.service';
import { DefaultChangeAnalyzer } from './default-change-analyzer.service';
import { SubmissionCcLicenceUrl } from '../shared/submission-cc-license-url.model';
import { SUBMISSION_CC_LICENSE_URL } from '../shared/submission-cc-licence-link.resource-type';
import { DataService } from '../data/data.service';
import { RequestService } from '../data/request.service';
import { DefaultChangeAnalyzer } from '../data/default-change-analyzer.service';
import { SubmissionCcLicenceUrl } from './models/submission-cc-license-url.model';
import { SUBMISSION_CC_LICENSE_URL } from './models/submission-cc-licence-link.resource-type';
@Injectable()
@dataService(SUBMISSION_CC_LICENSE_URL)

View File

@@ -1,44 +1,50 @@
<ds-select
[label]="'submission.sections.general.collection'"
[disabled]="(disabled$ | async) || (processingChange$ | async)"
(toggled)="toggled($event)"
(close)="onClose()">
<ng-container class="selection">
<span *ngIf="(processingChange$ | async)">
<i class='fas fa-circle-notch fa-spin'></i>
</span>
<span *ngIf="!(processingChange$ | async)">
{{ selectedCollectionName$ | async }}
</span>
</ng-container>
<ng-container class="menu">
<div class="form-group w-100 pr-2 pl-2">
<input *ngIf="searchField"
type="search"
class="form-control w-100"
(click)="$event.stopPropagation();"
placeholder="{{ 'submission.sections.general.search-collection' | translate }}"
[formControl]="searchField">
<div>
<div ngbDropdown #collectionControls="ngbDropdown" class="btn-group input-group" (openChange)="toggled($event)">
<div class="input-group-prepend">
<span id="collectionControlsMenuLabel" class="input-group-text">
{{ 'submission.sections.general.collection' | translate }}
</span>
</div>
<div class="dropdown-divider"></div>
<div class="scrollable-menu" aria-labelledby="dropdownMenuButton" (scroll)="onScroll($event)">
<button class="dropdown-item disabled" *ngIf="(searchListCollection$ | async)?.length == 0">
{{'submission.sections.general.no-collection' | translate}}
</button>
<button *ngFor="let listItem of (searchListCollection$ | async)"
class="dropdown-item collection-item"
title="{{ listItem.collection.name }}"
(click)="onSelect(listItem)">
<ul class="list-unstyled mb-0">
<li class="list-item text-truncate text-secondary" *ngFor="let item of listItem.communities">
{{ item.name}} <i class="fa fa-level-down" aria-hidden="true"></i>
</li>
<li class="list-item text-truncate text-primary font-weight-bold">{{ listItem.collection.name}}</li>
</ul>
</button>
</div>
</ng-container>
<button aria-describedby="collectionControlsMenuLabel"
id="collectionControlsMenuButton"
class="btn btn-outline-primary"
(blur)="onClose()"
(click)="onClose()"
[disabled]="(disabled$ | async) || (processingChange$ | async)"
ngbDropdownToggle>
<span *ngIf="(processingChange$ | async)"><i class='fas fa-circle-notch fa-spin'></i></span>
<span *ngIf="!(processingChange$ | async)">{{ selectedCollectionName$ | async }}</span>
</button>
</ds-select>
<div ngbDropdownMenu
class="dropdown-menu"
id="collectionControlsDropdownMenu"
aria-labelledby="collectionControlsMenuButton">
<div class="form-group w-100 pr-2 pl-2">
<input *ngIf="searchField"
type="search"
class="form-control w-100"
(click)="$event.stopPropagation();"
placeholder="{{ 'submission.sections.general.search-collection' | translate }}"
[formControl]="searchField">
</div>
<div class="dropdown-divider"></div>
<div class="scrollable-menu" aria-labelledby="dropdownMenuButton" (scroll)="onScroll($event)">
<button class="dropdown-item disabled" *ngIf="(searchListCollection$ | async)?.length == 0">
{{'submission.sections.general.no-collection' | translate}}
</button>
<button *ngFor="let listItem of (searchListCollection$ | async)"
class="dropdown-item collection-item"
title="{{ listItem.collection.name }}"
(click)="onSelect(listItem)">
<ul class="list-unstyled mb-0">
<li class="list-item text-truncate text-secondary" *ngFor="let item of listItem.communities">
{{ item.name}} <i class="fa fa-level-down" aria-hidden="true"></i>
</li>
<li class="list-item text-truncate text-primary font-weight-bold">{{ listItem.collection.name}}</li>
</ul>
</button>
</div>
</div>
</div>
</div>

View File

@@ -26,7 +26,6 @@ import { PageInfo } from '../../../core/shared/page-info.model';
import { Collection } from '../../../core/shared/collection.model';
import { createTestComponent } from '../../../shared/testing/utils.test';
import { CollectionDataService } from '../../../core/data/collection-data.service';
import { SharedModule } from '../../../shared/shared.module';
const subcommunities = [Object.assign(new Community(), {
name: 'SubCommunity 1',
@@ -224,7 +223,6 @@ describe('SubmissionFormCollectionComponent Component', () => {
FormsModule,
ReactiveFormsModule,
NgbModule,
SharedModule,
TranslateModule.forRoot()
],
declarations: [
@@ -368,8 +366,8 @@ describe('SubmissionFormCollectionComponent Component', () => {
comp.searchListCollection$ = observableOf(mockCollectionList);
fixture.detectChanges();
dropdowBtn = fixture.debugElement.query(By.css('#dsSelectMenuButton'));
dropdownMenu = fixture.debugElement.query(By.css('#dsSelectDropdownMenu'));
dropdowBtn = fixture.debugElement.query(By.css('#collectionControlsMenuButton'));
dropdownMenu = fixture.debugElement.query(By.css('#collectionControlsDropdownMenu'));
});
it('should have dropdown menu closed', () => {

View File

@@ -1,11 +1,10 @@
<div class="mb-4 ccLicense-select">
<ds-select
[disabled]="!submissionCcLicenses"
[label]="'submission.sections.ccLicense.type'">
[disabled]="!submissionCcLicenses">
<ng-container class="selection">
<span *ngIf="!submissionCcLicenses">
<i class='fas fa-circle-notch fa-spin'></i>
<ds-loading></ds-loading>
</span>
<span *ngIf="getSelectedCcLicense()">
{{ getSelectedCcLicense().name }}
@@ -92,11 +91,13 @@
</span>
</ng-container>
<ng-container class="menu">
<button *ngFor="let option of field.enums"
class="dropdown-item"
(click)="selectOption(getSelectedCcLicense(), field, option)">
{{ option.label }}
</button>
<div class="options-select-menu overflow-auto">
<button *ngFor="let option of field.enums"
class="dropdown-item"
(click)="selectOption(getSelectedCcLicense(), field, option)">
{{ option.label }}
</button>
</div>
</ng-container>
</ds-select>
@@ -120,7 +121,7 @@
<ng-container *ngIf="getCcLicenseLink$()">
<ng-container *ngVar="getCcLicenseLink$() | async as licenseLink">
<div *ngIf="!licenseLink">
<i class='fas fa-circle-notch fa-spin m-2'></i>
<ds-loading></ds-loading>
</div>
<div *ngIf="licenseLink"
class="mt-2 p-4 bg-light text-dark">

View File

@@ -0,0 +1,3 @@
.options-select-menu {
max-height: 25vh;
}

View File

@@ -1,22 +1,22 @@
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { SubmissionSectionCcLicensesComponent } from './submission-section-cc-licenses.component';
import { SUBMISSION_CC_LICENSE } from '../../core/shared/submission-cc-licence.resource-type';
import { SUBMISSION_CC_LICENSE } from '../../../core/submission/models/submission-cc-licence.resource-type';
import { of as observableOf } from 'rxjs';
import { SubmissionCcLicenseDataService } from '../../core/data/submission-cc-license-data.service';
import { SubmissionCcLicenseDataService } from '../../../core/submission/submission-cc-license-data.service';
import { DebugElement } from '@angular/core';
import { By } from '@angular/platform-browser';
import { SharedModule } from '../shared.module';
import { SectionsService } from '../../submission/sections/sections.service';
import { SectionDataObject } from '../../submission/sections/models/section-data.model';
import { SectionsType } from '../../submission/sections/sections-type';
import { RemoteData } from '../../core/data/remote-data';
import { SharedModule } from '../../../shared/shared.module';
import { SectionsService } from '../sections.service';
import { SectionDataObject } from '../models/section-data.model';
import { SectionsType } from '../sections-type';
import { RemoteData } from '../../../core/data/remote-data';
import { TranslateModule } from '@ngx-translate/core';
import { PageInfo } from '../../core/shared/page-info.model';
import { PaginatedList } from '../../core/data/paginated-list';
import { SubmissionCcLicence } from '../../core/shared/submission-cc-license.model';
import { PageInfo } from '../../../core/shared/page-info.model';
import { PaginatedList } from '../../../core/data/paginated-list';
import { SubmissionCcLicence } from '../../../core/submission/models/submission-cc-license.model';
import { cold } from 'jasmine-marbles';
import { JsonPatchOperationsBuilder } from '../../core/json-patch/builder/json-patch-operations-builder';
import { SubmissionCcLicenseUrlDataService } from '../../core/data/submission-cc-license-url-data.service';
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
import { SubmissionCcLicenseUrlDataService } from '../../../core/submission/submission-cc-license-url-data.service';
describe('SubmissionSectionCcLicensesComponent', () => {

View File

@@ -1,19 +1,19 @@
import { Component, Inject } from '@angular/core';
import { Observable, of as observableOf, Subscription } from 'rxjs';
import { Field, Option, SubmissionCcLicence } from '../../core/shared/submission-cc-license.model';
import { getRemoteDataPayload, getSucceededRemoteData } from '../../core/shared/operators';
import { Field, Option, SubmissionCcLicence } from '../../../core/submission/models/submission-cc-license.model';
import { getRemoteDataPayload, getSucceededRemoteData } from '../../../core/shared/operators';
import { distinctUntilChanged, filter, map } from 'rxjs/operators';
import { SubmissionCcLicenseDataService } from '../../core/data/submission-cc-license-data.service';
import { SubmissionCcLicenseDataService } from '../../../core/submission/submission-cc-license-data.service';
import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap';
import { renderSectionFor } from '../../submission/sections/sections-decorator';
import { SectionsType } from '../../submission/sections/sections-type';
import { SectionModelComponent } from '../../submission/sections/models/section.model';
import { SectionDataObject } from '../../submission/sections/models/section-data.model';
import { SectionsService } from '../../submission/sections/sections.service';
import { WorkspaceitemSectionCcLicenseObject } from '../../core/submission/models/workspaceitem-section-cc-license.model';
import { JsonPatchOperationPathCombiner } from '../../core/json-patch/builder/json-patch-operation-path-combiner';
import { isNotEmpty } from '../empty.util';
import { JsonPatchOperationsBuilder } from '../../core/json-patch/builder/json-patch-operations-builder';
import { renderSectionFor } from '../sections-decorator';
import { SectionsType } from '../sections-type';
import { SectionModelComponent } from '../models/section.model';
import { SectionDataObject } from '../models/section-data.model';
import { SectionsService } from '../sections.service';
import { WorkspaceitemSectionCcLicenseObject } from '../../../core/submission/models/workspaceitem-section-cc-license.model';
import { JsonPatchOperationPathCombiner } from '../../../core/json-patch/builder/json-patch-operation-path-combiner';
import { isNotEmpty } from '../../../shared/empty.util';
import { JsonPatchOperationsBuilder } from '../../../core/json-patch/builder/json-patch-operations-builder';
/**
* This component represents the submission section to select the Creative Commons license.

View File

@@ -28,8 +28,7 @@ import { SubmissionSectionUploadFileViewComponent } from './sections/upload/file
import { SubmissionSectionUploadAccessConditionsComponent } from './sections/upload/accessConditions/submission-section-upload-access-conditions.component';
import { SubmissionSubmitComponent } from './submit/submission-submit.component';
import { storeModuleConfig } from '../app.reducer';
import { CoreState } from '../core/core.reducers';
import { SubmissionSectionCcLicensesComponent } from '../shared/submission-section-cc-licenses/submission-section-cc-licenses.component';
import { SubmissionSectionCcLicensesComponent } from './sections/cc-license/submission-section-cc-licenses.component';
@NgModule({
imports: [

View File

@@ -2537,9 +2537,9 @@
"submission.sections.ccLicense.type": "License Type",
"submission.sections.ccLicense.select": "Select a license…",
"submission.sections.ccLicense.select": "Select a license type…",
"submission.sections.ccLicense.change": "Change your license…",
"submission.sections.ccLicense.change": "Change your license type…",
"submission.sections.ccLicense.none": "No licenses available",