diff --git a/package.json b/package.json index fa292de50..6411df8fc 100644 --- a/package.json +++ b/package.json @@ -42,20 +42,20 @@ "prepare": "yarn run snyk-protect" }, "dependencies": { - "@angular/animations": "~6.0.6", + "@angular/animations": "~6.1.8", "@angular/cdk": "^6.3.0", - "@angular/common": "~6.0.6", - "@angular/compiler": "~6.0.6", - "@angular/core": "~6.0.6", - "@angular/forms": "~6.0.6", - "@angular/http": "~6.0.6", + "@angular/common": "~6.1.8", + "@angular/compiler": "~6.1.8", + "@angular/core": "~6.1.8", + "@angular/forms": "~6.1.8", + "@angular/http": "~6.1.8", "@angular/material": "^6.3.0", - "@angular/platform-browser": "~6.0.6", - "@angular/platform-browser-dynamic": "~6.0.6", - "@angular/platform-server": "~6.0.6", - "@angular/router": "~6.0.6", - "@angular/upgrade": "~6.0.6", - "@hmcts/ccd-case-ui-toolkit": "1.2.5", + "@angular/platform-browser": "~6.1.8", + "@angular/platform-browser-dynamic": "~6.1.8", + "@angular/platform-server": "~6.1.8", + "@angular/router": "~6.1.8", + "@angular/upgrade": "~6.1.8", + "@hmcts/ccd-case-ui-toolkit": "1.2.13", "@hmcts/ccpay-web-component": "~1.6.1", "@nguniversal/express-engine": "^6.0.0", "@nguniversal/module-map-ngfactory-loader": "^6.0.0", @@ -75,10 +75,12 @@ "ngx-device-detector": "^1.3.0", "ngx-md": "~6.0.0", "ngx-pagination": "^3.0.3", + "node-sass": "^4.9.3", "reflect-metadata": "^0.1.12", "rx-polling": "~1.0.0", "rxjs": "^6.2.1", "rxjs-compat": "^6.0.0-rc.0", + "sass-loader": "^7.1.0", "snyk": "^1.94.0", "url": "^0.11.0", "webdriver-manager": "^12.1.0", @@ -86,9 +88,9 @@ "zone.js": "^0.8.26" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.6.8", + "@angular-devkit/build-angular": "^0.6.8", "@angular/cli": "^6.0.8", - "@angular/compiler-cli": "~6.0.6", + "@angular/compiler-cli": "~6.1.8", "@types/jasmine": "~2.8.0", "@types/jasminewd2": "^2.0.3", "@types/node": "^8.0.30", @@ -106,6 +108,7 @@ "karma-mocha-reporter": "^2.2.5", "karma-phantomjs-launcher": "^1.0.4", "karma-remap-istanbul": "0.2.1", + "karma-typescript": "^3.0.5", "lodash": "^4.16.2", "mocha": "^5.0.5", "ng2-mock-component": "^0.1.1", @@ -122,7 +125,8 @@ "ts-loader": "^4.2.0", "ts-node": "^3.3.0", "tslint": "^5.0.0", - "typescript": "2.7.2", + "typescript": "2.9.2", + "webdriver-manager": "^12.1.0", "webpack-cli": "^2.0.14" }, "snyk": true diff --git a/src/app/app.config.spec.ts b/src/app/app.config.spec.ts index f13ff3a39..d97bc38aa 100644 --- a/src/app/app.config.spec.ts +++ b/src/app/app.config.spec.ts @@ -1,8 +1,8 @@ -import { AppConfig, Config } from './app.config'; +import { AppConfig } from './app.config'; import { async, inject, TestBed } from '@angular/core/testing'; import { HttpModule, Response, ResponseOptions, XHRBackend } from '@angular/http'; import { MockBackend } from '@angular/http/testing'; -import { CaseEventData } from './shared/domain/case-event-data'; +import { Config, CaseEventData } from '@hmcts/ccd-case-ui-toolkit'; describe('AppConfig', () => { diff --git a/src/app/app.config.ts b/src/app/app.config.ts index 19d9c9582..60bfcd83b 100644 --- a/src/app/app.config.ts +++ b/src/app/app.config.ts @@ -3,15 +3,15 @@ import { Http } from '@angular/http'; import { Observable } from 'rxjs'; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/catch'; +import { CaseEventData, AbstractAppConfig, Config } from '@hmcts/ccd-case-ui-toolkit'; import { environment } from '../environments/environment'; -import { CaseEventData } from './shared/domain/case-event-data'; @Injectable() -export class AppConfig { +export class AppConfig extends AbstractAppConfig { - protected config: Config; - - constructor(private http: Http) {} + constructor(private http: Http) { + super(); + } public load(): Promise { console.log('Loading app config...'); @@ -152,30 +152,3 @@ export class AppConfig { return this.getCaseDataUrl() + `/caseworkers/:uid/jurisdictions/${jid}/case-types/${ctid}/drafts/${did}`; } } - -export class Config { - activity_batch_collection_delay_ms: number; - activity_max_request_per_batch: number; - activity_next_poll_request_ms: number; - activity_retry: number; - activity_url: string; - api_url: string; - case_data_url: string; - document_management_url: string; - login_url: string; - logout_url: string; - oauth2_client_id: string; - oauth2_token_endpoint_url: string; - pagination_page_size: number; - postcode_lookup_url: string; - print_service_url: string; - remote_document_management_url: string; - remote_print_service_url: string; - smart_survey_url: string; - payments_url: string; - unsupported_browser_url: string; - chrome_min_required_version: number; - ie_min_required_version: number; - edge_min_required_version: number; - firefox_min_required_version: number; -} diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 1eed06137..dc01a3396 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -17,6 +17,7 @@ import { SharedModule } from './shared/shared.module'; import { isPlatformBrowser } from '@angular/common'; import { OAuth2RedirectModule } from './oauth2/oauth2-redirect.module'; import { AppConfigGuard } from './app.config.guard'; +import { AbstractAppConfig } from '@hmcts/ccd-case-ui-toolkit'; @NgModule({ imports: [ @@ -39,6 +40,10 @@ import { AppConfigGuard } from './app.config.guard'; providers: [ AppConfig, AppConfigGuard, + { + provide: AbstractAppConfig, + useExisting: AppConfig + } ], bootstrap: [AppComponent] }) diff --git a/src/app/app.server.config.ts b/src/app/app.server.config.ts index 69cbbffad..ecad64777 100644 --- a/src/app/app.server.config.ts +++ b/src/app/app.server.config.ts @@ -1,4 +1,5 @@ -import { AppConfig, Config } from './app.config'; +import { AppConfig } from './app.config'; +import { Config } from '@hmcts/ccd-case-ui-toolkit'; export class AppServerConfig extends AppConfig { constructor(config: Config) { diff --git a/src/app/cases/case.resolver.spec.ts b/src/app/cases/case.resolver.spec.ts index c5473e2fa..e7aa7800a 100644 --- a/src/app/cases/case.resolver.spec.ts +++ b/src/app/cases/case.resolver.spec.ts @@ -1,5 +1,5 @@ import { CaseResolver } from './case.resolver'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { CaseView } from '../core/cases/case-view.model'; import { AlertService } from '../core/alert/alert.service'; import { DraftService } from '../core/draft/draft.service'; diff --git a/src/app/cases/case.resolver.ts b/src/app/cases/case.resolver.ts index a199917ba..60a5b7e21 100644 --- a/src/app/cases/case.resolver.ts +++ b/src/app/cases/case.resolver.ts @@ -1,13 +1,13 @@ import { CaseView } from '../core/cases/case-view.model'; import { ActivatedRouteSnapshot, ParamMap, Resolve, Router } from '@angular/router'; import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { CasesService } from '../core/cases/cases.service'; import { Response } from '@angular/http'; import { AlertService } from '../core/alert/alert.service'; import 'rxjs/add/operator/catch'; import { DraftService } from '../core/draft/draft.service'; -import { Draft } from '../shared/domain/draft'; +import { Draft } from '@hmcts/ccd-case-ui-toolkit'; @Injectable() export class CaseResolver implements Resolve { diff --git a/src/app/cases/cases.module.ts b/src/app/cases/cases.module.ts index 3ad944ab5..1391216b8 100644 --- a/src/app/cases/cases.module.ts +++ b/src/app/cases/cases.module.ts @@ -2,15 +2,15 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RouterModule } from '@angular/router'; import { SharedModule } from '../shared/shared.module'; -import { CaseReferencePipe } from '../shared/utils/case-reference.pipe'; import { CaseResolver } from './case.resolver'; import { CaseViewerComponent } from './viewer/case-viewer.component'; -import { PaletteModule } from '../shared/palette/palette.module'; +import { PaletteModule, PaletteUtilsModule, ConditionalShowModule, MarkdownModule, + LabelSubstitutionService, RemoveDialogComponent, CaseReferencePipe, LabelSubstitutorModule, + FieldsPurger } from '@hmcts/ccd-case-ui-toolkit'; import { EventLogModule } from '../shared/event-log/event-log.module'; import { EventTriggerResolver } from './event-trigger/event-trigger.resolver'; import { CaseEventTriggerComponent } from './event-trigger/case-event-trigger.component'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { PaletteUtilsModule } from '../shared/palette/utils/utils.module'; import { CaseCreatorComponent } from './creator/case-creator.component'; import { CreateCaseFiltersComponent } from './creator/filters/create-case-filters.component'; import { CasePrinterComponent } from './printer/case-printer.component'; @@ -22,17 +22,11 @@ import { CallbackErrorsComponent } from '../shared/error/callback-errors.compone import { CaseUIToolkitModule } from '@hmcts/ccd-case-ui-toolkit'; import { CaseEditPageComponent } from '../shared/case-editor/case-edit-page.component'; import { CaseEditSubmitComponent } from '../shared/case-editor/case-edit-submit.component'; -import { ConditionalShowModule } from '../shared/conditional-show/conditional-show.module'; import { CaseEditFormComponent } from '../shared/case-editor/case-edit-form.component'; -import { MarkdownModule } from '../shared/markdown/markdown.module'; -import { LabelSubstitutionService } from '../shared/case-editor/label-substitution.service'; -import { LabelSubstitutorModule } from '../shared/substitutor/label-substitutor.module'; import { CaseEditConfirmComponent } from '../shared/case-editor/case-edit-confirm.component'; import { PrintUrlPipe } from './printer/print-url.pipe'; import { MatDialogModule } from '@angular/material'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { RemoveDialogComponent } from '../shared/remove-dialog/remove-dialog.component'; -import { FieldsPurger } from '../shared/utils/fields.purger'; import { PageValidationService } from '../shared/case-editor/page-validation.service'; @NgModule({ diff --git a/src/app/cases/creator/case-creator-submit.component.spec.ts b/src/app/cases/creator/case-creator-submit.component.spec.ts index daba55132..e7ecab522 100644 --- a/src/app/cases/creator/case-creator-submit.component.spec.ts +++ b/src/app/cases/creator/case-creator-submit.component.spec.ts @@ -1,24 +1,17 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { Component, DebugElement, EventEmitter, Input, Output } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; import { ReactiveFormsModule } from '@angular/forms'; import { MockComponent } from 'ng2-mock-component'; import { ActivatedRoute, Params, Router } from '@angular/router'; import { CasesService } from '../../core/cases/cases.service'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { AlertService } from '../../core/alert/alert.service'; -import { HttpError } from '../../core/http/http-error.model'; -import { FormValueService } from '../../core/form/form-value.service'; -import { CaseReferencePipe } from '../../shared/utils/case-reference.pipe'; -import { FormErrorService } from '../../core/form/form-error.service'; import { CaseCreatorSubmitComponent } from './case-creator-submit.component'; -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; import { CaseView } from '../../core/cases/case-view.model'; -import { CaseDetails } from '../../shared/domain/case-details'; -import { CaseEventData } from '../../shared/domain/case-event-data'; -import { createCaseEventTrigger } from '../../fixture/shared.fixture' -import { Draft } from '../../shared/domain/draft'; import { DraftService } from '../../core/draft/draft.service'; import createSpyObj = jasmine.createSpyObj; +import { HttpError, Draft, DRAFT_PREFIX, createCaseEventTrigger, CaseEventData, CaseDetails, CaseEventTrigger, + FormErrorService, CaseReferencePipe, FormValueService } from '@hmcts/ccd-case-ui-toolkit'; import { CaseEditPageComponent } from '../../shared/case-editor/case-edit-page.component'; @Component({ @@ -128,14 +121,6 @@ describe('CaseCreatorSubmitComponent', () => { ignore_warning: false }; - const DRAFT: Draft = { - 'id': '1234', - 'document': CREATED_CASE, - 'type': 'dummy', - 'created': 'sometime', - 'updated': 'another time' - }; - let mockRoute: any = { snapshot: { data: { @@ -160,7 +145,7 @@ describe('CaseCreatorSubmitComponent', () => { casesService = createSpyObj('casesService', ['createCase', 'validateCase']); casesService.createCase.and.returnValue(Observable.of(CASE_DETAILS)); draftService = createSpyObj('draftService', ['createOrUpdateDraft']); - draftService.createOrUpdateDraft.and.returnValue(Observable.of(DRAFT)); + draftService.createOrUpdateDraft.and.returnValue(Observable.of(DRAFT_PREFIX)); casesReferencePipe = createSpyObj('caseReference', ['transform']); alertService = createSpyObj('alertService', ['success', 'warning', 'setPreserveAlerts']); @@ -229,10 +214,10 @@ describe('CaseCreatorSubmitComponent', () => { it('should update draft when saveDraft called with sanitised data for second time', () => { const DRAFT_ID = '12345'; - component.eventTrigger.case_id = Draft.DRAFT_PREFIX + DRAFT_ID; // Set behaviour to draft has been saved before + component.eventTrigger.case_id = DRAFT_PREFIX + DRAFT_ID; // Set behaviour to draft has been saved before component.saveDraft()(SANITISED_EDIT_FORM); - expect(draftService.createOrUpdateDraft).toHaveBeenCalledWith(JID, CTID, Draft.DRAFT_PREFIX + DRAFT_ID, SANITISED_EDIT_FORM); + expect(draftService.createOrUpdateDraft).toHaveBeenCalledWith(JID, CTID, DRAFT_PREFIX + DRAFT_ID, SANITISED_EDIT_FORM); }); it('should navigate to case view upon successful case creation', () => { diff --git a/src/app/cases/creator/case-creator-submit.component.ts b/src/app/cases/creator/case-creator-submit.component.ts index 3553e447e..c90c1f9d9 100644 --- a/src/app/cases/creator/case-creator-submit.component.ts +++ b/src/app/cases/creator/case-creator-submit.component.ts @@ -1,14 +1,11 @@ import { Component, OnInit } from '@angular/core'; -import { CaseReferencePipe } from '../../shared/utils/case-reference.pipe'; -import { ActivatedRoute, Params, Router, NavigationEnd, RouterEvent } from '@angular/router'; +import { ActivatedRoute, Params, Router } from '@angular/router'; import { CasesService } from '../../core/cases/cases.service'; import { AlertService } from '../../core/alert/alert.service'; -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; -import { Observable } from 'rxjs/Observable'; -import { CaseEventData } from '../../shared/domain/case-event-data'; +import { CaseEventTrigger, CaseEventData, Draft, CaseReferencePipe } from '@hmcts/ccd-case-ui-toolkit'; +import { Observable } from 'rxjs'; import { EventStatusService } from '../../core/cases/event-status.service'; import { DraftService } from '../../core/draft/draft.service'; -import { Draft } from '../../shared/domain/draft'; import { CaseEditPageComponent } from '../../shared/case-editor/case-edit-page.component'; @Component({ @@ -17,7 +14,6 @@ import { CaseEditPageComponent } from '../../shared/case-editor/case-edit-page.c }) export class CaseCreatorSubmitComponent implements OnInit { - public static readonly ORIGIN_QUERY_PARAM = 'origin'; eventTrigger: CaseEventTrigger; jurisdictionId: string; diff --git a/src/app/cases/creator/create-case-event-trigger.resolver.spec.ts b/src/app/cases/creator/create-case-event-trigger.resolver.spec.ts index 928b939f1..60a6b9122 100644 --- a/src/app/cases/creator/create-case-event-trigger.resolver.spec.ts +++ b/src/app/cases/creator/create-case-event-trigger.resolver.spec.ts @@ -1,10 +1,7 @@ -import { Observable } from 'rxjs/Observable'; -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; -import { HttpError } from '../../core/http/http-error.model'; +import { Observable } from 'rxjs'; import { CreateCaseEventTriggerResolver } from './create-case-event-trigger.resolver'; import createSpyObj = jasmine.createSpyObj; -import { createCaseEventTrigger } from '../../fixture/shared.fixture' -import { Draft } from '../../shared/domain/draft'; +import { DRAFT_PREFIX, DRAFT_QUERY_PARAM, createCaseEventTrigger, HttpError, CaseEventTrigger } from '@hmcts/ccd-case-ui-toolkit'; describe('CreateCaseFieldsResolver', () => { @@ -18,7 +15,7 @@ describe('CreateCaseFieldsResolver', () => { const EVENT_TRIGGER_ID = 'enterCaseIntoLegacy'; const EVENT_TRIGGER: CaseEventTrigger = createCaseEventTrigger(EVENT_TRIGGER_ID, 'Into legacy', 'caseId', true, []); - const DRAFT_ID = Draft.DRAFT_PREFIX + '12345'; + const DRAFT_ID = DRAFT_PREFIX + '12345'; const EVENT_TRIGGER_OBS: Observable = Observable.of(EVENT_TRIGGER); const ERROR: HttpError = { timestamp: '', @@ -81,7 +78,7 @@ describe('CreateCaseFieldsResolver', () => { expect(route.paramMap.get).toHaveBeenCalledWith(PARAM_CASE_TYPE_ID); expect(route.paramMap.get).toHaveBeenCalledWith(PARAM_EVENT_ID); expect(route.queryParamMap.get).toHaveBeenCalledWith(QUERY_PARAM_IGNORE_WARNINGS); - expect(route.queryParamMap.get).toHaveBeenCalledWith(Draft.DRAFT_QUERY_PARAM); + expect(route.queryParamMap.get).toHaveBeenCalledWith(DRAFT_QUERY_PARAM); expect(route.paramMap.get).toHaveBeenCalledTimes(3); expect(route.queryParamMap.get).toHaveBeenCalledTimes(2); expect(createCaseFieldsResolver['cachedEventTrigger']).toBe(EVENT_TRIGGER); @@ -135,7 +132,7 @@ describe('CreateCaseFieldsResolver', () => { switch (key) { case QUERY_PARAM_IGNORE_WARNINGS: return IGNORE_WARNINGS; - case Draft.DRAFT_QUERY_PARAM: + case DRAFT_QUERY_PARAM: return DRAFT_ID; } }); diff --git a/src/app/cases/creator/create-case-event-trigger.resolver.ts b/src/app/cases/creator/create-case-event-trigger.resolver.ts index 3af44b1d3..deb54affd 100644 --- a/src/app/cases/creator/create-case-event-trigger.resolver.ts +++ b/src/app/cases/creator/create-case-event-trigger.resolver.ts @@ -1,13 +1,12 @@ import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs/Observable'; -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; +import { Observable } from 'rxjs'; +import { CaseEventTrigger, Draft, HttpError } from '@hmcts/ccd-case-ui-toolkit'; import { AlertService } from '../../core/alert/alert.service'; -import { HttpError } from '../../core/http/http-error.model'; import { CasesService } from '../../core/cases/cases.service'; import 'rxjs/add/operator/do'; import 'rxjs/add/operator/catch'; -import { Draft } from '../../shared/domain/draft'; +import { DRAFT_QUERY_PARAM } from '@hmcts/ccd-case-ui-toolkit/dist/shared/domain'; @Injectable() export class CreateCaseEventTriggerResolver implements Resolve { @@ -36,7 +35,7 @@ export class CreateCaseEventTriggerResolver implements Resolve let caseTypeId = route.paramMap.get(CreateCaseEventTriggerResolver.PARAM_CASE_TYPE_ID); let eventTriggerId = route.paramMap.get(CreateCaseEventTriggerResolver.PARAM_EVENT_ID); let ignoreWarning = route.queryParamMap.get(CreateCaseEventTriggerResolver.QUERY_PARAM_IGNORE_WARNING); - let draftId = route.queryParamMap.get(Draft.DRAFT_QUERY_PARAM); + let draftId = route.queryParamMap.get(DRAFT_QUERY_PARAM); let caseId = undefined; if (-1 === CreateCaseEventTriggerResolver.IGNORE_WARNING_VALUES.indexOf(ignoreWarning)) { diff --git a/src/app/cases/creator/filters/create-case-filters.component.spec.ts b/src/app/cases/creator/filters/create-case-filters.component.spec.ts index 3488b7b75..2f5dc739c 100644 --- a/src/app/cases/creator/filters/create-case-filters.component.spec.ts +++ b/src/app/cases/creator/filters/create-case-filters.component.spec.ts @@ -4,17 +4,16 @@ import { By } from '@angular/platform-browser'; import { Jurisdiction } from '../../../shared/domain/definition/jurisdiction.model'; import { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { CreateCaseFiltersComponent } from './create-case-filters.component'; -import { OrderService } from '../../../core/order/order.service'; import { CaseEvent } from '../../../shared/domain/definition/case-event.model'; import { Router } from '@angular/router'; import { Subject } from 'rxjs/Subject'; import { CallbackErrorsContext } from '../../../shared/error/error-context'; import { attr, text } from '../../../test/helpers'; -import { HttpError } from '../../../core/http/http-error.model'; import { AlertService } from '../../../core/alert/alert.service'; import { CaseType } from '../../../shared/domain/definition/case-type.model'; import { JurisdictionService } from '../../../shared/jurisdiction.service'; import createSpyObj = jasmine.createSpyObj; +import { HttpError, OrderService } from '@hmcts/ccd-case-ui-toolkit'; const EVENT_ID_1 = 'ID_1'; const EVENT_NAME_1 = 'Event one'; diff --git a/src/app/cases/creator/filters/create-case-filters.component.ts b/src/app/cases/creator/filters/create-case-filters.component.ts index 0fd3a75ef..7284e7ea0 100644 --- a/src/app/cases/creator/filters/create-case-filters.component.ts +++ b/src/app/cases/creator/filters/create-case-filters.component.ts @@ -3,12 +3,11 @@ import { Jurisdiction } from '../../../shared/domain/definition/jurisdiction.mod import { CaseType } from '../../../shared/domain/definition/case-type.model'; import { FormControl, FormGroup } from '@angular/forms'; import { CaseEvent } from '../../../shared/domain/definition/case-event.model'; -import { OrderService } from '../../../core/order/order.service'; import { Router } from '@angular/router'; import { Subject } from 'rxjs/Subject'; import { CallbackErrorsContext } from '../../../shared/error/error-context'; import { CallbackErrorsComponent } from '../../../shared/error/callback-errors.component'; -import { HttpError } from '../../../core/http/http-error.model'; +import { HttpError, OrderService } from '@hmcts/ccd-case-ui-toolkit'; import { AlertService } from '../../../core/alert/alert.service'; @Component({ diff --git a/src/app/cases/event-trigger/case-event-trigger.component.spec.ts b/src/app/cases/event-trigger/case-event-trigger.component.spec.ts index 2debc151d..9bd98653d 100644 --- a/src/app/cases/event-trigger/case-event-trigger.component.spec.ts +++ b/src/app/cases/event-trigger/case-event-trigger.component.spec.ts @@ -4,17 +4,13 @@ import { Component, DebugElement, EventEmitter, Input, Output } from '@angular/c import { MockComponent } from 'ng2-mock-component'; import { ActivatedRoute, Router } from '@angular/router'; import { CaseView } from '../../core/cases/case-view.model'; -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; import { CasesService } from '../../core/cases/cases.service'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { AlertService } from '../../core/alert/alert.service'; -import { HttpError } from '../../core/http/http-error.model'; -import { CaseReferencePipe } from '../../shared/utils/case-reference.pipe'; import { ReactiveFormsModule } from '@angular/forms'; import { ActivityPollingService } from '../../core/activity/activity.polling.service'; -import { CaseEventData } from '../../shared/domain/case-event-data'; -import { createCaseEventTrigger } from '../../fixture/shared.fixture' import createSpyObj = jasmine.createSpyObj; +import { CaseEventData, createCaseEventTrigger, CaseReferencePipe, HttpError, CaseEventTrigger } from '@hmcts/ccd-case-ui-toolkit'; @Component({ selector: 'ccd-case-edit', diff --git a/src/app/cases/event-trigger/case-event-trigger.component.ts b/src/app/cases/event-trigger/case-event-trigger.component.ts index aed0912ac..4f0157156 100644 --- a/src/app/cases/event-trigger/case-event-trigger.component.ts +++ b/src/app/cases/event-trigger/case-event-trigger.component.ts @@ -1,14 +1,12 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { CaseView } from '../../core/cases/case-view.model'; -import { CaseReferencePipe } from '../../shared/utils/case-reference.pipe'; import { CasesService } from '../../core/cases/cases.service'; import { AlertService } from '../../core/alert/alert.service'; -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; -import { Observable } from 'rxjs/Observable'; +import { CaseEventTrigger, CaseEventData, CaseReferencePipe } from '@hmcts/ccd-case-ui-toolkit'; +import { Observable } from 'rxjs'; import { Activity, DisplayMode } from '../../core/activity/activity.model'; import { Subscription } from 'rxjs/Subscription'; -import { CaseEventData } from '../../shared/domain/case-event-data'; import { EventStatusService } from '../../core/cases/event-status.service'; import { ActivityPollingService } from '../../core/activity/activity.polling.service'; diff --git a/src/app/cases/event-trigger/event-trigger.resolver.spec.ts b/src/app/cases/event-trigger/event-trigger.resolver.spec.ts index 53c74af0b..82df60f48 100644 --- a/src/app/cases/event-trigger/event-trigger.resolver.spec.ts +++ b/src/app/cases/event-trigger/event-trigger.resolver.spec.ts @@ -1,11 +1,9 @@ import { EventTriggerResolver } from './event-trigger.resolver'; import createSpyObj = jasmine.createSpyObj; -import { Observable } from 'rxjs/Observable'; -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; +import { Observable } from 'rxjs'; import { CaseResolver } from '../case.resolver'; -import { HttpError } from '../../core/http/http-error.model'; import { CaseView } from '../../core/cases/case-view.model'; -import { createCaseEventTrigger } from '../../fixture/shared.fixture' +import { CaseEventTrigger, createCaseEventTrigger, HttpError } from '@hmcts/ccd-case-ui-toolkit'; describe('EventTriggerResolver', () => { diff --git a/src/app/cases/event-trigger/event-trigger.resolver.ts b/src/app/cases/event-trigger/event-trigger.resolver.ts index 5321c96a3..ea625ee44 100644 --- a/src/app/cases/event-trigger/event-trigger.resolver.ts +++ b/src/app/cases/event-trigger/event-trigger.resolver.ts @@ -1,10 +1,9 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; -import { Observable } from 'rxjs/Observable'; +import { CaseEventTrigger, HttpError } from '@hmcts/ccd-case-ui-toolkit'; +import { Observable } from 'rxjs'; import { CasesService } from '../../core/cases/cases.service'; import { AlertService } from '../../core/alert/alert.service'; -import { HttpError } from '../../core/http/http-error.model'; import { CaseView } from '../../core/cases/case-view.model'; import 'rxjs/add/operator/do'; import 'rxjs/add/operator/catch'; diff --git a/src/app/cases/printer/case-print-documents.resolver.spec.ts b/src/app/cases/printer/case-print-documents.resolver.spec.ts index 3eb64612c..e2e84aa24 100644 --- a/src/app/cases/printer/case-print-documents.resolver.spec.ts +++ b/src/app/cases/printer/case-print-documents.resolver.spec.ts @@ -1,10 +1,10 @@ import { CasePrintDocumentsResolver } from './case-print-documents.resolver'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { CaseResolver } from '../case.resolver'; -import { HttpError } from '../../core/http/http-error.model'; import { CasePrintDocument } from '../../shared/domain/case-view/case-print-document.model'; import createSpyObj = jasmine.createSpyObj; import { CaseView } from '../../core/cases/case-view.model'; +import { HttpError } from '@hmcts/ccd-case-ui-toolkit'; describe('CasePrintDocumentsResolver', () => { diff --git a/src/app/cases/printer/case-print-documents.resolver.ts b/src/app/cases/printer/case-print-documents.resolver.ts index ccbc5cca8..a7c91919d 100644 --- a/src/app/cases/printer/case-print-documents.resolver.ts +++ b/src/app/cases/printer/case-print-documents.resolver.ts @@ -1,11 +1,11 @@ import { ActivatedRouteSnapshot, Resolve } from '@angular/router'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { CasePrintDocument } from '../../shared/domain/case-view/case-print-document.model'; import { CasesService } from '../../core/cases/cases.service'; import { AlertService } from '../../core/alert/alert.service'; import 'rxjs/add/operator/catch'; import 'rxjs/add/operator/map'; -import { HttpError } from '../../core/http/http-error.model'; +import { HttpError } from '@hmcts/ccd-case-ui-toolkit'; import { Injectable } from '@angular/core'; import { CaseView } from '../../core/cases/case-view.model'; diff --git a/src/app/cases/printer/case-printer.component.spec.ts b/src/app/cases/printer/case-printer.component.spec.ts index e20d52199..40c84baed 100644 --- a/src/app/cases/printer/case-printer.component.spec.ts +++ b/src/app/cases/printer/case-printer.component.spec.ts @@ -3,7 +3,6 @@ import { DebugElement } from '@angular/core'; import { By } from '@angular/platform-browser'; import { ActivatedRoute } from '@angular/router'; import { MockComponent } from 'ng2-mock-component'; -import { PaletteUtilsModule } from '../../shared/palette/utils/utils.module'; import { CasePrinterComponent } from './case-printer.component'; import { CasePrintDocument } from '../../shared/domain/case-view/case-print-document.model'; import { attr, text } from '../../test/helpers'; @@ -11,6 +10,7 @@ import { CaseView } from '../../core/cases/case-view.model'; import createSpyObj = jasmine.createSpyObj; import { AppConfig } from '../../app.config'; import { PrintUrlPipe } from './print-url.pipe'; +import { PaletteUtilsModule } from '@hmcts/ccd-case-ui-toolkit'; describe('CasePrinterComponent', () => { diff --git a/src/app/cases/viewer/case-viewer.component.spec.ts b/src/app/cases/viewer/case-viewer.component.spec.ts index 4944d79ed..671bb038f 100644 --- a/src/app/cases/viewer/case-viewer.component.spec.ts +++ b/src/app/cases/viewer/case-viewer.component.spec.ts @@ -5,26 +5,20 @@ import { By } from '@angular/platform-browser'; import { CaseView } from '../../core/cases/case-view.model'; import { ActivatedRoute, Router } from '@angular/router'; import { MockComponent } from 'ng2-mock-component'; -import { OrderService } from '../../core/order/order.service'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { CaseViewEvent } from '../../core/cases/case-view-event.model'; import { CaseViewTrigger } from '../../shared/domain/case-view/case-view-trigger.model'; import { attr, text } from '../../test/helpers'; -import { PaletteUtilsModule } from '../../shared/palette/utils/utils.module'; import { Subject } from 'rxjs/Subject'; import { CallbackErrorsContext } from '../../shared/error/error-context'; -import { HttpError } from '../../core/http/http-error.model'; -import { LabelSubstitutorDirective } from '../../shared/substitutor/label-substitutor.directive'; -import { FieldsUtils } from '../../shared/utils/fields.utils'; -import { LabelSubstitutionService } from '../../shared/case-editor/label-substitution.service'; import { ActivityPollingService } from '../../core/activity/activity.polling.service'; -import { CaseField } from '../../shared/domain/definition/case-field.model'; import createSpyObj = jasmine.createSpyObj; import any = jasmine.any; +import { PaletteUtilsModule, CaseField, LabelSubstitutionService, FieldsUtils, + LabelSubstitutorDirective, HttpError, OrderService, DeleteOrCancelDialogComponent } from '@hmcts/ccd-case-ui-toolkit'; import { DraftService } from '../../core/draft/draft.service'; import { AlertService } from '../../core/alert/alert.service'; import { MatDialog, MatDialogRef, MatDialogConfig } from '@angular/material'; -import { DeleteOrCancelDialogComponent } from '../../shared/delete-or-cancel-dialog/delete-or-cancel-dialog.component'; @Component({ // tslint:disable-next-line diff --git a/src/app/cases/viewer/case-viewer.component.ts b/src/app/cases/viewer/case-viewer.component.ts index ff1293b61..d2490a643 100644 --- a/src/app/cases/viewer/case-viewer.component.ts +++ b/src/app/cases/viewer/case-viewer.component.ts @@ -2,30 +2,28 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { CaseView } from '../../core/cases/case-view.model'; import { ActivatedRoute, Params, Router } from '@angular/router'; import { CaseTab } from '../../core/cases/case-tab.model'; -import { OrderService } from '../../core/order/order.service'; import { CaseViewTrigger } from '../../shared/domain/case-view/case-view-trigger.model'; import { Subject } from 'rxjs/Subject'; import { CallbackErrorsContext } from '../../shared/error/error-context'; import { CallbackErrorsComponent } from '../../shared/error/callback-errors.component'; import { Activity, DisplayMode } from '../../core/activity/activity.model'; import { ActivityPollingService } from '../../core/activity/activity.polling.service'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { Subscription } from 'rxjs/Subscription'; -import { CaseField } from '../../shared/domain/definition/case-field.model'; -import { ShowCondition } from '../../shared/conditional-show/conditional-show.model'; -import { HttpError } from '../../core/http/http-error.model'; +import { CaseField, ShowCondition, Draft, HttpError, OrderService, + DeleteOrCancelDialogComponent } from '@hmcts/ccd-case-ui-toolkit'; import { DraftService } from '../../core/draft/draft.service'; -import { Draft } from '../../shared/domain/draft'; import { MatDialog, MatDialogConfig } from '@angular/material'; -import { DeleteOrCancelDialogComponent } from '../../shared/delete-or-cancel-dialog/delete-or-cancel-dialog.component'; import { AlertService } from '../../core/alert/alert.service'; import { CaseCreatorSubmitComponent } from '../creator/case-creator-submit.component'; +import { DRAFT_QUERY_PARAM } from '@hmcts/ccd-case-ui-toolkit/dist/shared/domain'; @Component({ templateUrl: './case-viewer.component.html', styleUrls: ['./case-viewer.scss'] }) export class CaseViewerComponent implements OnInit, OnDestroy { + public static readonly ORIGIN_QUERY_PARAM = 'origin'; BANNER = DisplayMode.BANNER; caseDetails: CaseView; @@ -115,8 +113,8 @@ export class CaseViewerComponent implements OnInit, OnDestroy { } }); } else if (this.isDraft() && trigger.id !== CaseViewTrigger.DELETE) { - theQueryParams[Draft.DRAFT_QUERY_PARAM] = this.caseDetails.case_id; - theQueryParams[CaseCreatorSubmitComponent.ORIGIN_QUERY_PARAM] = 'viewDraft'; + theQueryParams[DRAFT_QUERY_PARAM] = this.caseDetails.case_id; + theQueryParams[CaseViewerComponent.ORIGIN_QUERY_PARAM] = 'viewDraft'; return this.router.navigate( ['create/case', this.caseDetails.case_type.jurisdiction.id, diff --git a/src/app/core/activity/activity.service.spec.ts b/src/app/core/activity/activity.service.spec.ts index 2293ffd07..4611361ae 100644 --- a/src/app/core/activity/activity.service.spec.ts +++ b/src/app/core/activity/activity.service.spec.ts @@ -1,8 +1,8 @@ import { ActivityService } from './activity.service'; import { AppConfig } from '../../app.config'; -import { HttpService } from '../http/http.service'; import { Observable } from 'rxjs'; +import { HttpService } from '@hmcts/ccd-case-ui-toolkit'; let httpService: any; let appConfig: any; diff --git a/src/app/core/activity/activity.service.ts b/src/app/core/activity/activity.service.ts index 8a16b3cf9..700613cc3 100644 --- a/src/app/core/activity/activity.service.ts +++ b/src/app/core/activity/activity.service.ts @@ -1,10 +1,8 @@ import { Injectable } from '@angular/core'; import { Activity } from './activity.model'; import { Observable } from 'rxjs'; -import { catchError, retry } from 'rxjs/operators'; import { AppConfig } from '../../app.config'; -import { HttpService } from '../http/http.service'; -import { HttpErrorResponse } from '@angular/common/http'; +import { HttpService } from '@hmcts/ccd-case-ui-toolkit'; const DUMMY_CASE_REFERENCE = '0'; diff --git a/src/app/core/addresses/address.model.ts b/src/app/core/addresses/address.model.ts deleted file mode 100644 index 0e85deae3..000000000 --- a/src/app/core/addresses/address.model.ts +++ /dev/null @@ -1,9 +0,0 @@ -export class AddressModel { - AddressLine1 = ''; - AddressLine2 = ''; - AddressLine3 = ''; - PostTown = ''; - County = ''; - PostCode = ''; - Country = ''; -} diff --git a/src/app/core/addresses/addresses.service.ts b/src/app/core/addresses/addresses.service.ts deleted file mode 100644 index a9b56c3c0..000000000 --- a/src/app/core/addresses/addresses.service.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { HttpService } from '../http/http.service'; -import { AddressModel } from './address.model'; -import { AppConfig } from '../../app.config'; - -@Injectable() -export class AddressesService { - - constructor( - private http: HttpService, - private appConfig: AppConfig - ) {} - - getAddressesForPostcode(postcode: string): Observable> { - return this.http - .get(this.appConfig.getPostcodeLookupUrl().replace('${postcode}', postcode)) - .map(response => response.json()); - } -} diff --git a/src/app/core/auth/auth.service.spec.ts b/src/app/core/auth/auth.service.spec.ts deleted file mode 100644 index d60d2dd15..000000000 --- a/src/app/core/auth/auth.service.spec.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { AuthService } from './auth.service'; -import { HttpService } from '../http/http.service'; -import { AppConfig } from '../../app.config'; -import { Observable } from 'rxjs/Observable'; -import { Response, ResponseOptions } from '@angular/http'; -import createSpyObj = jasmine.createSpyObj; - -describe('AuthService', () => { - - const TOKEN_ENDPOINT = 'http://localhost:1234/oauth2/token'; - const RESPONSE = Observable.of(new Response(new ResponseOptions())); - const LOGIN_URL = 'http://idam/login'; - const LOGOUT_URL = 'http://gateway.ccd/logout'; - const OAUTH2_CLIENT_ID = 'some_client_id'; - const REDIRECT_URI = 'http://localhost/oauth2redirect'; - const REDIRECT_URI_ENCODED = encodeURIComponent(REDIRECT_URI); - - let authService: AuthService; - let httpService: any; - let appConfig: any; - let document: any; - - beforeEach(() => { - httpService = createSpyObj('httpService', ['get']); - httpService.get.and.returnValue(RESPONSE); - - appConfig = createSpyObj('appConfig', [ - 'getOAuth2TokenEndpointUrl', - 'getOAuth2ClientId', - 'getLoginUrl', - 'getLogoutUrl', - ]); - appConfig.getOAuth2TokenEndpointUrl.and.returnValue(TOKEN_ENDPOINT); - appConfig.getLoginUrl.and.returnValue(LOGIN_URL); - appConfig.getLogoutUrl.and.returnValue(LOGOUT_URL); - appConfig.getOAuth2ClientId.and.returnValue(OAUTH2_CLIENT_ID); - document = { - location: { - origin: 'http://localhost' - } - }; - - authService = new AuthService(appConfig, document); - }); - - describe('signIn', () => { - - it('should redirect IDAM login page', () => { - authService.signIn(); - - let expectedParams = [ - `response_type=code`, - `client_id=${OAUTH2_CLIENT_ID}`, - `redirect_uri=${REDIRECT_URI_ENCODED}`, - ]; - - expect(document.location.href) - .toEqual(`${LOGIN_URL}?${expectedParams.join('&')}`); - }); - - }); -}); diff --git a/src/app/core/auth/auth.service.ts b/src/app/core/auth/auth.service.ts deleted file mode 100644 index a73fc07a4..000000000 --- a/src/app/core/auth/auth.service.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Inject, Injectable } from '@angular/core'; -import { AppConfig } from '../../app.config'; -import { DOCUMENT } from '@angular/common'; - -/** - * `Oauth2Service` and `AuthService` cannot be merged as it creates a cyclic dependency on `AuthService` through `HttpErrorService`. - */ -@Injectable() -export class AuthService { - - private static readonly PATH_OAUTH2_REDIRECT = '/oauth2redirect'; - - constructor(private appConfig: AppConfig, - @Inject(DOCUMENT) private document: any) {} - - public signIn(): void { - let loginUrl = this.appConfig.getLoginUrl(); - let clientId = this.appConfig.getOAuth2ClientId(); - let redirectUri = encodeURIComponent(this.redirectUri()); - - this.document.location.href = `${loginUrl}?response_type=code&client_id=${clientId}&redirect_uri=${redirectUri}`; - } - - public redirectUri(): string { - return this.document.location.origin + AuthService.PATH_OAUTH2_REDIRECT; - } -} diff --git a/src/app/core/auth/oauth2.service.spec.ts b/src/app/core/auth/oauth2.service.spec.ts index 78519aab9..5304f5d7f 100644 --- a/src/app/core/auth/oauth2.service.spec.ts +++ b/src/app/core/auth/oauth2.service.spec.ts @@ -1,9 +1,9 @@ -import { HttpService } from '../http/http.service'; import { AppConfig } from '../../app.config'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { Response, ResponseOptions, URLSearchParams } from '@angular/http'; import { OAuth2Service } from './oauth2.service'; import createSpyObj = jasmine.createSpyObj; +import { HttpService } from '@hmcts/ccd-case-ui-toolkit'; describe('OAuth2Service', () => { diff --git a/src/app/core/auth/oauth2.service.ts b/src/app/core/auth/oauth2.service.ts index bbe4a67a5..5093e6a4e 100644 --- a/src/app/core/auth/oauth2.service.ts +++ b/src/app/core/auth/oauth2.service.ts @@ -1,9 +1,8 @@ import { Injectable } from '@angular/core'; -import { HttpService } from '../http/http.service'; import { AppConfig } from '../../app.config'; import { Response, URLSearchParams } from '@angular/http'; -import { Observable } from 'rxjs/Observable'; -import { AuthService } from './auth.service'; +import { Observable } from 'rxjs'; +import { HttpService, AuthService } from '@hmcts/ccd-case-ui-toolkit'; /** * `Oauth2Service` and `AuthService` cannot be merged as it creates a cyclic dependency on `AuthService` through `HttpErrorService`. diff --git a/src/app/core/case-editor/case-edit-wizard.guard.spec.ts b/src/app/core/case-editor/case-edit-wizard.guard.spec.ts index 38dc0c0c6..7a40157b4 100644 --- a/src/app/core/case-editor/case-edit-wizard.guard.spec.ts +++ b/src/app/core/case-editor/case-edit-wizard.guard.spec.ts @@ -2,11 +2,8 @@ import createSpyObj = jasmine.createSpyObj; import { CaseEditWizardGuard } from './case-edit-wizard.guard'; import { ActivatedRouteSnapshot } from '@angular/router'; import { TestRouteSnapshotBuilder } from '../../test/test-route-snapshot-builder'; -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; -import { WizardPage } from '../../shared/domain/wizard-page.model'; -import { CaseField } from '../../shared/domain/definition/case-field.model'; import { AlertService } from '../alert/alert.service'; -import { createCaseEventTrigger } from '../../fixture/shared.fixture' +import { CaseEventTrigger, createCaseEventTrigger, CaseField, WizardPage } from '@hmcts/ccd-case-ui-toolkit'; describe('CaseEditWizardGuard', () => { diff --git a/src/app/core/case-editor/case-edit-wizard.guard.ts b/src/app/core/case-editor/case-edit-wizard.guard.ts index ed82c092f..66734cb2e 100644 --- a/src/app/core/case-editor/case-edit-wizard.guard.ts +++ b/src/app/core/case-editor/case-edit-wizard.guard.ts @@ -1,11 +1,8 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, Resolve, Router } from '@angular/router'; -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; +import { CaseEventTrigger, WizardPage, ShowCondition, CaseField } from '@hmcts/ccd-case-ui-toolkit'; import { WizardFactoryService } from './wizard-factory.service'; import { Predicate } from '../../shared/predicate'; -import { WizardPage } from '../../shared/domain/wizard-page.model'; -import { ShowCondition } from '../../shared/conditional-show/conditional-show.model'; -import { CaseField } from '../../shared/domain/definition/case-field.model'; import { AlertService } from '../alert/alert.service'; import { Wizard } from '../../shared/case-editor/wizard.model'; import { RouterHelperService } from '../utils/router-helper.service'; diff --git a/src/app/core/case-editor/wizard-factory.service.spec.ts b/src/app/core/case-editor/wizard-factory.service.spec.ts index 33b313471..134fbf993 100644 --- a/src/app/core/case-editor/wizard-factory.service.spec.ts +++ b/src/app/core/case-editor/wizard-factory.service.spec.ts @@ -1,7 +1,5 @@ -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; -import { WizardPage } from '../../shared/domain/wizard-page.model'; import { WizardFactoryService } from './wizard-factory.service'; -import { createCaseEventTrigger } from '../../fixture/shared.fixture' +import { CaseEventTrigger, WizardPage, createCaseEventTrigger } from '@hmcts/ccd-case-ui-toolkit'; describe('WizardFactoryService', () => { diff --git a/src/app/core/case-editor/wizard-factory.service.ts b/src/app/core/case-editor/wizard-factory.service.ts index 8e9361cc3..874b80552 100644 --- a/src/app/core/case-editor/wizard-factory.service.ts +++ b/src/app/core/case-editor/wizard-factory.service.ts @@ -1,5 +1,5 @@ import { Wizard } from '../../shared/case-editor/wizard.model'; -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; +import { CaseEventTrigger } from '@hmcts/ccd-case-ui-toolkit'; export class WizardFactoryService { create(eventTrigger: CaseEventTrigger): Wizard { diff --git a/src/app/core/cases/case-history.service.spec.ts b/src/app/core/cases/case-history.service.spec.ts index 0355224bd..f80e61527 100644 --- a/src/app/core/cases/case-history.service.spec.ts +++ b/src/app/core/cases/case-history.service.spec.ts @@ -1,13 +1,11 @@ import { Response, ResponseOptions } from '@angular/http'; import { AppConfig } from '../../app.config'; -import { HttpService } from '../http/http.service'; -import { Observable } from 'rxjs/Observable'; -import { HttpError } from '../http/http-error.model'; +import { Observable } from 'rxjs'; import { CaseHistory } from './case-history.model'; import { CaseHistoryService } from './case-history.service'; import { createCaseHistory } from './case-history.test.fixture'; -import { HttpErrorService } from '../http/http-error.service'; import createSpyObj = jasmine.createSpyObj; +import { HttpService, HttpError, HttpErrorService } from '@hmcts/ccd-case-ui-toolkit'; describe('CaseHistoryService', () => { diff --git a/src/app/core/cases/case-history.service.ts b/src/app/core/cases/case-history.service.ts index 52361796e..25a5c0dc0 100644 --- a/src/app/core/cases/case-history.service.ts +++ b/src/app/core/cases/case-history.service.ts @@ -1,10 +1,9 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { AppConfig } from '../../app.config'; -import { HttpService } from '../http/http.service'; import { CaseHistory } from './case-history.model'; import { plainToClass } from 'class-transformer'; -import { HttpErrorService } from '../http/http-error.service'; +import { HttpService, HttpErrorService } from '@hmcts/ccd-case-ui-toolkit'; @Injectable() export class CaseHistoryService { diff --git a/src/app/core/cases/case-tab.model.ts b/src/app/core/cases/case-tab.model.ts index f804ac71d..cf5002992 100644 --- a/src/app/core/cases/case-tab.model.ts +++ b/src/app/core/cases/case-tab.model.ts @@ -1,5 +1,4 @@ -import { CaseField } from '../../shared/domain/definition/case-field.model'; -import { Orderable } from '../order/orderable.model'; +import { CaseField, Orderable } from '@hmcts/ccd-case-ui-toolkit'; export class CaseTab implements Orderable { id: string; diff --git a/src/app/core/cases/case-view.model.ts b/src/app/core/cases/case-view.model.ts index 1eeb098ae..d7fc8e21e 100644 --- a/src/app/core/cases/case-view.model.ts +++ b/src/app/core/cases/case-view.model.ts @@ -1,7 +1,7 @@ import { CaseTab } from './case-tab.model'; import { CaseViewEvent } from './case-view-event.model'; import { CaseViewTrigger } from '../../shared/domain/case-view/case-view-trigger.model'; -import { CaseField } from '../../shared/domain/definition/case-field.model'; +import { CaseField } from '@hmcts/ccd-case-ui-toolkit'; export class CaseView { case_id?: string; diff --git a/src/app/core/cases/cases.service.spec.ts b/src/app/core/cases/cases.service.spec.ts index 424dd5788..165196257 100644 --- a/src/app/core/cases/cases.service.spec.ts +++ b/src/app/core/cases/cases.service.spec.ts @@ -2,16 +2,11 @@ import { Response, ResponseOptions, Headers } from '@angular/http'; import { AppConfig } from '../../app.config'; import { CasesService } from './cases.service'; import { CaseView } from './case-view.model'; -import { HttpService } from '../http/http.service'; -import { Observable } from 'rxjs/Observable'; -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; -import { CaseEventData } from '../../shared/domain/case-event-data'; +import { Observable } from 'rxjs'; import { CasePrintDocument } from '../../shared/domain/case-view/case-print-document.model'; -import { OrderService } from '../order/order.service'; import createSpyObj = jasmine.createSpyObj; -import { createCaseEventTrigger } from '../../fixture/shared.fixture' -import { HttpError } from '../http/http-error.model'; -import { HttpErrorService } from '../http/http-error.service'; +import { HttpErrorService, HttpError, HttpService, CaseEventTrigger, CaseEventData, + createCaseEventTrigger, OrderService } from '@hmcts/ccd-case-ui-toolkit'; describe('CasesService', () => { diff --git a/src/app/core/cases/cases.service.ts b/src/app/core/cases/cases.service.ts index 0ad52efd9..e48b141d6 100644 --- a/src/app/core/cases/cases.service.ts +++ b/src/app/core/cases/cases.service.ts @@ -2,17 +2,10 @@ import { Injectable } from '@angular/core'; import { CaseView } from './case-view.model'; import { Observable } from 'rxjs'; import { AppConfig } from '../../app.config'; -import { HttpService } from '../http/http.service'; -import { CaseEventTrigger } from '../../shared/domain/case-view/case-event-trigger.model'; -import { CaseEventData } from '../../shared/domain/case-event-data'; +import { CaseEventTrigger, CaseEventData, WizardPage, WizardPageField, ShowCondition, HttpService, + HttpErrorService, Draft, OrderService } from '@hmcts/ccd-case-ui-toolkit'; import { CasePrintDocument } from '../../shared/domain/case-view/case-print-document.model'; -import { OrderService } from '../order/order.service'; -import { WizardPageField } from '../../shared/domain/wizard-page-field.model'; -import { ShowCondition } from '../../shared/conditional-show/conditional-show.model'; -import { WizardPage } from '../../shared/domain/wizard-page.model'; -import { HttpErrorService } from '../http/http-error.service'; import { plainToClass } from 'class-transformer'; -import { Draft } from '../../shared/domain/draft'; import { Headers } from '@angular/http'; @Injectable() diff --git a/src/app/core/core.component.spec.ts b/src/app/core/core.component.spec.ts index 25bbc2166..ce83a033d 100644 --- a/src/app/core/core.component.spec.ts +++ b/src/app/core/core.component.spec.ts @@ -9,11 +9,11 @@ import { By } from '@angular/platform-browser'; import { Jurisdiction } from '../shared/domain/definition/jurisdiction.model'; import { attr } from '../test/helpers'; import { OAuth2Service } from './auth/oauth2.service'; -import { HttpService } from './http/http.service'; import { AppConfig } from '../app.config'; import createSpyObj = jasmine.createSpyObj; import createSpy = jasmine.createSpy; import { CcdBrowserSupportComponent } from '../core/ccd-browser-support/ccd-browser-support.component'; +import { HttpService } from '@hmcts/ccd-case-ui-toolkit'; describe('CoreComponent', () => { diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index e1235d5b5..5f40e2dfe 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -1,5 +1,6 @@ import { NgModule } from '@angular/core'; -import { CaseUIToolkitModule } from '@hmcts/ccd-case-ui-toolkit'; +import { CaseUIToolkitModule, FormValueService, FormErrorService, AddressesService, HttpErrorService, HttpService, AuthService, + DocumentManagementService, OrderService } from '@hmcts/ccd-case-ui-toolkit'; import { CasesService } from './cases/cases.service'; import { DefinitionsService } from './definitions/definitions.service'; import { WindowService } from './utils/window.service'; @@ -11,22 +12,14 @@ import { ProfileResolver } from './profile/profile.resolver'; import { ProfileService } from './profile/profile.service'; import { SearchService } from './search/search.service'; import { PaginationService } from './pagination/pagination.service'; -import { HttpService } from './http/http.service'; -import { OrderService } from './order/order.service'; -import { HttpErrorService } from './http/http-error.service'; import { AlertModule } from './alert/alert.module'; -import { FormValueService } from './form/form-value.service'; -import { FormErrorService } from './form/form-error.service'; import { JurisdictionService } from '../shared/jurisdiction.service'; import { ActivityService } from './activity/activity.service'; import { ActivityPollingService } from './activity/activity.polling.service'; -import { DocumentManagementService } from './documentManagement/documentManagement.service'; import { CaseEditWizardGuard } from './case-editor/case-edit-wizard.guard'; import { WizardFactoryService } from './case-editor/wizard-factory.service'; import { RouterHelperService } from './utils/router-helper.service'; import { RequestOptionsBuilder } from './request.options.builder'; -import { AddressesService } from './addresses/addresses.service'; -import { AuthService } from './auth/auth.service'; import { WorkbasketInputFilterService } from '../workbasket/workbasket-input-filter.service'; import { OAuth2Service } from './auth/oauth2.service'; import { ActivityResolver } from './activity/activity.resolver'; diff --git a/src/app/core/definitions/definitions.service.spec.ts b/src/app/core/definitions/definitions.service.spec.ts index 73bc4e59b..62e8a17f6 100644 --- a/src/app/core/definitions/definitions.service.spec.ts +++ b/src/app/core/definitions/definitions.service.spec.ts @@ -1,7 +1,7 @@ import { Response, ResponseOptions } from '@angular/http'; import { AppConfig } from '../../app.config'; -import { HttpService } from '../http/http.service'; -import { Observable } from 'rxjs/Observable'; +import { HttpService } from '@hmcts/ccd-case-ui-toolkit'; +import { Observable } from 'rxjs'; import { DefinitionsService } from './definitions.service'; import { CaseType } from '../../shared/domain/definition/case-type.model'; import createSpyObj = jasmine.createSpyObj; diff --git a/src/app/core/definitions/definitions.service.ts b/src/app/core/definitions/definitions.service.ts index 77f4648f8..1acfe74a9 100644 --- a/src/app/core/definitions/definitions.service.ts +++ b/src/app/core/definitions/definitions.service.ts @@ -1,8 +1,8 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { AppConfig } from '../../app.config'; -import { HttpService } from '../http/http.service'; import { CaseType } from '../../shared/domain/definition/case-type.model'; +import { HttpService } from '@hmcts/ccd-case-ui-toolkit'; @Injectable() export class DefinitionsService { diff --git a/src/app/core/documentManagement/documentManagement.service.spec.ts b/src/app/core/documentManagement/documentManagement.service.spec.ts deleted file mode 100644 index 1e33f85aa..000000000 --- a/src/app/core/documentManagement/documentManagement.service.spec.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { DocumentManagementService } from './documentManagement.service'; -import createSpyObj = jasmine.createSpyObj; -import { AppConfig } from '../../app.config'; -import { HttpService } from '../http/http.service'; -import { DocumentData } from '../../shared/domain/document/document-data.model'; -import { Observable } from 'rxjs/Observable'; -import { Response, ResponseOptions } from '@angular/http'; - -describe('DocumentManagementService', () => { - const DOCUMENT_MANAGEMENT_URL = 'http://docmanagement.ccd.reform/documents'; - - let appConfig: any; - let httpService: any; - - let documentManagementService: DocumentManagementService; - - beforeEach(() => { - appConfig = createSpyObj('appConfig', ['getDocumentManagementUrl']); - appConfig.getDocumentManagementUrl.and.returnValue(DOCUMENT_MANAGEMENT_URL); - - httpService = createSpyObj('httpService', ['post']); - documentManagementService = new DocumentManagementService(httpService, appConfig); - }); - - describe('uploadFile', () => { - const RESPONSE: DocumentData = { - _embedded: { - documents: [{ - originalDocumentName: 'something.pdf', - _links: { - self: { - href: DOCUMENT_MANAGEMENT_URL + '/abcd0123' - }, - binary: { - href: DOCUMENT_MANAGEMENT_URL + '/abcd0123/binary' - } - } - }] - } - }; - - beforeEach(() => { - httpService.post.and.returnValue(Observable.of(new Response(new ResponseOptions({ - body: JSON.stringify(RESPONSE) - })))); - }); - - it('should use HttpService.post with the correct URL', () => { - documentManagementService.uploadFile(new FormData()).subscribe(); - - expect(httpService.post).toHaveBeenCalledWith(DOCUMENT_MANAGEMENT_URL, jasmine.any(FormData), jasmine.any(Object)); - }); - - it('should set Content-Type header to null', () => { - documentManagementService.uploadFile(new FormData()).subscribe(); - let headers = httpService.post.calls.mostRecent().args[2].headers; - - expect(headers.get('Content-Type')).toBe(null); - }); - - it('should return document metadata', () => { - documentManagementService.uploadFile(new FormData()) - .subscribe(documentMetadata => expect(documentMetadata).toEqual(RESPONSE)); - }); - }); -}); diff --git a/src/app/core/documentManagement/documentManagement.service.ts b/src/app/core/documentManagement/documentManagement.service.ts deleted file mode 100644 index ca2efb98d..000000000 --- a/src/app/core/documentManagement/documentManagement.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Headers } from '@angular/http'; -import { Observable } from 'rxjs/Observable'; -import { AppConfig } from '../../app.config'; -import { HttpService } from '../http/http.service'; -import { DocumentData } from '../../shared/domain/document/document-data.model'; - -@Injectable() -export class DocumentManagementService { - private static readonly HEADER_ACCEPT = 'Accept'; - private static readonly HEADER_CONTENT_TYPE = 'Content-Type'; - - constructor(private http: HttpService, private appConfig: AppConfig) {} - - uploadFile(formData: FormData): Observable { - const url = this.appConfig.getDocumentManagementUrl(); - let headers = new Headers(); - headers.append(DocumentManagementService.HEADER_ACCEPT, null); - // Content-Type header value needs to be null; HttpService will delete it, so that Angular can set it automatically - // with the correct boundary - headers.append(DocumentManagementService.HEADER_CONTENT_TYPE, null); - return this.http - .post(url, formData, { headers }) - .map(response => response.json()); - } -} diff --git a/src/app/core/draft/draft.service.spec.ts b/src/app/core/draft/draft.service.spec.ts index e31e3e1fc..040a2591b 100644 --- a/src/app/core/draft/draft.service.spec.ts +++ b/src/app/core/draft/draft.service.spec.ts @@ -1,15 +1,10 @@ -import { HttpError } from '../http/http-error.model'; -import { HttpService } from '../http/http.service'; -import { HttpErrorService } from '../http/http-error.service'; import { AppConfig } from '../../app.config'; -import { CaseEventData } from '../../shared/domain/case-event-data'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { Response, ResponseOptions } from '@angular/http'; import createSpyObj = jasmine.createSpyObj; import { DraftService } from './draft.service'; -import { Draft } from '../../shared/domain/draft'; -import { CaseDetails } from '../../shared/domain/case-details'; import { CaseView } from '../cases/case-view.model'; +import { HttpError, CaseDetails, Draft, CaseEventData, HttpErrorService, HttpService } from '@hmcts/ccd-case-ui-toolkit'; describe('Drafts Service', () => { diff --git a/src/app/core/draft/draft.service.ts b/src/app/core/draft/draft.service.ts index 6f8f567d1..682440f09 100644 --- a/src/app/core/draft/draft.service.ts +++ b/src/app/core/draft/draft.service.ts @@ -1,12 +1,10 @@ import { Injectable } from '@angular/core'; -import { HttpService } from '../http/http.service'; import { AppConfig } from '../../app.config'; -import { HttpErrorService } from '../http/http-error.service'; -import { CaseEventData } from '../../shared/domain/case-event-data'; +import { CaseEventData, Draft, HttpService, HttpErrorService } from '@hmcts/ccd-case-ui-toolkit'; import { Observable } from 'rxjs'; -import { Draft } from '../../shared/domain/draft'; import { CaseView } from '../cases/case-view.model'; import { Response } from '@angular/http'; +import { DRAFT_PREFIX } from '@hmcts/ccd-case-ui-toolkit/dist/shared/domain'; @Injectable() export class DraftService { @@ -39,7 +37,7 @@ export class DraftService { } getDraft(jid: string, ctid: string, draftId: string): Observable { - const url = this.appConfig.getViewOrDeleteDraftsUrl(jid, ctid, draftId.slice(Draft.DRAFT_PREFIX.length)); + const url = this.appConfig.getViewOrDeleteDraftsUrl(jid, ctid, draftId.slice(DRAFT_PREFIX.length)); return this.http .get(url) .map(response => response.json()) @@ -50,7 +48,7 @@ export class DraftService { } deleteDraft(jid: string, ctid: string, draftId: string): Observable<{} | Response> { - const url = this.appConfig.getViewOrDeleteDraftsUrl(jid, ctid, draftId.slice(Draft.DRAFT_PREFIX.length)); + const url = this.appConfig.getViewOrDeleteDraftsUrl(jid, ctid, draftId.slice(DRAFT_PREFIX.length)); return this.http .delete(url) .catch((error: any): any => { diff --git a/src/app/core/form/form-error.service.spec.ts b/src/app/core/form/form-error.service.spec.ts deleted file mode 100644 index 4fc3a6e7e..000000000 --- a/src/app/core/form/form-error.service.spec.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { FormErrorService } from './form-error.service'; -import { FormControl, FormGroup } from '@angular/forms'; - -describe('FormErrorService', () => { - - const FIELD_1 = 'Field1'; - const FIELD_2 = 'Field2'; - const FIELD_3 = 'Field3'; - const NESTED_FIELD = 'Field1.Field2.Field3'; - - const MESSAGE_1 = 'Some first message'; - const MESSAGE_2 = 'Some second message'; - - const ERROR_KEY = 'validation'; - - let formErrorService: FormErrorService; - - beforeEach(() => { - formErrorService = new FormErrorService(); - }); - - describe('mapFieldErrors', () => { - it('should map simple error to associated form control', () => { - let errors = [ - { - id: FIELD_1, - message: MESSAGE_1 - } - ]; - - let form = new FormGroup({ - [FIELD_1]: new FormControl() - }); - - formErrorService.mapFieldErrors(errors, form, ERROR_KEY); - - expect(form.controls[FIELD_1].errors[ERROR_KEY]).toBe(MESSAGE_1); - }); - - it('should map multiple simple errors', () => { - let errors = [ - { - id: FIELD_1, - message: MESSAGE_1 - }, - { - id: FIELD_2, - message: MESSAGE_2 - } - ]; - - let form = new FormGroup({ - [FIELD_1]: new FormControl(), - [FIELD_2]: new FormControl() - }); - - formErrorService.mapFieldErrors(errors, form, ERROR_KEY); - - expect(form.controls[FIELD_1].errors[ERROR_KEY]).toBe(MESSAGE_1); - expect(form.controls[FIELD_2].errors[ERROR_KEY]).toBe(MESSAGE_2); - }); - - it('should map nested errors', () => { - let errors = [ - { - id: NESTED_FIELD, - message: MESSAGE_1 - } - ]; - - let form = new FormGroup({ - [FIELD_1]: new FormGroup({ - [FIELD_2]: new FormGroup({ - [FIELD_3]: new FormControl() - }) - }) - }); - - formErrorService.mapFieldErrors(errors, form, ERROR_KEY); - - expect(((form - .controls[FIELD_1] as FormGroup) - .controls[FIELD_2] as FormGroup) - .controls[FIELD_3].errors[ERROR_KEY]).toBe(MESSAGE_1); - }); - - it('should ignore simple errors for unknown fields', () => { - let errors = [ - { - id: FIELD_2, - message: MESSAGE_1 - } - ]; - - let form = new FormGroup({ - [FIELD_1]: new FormControl() - }); - - formErrorService.mapFieldErrors(errors, form, ERROR_KEY); - - expect(form.controls[FIELD_1].errors).toBeNull(); - }); - - it('should ignore empty errors', () => { - let errors = []; - - let form = new FormGroup({ - [FIELD_1]: new FormControl() - }); - - formErrorService.mapFieldErrors(errors, form, ERROR_KEY); - - expect(form.controls[FIELD_1].errors).toBeNull(); - }); - - it('should ignore nested errors for unknown fields', () => { - let errors = [ - { - id: FIELD_1 + '.' + FIELD_3, - message: MESSAGE_1 - } - ]; - - let form = new FormGroup({ - [FIELD_1]: new FormGroup({ - [FIELD_2]: new FormControl() - }) - }); - - formErrorService.mapFieldErrors(errors, form, ERROR_KEY); - - expect(form.controls[FIELD_1].errors).toBeNull(); - expect((form - .controls[FIELD_1] as FormGroup) - .controls[FIELD_2].errors).toBeNull(); - }); - - it('should ignore nested errors for unknown group', () => { - let errors = [ - { - id: FIELD_3 + '.' + FIELD_3 + '.' + FIELD_3, - message: MESSAGE_1 - } - ]; - - let form = new FormGroup({ - [FIELD_1]: new FormGroup({ - [FIELD_2]: new FormGroup({ - [FIELD_3]: new FormControl() - }) - }) - }); - - formErrorService.mapFieldErrors(errors, form, ERROR_KEY); - - expect(form.controls[FIELD_1].errors).toBeNull(); - expect((form - .controls[FIELD_1] as FormGroup) - .controls[FIELD_2].errors).toBeNull(); - expect(((form - .controls[FIELD_1] as FormGroup) - .controls[FIELD_2] as FormGroup) - .controls[FIELD_3].errors).toBeNull(); - }); - - it('should reset all errors', () => { - let field3 = new FormControl(); - - let form = new FormGroup({ - [FIELD_1]: new FormGroup({ - [FIELD_2]: new FormGroup({ - [FIELD_3]: field3 - }) - }) - }); - - form.controls[FIELD_1].setErrors({ x: 'y' }); - - field3.setErrors({ q: 'z' }); - - form.reset(); - - expect(form.controls[FIELD_1].errors).toBeNull(); - expect(field3.errors).toBeNull(); - - }); - }); -}); diff --git a/src/app/core/form/form-error.service.ts b/src/app/core/form/form-error.service.ts deleted file mode 100644 index 0e41cc1af..000000000 --- a/src/app/core/form/form-error.service.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Injectable } from '@angular/core'; -import { FormArray, FormControl, FormGroup } from '@angular/forms'; - -@Injectable() -export class FormErrorService { - - public mapFieldErrors(errors: { id: string; message: string }[], form: FormGroup, errorKey: string): void { - - errors.forEach(error => { - let formControl = this.getFormControl(form, error.id); - - if (formControl) { - formControl.setErrors({ - [errorKey]: error.message - }); - } - }); - } - - private getFormControl(form: FormGroup, fieldId: string): FormControl { - let fields = fieldId.split('.'); - - let group: FormGroup = form; - let inArray = false; - let control: FormControl; - fields.every((field, index) => { - if (index === fields.length - 1) { - control = group.controls[field] as FormControl; - } else { - group = group.controls[field] as FormGroup; - - if (inArray && group.controls['value']) { - group = group.controls['value'] as FormGroup; - } - - if (group && group.constructor && FormArray.name === group.constructor.name) { - inArray = true; - } else { - inArray = false; - } - } - return !!group; - }); - - return control; - } -} diff --git a/src/app/core/form/form-validators.service.spec.ts b/src/app/core/form/form-validators.service.spec.ts deleted file mode 100644 index 292d425ff..000000000 --- a/src/app/core/form/form-validators.service.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { FormValidatorsService } from './form-validators.service'; -import { CaseField } from '../../shared/domain/definition/case-field.model'; -import { aCaseField } from '../../shared/case-editor/case-edit.spec'; -import { FormControl } from '@angular/forms'; - -describe('FormValidatorsService', () => { - - let formValidatorsService: FormValidatorsService = new FormValidatorsService(); - - it('should not add REQUIRED validator for OPTIONAL fields', () => { - let formControl: FormControl = new FormControl(); - let caseField: CaseField = aCaseField('id', 'label', 'Text', 'OPTIONAL', null); - let result: FormControl = formValidatorsService.addValidators(caseField, formControl); - result.markAsTouched(); - result.updateValueAndValidity(); - expect(result.invalid).toBeFalsy(); - }); - - it('should return add REQUIRED validator for MANDATORY fields', () => { - let formControl: FormControl = new FormControl(); - let caseField: CaseField = aCaseField('id', 'label', 'Text', 'MANDATORY', null); - let result: FormControl = formValidatorsService.addValidators(caseField, formControl); - result.markAsTouched(); - result.updateValueAndValidity(); - expect(result.invalid).toBeTruthy(); - }); -}); diff --git a/src/app/core/form/form-validators.service.ts b/src/app/core/form/form-validators.service.ts deleted file mode 100644 index ebf9d384a..000000000 --- a/src/app/core/form/form-validators.service.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Injectable } from '@angular/core'; -import { CaseField } from '../../shared/domain/definition/case-field.model'; -import { FormControl, Validators } from '@angular/forms'; -import { FieldTypeEnum } from '../../shared/domain/definition/field-type-enum.model'; - -@Injectable() -export class FormValidatorsService { - static readonly MANDATORY: string = 'MANDATORY'; - private readonly CUSTOM_VALIDATED_TYPES: FieldTypeEnum[] = [ - 'Date', 'MoneyGBP' - ]; - - addValidators(caseField: CaseField, control: FormControl): FormControl { - if (caseField.display_context === FormValidatorsService.MANDATORY - && this.CUSTOM_VALIDATED_TYPES.indexOf(caseField.field_type.type) === -1) { - let validators = [Validators.required]; - if (control.validator) { - validators.push(control.validator); - } - control.setValidators(validators); - } - return control; - } -} diff --git a/src/app/core/form/form-value.service.spec.ts b/src/app/core/form/form-value.service.spec.ts deleted file mode 100644 index 3b207c7f6..000000000 --- a/src/app/core/form/form-value.service.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { FormValueService } from './form-value.service'; - -describe('FormValueService', () => { - - let formValueService: FormValueService; - - beforeEach(() => { - formValueService = new FormValueService(); - }); - - it('should return null when given null', () => { - let value = formValueService.sanitise(null); - - expect(value).toEqual(null); - }); - - it('should trim spaces from strings', () => { - let value = formValueService.sanitise({ - 'string1': ' x ', - 'string2': ' y ' - }); - - expect(value).toEqual({ - 'string1': 'x', - 'string2': 'y' - } as object); - }); - - it('should trim spaces from strings recursively', () => { - let value = formValueService.sanitise({ - 'object': { - 'string1': ' x ' - }, - 'string2': ' y ' - }); - - expect(value).toEqual({ - 'object': { - 'string1': 'x' - }, - 'string2': 'y' - } as object); - }); - - it('should trim spaces from strings in collection', () => { - let value = formValueService.sanitise({ - 'collection': [ - { - 'value': ' x ' - } - ] - }); - - expect(value).toEqual({ - 'collection': [ - { - 'value': 'x' - } - ] - } as object); - }); - - it('should convert numbers to strings', () => { - let value = formValueService.sanitise({ - 'number': 42 - }); - - expect(value).toEqual({ - 'number': '42' - } as object); - }); -}); diff --git a/src/app/core/form/form-value.service.ts b/src/app/core/form/form-value.service.ts deleted file mode 100644 index 105260ff5..000000000 --- a/src/app/core/form/form-value.service.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Injectable } from '@angular/core'; -import { CaseField } from '../../shared/domain/definition/case-field.model'; - -@Injectable() -export class FormValueService { - - public sanitise(rawValue: object): object { - return this.sanitiseObject(rawValue); - } - - filterCurrentPageFields(caseFields: CaseField[], editFrom: any): any { - let cloneForm = JSON.parse(JSON.stringify(editFrom)); - Object.keys(cloneForm['data']).forEach((key) => { - if (caseFields.findIndex((element) => element.id === key) < 0) { - delete cloneForm['data'][key]; - } - }); - return cloneForm; - } - - private sanitiseObject(rawObject: object): object { - if (!rawObject) { - return rawObject; - } - - let sanitisedObject = {}; - Object.keys(rawObject).forEach(key => { - sanitisedObject[key] = this.sanitiseValue(rawObject[key]); - }); - return sanitisedObject; - } - - private sanitiseArray(rawArray: any[]): any[] { - if (!rawArray) { - return rawArray; - } - - rawArray.forEach(item => { - if (item.hasOwnProperty('value')) { - item.value = this.sanitiseValue(item.value); - } - }); - - return rawArray; - } - - private sanitiseValue(rawValue: any): any { - if (Array.isArray(rawValue)) { - return this.sanitiseArray(rawValue); - } - - if (null === rawValue) { - return null; - } - - switch (typeof rawValue) { - case 'object': - return this.sanitiseObject(rawValue); - case 'string': - return '' === rawValue ? null : rawValue.trim(); - case 'number': - return String(rawValue); - default: - return rawValue; - } - } - -} diff --git a/src/app/core/http/http-error.model.spec.ts b/src/app/core/http/http-error.model.spec.ts deleted file mode 100644 index 22b444b39..000000000 --- a/src/app/core/http/http-error.model.spec.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { HttpError } from './http-error.model'; - -describe('HttpError', () => { - - beforeEach(() => { - jasmine.clock().uninstall(); - jasmine.clock().install(); - jasmine.clock().mockDate(new Date()); - }); - - afterEach(() => { - jasmine.clock().uninstall(); - }); - - describe('from()', () => { - - const ERROR_FULL = { - 'timestamp': '2017-05-24T15:24:17.857+0000', - 'status': 422, - 'error': 'Unprocessable Entity', - 'exception': 'uk.gov.hmcts.ccd.endpoint.exceptions.ValidationException', - 'message': 'string is not a known event ID for the specified case type TestAddressBookCase', - 'path': '/caseworkers/0/jurisdictions/TEST/case-types/TestAddressBookCase/cases' - }; - - const ERROR_PARTIAL = { - 'status': 422, - 'error': 'Unprocessable Entity', - 'exception': 'uk.gov.hmcts.ccd.endpoint.exceptions.ValidationException', - 'path': '/caseworkers/0/jurisdictions/TEST/case-types/TestAddressBookCase/cases' - }; - - it('should return default error when given empty object', () => { - let error = HttpError.from({}); - - expect(error).toEqual(new HttpError()); - }); - - it('should copy all known properties from object to error', () => { - let error = HttpError.from(ERROR_FULL); - - let expectedError = new HttpError(); - expectedError.timestamp = ERROR_FULL.timestamp; - expectedError.status = ERROR_FULL.status; - expectedError.error = ERROR_FULL.error; - expectedError.exception = ERROR_FULL.exception; - expectedError.message = ERROR_FULL.message; - expectedError.path = ERROR_FULL.path; - - expect(error).toEqual(expectedError); - }); - - it('should ignore unknown properties from object to error', () => { - let error = HttpError.from(ERROR_PARTIAL); - - let expectedError = new HttpError(); - expectedError.status = ERROR_PARTIAL.status; - expectedError.error = ERROR_PARTIAL.error; - expectedError.exception = ERROR_PARTIAL.exception; - expectedError.path = ERROR_PARTIAL.path; - - expect(error).toEqual(expectedError); - }); - - it('should ignore additional properties of object', () => { - let error = HttpError.from({ unknown: 'xxx'}); - - expect(error).toEqual(new HttpError()); - }); - - }); - -}); diff --git a/src/app/core/http/http-error.model.ts b/src/app/core/http/http-error.model.ts deleted file mode 100644 index f98af5b23..000000000 --- a/src/app/core/http/http-error.model.ts +++ /dev/null @@ -1,36 +0,0 @@ -export class HttpError { - private static readonly DEFAULT_ERROR = 'Unknown error'; - private static readonly DEFAULT_MESSAGE = 'Something unexpected happened, our technical staff have been automatically notified'; - - timestamp: string; - status: number; - error: string; - exception: string; - message: string; - path: string; - details?: any; - callbackErrors?: any; - callbackWarnings?: any; - - static from(data: object): HttpError { - let error = new HttpError(); - - Object - .keys(error) - .forEach(key => error[key] = data.hasOwnProperty(key) && data[key] ? data[key] : error[key]); - - return error; - } - - constructor() { - this.timestamp = new Date().toISOString(); - this.error = HttpError.DEFAULT_ERROR; - this.message = HttpError.DEFAULT_MESSAGE; - this.status = null; - this.exception = null; - this.path = null; - this.details = null; - this.callbackErrors = null; - this.callbackWarnings = null; - } -} diff --git a/src/app/core/http/http-error.service.spec.ts b/src/app/core/http/http-error.service.spec.ts deleted file mode 100644 index 88ede52ac..000000000 --- a/src/app/core/http/http-error.service.spec.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { HttpErrorService } from './http-error.service'; -import { HttpError } from './http-error.model'; -import { Headers, Response, ResponseOptions } from '@angular/http'; -import { AuthService } from '../auth/auth.service'; - -describe('HttpErrorService', () => { - const CURRENT_URL = 'http://core-case-data.common-components.reform'; - const ERROR_MESSAGE = 'Nein! Nein! Nein!'; - const VALID_ERROR_BODY = { - 'timestamp': '2017-05-24T15:24:17.857+0000', - 'status': 422, - 'error': 'Unprocessable Entity', - 'exception': 'uk.gov.hmcts.ccd.endpoint.exceptions.ValidationException', - 'message': 'string is not a known event ID for the specified case type TestAddressBookCase', - 'path': '/caseworkers/0/jurisdictions/TEST/case-types/TestAddressBookCase/cases' - }; - - const HTTP_401_ERROR_BODY = { - 'timestamp': '2017-05-24T15:24:17.857+0000', - 'status': 401, - 'error': 'Unauthorized', - 'message': 'Unauthorized user...', - 'path': CURRENT_URL - }; - const HTTP_403_ERROR_BODY = { - 'timestamp': '2017-05-24T15:24:17.857+0000', - 'status': 403, - 'error': 'Forbidden', - 'message': 'The server understood the request but refuses to authorize it....', - 'path': CURRENT_URL - }; - const VALID_ERROR_RESPONSE = new Response(new ResponseOptions({ - headers: new Headers({ - 'Content-Type': 'application/json', - }), - body: JSON.stringify(VALID_ERROR_BODY), - status: 422 - })); - const VALID_ERROR_RESPONSE_WITH_CHARSET = new Response(new ResponseOptions({ - headers: new Headers({ - 'Content-Type': 'application/json;charset=UTF-8', - }), - body: JSON.stringify(VALID_ERROR_BODY), - status: 422 - })); - - const NOT_VALID_ERROR_RESPONSE = new Response(new ResponseOptions({ - headers: new Headers({ - 'Content-Type': 'application/json', - }), - body: '{notvalidjson}' - })); - - const HTTP_401_RESPONSE = new Response(new ResponseOptions({ - headers: new Headers({ - 'Content-Type': 'application/json', - }), - body: JSON.stringify(HTTP_401_ERROR_BODY), - status: 401 - })); - - const HTTP_403_RESPONSE = new Response(new ResponseOptions({ - headers: new Headers({ - 'Content-Type': 'application/json', - }), - body: JSON.stringify(HTTP_403_ERROR_BODY), - status: 403 - })); - - let authService: any; - let errorService: HttpErrorService; - - beforeEach(() => { - authService = jasmine.createSpyObj('authService', ['signIn']); - - errorService = new HttpErrorService(authService); - - jasmine.clock().uninstall(); - jasmine.clock().install(); - jasmine.clock().mockDate(new Date()); - }); - - afterEach(() => { - jasmine.clock().uninstall(); - }); - - describe('handle()', () => { - - it('should return default error when no error given', (done) => { - errorService.handle(null) - .subscribe( - () => fail('no error'), - error => { - expect(error).not.toBeNull(); - expect(error.error).toEqual('Unknown error'); - expect(error.message).toEqual('Something unexpected happened, our technical staff have been automatically notified'); - done(); - } - ); - }); - - it('should convert a valid Response error into an HttpError', (done) => { - errorService.handle(VALID_ERROR_RESPONSE) - .subscribe( - () => fail('no error'), - error => { - expect(error).toEqual(HttpError.from(VALID_ERROR_BODY)); - done(); - } - ); - }); - - it('should handle a valid Response with charsetInfo', (done) => { - errorService.handle(VALID_ERROR_RESPONSE_WITH_CHARSET) - .subscribe( - () => fail('no error'), - error => { - expect(error).toEqual(HttpError.from(VALID_ERROR_BODY)); - done(); - } - ); - }); - - it('should convert a non-valid Response error into an HttpError', (done) => { - errorService.handle(NOT_VALID_ERROR_RESPONSE) - .subscribe( - () => fail('no error'), - error => { - expect(error).toEqual(new HttpError()); - done(); - } - ); - }); - - it('should use message when error is an unknown object with a message property', (done) => { - let expectedError = new HttpError(); - expectedError.message = ERROR_MESSAGE; - - errorService.handle({ - message: ERROR_MESSAGE - }) - .subscribe( - () => fail('no error'), - error => { - expect(error).toEqual(expectedError); - done(); - } - ); - }); - - it('should trigger sign-in when IDAM returns HTTP-401 as response', () => { - errorService.handle(HTTP_401_RESPONSE); - expect(authService.signIn).toHaveBeenCalled(); - }); - - it('should trigger sign-in when IDAM returns HTTP-403 as response', () => { - errorService.handle(HTTP_403_RESPONSE); - expect(authService.signIn).toHaveBeenCalled(); - }); - - it('should empty error when removed', () => { - errorService.setError(VALID_ERROR_BODY); - - let error = errorService.removeError(); - - expect(error).toEqual(VALID_ERROR_BODY); - - error = errorService.removeError(); - - expect(error).toEqual(null); - }); - }); -}); diff --git a/src/app/core/http/http-error.service.ts b/src/app/core/http/http-error.service.ts deleted file mode 100644 index d858bd3da..000000000 --- a/src/app/core/http/http-error.service.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Injectable } from '@angular/core'; -import { HttpError } from './http-error.model'; -import { Observable, throwError } from 'rxjs'; -import { Response } from '@angular/http'; -import { AuthService } from '../auth/auth.service'; - -@Injectable() -export class HttpErrorService { - - private static readonly CONTENT_TYPE = 'Content-Type'; - private static readonly APPLICATION_JSON = 'application/json'; - - private error: HttpError; - - constructor(private authService: AuthService) { - } - - setError(error: HttpError) { - this.error = error; - } - - removeError(): HttpError { - let error = this.error; - this.error = null; - return error; - } - - handle(error: Response | any, redirectIfNotAuthorised = true): Observable { - let httpError = new HttpError(); - if (error instanceof Response) { - if (error.headers - && error.headers.get(HttpErrorService.CONTENT_TYPE) - && error.headers.get(HttpErrorService.CONTENT_TYPE).startsWith(HttpErrorService.APPLICATION_JSON)) { - try { - httpError = HttpError.from(error.json() || {}); - } catch (e) { - console.error(e, e.message); - } - } - if (!httpError.status) { - httpError.status = error.status; - } - } else if (error) { - if (error.message) { - httpError.message = error.message; - } - if (error.status) { - httpError.status = error.status; - } - } - if (redirectIfNotAuthorised && (httpError.status === 401 || httpError.status === 403)) { - this.authService.signIn(); - } - - return throwError(httpError); - } -} diff --git a/src/app/core/http/http.service.spec.ts b/src/app/core/http/http.service.spec.ts deleted file mode 100644 index 3422d3fa6..000000000 --- a/src/app/core/http/http.service.spec.ts +++ /dev/null @@ -1,289 +0,0 @@ -import { HttpService } from './http.service'; -import { Headers, Http, RequestOptionsArgs, Response, ResponseOptions } from '@angular/http'; -import createSpyObj = jasmine.createSpyObj; -import any = jasmine.any; -import { HttpErrorService } from './http-error.service'; -import { Observable, of, throwError } from 'rxjs'; - -describe('HttpService', () => { - - const URL = 'http://ccd.reform/'; - const HEADER_1 = 'x-header1'; - const HEADER_1_VALUE = 'x-header1-value'; - const HEADERS = new Headers({}); - const CONTENT_TYPE_HEADER = 'Content-Type'; - const CONTENT_TYPE_HEADER_VALUE = 'X-rated'; - const ACCEPT_HEADER = 'Accept'; - const ACCEPT_HEADER_VALUE = 'text/ccd'; - const HEADERS_WITH_CONTENT_TYPE_DEFINED = new Headers({}); - const HEADERS_WITH_CONTENT_TYPE_NULL = new Headers({}); - const BODY = JSON.stringify({}); - const error = { - message: '' - }; - HEADERS.append(HEADER_1, HEADER_1_VALUE); - HEADERS_WITH_CONTENT_TYPE_DEFINED.append(CONTENT_TYPE_HEADER, CONTENT_TYPE_HEADER_VALUE); - HEADERS_WITH_CONTENT_TYPE_DEFINED.append(ACCEPT_HEADER, ACCEPT_HEADER_VALUE); - HEADERS_WITH_CONTENT_TYPE_NULL.append(CONTENT_TYPE_HEADER, null); - HEADERS_WITH_CONTENT_TYPE_NULL.append(ACCEPT_HEADER, null); - const EXPECTED_RESPONSE = of(new Response(new ResponseOptions())); - - let httpService: HttpService; - - let httpMock: any; - let httpErrorService: any; - let catchObservable: any; - - beforeEach(() => { - catchObservable = createSpyObj>('observable', ['pipe']); - catchObservable.pipe.and.returnValue(EXPECTED_RESPONSE); - - httpMock = createSpyObj('http', ['get', 'post', 'put', 'delete']); - httpMock.get.and.returnValue(catchObservable); - httpMock.post.and.returnValue(catchObservable); - httpMock.put.and.returnValue(catchObservable); - httpMock.delete.and.returnValue(catchObservable); - - httpErrorService = createSpyObj('httpErrorService', ['handle']); - httpErrorService.handle.and.returnValue(throwError(error)); - - httpService = new HttpService(httpMock, httpErrorService); - }); - - describe('get', () => { - - it('should forward simple call to Angular Http service', () => { - let response = httpService.get(URL); - - expect(httpMock.get).toHaveBeenCalledWith(URL, any(Object)); - expect(response).toBe(EXPECTED_RESPONSE); - }); - - it('should forward headers to Angular Http service', () => { - let options: RequestOptionsArgs = { - headers: HEADERS, - withCredentials: true, - }; - - httpService.get(URL, options); - - expect(httpMock.get).toHaveBeenCalledWith(URL, options); - }); - - it('should sanitise headers when provided', () => { - let options: RequestOptionsArgs = { - headers: HEADERS, - withCredentials: true, - }; - - httpService.get(URL, options); - - expectHeadersToBeSanitized(httpMock.get.calls.mostRecent().args[1]); - }); - - it('should not add `content-type` and `accept` headers when defined', () => { - let options: RequestOptionsArgs = { - headers: HEADERS_WITH_CONTENT_TYPE_DEFINED, - withCredentials: true, - }; - - httpService.get(URL, options); - - let headers = httpMock.get.calls.mostRecent().args[1].headers; - expect(headers.get('Content-Type')).toEqual(CONTENT_TYPE_HEADER_VALUE); - expect(headers.get('Accept')).toEqual(ACCEPT_HEADER_VALUE); - }); - - it('should not add `content-type` and `accept` headers when defined with null values', () => { - let options: RequestOptionsArgs = { - headers: HEADERS_WITH_CONTENT_TYPE_NULL, - withCredentials: true, - }; - - httpService.get(URL, options); - - let headers = httpMock.get.calls.mostRecent().args[1].headers; - expect(headers.get('Content-Type')).toBe(null); - expect(headers.get('Accept')).toBe(null); - }); - - it('should add `content-type` and `accept` headers when not defined', () => { - let options: RequestOptionsArgs = { - headers: HEADERS, - withCredentials: true, - }; - - httpService.get(URL, options); - - let headers = httpMock.get.calls.mostRecent().args[1].headers; - expect(headers.get('Content-Type')).toEqual('application/json'); - expect(headers.get('Accept')).toEqual('application/json'); - }); - - it('should catch with http-error service', () => { - httpMock.get.and.returnValue(throwError(error)); - httpService.get(URL).subscribe(() => {}, () => {}); - expect(httpErrorService.handle).toHaveBeenCalledWith(error, true); - }); - }); - - describe('post', () => { - - it('should forward simple call to Angular Http service', () => { - let response = httpService.post(URL, BODY); - - expect(httpMock.post).toHaveBeenCalledWith(URL, BODY, any(Object)); - expect(response).toBe(EXPECTED_RESPONSE); - }); - - it('should forward headers to Angular Http service', () => { - let options: RequestOptionsArgs = { - headers: HEADERS, - withCredentials: true, - }; - - httpService.post(URL, BODY, options); - - expect(httpMock.post).toHaveBeenCalledWith(URL, BODY, options); - }); - - it('should sanitise headers when provided', () => { - let options: RequestOptionsArgs = { - headers: HEADERS, - withCredentials: true, - }; - - httpService.post(URL, BODY, options); - - expectHeadersToBeSanitized(httpMock.post.calls.mostRecent().args[2]); - }); - - it('should catch with http-error service', () => { - httpMock.post.and.returnValue(Observable.throw(error)); - httpService.post(URL, BODY).subscribe(() => {}, () => {}); - expect(httpErrorService.handle).toHaveBeenCalledWith(error, true); - }); - - it('should add a `content-type` and `accept` headers', () => { - let options: RequestOptionsArgs = { - headers: HEADERS, - withCredentials: true, - }; - - httpService.post(URL, BODY, options); - - let headers = httpMock.post.calls.mostRecent().args[2].headers; - expect(headers.get('Content-Type')).toEqual('application/json'); - expect(headers.get('Accept')).toEqual('application/json'); - }); - }); - - describe('put', () => { - - it('should forward simple call to Angular Http service', () => { - let response = httpService.put(URL, BODY); - - expect(httpMock.put).toHaveBeenCalledWith(URL, BODY, any(Object)); - expect(response).toBe(EXPECTED_RESPONSE); - }); - - it('should forward headers to Angular Http service', () => { - let options: RequestOptionsArgs = { - headers: HEADERS, - withCredentials: true, - }; - - httpService.put(URL, BODY, options); - - expect(httpMock.put).toHaveBeenCalledWith(URL, BODY, options); - }); - - it('should sanitise headers when provided', () => { - let options: RequestOptionsArgs = { - headers: HEADERS, - withCredentials: true, - }; - - httpService.put(URL, BODY, options); - - expectHeadersToBeSanitized(httpMock.put.calls.mostRecent().args[2]); - }); - - it('should catch with http-error service', () => { - httpMock.put.and.returnValue(Observable.throw(error)); - httpService.put(URL, BODY).subscribe(() => {}, () => {}); - expect(httpErrorService.handle).toHaveBeenCalledWith(error); - }); - - it('should add a `content-type` and `accept` headers', () => { - let options: RequestOptionsArgs = { - headers: HEADERS, - withCredentials: true, - }; - - httpService.put(URL, BODY, options); - - let headers = httpMock.put.calls.mostRecent().args[2].headers; - expect(headers.get('Content-Type')).toEqual('application/json'); - expect(headers.get('Accept')).toEqual('application/json'); - }); - }); - - describe('delete', () => { - - it('should forward simple call to Angular Http service', () => { - let response = httpService.delete(URL); - - expect(httpMock.delete).toHaveBeenCalledWith(URL, any(Object)); - expect(response).toBe(EXPECTED_RESPONSE); - }); - - it('should forward headers to Angular Http service', () => { - let options: RequestOptionsArgs = { - headers: HEADERS, - withCredentials: true, - }; - - httpService.delete(URL, options); - - expect(httpMock.delete).toHaveBeenCalledWith(URL, options); - }); - - it('should sanitise headers when provided', () => { - let options: RequestOptionsArgs = { - headers: HEADERS, - withCredentials: true, - }; - - httpService.delete(URL, options); - - expectHeadersToBeSanitized(httpMock.delete.calls.mostRecent().args[1]); - }); - - it('should catch with http-error service', () => { - httpMock.delete.and.returnValue(Observable.throw(error)); - httpService.delete(URL).subscribe(() => {}, () => {}); - expect(httpErrorService.handle).toHaveBeenCalledWith(error); - }); - - it('should add a `content-type` and `accept` headers', () => { - let options: RequestOptionsArgs = { - headers: HEADERS, - withCredentials: true, - }; - - httpService.delete(URL, options); - - let headers = httpMock.delete.calls.mostRecent().args[1].headers; - expect(headers.get('Content-Type')).toEqual('application/json'); - expect(headers.get('Accept')).toEqual('application/json'); - }); - }); - - function expectHeadersToBeSanitized(options) { - let headers = options.headers; - - expect(headers).toBeDefined(); - expect(headers.get(HEADER_1)).toEqual(HEADER_1_VALUE); - } -}); diff --git a/src/app/core/http/http.service.ts b/src/app/core/http/http.service.ts deleted file mode 100644 index a73684bd7..000000000 --- a/src/app/core/http/http.service.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable, throwError } from 'rxjs'; -import { Headers, Http, RequestOptionsArgs, Response } from '@angular/http'; -import { HttpErrorService } from './http-error.service'; -import 'rxjs/add/operator/catch'; -import { catchError } from 'rxjs/operators'; - -@Injectable() -export class HttpService { - - private static readonly HEADER_ACCEPT = 'Accept'; - private static readonly HEADER_CONTENT_TYPE = 'Content-Type'; - - constructor( - private http: Http, - private httpErrorService: HttpErrorService - ) {} - - /** - * - * @param url Url resolved using UrlResolverService - * @param options - * @returns {Observable} - * @see UrlResolverService - */ - public get(url: string, options?: RequestOptionsArgs, redirectIfNotAuthorised = true): Observable { - return this.http - .get(url, this.sanitiseOptions(options)) - .pipe( - catchError(res => { - return this.httpErrorService.handle(res, redirectIfNotAuthorised); - }) - ); - } - - /** - * - * @param url Url resolved using UrlResolverService - * @param body - * @param options - * @returns {Observable} - * @see UrlResolverService - */ - public post(url: string, body: any, options?: RequestOptionsArgs, redirectIfNotAuthorised = true): Observable { - return this.http - .post(url, body, this.sanitiseOptions(options)) - .pipe( - catchError(res => { - return this.httpErrorService.handle(res, redirectIfNotAuthorised); - }) - ); - } - - /** - * - * @param url Url resolved using UrlResolverService - * @param body - * @param options - * @returns {Observable} - * @see UrlResolverService - */ - public put(url: string, body: any, options?: RequestOptionsArgs): Observable { - return this.http - .put(url, body, this.sanitiseOptions(options)) - .pipe( - catchError(res => { - return this.httpErrorService.handle(res); - }) - ); - } - - /** - * - * @param url Url resolved using UrlResolverService - * @param options - * @returns {Observable} - * @see UrlResolverService - */ - public delete(url: string, options?: RequestOptionsArgs): Observable { - return this.http - .delete(url, this.sanitiseOptions(options)) - .pipe( - catchError(res => { - return this.httpErrorService.handle(res); - }) - ); - } - - private sanitiseOptions(options?: RequestOptionsArgs): RequestOptionsArgs { - options = options || {}; - options.withCredentials = true; - - this.sanitiseHeaders(options); - - return options; - } - - private sanitiseHeaders(options?: RequestOptionsArgs) { - if (!options.headers) { - options.headers = new Headers(); - } - - if (!options.headers.has(HttpService.HEADER_ACCEPT)) { - options.headers.set(HttpService.HEADER_ACCEPT, 'application/json'); - } - if (!options.headers.has(HttpService.HEADER_CONTENT_TYPE)) { - options.headers.set(HttpService.HEADER_CONTENT_TYPE, 'application/json'); - } - - if (null === options.headers.get(HttpService.HEADER_CONTENT_TYPE)) { - options.headers.delete(HttpService.HEADER_CONTENT_TYPE); - } - } -} diff --git a/src/app/core/order/order.service.spec.ts b/src/app/core/order/order.service.spec.ts deleted file mode 100644 index 10549e51b..000000000 --- a/src/app/core/order/order.service.spec.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { OrderService } from './order.service'; - -describe('OrderService', () => { - - let orderService: OrderService; - - const ITEM_X = { id: 1, order: undefined }; - const ITEM_0 = { id: 0, order: 0 }; - const ITEM_1 = { id: 1, order: 1 }; - const ITEM_2 = { id: 2, order: 2 }; - - beforeEach(() => { - orderService = new OrderService(); - }); - - describe('sortAsc', () => { - - it('should sort in ascending order', () => { - expect(orderService.sortAsc(ITEM_1, ITEM_2)).toBe(-1); - expect(orderService.sortAsc(ITEM_2, ITEM_1)).toBe(1); - }); - - it('should keep order of items with same order', () => { - expect(orderService.sortAsc(ITEM_1, ITEM_1)).toBe(0); - }); - - it('should sort items without order at the end', () => { - expect(orderService.sortAsc(ITEM_X, ITEM_1)).toBe(1); - }); - - it('should keep order of items without order', () => { - expect(orderService.sortAsc(ITEM_X, ITEM_X)).toBe(0); - }); - - it('should consider 0 as a lower order', () => { - expect(orderService.sortAsc(ITEM_1, ITEM_0)).toBe(1); - }); - }); - - describe('sort', () => { - it('should return cloned array', () => { - let array = [ITEM_0, ITEM_1, ITEM_2]; - let arrayClone = [ITEM_0, ITEM_1, ITEM_2]; - - spyOn(array, 'slice').and.returnValue(arrayClone); - - let sortedArray = orderService.sort(array); - - expect(array.slice).toHaveBeenCalledWith(); - expect(sortedArray).toEqual(arrayClone); - }); - - it('should sort cloned array by ascending order', () => { - let array = [ITEM_2, ITEM_1, ITEM_0]; - let arrayClone = [ITEM_2, ITEM_1, ITEM_0]; - let arrayExpected = [ITEM_0, ITEM_1, ITEM_2]; - - spyOn(array, 'slice').and.returnValue(arrayClone); - spyOn(arrayClone, 'sort').and.returnValue(arrayExpected); - - let sortedArray = orderService.sort(array); - - expect(arrayClone.sort).toHaveBeenCalledWith(orderService.sortAsc); - expect(sortedArray).toBe(arrayExpected); - }); - }); - -}); diff --git a/src/app/core/order/order.service.ts b/src/app/core/order/order.service.ts deleted file mode 100644 index 6a476c28d..000000000 --- a/src/app/core/order/order.service.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Orderable } from './orderable.model'; - -@Injectable() -export class OrderService { - - /** - * @deprecated Use `sort` function instead or `compareAsc` - * @type {(a:Orderable, b:Orderable)=>number} - */ - sortAsc = OrderService.DEFAULT_COMPARE_FUNCTION; - - private static readonly DEFAULT_COMPARE_FUNCTION = (a: Orderable, b: Orderable) => { - let aOrdered = a.order === 0 || a.order; - let bOrdered = b.order === 0 || b.order; - - if (!aOrdered) { - return !bOrdered ? 0 : 1; - } - - if (!bOrdered) { - return -1; - } - - return a.order - b.order; - } - - /** - * Clone and sort array. Ascending order used by default. - * - * @param array Array to sort - * @returns {Orderable[]} Sorted clone array. - */ - sort(array: T[], sortingFunction = this.sortAsc): T[] { - return array - .slice() - .sort(sortingFunction); - } - -} diff --git a/src/app/core/order/orderable.model.ts b/src/app/core/order/orderable.model.ts deleted file mode 100644 index 827c60f98..000000000 --- a/src/app/core/order/orderable.model.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface Orderable { - order?: number; -} diff --git a/src/app/core/pagination/pagination.service.spec.ts b/src/app/core/pagination/pagination.service.spec.ts index af9e28b5b..60edcc94f 100644 --- a/src/app/core/pagination/pagination.service.spec.ts +++ b/src/app/core/pagination/pagination.service.spec.ts @@ -1,10 +1,10 @@ import { Response, ResponseOptions, URLSearchParams, RequestOptionsArgs } from '@angular/http'; import { AppConfig } from '../../app.config'; import createSpyObj = jasmine.createSpyObj; -import { HttpService } from '../http/http.service'; import { PaginationService } from './pagination.service'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { RequestOptionsBuilder } from '../request.options.builder'; +import { HttpService } from '@hmcts/ccd-case-ui-toolkit'; describe('PaginationService', () => { diff --git a/src/app/core/pagination/pagination.service.ts b/src/app/core/pagination/pagination.service.ts index 510856bfe..f1868c90a 100644 --- a/src/app/core/pagination/pagination.service.ts +++ b/src/app/core/pagination/pagination.service.ts @@ -4,8 +4,8 @@ import { RequestOptionsArgs } from '@angular/http'; import 'rxjs/add/operator/map'; import { Observable } from 'rxjs'; import { PaginationMetadata } from '../../shared/search/pagination-metadata.model'; -import { HttpService } from '../http/http.service'; import { RequestOptionsBuilder } from '../request.options.builder'; +import { HttpService } from '@hmcts/ccd-case-ui-toolkit'; @Injectable() export class PaginationService { diff --git a/src/app/core/profile/profile.service.spec.ts b/src/app/core/profile/profile.service.spec.ts index 509eaed52..4d2d5b094 100644 --- a/src/app/core/profile/profile.service.spec.ts +++ b/src/app/core/profile/profile.service.spec.ts @@ -2,10 +2,10 @@ import { ProfileService } from './profile.service'; import { Profile } from './profile.model'; import { AppConfig } from '../../app.config'; import createSpyObj = jasmine.createSpyObj; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { Response, ResponseOptions } from '@angular/http'; -import { HttpService } from '../http/http.service'; import { createAProfile } from './profile.test.fixture'; +import { HttpService } from '@hmcts/ccd-case-ui-toolkit'; describe('ProfileService', () => { diff --git a/src/app/core/profile/profile.service.ts b/src/app/core/profile/profile.service.ts index 865a7d5f2..592074ba2 100644 --- a/src/app/core/profile/profile.service.ts +++ b/src/app/core/profile/profile.service.ts @@ -4,8 +4,8 @@ import { Observable } from 'rxjs'; import { Response } from '@angular/http'; import 'rxjs/add/operator/map'; import { AppConfig } from '../../app.config'; -import { HttpService } from '../http/http.service'; import { plainToClass } from 'class-transformer'; +import { HttpService } from '@hmcts/ccd-case-ui-toolkit'; @Injectable() export class ProfileService { diff --git a/src/app/core/search/field.model.ts b/src/app/core/search/field.model.ts index bc6572378..35a844ecf 100644 --- a/src/app/core/search/field.model.ts +++ b/src/app/core/search/field.model.ts @@ -1,4 +1,4 @@ -import { FieldType } from '../../shared/domain/definition/field-type.model'; +import { FieldType } from '@hmcts/ccd-case-ui-toolkit'; export class Field { constructor( diff --git a/src/app/core/search/search-input.model.ts b/src/app/core/search/search-input.model.ts index 3a224f563..6954d153e 100644 --- a/src/app/core/search/search-input.model.ts +++ b/src/app/core/search/search-input.model.ts @@ -1,5 +1,5 @@ import { Field } from './field.model'; -import { Orderable } from '../order/orderable.model'; +import { Orderable } from '@hmcts/ccd-case-ui-toolkit'; export class SearchInput implements Orderable { constructor( diff --git a/src/app/core/search/search-input.test.fixture.ts b/src/app/core/search/search-input.test.fixture.ts index 413a32f92..a0cd6de11 100644 --- a/src/app/core/search/search-input.test.fixture.ts +++ b/src/app/core/search/search-input.test.fixture.ts @@ -1,6 +1,6 @@ import { SearchInput } from './search-input.model'; import { Field } from './field.model'; -import { FieldType } from '../../shared/domain/definition/field-type.model'; +import { FieldType } from '@hmcts/ccd-case-ui-toolkit'; export let createSearchInputs = () => { const fieldType = new FieldType(); diff --git a/src/app/core/search/search.service.spec.ts b/src/app/core/search/search.service.spec.ts index d38cf4562..625d19eb1 100644 --- a/src/app/core/search/search.service.spec.ts +++ b/src/app/core/search/search.service.spec.ts @@ -4,10 +4,9 @@ import { AppConfig } from '../../app.config'; import createSpyObj = jasmine.createSpyObj; import { SearchInput } from './search-input.model'; import { Field } from './field.model'; -import { HttpService } from '../http/http.service'; -import { Observable } from 'rxjs/Observable'; -import { FieldType } from '../../shared/domain/definition/field-type.model'; +import { Observable } from 'rxjs'; import { RequestOptionsBuilder } from '../request.options.builder'; +import { HttpService, FieldType } from '@hmcts/ccd-case-ui-toolkit'; describe('SearchService', () => { diff --git a/src/app/core/search/search.service.ts b/src/app/core/search/search.service.ts index 3b2e6a450..abaef00bb 100644 --- a/src/app/core/search/search.service.ts +++ b/src/app/core/search/search.service.ts @@ -5,8 +5,8 @@ import 'rxjs/add/operator/map'; import { Observable } from 'rxjs'; import { SearchResultView } from '../../shared/search/search-result-view.model'; import { SearchInput } from './search-input.model'; -import { HttpService } from '../http/http.service'; import { RequestOptionsBuilder, SearchView } from '../request.options.builder'; +import { HttpService } from '@hmcts/ccd-case-ui-toolkit'; @Injectable() export class SearchService { diff --git a/src/app/error/error.component.ts b/src/app/error/error.component.ts index fbc012bb2..83079b77a 100644 --- a/src/app/error/error.component.ts +++ b/src/app/error/error.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { HttpErrorService } from '../core/http/http-error.service'; +import { HttpErrorService } from '@hmcts/ccd-case-ui-toolkit'; @Component({ templateUrl: './error.html' diff --git a/src/app/fixture/shared.fixture.ts b/src/app/fixture/shared.fixture.ts deleted file mode 100644 index 89fb8bdb5..000000000 --- a/src/app/fixture/shared.fixture.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { CaseField } from '../shared/domain/definition/case-field.model'; -import { CaseEventTrigger } from '../shared/domain/case-view/case-event-trigger.model'; - -export let createCaseEventTrigger = (id: string, - name: string, - case_id: string, - show_summary: boolean, - case_fields: CaseField[], - wizard_pages = [], - can_save_draft = false) => { - const eventTrigger = new CaseEventTrigger(); - - eventTrigger.id = id; - eventTrigger.name = name; - eventTrigger.case_id = case_id; - eventTrigger.show_summary = show_summary; - eventTrigger.wizard_pages = wizard_pages; - eventTrigger.event_token = 'test-token'; - eventTrigger.case_fields = case_fields; - eventTrigger.can_save_draft = can_save_draft; - return eventTrigger; -}; diff --git a/src/app/oauth2/oauth2-redirect.component.spec.ts b/src/app/oauth2/oauth2-redirect.component.spec.ts index fe4f26588..de1d3f49b 100644 --- a/src/app/oauth2/oauth2-redirect.component.spec.ts +++ b/src/app/oauth2/oauth2-redirect.component.spec.ts @@ -1,12 +1,12 @@ import { OAuth2RedirectComponent } from './oauth2-redirect.component'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { DebugElement } from '@angular/core'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { By } from '@angular/platform-browser'; import { ActivatedRoute, Router } from '@angular/router'; import { OAuth2Service } from '../core/auth/oauth2.service'; import createSpyObj = jasmine.createSpyObj; -import { AuthService } from '../core/auth/auth.service'; +import { AuthService } from '@hmcts/ccd-case-ui-toolkit'; describe('OAuth2RedirectComponent', () => { const ROUTE_WITH_CODE = { diff --git a/src/app/oauth2/oauth2-redirect.component.ts b/src/app/oauth2/oauth2-redirect.component.ts index 2cdfe3b9c..a7286f469 100644 --- a/src/app/oauth2/oauth2-redirect.component.ts +++ b/src/app/oauth2/oauth2-redirect.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { OAuth2Service } from '../core/auth/oauth2.service'; -import { AuthService } from '../core/auth/auth.service'; +import { AuthService } from '@hmcts/ccd-case-ui-toolkit'; @Component({ templateUrl: './oauth2-redirect.html', diff --git a/src/app/shared/action-dialog.component.scss b/src/app/shared/action-dialog.component.scss deleted file mode 100644 index 8519b84bc..000000000 --- a/src/app/shared/action-dialog.component.scss +++ /dev/null @@ -1,22 +0,0 @@ -.x { - margin: 0; - padding: 9px 9px 0px 0px; - font-size: 24px; - font-weight: bold; - font-style: normal; - font-stretch: normal; - cursor: pointer; - color: #6e7071; -} -.dialog-header { - text-align: right; -} -.dialog-title { - margin: 0px 0px 21px 25px; -} -.dialog-info { - margin: 0px 0px 21px 25px; -} -.action-button { - margin: 0px 15px 0px 25px; -} diff --git a/src/app/shared/case-editor/case-edit-confirm.component.spec.ts b/src/app/shared/case-editor/case-edit-confirm.component.spec.ts index 7fd6d6aff..a2e4680b2 100644 --- a/src/app/shared/case-editor/case-edit-confirm.component.spec.ts +++ b/src/app/shared/case-editor/case-edit-confirm.component.spec.ts @@ -5,10 +5,8 @@ import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; import { RouterTestingModule } from '@angular/router/testing'; import { Router } from '@angular/router'; import { CaseEditConfirmComponent } from './case-edit-confirm.component'; -import { WizardPage } from '../domain/wizard-page.model'; -import { MarkdownModule } from '../markdown/markdown.module'; import { By } from '@angular/platform-browser'; -import { CaseReferencePipe } from '../utils/case-reference.pipe'; +import { WizardPage, MarkdownModule, CaseReferencePipe } from '@hmcts/ccd-case-ui-toolkit'; describe('CaseEditConfirmComponent', () => { let fixture: ComponentFixture; diff --git a/src/app/shared/case-editor/case-edit-confirm.component.ts b/src/app/shared/case-editor/case-edit-confirm.component.ts index 00eea040e..d275ecd9b 100644 --- a/src/app/shared/case-editor/case-edit-confirm.component.ts +++ b/src/app/shared/case-editor/case-edit-confirm.component.ts @@ -3,7 +3,7 @@ import { FormControl } from '@angular/forms'; import { CaseEditComponent } from './case-edit.component'; import { Router } from '@angular/router'; import { Confirmation } from './confirmation.model'; -import { CaseEventTrigger } from '../domain/case-view/case-event-trigger.model'; +import { CaseEventTrigger } from '@hmcts/ccd-case-ui-toolkit'; @Component({ templateUrl: './case-edit-confirm.html', diff --git a/src/app/shared/case-editor/case-edit-form.component.ts b/src/app/shared/case-editor/case-edit-form.component.ts index 1b70d9416..0302f573a 100644 --- a/src/app/shared/case-editor/case-edit-form.component.ts +++ b/src/app/shared/case-editor/case-edit-form.component.ts @@ -1,8 +1,7 @@ import { Component, Input, Output, EventEmitter, AfterViewInit, OnDestroy } from '@angular/core'; -import { CaseField } from '../domain/definition/case-field.model'; import { FormGroup } from '@angular/forms'; -import { FormValueService } from '../../core/form/form-value.service'; import { Subject, Subscription } from 'rxjs'; +import { CaseField, FormValueService } from '@hmcts/ccd-case-ui-toolkit'; @Component({ selector: 'ccd-case-edit-form', diff --git a/src/app/shared/case-editor/case-edit-page.component.spec.ts b/src/app/shared/case-editor/case-edit-page.component.spec.ts index 19c5fb077..6a03d33a1 100644 --- a/src/app/shared/case-editor/case-edit-page.component.spec.ts +++ b/src/app/shared/case-editor/case-edit-page.component.spec.ts @@ -4,22 +4,15 @@ import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; import { By } from '@angular/platform-browser'; import { CaseEditComponent } from './case-edit.component'; import { ActivatedRoute } from '@angular/router'; -import { WizardPage } from '../domain/wizard-page.model'; -import { CaseField } from '../domain/definition/case-field.model'; -import { FormValueService } from '../../core/form/form-value.service'; -import { FormErrorService } from '../../core/form/form-error.service'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { FormControl, FormGroup } from '@angular/forms'; -import { CaseFieldService } from '../domain/case-field.service'; -import { aCaseField } from './case-edit.spec'; -import { CaseReferencePipe } from '../utils/case-reference.pipe'; import { PageValidationService } from './page-validation.service'; -import { CaseEventData } from '../domain/case-event-data'; -import { Draft } from '../domain/draft'; +import { WizardPage, CaseField, FormValueService, FormErrorService, CaseFieldService, aCaseField, + CaseReferencePipe, CaseEventData, Draft, SaveOrDiscardDialogComponent } from '@hmcts/ccd-case-ui-toolkit'; import createSpyObj = jasmine.createSpyObj; -import { MatDialog, MatDialogRef, MatDialogConfig } from '@angular/material'; -import { SaveOrDiscardDialogComponent } from '../save-or-discard-dialog/save-or-discard-dialog.component'; +import { MatDialog, MatDialogRef } from '@angular/material'; import { CaseCreatorSubmitComponent } from '../../cases/creator/case-creator-submit.component'; +import { CaseViewerComponent } from '../../cases/viewer/case-viewer.component'; describe('CaseEditPageComponent', () => { @@ -172,7 +165,7 @@ describe('CaseEditPageComponent', () => { comp.formValuesChanged = false; snapshot.queryParamMap.get.and.callFake(key => { switch (key) { - case CaseCreatorSubmitComponent.ORIGIN_QUERY_PARAM: + case CaseViewerComponent.ORIGIN_QUERY_PARAM: return 'viewDraft'; } }); @@ -200,7 +193,7 @@ describe('CaseEditPageComponent', () => { comp.formValuesChanged = true; snapshot.queryParamMap.get.and.callFake(key => { switch (key) { - case CaseCreatorSubmitComponent.ORIGIN_QUERY_PARAM: + case CaseViewerComponent.ORIGIN_QUERY_PARAM: return 'viewDraft'; } }); @@ -230,7 +223,7 @@ describe('CaseEditPageComponent', () => { comp.formValuesChanged = true; snapshot.queryParamMap.get.and.callFake(key => { switch (key) { - case CaseCreatorSubmitComponent.ORIGIN_QUERY_PARAM: + case CaseViewerComponent.ORIGIN_QUERY_PARAM: return 'viewDraft'; } }); diff --git a/src/app/shared/case-editor/case-edit-page.component.ts b/src/app/shared/case-editor/case-edit-page.component.ts index 6665ad304..0436f7772 100644 --- a/src/app/shared/case-editor/case-edit-page.component.ts +++ b/src/app/shared/case-editor/case-edit-page.component.ts @@ -1,21 +1,16 @@ -import { ChangeDetectorRef, Component, OnInit, AfterViewChecked } from '@angular/core'; -import { CaseEventTrigger } from '../domain/case-view/case-event-trigger.model'; +import { AfterViewChecked, ChangeDetectorRef, Component, OnInit } from '@angular/core'; +import { CaseEventTrigger, WizardPage, CaseEventData, FormValueService, FormErrorService, DRAFT_PREFIX, + HttpError, SaveOrDiscardDialogComponent} from '@hmcts/ccd-case-ui-toolkit'; import { FormGroup } from '@angular/forms'; import { CaseEditComponent } from './case-edit.component'; import { ActivatedRoute } from '@angular/router'; -import { WizardPage } from '../domain/wizard-page.model'; -import { CaseEventData } from '../domain/case-event-data'; -import { FormValueService } from '../../core/form/form-value.service'; import { CallbackErrorsComponent } from '../error/callback-errors.component'; import { Subject } from 'rxjs/Subject'; -import { HttpError } from '../../core/http/http-error.model'; -import { FormErrorService } from '../../core/form/form-error.service'; import { CallbackErrorsContext } from '../error/error-context'; import { PageValidationService } from './page-validation.service'; -import { Draft } from '../domain/draft'; -import { SaveOrDiscardDialogComponent } from '../save-or-discard-dialog/save-or-discard-dialog.component'; import { MatDialogConfig, MatDialog } from '@angular/material'; import { CaseCreatorSubmitComponent } from '../../cases/creator/case-creator-submit.component'; +import { CaseViewerComponent } from '../../cases/viewer/case-viewer.component'; @Component({ selector: 'ccd-case-edit-page', @@ -154,7 +149,7 @@ export class CaseEditPageComponent implements OnInit, AfterViewChecked { this.discard(); } else if (result === 'Save') { const draftCaseEventData: CaseEventData = this.formValueService.sanitise(this.editForm.value) as CaseEventData; - if (this.route.snapshot.queryParamMap.get(CaseCreatorSubmitComponent.ORIGIN_QUERY_PARAM) === 'viewDraft') { + if (this.route.snapshot.queryParamMap.get(CaseViewerComponent.ORIGIN_QUERY_PARAM) === 'viewDraft') { this.caseEdit.cancelled.emit({status: CaseEditPageComponent.RESUMED_FORM_SAVE, data: draftCaseEventData}); } else { this.caseEdit.cancelled.emit({status: CaseEditPageComponent.NEW_FORM_SAVE, data: draftCaseEventData}); @@ -167,7 +162,7 @@ export class CaseEditPageComponent implements OnInit, AfterViewChecked { } private discard() { - if (this.route.snapshot.queryParamMap.get(CaseCreatorSubmitComponent.ORIGIN_QUERY_PARAM) === 'viewDraft') { + if (this.route.snapshot.queryParamMap.get(CaseViewerComponent.ORIGIN_QUERY_PARAM) === 'viewDraft') { this.caseEdit.cancelled.emit({status: CaseEditPageComponent.RESUMED_FORM_DISCARD}); } else { this.caseEdit.cancelled.emit({status: CaseEditPageComponent.NEW_FORM_DISCARD}); @@ -202,7 +197,7 @@ export class CaseEditPageComponent implements OnInit, AfterViewChecked { draftCaseEventData.event_token = this.eventTrigger.event_token; draftCaseEventData.ignore_warning = this.ignoreWarning; this.caseEdit.saveDraft(draftCaseEventData).subscribe( - (draft) => this.eventTrigger.case_id = Draft.DRAFT_PREFIX + draft.id, error => this.handleError(error) + (draft) => this.eventTrigger.case_id = DRAFT_PREFIX + draft.id, error => this.handleError(error) ); } } diff --git a/src/app/shared/case-editor/case-edit-submit.component.spec.ts b/src/app/shared/case-editor/case-edit-submit.component.spec.ts index 0e6490936..c5d940b95 100644 --- a/src/app/shared/case-editor/case-edit-submit.component.spec.ts +++ b/src/app/shared/case-editor/case-edit-submit.component.spec.ts @@ -1,24 +1,16 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; import { CaseEditSubmitComponent } from './case-edit-submit.component'; -import { CaseFieldService } from '../domain/case-field.service'; -import { FormValueService } from '../../core/form/form-value.service'; import { CaseEditComponent } from './case-edit.component'; import { ActivatedRoute } from '@angular/router'; -import { FormErrorService } from '../../core/form/form-error.service'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { FormControl, FormGroup } from '@angular/forms'; -import { WizardPage } from '../domain/wizard-page.model'; -import { FieldsUtils } from '../utils/fields.utils'; -import { IsCompoundPipe } from '../palette/utils/is-compound.pipe'; -import { CaseField } from '../domain/definition/case-field.model'; -import { aCaseField, aWizardPage } from './case-edit.spec'; import { Wizard } from './wizard.model'; -import { OrderService } from '../../core/order/order.service'; -import { CaseEventTrigger } from '../domain/case-view/case-event-trigger.model'; -import { CaseReferencePipe } from '../utils/case-reference.pipe'; import { By } from '@angular/platform-browser'; import createSpyObj = jasmine.createSpyObj; +import { CaseFieldService, CaseReferencePipe, CaseEventTrigger, aCaseField, CaseField, + IsCompoundPipe, FieldsUtils, WizardPage, FormErrorService, FormValueService, OrderService } from '@hmcts/ccd-case-ui-toolkit'; +import { aWizardPage } from './case-edit.spec'; describe('CaseEditSubmitComponent', () => { let comp: CaseEditSubmitComponent; diff --git a/src/app/shared/case-editor/case-edit-submit.component.ts b/src/app/shared/case-editor/case-edit-submit.component.ts index 97dfeb486..91298ecaf 100644 --- a/src/app/shared/case-editor/case-edit-submit.component.ts +++ b/src/app/shared/case-editor/case-edit-submit.component.ts @@ -1,24 +1,15 @@ import { Component, OnInit } from '@angular/core'; -import { CaseEventTrigger } from '../domain/case-view/case-event-trigger.model'; +import { CaseEventTrigger, CaseEventData, FormValueService, CaseField, WizardPage, CaseFieldService, + PaletteContext, FormErrorService, FieldsUtils, HttpError, OrderService } from '@hmcts/ccd-case-ui-toolkit'; import { FormGroup } from '@angular/forms'; -import { CaseEventData } from '../domain/case-event-data'; -import { FormValueService } from '../../core/form/form-value.service'; import { CaseEditComponent } from './case-edit.component'; -import { HttpError } from '../../core/http/http-error.model'; -import { FormErrorService } from '../../core/form/form-error.service'; import { Subject } from 'rxjs/Subject'; import { CallbackErrorsComponent } from '../error/callback-errors.component'; import { CallbackErrorsContext } from '../error/error-context'; -import { CaseField } from '../domain/definition/case-field.model'; -import { WizardPage } from '../domain/wizard-page.model'; -import { FieldsUtils } from '../utils/fields.utils'; import { ActivatedRoute } from '@angular/router'; import { Profile } from '../../core/profile/profile.model'; import { Confirmation } from './confirmation.model'; -import { CaseFieldService } from '../domain/case-field.service'; import { Wizard } from './wizard.model'; -import { OrderService } from '../../core/order/order.service'; -import { PaletteContext } from '../palette/base-field/palette-context.enum'; @Component({ selector: 'ccd-case-edit-submit', diff --git a/src/app/shared/case-editor/case-edit.component.spec.ts b/src/app/shared/case-editor/case-edit.component.spec.ts index 4b97d4e92..781c89e74 100644 --- a/src/app/shared/case-editor/case-edit.component.spec.ts +++ b/src/app/shared/case-editor/case-edit.component.spec.ts @@ -1,24 +1,15 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { ReactiveFormsModule, FormGroup, FormControl, FormArray } from '@angular/forms'; import { MockComponent } from 'ng2-mock-component'; -import { CaseEventTrigger } from '../domain/case-view/case-event-trigger.model'; -import { PaletteUtilsModule } from '../palette/utils/utils.module'; +import { CaseEventTrigger, PaletteUtilsModule, FormValueService, FormErrorService, + ConditionalShowDirective, FieldsUtils, WizardPage, WizardPageField, CaseField, FieldsPurger, + createCaseEventTrigger, ConditionalShowRegistrarService } from '@hmcts/ccd-case-ui-toolkit'; import { CaseEditComponent } from './case-edit.component'; -import { FormValueService } from '../../core/form/form-value.service'; -import { FormErrorService } from '../../core/form/form-error.service'; -import { ConditionalShowDirective } from '../conditional-show/conditional-show.directive'; import { DebugElement } from '@angular/core'; import { RouterTestingModule } from '@angular/router/testing'; -import { FieldsUtils } from '../utils/fields.utils'; import { Wizard } from './wizard.model'; import { Router, ActivatedRoute } from '@angular/router'; -import { WizardPage } from '../domain/wizard-page.model'; import createSpyObj = jasmine.createSpyObj; -import { WizardPageField } from '../domain/wizard-page-field.model'; -import { CaseField } from '../domain/definition/case-field.model'; -import { FieldsPurger } from '../utils/fields.purger'; -import { createCaseEventTrigger } from '../../fixture/shared.fixture' -import { ConditionalShowRegistrarService } from '../conditional-show/conditional-show-registrar.service'; import { WizardFactoryService } from '../../core/case-editor/wizard-factory.service'; import { Observable } from 'rxjs'; diff --git a/src/app/shared/case-editor/case-edit.component.ts b/src/app/shared/case-editor/case-edit.component.ts index 5f227ceb7..17804dc4a 100644 --- a/src/app/shared/case-editor/case-edit.component.ts +++ b/src/app/shared/case-editor/case-edit.component.ts @@ -1,18 +1,14 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { CaseEventTrigger } from '../domain/case-view/case-event-trigger.model'; -import { Observable } from 'rxjs/Observable'; +import { CaseEventTrigger, WizardPage, ConditionalShowRegistrarService, Draft, FieldsUtils, + FieldsPurger } from '@hmcts/ccd-case-ui-toolkit'; +import { Observable } from 'rxjs'; import { Wizard } from './wizard.model'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Confirmation } from './confirmation.model'; -import { WizardPage } from '../domain/wizard-page.model'; -import { FieldsUtils } from '../utils/fields.utils'; import { ActivatedRoute, Router, Params } from '@angular/router'; -import { FieldsPurger } from '../utils/fields.purger'; -import { ConditionalShowRegistrarService } from '../conditional-show/conditional-show-registrar.service'; import { CaseView } from '../../core/cases/case-view.model'; -import { Draft } from '../domain/draft'; import { WizardFactoryService } from '../../core/case-editor/wizard-factory.service'; -import { CaseCreatorSubmitComponent } from '../../cases/creator/case-creator-submit.component'; +import { CaseViewerComponent } from '../../cases/viewer/case-viewer.component'; @Component({ selector: 'ccd-case-edit', @@ -73,7 +69,7 @@ export class CaseEditComponent implements OnInit { }); this.route.queryParams.subscribe((params: Params) => { - this.navigationOrigin = params[CaseCreatorSubmitComponent.ORIGIN_QUERY_PARAM]; + this.navigationOrigin = params[CaseViewerComponent.ORIGIN_QUERY_PARAM]; }); } @@ -96,7 +92,7 @@ export class CaseEditComponent implements OnInit { this.registrarService.reset(); let theQueryParams: Params = {}; - theQueryParams[CaseCreatorSubmitComponent.ORIGIN_QUERY_PARAM] = this.navigationOrigin; + theQueryParams[CaseViewerComponent.ORIGIN_QUERY_PARAM] = this.navigationOrigin; let nextPage = this.wizard.nextPage(currentPageId, this.fieldsUtils.buildCanShowPredicate(this.eventTrigger, this.form)); return this.router.navigate([nextPage ? nextPage.id : 'submit'], { queryParams: theQueryParams, relativeTo: this.route }); } @@ -111,7 +107,7 @@ export class CaseEditComponent implements OnInit { } let theQueryParams: Params = {}; - theQueryParams[CaseCreatorSubmitComponent.ORIGIN_QUERY_PARAM] = this.navigationOrigin; + theQueryParams[CaseViewerComponent.ORIGIN_QUERY_PARAM] = this.navigationOrigin; return this.router.navigate([previousPage.id], { queryParams: theQueryParams, relativeTo: this.route }); } diff --git a/src/app/shared/case-editor/case-edit.spec.ts b/src/app/shared/case-editor/case-edit.spec.ts index bbdc5b379..9ad5352be 100644 --- a/src/app/shared/case-editor/case-edit.spec.ts +++ b/src/app/shared/case-editor/case-edit.spec.ts @@ -1,30 +1,13 @@ -import { CaseField } from '../domain/definition/case-field.model'; -import { ShowCondition } from '../conditional-show/conditional-show.model'; -import { WizardPage } from '../domain/wizard-page.model'; +import { WizardPage, ShowCondition } from '@hmcts/ccd-case-ui-toolkit'; import createSpyObj = jasmine.createSpyObj; -import { FieldTypeEnum } from '../domain/definition/field-type-enum.model'; - -export let aCaseField = (id: string, label: string, type: FieldTypeEnum, display_context: string, - show_summary_content_option: number): CaseField => { - return { - id: id || 'personFirstName', - field_type: { - id: type.toString() || 'Text', - type: type || 'Text' - }, - display_context: display_context || 'OPTIONAL', - label: label || 'First name', - show_summary_content_option: show_summary_content_option - }; -}; export let aWizardPage = (pageId: string, label: string, order: number): WizardPage => { - let wp = new WizardPage(); - wp.id = pageId; - wp.label = label; - wp.order = order; - let parsedShowCondition = createSpyObj('parsedShowCondition', ['match']); - parsedShowCondition.match.and.returnValue(true); - wp.parsedShowCondition = parsedShowCondition; - return wp; -}; + let wp = new WizardPage(); + wp.id = pageId; + wp.label = label; + wp.order = order; + let parsedShowCondition = createSpyObj('parsedShowCondition', ['match']); + parsedShowCondition.match.and.returnValue(true); + wp.parsedShowCondition = parsedShowCondition; + return wp; + }; diff --git a/src/app/shared/case-editor/label-substitution.service.spec.ts b/src/app/shared/case-editor/label-substitution.service.spec.ts deleted file mode 100644 index 0dcf2b4f9..000000000 --- a/src/app/shared/case-editor/label-substitution.service.spec.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { LabelSubstitutionService } from './label-substitution.service'; - -describe('LabelSubstitutionService', () => { - - let labelSubstitutionService: LabelSubstitutionService; - - beforeEach(() => { - labelSubstitutionService = new LabelSubstitutionService(); - }); - - describe('simple types', () => { - - it('should not substitute if no page form fields', () => { - let pageFormFields = [{}]; - let label = 'Email for ${PersonFirstName} is'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe(label); - }); - - it('should not substitute if no label', () => { - let pageFormFields = [{'PersonFirstName': 'John'}]; - let label = null; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBeNull(); - }); - - it('should substitute with empty value if page form field is matched and has null value', () => { - let pageFormFields = {'PersonFirstName' : null}; - let label = 'Email for ${PersonFirstName} is'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('Email for is'); - }); - - it('should substitute with empty value if page form field is matched and has empty value', () => { - let pageFormFields = {'PersonFirstName' : ''}; - let label = 'Email for ${PersonFirstName} is'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('Email for is'); - }); - - it('should substitute with value if page form field is matched and has value', () => { - let pageFormFields = {'Age': 34, 'PersonFirstName' : 'John'}; - let label = 'Email for ${PersonFirstName} of ${Age} is'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('Email for John of 34 is'); - }); - - it('should substitute with multiple values multiple times if page form field is matched and has value', () => { - let pageFormFields = {'PersonFirstName' : 'John', 'PersonLastName': 'Smith'}; - let label = 'Email for ${PersonFirstName} ${PersonLastName} is ${PersonFirstName}.${PersonLastName}@gmail.com'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('Email for John Smith is John.Smith@gmail.com'); - }); - - it('should only substitute with the values that are matched from page form fields', () => { - let pageFormFields = {'Age' : null, 'Markdownlabel': null, 'PersonAddress': {}, 'D8Document': 'photo.jpg'}; - let label = `First Name is \${Age} years old \${Age} \ -and markdown is \${Markdownlabel} and address is \${Address} and document \${D8Document}`; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('First Name is years old and markdown is and address is ${Address} and document photo.jpg'); - }); - - it('should not substitute fields ids with special characters but _', () => { - let pageFormFields = {'_1' : 'one', '%2': 'two', '?3': {'field': 'value'}, '$4': 'four', '_5': 'five'}; - let label = '${_1} ${%2} ${?3} ${$4} {_5}'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('one ${%2} ${?3} ${$4} {_5}'); - }); - - it('should not substitute nested fields', () => { - let pageFormFields = {'_1' : 'one'}; - let label = 'This ${_1} but not this ${${_1}} and not this ${field${_1}field} but this ${_1} too'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('This one but not this ${${_1}} and not this ${field${_1}field} but this one too'); - }); - - it('should not substitute if value of a field to substitute refers itself', () => { - let pageFormFields = {'_1_one': '${_1_one}'}; - let label = '${_1_one}'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('${_1_one}'); - }); - - it('should substitute fields with multi select values', () => { - let pageFormFields = {'_1_one': ['code1', 'code2'], '_1_one-LABEL': ['label1', 'label2'], '_3_three': 'simpleValue'}; - let label = '${_1_one} ${_3_three}'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('label1, label2 simpleValue'); - }); - }); - - describe('complex types', () => { - - it('should substitute complex nested field with simple type leaf value', () => { - let pageFormFields = {'complex': {'nested': 'nested value', 'nested2': 'nested value2' - , 'nested3': {'doubleNested': 'double nested'}}}; - let label = '${complex.nested} and ${complex.nested2} and ${complex.nested3} and ${complex.nested3.doubleNested}'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('nested value and nested value2 and ${complex.nested3} and double nested'); - }); - - it('should substitute if complex nested field refers existent field', () => { - let pageFormFields = {'complex': {'nested': {'doubleNested': 'double nested'}}}; - let label = '${complex} and ${complex.nested} and ${complex.nested.} and ${complex.nested.double} and ${complex.nested.doubleNested}'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('${complex} and ${complex.nested} and ${complex.nested.} and ${complex.nested.double} and double nested'); - }); - }); - - describe('collection types', () => { - - it('should substitute fields with text collection values', () => { - let pageFormFields = {'_1_one': [{'value': 'value1'}, {'value': 'value2'}], '_3_three': 'simpleValue'}; - let label = '${_1_one} ${_3_three}'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('value1, value2 simpleValue'); - }); - - it('should substitute fields with number collection values', () => { - let pageFormFields = {'_1_one': [{'value': 35}, {'value': 45}], '_3_three': 'simpleValue'}; - let label = '${_1_one} ${_3_three}'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('35, 45 simpleValue'); - }); - - it('should not substitute fields with complex collection values', () => { - let pageFormFields = {'_1_one': [{'value': {'id': 'complex1'}}, {'value': {'id': 'complex2'}}], '_3_three': 'simpleValue'}; - let label = '${_1_one} ${_3_three}'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('${_1_one} simpleValue'); - }); - - it('should not substitute fields with collection of collection values', () => { - let pageFormFields = {'_1_one': [{'value': [{'value': {'id': 'complex1'}}]}, {'value': [{'value': {'id': 'complex2'}}]}], - '_3_three': 'simpleValue'}; - let label = '${_1_one} ${_3_three}'; - - let actual = labelSubstitutionService.substituteLabel(pageFormFields, label); - - expect(actual).toBe('${_1_one} simpleValue'); - }); - }); -}); diff --git a/src/app/shared/case-editor/label-substitution.service.ts b/src/app/shared/case-editor/label-substitution.service.ts deleted file mode 100644 index 5c5e19f07..000000000 --- a/src/app/shared/case-editor/label-substitution.service.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { Injectable } from '@angular/core'; -import { FieldsUtils } from '../utils/fields.utils'; - -@Injectable() -export class LabelSubstitutionService { - - private static readonly LABEL_ID_PATTERN = /^[a-zA-Z0-9_.\]\[]+$/; - private static readonly STARTING_PLACEHOLDER = '$'; - private static readonly OPENING_PLACEHOLDER = '{'; - private static readonly CLOSING_PLACEHOLDER = '}'; - - substituteLabel(pageFormFields, label): string { - let startSubstitutionIndex = -1; - let fieldIdToSubstitute = ''; - let isCollecting = false; - if (label) { - for (let scanIndex = 0; scanIndex < label.length; scanIndex++) { - if (this.isStartPlaceholderAndNotCollecting(label, scanIndex, isCollecting)) { - startSubstitutionIndex = scanIndex; - isCollecting = true; - } else if (isCollecting) { - if (this.isClosingPlaceholder(label, scanIndex)) { - if (this.isMatchingLabelIdPattern(fieldIdToSubstitute) - && this.isFieldIdInFormFields(fieldIdToSubstitute, pageFormFields)) { - label = this.substitute(pageFormFields, label, startSubstitutionIndex, fieldIdToSubstitute); - scanIndex = this.resetScanIndexAfterSubstitution(startSubstitutionIndex, pageFormFields, fieldIdToSubstitute); - } - isCollecting = false; - fieldIdToSubstitute = ''; - } else if (!this.isOpeningPlaceholder(label, scanIndex)) { - fieldIdToSubstitute += label.charAt(scanIndex); - } - } - } - } - return label; - } - - private isMatchingLabelIdPattern(fieldIdToSubstitute) { - return fieldIdToSubstitute.match(LabelSubstitutionService.LABEL_ID_PATTERN); - } - - private isFieldIdInFormFields(fieldIdToSubstitute, pageFormFields) { - let fieldValue = this.getFieldValue(pageFormFields, fieldIdToSubstitute); - return fieldValue ? this.isSimpleTypeOrCollectionOfSimpleTypes(fieldValue) : fieldValue !== undefined; - } - - private isSimpleTypeOrCollectionOfSimpleTypes(fieldValue) { - return !this.isObject(fieldValue) && (this.isArray(fieldValue) ? this.isSimpleArray(fieldValue) : true); - } - - private isSimpleArray(fieldValue) { - return !this.isObject(fieldValue[0]) && !Array.isArray(fieldValue[0]) && fieldValue[0] !== undefined; - } - - private isStartingPlaceholder(label, scanIndex): boolean { - return label.charAt(scanIndex) === LabelSubstitutionService.STARTING_PLACEHOLDER; - } - - private isStartPlaceholderAndNotCollecting(label, scanIndex, isCollectingPlaceholder): boolean { - return this.isStartingPlaceholder(label, scanIndex) && !isCollectingPlaceholder; - } - - private isClosingPlaceholder(label, scanIndex): boolean { - return label.charAt(scanIndex) === LabelSubstitutionService.CLOSING_PLACEHOLDER; - } - - private isOpeningPlaceholder(label, scanIndex): boolean { - return label.charAt(scanIndex) === LabelSubstitutionService.OPENING_PLACEHOLDER; - } - - private substitute(pageFormFields, label, startSubstitutionIndex, fieldIdToSubstitute): string { - let replacedString = label.substring(startSubstitutionIndex) - .replace('${'.concat(fieldIdToSubstitute).concat('}'), - this.getSubstitutionValueOrEmpty(pageFormFields, fieldIdToSubstitute)); - return label.substring(0, startSubstitutionIndex).concat(replacedString); - } - - private resetScanIndexAfterSubstitution(startSubstitutionIndex, pageFormFields, fieldIdToSubstitute): number { - return startSubstitutionIndex + this.getSubstitutionValueLengthOrZero(pageFormFields, fieldIdToSubstitute); - } - - private getSubstitutionValueOrEmpty(pageFormFields, fieldIdToSubstitute) { - let fieldValue = this.getFieldValue(pageFormFields, fieldIdToSubstitute); - if (fieldValue instanceof Array) { - fieldValue = fieldValue.join(', '); - } - return fieldValue ? fieldValue : ''; - } - - private getFieldValue(pageFormFields, fieldIdToSubstitute) { - let fieldIds = fieldIdToSubstitute.split('.'); - for (let index = 0; index < fieldIds.length; index++) { - if (pageFormFields[fieldIds[index]] === undefined) { - return undefined; - } else { - if (this.isNonEmptyArray(pageFormFields[fieldIds[index]]) && !this.isCollection(pageFormFields[fieldIds[index]])) { - pageFormFields = pageFormFields[fieldIds[index] + FieldsUtils.LABEL_SUFFIX]; - } else { - pageFormFields = pageFormFields[fieldIds[index]]; - } - } - } - if (this.isNonEmptyArray(pageFormFields) && this.isCollection(pageFormFields)) { - pageFormFields = pageFormFields.map(fieldValue => fieldValue['value']); - } - return pageFormFields; - } - - private isNonEmptyArray(pageFormFields) { - return Array.isArray(pageFormFields) && pageFormFields[0]; - } - - private isCollection(pageFormFields) { - return pageFormFields[0]['value']; - } - - private getSubstitutionValueLengthOrZero(pageFormFields, fieldIdToSubstitute) { - return pageFormFields[fieldIdToSubstitute] ? this.getSubstitutionValueOrEmpty(pageFormFields, fieldIdToSubstitute) - .toString().length : 0; - } - - private getType(elem): string { - return Object.prototype.toString.call(elem).slice(8, -1); - } - - private isObject(elem) { - return this.getType(elem) === 'Object'; - }; - - private isArray(elem) { - return this.getType(elem) === 'Array'; - }; -} diff --git a/src/app/shared/case-editor/page-validation.service.spec.ts b/src/app/shared/case-editor/page-validation.service.spec.ts index 397bf5f37..7c525512a 100644 --- a/src/app/shared/case-editor/page-validation.service.spec.ts +++ b/src/app/shared/case-editor/page-validation.service.spec.ts @@ -1,10 +1,7 @@ import { async } from '@angular/core/testing'; -import { WizardPage } from '../domain/wizard-page.model'; -import { CaseField } from '../domain/definition/case-field.model'; -import { CaseFieldService } from '../domain/case-field.service'; import { FormControl, FormGroup } from '@angular/forms'; import { PageValidationService } from './page-validation.service'; -import { aCaseField } from './case-edit.spec'; +import { WizardPage, aCaseField, CaseField, CaseFieldService } from '@hmcts/ccd-case-ui-toolkit'; describe('PageValidationService', () => { diff --git a/src/app/shared/case-editor/page-validation.service.ts b/src/app/shared/case-editor/page-validation.service.ts index c8e1e7eeb..3f48edc71 100644 --- a/src/app/shared/case-editor/page-validation.service.ts +++ b/src/app/shared/case-editor/page-validation.service.ts @@ -1,9 +1,6 @@ import { Injectable } from '@angular/core'; -import { CaseField } from '../domain/definition/case-field.model'; +import { CaseField, ShowCondition, CaseFieldService, WizardPage } from '@hmcts/ccd-case-ui-toolkit'; import { AbstractControl, FormGroup } from '@angular/forms'; -import { ShowCondition } from '../conditional-show/conditional-show.model'; -import { CaseFieldService } from '../domain/case-field.service'; -import { WizardPage } from '../domain/wizard-page.model'; @Injectable() export class PageValidationService { diff --git a/src/app/shared/case-editor/wizard.model.spec.ts b/src/app/shared/case-editor/wizard.model.spec.ts index 598dac18f..ab82cec63 100644 --- a/src/app/shared/case-editor/wizard.model.spec.ts +++ b/src/app/shared/case-editor/wizard.model.spec.ts @@ -1,6 +1,6 @@ import { Wizard } from './wizard.model'; -import { WizardPage } from '../domain/wizard-page.model'; import createSpy = jasmine.createSpy; +import { WizardPage } from '@hmcts/ccd-case-ui-toolkit'; describe('wizard.model', () => { diff --git a/src/app/shared/case-editor/wizard.model.ts b/src/app/shared/case-editor/wizard.model.ts index 40d6b4605..c80042e19 100644 --- a/src/app/shared/case-editor/wizard.model.ts +++ b/src/app/shared/case-editor/wizard.model.ts @@ -1,6 +1,5 @@ -import { WizardPage } from '../domain/wizard-page.model'; +import { WizardPage, OrderService } from '@hmcts/ccd-case-ui-toolkit'; import { Predicate } from '../predicate'; -import { OrderService } from '../../core/order/order.service'; export class Wizard { private orderService = new OrderService(); diff --git a/src/app/shared/case-history/case-history.component.spec.ts b/src/app/shared/case-history/case-history.component.spec.ts index 07579c876..12482ab92 100644 --- a/src/app/shared/case-history/case-history.component.spec.ts +++ b/src/app/shared/case-history/case-history.component.spec.ts @@ -1,21 +1,17 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { CaseHistoryComponent } from './case-history.component'; -import { FieldsUtils } from '../utils/fields.utils'; -import { PaletteUtilsModule } from '../palette/utils/utils.module'; import { attr } from '../../test/helpers'; import { MockComponent } from 'ng2-mock-component'; import { By } from '@angular/platform-browser'; -import { HttpError } from '../../core/http/http-error.model'; -import { LabelSubstitutorDirective } from '../substitutor/label-substitutor.directive'; import { ActivatedRoute, Router } from '@angular/router'; -import { LabelSubstitutionService } from '../case-editor/label-substitution.service'; import { CaseHistory } from '../../core/cases/case-history.model'; import { DebugElement } from '@angular/core'; -import { OrderService } from '../../core/order/order.service'; import { createCaseHistory } from '../../core/cases/case-history.test.fixture'; import createSpyObj = jasmine.createSpyObj; import any = jasmine.any; +import { FieldsUtils, PaletteUtilsModule, HttpError, LabelSubstitutorDirective, + LabelSubstitutionService, OrderService } from '@hmcts/ccd-case-ui-toolkit'; describe('CaseHistoryComponent', () => { diff --git a/src/app/shared/case-history/case-history.component.ts b/src/app/shared/case-history/case-history.component.ts index 8cd0ad52d..f51c8cc15 100644 --- a/src/app/shared/case-history/case-history.component.ts +++ b/src/app/shared/case-history/case-history.component.ts @@ -1,9 +1,8 @@ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { CaseHistory } from '../../core/cases/case-history.model'; -import { OrderService } from '../../core/order/order.service'; import { CaseTab } from '../../core/cases/case-tab.model'; -import { ShowCondition } from '../conditional-show/conditional-show.model'; +import { ShowCondition, OrderService } from '@hmcts/ccd-case-ui-toolkit'; @Component({ templateUrl: './case-history.component.html', diff --git a/src/app/shared/case-history/case-history.resolver.spec.ts b/src/app/shared/case-history/case-history.resolver.spec.ts index 542a24a05..393c4dcea 100644 --- a/src/app/shared/case-history/case-history.resolver.spec.ts +++ b/src/app/shared/case-history/case-history.resolver.spec.ts @@ -1,5 +1,5 @@ import createSpyObj = jasmine.createSpyObj; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { CaseHistoryResolver } from './case-history.resolver'; import { CaseHistory } from '../../core/cases/case-history.model'; import { CaseView } from '../../core/cases/case-view.model'; diff --git a/src/app/shared/case-history/case-history.resolver.ts b/src/app/shared/case-history/case-history.resolver.ts index 47b586e59..c0b243063 100644 --- a/src/app/shared/case-history/case-history.resolver.ts +++ b/src/app/shared/case-history/case-history.resolver.ts @@ -1,6 +1,6 @@ import { ActivatedRouteSnapshot, Resolve, Router } from '@angular/router'; import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { Response } from '@angular/http'; import 'rxjs/add/operator/catch'; import { CaseHistory } from '../../core/cases/case-history.model'; diff --git a/src/app/shared/conditional-show/conditional-show-registrar.service.spec.ts b/src/app/shared/conditional-show/conditional-show-registrar.service.spec.ts deleted file mode 100644 index b360be63d..000000000 --- a/src/app/shared/conditional-show/conditional-show-registrar.service.spec.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { ConditionalShowDirective } from './conditional-show.directive'; -import { ConditionalShowRegistrarService } from './conditional-show-registrar.service'; -import { async } from '@angular/core/testing'; -import createSpyObj = jasmine.createSpyObj; -import { CaseField } from '../domain/definition/case-field.model'; -import { aCaseField } from '../case-editor/case-edit.spec'; - -let registrarService: ConditionalShowRegistrarService; -let conditionalShowDirective1: any; -let conditionalShowDirective2: any; - -describe('ConditionalShowRegistrarService', () => { - - beforeEach( async(() => { - registrarService = new ConditionalShowRegistrarService(); - conditionalShowDirective1 = createSpyObj('conditionalShowDirective1', ['refreshVisibility']); - conditionalShowDirective2 = createSpyObj('conditionalShowDirective2', ['refreshVisibility']); - let caseField1: CaseField = aCaseField('id1', 'label', 'Text', 'OPTIONAL', null); - let caseField2: CaseField = aCaseField('id2', 'label', 'Text', 'OPTIONAL', null); - conditionalShowDirective1.caseField = caseField1; - conditionalShowDirective2.caseField = caseField2; - })); - - it('should register', () => { - registrarService.register(conditionalShowDirective1); - registrarService.register(conditionalShowDirective2); - expect(registrarService.registeredDirectives.length).toEqual(2); - }); - - it('should reset', () => { - registrarService.register(conditionalShowDirective1); - registrarService.register(conditionalShowDirective2); - registrarService.reset(); - expect(registrarService.registeredDirectives.length).toEqual(0); - }); - - it('should refresh visibility of registered directives', () => { - registrarService.register(conditionalShowDirective1); - registrarService.register(conditionalShowDirective2); - registrarService.refresh(); - expect(conditionalShowDirective1.refreshVisibility).toHaveBeenCalled(); - expect(conditionalShowDirective2.refreshVisibility).toHaveBeenCalled(); - }); - -}); diff --git a/src/app/shared/conditional-show/conditional-show-registrar.service.ts b/src/app/shared/conditional-show/conditional-show-registrar.service.ts deleted file mode 100644 index ca2ec7a6d..000000000 --- a/src/app/shared/conditional-show/conditional-show-registrar.service.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Injectable } from '@angular/core'; -import { ConditionalShowDirective } from './conditional-show.directive'; - -@Injectable() -export class ConditionalShowRegistrarService { - registeredDirectives = []; - - register(newDirective: ConditionalShowDirective) { - // console.log('[', this.registeredDirectives.length, ']adding new directive', newDirective.caseField.id); - this.registeredDirectives.push(newDirective); - } - - refresh() { - this.registeredDirectives.forEach(dir => { - // console.log('refreshing ', dir.caseField.id); - dir.refreshVisibility() - }); - } - - reset() { - this.registeredDirectives = []; - } -} diff --git a/src/app/shared/conditional-show/conditional-show.directive.spec.ts b/src/app/shared/conditional-show/conditional-show.directive.spec.ts deleted file mode 100644 index 0dfa021a0..000000000 --- a/src/app/shared/conditional-show/conditional-show.directive.spec.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement, Component, Input } from '@angular/core'; -import { ConditionalShowDirective } from './conditional-show.directive'; -import { CaseField } from '../domain/definition/case-field.model'; -import { async } from '@angular/core/testing'; -import { FormGroup, FormControl } from '@angular/forms'; -import { FieldsUtils } from '../utils/fields.utils'; -import { ConditionalShowRegistrarService } from './conditional-show-registrar.service'; -import createSpyObj = jasmine.createSpyObj; - -@Component({ - template: ` - ` -}) -class TestHostComponent { - - @Input() caseField: CaseField; - @Input() eventFields: CaseField[]; - @Input() formGroup: FormGroup; -} - -let field = (id, value, showCondition?) => { - let caseField = new CaseField(); - caseField.id = id; - caseField.value = value; - caseField.show_condition = showCondition; - return caseField; -}; - -describe('ConditionalShowDirective', () => { - - let comp: TestHostComponent; - let fixture: ComponentFixture; - let de: DebugElement; - let el: HTMLElement; - let conditionalShow: ConditionalShowDirective; - let mockRegistrar: ConditionalShowRegistrarService = createSpyObj( - 'conditionalShowRegistrarService', - ['register', 'refresh'] - ); - - beforeEach( async(() => { - TestBed.configureTestingModule({ - declarations: [ ConditionalShowDirective, TestHostComponent ], - providers: [ - FieldsUtils, - { provide: ConditionalShowRegistrarService, useValue: mockRegistrar } - ] - }).compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(TestHostComponent); - comp = fixture.componentInstance; - de = fixture.debugElement.query(By.directive(ConditionalShowDirective)); - el = de.nativeElement; - conditionalShow = de.injector.get(ConditionalShowDirective) as ConditionalShowDirective; - }); - - it('should not trigger when hide condition is empty', () => { - comp.caseField = field('PersonSecondAddress', '', ''); - fixture.detectChanges(); - - expect(el.hidden).toBe(false); - expect(conditionalShow.condition).toBeUndefined(); - }); - - it('should display when condition matches a read only field. No form fields', () => { - comp.caseField = field('PersonSecondAddress', '', 'PersonLastName="Doe"'); - comp.eventFields = [comp.caseField, field('PersonLastName', 'Doe', '')]; - fixture.detectChanges(); - - expect(el.hidden).toBe(false); - expect(conditionalShow.condition.condition).toBe('PersonLastName="Doe"'); - }); - - it('should not display when condition does not match any read only field', () => { - comp.caseField = field('PersonSecondAddress', '', 'PersonLastName="Doe"'); - comp.eventFields = [comp.caseField, field('PersonLastName', 'Mundy', '')]; - fixture.detectChanges(); - - expect(el.hidden).toBe(true); - }); - - it('should not display when condition does not match an undefined readonly field', () => { - comp.caseField = field('PersonSecondAddress', '', 'PersonLastName="Doe"'); - comp.eventFields = [comp.caseField, field('PersonLastName', '', '')]; - fixture.detectChanges(); - - expect(el.hidden).toBe(true); - }); - - it('should display when condition matches a form field. No read only fields', () => { - comp.caseField = field('PersonSecondAddress', '', 'PersonHasSecondAddress="Yes"'); - comp.eventFields = [comp.caseField, field('PersonHasSecondAddress', 'Yes', '')]; - comp.formGroup = new FormGroup({ - PersonHasSecondAddress: new FormControl('Yes'), - PersonSecondAddress: new FormControl(''), - }); - fixture.detectChanges(); - - expect(el.hidden).toBe(false); - }); - - it('should display when condition matches a form field', () => { - comp.caseField = field('PersonSecondAddress', '', 'PersonHasSecondAddress="Yes"'); - comp.eventFields = [comp.caseField, field('PersonLastName', 'Doe', ''), field('PersonHasSecondAddress', 'Yes', '')]; - comp.formGroup = new FormGroup({ - PersonHasSecondAddress: new FormControl('Yes'), - PersonSecondAddress: new FormControl(''), - }); - fixture.detectChanges(); - - expect(el.hidden).toBe(false); - expect(conditionalShow.formField.disabled).toBe(false); - }); - - it('should not display when condition does not match any form field', () => { - comp.caseField = field('PersonSecondAddress', '', 'PersonHasSecondAddress="Yes"'); - comp.eventFields = [comp.caseField, field('PersonLastName', 'Doe', ''), - field('PersonHasSecondAddress', 'Yes', '')]; - comp.formGroup = new FormGroup({ - PersonSecondAddress: new FormControl(''), - PersonHasSecondAddress: new FormControl('No'), - PersonFirstAddress: new FormControl({}), - }); - fixture.detectChanges(); - - expect(el.hidden).toBe(true); - expect(conditionalShow.formField.disabled).toBe(true); - }); - - it('should not display when condition does not match because form field is undefined', () => { - comp.caseField = field('PersonSecondAddress', '', 'PersonHasSecondAddress="Yes"'); - comp.eventFields = [comp.caseField, field('PersonLastName', 'Doe', ''), - field('PersonHasSecondAddress', 'Yes', '')]; - comp.formGroup = new FormGroup({ - PersonSecondAddress: new FormControl(''), - PersonHasSecondAddress: new FormControl('') - }); - fixture.detectChanges(); - - expect(el.hidden).toBe(true); - }); - - it('should display when condition matches after field change', () => { - comp.caseField = field('PersonLastName', 'Paniccia', 'PersonHasSecondAddress="Yes"'); - comp.eventFields = [comp.caseField, field('PersonHasSecondAddress', 'Yes', ''), - field('PersonFirstName', 'Mario', '')]; - comp.formGroup = new FormGroup({ - PersonLastName: new FormControl('Paniccia'), - PersonHasSecondAddress: new FormControl('No') - }); - fixture.detectChanges(); - - expect(el.hidden).toBe(true); - - comp.formGroup.patchValue({PersonHasSecondAddress: 'Yes'}); - fixture.detectChanges(); - - expect(conditionalShow.formField.status).toBe('VALID'); - expect(el.hidden).toBe(false); - }); - - it('should disable a form field when hiding and keep its value', () => { - comp.caseField = field('PersonLastName', 'Paniccia', 'PersonHasSecondAddress="Yes"'); - comp.eventFields = [comp.caseField, field('PersonFirstName', 'Mario', ''), - field('PersonHasSecondAddress', 'Yes', '')]; - comp.formGroup = new FormGroup({ - PersonLastName: new FormControl('Paniccia'), - PersonHasSecondAddress: new FormControl('Yes') - }); - fixture.detectChanges(); - - expect(el.hidden).toBe(false); - expect(conditionalShow.formField.value).toBe('Paniccia'); - - conditionalShow.formGroup.patchValue({PersonLastName: 'Doe'}); - conditionalShow.formField.markAsDirty(); - fixture.detectChanges(); - expect(conditionalShow.formField.value).toBe('Doe'); - expect(conditionalShow.formField.dirty).toBe(true); - - conditionalShow.formGroup.patchValue({PersonHasSecondAddress: 'No'}); - fixture.detectChanges(); - - expect(el.hidden).toBe(true); - expect(conditionalShow.formField.status).toBe('DISABLED'); - - conditionalShow.formGroup.patchValue({PersonHasSecondAddress: 'Yes'}); - fixture.detectChanges(); - - expect(el.hidden).toBe(false); - expect(conditionalShow.formField.status).toBe('VALID'); - expect(conditionalShow.formField.value).toBe('Doe'); - }); - - it('should not clear a form field on hide if not dirty', () => { - comp.caseField = field('PersonLastName', 'Paniccia', 'PersonHasSecondAddress="Yes"'); - comp.eventFields = [comp.caseField, field('PersonFirstName', 'Mario', ''), - field('PersonHasSecondAddress', 'Yes', '')]; - comp.formGroup = new FormGroup({ - PersonLastName: new FormControl('Paniccia'), - PersonHasSecondAddress: new FormControl('Yes') - }); - fixture.detectChanges(); - - expect(el.hidden).toBe(false); - expect(conditionalShow.formField.value).toBe('Paniccia'); - - conditionalShow.formGroup.patchValue({PersonHasSecondAddress: 'No'}); - fixture.detectChanges(); - - expect(el.hidden).toBe(true); - expect(conditionalShow.formField.status).toBe('DISABLED'); - expect(conditionalShow.formField.value).toBe('Paniccia'); - }); -}); diff --git a/src/app/shared/conditional-show/conditional-show.directive.ts b/src/app/shared/conditional-show/conditional-show.directive.ts deleted file mode 100644 index 70d93bae8..000000000 --- a/src/app/shared/conditional-show/conditional-show.directive.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { AfterViewInit, Directive, ElementRef, Input, OnDestroy } from '@angular/core'; -import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms'; -import { CaseField } from '../domain/definition/case-field.model'; -import { Subscription } from 'rxjs'; -import { ShowCondition } from './conditional-show.model'; -import { FieldsUtils } from '../utils/fields.utils'; -import { ConditionalShowRegistrarService } from './conditional-show-registrar.service'; - -@Directive({ selector: '[ccdConditionalShow]' }) -/** Hides and shows the host element based on the show condition if the condition is not empty. Works on read only fields and form fields. - * The show condition is evaluated on all the fields of the page. i.e. read only and form fields. When a form field is hidden, if its - * initial value was changed then the field is cleared. Otherwise the original value is kept and will display next time the field is - * shown. Evaluation of the show condition includes disabled fields, which can be on their initial value or empty. And executes on the - * host field initialization and when any field of the form changes. - */ -// export class ConditionalShowDirective implements OnInit, OnDestroy { -export class ConditionalShowDirective implements AfterViewInit, OnDestroy { - - @Input() caseField: CaseField; - @Input() eventFields: CaseField[] = []; - @Input() formGroup: FormGroup; - - condition: ShowCondition; - private formChangesSubscription: Subscription; - formField: any; - - constructor(private el: ElementRef, - private fieldsUtils: FieldsUtils, - private registry: ConditionalShowRegistrarService) {} - - ngAfterViewInit() { - if (this.caseField.show_condition) { - this.condition = new ShowCondition(this.caseField.show_condition); - // console.log('FIELD: ' + this.caseField.id + ' init. Show condition: ' + this.caseField.show_condition); - this.formGroup = this.formGroup || new FormGroup({}); - this.formField = this.formGroup.get(this.caseField.id); - // console.log('FIELD: ' + this.caseField.id + '. Is form field:' + this.formField + '. Event fields:', this.eventFields); - this.updateVisibility(this.getReadOnlyAndFormFields()); - this.subscribeToFormChanges(); - this.registry.register(this); - } - } - - refreshVisibility() { - // console.log('Refresh FIELD: ', this.caseField.id, '. field:', this.formField, '. eventFields:', this.eventFields); - this.updateVisibility(this.getReadOnlyAndFormFields(), true); - this.subscribeToFormChanges(); - } - - ngOnDestroy() { - this.unsubscribeFromFormChanges(); - } - - private subscribeToFormChanges() { - this.unsubscribeFromFormChanges(); - // console.log('FIELD ' + this.caseField.id + ' subscribing to form changes'); - this.formChangesSubscription = this.formGroup.valueChanges.subscribe(_ => { - // console.log('FIELD ' + this.caseField.id + ' reacting to form change'); - this.updateVisibility(this.getReadOnlyAndFormFields()); - }); - } - - private updateVisibility(fields, forced = false) { - // console.log('FIELD ' + this.caseField.id + ' updatingVisibility based on fields: ', fields, ' forced:', forced); - if (this.shouldToggleToHide(fields, forced)) { - this.onHide(); - } else if (this.shouldToggleToShow(fields)) { - this.onShow(); - } - } - - private onHide() { - // console.log('on hide is form field', this.formField); - - if (this.formField) { - this.unsubscribeFromFormChanges(); - // console.log('FIELD ' + this.caseField.id + ' disabling form field'); - this.formField.disable(); - this.subscribeToFormChanges(); - } - this.hide(); - } - - private onShow() { - if (this.formField) { - this.unsubscribeFromFormChanges(); - // console.log('FIELD ' + this.caseField.id + ' enabling form field', this.formField); - this.formField.enable(); - this.subscribeToFormChanges(); - } - this.show(); - if (this.formField) { - this.checkHideShowCondition(this.caseField.id, this.formField); - } - } - - private hide() { - this.el.nativeElement.hidden = true; - } - - private show() { - this.el.nativeElement.hidden = false; - } - - private shouldToggleToHide(fields, forced) { - return (!this.isHidden() || forced) && !this.condition.match(fields); - } - - private shouldToggleToShow(fields) { - return this.isHidden() && this.condition.match(fields); - } - - private getReadOnlyAndFormFields() { - let formFields = this.getFormFieldsValuesIncludingDisabled(); - // console.log('FIELD ' + this.caseField.id + ' current form values including disabled: ', formFields); - return this.fieldsUtils.mergeCaseFieldsAndFormFields(this.eventFields, formFields); - } - - private getFormFieldsValuesIncludingDisabled() { - return this.formGroup.getRawValue(); - } - - private isHidden() { - return this.el.nativeElement.hidden; - } - - private unsubscribeFromFormChanges() { - if (this.formChangesSubscription) { - this.formChangesSubscription.unsubscribe(); - } - } - - // TODO This must be extracted to a generic service for traversing see RDM-2233 - private checkHideShowCondition(key: string, aControl: AbstractControl) { - if (aControl instanceof FormArray) { // We're in a collection - // console.log('traversing array', aControl); - aControl.controls.forEach((formControl, i) => { - // console.log('in array', formControl); - this.checkHideShowCondition('' + i, formControl) - }); - } else if (aControl instanceof FormGroup) { - // console.log('met a FormGroup ', aControl, ' fromGroup.controls', aControl.controls); - if (aControl.get('value')) { // Complex Field - let complexControl = aControl.get('value') as FormGroup; - Object.keys(complexControl.controls).forEach(controlKey => { - // console.log('traversing formGroup item', key, complexControl.get(key)); - this.checkHideShowCondition(controlKey, complexControl.get(controlKey)); - }); - } else if (aControl.controls) { // Special Field like AddressUK, AddressGlobal - Object.keys(aControl.controls).forEach(controlKey => { - // console.log('traversing formGroup item', key, aControl.get(key)); - this.checkHideShowCondition(controlKey, aControl.get(controlKey)); - }) - } - } else if (aControl instanceof FormControl) { // FormControl - if (aControl.invalid) { - // console.log('met an invalid FormControl ', key, ' control:', aControl, ' is valid:', aControl.valid); - this.registry.refresh(); - } - } - } -} diff --git a/src/app/shared/conditional-show/conditional-show.model.spec.ts b/src/app/shared/conditional-show/conditional-show.model.spec.ts deleted file mode 100644 index 1c30ab4cb..000000000 --- a/src/app/shared/conditional-show/conditional-show.model.spec.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { ShowCondition } from './conditional-show.model'; -import { aCaseField } from '../case-editor/case-edit.spec'; -import { CaseField } from '../domain/definition/case-field.model'; - -describe('conditional-show', () => { - let caseField1: CaseField = aCaseField('field1', 'field1', 'Text', 'OPTIONAL', null); - let caseField2: CaseField = aCaseField('field2', 'field2', 'Text', 'OPTIONAL', null); - let caseField3: CaseField = aCaseField('field3', 'field3', 'Text', 'OPTIONAL', null); - let caseField4: CaseField = aCaseField('field4', 'field4', 'Text', 'OPTIONAL', null); - - caseField1.value = 's1'; - caseField2.value = 3; - caseField3.value = 'temmy'; - caseField4.value = 's1 AND s2'; - - let caseFields = [caseField1, caseField2, caseField3, caseField4]; - - describe('matches when', () => { - it('empty condition', () => { - let sc = new ShowCondition(''); - let fields = { - field : 's1' - }; - let matched = sc.match(fields); - - expect(matched).toBe(true); - }); - - it('field has expected value', () => { - let sc = new ShowCondition('field="s1"'); - let fields = { - field : 's1' - }; - let matched = sc.match(fields); - - expect(matched).toBe(true); - }); - - it('field has expected value and is a number', () => { - let sc = new ShowCondition('field="3"'); - let fields = { - field : 3 - }; - let matched = sc.match(fields); - - expect(matched).toBe(true); - }); - - it('field starts with a string', () => { - let sc = new ShowCondition('field="te*"'); - let fields = { - field : 'test' - }; - let matched = sc.match(fields); - - expect(matched).toBe(true); - }); - }); - - describe('matchByCaseFields when', () => { - it('empty condition', () => { - let sc = new ShowCondition(''); - let matched = sc.matchByCaseFields(caseFields); - - expect(matched).toBe(true); - }); - - it('field has expected value', () => { - let sc = new ShowCondition('field1="s1"'); - - let matched = sc.matchByCaseFields(caseFields); - - expect(matched).toBe(true); - }); - - it('field has expected value and is a number', () => { - let sc = new ShowCondition('field2="3"'); - let matched = sc.matchByCaseFields(caseFields); - expect(matched).toBe(true); - }); - - it('field starts with a string', () => { - let sc = new ShowCondition('field3="te*"'); - let matched = sc.matchByCaseFields(caseFields); - - expect(matched).toBe(true); - }); - }); - - describe('not matches when', () => { - it('field value is not equal to condition', () => { - let sc = new ShowCondition('field="test"'); - let fields = { - field : 'test1' - }; - let matched = sc.match(fields); - - expect(matched).toBe(false); - }); - - it('field value does not start with the condition string', () => { - let sc = new ShowCondition('field="te*"'); - let fields = { - field : 'yest' - }; - let matched = sc.match(fields); - - expect(matched).toBe(false); - }); - - it('field starts with a string and does not exist', () => { - let sc = new ShowCondition('field="te*"'); - let fields = { - }; - let matched = sc.match(fields); - - expect(matched).toBe(false); - }); - }); - - describe('not matches ByCaseFields when', () => { - it('field value is not equal to condition', () => { - let sc = new ShowCondition('field1="test"'); - let matched = sc.matchByCaseFields(caseFields); - - expect(matched).toBe(false); - }); - - it('field value does not start with ' + - 'the condition string', () => { - let sc = new ShowCondition('field1="te*"'); - let matched = sc.matchByCaseFields(caseFields); - - expect(matched).toBe(false); - }); - }); - - describe('multiple AND conditions', () => { - it('should return true when all conditions are true', () => { - let sc = new ShowCondition('field1="s1" AND field2=3 AND field3="te*"'); - - let matched = sc.matchByCaseFields(caseFields); - - expect(matched).toBe(true); - }); - - it('should return false when any condition is false', () => { - let sc = new ShowCondition('field1="s1" AND field2=3 AND field3="no-match"'); - let matched = sc.matchByCaseFields(caseFields); - - expect(matched).toBe(false); - }); - - it('should evaluate AND conditions correctly when AND keyword is present in the value being matched', () => { - let sc = new ShowCondition('field4="s1 AND s2" AND field2=3'); - - let matched = sc.matchByCaseFields(caseFields); - - expect(matched).toBe(true); - }); - }); -}); diff --git a/src/app/shared/conditional-show/conditional-show.model.ts b/src/app/shared/conditional-show/conditional-show.model.ts deleted file mode 100644 index a9184793e..000000000 --- a/src/app/shared/conditional-show/conditional-show.model.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { CaseField } from '../domain/definition/case-field.model'; -import { FieldsUtils } from '../utils/fields.utils'; - -export class ShowCondition { - - private static readonly AND_CONDITION_REGEX = /\sAND\s(?![^"]*"(?:(?:[^"]*"){2})*[^"]*$)/g; - - // Expects a show condition of the form: ="string" - constructor(public condition: string) { - } - - match(fields): boolean { - if (!this.condition) { - return true; - } - return this.matchAndConditions(fields, this.condition); - } - - private matchAndConditions(fields: any, condition: string): boolean { - let andConditions = condition.split(ShowCondition.AND_CONDITION_REGEX); - return andConditions.every(andCondition => this.matchEqualityCondition(fields, andCondition)); - } - - private matchEqualityCondition(fields: any, condition: string): boolean { - let field = condition.split('=')[0]; - let right = this.unquoted(condition.split('=')[1]); - let value = fields[field]; - - if (right.endsWith('*') && value) { - return value.startsWith(this.removeStarChar(right)); - } else { - // changed from '===' to '==' to cover number field conditions - return value == right; // tslint:disable-line - } - } - - private unquoted(str) { - return str.replace(/^"|"$/g, ''); - } - - private removeStarChar(s: string) { - return s.substring(0, s.length - 1); - } - - matchByCaseFields(caseFields: CaseField[]): boolean { - return this.match(FieldsUtils.toValuesMap(caseFields)); - } -} diff --git a/src/app/shared/conditional-show/conditional-show.module.ts b/src/app/shared/conditional-show/conditional-show.module.ts deleted file mode 100644 index 725508681..000000000 --- a/src/app/shared/conditional-show/conditional-show.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { NgModule } from '@angular/core'; -import { ConditionalShowDirective } from './conditional-show.directive'; -import { FieldsUtils } from '../utils/fields.utils'; -import { ConditionalShowRegistrarService } from './conditional-show-registrar.service'; - -@NgModule({ - declarations: [ - ConditionalShowDirective - ], - exports: [ - ConditionalShowDirective - ], - providers: [ - FieldsUtils, - ConditionalShowRegistrarService - ] -}) -export class ConditionalShowModule {} diff --git a/src/app/shared/delete-or-cancel-dialog/delete-or-cancel-dialog.component.html b/src/app/shared/delete-or-cancel-dialog/delete-or-cancel-dialog.component.html deleted file mode 100644 index f818b7b6d..000000000 --- a/src/app/shared/delete-or-cancel-dialog/delete-or-cancel-dialog.component.html +++ /dev/null @@ -1,16 +0,0 @@ - -
-
-

X

-
-
-

Are you sure you want to delete this draft?

-
-
- You are about to delete this draft. Are you sure you want to proceed? -
-
- - -
-
diff --git a/src/app/shared/delete-or-cancel-dialog/delete-or-cancel-dialog.component.spec.ts b/src/app/shared/delete-or-cancel-dialog/delete-or-cancel-dialog.component.spec.ts deleted file mode 100644 index 814c99f11..000000000 --- a/src/app/shared/delete-or-cancel-dialog/delete-or-cancel-dialog.component.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { DeleteOrCancelDialogComponent } from './delete-or-cancel-dialog.component'; -import { MatDialogRef } from '@angular/material'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; -import createSpyObj = jasmine.createSpyObj; - -describe('DeleteOrCancelDialogComponent', () => { - const DELETE_BUTTON = By.css('button[title="Delete"]'); - const CANCEL_BUTTON = By.css('button[title="Cancel"]'); - - let component: DeleteOrCancelDialogComponent; - let fixture: ComponentFixture; - let de: DebugElement; - let matDialogRef: any; - - beforeEach(async(() => { - matDialogRef = createSpyObj>('MatDialogRef', ['close']); - - TestBed.configureTestingModule({ - declarations: [ DeleteOrCancelDialogComponent ], - providers: [ - { provide: MatDialogRef, useValue: matDialogRef } - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(DeleteOrCancelDialogComponent); - component = fixture.componentInstance; - de = fixture.debugElement; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should close dialog with `Delete` when delete button clicked', () => { - let deleteButton = de.query(DELETE_BUTTON); - - deleteButton.nativeElement.click(); - fixture.detectChanges(); - - expect(matDialogRef.close).toHaveBeenCalledWith('Delete'); - }); - - it('should close dialog with `Cancel` when cancel button clicked', () => { - let removeButton = de.query(CANCEL_BUTTON); - - removeButton.nativeElement.click(); - fixture.detectChanges(); - - expect(matDialogRef.close).toHaveBeenCalledWith('Cancel'); - }); -}); diff --git a/src/app/shared/delete-or-cancel-dialog/delete-or-cancel-dialog.component.ts b/src/app/shared/delete-or-cancel-dialog/delete-or-cancel-dialog.component.ts deleted file mode 100644 index 5173f1059..000000000 --- a/src/app/shared/delete-or-cancel-dialog/delete-or-cancel-dialog.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Component } from '@angular/core'; -import { MatDialogRef } from '@angular/material'; - -@Component({ - selector: 'ccd-delete-or-cancel-dialog', - templateUrl: './delete-or-cancel-dialog.component.html', - styleUrls: ['../action-dialog.component.scss'] -}) -export class DeleteOrCancelDialogComponent { - - result: string; - - constructor(private matDialogRef: MatDialogRef) {} - - delete() { - this.result = 'Delete'; - this.matDialogRef.close(this.result); - } - cancel() { - this.result = 'Cancel'; - this.matDialogRef.close(this.result); - } -} diff --git a/src/app/shared/document-dialog/document-dialog.component.html b/src/app/shared/document-dialog/document-dialog.component.html deleted file mode 100644 index 54b76bfd7..000000000 --- a/src/app/shared/document-dialog/document-dialog.component.html +++ /dev/null @@ -1,16 +0,0 @@ - -
-
-

X

-
-
-

Are you sure you want to replace the existing file?

-
-
- You are about to delete the original file uploaded. Are you sure you want to proceed? -
-
- - -
-
diff --git a/src/app/shared/document-dialog/document-dialog.component.spec.ts b/src/app/shared/document-dialog/document-dialog.component.spec.ts deleted file mode 100644 index e69dec230..000000000 --- a/src/app/shared/document-dialog/document-dialog.component.spec.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { DocumentDialogComponent } from './document-dialog.component'; -import { MatDialogRef } from '@angular/material'; - -describe('DocumentDialogComponent', () => { - let component: DocumentDialogComponent; - let fixture: ComponentFixture; - let matDialogRef: MatDialogRef; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ DocumentDialogComponent ], - providers: [ - { provide: MatDialogRef, useValue: matDialogRef }, - DocumentDialogComponent - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(DocumentDialogComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/shared/document-dialog/document-dialog.component.ts b/src/app/shared/document-dialog/document-dialog.component.ts deleted file mode 100644 index efd9613ff..000000000 --- a/src/app/shared/document-dialog/document-dialog.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { MatDialogRef } from '@angular/material'; - -@Component({ - selector: 'ccd-document-dialog', - templateUrl: './document-dialog.component.html', - styleUrls: ['../action-dialog.component.scss'] -}) -export class DocumentDialogComponent implements OnInit { - - result: string; - - constructor(private matDialogRef: MatDialogRef) {} - - ngOnInit() { - } - - replace() { - this.result = 'Replace'; - this.matDialogRef.close(this.result); - } - cancel() { - this.result = 'Cancel'; - this.matDialogRef.close(this.result); - } -} diff --git a/src/app/shared/domain/case-details.ts b/src/app/shared/domain/case-details.ts deleted file mode 100644 index db5e60286..000000000 --- a/src/app/shared/domain/case-details.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class CaseDetails { - id: string; - jurisdiction: string; - case_type_id: string; - state: string; - created_date?: string; - last_modified?: string; - locked_by_user_id?: string; - security_level?: string; - case_data?: object; -} diff --git a/src/app/shared/domain/case-event-data.ts b/src/app/shared/domain/case-event-data.ts deleted file mode 100644 index 725fbb001..000000000 --- a/src/app/shared/domain/case-event-data.ts +++ /dev/null @@ -1,11 +0,0 @@ -export class CaseEventData { - event: { - id: string; - summary: string; - description: string; - }; - data?: object; - event_token: string; - ignore_warning: boolean; - draft_id?: string; -} diff --git a/src/app/shared/domain/case-field.service.spec.ts b/src/app/shared/domain/case-field.service.spec.ts deleted file mode 100644 index 245bc3e53..000000000 --- a/src/app/shared/domain/case-field.service.spec.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { CaseFieldService } from './case-field.service'; -import { CaseField } from './definition/case-field.model'; - -describe('CaseFieldService', () => { - - let caseFieldService: CaseFieldService = new CaseFieldService(); - describe('isOptional', () => { - - it('should identify null field as NOT optional', () => { - expect(caseFieldService.isOptional(null)) - .toBeFalsy(); - }); - - it('should identify undefined display_context as NOT optional', () => { - expect(caseFieldService.isOptional({} as CaseField)) - .toBeFalsy(); - }); - - it('should identify unknown display_context value as NOT optional', () => { - expect(caseFieldService.isOptional({ display_context: '' } as CaseField)) - .toBeFalsy(); - }); - - it('should identify OPTIONAL display_context field as optional', () => { - expect(caseFieldService.isOptional({ display_context: 'OPTIONAL' } as CaseField)) - .toBeTruthy(); - }); - - it('should identify MANDATORY display_context field as NOT optional', () => { - expect(caseFieldService.isOptional({ display_context: 'MANDATORY' } as CaseField)) - .toBeFalsy(); - }); - - it('should identify READONLY display_context field as NOT optional', () => { - expect(caseFieldService.isOptional({ display_context: 'READONLY' } as CaseField)) - .toBeFalsy(); - }); - }); - - describe('isReadOnly', () => { - - it('should identify null field as NOT readOnly', () => { - expect(caseFieldService.isReadOnly(null)) - .toBeFalsy(); - }); - - it('should identify undefined display_context as NOT readOnly', () => { - expect(caseFieldService.isReadOnly({} as CaseField)) - .toBeFalsy(); - }); - - it('should identify unknown display_context value as NOT readOnly', () => { - expect(caseFieldService.isReadOnly({ display_context: '' } as CaseField)) - .toBeFalsy(); - }); - - it('should identify OPTIONAL display_context field as NOT readOnly', () => { - expect(caseFieldService.isReadOnly({ display_context: 'OPTIONAL' } as CaseField)) - .toBeFalsy(); - }); - - it('should identify MANDATORY display_context field as NOT readOnly', () => { - expect(caseFieldService.isReadOnly({ display_context: 'MANDATORY' } as CaseField)) - .toBeFalsy(); - }); - - it('should identify READONLY display_context field as NOT readOnly', () => { - expect(caseFieldService.isReadOnly({ display_context: 'READONLY' } as CaseField)) - .toBeTruthy(); - }); - }); - - describe('isMandatory', () => { - - it('should identify null field as NOT mandatory', () => { - expect(caseFieldService.isMandatory(null)) - .toBeFalsy(); - }); - - it('should identify undefined display_context as NOT mandatory', () => { - expect(caseFieldService.isMandatory({} as CaseField)) - .toBeFalsy(); - }); - - it('should identify unknown display_context value as NOT mandatory', () => { - expect(caseFieldService.isMandatory({ display_context: '' } as CaseField)) - .toBeFalsy(); - }); - - it('should identify OPTIONAL display_context field as NOT mandatory', () => { - expect(caseFieldService.isMandatory({ display_context: 'OPTIONAL' } as CaseField)) - .toBeFalsy(); - }); - - it('should identify MANDATORY display_context field as NOT mandatory', () => { - expect(caseFieldService.isMandatory({ display_context: 'MANDATORY' } as CaseField)) - .toBeTruthy(); - }); - - it('should identify READONLY display_context field as NOT mandatory', () => { - expect(caseFieldService.isMandatory({ display_context: 'READONLY' } as CaseField)) - .toBeFalsy(); - }); - }); -}); diff --git a/src/app/shared/domain/case-field.service.ts b/src/app/shared/domain/case-field.service.ts deleted file mode 100644 index 92bd6c5ed..000000000 --- a/src/app/shared/domain/case-field.service.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Injectable } from '@angular/core'; -import { CaseField } from './definition/case-field.model'; - -@Injectable() -export class CaseFieldService { - - public isOptional (field: CaseField) { - if (!field || !field.display_context) { - return false; - } - return field.display_context.toUpperCase() === 'OPTIONAL'; - } - - public isReadOnly (field: CaseField) { - if (!field || !field.display_context) { - return false; - } - return field.display_context.toUpperCase() === 'READONLY'; - } - - public isMandatory (field: CaseField) { - if (!field || !field.display_context) { - return false; - } - return field.display_context.toUpperCase() === 'MANDATORY'; - } -} diff --git a/src/app/shared/domain/case-view/case-event-trigger.model.ts b/src/app/shared/domain/case-view/case-event-trigger.model.ts deleted file mode 100644 index f0c016f07..000000000 --- a/src/app/shared/domain/case-view/case-event-trigger.model.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { CaseField } from '../definition/case-field.model'; -import { WizardPage } from '../wizard-page.model'; -import { Type } from 'class-transformer'; - -export class CaseEventTrigger { - - id: string; - name: string; - description?: string; - case_id?: string; - - @Type(() => CaseField) - case_fields: CaseField[]; - - event_token: string; - - @Type(() => WizardPage) - wizard_pages: WizardPage[]; - - show_summary?: boolean; - show_event_notes?: boolean; - end_button_label?: string; - can_save_draft?: boolean; - - hasFields(): boolean { - return this.case_fields && this.case_fields.length !== 0; - } - - hasPages(): boolean { - return this.wizard_pages && this.wizard_pages.length !== 0; - } -} diff --git a/src/app/shared/domain/case-view/case-view-trigger.model.ts b/src/app/shared/domain/case-view/case-view-trigger.model.ts index 3e8edcb86..848f97106 100644 --- a/src/app/shared/domain/case-view/case-view-trigger.model.ts +++ b/src/app/shared/domain/case-view/case-view-trigger.model.ts @@ -1,4 +1,4 @@ -import { Orderable } from '../../../core/order/orderable.model'; +import { Orderable } from '@hmcts/ccd-case-ui-toolkit'; export class CaseViewTrigger implements Orderable { public static readonly DELETE = 'DELETE'; diff --git a/src/app/shared/domain/definition/case-event.model.ts b/src/app/shared/domain/definition/case-event.model.ts index a4ee1bb3c..1203cf80e 100644 --- a/src/app/shared/domain/definition/case-event.model.ts +++ b/src/app/shared/domain/definition/case-event.model.ts @@ -1,5 +1,5 @@ import { EventCaseField } from './event-case-field.model'; -import { Orderable } from '../../../core/order/orderable.model'; +import { Orderable } from '@hmcts/ccd-case-ui-toolkit'; export class CaseEvent implements Orderable { id: string; diff --git a/src/app/shared/domain/definition/case-field.model.ts b/src/app/shared/domain/definition/case-field.model.ts deleted file mode 100644 index 860814ad4..000000000 --- a/src/app/shared/domain/definition/case-field.model.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Orderable } from '../../../core/order/orderable.model'; -import { FieldType } from './field-type.model'; -import { WizardPageField } from '../wizard-page-field.model'; -import { Type } from 'class-transformer'; - -export class CaseField implements Orderable { - id: string; - label: string; - order?: number; - - @Type(() => FieldType) - field_type: FieldType; - value?: any; - - hint_text?: string; - security_label?: string; - display_context: string; - show_condition?: string; - show_summary_change_option?: boolean; - show_summary_content_option?: number; - - @Type(() => WizardPageField) - wizardProps?: WizardPageField; -} diff --git a/src/app/shared/domain/definition/case-state.model.ts b/src/app/shared/domain/definition/case-state.model.ts index fda85351f..35936dc35 100644 --- a/src/app/shared/domain/definition/case-state.model.ts +++ b/src/app/shared/domain/definition/case-state.model.ts @@ -1,4 +1,4 @@ -import { Orderable } from '../../../core/order/orderable.model'; +import { Orderable } from '@hmcts/ccd-case-ui-toolkit'; export class CaseState implements Orderable { id: string; diff --git a/src/app/shared/domain/definition/case-type.model.ts b/src/app/shared/domain/definition/case-type.model.ts index f710fec8d..49b0dfb50 100644 --- a/src/app/shared/domain/definition/case-type.model.ts +++ b/src/app/shared/domain/definition/case-type.model.ts @@ -1,6 +1,6 @@ import { CaseEvent } from './case-event.model'; import { CaseState } from './case-state.model'; -import { CaseField } from './case-field.model'; +import { CaseField } from '@hmcts/ccd-case-ui-toolkit'; import { Jurisdiction } from './jurisdiction.model'; export class CaseType { diff --git a/src/app/shared/domain/definition/field-type-enum.model.ts b/src/app/shared/domain/definition/field-type-enum.model.ts deleted file mode 100644 index ba444f0a0..000000000 --- a/src/app/shared/domain/definition/field-type-enum.model.ts +++ /dev/null @@ -1,21 +0,0 @@ -export type FieldTypeEnum = - 'Text' - | 'TextArea' - | 'Postcode' - | 'Number' - | 'YesOrNo' - | 'Date' - | 'DateTime' - | 'Email' - | 'PhoneUK' - | 'MoneyGBP' - | 'FixedList' - | 'Complex' - | 'Collection' - | 'MultiSelectList' - | 'Document' - | 'Label' - | 'AddressGlobal' - | 'AddressGlobalUK' - | 'AddressUK' - | 'CasePaymentHistoryViewer'; diff --git a/src/app/shared/domain/definition/field-type.model.ts b/src/app/shared/domain/definition/field-type.model.ts deleted file mode 100644 index ab2906b96..000000000 --- a/src/app/shared/domain/definition/field-type.model.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { FixedListItem } from './fixed-list-item.model'; -import { FieldTypeEnum } from './field-type-enum.model'; -import { CaseField } from './case-field.model'; -import { Type } from 'class-transformer'; - -export class FieldType { - id: string; - type: FieldTypeEnum; - min?: number; - max?: number; - regular_expression?: string; - - @Type(() => FixedListItem) - fixed_list_items?: FixedListItem[]; - - @Type(() => CaseField) - complex_fields?: CaseField[]; - - @Type(() => FieldType) - collection_field_type?: FieldType; -} diff --git a/src/app/shared/domain/definition/fixed-list-item.model.ts b/src/app/shared/domain/definition/fixed-list-item.model.ts deleted file mode 100644 index 6db2f79fb..000000000 --- a/src/app/shared/domain/definition/fixed-list-item.model.ts +++ /dev/null @@ -1,4 +0,0 @@ -export class FixedListItem { - code: string; - label: string; -} diff --git a/src/app/shared/domain/document/document-data.model.ts b/src/app/shared/domain/document/document-data.model.ts deleted file mode 100644 index fad61aecf..000000000 --- a/src/app/shared/domain/document/document-data.model.ts +++ /dev/null @@ -1,21 +0,0 @@ -export class HRef { - href: string; -} - -export class DocumentLinks { - self: HRef; - binary: HRef; -} - -export class Document { - _links: DocumentLinks; - originalDocumentName: string; -} - -export class Embedded { - documents: Document[]; -} - -export class DocumentData { - _embedded: Embedded; -} diff --git a/src/app/shared/domain/draft.ts b/src/app/shared/domain/draft.ts deleted file mode 100644 index a4caf96cf..000000000 --- a/src/app/shared/domain/draft.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { CaseDetails } from './case-details'; - -export class Draft { - public static readonly DRAFT_QUERY_PARAM = 'draft'; - public static readonly DRAFT_PREFIX = 'DRAFT'; - - id: string; - document?: CaseDetails; - type?: string; - created?: string; - updated?: string; - - public static stripDraftId (draftId: string): string { - return draftId.slice(Draft.DRAFT_PREFIX.length); - } - - public static isDraft (id: string): boolean { - return String(id).startsWith(this.DRAFT_PREFIX); - } -} diff --git a/src/app/shared/domain/wizard-page-field.model.ts b/src/app/shared/domain/wizard-page-field.model.ts deleted file mode 100644 index c8ec6c75d..000000000 --- a/src/app/shared/domain/wizard-page-field.model.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Orderable } from '../../core/order/orderable.model'; - -export class WizardPageField implements Orderable { - case_field_id: string; - order?: number; - page_column_no?: number; -} diff --git a/src/app/shared/domain/wizard-page.model.spec.ts b/src/app/shared/domain/wizard-page.model.spec.ts deleted file mode 100644 index b9707514d..000000000 --- a/src/app/shared/domain/wizard-page.model.spec.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { WizardPage } from './wizard-page.model'; -import { CaseField } from './definition/case-field.model'; -import { WizardFactoryService } from '../../core/case-editor/wizard-factory.service'; -import { WizardPageField } from './wizard-page-field.model'; - -let createField = (colNumber: number): CaseField => { - let field = new CaseField(); - let wizardProps = new WizardPageField(); - wizardProps.page_column_no = colNumber; - field.wizardProps = wizardProps; - return field; -} - -describe('WizardPage', () => { - - it('isMultiColumn is false when only col1 fields', () => { - let page = new WizardPage(); - let colNumber = 1 - page.case_fields = [createField(colNumber)]; - - expect(page.isMultiColumn()).toBeFalsy(); - }); - - it('isMultiColumn is true when col1 and col2 fields', () => { - let page = new WizardPage(); - let colNumber = 2 - page.case_fields = [createField(colNumber)]; - - expect(page.isMultiColumn()).toBeTruthy(); - }); - - it('should return col1Fields', () => { - let page = new WizardPage(); - let field = createField(1); - let field2 = createField(undefined); - let field3 = createField(2); - page.case_fields = [field, field2, field3]; - - expect(page.getCol1Fields()).toEqual([field, field2]); - expect(page.getCol2Fields()).toEqual([field3]); - - }); -}); diff --git a/src/app/shared/domain/wizard-page.model.ts b/src/app/shared/domain/wizard-page.model.ts deleted file mode 100644 index 67e5ed172..000000000 --- a/src/app/shared/domain/wizard-page.model.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Orderable } from '../../core/order/orderable.model'; -import { WizardPageField } from './wizard-page-field.model'; -import { CaseField } from './definition/case-field.model'; -import { ShowCondition } from '../conditional-show/conditional-show.model'; -import { Type } from 'class-transformer'; - -export class WizardPage implements Orderable { - - id: string; - label: string; - order?: number; - - @Type(() => WizardPageField) - wizard_page_fields: WizardPageField[]; - - @Type(() => CaseField) - case_fields: CaseField[]; - - show_condition?: string; - - parsedShowCondition: ShowCondition; - - getCol1Fields(): CaseField[] { - return this.case_fields.filter(f => - !f.wizardProps.page_column_no || f.wizardProps.page_column_no === 1); - } - getCol2Fields(): CaseField[] { - return this.case_fields.filter(f => f.wizardProps.page_column_no === 2); - } - - isMultiColumn(): Boolean { - return this.getCol2Fields().length > 0; - } -} diff --git a/src/app/shared/error/callback-errors.component.spec.ts b/src/app/shared/error/callback-errors.component.spec.ts index ec6a17e3e..4d9ac2d4f 100644 --- a/src/app/shared/error/callback-errors.component.spec.ts +++ b/src/app/shared/error/callback-errors.component.spec.ts @@ -2,11 +2,11 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { DebugElement, EventEmitter } from '@angular/core'; import { Subject } from 'rxjs/Subject'; import { CallbackErrorsComponent } from './callback-errors.component'; -import { HttpError } from '../../core/http/http-error.model'; import createSpyObj = jasmine.createSpyObj; import { CallbackErrorsContext } from './error-context'; import { By } from '@angular/platform-browser'; import { text } from '../../test/helpers'; +import { HttpError } from '@hmcts/ccd-case-ui-toolkit'; describe('CallbackErrorsComponent', () => { diff --git a/src/app/shared/error/callback-errors.component.ts b/src/app/shared/error/callback-errors.component.ts index 0a79768df..7eb6703b7 100644 --- a/src/app/shared/error/callback-errors.component.ts +++ b/src/app/shared/error/callback-errors.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; -import { HttpError } from '../../core/http/http-error.model'; +import { HttpError } from '@hmcts/ccd-case-ui-toolkit'; import { Subject } from 'rxjs/Subject'; import { CallbackErrorsContext } from './error-context'; diff --git a/src/app/shared/event-log/event-log-details.component.spec.ts b/src/app/shared/event-log/event-log-details.component.spec.ts index ecae1220b..eb208aa95 100644 --- a/src/app/shared/event-log/event-log-details.component.spec.ts +++ b/src/app/shared/event-log/event-log-details.component.spec.ts @@ -3,8 +3,7 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { DebugElement } from '@angular/core'; import { CaseViewEvent } from '../../core/cases/case-view-event.model'; import { By } from '@angular/platform-browser'; -import { DatePipe } from '../palette/utils/date.pipe'; -import { DashPipe } from '../palette/utils/dash.pipe'; +import { DatePipe, DashPipe } from '@hmcts/ccd-case-ui-toolkit/dist/shared/palette/utils'; describe('EventLogDetails', () => { diff --git a/src/app/shared/event-log/event-log-table.component.spec.ts b/src/app/shared/event-log/event-log-table.component.spec.ts index 76397e49a..fec86fb09 100644 --- a/src/app/shared/event-log/event-log-table.component.spec.ts +++ b/src/app/shared/event-log/event-log-table.component.spec.ts @@ -3,8 +3,8 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { DebugElement } from '@angular/core'; import { CaseViewEvent } from '../../core/cases/case-view-event.model'; import { By } from '@angular/platform-browser'; -import { DatePipe } from '../palette/utils/date.pipe'; import { RouterTestingModule } from '@angular/router/testing'; +import { DatePipe } from '@hmcts/ccd-case-ui-toolkit/dist/shared/palette/utils'; describe('EventLogTableComponent', () => { diff --git a/src/app/shared/event-log/event-log.component.spec.ts b/src/app/shared/event-log/event-log.component.spec.ts index 8a87ba6cd..391b93046 100644 --- a/src/app/shared/event-log/event-log.component.spec.ts +++ b/src/app/shared/event-log/event-log.component.spec.ts @@ -3,7 +3,7 @@ import { EventLogComponent } from './event-log.component'; import { Component, DebugElement, EventEmitter, Input, Output } from '@angular/core'; import { By } from '@angular/platform-browser'; import { CaseViewEvent } from '../../core/cases/case-view-event.model'; -import { DatePipe } from '../palette/utils/date.pipe'; +import { DatePipe } from '@hmcts/ccd-case-ui-toolkit/dist/shared/palette/utils'; describe('EventLogComponent', () => { diff --git a/src/app/shared/event-log/event-log.module.ts b/src/app/shared/event-log/event-log.module.ts index bc3b22879..9173d6e2e 100644 --- a/src/app/shared/event-log/event-log.module.ts +++ b/src/app/shared/event-log/event-log.module.ts @@ -3,7 +3,7 @@ import { CommonModule } from '@angular/common'; import { EventLogComponent } from './event-log.component'; import { EventLogTableComponent } from './event-log-table.component'; import { EventLogDetailsComponent } from './event-log-details.component'; -import { PaletteUtilsModule } from '../palette/utils/utils.module'; +import { PaletteUtilsModule } from '@hmcts/ccd-case-ui-toolkit'; import { RouterModule } from '@angular/router'; @NgModule({ diff --git a/src/app/shared/event-trigger/event-trigger.component.spec.ts b/src/app/shared/event-trigger/event-trigger.component.spec.ts index e75f81dac..4bef30c49 100644 --- a/src/app/shared/event-trigger/event-trigger.component.spec.ts +++ b/src/app/shared/event-trigger/event-trigger.component.spec.ts @@ -6,10 +6,9 @@ import { By } from '@angular/platform-browser'; import { attr, text } from '../../test/helpers'; import { ReactiveFormsModule } from '@angular/forms'; import createSpyObj = jasmine.createSpyObj; -import { OrderService } from '../../core/order/order.service'; import { AlertService } from '../../core/alert/alert.service'; -import { HttpError } from '../../core/http/http-error.model'; import { Subject } from 'rxjs/Subject'; +import { HttpError, OrderService } from '@hmcts/ccd-case-ui-toolkit'; describe('EventTriggerComponent', () => { diff --git a/src/app/shared/event-trigger/event-trigger.component.ts b/src/app/shared/event-trigger/event-trigger.component.ts index 985bcb3f0..2c8301e9d 100644 --- a/src/app/shared/event-trigger/event-trigger.component.ts +++ b/src/app/shared/event-trigger/event-trigger.component.ts @@ -1,11 +1,10 @@ import { Component, EventEmitter, Input, OnDestroy, OnInit, Output } from '@angular/core'; import { CaseViewTrigger } from '../domain/case-view/case-view-trigger.model'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { OrderService } from '../../core/order/order.service'; import { AlertService } from '../../core/alert/alert.service'; import { Subscription } from 'rxjs/Subscription'; import { Subject } from 'rxjs/Subject'; -import { HttpError } from '../../core/http/http-error.model'; +import { HttpError, OrderService } from '@hmcts/ccd-case-ui-toolkit'; @Component({ selector: 'ccd-event-trigger', diff --git a/src/app/shared/header/case-header.component.spec.ts b/src/app/shared/header/case-header.component.spec.ts index f42a059fe..400d4c97f 100644 --- a/src/app/shared/header/case-header.component.spec.ts +++ b/src/app/shared/header/case-header.component.spec.ts @@ -1,15 +1,12 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; import { CaseHeaderComponent } from './case-header.component'; import { DebugElement } from '@angular/core'; -import { CaseReferencePipe } from '../utils/case-reference.pipe'; import { By } from '@angular/platform-browser'; import { text } from '../../test/helpers'; import { createCaseView } from '../../core/cases/case-view.test.fixture'; import { MockComponent } from 'ng2-mock-component'; -import { LabelSubstitutorDirective } from '../substitutor/label-substitutor.directive'; -import { FieldsUtils } from '../utils/fields.utils'; -import { LabelSubstitutionService } from '../case-editor/label-substitution.service'; -import { LabelFieldComponent } from '../palette/label/label-field.component'; +import { CaseReferencePipe, LabelSubstitutorDirective, FieldsUtils, LabelSubstitutionService, + LabelFieldComponent } from '@hmcts/ccd-case-ui-toolkit'; describe('CaseHeaderComponent', () => { @@ -42,20 +39,25 @@ describe('CaseHeaderComponent', () => { LabelSubstitutionService, ] }) - .compileComponents(); + .compileComponents() + .then(() => { + fixture = TestBed.createComponent(CaseHeaderComponent); + component = fixture.componentInstance; + component.caseDetails = CASE_DETAILS; - fixture = TestBed.createComponent(CaseHeaderComponent); - component = fixture.componentInstance; - component.caseDetails = CASE_DETAILS; - - de = fixture.debugElement; - fixture.detectChanges(); + de = fixture.debugElement; + fixture.detectChanges(); + }); })); it('should render a header with case reference when title display is empty', () => { let header = de.query($HEADING); - expect(header).toBeTruthy(); - expect(text(header)).toEqual('#1234-5678-9012-3456'); + fixture + .whenStable() + .then(() => { + expect(header).toBeTruthy(); + expect(text(header)).toEqual('#1234-5678-9012-3456'); + }); }); it('should render a header with markdown element when title display is not empty', () => { diff --git a/src/app/shared/header/case-header.component.ts b/src/app/shared/header/case-header.component.ts index 21d384ae0..2c44a40eb 100644 --- a/src/app/shared/header/case-header.component.ts +++ b/src/app/shared/header/case-header.component.ts @@ -1,7 +1,6 @@ import { Component, Input, OnInit } from '@angular/core'; import { CaseView } from '../../core/cases/case-view.model'; -import { CaseField } from '../domain/definition/case-field.model'; -import { Draft } from '../domain/draft'; +import { CaseField, Draft } from '@hmcts/ccd-case-ui-toolkit'; @Component({ selector: 'ccd-case-header', @@ -23,6 +22,7 @@ export class CaseHeaderComponent implements OnInit { this.caseFields = this.getCaseFields(); } } + isDraft(): boolean { return Draft.isDraft(this.caseDetails.case_id); } diff --git a/src/app/shared/header/event-trigger-header.component.spec.ts b/src/app/shared/header/event-trigger-header.component.spec.ts index 2843a1c34..498166492 100644 --- a/src/app/shared/header/event-trigger-header.component.spec.ts +++ b/src/app/shared/header/event-trigger-header.component.spec.ts @@ -3,8 +3,7 @@ import { EventTriggerHeaderComponent } from './event-trigger-header.component'; import { DebugElement } from '@angular/core'; import { text } from '../../test/helpers'; import { By } from '@angular/platform-browser'; -import { CaseEventTrigger } from '../domain/case-view/case-event-trigger.model'; -import { createCaseEventTrigger } from '../../fixture/shared.fixture' +import { CaseEventTrigger, createCaseEventTrigger } from '@hmcts/ccd-case-ui-toolkit'; describe('EventTriggerHeaderComponent', () => { diff --git a/src/app/shared/header/event-trigger-header.component.ts b/src/app/shared/header/event-trigger-header.component.ts index 68c93a8ab..d4e24d5de 100644 --- a/src/app/shared/header/event-trigger-header.component.ts +++ b/src/app/shared/header/event-trigger-header.component.ts @@ -1,5 +1,5 @@ import { Component, Input } from '@angular/core'; -import { CaseEventTrigger } from '../domain/case-view/case-event-trigger.model'; +import { CaseEventTrigger } from '@hmcts/ccd-case-ui-toolkit'; @Component({ selector: 'ccd-event-trigger-header', diff --git a/src/app/shared/markdown/markdown.component.spec.ts b/src/app/shared/markdown/markdown.component.spec.ts deleted file mode 100644 index 6a40de384..000000000 --- a/src/app/shared/markdown/markdown.component.spec.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { DebugElement } from '@angular/core'; -import { MarkdownComponent as CCDMarkDownComponent } from './markdown.component'; -import { NgxMdModule, NgxMdComponent } from 'ngx-md'; -import { By } from '@angular/platform-browser'; - -describe('MarkdownComponent', () => { - - const $MARKDOWN = By.css('markdown'); - - const CONTENT = `| Tables | Are | Cool | - |----------|:-------------:|------:| - | col 1 is | left-aligned | $1600 | - | col 2 is | centered | $12 | - | col 3 is | right-aligned | $1 |`; - const EXPECTED_CONTENT = ` - - - - - - - - - - - - - - - - - - - - - - - - -
TablesAreCool
col 1 isleft-aligned$1600
col 2 iscentered$12
col 3 isright-aligned$1
-`; - - let fixture: ComponentFixture; - let component: CCDMarkDownComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - NgxMdModule.forRoot() - ], - declarations: [ - CCDMarkDownComponent, - ], - providers: [ - NgxMdComponent - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(CCDMarkDownComponent); - component = fixture.componentInstance; - component.content = CONTENT; - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('Should render an html table', () => { - expect(de.query($MARKDOWN).nativeElement.innerHTML).toBe(EXPECTED_CONTENT); - }); - -}); diff --git a/src/app/shared/markdown/markdown.component.ts b/src/app/shared/markdown/markdown.component.ts deleted file mode 100644 index 72cb36932..000000000 --- a/src/app/shared/markdown/markdown.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, Input } from '@angular/core'; - -@Component({ - selector: 'ccd-markdown', - templateUrl: './markdown.html' -}) -export class MarkdownComponent { - - @Input() - content: string; -} diff --git a/src/app/shared/markdown/markdown.html b/src/app/shared/markdown/markdown.html deleted file mode 100644 index 622499784..000000000 --- a/src/app/shared/markdown/markdown.html +++ /dev/null @@ -1 +0,0 @@ -
{{content}}
\ No newline at end of file diff --git a/src/app/shared/markdown/markdown.module.ts b/src/app/shared/markdown/markdown.module.ts deleted file mode 100644 index cba8fb511..000000000 --- a/src/app/shared/markdown/markdown.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { MarkdownComponent } from './markdown.component'; -import { NgxMdModule } from 'ngx-md'; - -@NgModule({ - imports: [ - NgxMdModule.forRoot() - ], - declarations: [ - MarkdownComponent - ], - exports: [ - MarkdownComponent - ] -}) -export class MarkdownModule {} diff --git a/src/app/shared/palette/address/address-option.model.ts b/src/app/shared/palette/address/address-option.model.ts deleted file mode 100644 index 9ff7d8091..000000000 --- a/src/app/shared/palette/address/address-option.model.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AddressModel } from '../../../core/addresses/address.model'; -export class AddressOption { - - value: AddressModel; - description: string; - - constructor (addressModel: AddressModel, description: string) { - this.value = addressModel; - this.description = (description == null) - ? this.value.AddressLine1 - + this.prefixWithCommaIfPresent(this.value.AddressLine2) - + this.prefixWithCommaIfPresent(this.value.AddressLine3) - + ', ' + this.value.PostTown - : description; - } - - private prefixWithCommaIfPresent(value: string) { - return value ? ', ' + value : value; - } - -} diff --git a/src/app/shared/palette/address/address.module.ts b/src/app/shared/palette/address/address.module.ts deleted file mode 100644 index daa4def2f..000000000 --- a/src/app/shared/palette/address/address.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { NgModule } from '@angular/core'; -import { WriteAddressFieldComponent } from './write-address-field.component'; -import { ConditionalShowModule } from '../../conditional-show/conditional-show.module'; -import { ComplexModule } from '../complex/complex.module'; -import { CommonModule } from '@angular/common'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MarkdownModule } from '../../markdown/markdown.module'; -import { PaletteUtilsModule } from '../utils/utils.module'; - -@NgModule({ - imports: [ - ConditionalShowModule, - CommonModule, - ComplexModule, - ReactiveFormsModule, - MarkdownModule, - PaletteUtilsModule - ], - declarations: [ - WriteAddressFieldComponent - ], - entryComponents: [ - WriteAddressFieldComponent, - ] -}) -export class AddressModule {} diff --git a/src/app/shared/palette/address/write-address-field.component.spec.ts b/src/app/shared/palette/address/write-address-field.component.spec.ts deleted file mode 100644 index f62a15618..000000000 --- a/src/app/shared/palette/address/write-address-field.component.spec.ts +++ /dev/null @@ -1,309 +0,0 @@ -import { Component, DebugElement, Input, ViewChild } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { WriteAddressFieldComponent } from './write-address-field.component'; -import { ConditionalShowModule } from '../../conditional-show/conditional-show.module'; -import { By } from '@angular/platform-browser'; -import { AbstractControl, FormControl, ReactiveFormsModule } from '@angular/forms'; -import { AddressesService } from '../../../core/addresses/addresses.service'; -import { AddressModel } from '../../../core/addresses/address.model'; -import { Observable } from 'rxjs'; -import { FieldLabelPipe } from '../utils/field-label.pipe'; -import { CaseField } from '../../domain/definition/case-field.model'; - -describe('WriteAddressFieldComponent', () => { - - const CASE_FIELD_LABEL = 'Case Field Label'; - const $TITLE = By.css('h3'); - - const $POSTCODE_LOOKUP = By.css('#postcodeLookup'); - const $POSTCODE_LOOKUP_INPUT = By.css('#postcodeInput'); - const $POSTCODE_LOOKUP_FIND = By.css('#postcodeLookup > button'); - const $POSTCODE_LOOKUP_ERROR_MESSAGE = By.css('.error-message'); - - const $SELECT_ADDRESS = By.css('#selectAddress'); - const $ADDRESS_LIST = By.css('#selectAddress > #addressList'); - - const $MANUAL_LINK = By.css('.manual-link'); - const $ADDRESS_COMPLEX_FIELD = By.css('ccd-write-complex-type-field'); - - @Component({ - selector: `ccd-host-component`, - template: `` - }) - class TestHostComponent { - @ViewChild(WriteAddressFieldComponent) - public componentUnderTest: WriteAddressFieldComponent; - - caseField = caseField(null); - - registerControl = () => {}; - } - - @Component({ - selector: `ccd-write-complex-type-field`, - template: `` - }) - class MockWriteComplexFieldComponent { - - @Input() - caseField: CaseField; - - @Input() - registerControl: (control: FormControl) => AbstractControl; - - @Input() - idPrefix = ''; - - @Input() - ignoreMandatory = false; - - @Input() - renderLabel: boolean; - - complexGroup = { - value : {}, - setValue: (value) => { this.complexGroup.value = value; } - }; - - } - - let addressesService: AddressesService; - let testHostComponent: TestHostComponent; - let debugElement: DebugElement; - let fixture: ComponentFixture; - - function caseField(address: AddressModel) { - return { - id: 'caseFieldId', - label: CASE_FIELD_LABEL, - field_type: { id: 'FieldTypeId', type: 'Complex' }, - value: address - }; - } - - function buildAddress(entryNo: number): AddressModel { - const address = new AddressModel(); - address.AddressLine1 = 'AddressLine1-' + entryNo; - address.AddressLine2 = 'AddressLine2-' + entryNo; - address.AddressLine3 = 'AddressLine3-' + entryNo; - address.PostTown = 'PostTown-' + entryNo; - address.County = 'County-' + entryNo; - address.PostCode = 'PostCode-' + entryNo; - address.Country = 'Country-' + entryNo; - return address; - } - - function queryPostcode() { - let postcodeField = fixture.debugElement.query($POSTCODE_LOOKUP_INPUT).nativeElement; - postcodeField.value = 'P05T CDE'; - postcodeField.dispatchEvent(new Event('input')); - fixture.detectChanges(); - debugElement.query($POSTCODE_LOOKUP_FIND).triggerEventHandler('click', null); - fixture.detectChanges(); - } - - beforeEach(async(() => { - - addressesService = new AddressesService(null, null); - - TestBed - .configureTestingModule({ - imports: [ - ConditionalShowModule, - ReactiveFormsModule, - ], - declarations: [ - WriteAddressFieldComponent, - TestHostComponent, - FieldLabelPipe, - // Mocks - MockWriteComplexFieldComponent, - ], - providers: [ - { provide: AddressesService, useValue: addressesService } - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - testHostComponent = fixture.componentInstance; - testHostComponent.caseField.value = null; - - debugElement = fixture.debugElement; - fixture.detectChanges(); - - })); - - it('should render only title, lookup component and manual link when address not set', () => { - - expect(debugElement.query($TITLE).nativeElement.innerHTML).toEqual(CASE_FIELD_LABEL); - expect(debugElement.query($POSTCODE_LOOKUP)).toBeTruthy(); - expect(debugElement.query($SELECT_ADDRESS)).toBeFalsy(); - expect(debugElement.query($MANUAL_LINK)).toBeTruthy(); - - expect(debugElement.query($ADDRESS_COMPLEX_FIELD)).toBeTruthy(); - expect(debugElement.query($ADDRESS_COMPLEX_FIELD).nativeElement['hidden']).toBeTruthy(); - - }); - - it('should render only address lines if field is search ', () => { - testHostComponent.componentUnderTest.isExpanded = true; // false by default - fixture.detectChanges(); - - expect(debugElement.query($TITLE).nativeElement.innerHTML).toEqual(CASE_FIELD_LABEL); - expect(debugElement.query($POSTCODE_LOOKUP)).toBeFalsy(); - expect(debugElement.query($SELECT_ADDRESS)).toBeFalsy(); - expect(debugElement.query($MANUAL_LINK)).toBeFalsy(); - - expect(debugElement.query($ADDRESS_COMPLEX_FIELD)).toBeTruthy(); - expect(debugElement.query($ADDRESS_COMPLEX_FIELD).nativeElement['hidden']).toBeFalsy(); - - }); - - it('should render only title, lookup component and manual link when writeComplexFieldComponent is null', () => { - testHostComponent.componentUnderTest.writeComplexFieldComponent = null; - fixture.detectChanges(); - expect(debugElement.query($TITLE).nativeElement.innerHTML).toEqual(CASE_FIELD_LABEL); - expect(debugElement.query($POSTCODE_LOOKUP)).toBeTruthy(); - expect(debugElement.query($SELECT_ADDRESS)).toBeFalsy(); - expect(debugElement.query($MANUAL_LINK)).toBeTruthy(); - - expect(debugElement.query($ADDRESS_COMPLEX_FIELD)).toBeTruthy(); - expect(debugElement.query($ADDRESS_COMPLEX_FIELD).nativeElement['hidden']).toBeTruthy(); - - }); - - it('should render only title, lookup component and address when address set', () => { - - const address = new AddressModel(); - address.AddressLine1 = 'Address Line 1'; - address.AddressLine2 = 'Address Line 2'; - address.AddressLine3 = 'Address Line 3'; - address.PostTown = 'PostTown'; - address.County = 'County'; - address.PostCode = 'PostCode'; - address.Country = 'Country'; - - testHostComponent.caseField = caseField(address); - fixture.detectChanges(); - - expect(debugElement.query($TITLE).nativeElement.innerHTML).toEqual(CASE_FIELD_LABEL); - expect(debugElement.query($POSTCODE_LOOKUP)).toBeTruthy(); - expect(debugElement.query($SELECT_ADDRESS)).toBeFalsy(); - expect(debugElement.query($MANUAL_LINK)).toBeFalsy(); - - expect(debugElement.query($ADDRESS_COMPLEX_FIELD)).toBeTruthy(); - expect(debugElement.query($ADDRESS_COMPLEX_FIELD).nativeElement['hidden']).toBeFalsy(); - - expect(testHostComponent.componentUnderTest.writeComplexFieldComponent.complexGroup.value).toEqual(address); - - }); - - it('should render a single option of \'No address found\' when no addresses are returned from AddressesService', () => { - - spyOn(addressesService, 'getAddressesForPostcode').and.returnValue(Observable.of([])); - - queryPostcode(); - - expect(debugElement.query($MANUAL_LINK)).toBeTruthy(); - expect(addressesService.getAddressesForPostcode).toHaveBeenCalledWith('P05TCDE'); - expect(debugElement.query($SELECT_ADDRESS)).toBeTruthy(); - expect(debugElement.query($ADDRESS_LIST).children.length).toEqual(1); - expect(debugElement.query($ADDRESS_LIST).children[0].nativeElement.innerHTML.trim()).toEqual('No address found'); - - }); - - it('should render a default \'summary item\' and 3 address options when 3 addresses are returned from AddressesService', () => { - - const address2 = buildAddress(2); - address2.AddressLine2 = ''; - const address3 = buildAddress(3); - address3.AddressLine3 = ''; - - spyOn(addressesService, 'getAddressesForPostcode').and.returnValue( - Observable.of([buildAddress(1), address2, address3]) - ); - - queryPostcode(); - - expect(addressesService.getAddressesForPostcode).toHaveBeenCalledWith('P05TCDE'); - expect(debugElement.query($MANUAL_LINK)).toBeTruthy(); - expect(debugElement.query($SELECT_ADDRESS)).toBeTruthy(); - expect(debugElement.query($ADDRESS_LIST).children.length).toEqual(4); - expect(debugElement.query($ADDRESS_LIST).children[0].nativeElement.innerHTML.trim()).toEqual('3 addresses found'); - - expect(debugElement.query($ADDRESS_LIST).children[1].nativeElement.innerHTML.trim()).toEqual( - 'AddressLine1-1, AddressLine2-1, AddressLine3-1, PostTown-1' - ); - expect(debugElement.query($ADDRESS_LIST).children[2].nativeElement.innerHTML.trim()).toEqual( - 'AddressLine1-2, AddressLine3-2, PostTown-2' - ); - expect(debugElement.query($ADDRESS_LIST).children[3].nativeElement.innerHTML.trim()).toEqual( - 'AddressLine1-3, AddressLine2-3, PostTown-3' - ); - - }); - - it('should populate the address with the option selected, removing the \'manual link\'', () => { - - const selectedAddress = buildAddress(1); - testHostComponent.componentUnderTest.addressList.setValue(selectedAddress); - testHostComponent.componentUnderTest.addressSelected(); - - fixture.detectChanges(); - - expect(debugElement.query($TITLE).nativeElement.innerHTML).toEqual(CASE_FIELD_LABEL); - expect(debugElement.query($POSTCODE_LOOKUP)).toBeTruthy(); - expect(debugElement.query($SELECT_ADDRESS)).toBeFalsy(); - expect(debugElement.query($MANUAL_LINK)).toBeFalsy(); - - expect(debugElement.query($ADDRESS_COMPLEX_FIELD)).toBeTruthy(); - expect(debugElement.query($ADDRESS_COMPLEX_FIELD).nativeElement['hidden']).toBeFalsy(); - - expect(testHostComponent.componentUnderTest.writeComplexFieldComponent.complexGroup.value).toEqual(selectedAddress); - - }); - - it('should populate a blank address when the \'manual link\' is clicked', () => { - - fixture.debugElement.query($MANUAL_LINK).nativeElement.dispatchEvent(new Event('click', null)); - fixture.detectChanges(); - - expect(debugElement.query($TITLE).nativeElement.innerHTML).toEqual(CASE_FIELD_LABEL); - expect(debugElement.query($POSTCODE_LOOKUP)).toBeTruthy(); - expect(debugElement.query($SELECT_ADDRESS)).toBeFalsy(); - expect(debugElement.query($MANUAL_LINK)).toBeFalsy(); - expect(debugElement.query($ADDRESS_COMPLEX_FIELD)).toBeTruthy(); - expect(debugElement.query($ADDRESS_COMPLEX_FIELD).nativeElement['hidden']).toBeFalsy(); - - expect(testHostComponent.componentUnderTest.writeComplexFieldComponent.complexGroup.value.AddressLine1).toEqual(''); - expect(testHostComponent.componentUnderTest.writeComplexFieldComponent.complexGroup.value.AddressLine2).toEqual(''); - expect(testHostComponent.componentUnderTest.writeComplexFieldComponent.complexGroup.value.AddressLine3).toEqual(''); - expect(testHostComponent.componentUnderTest.writeComplexFieldComponent.complexGroup.value.PostTown).toEqual(''); - expect(testHostComponent.componentUnderTest.writeComplexFieldComponent.complexGroup.value.County).toEqual(''); - expect(testHostComponent.componentUnderTest.writeComplexFieldComponent.complexGroup.value.PostCode).toEqual(''); - expect(testHostComponent.componentUnderTest.writeComplexFieldComponent.complexGroup.value.Country).toEqual(''); - - }); - - it('should render an error when postcode is blank', () => { - - debugElement.query($POSTCODE_LOOKUP_FIND).triggerEventHandler('click', null); - fixture.detectChanges(); - - expect(debugElement.query($POSTCODE_LOOKUP_ERROR_MESSAGE)).toBeTruthy(); - - }); - - it('should clear the error when postcode is not blank', () => { - - testHostComponent.componentUnderTest.missingPostcode = true; - fixture.detectChanges(); - - queryPostcode(); - - expect(debugElement.query($POSTCODE_LOOKUP_ERROR_MESSAGE)).toBeFalsy(); - - }); - -}); diff --git a/src/app/shared/palette/address/write-address-field.component.ts b/src/app/shared/palette/address/write-address-field.component.ts deleted file mode 100644 index 552bd61f8..000000000 --- a/src/app/shared/palette/address/write-address-field.component.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; -import { Component, Input, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core'; -import { WriteComplexFieldComponent } from '../complex/write-complex-field.component'; -import { AddressModel } from '../../../core/addresses/address.model'; -import { AddressOption } from './address-option.model'; -import { AddressesService } from '../../../core/addresses/addresses.service'; -import { FormControl, FormGroup } from '@angular/forms'; - -@Component({ - selector: 'ccd-write-address-field', - templateUrl: 'write-address-field.html', - styleUrls: ['write-address-field.scss'] -}) -export class WriteAddressFieldComponent extends AbstractFieldWriteComponent implements OnInit, OnChanges { - - @ViewChild('writeComplexFieldComponent') - writeComplexFieldComponent: WriteComplexFieldComponent; - - addressesService: AddressesService; - - formGroup = new FormGroup({}); - - postcode: FormControl; - addressList: FormControl; - - addressOptions: AddressOption[]; - - missingPostcode = false; - - constructor (addressesService: AddressesService) { - super(); - this.addressesService = addressesService; - } - - ngOnInit(): void { - this.postcode = new FormControl(''); - this.formGroup.addControl('postcode', this.postcode); - this.addressList = new FormControl(''); - this.formGroup.addControl('address', this.addressList); - } - - findAddress() { - - if (!this.postcode.value) { - this.missingPostcode = true; - } else { - this.missingPostcode = false; - const postcode = this.postcode.value; - - this.caseField.value = null; - this.addressOptions = new Array(); - this.addressesService.getAddressesForPostcode(postcode.replace(' ', '').toUpperCase()).subscribe( - result => { - result.forEach( - address => { - this.addressOptions.push(new AddressOption(address, null)); - } - ); - this.addressOptions.unshift( - new AddressOption(undefined, this.defaultLabel(this.addressOptions.length)) - ); - }, () => { - console.log(`An error occurred retrieving addresses for postcode ${postcode}.`); - }); - this.addressList.setValue(undefined); - } - } - - blankAddress() { - this.caseField.value = new AddressModel(); - this.setFormValue(); - } - - shouldShowDetailFields() { - if (this.isExpanded) { - return true; - } - if (!this.writeComplexFieldComponent || !this.writeComplexFieldComponent.complexGroup) { - return false; - } - const address = this.writeComplexFieldComponent.complexGroup.value; - let hasAddress = false; - if (address) { - Object.keys(address).forEach(function (key) { - if (address[key] != null) { - hasAddress = true; - } - }); - } - return hasAddress; - } - - addressSelected() { - this.caseField.value = this.addressList.value; - this.setFormValue(); - } - - ngOnChanges(changes: SimpleChanges) { - if (changes['caseField']) { - this.setFormValue(); - } - } - - private defaultLabel(numberOfAddresses) { - return numberOfAddresses === 0 ? 'No address found' - : numberOfAddresses + (numberOfAddresses === 1 ? ' address ' : ' addresses ') + 'found'; - } - - private setFormValue() { - if (this.writeComplexFieldComponent.complexGroup) { - this.writeComplexFieldComponent.complexGroup.setValue( - this.caseField.value - ); - } - } - -} diff --git a/src/app/shared/palette/address/write-address-field.html b/src/app/shared/palette/address/write-address-field.html deleted file mode 100644 index 3de1d8db1..000000000 --- a/src/app/shared/palette/address/write-address-field.html +++ /dev/null @@ -1,37 +0,0 @@ -
- -

{{caseField | ccdFieldLabel }}

- -
- - Enter the Postcode - - -
- -
- - - -
- - I can't enter a UK postcode - - - - -
diff --git a/src/app/shared/palette/address/write-address-field.scss b/src/app/shared/palette/address/write-address-field.scss deleted file mode 100644 index dd4ca359f..000000000 --- a/src/app/shared/palette/address/write-address-field.scss +++ /dev/null @@ -1,8 +0,0 @@ -@import "~govuk_frontend_toolkit/stylesheets/_colours.scss"; - -.manual-link { - cursor: pointer; - display: block; - text-decoration: underline; - color: #4a90e2; -} diff --git a/src/app/shared/palette/base-field/abstract-field-read.component.ts b/src/app/shared/palette/base-field/abstract-field-read.component.ts deleted file mode 100644 index 8f69479a4..000000000 --- a/src/app/shared/palette/base-field/abstract-field-read.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Input } from '@angular/core'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteContext } from './palette-context.enum'; - -export class AbstractFieldReadComponent { - - @Input() - caseField: CaseField; - - @Input() - caseReference: string; - - /** - * Optional. Enable context-aware rendering of fields. - */ - @Input() - context: PaletteContext = PaletteContext.DEFAULT; -} diff --git a/src/app/shared/palette/base-field/abstract-field-write.component.ts b/src/app/shared/palette/base-field/abstract-field-write.component.ts deleted file mode 100644 index 0250d0e21..000000000 --- a/src/app/shared/palette/base-field/abstract-field-write.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Input } from '@angular/core'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { AbstractControl } from '@angular/forms'; - -export class AbstractFieldWriteComponent { - @Input() - caseField: CaseField; - - @Input() - isExpanded = false; - - @Input() - registerControl: (control: T) => T; - - @Input() - idPrefix = ''; - - public id() { - return this.idPrefix + this.caseField.id; - } -} diff --git a/src/app/shared/palette/base-field/base-field.module.ts b/src/app/shared/palette/base-field/base-field.module.ts deleted file mode 100644 index 54825a140..000000000 --- a/src/app/shared/palette/base-field/base-field.module.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FieldReadComponent } from './field-read.component'; -import { ReactiveFormsModule } from '@angular/forms'; -import { FieldWriteComponent } from './field-write.component'; -import { FieldReadLabelComponent } from './field-read-label.component'; - -@NgModule({ - imports: [ - CommonModule, - ReactiveFormsModule, - ], - declarations: [ - FieldReadComponent, - FieldWriteComponent, - FieldReadLabelComponent, - ], - exports: [ - FieldReadComponent, - FieldWriteComponent, - ] -}) -export class BaseFieldModule {} diff --git a/src/app/shared/palette/base-field/field-read-label.component.spec.ts b/src/app/shared/palette/base-field/field-read-label.component.spec.ts deleted file mode 100644 index 62a9d3713..000000000 --- a/src/app/shared/palette/base-field/field-read-label.component.spec.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { DebugElement } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { By } from '@angular/platform-browser'; -import { text } from '../../../test/helpers'; -import { FieldReadLabelComponent } from './field-read-label.component'; - -const CASE_FIELD: CaseField = { - id: 'PersonFirstName', - label: 'First name', - field_type: { - id: 'Text', - type: 'Text' - }, - display_context: 'OPTIONAL', - value: 'Johnny' -}; - -const CASE_FIELD_OF_LABEL_TYPE: CaseField = { - id: 'PersonFirstName', - label: 'First name', - field_type: { - id: 'Text', - type: 'Label' - }, - display_context: 'OPTIONAL', - value: 'Johnny' -}; -const BY_FIELD_LABEL = By.css('.case-field__label'); - -describe('FieldReadLabelComponent', () => { - - let fixture: ComponentFixture; - let component: FieldReadLabelComponent; - let de: DebugElement; - - beforeEach(async(() => { - - TestBed - .configureTestingModule({ - imports: [ - FormsModule - ], - declarations: [ - FieldReadLabelComponent, - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(FieldReadLabelComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - component.withLabel = true; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should display label when `withLabel` is true', () => { - component.withLabel = true; - fixture.detectChanges(); - - let label = de.query(BY_FIELD_LABEL); - expect(label).toBeTruthy(); - expect(text(label)).toEqual(CASE_FIELD.label); - }); - - it('should NOT display label when `withLabel` is true but case field is of Label type', () => { - component.caseField = CASE_FIELD_OF_LABEL_TYPE; - component.withLabel = true; - fixture.detectChanges(); - - let label = de.query(BY_FIELD_LABEL); - expect(label).toBeFalsy(); - }); - - it('should NOT display label when `withLabel` is false', () => { - component.withLabel = false; - fixture.detectChanges(); - - let label = de.query(BY_FIELD_LABEL); - expect(label).toBeFalsy(); - }); -}); diff --git a/src/app/shared/palette/base-field/field-read-label.component.ts b/src/app/shared/palette/base-field/field-read-label.component.ts deleted file mode 100644 index 411349aff..000000000 --- a/src/app/shared/palette/base-field/field-read-label.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { CaseField } from '../../domain/definition/case-field.model'; - -@Component({ - selector: 'ccd-field-read-label', - templateUrl: './field-read-label.html', - styleUrls: [ - './field-read-label.scss' - ] -}) -export class FieldReadLabelComponent { - - @Input() - caseField: CaseField; - - @Input() - withLabel: boolean; - - public isLabel(): boolean { - return this.caseField.field_type.type === 'Label'; - } - - public isComplex(): boolean { - return this.caseField.field_type.type === 'Complex'; - } - -} diff --git a/src/app/shared/palette/base-field/field-read-label.html b/src/app/shared/palette/base-field/field-read-label.html deleted file mode 100644 index c40fa7f67..000000000 --- a/src/app/shared/palette/base-field/field-read-label.html +++ /dev/null @@ -1,7 +0,0 @@ -
-
{{caseField.label}}
-
- -
-
- diff --git a/src/app/shared/palette/base-field/field-read-label.scss b/src/app/shared/palette/base-field/field-read-label.scss deleted file mode 100644 index a2529303c..000000000 --- a/src/app/shared/palette/base-field/field-read-label.scss +++ /dev/null @@ -1,30 +0,0 @@ -@import 'node_modules/govuk_frontend_toolkit/stylesheets/_typography'; -@import 'node_modules/govuk_frontend_toolkit/stylesheets/_colours'; -@import 'node_modules/govuk_frontend_toolkit/stylesheets/_measurements'; -@import 'node_modules/govuk_frontend_toolkit/stylesheets/_shims'; -@import 'node_modules/govuk_frontend_toolkit/stylesheets/_css3'; -@import 'node_modules/govuk_frontend_toolkit/stylesheets/_conditionals'; - -.case-field { - - @extend %contain-floats; - @include box-sizing(border-box); - - margin-bottom: $gutter-half; - - @include media(tablet) { - margin-bottom: $gutter; - } - - .case-field__label { - display: block; - color: $text-colour; - padding-bottom: 2px; - - @include bold-19; - } - - .case-field__value { - @include core-19; - } -} diff --git a/src/app/shared/palette/base-field/field-read.component.spec.ts b/src/app/shared/palette/base-field/field-read.component.spec.ts deleted file mode 100644 index 2f798304b..000000000 --- a/src/app/shared/palette/base-field/field-read.component.spec.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { Component, DebugElement, Input } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { FieldReadComponent } from './field-read.component'; -import { PaletteService } from '../palette.service'; -import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { By } from '@angular/platform-browser'; -import createSpyObj = jasmine.createSpyObj; -import { PaletteContext } from './palette-context.enum'; - -const $FIELD_READ_LABEL = By.css('ccd-field-read-label'); -const $FIELD_TEST = By.css('ccd-field-read-label span.text-cls'); - -const CASE_FIELD: CaseField = { - id: 'PersonFirstName', - label: 'First name', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'Johnny', - display_context: 'READONLY' -}; -const CLASS = 'text-cls'; - -@Component({ - template: ` - - ` -}) -class FieldTestComponent {} - -@Component({ - selector: 'ccd-field-read-label', - template: ` - - ` -}) -class FieldReadLabelComponent { - @Input() - caseField: CaseField; - - @Input() - withLabel: boolean; -} - -describe('FieldReadComponent', () => { - - let fixture: ComponentFixture; - let component: FieldReadComponent; - let de: DebugElement; - - let paletteService: any; - - beforeEach(async(() => { - paletteService = createSpyObj('paletteService', [ - 'getFieldComponentClass' - ]); - paletteService.getFieldComponentClass.and.returnValue(FieldTestComponent); - - TestBed - .configureTestingModule({ - imports: [ - FormsModule - ], - declarations: [ - FieldReadComponent, - - // Mock - FieldTestComponent, - FieldReadLabelComponent, - ], - providers: [ - { provide: PaletteService, useValue: paletteService } - ] - }) - .compileComponents(); - - TestBed.overrideModule(BrowserDynamicTestingModule, { - set: { - entryComponents: [FieldTestComponent] - } - }); - - fixture = TestBed.createComponent(FieldReadComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - component.context = PaletteContext.CHECK_YOUR_ANSWER; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should get field read class from PaletteService', () => { - expect(paletteService.getFieldComponentClass).toHaveBeenCalledWith(CASE_FIELD, false); - }); - - it('should inject component instance as child', () => { - fixture.detectChanges(); - - let fieldReadLabelComponent = de.query($FIELD_READ_LABEL); - expect(fieldReadLabelComponent.children.length).toBe(1); - - let fieldReadLabel = fieldReadLabelComponent.componentInstance; - expect(fieldReadLabel.caseField).toBe(CASE_FIELD); - - let fieldTestComponent = de.query($FIELD_TEST); - expect(fieldTestComponent).toBeTruthy(); - - let fieldTest = fieldTestComponent.componentInstance; - expect(fieldTest.caseField).toBe(CASE_FIELD); - }); - - it('should pass context to field instance', () => { - fixture.detectChanges(); - - let fieldTest = de.query($FIELD_TEST).componentInstance; - expect(fieldTest.context).toBe(PaletteContext.CHECK_YOUR_ANSWER); - }); - - it('should NOT display label by default', () => { - fixture.detectChanges(); - - let fieldReadLabelComponent = de.query(By.css('ccd-field-read-label')); - let fieldReadLabel = fieldReadLabelComponent.componentInstance; - expect(fieldReadLabel.withLabel).toBe(false); - }); - - it('should display label if required', () => { - component.withLabel = true; - fixture.detectChanges(); - - let fieldReadLabelComponent = de.query(By.css('ccd-field-read-label')); - let fieldReadLabel = fieldReadLabelComponent.componentInstance; - expect(fieldReadLabel.withLabel).toBe(true); - }); -}); diff --git a/src/app/shared/palette/base-field/field-read.component.ts b/src/app/shared/palette/base-field/field-read.component.ts deleted file mode 100644 index f22631678..000000000 --- a/src/app/shared/palette/base-field/field-read.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - Component, - ComponentFactoryResolver, - Injector, - Input, - OnInit, - ViewChild, - ViewContainerRef -} from '@angular/core'; -import { PaletteService } from '../palette.service'; -import { AbstractFieldReadComponent } from './abstract-field-read.component'; - -@Component({ - selector: 'ccd-field-read', - templateUrl: './field-read.html' -}) -export class FieldReadComponent extends AbstractFieldReadComponent implements OnInit { - - @Input() - withLabel = false; - - @ViewChild('fieldContainer', {read: ViewContainerRef}) - fieldContainer: ViewContainerRef; - - constructor(private resolver: ComponentFactoryResolver, private paletteService: PaletteService) { - super(); - } - - ngOnInit(): void { - let componentClass = this.paletteService.getFieldComponentClass(this.caseField, false); - let injector = Injector.create([], this.fieldContainer.parentInjector); - let component = this.resolver.resolveComponentFactory(componentClass).create(injector); - - // Provide component @Inputs - component.instance['caseField'] = this.caseField; - component.instance['caseReference'] = this.caseReference; - component.instance['context'] = this.context; - - this.fieldContainer.insert(component.hostView); - } - -} diff --git a/src/app/shared/palette/base-field/field-read.html b/src/app/shared/palette/base-field/field-read.html deleted file mode 100644 index dc6ef459d..000000000 --- a/src/app/shared/palette/base-field/field-read.html +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/app/shared/palette/base-field/field-write.component.spec.ts b/src/app/shared/palette/base-field/field-write.component.spec.ts deleted file mode 100644 index efeee23cf..000000000 --- a/src/app/shared/palette/base-field/field-write.component.spec.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { Component, DebugElement } from '@angular/core'; -import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { PaletteService } from '../palette.service'; -import { BrowserDynamicTestingModule } from '@angular/platform-browser-dynamic/testing'; -import { FieldWriteComponent } from './field-write.component'; -import { CaseField } from '../../domain/definition/case-field.model'; -import createSpyObj = jasmine.createSpyObj; -import { FormValidatorsService } from '../../../core/form/form-validators.service'; - -const CLASS = 'person-first-name-cls'; - -@Component({ - template: ` -
- ` -}) -class FieldTestComponent {} - -describe('FieldWriteComponent', () => { - - const CASE_FIELD: CaseField = { - id: 'PersonFirstName', - field_type: { - id: 'Text', - type: 'Text' - }, - display_context: 'OPTIONAL', - label: 'First name' - }; - - let fixture: ComponentFixture; - let component: FieldWriteComponent; - let de: DebugElement; - - let paletteService: any; - let formValidatorService: any; - - let formGroup: FormGroup; - - beforeEach(async(() => { - formValidatorService = createSpyObj('formValidatorService', ['addValidators']); - paletteService = createSpyObj('paletteService', [ - 'getFieldComponentClass' - ]); - paletteService.getFieldComponentClass.and.returnValue(FieldTestComponent); - - formGroup = new FormGroup({}); - - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule - ], - declarations: [ - FieldWriteComponent, - FieldTestComponent - ], - providers: [ - { provide: PaletteService, useValue: paletteService }, - { provide: FormValidatorsService, useValue: formValidatorService } - ] - }) - .compileComponents(); - - TestBed.overrideModule(BrowserDynamicTestingModule, { - set: { - entryComponents: [FieldTestComponent] - } - }); - - fixture = TestBed.createComponent(FieldWriteComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - component.formGroup = formGroup; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should get field write class from PaletteService', () => { - expect(paletteService.getFieldComponentClass).toHaveBeenCalledWith(CASE_FIELD, true); - }); - - it('should inject component instance as child', () => { - let ngContent = de.children[0]; - expect(ngContent.children.length).toBe(1); - - let fieldTestComponent = ngContent.children[0]; - expect(fieldTestComponent.attributes['class']).toEqual(CLASS); - - let fieldTest = fieldTestComponent.componentInstance; - expect(fieldTest.caseField).toBe(CASE_FIELD); - expect(fieldTest.registerControl).not.toBeNull(); - }); - - it('should inject component instance with valid default `registerControl` function', () => { - let ngContent = de.children[0]; - let fieldTestComponent = ngContent.children[0]; - let fieldTest = fieldTestComponent.componentInstance; - - expect(Object.keys(formGroup.controls).length).toEqual(0); - - let control = new FormControl(); - fieldTest.registerControl(control); - - expect(formGroup.controls[CASE_FIELD.id]).toBe(control); - }); -}); diff --git a/src/app/shared/palette/base-field/field-write.component.ts b/src/app/shared/palette/base-field/field-write.component.ts deleted file mode 100644 index c80579995..000000000 --- a/src/app/shared/palette/base-field/field-write.component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { - Component, - ComponentFactoryResolver, - Injector, - Input, - OnInit, - ViewChild, - ViewContainerRef -} from '@angular/core'; -import { PaletteService } from '../palette.service'; -import { AbstractFieldWriteComponent } from './abstract-field-write.component'; -import { AbstractControl, FormControl, FormGroup } from '@angular/forms'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { FormValidatorsService } from '../../../core/form/form-validators.service'; - -@Component({ - selector: 'ccd-field-write', - template: ` - - ` -}) -export class FieldWriteComponent extends AbstractFieldWriteComponent implements OnInit { - - @Input() - formGroup: FormGroup; - - @ViewChild('fieldContainer', { read: ViewContainerRef }) - fieldContainer: ViewContainerRef; - - private defaultControlRegistrer(formGroup: FormGroup, - caseField: CaseField): (control: FormControl) => AbstractControl { - return control => { - if (formGroup.controls[caseField.id]) { - return formGroup.get(caseField.id); - } - this.formValidatorsService.addValidators(caseField, control); - formGroup.addControl(caseField.id, control); - return control; - }; - } - - constructor(private resolver: ComponentFactoryResolver, - private paletteService: PaletteService, - private formValidatorsService: FormValidatorsService) { - super(); - } - - ngOnInit(): void { - let componentClass = this.paletteService.getFieldComponentClass(this.caseField, true); - - let injector = Injector.create([], this.fieldContainer.parentInjector); - let component = this.resolver.resolveComponentFactory(componentClass).create(injector); - - // Provide component @Inputs - component.instance['caseField'] = this.caseField; - component.instance['registerControl'] = this.registerControl - || this.defaultControlRegistrer(this.formGroup, this.caseField); - component.instance['idPrefix'] = this.idPrefix; - if (this.caseField.field_type.id === 'AddressGlobal') { - component.instance['ignoreMandatory'] = true; - } - component.instance['isExpanded'] = this.isExpanded; - this.fieldContainer.insert(component.hostView); - } -} diff --git a/src/app/shared/palette/base-field/palette-context.enum.ts b/src/app/shared/palette/base-field/palette-context.enum.ts deleted file mode 100644 index f8b02dc16..000000000 --- a/src/app/shared/palette/base-field/palette-context.enum.ts +++ /dev/null @@ -1,4 +0,0 @@ -export enum PaletteContext { - DEFAULT = 'DEFAULT', - CHECK_YOUR_ANSWER = 'CHECK_YOUR_ANSWER', -} diff --git a/src/app/shared/palette/collection/collection-field.scss b/src/app/shared/palette/collection/collection-field.scss deleted file mode 100644 index 4f551a626..000000000 --- a/src/app/shared/palette/collection/collection-field.scss +++ /dev/null @@ -1,22 +0,0 @@ -.collection-field-table { - tr:first-child>td { - padding-top: 0; - } - tr:last-child>td { - border-bottom: none; - } - td.collection-actions { - width: 1px; - white-space: nowrap; - } -} -.collection-title{ - height: 51px; -} -.float-left { - float: left; - padding-top: 8px; -} -.float-right { - float: right; -} diff --git a/src/app/shared/palette/collection/read-collection-field.component.spec.ts b/src/app/shared/palette/collection/read-collection-field.component.spec.ts deleted file mode 100644 index f6068679d..000000000 --- a/src/app/shared/palette/collection/read-collection-field.component.spec.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { ReadCollectionFieldComponent } from './read-collection-field.component'; -import { By } from '@angular/platform-browser'; -import { MockComponent } from 'ng2-mock-component'; -import { PaletteContext } from '../base-field/palette-context.enum'; - -describe('ReadCollectionFieldComponent', () => { - - const $CHILD_FIELDS = By.css('table>tbody>tr>td>ccd-field-read'); - - const NESTED_FIELD_TYPE: FieldType = { - id: 'Text', - type: 'Text' - }; - const FIELD_TYPE: FieldType = { - id: 'Collection', - type: 'Collection', - collection_field_type: NESTED_FIELD_TYPE - }; - const VALUES = [ - { - value: 'Pierre', - }, - { - value: 'Paul', - }, - { - value: 'Jacques', - } - ]; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - field_type: FIELD_TYPE, - display_context: 'OPTIONAL', - value: VALUES - }; - - let FieldReadComponent = MockComponent({ - selector: 'ccd-field-read', - inputs: ['caseField', 'context'] - }); - - let fixture: ComponentFixture; - let component: ReadCollectionFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - ReadCollectionFieldComponent, - - // Mock - FieldReadComponent - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadCollectionFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - component.context = PaletteContext.CHECK_YOUR_ANSWER; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render values as a table with one row and one cell per value', () => { - component.caseField.value = VALUES; - fixture.detectChanges(); - - let cells = de.queryAll($CHILD_FIELDS); - - for (let i = 0; i < VALUES.length; i++) { - - let field = cells[i].componentInstance; - - expect(field.caseField).toEqual({ - id: i, - label: 'X ' + (i + 1), - field_type: { - id: 'Text', - type: 'Text' - }, - value: VALUES[i].value - }); - } - }); - - it('should NOT render anything when value is undefined', () => { - component.caseField.value = undefined; - fixture.detectChanges(); - - expect(de.children.length).toBe(0); - }); - - it('should NOT render anything when value is null', () => { - component.caseField.value = null; - fixture.detectChanges(); - - expect(de.children.length).toBe(0); - }); - - it('should NOT render anything when value is empty array', () => { - component.caseField.value = []; - fixture.detectChanges(); - - expect(de.children.length).toBe(0); - }); - - it('render values as a table with one row and one cell per value', () => { - component.caseField.value = VALUES; - fixture.detectChanges(); - - let cells = de.queryAll($CHILD_FIELDS); - - for (let i = 0; i < VALUES.length; i++) { - - let field = cells[i].componentInstance; - - expect(field.context).toEqual(PaletteContext.CHECK_YOUR_ANSWER); - } - }); -}); diff --git a/src/app/shared/palette/collection/read-collection-field.component.ts b/src/app/shared/palette/collection/read-collection-field.component.ts deleted file mode 100644 index f5b57a636..000000000 --- a/src/app/shared/palette/collection/read-collection-field.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; -import { Component } from '@angular/core'; - -@Component({ - selector: 'ccd-read-collection-field', - templateUrl: './read-collection-field.html', - styleUrls: ['./collection-field.scss'] -}) -export class ReadCollectionFieldComponent extends AbstractFieldReadComponent { - -} diff --git a/src/app/shared/palette/collection/read-collection-field.html b/src/app/shared/palette/collection/read-collection-field.html deleted file mode 100644 index d9daa15fc..000000000 --- a/src/app/shared/palette/collection/read-collection-field.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - -
- -
diff --git a/src/app/shared/palette/collection/write-collection-field.component.spec.ts b/src/app/shared/palette/collection/write-collection-field.component.spec.ts deleted file mode 100644 index 598607931..000000000 --- a/src/app/shared/palette/collection/write-collection-field.component.spec.ts +++ /dev/null @@ -1,308 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { WriteCollectionFieldComponent } from './write-collection-field.component'; -import { DebugElement } from '@angular/core'; -import { MockComponent } from 'ng2-mock-component'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { By } from '@angular/platform-browser'; -import { FormValidatorsService } from '../../../core/form/form-validators.service'; -import { MatDialog, MatDialogRef } from '@angular/material'; -import { ScrollToService } from '@nicky-lenaers/ngx-scroll-to'; -import { of } from 'rxjs'; -import { RemoveDialogComponent } from '../../remove-dialog/remove-dialog.component'; -import createSpyObj = jasmine.createSpyObj; -import any = jasmine.any; - -const FIELD_ID = 'Values'; -const SIMPLE_FIELD_TYPE: FieldType = { - id: 'Text', - type: 'Collection', - collection_field_type: { - id: 'Text', - type: 'Text' - } -}; - -const COMPLEX_FIELD_TYPE: FieldType = { - id: 'Address', - type: 'Collection', - collection_field_type: { - id: 'Address', - type: 'Complex' - } -}; -const VALUES = [ - { - id: '123', - value: 'v1' - }, - { - id: '456', - value: 'v2' - } -]; - -const FORM_GROUP: FormGroup = new FormGroup({}); -const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(FIELD_ID, control); - return control; -}; - -describe('WriteCollectionFieldComponent', () => { - - const $WRITE_FIELDS = By.css('ccd-field-write'); - const $ADD_BUTTON_TOP = By.css('.form-group>.panel>.button:nth-of-type(1)'); - const $ADD_BUTTON_BOTTOM = By.css('.form-group>.panel>.button:nth-of-type(2)'); - const $REMOVE_BUTTONS = By.css('.collection-title .button.button-secondary'); - - let FieldWriteComponent = MockComponent({ - selector: 'ccd-field-write', - inputs: ['caseField', 'registerControl', 'idPrefix', 'isExpanded'], - template: '', - }); - - let fixture: ComponentFixture; - let component: WriteCollectionFieldComponent; - - let de: DebugElement; - let formValidatorService: any; - let dialog: any; - let dialogRef: any; - let scrollToService: any; - - let caseField: CaseField; - - beforeEach(async(() => { - formValidatorService = createSpyObj('formValidatorService', ['addValidators']); - dialogRef = createSpyObj>('MatDialogRef', ['afterClosed']); - dialogRef.afterClosed.and.returnValue(of()); - dialog = createSpyObj('MatDialog', ['open']); - dialog.open.and.returnValue(dialogRef); - scrollToService = createSpyObj('scrollToService', ['scrollTo']); - scrollToService.scrollTo.and.returnValue(of()); - - caseField = { - id: FIELD_ID, - label: 'X', - field_type: SIMPLE_FIELD_TYPE, - display_context: 'OPTIONAL', - value: VALUES.slice(0) - }; - - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - PaletteUtilsModule - ], - declarations: [ - WriteCollectionFieldComponent, - // Mock - FieldWriteComponent, - ], - providers: [ - { provide: FormValidatorsService, useValue: formValidatorService }, - { provide: MatDialog, useValue: dialog }, - { provide: ScrollToService, useValue: scrollToService }, - RemoveDialogComponent - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteCollectionFieldComponent); - component = fixture.componentInstance; - - component.registerControl = REGISTER_CONTROL; - component.caseField = caseField; - - component.ngOnInit(); - - de = fixture.debugElement; - fixture.detectChanges(); - - // Manually populate the form array as item field are mocked and can't register themselves - VALUES.forEach((collectionItem, index) => { - component.buildControlRegistrer(collectionItem.id, index)(new FormControl(collectionItem.value)); - }); - - fixture.detectChanges(); - })); - - it('should render a row with a write field for each items', () => { - let writeFields = de.queryAll($WRITE_FIELDS); - - expect(writeFields.length).toEqual(2); - }); - - it('should pass ID, type and value to child field', () => { - let field1 = de.queryAll($WRITE_FIELDS)[0].componentInstance; - - expect(field1.caseField.id).toEqual('0'); - expect(field1.caseField.value).toEqual(VALUES[0].value); - expect(field1.caseField.field_type).toEqual(SIMPLE_FIELD_TYPE.collection_field_type); - }); - - it('should pass ID prefix without index when simple type', () => { - let field1 = de.queryAll($WRITE_FIELDS)[0].componentInstance; - let field2 = de.queryAll($WRITE_FIELDS)[1].componentInstance; - - expect(field1.idPrefix).toEqual(caseField.id + '_'); - expect(field2.idPrefix).toEqual(caseField.id + '_'); - }); - - it('should pass ID prefix with index when Complex type', () => { - caseField.field_type = COMPLEX_FIELD_TYPE; - component.ngOnInit(); - fixture.detectChanges(); - - let field1 = de.queryAll($WRITE_FIELDS)[0].componentInstance; - let field2 = de.queryAll($WRITE_FIELDS)[1].componentInstance; - - expect(field1.idPrefix).toEqual(caseField.id + '_' + 0 + '_'); - expect(field2.idPrefix).toEqual(caseField.id + '_' + 1 + '_'); - }); - - it('should pass valid `registerControl` function registering control as value of item', () => { - // Reset form array - component.ngOnInit(); - fixture.detectChanges(); - - let field1 = de.queryAll($WRITE_FIELDS)[0].componentInstance; - - expect(component.formArray.controls.length).toBe(0); - - const control = new FormControl('x'); - field1.registerControl(control); - - expect(component.formArray.controls.length).toBe(1); - expect(component.formArray.get('0.value')).toBe(control); - }); - - it('should add empty item to collection when add button is clicked', () => { - let addButton = de.query($ADD_BUTTON_TOP); - - addButton.nativeElement.click(); - fixture.detectChanges(); - - let writeFields = de.queryAll($WRITE_FIELDS); - - expect(writeFields.length).toEqual(3); - - let addedField = writeFields[2].componentInstance; - - // Show empty case field - expect(addedField.caseField.id).toEqual('2'); - expect(addedField.caseField.value).toBeNull(); - expect(addedField.caseField.field_type).toEqual(SIMPLE_FIELD_TYPE.collection_field_type); - }); - - it('should focus 1st input of newly added item', done => { - let addButton = de.query($ADD_BUTTON_TOP); - - addButton.nativeElement.click(); - fixture.detectChanges(); - - let writeFields = de.queryAll($WRITE_FIELDS); - let lastWriteField = writeFields[writeFields.length - 1]; - - let lastFieldInput = lastWriteField.query(By.css('input')); - - setTimeout(() => { - // Timeout required for focus to be effective - expect(lastFieldInput.nativeElement).toBe(document.activeElement); - done(); - }); - }); - - it('should scroll when item added with top button', done => { - let addButton = de.query($ADD_BUTTON_TOP); - - addButton.nativeElement.click(); - fixture.detectChanges(); - - let writeFields = de.queryAll($WRITE_FIELDS); - let lastIndex = writeFields.length - 1; - - setTimeout(() => { - expect(scrollToService.scrollTo).toHaveBeenCalledWith({ - target: `${FIELD_ID}_${lastIndex}`, - duration: 1000, - offset: -150, - }); - done(); - }); - }); - - it('should NOT scroll when item added with bottom button', done => { - let addButton = de.query($ADD_BUTTON_BOTTOM); - - addButton.nativeElement.click(); - fixture.detectChanges(); - - setTimeout(() => { - expect(scrollToService.scrollTo).not.toHaveBeenCalled(); - done(); - }); - }); - - it('should have 1 Remove button per item', () => { - let removeButtons = de.queryAll($REMOVE_BUTTONS); - - expect(removeButtons.length).toBe(VALUES.length); - }); - - it('should display removal confirmation dialog when remove button is clicked', () => { - let removeButtons = de.queryAll($REMOVE_BUTTONS); - - let removeFirstButton = removeButtons[0]; - removeFirstButton.nativeElement.click(); - fixture.detectChanges(); - - expect(dialog.open).toHaveBeenCalledWith(RemoveDialogComponent, any(Object)); - }); - - it('should remove item from collection when remove button is clicked and confirmed', () => { - // Confirm removal through mock dialog - dialogRef.afterClosed.and.returnValue(of('Remove')); - - let removeButtons = de.queryAll($REMOVE_BUTTONS); - - let removeFirstButton = removeButtons[0]; - removeFirstButton.nativeElement.click(); - fixture.detectChanges(); - - let writeFields = de.queryAll($WRITE_FIELDS); - expect(writeFields.length).toBe(VALUES.length - 1); - - let field2 = writeFields[0].componentInstance; - expect(field2.caseField.id).toEqual('0'); - expect(field2.caseField.value).toEqual(VALUES[1].value); - expect(component.formArray.controls.length).toBe(1); - expect(component.formArray.controls[0].value).toEqual(VALUES[1]); - }); - - it('should NOT remove item from collection when remove button is clicked and declined', () => { - // Declined removal through mock dialog - dialogRef.afterClosed.and.returnValue(of('Cancel')); - - let removeButtons = de.queryAll($REMOVE_BUTTONS); - - let removeFirstButton = removeButtons[0]; - removeFirstButton.nativeElement.click(); - fixture.detectChanges(); - - let writeFields = de.queryAll($WRITE_FIELDS); - expect(writeFields.length).toBe(VALUES.length); - }); - - it('should handle null or undefined values as empty array', () => { - caseField.value = null; - component.ngOnInit(); - fixture.detectChanges(); - - let fields = de.queryAll($WRITE_FIELDS); - expect(fields.length).toBe(0); - }); -}); diff --git a/src/app/shared/palette/collection/write-collection-field.component.ts b/src/app/shared/palette/collection/write-collection-field.component.ts deleted file mode 100644 index dcbfa39e5..000000000 --- a/src/app/shared/palette/collection/write-collection-field.component.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { Component, ElementRef, OnInit, QueryList, ViewChildren } from '@angular/core'; -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms'; -import { FormValidatorsService } from '../../../core/form/form-validators.service'; -import { MatDialog, MatDialogConfig } from '@angular/material'; -import { RemoveDialogComponent } from '../../remove-dialog/remove-dialog.component'; -import { ScrollToService } from '@nicky-lenaers/ngx-scroll-to'; -import { finalize } from 'rxjs/operators'; - -@Component({ - selector: 'ccd-write-collection-field', - templateUrl: './write-collection-field.html', - styleUrls: ['./collection-field.scss'] -}) -export class WriteCollectionFieldComponent extends AbstractFieldWriteComponent implements OnInit { - formArray: FormArray; - - @ViewChildren('collectionItem') - private items: QueryList; - - constructor(private formValidatorsService: FormValidatorsService, - private dialog: MatDialog, - private scrollToService: ScrollToService, - ) { - super(); - } - - ngOnInit(): void { - this.caseField.value = this.caseField.value || []; - - this.formArray = this.registerControl(new FormArray([])); - } - - buildCaseField(item, index: number): CaseField { - return { - id: index.toString(), - field_type: this.caseField.field_type.collection_field_type, - display_context: this.caseField.display_context, - value: item.value, - label: null - }; - } - - buildControlRegistrer(id: string, index: number): (control: FormControl) => AbstractControl { - return control => { - if (this.formArray.at(index)) { - return this.formArray.at(index).get('value'); - } - this.formValidatorsService.addValidators(this.caseField, control); - this.formArray.push( - new FormGroup({ - id: new FormControl(id), - value: control - }) - ); - return control; - }; - } - - buildIdPrefix(index: number): string { - if ('Complex' === this.caseField.field_type.collection_field_type.type) { - return this.idPrefix + this.caseField.id + '_' + index + '_'; - } else { - return this.idPrefix + this.caseField.id + '_'; - } - } - - addItem(doScroll: boolean): void { - // Manually resetting errors is required to prevent `ExpressionChangedAfterItHasBeenCheckedError` - this.formArray.setErrors(null); - this.caseField.value.push({value: null}); - - let lastIndex = this.caseField.value.length - 1; - - // Timeout is required for the collection item to be rendered before it can be scrolled to or focused. - if (doScroll) { - setTimeout(() => { - this.scrollToService.scrollTo({ - target: this.buildIdPrefix(lastIndex) + lastIndex, - duration: 1000, - offset: -150, - }) - .pipe(finalize(() => this.focusLastItem())) - .subscribe(null, console.error); - }); - } else { - setTimeout(() => this.focusLastItem()); - } - } - - private focusLastItem() { - this.items.last.nativeElement.querySelector('input').focus(); - } - - removeItem(index: number): void { - this.caseField.value.splice(index, 1); - this.formArray.removeAt(index); - } - - itemLabel(index: number) { - let displayIndex = index + 1; - return index ? `${this.caseField.label} ${displayIndex}` : this.caseField.label; - } - - openModal(i: number) { - const dialogConfig = new MatDialogConfig(); - dialogConfig.disableClose = true; - dialogConfig.autoFocus = true; - dialogConfig.ariaLabel = 'Label'; - dialogConfig.height = '220px'; - dialogConfig.width = '550px'; - dialogConfig.panelClass = 'dialog'; - - dialogConfig.closeOnNavigation = false; - dialogConfig.position = { - top: window.innerHeight / 2 - 110 + 'px', left: window.innerWidth / 2 - 275 + 'px' - }; - - const dialogRef = this.dialog.open(RemoveDialogComponent, dialogConfig); - - dialogRef.afterClosed().subscribe(result => { - if (result === 'Remove') { - this.removeItem(i); - } - }); - } - -} diff --git a/src/app/shared/palette/collection/write-collection-field.html b/src/app/shared/palette/collection/write-collection-field.html deleted file mode 100644 index ed7ef49f4..000000000 --- a/src/app/shared/palette/collection/write-collection-field.html +++ /dev/null @@ -1,32 +0,0 @@ -
- -
- -

- {{caseField | ccdFieldLabel}} -

- - {{caseField.hint_text}} - {{formArray.errors | ccdFirstError}} - -
- -
-
-
- -
-
- -
-
- -
- -
- - - -
- -
diff --git a/src/app/shared/palette/complex/complex.module.ts b/src/app/shared/palette/complex/complex.module.ts deleted file mode 100644 index 2307746da..000000000 --- a/src/app/shared/palette/complex/complex.module.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ReadComplexFieldTableComponent } from './read-complex-field-table.component'; -import { FieldsFilterPipe } from './fields-filter.pipe'; -import { BaseFieldModule } from '../base-field/base-field.module'; -import { WriteComplexFieldComponent } from './write-complex-field.component'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { IsCompoundPipe } from '../utils/is-compound.pipe'; -import { ConditionalShowModule } from '../../conditional-show/conditional-show.module'; -import { MarkdownModule } from '../../markdown/markdown.module'; -import { ReadComplexFieldRawComponent } from './read-complex-field-raw.component'; -import { ReadComplexFieldComponent } from './read-complex-field.component'; - -@NgModule({ - imports: [ - CommonModule, - BaseFieldModule, - PaletteUtilsModule, - ConditionalShowModule, - MarkdownModule - ], - providers: [ - IsCompoundPipe, - ], - declarations: [ - ReadComplexFieldComponent, - ReadComplexFieldTableComponent, - ReadComplexFieldRawComponent, - WriteComplexFieldComponent, - FieldsFilterPipe, - ], - entryComponents: [ - ReadComplexFieldComponent, - WriteComplexFieldComponent, - ], - exports: [ - WriteComplexFieldComponent - ] -}) -export class ComplexModule {} diff --git a/src/app/shared/palette/complex/fields-filter.pipe.spec.ts b/src/app/shared/palette/complex/fields-filter.pipe.spec.ts deleted file mode 100644 index fbe82206c..000000000 --- a/src/app/shared/palette/complex/fields-filter.pipe.spec.ts +++ /dev/null @@ -1,442 +0,0 @@ -import { FieldsFilterPipe } from './fields-filter.pipe'; -import { CaseField } from '../../domain/definition/case-field.model'; - -describe('FieldsFilterPipe', () => { - - const caseBuilder = (fields: CaseField[], value?: any): CaseField => { - return { - id: 'Applicant', - label: 'Applicant', - display_context: 'OPTIONAL', - field_type: { - id: 'ApplicantType', - type: 'Complex', - complex_fields: fields - }, - value: value - }; - }; - - let fieldsFilter: FieldsFilterPipe; - - beforeEach(() => { - fieldsFilter = new FieldsFilterPipe(); - }); - - it('should handle null or undefined fields', () => { - expect(fieldsFilter.transform(undefined)).toEqual([]); - expect(fieldsFilter.transform(null)).toEqual([]); - }); - - describe('with value embedded in fields', () => { - const FIELDS_WITH_VALUES: CaseField[] = [ - { - id: 'PersonFirstName', - label: 'First name', - value: 'John', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - } - ]; - - const FIELDS_WITH_VALUES_AND_MISSING: CaseField[] = [ - { - id: 'PersonFirstName', - label: 'First name', - value: 'John', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - }, - { - id: 'PersonLastName', - label: 'Last name', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - } - ]; - - const FIELDS_WITH_VALUES_AND_FALSE: CaseField[] = [ - { - id: 'PersonFirstName', - label: 'First name', - value: 'John', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - }, - { - id: 'PersonGender', - label: 'Gender', - display_context: 'OPTIONAL', - field_type: { - id: 'YesOrNo', - type: 'YesOrNo' - }, - value: false - } - ]; - - const FIELDS_WITH_VALUES_AND_ZERO: CaseField[] = [ - { - id: 'PersonFirstName', - label: 'First name', - value: 'John', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - }, - { - id: 'PersonChildren', - label: 'Children', - display_context: 'OPTIONAL', - field_type: { - id: 'Number', - type: 'Number' - }, - value: 0 - } - ]; - - it('should return fields with embedded value as is', () => { - let filteredFields = fieldsFilter.transform(caseBuilder(FIELDS_WITH_VALUES)); - - expect(filteredFields).toEqual(FIELDS_WITH_VALUES); - }); - - it('should filter out fields with embedded value empty', () => { - FIELDS_WITH_VALUES_AND_MISSING[1].value = ''; - - let filteredFields = fieldsFilter.transform(caseBuilder(FIELDS_WITH_VALUES_AND_MISSING)); - - expect(filteredFields).toEqual(FIELDS_WITH_VALUES); - }); - - it('should filter out fields with embedded value `undefined`', () => { - FIELDS_WITH_VALUES_AND_MISSING[1].value = undefined; - - let filteredFields = fieldsFilter.transform(caseBuilder(FIELDS_WITH_VALUES_AND_MISSING)); - - expect(filteredFields).toEqual(FIELDS_WITH_VALUES); - }); - - it('should filter out fields with embedded value `null`', () => { - FIELDS_WITH_VALUES_AND_MISSING[1].value = null; - - let filteredFields = fieldsFilter.transform(caseBuilder(FIELDS_WITH_VALUES_AND_MISSING)); - - expect(filteredFields).toEqual(FIELDS_WITH_VALUES); - }); - - it('should NOT filter out fields with embedded value `false`', () => { - let filteredFields = fieldsFilter.transform(caseBuilder(FIELDS_WITH_VALUES_AND_FALSE)); - - expect(filteredFields).toEqual(FIELDS_WITH_VALUES_AND_FALSE); - }); - - it('should NOT filter out fields with embedded value `0`', () => { - let filteredFields = fieldsFilter.transform(caseBuilder(FIELDS_WITH_VALUES_AND_ZERO)); - - expect(filteredFields).toEqual(FIELDS_WITH_VALUES_AND_ZERO); - }); - }); - - describe('with value outside of fields', () => { - const EXPECTED_FILTERED_FIELDS: CaseField[] = [ - { - id: 'PersonFirstName', - label: 'First name', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'John' - } - ]; - - const FIELDS_WITHOUT_VALUES: CaseField[] = [ - { - id: 'PersonFirstName', - label: 'First name', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - }, - { - id: 'PersonLastName', - label: 'Last name', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - } - ]; - - const FIELDS_WITH_VALUES: CaseField[] = [ - { - id: 'PersonFirstName', - label: 'First name', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'John' - }, - { - id: 'PersonLastName', - label: 'Last name', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'Doe' - } - ]; - - const VALUES_ALL = { - 'PersonFirstName': 'John', - 'PersonLastName': 'Doe' - }; - - const VALUES_AND_MISSING = { - 'PersonFirstName': 'John' - }; - - it('should return fields with external value as fields with embedded value', () => { - FIELDS_WITH_VALUES[1].value = 'Doe'; - - let filteredFields = fieldsFilter.transform(caseBuilder(FIELDS_WITHOUT_VALUES, VALUES_ALL)); - - expect(filteredFields).toEqual(FIELDS_WITH_VALUES); - }); - - it('should filter out fields with external value empty', () => { - VALUES_AND_MISSING['PersonLastName'] = ''; - - let filteredFields = fieldsFilter.transform(caseBuilder(FIELDS_WITHOUT_VALUES, VALUES_AND_MISSING)); - - expect(filteredFields).toEqual(EXPECTED_FILTERED_FIELDS); - }); - - it('should filter out fields with external value `undefined`', () => { - VALUES_AND_MISSING['PersonLastName'] = undefined; - - let filteredFields = fieldsFilter.transform(caseBuilder(FIELDS_WITHOUT_VALUES, VALUES_AND_MISSING)); - - expect(filteredFields).toEqual(EXPECTED_FILTERED_FIELDS); - }); - - it('should filter out fields with external value `null`', () => { - VALUES_AND_MISSING['PersonLastName'] = null; - - let filteredFields = fieldsFilter.transform(caseBuilder(FIELDS_WITHOUT_VALUES, VALUES_AND_MISSING)); - - expect(filteredFields).toEqual(EXPECTED_FILTERED_FIELDS); - }); - - it('should NOT filter out fields with external value `0`', () => { - VALUES_AND_MISSING['PersonLastName'] = 0; - FIELDS_WITH_VALUES[1].value = 0; - - let filteredFields = fieldsFilter.transform(caseBuilder(FIELDS_WITHOUT_VALUES, VALUES_AND_MISSING)); - - expect(filteredFields).toEqual(FIELDS_WITH_VALUES); - }); - - it('should NOT filter out fields with external value `false`', () => { - VALUES_AND_MISSING['PersonLastName'] = false; - FIELDS_WITH_VALUES[1].value = false; - - let filteredFields = fieldsFilter.transform(caseBuilder(FIELDS_WITHOUT_VALUES, VALUES_AND_MISSING)); - - expect(filteredFields).toEqual(FIELDS_WITH_VALUES); - }); - }); - - describe('with complex type in fields', () => { - const COMPLEX_WITH_CHILDREN: CaseField[] = [ - { - id: 'Person', - label: 'Person', - display_context: 'OPTIONAL', - field_type: { - id: 'Person', - type: 'Complex', - complex_fields: [ - { - id: 'PersonFirstName', - label: 'First name', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'John' - } - ] - } - } - ]; - - const COMPLEX_WITHOUT_CHILDREN: CaseField[] = [ - { - id: 'Person', - label: 'Person', - display_context: 'OPTIONAL', - field_type: { - id: 'Person', - type: 'Complex', - complex_fields: [] - } - } - ]; - - const COMPLEX_WITH_EMPTY_CHILDREN: CaseField[] = [ - { - id: 'Person', - label: 'Person', - display_context: 'OPTIONAL', - field_type: { - id: 'Person', - type: 'Complex', - complex_fields: [ - { - id: 'FirstName', - label: 'First name', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: '' - } - ] - } - } - ]; - - const COMPLEX_WITH_EXTERNAL_VALUES: CaseField = { - id: 'Person', - label: 'Person', - display_context: 'OPTIONAL', - field_type: { - id: 'Person', - type: 'Complex', - complex_fields: [ - { - id: 'FirstNameContainerContainer', - label: 'First name container container', - display_context: 'OPTIONAL', - field_type: { - id: 'Complex', - type: 'Complex', - complex_fields: [ - { - id: 'FirstNameContainer', - label: 'First name container', - display_context: 'OPTIONAL', - field_type: { - id: 'Complex', - type: 'Complex', - complex_fields: [ - { - id: 'FirstName', - label: 'First name', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - } - ] - } - } - ] - } - } - ] - }, - value: { - 'FirstNameContainerContainer': { - 'FirstNameContainer': { - 'FirstName': 'Doe' - } - } - } - }; - - it('should NOT filter out Complex, even though Complex value itself is undefined but children have values', () => { - let filteredFields = fieldsFilter.transform(caseBuilder(COMPLEX_WITH_CHILDREN)); - - expect(filteredFields).toEqual(COMPLEX_WITH_CHILDREN); - }); - - it('should filter out Complex without fields', () => { - let filteredFields = fieldsFilter.transform(caseBuilder(COMPLEX_WITHOUT_CHILDREN)); - - expect(filteredFields).toEqual([]); - }); - - it('should filter out Complex when ALL children have empty values', () => { - let filteredFields = fieldsFilter.transform(caseBuilder(COMPLEX_WITH_EMPTY_CHILDREN)); - - expect(filteredFields).toEqual([]); - }); - - it('should NOT filter out Complex which has a great-grand-child with value', () => { - let filteredFields = fieldsFilter.transform(COMPLEX_WITH_EXTERNAL_VALUES); - - expect(filteredFields.length).toEqual(1); - }); - }); - - describe('option to keep empty fields', () => { - const FIELDS_WITH_VALUES_AND_MISSING: CaseField[] = [ - { - id: 'PersonFirstName', - label: 'First name', - value: 'John', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - }, - { - id: 'PersonLastName', - label: 'Last name', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - } - ]; - - it('should not filter out fields with embedded value empty', () => { - FIELDS_WITH_VALUES_AND_MISSING[1].value = ''; - - let filteredFields = fieldsFilter.transform(caseBuilder(FIELDS_WITH_VALUES_AND_MISSING), true); - - expect(filteredFields).toEqual(FIELDS_WITH_VALUES_AND_MISSING); - }); - }); -}); diff --git a/src/app/shared/palette/complex/fields-filter.pipe.ts b/src/app/shared/palette/complex/fields-filter.pipe.ts deleted file mode 100644 index 1b171a7d8..000000000 --- a/src/app/shared/palette/complex/fields-filter.pipe.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import { CaseField } from '../../domain/definition/case-field.model'; - -@Pipe({ - name: 'ccdFieldsFilter' -}) -export class FieldsFilterPipe implements PipeTransform { - - private static readonly EMPTY_VALUES = [ - undefined, - null, - '', - {} - ]; - - private static readonly NESTED_TYPES = { - 'Complex': FieldsFilterPipe.isValidComplex - }; - - /** - * Complex type should have at least on simple field descendant with a value. - * - * @param field - * @param values - * @returns {boolean} - */ - private static isValidComplex(field: CaseField, values?: object): boolean { - values = values || {}; - let type = field.field_type; - let value = FieldsFilterPipe.getValue(field, values); - - let hasChildrenWithValue = type.complex_fields.find(f => { - return FieldsFilterPipe.keepField(f, value); - }); - - return !!hasChildrenWithValue; - } - - private static isEmpty(value: any): boolean { - return FieldsFilterPipe.EMPTY_VALUES.indexOf(value) !== -1 - || value.length === 0; - } - - private static isCompound(field: CaseField): boolean { - return FieldsFilterPipe.NESTED_TYPES[field.field_type.type]; - } - - private static isValidCompound(field: CaseField, value?: object): boolean { - return FieldsFilterPipe.isCompound(field) - && FieldsFilterPipe.NESTED_TYPES[field.field_type.type](field, value); - } - - private static keepField(field: CaseField, value?: object): boolean { - value = value || {}; - - if (FieldsFilterPipe.isCompound(field)) { - return FieldsFilterPipe.isValidCompound(field, value); - } - - return !FieldsFilterPipe.isEmpty(field.value) - || !FieldsFilterPipe.isEmpty(value[field.id]); - } - - private static getValue(field: CaseField, values: any): any { - return FieldsFilterPipe.isEmpty(field.value) ? values[field.id] : field.value; - } - - /** - * Filter out fields having no data to display and harmonise field values coming parent's value. - * - * @param complexField - * @param keepEmpty - * @returns {any} - */ - transform(complexField: CaseField, keepEmpty?: boolean): CaseField[] { - if (!complexField || !complexField.field_type) { - return []; - } - - let fields = complexField.field_type.complex_fields || []; - let values = complexField.value || {}; - - return fields - .map(f => { - let clone = { ...f }; - - let value = FieldsFilterPipe.getValue(f, values); - - if (!FieldsFilterPipe.isEmpty(value)) { - clone.value = value; - } - - return clone; - }) - .filter(f => keepEmpty || FieldsFilterPipe.keepField(f)) - .map(f => { - f.display_context = complexField.display_context; - return f; - }); - } -} diff --git a/src/app/shared/palette/complex/read-complex-field-raw.component.spec.ts b/src/app/shared/palette/complex/read-complex-field-raw.component.spec.ts deleted file mode 100644 index f73ff1f63..000000000 --- a/src/app/shared/palette/complex/read-complex-field-raw.component.spec.ts +++ /dev/null @@ -1,411 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { ConditionalShowModule } from '../../conditional-show/conditional-show.module'; -import { ReadComplexFieldRawComponent } from './read-complex-field-raw.component'; -import { FieldsFilterPipe } from './fields-filter.pipe'; -import { DebugElement } from '@angular/core'; -import { By } from '@angular/platform-browser'; -import { MockComponent } from 'ng2-mock-component'; -import { PaletteContext } from '../base-field/palette-context.enum'; -import { text } from '../../../test/helpers'; - -const initTests = (caseField, mocks) => { - let fixture: ComponentFixture; - let component: ReadComplexFieldRawComponent; - let de: DebugElement; - - TestBed - .configureTestingModule({ - imports: [ - PaletteUtilsModule, - ConditionalShowModule - ], - declarations: [ - ReadComplexFieldRawComponent, - FieldsFilterPipe, - - ...mocks - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadComplexFieldRawComponent); - component = fixture.componentInstance; - - component.caseField = caseField; - component.context = PaletteContext.CHECK_YOUR_ANSWER; - - de = fixture.debugElement; - fixture.detectChanges(); - - return { - de, - component, - fixture, - }; -}; - -const expectCaseField = (de, caseField) => { - expect(de.componentInstance.caseField).toEqual(caseField) -}; - -const expectLabel = (de: DebugElement, label) => { - expect(text(de)).toEqual(label) -}; - -const expectContext = (de, expectedContext) => { - expect(de.componentInstance.context).toEqual(expectedContext) -}; - -describe('ReadComplexFieldRawComponent', () => { - - const $COMPLEX_LIST = By.css('dl.complex-raw'); - const $COMPLEX_LIST_ITEMS = By.css('dl.complex-raw>dd'); - const $COMPLEX_LIST_LABELS = By.css('dl.complex-raw>dt'); - const $COMPLEX_LIST_VALUES = By.css('dl.complex-raw>dd>ccd-field-read'); - - let FieldReadComponent; - - let fixture: ComponentFixture; - let component: ReadComplexFieldRawComponent; - let de: DebugElement; - - beforeEach(() => { - FieldReadComponent = MockComponent({ - selector: 'ccd-field-read', - inputs: ['caseField', 'context'] - }); - }); - - describe('when simple values split across children fields', () => { - const FIELD_TYPE_WITH_VALUES: FieldType = { - id: 'IAmVeryComplex', - type: 'Complex', - complex_fields: [ - { - id: 'AddressLine1', - label: 'Line 1', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'Flat 9' - }, - { - id: 'AddressLine2', - label: 'Line 2', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: '111 East India road' - }, - { - id: 'AddressLine3', - label: 'Line 3', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'Poplar' - }, - ] - }; - - let caseField: CaseField; - - beforeEach(async(() => { - caseField = { - id: '', - label: 'Complex Field', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE_WITH_VALUES - }; - - let test = initTests(caseField, [ - FieldReadComponent - ]); - de = test.de; - fixture = test.fixture; - component = test.component; - })); - - it('should render a list', () => { - let complexList = de.query($COMPLEX_LIST); - - expect(complexList).toBeTruthy(); - }); - - it('should render one list item per child field', () => { - let complexListItems = de.queryAll($COMPLEX_LIST_ITEMS); - - expect(complexListItems.length).toEqual(FIELD_TYPE_WITH_VALUES.complex_fields.length); - }); - - it('should render one field read component per child field', () => { - let complexListValues = de.queryAll($COMPLEX_LIST_VALUES); - - expect(complexListValues.length).toEqual(FIELD_TYPE_WITH_VALUES.complex_fields.length); - expectCaseField(complexListValues[0], FIELD_TYPE_WITH_VALUES.complex_fields[0]); - expectCaseField(complexListValues[1], FIELD_TYPE_WITH_VALUES.complex_fields[1]); - expectCaseField(complexListValues[2], FIELD_TYPE_WITH_VALUES.complex_fields[2]); - }); - - it('should render one field read component per child field', () => { - let complexListLabels = de.queryAll($COMPLEX_LIST_LABELS); - - expect(complexListLabels.length).toEqual(FIELD_TYPE_WITH_VALUES.complex_fields.length); - expectLabel(complexListLabels[0], FIELD_TYPE_WITH_VALUES.complex_fields[0].label); - expectLabel(complexListLabels[1], FIELD_TYPE_WITH_VALUES.complex_fields[1].label); - expectLabel(complexListLabels[2], FIELD_TYPE_WITH_VALUES.complex_fields[2].label); - }); - - it('should render one field read component per child field', () => { - let complexListValues = de.queryAll($COMPLEX_LIST_VALUES); - - expectContext(complexListValues[0], PaletteContext.CHECK_YOUR_ANSWER); - expectContext(complexListValues[1], PaletteContext.CHECK_YOUR_ANSWER); - expectContext(complexListValues[2], PaletteContext.CHECK_YOUR_ANSWER); - }); - - }); - - describe('when empty values split across children fields', () => { - const FIELD_TYPE_WITH_MISSING_VALUE: FieldType = { - id: 'IAmVeryComplex', - type: 'Complex', - complex_fields: [ - { - id: 'AddressLine1', - label: 'Line 1', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'Flat 9' - }, - { - id: 'AddressLine2', - label: 'Line 2', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: '' - }, - { - id: 'AddressLine3', - label: 'Line 3', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'Poplar' - }, - ] - }; - - let caseField: CaseField; - - beforeEach(async(() => { - caseField = { - id: '', - label: 'Complex Field', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE_WITH_MISSING_VALUE - }; - - let test = initTests(caseField, [ - FieldReadComponent - ]); - de = test.de; - fixture = test.fixture; - component = test.component; - })); - - it('should omit child fields with empty values', () => { - let complexListValues = de.queryAll($COMPLEX_LIST_VALUES); - - expect(complexListValues.length).toEqual(FIELD_TYPE_WITH_MISSING_VALUE.complex_fields.length - 1); - expectCaseField(complexListValues[0], FIELD_TYPE_WITH_MISSING_VALUE.complex_fields[0]); - expectCaseField(complexListValues[1], FIELD_TYPE_WITH_MISSING_VALUE.complex_fields[2]); - }); - - }); - - describe('when simple values as object on root field', () => { - const FIELD_TYPE_WITHOUT_VALUES: FieldType = { - id: 'IAmVeryComplex', - type: 'Complex', - complex_fields: [ - { - id: 'AddressLine1', - label: 'Line 1', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - }, - { - id: 'AddressLine2', - label: 'Line 2', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - }, - { - id: 'AddressLine3', - label: 'Line 3', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - }, - ] - }; - - let caseField: CaseField; - - beforeEach(async(() => { - caseField = { - id: '', - label: 'Complex Field', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE_WITHOUT_VALUES, - value: { - 'AddressLine1': 'Flat 9', - 'AddressLine2': '111 East India road', - 'AddressLine3': 'Poplar', - } - }; - - let test = initTests(caseField, [ - FieldReadComponent - ]); - de = test.de; - fixture = test.fixture; - component = test.component; - })); - - it('should render one field read component per child field', () => { - let complexListValues = de.queryAll($COMPLEX_LIST_VALUES); - - expect(complexListValues.length).toEqual(FIELD_TYPE_WITHOUT_VALUES.complex_fields.length); - expectCaseField(complexListValues[0], Object.assign( - {}, - FIELD_TYPE_WITHOUT_VALUES.complex_fields[0], - { - value: caseField.value['AddressLine1'] - } - )); - expectCaseField(complexListValues[1], Object.assign( - {}, - FIELD_TYPE_WITHOUT_VALUES.complex_fields[1], - { - value: caseField.value['AddressLine2'] - } - )); - expectCaseField(complexListValues[2], Object.assign( - {}, - FIELD_TYPE_WITHOUT_VALUES.complex_fields[2], - { - value: caseField.value['AddressLine3'] - } - )); - }); - - }); - - describe('when empty values as object on root field', () => { - const FIELD_TYPE_WITHOUT_VALUES: FieldType = { - id: 'IAmVeryComplex', - type: 'Complex', - complex_fields: [ - { - id: 'AddressLine1', - label: 'Line 1', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - }, - { - id: 'AddressLine2', - label: 'Line 2', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - }, - { - id: 'AddressLine3', - label: 'Line 3', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - }, - ] - }; - - let caseField: CaseField; - - beforeEach(async(() => { - caseField = { - id: '', - label: 'Complex Field', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE_WITHOUT_VALUES, - value: { - 'AddressLine1': 'Flat 9', - 'AddressLine3': 'Poplar', - } - }; - - let test = initTests(caseField, [ - FieldReadComponent - ]); - de = test.de; - fixture = test.fixture; - component = test.component; - })); - - it('should omit child fields with empty values', () => { - let complexListValues = de.queryAll($COMPLEX_LIST_VALUES); - - expect(complexListValues.length).toEqual(FIELD_TYPE_WITHOUT_VALUES.complex_fields.length - 1); - expectCaseField(complexListValues[0], Object.assign( - {}, - FIELD_TYPE_WITHOUT_VALUES.complex_fields[0], - { - value: caseField.value['AddressLine1'] - } - )); - expectCaseField(complexListValues[1], Object.assign( - {}, - FIELD_TYPE_WITHOUT_VALUES.complex_fields[2], - { - value: caseField.value['AddressLine3'] - } - )); - }); - - }); - -}); diff --git a/src/app/shared/palette/complex/read-complex-field-raw.component.ts b/src/app/shared/palette/complex/read-complex-field-raw.component.ts deleted file mode 100644 index b158a505c..000000000 --- a/src/app/shared/palette/complex/read-complex-field-raw.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component } from '@angular/core'; -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; - -/** - * Display a complex type fields as a list of values without labels. - * This is intended for rendering of Check Your Answer page. - */ -@Component({ - selector: 'ccd-read-complex-field-raw', - templateUrl: './read-complex-field-raw.html', - styleUrls: [ - './read-complex-field-raw.scss' - ], -}) -export class ReadComplexFieldRawComponent extends AbstractFieldReadComponent {} diff --git a/src/app/shared/palette/complex/read-complex-field-raw.html b/src/app/shared/palette/complex/read-complex-field-raw.html deleted file mode 100644 index 96450f343..000000000 --- a/src/app/shared/palette/complex/read-complex-field-raw.html +++ /dev/null @@ -1,8 +0,0 @@ -
- -
{{field.label}}
-
- -
-
-
diff --git a/src/app/shared/palette/complex/read-complex-field-raw.scss b/src/app/shared/palette/complex/read-complex-field-raw.scss deleted file mode 100644 index b46c89816..000000000 --- a/src/app/shared/palette/complex/read-complex-field-raw.scss +++ /dev/null @@ -1,12 +0,0 @@ -dl.complex-raw { - list-style-type: none; - - dl.complex-raw { - // Only apply indent to nested complex types - padding-left: 2ch; - } - - dt { - font-weight: bold; - } -} diff --git a/src/app/shared/palette/complex/read-complex-field-table.component.spec.ts b/src/app/shared/palette/complex/read-complex-field-table.component.spec.ts deleted file mode 100644 index 91964a90d..000000000 --- a/src/app/shared/palette/complex/read-complex-field-table.component.spec.ts +++ /dev/null @@ -1,403 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReadComplexFieldTableComponent } from './read-complex-field-table.component'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { By } from '@angular/platform-browser'; -import { FieldsFilterPipe } from './fields-filter.pipe'; -import { MockComponent } from 'ng2-mock-component'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { ConditionalShowModule } from '../../conditional-show/conditional-show.module'; -import { PaletteContext } from '../base-field/palette-context.enum'; - -describe('ReadComplexFieldTableComponent', () => { - - const $COMPLEX_PANEL = By.css('div.complex-panel'); - const $COMPLEX_PANEL_TITLE = By.css('dl.complex-panel-title'); - const $COMPLEX_PANEL_SIMPLE_ROWS_HEADERS = By.css('table>tbody>tr.complex-panel-simple-field>th>span'); - const $COMPLEX_PANEL_SIMPLE_ROWS_VALUES = By.css('table>tbody>tr.complex-panel-simple-field>td>span>ccd-field-read'); - const $COMPLEX_PANEL_COMPOUND_ROWS_VALUES = By.css('table>tbody>tr.complex-panel-compound-field>td>span>ccd-field-read'); - const $COMPLEX_PANEL_ALL_VALUES = By.css('table>tbody>tr>td>span>ccd-field-read'); - - let FieldReadComponent = MockComponent({ - selector: 'ccd-field-read', - inputs: ['caseField', 'context'] - }); - - let fixture: ComponentFixture; - let component: ReadComplexFieldTableComponent; - let de: DebugElement; - - describe('when values split accross children fields', () => { - const FIELD_TYPE_WITHOUT_FIELDS: FieldType = { - id: 'IAmVeryComplex', - type: 'Complex', - complex_fields: [] - }; - - const FIELD_TYPE_WITH_MISSING_VALUE: FieldType = { - id: 'IAmVeryComplex', - type: 'Complex', - complex_fields: [ - { - id: 'AddressLine1', - label: 'Line 1', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: '' - }, - { - id: 'AddressLine2', - label: 'Line 2', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: '111 East India road' - } - ] - }; - - const FIELD_TYPE_WITH_VALUES: FieldType = { - id: 'IAmVeryComplex', - type: 'Complex', - complex_fields: [ - { - id: 'AddressLine1', - label: 'Line 1', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'Flat 9' - }, - { - id: 'AddressLine2', - label: 'Line 2', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: '111 East India road' - }, - { - id: 'AddressPostcode', - label: 'Post code', - display_context: 'OPTIONAL', - field_type: { - id: 'Postcode', - type: 'Complex', - complex_fields: [ - { - id: 'PostcodeCity', - label: 'City', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'London' - }, - { - id: 'PostcodeCountry', - label: 'Country', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'UK' - } - ] - } - } - ] - }; - - const CASE_FIELD: CaseField = { - id: '', - label: 'Complex Field', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE_WITH_VALUES - }; - - const LINE_1 = 0; - const LINE_2 = 1; - const POSTCODE = 2; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - PaletteUtilsModule, - ConditionalShowModule - ], - declarations: [ - ReadComplexFieldTableComponent, - FieldsFilterPipe, - - // Mock - FieldReadComponent, - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadComplexFieldTableComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - component.context = PaletteContext.CHECK_YOUR_ANSWER; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should render a panel with a header for the complex type', () => { - let panelTitle = de - .query($COMPLEX_PANEL) - .query($COMPLEX_PANEL_TITLE); - - expect(panelTitle).toBeTruthy(); - expect(panelTitle.nativeElement.textContent).toBe(CASE_FIELD.label); - }); - - it('should render a table with a row containing 2 columns for each simple type', () => { - let simpleRowsHeaders = de - .query($COMPLEX_PANEL) - .queryAll($COMPLEX_PANEL_SIMPLE_ROWS_HEADERS); - - expect(simpleRowsHeaders.length).toBe(2); - expect(simpleRowsHeaders[LINE_1].nativeElement.textContent).toBe(FIELD_TYPE_WITH_VALUES.complex_fields[LINE_1].label); - expect(simpleRowsHeaders[LINE_2].nativeElement.textContent).toBe(FIELD_TYPE_WITH_VALUES.complex_fields[LINE_2].label); - - let simpleRowsValues = de - .query($COMPLEX_PANEL) - .queryAll($COMPLEX_PANEL_SIMPLE_ROWS_VALUES); - - expect(simpleRowsValues.length).toBe(2); - expect(simpleRowsValues[LINE_1].componentInstance.caseField).toEqual(FIELD_TYPE_WITH_VALUES.complex_fields[LINE_1]); - expect(simpleRowsValues[LINE_2].componentInstance.caseField).toEqual(FIELD_TYPE_WITH_VALUES.complex_fields[LINE_2]); - }); - - it('should render a table with a row containing 1 column for each compound type', () => { - let compoundRowsHeaders = de - .query($COMPLEX_PANEL) - .queryAll($COMPLEX_PANEL_COMPOUND_ROWS_VALUES); - - expect(compoundRowsHeaders.length).toBe(1); - expect(compoundRowsHeaders[0].componentInstance.caseField).toEqual(FIELD_TYPE_WITH_VALUES.complex_fields[POSTCODE]); - }); - - it('should NOT render fields with empty value', () => { - component.caseField = { - id: 'x', - label: 'x', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE_WITH_MISSING_VALUE - }; - fixture.detectChanges(); - - let labels = de.queryAll($COMPLEX_PANEL_SIMPLE_ROWS_HEADERS); - - expect(labels.length).toEqual(1); - - expect(labels[0].nativeElement.textContent).toBe(FIELD_TYPE_WITH_MISSING_VALUE.complex_fields[LINE_2].label); - }); - - it('should only render title when no fields', () => { - component.caseField = { - id: 'x', - label: 'x', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE_WITHOUT_FIELDS - }; - fixture.detectChanges(); - - let title = de.query($COMPLEX_PANEL_TITLE); - expect(title).toBeTruthy(); - - let labels = de.queryAll($COMPLEX_PANEL_SIMPLE_ROWS_HEADERS); - - expect(labels.length).toEqual(0); - }); - - it('should pass context down to child fields', () => { - let simpleRowsValues = de - .query($COMPLEX_PANEL) - .queryAll($COMPLEX_PANEL_SIMPLE_ROWS_VALUES); - - expect(simpleRowsValues[LINE_1].componentInstance.context).toEqual(PaletteContext.CHECK_YOUR_ANSWER); - expect(simpleRowsValues[LINE_2].componentInstance.context).toEqual(PaletteContext.CHECK_YOUR_ANSWER); - - let compoundRowsValues = de - .query($COMPLEX_PANEL) - .queryAll($COMPLEX_PANEL_COMPOUND_ROWS_VALUES); - - expect(compoundRowsValues[0].componentInstance.context).toEqual(PaletteContext.CHECK_YOUR_ANSWER); - }); - }); - - describe('when values as object in root field', () => { - const FIELD_TYPE: FieldType = { - id: 'IAmVeryComplex', - type: 'Complex', - complex_fields: [ - { - id: 'AddressLine1', - label: 'Line 1', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - }, - { - id: 'AddressLine2', - label: 'Line 2', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - }, - { - id: 'AddressPostcode', - label: 'Post code', - display_context: 'OPTIONAL', - field_type: { - id: 'Postcode', - type: 'Complex', - complex_fields: [ - { - id: 'PostcodeCity', - label: 'City', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - }, - { - id: 'PostcodeCountry', - label: 'Country', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - } - ] - } - } - ] - }; - - const CASE_FIELD: CaseField = { - id: '', - label: 'Complex Field', - field_type: FIELD_TYPE, - display_context: 'OPTIONAL', - value: { - 'AddressLine1': 'Flat 9', - 'AddressLine2': '111 East India road', - 'AddressPostcode': { - 'PostcodeCity': 'London', - 'PostcodeCountry': 'UK' - } - } - }; - - const LINE_1 = 0; - const LINE_2 = 1; - const POSTCODE = 2; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - PaletteUtilsModule, - ConditionalShowModule - ], - declarations: [ - ReadComplexFieldTableComponent, - FieldsFilterPipe, - - // Mock - FieldReadComponent, - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadComplexFieldTableComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should render a table with a row containing 2 columns for each simple type', () => { - let values = de - .query($COMPLEX_PANEL) - .queryAll($COMPLEX_PANEL_ALL_VALUES); - - expect(values.length).toBe(3); - - let line1 = FIELD_TYPE.complex_fields[LINE_1]; - expect(values[LINE_1].componentInstance.caseField).toEqual({ - id: line1.id, - label: line1.label, - display_context: 'OPTIONAL', - field_type: line1.field_type, - value: CASE_FIELD.value['AddressLine1'] - }); - - let line2 = FIELD_TYPE.complex_fields[LINE_2]; - expect(values[LINE_2].componentInstance.caseField).toEqual({ - id: line2.id, - label: line2.label, - display_context: 'OPTIONAL', - field_type: line2.field_type, - value: CASE_FIELD.value['AddressLine2'] - }); - - let postcode = FIELD_TYPE.complex_fields[POSTCODE]; - expect(values[POSTCODE].componentInstance.caseField).toEqual({ - id: postcode.id, - label: postcode.label, - display_context: 'OPTIONAL', - field_type: postcode.field_type, - value: CASE_FIELD.value['AddressPostcode'] - }); - }); - - it('should NOT render fields with empty value', () => { - component.caseField = { - id: 'x', - label: 'x', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: { - 'AddressLine1': 'Flat 9' - } - }; - fixture.detectChanges(); - - let labels = de.queryAll($COMPLEX_PANEL_SIMPLE_ROWS_HEADERS); - - expect(labels.length).toEqual(1); - - expect(labels[0].nativeElement.textContent).toBe(FIELD_TYPE.complex_fields[LINE_1].label); - }); - }); - -}); diff --git a/src/app/shared/palette/complex/read-complex-field-table.component.ts b/src/app/shared/palette/complex/read-complex-field-table.component.ts deleted file mode 100644 index 8c7a6e24e..000000000 --- a/src/app/shared/palette/complex/read-complex-field-table.component.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Component } from '@angular/core'; -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; - -@Component({ - selector: 'ccd-read-complex-field-table', - templateUrl: './read-complex-field-table.html', - styleUrls: ['./read-complex-field-table.scss'] -}) -export class ReadComplexFieldTableComponent extends AbstractFieldReadComponent {} diff --git a/src/app/shared/palette/complex/read-complex-field-table.html b/src/app/shared/palette/complex/read-complex-field-table.html deleted file mode 100644 index 6ad60a9eb..000000000 --- a/src/app/shared/palette/complex/read-complex-field-table.html +++ /dev/null @@ -1,24 +0,0 @@ -
-
{{caseField.label}}
- - - - - - - - - - - - - - - - -
- -
{{field.label}} - -
-
diff --git a/src/app/shared/palette/complex/read-complex-field-table.scss b/src/app/shared/palette/complex/read-complex-field-table.scss deleted file mode 100644 index c696198ee..000000000 --- a/src/app/shared/palette/complex/read-complex-field-table.scss +++ /dev/null @@ -1,45 +0,0 @@ -@import 'node_modules/govuk_frontend_toolkit/stylesheets/_typography'; -@import "~govuk_frontend_toolkit/stylesheets/_colours.scss"; - -.complex-panel { - $padding: 5px; - - border: 1px solid $border-colour; - - .complex-panel-title { - background-color: $panel-colour; - padding: $padding; - border-bottom: 1px solid $border-colour; - font-weight: bold; - display: block; - color: $text-colour; - padding-bottom: 2px; - - @include bold-19; - } - - .complex-panel-table { - &>tbody>tr>th { - vertical-align: top; - } - - &>tbody>tr:last-child { - &>th, &>td { - border-bottom: none; - } - } - } - - .complex-panel-simple-field { - th { - padding-left: $padding; - width: 25%; - } - } - - .complex-panel-compound-field { - td { - padding: $padding; - } - } -} diff --git a/src/app/shared/palette/complex/read-complex-field.component.spec.ts b/src/app/shared/palette/complex/read-complex-field.component.spec.ts deleted file mode 100644 index 3ababad5d..000000000 --- a/src/app/shared/palette/complex/read-complex-field.component.spec.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { MockComponent } from 'ng2-mock-component'; -import { DebugElement } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { PaletteContext } from '../base-field/palette-context.enum'; -import { ConditionalShowModule } from '../../conditional-show/conditional-show.module'; -import { FieldsFilterPipe } from './fields-filter.pipe'; -import { ReadComplexFieldComponent } from './read-complex-field.component'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { By } from '@angular/platform-browser'; - -describe('ReadComplexFieldComponent', () => { - - const $COMPLEX_AS_TABLE = By.css('ccd-read-complex-field-table'); - const $COMPLEX_AS_RAW = By.css('ccd-read-complex-field-raw'); - - const caseField: CaseField = new CaseField(); - - let ReadComplexFieldRawComponent; - let ReadComplexFieldTableComponent; - - let fixture: ComponentFixture; - let component: ReadComplexFieldComponent; - let de: DebugElement; - - const expectTable = () => { - expect(de.queryAll($COMPLEX_AS_RAW).length).toEqual(0); - expect(de.query($COMPLEX_AS_TABLE)).toBeTruthy(); - }; - - const expectRaw = () => { - expect(de.queryAll($COMPLEX_AS_TABLE).length).toEqual(0); - expect(de.query($COMPLEX_AS_RAW)).toBeTruthy(); - }; - - const expectInputs = (componentInstance, expectedContext) => { - expect(componentInstance.caseField).toBe(caseField); - expect(componentInstance.context).toBe(expectedContext); - }; - - beforeEach(async(() => { - - ReadComplexFieldRawComponent = MockComponent({ - selector: 'ccd-read-complex-field-raw', - inputs: ['caseField', 'context'] - }); - - ReadComplexFieldTableComponent = MockComponent({ - selector: 'ccd-read-complex-field-table', - inputs: ['caseField', 'context'] - }); - - TestBed - .configureTestingModule({ - imports: [ - PaletteUtilsModule, - ConditionalShowModule - ], - declarations: [ - ReadComplexFieldComponent, - FieldsFilterPipe, - - // Mock - ReadComplexFieldRawComponent, - ReadComplexFieldTableComponent, - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadComplexFieldComponent); - component = fixture.componentInstance; - - component.caseField = caseField; - component.context = null; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should render complex field as table by default', () => { - expectTable(); - expectInputs(de.query($COMPLEX_AS_TABLE).componentInstance, null); - }); - - describe('when context is DEFAULT', () => { - beforeEach(() => { - component.context = PaletteContext.DEFAULT; - fixture.detectChanges(); - }); - - it('should render complex field as table by default', () => { - expectTable(); - expectInputs(de.query($COMPLEX_AS_TABLE).componentInstance, PaletteContext.DEFAULT); - }); - }); - - describe('when context is CHECK_YOUR_ANSWER', () => { - beforeEach(() => { - component.context = PaletteContext.CHECK_YOUR_ANSWER; - fixture.detectChanges(); - }); - - it('should render complex field as table by default', () => { - expectRaw(); - expectInputs(de.query($COMPLEX_AS_RAW).componentInstance, PaletteContext.CHECK_YOUR_ANSWER); - }); - }); -}); diff --git a/src/app/shared/palette/complex/read-complex-field.component.ts b/src/app/shared/palette/complex/read-complex-field.component.ts deleted file mode 100644 index 51543e3d5..000000000 --- a/src/app/shared/palette/complex/read-complex-field.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component } from '@angular/core'; -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; -import { PaletteContext } from '../base-field/palette-context.enum'; - -@Component({ - selector: 'ccd-read-complex-field', - templateUrl: './read-complex-field.html', -}) -export class ReadComplexFieldComponent extends AbstractFieldReadComponent { - - public paletteContext = PaletteContext; -} diff --git a/src/app/shared/palette/complex/read-complex-field.html b/src/app/shared/palette/complex/read-complex-field.html deleted file mode 100644 index 835893059..000000000 --- a/src/app/shared/palette/complex/read-complex-field.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - diff --git a/src/app/shared/palette/complex/write-complex-field.component.spec.ts b/src/app/shared/palette/complex/write-complex-field.component.spec.ts deleted file mode 100644 index 9ab484ad0..000000000 --- a/src/app/shared/palette/complex/write-complex-field.component.spec.ts +++ /dev/null @@ -1,587 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { WriteComplexFieldComponent } from './write-complex-field.component'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { By } from '@angular/platform-browser'; -import { FieldsFilterPipe } from './fields-filter.pipe'; -import { MockComponent } from 'ng2-mock-component'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { AbstractControl, FormControl, FormGroup } from '@angular/forms'; -import { ConditionalShowModule } from '../../conditional-show/conditional-show.module'; -import { IsCompoundPipe } from '../utils/is-compound.pipe'; -import { FormValidatorsService } from '../../../core/form/form-validators.service'; -import createSpyObj = jasmine.createSpyObj; - -describe('WriteComplexFieldComponent', () => { - - const $COMPLEX_PANEL = By.css('.form-group'); - const $COMPLEX_PANEL_TITLE = By.css('h3'); - const $COMPLEX_PANEL_VALUES = By.css('ccd-field-write'); - - let FieldWriteComponent = MockComponent({ - selector: 'ccd-field-write', - inputs: ['caseField', 'registerControl', 'idPrefix', 'isExpanded'] - }); - - let fixture: ComponentFixture; - let component: WriteComplexFieldComponent; - let de: DebugElement; - let formValidatorService: any; - - describe('when values split across children fields', () => { - const FIELD_TYPE_WITH_MISSING_VALUE: FieldType = { - id: 'IAmVeryComplex', - type: 'Complex', - complex_fields: [ - { - id: 'AddressLine1', - label: 'Line 1', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: '' - }, - { - id: 'AddressLine2', - label: 'Line 2', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: '111 East India road' - } - ] - }; - - const FIELD_TYPE_WITH_VALUES: FieldType = { - id: 'IAmVeryComplex', - type: 'Complex', - complex_fields: [ - { - id: 'AddressLine1', - label: 'Line 1', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'Flat 9' - }, - { - id: 'AddressLine2', - label: 'Line 2', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: '111 East India road' - }, - { - id: 'AddressPostcode', - label: 'Post code', - display_context: 'OPTIONAL', - field_type: { - id: 'Postcode', - type: 'Complex', - complex_fields: [ - { - id: 'PostcodeCity', - label: 'City', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'London' - }, - { - id: 'PostcodeCountry', - label: 'Country', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: 'UK' - } - ] - } - } - ] - }; - - const FIELD_ID = 'AComplexField'; - const CASE_FIELD: CaseField = { - id: FIELD_ID, - label: 'Complex Field', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE_WITH_VALUES - }; - - const LINE_1 = 0; - const LINE_2 = 1; - const POSTCODE = 2; - - const FORM_GROUP: FormGroup = new FormGroup({}); - const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(FIELD_ID, control); - return control; - }; - - beforeEach(async(() => { - formValidatorService = createSpyObj('formValidatorService', ['addValidators']); - TestBed - .configureTestingModule({ - imports: [ - PaletteUtilsModule, - ConditionalShowModule - ], - declarations: [ - WriteComplexFieldComponent, - FieldsFilterPipe, - - // Mock - FieldWriteComponent, - ], - providers: [ - IsCompoundPipe, - { provide: FormValidatorsService, useValue: formValidatorService } - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteComplexFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - component.registerControl = REGISTER_CONTROL; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should not render a form group with a header for the complex type', () => { - let panelTitle = de - .query($COMPLEX_PANEL) - .query($COMPLEX_PANEL_TITLE); - - expect(panelTitle).toBeNull(); - }); - - it('should render a field write component for each field in the complex type', () => { - let simpleRowsHeaders = de - .query($COMPLEX_PANEL) - .queryAll($COMPLEX_PANEL_VALUES); - - expect(simpleRowsHeaders.length).toBe(3); - expect(simpleRowsHeaders[LINE_1].componentInstance.caseField.label).toBe(FIELD_TYPE_WITH_VALUES.complex_fields[LINE_1].label); - expect(simpleRowsHeaders[LINE_2].componentInstance.caseField.label).toBe(FIELD_TYPE_WITH_VALUES.complex_fields[LINE_2].label); - expect(simpleRowsHeaders[POSTCODE].componentInstance.caseField.label).toBe(FIELD_TYPE_WITH_VALUES.complex_fields[POSTCODE].label); - }); - - it('should render fields with empty value', () => { - component.caseField = { - id: 'x', - label: 'x', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE_WITH_MISSING_VALUE - }; - fixture.detectChanges(); - - let labels = de.queryAll($COMPLEX_PANEL_VALUES); - - expect(labels.length).toEqual(2); - - expect(labels[LINE_1].componentInstance.caseField.label).toBe(FIELD_TYPE_WITH_VALUES.complex_fields[LINE_1].label); - expect(labels[LINE_2].componentInstance.caseField.label).toBe(FIELD_TYPE_WITH_VALUES.complex_fields[LINE_2].label); - }); - - it('should return control if exists in formGroup', () => { - const CASE_FIELD_1: CaseField = { - id: FIELD_ID, - label: 'Complex Field', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE_WITH_MISSING_VALUE - }; - let firstControl = new FormControl(); - let formGroup = new FormGroup({}); - formGroup.addControl(FIELD_ID, firstControl); - component.complexGroup = formGroup; - fixture.detectChanges(); - let returned = component.buildControlRegistrer(CASE_FIELD_1).apply(firstControl); - expect(returned).toBe(firstControl); - expect(component.complexGroup.get(CASE_FIELD_1.id)).toBeTruthy(); - }); - - it('should add control if it does not exist in formGroup', () => { - const CASE_FIELD_1: CaseField = { - id: 'anotherComplexField', - label: 'Complex Field', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE_WITH_MISSING_VALUE - }; - let firstControl = new FormControl(); - let formGroup = new FormGroup({}); - formGroup.addControl('first', firstControl); - component.complexGroup = formGroup; - fixture.detectChanges(); - let returned = component.buildControlRegistrer(CASE_FIELD_1) (firstControl); - expect(returned).toBe(firstControl); - expect(component.complexGroup.get(CASE_FIELD_1.id)).toBeTruthy(); - expect(component.complexGroup.get('first')).toBeTruthy(); - }); - }); - - describe('when values as object in root field', () => { - const FIELD_TYPE: FieldType = { - id: 'IAmVeryComplex', - type: 'Complex', - complex_fields: [ - { - id: 'AddressLine1', - label: 'Line 1', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - }, - { - id: 'AddressLine2', - label: 'Line 2', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - }, - { - id: 'AddressPostcode', - label: 'Post code', - display_context: 'OPTIONAL', - field_type: { - id: 'Postcode', - type: 'Complex', - complex_fields: [ - { - id: 'PostcodeCity', - label: 'City', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - }, - { - id: 'PostcodeCountry', - label: 'Country', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - } - } - ] - } - } - ] - }; - - const FIELD_ID = 'SomeFieldId'; - const CASE_FIELD: CaseField = { - id: FIELD_ID, - label: 'Complex Field', - field_type: FIELD_TYPE, - display_context: 'OPTIONAL', - value: { - 'AddressLine1': 'Flat 9', - 'AddressLine2': '111 East India road', - 'AddressPostcode': { - 'PostcodeCity': 'London', - 'PostcodeCountry': 'UK' - } - } - }; - - const LINE_1 = 0; - const LINE_2 = 1; - const POSTCODE = 2; - - let formGroup: FormGroup; - const REGISTER_CONTROL = (control: T) => { - formGroup.addControl(FIELD_ID, control); - return control; - }; - - beforeEach(async(() => { - formValidatorService = createSpyObj('formValidatorService', ['addValidators']); - formGroup = new FormGroup({}); - - TestBed - .configureTestingModule({ - imports: [ - PaletteUtilsModule, - ConditionalShowModule - ], - declarations: [ - WriteComplexFieldComponent, - FieldsFilterPipe, - - // Mock - FieldWriteComponent, - ], - providers: [ - IsCompoundPipe, - { provide: FormValidatorsService, useValue: formValidatorService } - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteComplexFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - component.registerControl = REGISTER_CONTROL; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should render a table with a row containing 2 columns for each simple type', () => { - let values = de - .query($COMPLEX_PANEL) - .queryAll($COMPLEX_PANEL_VALUES); - - expect(values.length).toBe(3); - - let line1 = FIELD_TYPE.complex_fields[LINE_1]; - expect(values[LINE_1].componentInstance.caseField).toEqual({ - id: line1.id, - label: line1.label, - display_context: 'OPTIONAL', - field_type: line1.field_type, - value: CASE_FIELD.value['AddressLine1'] - }); - expect(values[LINE_1].componentInstance.registerControl).not.toBeNull(); - - let line2 = FIELD_TYPE.complex_fields[LINE_2]; - expect(values[LINE_2].componentInstance.caseField).toEqual({ - id: line2.id, - label: line2.label, - display_context: 'OPTIONAL', - field_type: line2.field_type, - value: CASE_FIELD.value['AddressLine2'] - }); - expect(values[LINE_2].componentInstance.registerControl).not.toBeNull(); - - let postcode = FIELD_TYPE.complex_fields[POSTCODE]; - expect(values[POSTCODE].componentInstance.caseField).toEqual({ - id: postcode.id, - label: postcode.label, - display_context: 'OPTIONAL', - field_type: postcode.field_type, - value: CASE_FIELD.value['AddressPostcode'] - }); - expect(values[POSTCODE].componentInstance.registerControl).not.toBeNull(); - }); - - it('should render fields with empty value', () => { - component.caseField = { - id: 'x', - label: 'x', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: { - 'AddressLine1': 'Flat 9' - } - }; - fixture.detectChanges(); - - let labels = de.queryAll($COMPLEX_PANEL_VALUES); - - expect(labels.length).toEqual(3); - - expect(labels[LINE_1].componentInstance.caseField.label).toBe(FIELD_TYPE.complex_fields[LINE_1].label); - expect(labels[LINE_2].componentInstance.caseField.label).toBe(FIELD_TYPE.complex_fields[LINE_2].label); - }); - }); - - describe('when display_context of AddressLine1 is MANDATORY', () => { - const FIELD_TYPE_WITH_MISSING_VALUE: FieldType = { - id: 'IAmVeryComplex', - type: 'Complex', - complex_fields: [ - { - id: 'AddressLine1', - label: 'Line 1', - display_context: 'MANDATORY', - field_type: { - id: '"TextMax150"', - type: 'Text' - }, - value: '' - }, - { - id: 'AddressLine2', - label: 'Line 2', - display_context: 'OPTIONAL', - field_type: { - id: 'Text', - type: 'Text' - }, - value: '111 East India road' - } - ] - }; - - const FIELD_TYPE_WITH_VALUES: FieldType = { - id: 'TextMax150', - type: 'Text' - }; - - const FIELD_ID = 'AComplexField'; - const CASE_FIELD_M: CaseField = { - id: FIELD_ID, - label: 'Complex Field', - display_context: 'MANDATORY', - field_type: FIELD_TYPE_WITH_VALUES - }; - - const FORM_GROUP: FormGroup = new FormGroup({}); - const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(FIELD_ID, control); - return control; - }; - - beforeEach(async(() => { - formValidatorService = createSpyObj('formValidatorService', ['addValidators']); - - TestBed - .configureTestingModule({ - imports: [ - PaletteUtilsModule, - ConditionalShowModule - ], - declarations: [ - WriteComplexFieldComponent, - FieldsFilterPipe, - - // Mock - FieldWriteComponent, - ], - providers: [ - IsCompoundPipe, - { provide: FormValidatorsService, useValue: formValidatorService } - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteComplexFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD_M; - component.registerControl = REGISTER_CONTROL; - component.ignoreMandatory = true; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should not add control when case field is not AddressLine1 and TextMax150', () => { - const CASE_FIELD_1: CaseField = { - id: 'anotherComplexField', - label: 'Complex Field', - display_context: 'MANDATORY', - field_type: FIELD_TYPE_WITH_MISSING_VALUE - }; - const firstControl = new FormControl(); - const formGroup = new FormGroup({}); - formGroup.addControl('first', firstControl); - component.complexGroup = formGroup; - - const returned = component.buildControlRegistrer(CASE_FIELD_1) (firstControl); - expect(returned).toBe(firstControl); - expect(component.complexGroup.get(CASE_FIELD_1.id)).toBeTruthy(); - expect(component.complexGroup.get('first')).toBeTruthy(); - expect(formValidatorService.addValidators).toHaveBeenCalledTimes(0); - }); - - it('should add control when case field is AddressLine1 and TextMax150', () => { - component.caseField = { - id: 'AddressLine1', - label: 'x', - display_context: 'MANDATORY', - field_type: FIELD_TYPE_WITH_VALUES, - value: { - 'AddressLine1': 'Flat 9' - } - }; - const firstControl = new FormControl(); - const formGroup = new FormGroup({}); - formGroup.addControl('first', firstControl); - component.complexGroup = formGroup; - - const returned = component.buildControlRegistrer(component.caseField) (firstControl); - expect(returned).toBe(firstControl); - expect(component.complexGroup.get(component.caseField.id)).toBeTruthy(); - expect(component.complexGroup.get('first')).toBeTruthy(); - expect(formValidatorService.addValidators).toHaveBeenCalledWith(component.caseField, firstControl); - }); - - it('should not add control when case field is AddressLine1 but NOT TextMax150', () => { - component.caseField = { - id: 'AddressLine1', - label: 'x', - display_context: 'MANDATORY', - field_type: { - id: 'TextMax151', - type: 'Text' - }, - value: { - 'AddressLine1': 'Flat 9' - } - }; - const firstControl = new FormControl(); - const formGroup = new FormGroup({}); - formGroup.addControl('first', firstControl); - component.complexGroup = formGroup; - - const returned = component.buildControlRegistrer(component.caseField) (firstControl); - expect(returned).toBe(firstControl); - expect(component.complexGroup.get(component.caseField.id)).toBeTruthy(); - expect(component.complexGroup.get('first')).toBeTruthy(); - expect(formValidatorService.addValidators).toHaveBeenCalledTimes(0); - }); - - it('should not add control when case field is NOT AddressLine1', () => { - component.caseField = { - id: 'AddressLine2', - label: 'x', - display_context: 'MANDATORY', - field_type: { - id: 'TextMax150', - type: 'Text' - }, - value: { - 'AddressLine1': 'Flat 9' - } - }; - const firstControl = new FormControl(); - const formGroup = new FormGroup({}); - formGroup.addControl('first', firstControl); - component.complexGroup = formGroup; - - const returned = component.buildControlRegistrer(component.caseField) (firstControl); - expect(returned).toBe(firstControl); - expect(component.complexGroup.get(component.caseField.id)).toBeTruthy(); - expect(component.complexGroup.get('first')).toBeTruthy(); - expect(formValidatorService.addValidators).toHaveBeenCalledTimes(0); - }); - }); - -}); diff --git a/src/app/shared/palette/complex/write-complex-field.component.ts b/src/app/shared/palette/complex/write-complex-field.component.ts deleted file mode 100644 index c8f58a89d..000000000 --- a/src/app/shared/palette/complex/write-complex-field.component.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; -import { Component, OnInit, Input } from '@angular/core'; -import { AbstractControl, FormControl, FormGroup } from '@angular/forms'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { IsCompoundPipe } from '../utils/is-compound.pipe'; -import { FormValidatorsService } from '../../../core/form/form-validators.service'; - -@Component({ - selector: 'ccd-write-complex-type-field', - templateUrl: './write-complex-field.html', - styleUrls: ['./read-complex-field-table.scss'] -}) -export class WriteComplexFieldComponent extends AbstractFieldWriteComponent implements OnInit { - complexGroup: FormGroup; - - @Input() - renderLabel = false; - - @Input() - ignoreMandatory = false; - - constructor (private isCompoundPipe: IsCompoundPipe, private formValidatorsService: FormValidatorsService) { - super(); - } - - ngOnInit(): void { - this.complexGroup = this.registerControl(new FormGroup({})); - } - - buildControlRegistrer(caseField: CaseField): (control: FormControl) => AbstractControl { - return control => { - if (this.complexGroup.get(caseField.id)) { - return this.complexGroup.get(caseField.id); - } - // checks validators are required before calling formValidatorsService - const validatorsRequired = function () { - return ['AddressLine1'].some(x => x === caseField.id) - && 'TextMax150' === caseField.field_type.id - && FormValidatorsService.MANDATORY === caseField.display_context - || !this.ignoreMandatory; - } - if (validatorsRequired.call(this)) { - // console.log('WriteComplexFieldComponent add validators for caseField', caseField); - this.formValidatorsService.addValidators(caseField, control); - } - this.complexGroup.addControl(caseField.id, control); - return control; - }; - } - - buildIdPrefix(field: CaseField): string { - return this.isCompoundPipe.transform(field) ? `${this.idPrefix}${field.id}_` : `${this.idPrefix}`; - } -} diff --git a/src/app/shared/palette/complex/write-complex-field.html b/src/app/shared/palette/complex/write-complex-field.html deleted file mode 100644 index b9acc60b6..000000000 --- a/src/app/shared/palette/complex/write-complex-field.html +++ /dev/null @@ -1,15 +0,0 @@ -
- -

{{caseField | ccdFieldLabel}}

- - - - -
diff --git a/src/app/shared/palette/date/read-date-field.component.spec.ts b/src/app/shared/palette/date/read-date-field.component.spec.ts deleted file mode 100644 index a6b281244..000000000 --- a/src/app/shared/palette/date/read-date-field.component.spec.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReadDateFieldComponent } from './read-date-field.component'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { DatePipe } from '../utils/date.pipe'; - -describe('ReadDateFieldComponent', () => { - - const FIELD_TYPE: FieldType = { - id: 'Date', - type: 'Date' - }; - const VALUE = '1800-07-15'; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE - }; - const FORMATTED_VALUE = '15 Jul 1800'; - const EMPTY = '-'; - - let fixture: ComponentFixture; - let component: ReadDateFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - - TestBed - .configureTestingModule({ - declarations: [ - ReadDateFieldComponent, - DatePipe - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadDateFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should render output with date pipe formatting', () => { - component.caseField.value = VALUE; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(FORMATTED_VALUE); - }); - - it('should render empty string value as empty string', () => { - component.caseField.value = ''; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - - it('should render undefined value as empty string', () => { - component.caseField.value = undefined; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - - it('should render null value as empty string', () => { - component.caseField.value = null; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - -}); diff --git a/src/app/shared/palette/date/read-date-field.component.ts b/src/app/shared/palette/date/read-date-field.component.ts deleted file mode 100644 index db835f986..000000000 --- a/src/app/shared/palette/date/read-date-field.component.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component } from '@angular/core'; -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; - -@Component({ - selector: 'ccd-read-date-field', - template: `{{caseField.value | ccdDate}} - - - - ` -}) -export class ReadDateFieldComponent extends AbstractFieldReadComponent { - - isFieldValueEmpty(): boolean { - return (!this.caseField.value); - } - -} diff --git a/src/app/shared/palette/date/write-date-field.component.spec.ts b/src/app/shared/palette/date/write-date-field.component.spec.ts deleted file mode 100644 index 4bfe29b2e..000000000 --- a/src/app/shared/palette/date/write-date-field.component.spec.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { WriteDateFieldComponent } from './write-date-field.component'; -import { CaseUIToolkitModule } from '@hmcts/ccd-case-ui-toolkit'; -import { CaseFieldService } from '../../domain/case-field.service'; - -const FIELD_ID = 'CreatedAt'; -const FIELD_TYPE: FieldType = { - id: 'Date', - type: 'Date' -}; -const VALUE = '2017-07-26'; -const CASE_FIELD: CaseField = { - id: FIELD_ID, - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE -}; - -const FORM_GROUP: FormGroup = new FormGroup({}); -const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(FIELD_ID, control); - return control; -}; - -describe('WriteDateFieldComponent', () => { - - let fixture: ComponentFixture; - let component: WriteDateFieldComponent; - let de: DebugElement; - let caseFieldService = new CaseFieldService(); - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - PaletteUtilsModule, - CaseUIToolkitModule, - ], - declarations: [ - WriteDateFieldComponent, - ], - providers: [ - {provide: CaseFieldService, useValue: caseFieldService}, - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteDateFieldComponent); - component = fixture.componentInstance; - - component.registerControl = REGISTER_CONTROL; - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should add a formControl linked to the field ID to the formGroup', () => { - expect(FORM_GROUP.controls[FIELD_ID]).toBeTruthy(); - }); - - it('should initialise formControl with provided value', () => { - expect(FORM_GROUP.controls[FIELD_ID].value).toBe(VALUE); - }); -}); diff --git a/src/app/shared/palette/date/write-date-field.component.ts b/src/app/shared/palette/date/write-date-field.component.ts deleted file mode 100644 index a7ed0f838..000000000 --- a/src/app/shared/palette/date/write-date-field.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; -import { Component, OnInit } from '@angular/core'; -import { FormControl } from '@angular/forms'; - -@Component({ - selector: 'ccd-write-date-field', - templateUrl: './write-date-field.html' -}) -export class WriteDateFieldComponent extends AbstractFieldWriteComponent implements OnInit { - - dateControl: FormControl; - - ngOnInit(): void { - this.dateControl = this.registerControl(new FormControl(this.caseField.value)); - } - - isDateTime(): boolean { - return this.caseField.field_type.id === 'DateTime'; - } - -} diff --git a/src/app/shared/palette/date/write-date-field.html b/src/app/shared/palette/date/write-date-field.html deleted file mode 100644 index f7d74a367..000000000 --- a/src/app/shared/palette/date/write-date-field.html +++ /dev/null @@ -1,16 +0,0 @@ -
- -
- - {{caseField | ccdFieldLabel }} - {{caseField.hint_text}} - {{dateControl.errors | ccdFirstError}} - - - - -
-
diff --git a/src/app/shared/palette/document/document-url.pipe.spec.ts b/src/app/shared/palette/document/document-url.pipe.spec.ts deleted file mode 100644 index 2cc5a58b4..000000000 --- a/src/app/shared/palette/document/document-url.pipe.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { DocumentUrlPipe } from './document-url.pipe'; -import createSpyObj = jasmine.createSpyObj; -import { AppConfig } from '../../../app.config'; - -describe('DocumentUrlPipe', () => { - const DOCUMENT_MANAGEMENT_URL = 'http://localhost:1234/documents'; - const REMOTE_DOCUMENT_MANAGEMENT_PATTERN = '^https://external\\.dm\\.reform/documents'; - const MATCHING_REMOTE_DOCUMENT_MANAGEMENT_URL = 'https://external.dm.reform/documents'; - const NON_MATCHING_REMOTE_DOCUMENT_MANAGEMENT_URL = 'https://external.evidence.reform/documents'; - let documentUrlPipe: DocumentUrlPipe; - let appConfig: any; - - beforeEach(() => { - appConfig = createSpyObj('appConfig', ['getDocumentManagementUrl', 'getRemoteDocumentManagementUrl']); - appConfig.getDocumentManagementUrl.and.returnValue(DOCUMENT_MANAGEMENT_URL); - appConfig.getRemoteDocumentManagementUrl.and.returnValue(REMOTE_DOCUMENT_MANAGEMENT_PATTERN); - documentUrlPipe = new DocumentUrlPipe(appConfig); - }); - - describe('given the Document Management URL is the one in the app config', () => { - it('should be replaced with the Document Management endpoint URL of the API Gateway', () => { - let url = documentUrlPipe.transform(MATCHING_REMOTE_DOCUMENT_MANAGEMENT_URL); - expect(url).toEqual(DOCUMENT_MANAGEMENT_URL); - }); - }); - - describe('given the Document Management URL is NOT the one in the app config', () => { - it('should be left unchanged', () => { - let url = documentUrlPipe.transform(NON_MATCHING_REMOTE_DOCUMENT_MANAGEMENT_URL); - expect(url).toEqual(NON_MATCHING_REMOTE_DOCUMENT_MANAGEMENT_URL); - }); - }); -}); diff --git a/src/app/shared/palette/document/document-url.pipe.ts b/src/app/shared/palette/document/document-url.pipe.ts deleted file mode 100644 index de2880610..000000000 --- a/src/app/shared/palette/document/document-url.pipe.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import { AppConfig } from '../../../app.config'; - -@Pipe({ - name: 'ccdDocumentUrl' -}) -export class DocumentUrlPipe implements PipeTransform { - - constructor(private appConfig: AppConfig) {} - - transform(value: string): string { - let remoteDocumentManagementPattern = new RegExp(this.appConfig.getRemoteDocumentManagementUrl()); - return value.replace(remoteDocumentManagementPattern, this.appConfig.getDocumentManagementUrl()); - } -} diff --git a/src/app/shared/palette/document/document.module.ts b/src/app/shared/palette/document/document.module.ts deleted file mode 100644 index abde48c5f..000000000 --- a/src/app/shared/palette/document/document.module.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { DocumentUrlPipe } from './document-url.pipe'; -import { ReadDocumentFieldComponent } from './read-document-field.component'; -import { WriteDocumentFieldComponent } from './write-document-field.component'; -import { MarkdownModule } from '../../markdown/markdown.module'; -import { PaletteUtilsModule } from '../utils/utils.module'; - -@NgModule({ - imports: [ - CommonModule, - MarkdownModule, - PaletteUtilsModule, - ], - declarations: [ - DocumentUrlPipe, - ReadDocumentFieldComponent, - WriteDocumentFieldComponent - ], - entryComponents: [ - ReadDocumentFieldComponent, - WriteDocumentFieldComponent - ], - exports: [ - DocumentUrlPipe - ] -}) -export class DocumentModule {} diff --git a/src/app/shared/palette/document/read-document-field.component.spec.ts b/src/app/shared/palette/document/read-document-field.component.spec.ts deleted file mode 100644 index 75a4f457d..000000000 --- a/src/app/shared/palette/document/read-document-field.component.spec.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReadDocumentFieldComponent } from './read-document-field.component'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { attr, text } from '../../../test/helpers'; -import createSpyObj = jasmine.createSpyObj; -import { By } from '@angular/platform-browser'; -import { AppConfig } from '../../../app.config'; -import { DocumentUrlPipe } from './document-url.pipe'; - -describe('ReadDocumentFieldComponent', () => { - - const FIELD_TYPE: FieldType = { - id: 'Document', - type: 'Document' - }; - const VALUE = { - 'document_url': 'https://www.example.com', - 'document_binary_url': 'https://www.example.com/binary', - 'document_filename': 'evidence_document.evd' - }; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE - }; - const GATEWAY_DOCUMENT_URL = 'http://localhost:1234/documents'; - - let fixture: ComponentFixture; - let component: ReadDocumentFieldComponent; - let de: DebugElement; - let mockAppConfig: any; - - beforeEach(() => { - mockAppConfig = createSpyObj('appConfig', ['getDocumentManagementUrl', 'getRemoteDocumentManagementUrl']); - mockAppConfig.getDocumentManagementUrl.and.returnValue(GATEWAY_DOCUMENT_URL); - mockAppConfig.getRemoteDocumentManagementUrl.and.returnValue(VALUE.document_binary_url); - - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - ReadDocumentFieldComponent, - DocumentUrlPipe - ], - providers: [ - { provide: AppConfig, useValue: mockAppConfig } - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadDocumentFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - }); - - it('should render provided value as a clickable URL', () => { - component.caseField.value = VALUE; - fixture.detectChanges(); - - expect(text(de)).toEqual(VALUE.document_filename.toString()); - let linkElement = de.query(By.css('a')); - expect(linkElement).toBeTruthy(); - expect(attr(linkElement, 'href')).toEqual(GATEWAY_DOCUMENT_URL); - }); - - it('should render undefined value as empty string', () => { - component.caseField.value = undefined; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(''); - }); - - it('should render null value as empty string', () => { - component.caseField.value = null; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(''); - }); -}); diff --git a/src/app/shared/palette/document/read-document-field.component.ts b/src/app/shared/palette/document/read-document-field.component.ts deleted file mode 100644 index d276cce53..000000000 --- a/src/app/shared/palette/document/read-document-field.component.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Component } from '@angular/core'; -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; - -@Component({ - selector: 'ccd-read-document-field', - templateUrl: './read-document-field.html' -}) -export class ReadDocumentFieldComponent extends AbstractFieldReadComponent {} diff --git a/src/app/shared/palette/document/read-document-field.html b/src/app/shared/palette/document/read-document-field.html deleted file mode 100644 index 7c424be35..000000000 --- a/src/app/shared/palette/document/read-document-field.html +++ /dev/null @@ -1 +0,0 @@ -{{ caseField.value.document_filename }} diff --git a/src/app/shared/palette/document/write-document-field.component.spec.ts b/src/app/shared/palette/document/write-document-field.component.spec.ts deleted file mode 100644 index 44dfb0580..000000000 --- a/src/app/shared/palette/document/write-document-field.component.spec.ts +++ /dev/null @@ -1,231 +0,0 @@ -import { CaseField } from '../../domain/definition/case-field.model'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { WriteDocumentFieldComponent } from './write-document-field.component'; -import { DebugElement } from '@angular/core'; -import { DocumentManagementService } from '../../../core/documentManagement/documentManagement.service'; -import { DocumentData } from '../../domain/document/document-data.model'; -import { Observable } from 'rxjs/Observable'; -import { By } from '@angular/platform-browser'; -import { MockComponent } from 'ng2-mock-component'; -import { FormGroup } from '@angular/forms'; -import { FieldLabelPipe } from '../utils/field-label.pipe'; -import createSpyObj = jasmine.createSpyObj; -import any = jasmine.any; -import { MatDialog, MatDialogConfig, MatDialogRef } from '@angular/material'; -import { DocumentDialogComponent } from '../../document-dialog/document-dialog.component'; - -describe('WriteDocumentFieldComponent', () => { - - const FIELD_TYPE: FieldType = { - id: 'Document', - type: 'Document' - }; - const VALUE = { - 'document_url': 'https://www.example.com', - 'document_binary_url': 'https://www.example.com/binary', - 'document_filename': 'evidence_document.evd' - }; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE - }; - const DOCUMENT_MANAGEMENT_URL = 'http://docmanagement.ccd.reform/documents'; - const RESPONSE_FIRST_DOCUMENT: DocumentData = { - _embedded: { - documents: [{ - originalDocumentName: 'howto.pdf', - _links: { - self: { - href: DOCUMENT_MANAGEMENT_URL + '/abcd0123' - }, - binary: { - href: DOCUMENT_MANAGEMENT_URL + '/abcd0123/binary' - } - } - }] - } - }; - const RESPONSE_SECOND_DOCUMENT: DocumentData = { - _embedded: { - documents: [{ - originalDocumentName: 'plop.pdf', - _links: { - self: { - href: DOCUMENT_MANAGEMENT_URL + '/cdef4567' - }, - binary: { - href: DOCUMENT_MANAGEMENT_URL + '/cdef4567/binary' - } - } - }] - } - }; - const FORM_GROUP_ID = 'document_url'; - const FORM_GROUP = new FormGroup({}); - const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(FORM_GROUP_ID, control); - return control; - }; - const DIALOG_CONFIG = new MatDialogConfig(); - const $DIALOG_REPLACE_BUTTON = By.css('.button[title=Replace]'); - const $DIALOG_CANCEL_BUTTON = By.css('.button[title=Cancel]'); - - let ReadDocumentComponent = MockComponent({ - selector: 'ccd-read-document-field', - inputs: ['caseField'] - }); - - let fixture: ComponentFixture; - let component: WriteDocumentFieldComponent; - let de: DebugElement; - let mockDocumentManagementService: any; - - let fixtureDialog: ComponentFixture; - let componentDialog: DocumentDialogComponent; - let deDialog: DebugElement; - let dialog: any; - let matDialogRef: MatDialogRef; - - beforeEach(() => { - mockDocumentManagementService = createSpyObj('documentManagementService', ['uploadFile']); - mockDocumentManagementService.uploadFile.and.returnValues( - Observable.of(RESPONSE_FIRST_DOCUMENT), - Observable.of(RESPONSE_SECOND_DOCUMENT) - ); - dialog = createSpyObj('dialog', ['open']); - matDialogRef = createSpyObj>('matDialogRef', ['close']); - - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - WriteDocumentFieldComponent, - FieldLabelPipe, - DocumentDialogComponent, - // Mock - ReadDocumentComponent, - ], - providers: [ - { provide: DocumentManagementService, useValue: mockDocumentManagementService }, - { provide: MatDialog, useValue: dialog }, - { provide: MatDialogRef, useValue: matDialogRef }, - { provide: MatDialogConfig, useValue: DIALOG_CONFIG }, - DocumentDialogComponent - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteDocumentFieldComponent); - component = fixture.componentInstance; - - component.registerControl = REGISTER_CONTROL; - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - }); - - it('should render an element for file selection', () => { - let uploadElement = de.query(By.css('input[type=file]')); - - expect(uploadElement).toBeTruthy(); - }); - - it('should render a ccd-read-document-field tag for an existing document', () => { - let ccdReadDocumentElement = de.query(By.css('ccd-read-document-field')); - - expect(ccdReadDocumentElement).toBeTruthy(); - }); - - it('should initialise formControl with provided value', () => { - expect(FORM_GROUP.controls[FORM_GROUP_ID].value.document_url).toBe(VALUE.document_url); - expect(FORM_GROUP.controls[FORM_GROUP_ID].value.document_binary_url).toBe(VALUE.document_binary_url); - expect(FORM_GROUP.controls[FORM_GROUP_ID].value.document_filename).toBe(VALUE.document_filename); - }); - - it('should open file dialog if document does not exist', () => { - component.caseField.value = null; - expect(component.caseField.value).toBeFalsy(); - component.fileSelectEvent(); - component.confirmReplaceResult = 'Replace'; - expect(component.triggerReplace()).toBeFalsy(); - }); - - it('should upload given document', () => { - let file = { - name: 'test.pdf' - }; - component.fileChangeEvent({ - target: { - files: [ - file - ] - } - }); - - expect(mockDocumentManagementService.uploadFile).toHaveBeenCalledWith(any(FormData)); - }); - - it('should be invalid if document management throws error', () => { - mockDocumentManagementService.uploadFile.and.returnValue(Observable.throw('{"error": "A terrible thing happened", ' + - '"message": "But really really terrible thing!", "status": 502}')); - let file = { - name: 'test.pdf' - }; - component.fileChangeEvent({ - target: { - files: [ - file - ] - } - }); - expect(component.valid).toBeFalsy(); - }); - - it('should be invalid if no document specified for upload', () => { - component.fileChangeEvent({ - target: { - files: [] - } - }); - expect(component.valid).toBeTruthy(); - }); - - it('should display dialog only if document exist', () => { - component.caseField.value = VALUE; - expect(component.caseField.value).toBeTruthy(); - fixtureDialog = TestBed.createComponent(DocumentDialogComponent); - componentDialog = fixtureDialog.componentInstance; - deDialog = fixtureDialog.debugElement; - fixtureDialog.detectChanges(); - let replaceElement = deDialog.query(By.css('.button[title=Replace]')); - expect(replaceElement).toBeTruthy(); - }); - - it('should trigger the document replace event when replace button is clicked', () => { - fixtureDialog = TestBed.createComponent(DocumentDialogComponent); - componentDialog = fixtureDialog.componentInstance; - deDialog = fixtureDialog.debugElement; - fixtureDialog.detectChanges(); - - let dialogReplacelButton = deDialog.query($DIALOG_REPLACE_BUTTON); - dialogReplacelButton.nativeElement.click(); - expect(componentDialog.result).toEqual('Replace'); - fixture.detectChanges(); - }); - - it('should not trigger the document replace event when cancel button is clicked', () => { - fixtureDialog = TestBed.createComponent(DocumentDialogComponent); - componentDialog = fixtureDialog.componentInstance; - deDialog = fixtureDialog.debugElement; - fixtureDialog.detectChanges(); - let dialogCancelButton = deDialog.query($DIALOG_CANCEL_BUTTON); - dialogCancelButton.nativeElement.click(); - expect(componentDialog.result).toEqual('Cancel'); - fixture.detectChanges(); - }); -}); diff --git a/src/app/shared/palette/document/write-document-field.component.ts b/src/app/shared/palette/document/write-document-field.component.ts deleted file mode 100644 index 2e7b491f0..000000000 --- a/src/app/shared/palette/document/write-document-field.component.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { Component, OnInit, ViewChild, ElementRef } from '@angular/core'; -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; -import { FormControl, FormGroup } from '@angular/forms'; -import { DocumentManagementService } from '../../../core/documentManagement/documentManagement.service'; -import { HttpError } from '../../../core/http/http-error.model'; -import { MatDialog, MatDialogConfig } from '@angular/material'; -import { DocumentDialogComponent } from '../../document-dialog/document-dialog.component'; - -@Component({ - selector: 'ccd-write-document-field', - templateUrl: './write-document-field.html' -}) -export class WriteDocumentFieldComponent extends AbstractFieldWriteComponent implements OnInit { - private uploadedDocument: FormGroup; - private selectedFile: File; - private dialogConfig: MatDialogConfig; - - @ViewChild('fileInput') fileInput: ElementRef; - - valid = true; - uploadError: string; - confirmReplaceResult: string; - - constructor(private documentManagement: DocumentManagementService, private dialog: MatDialog) { - super(); - } - - private initDialog() { - this.dialogConfig = new MatDialogConfig(); - this.dialogConfig.disableClose = true; - this.dialogConfig.autoFocus = true; - this.dialogConfig.ariaLabel = 'Label'; - this.dialogConfig.height = '245px'; - this.dialogConfig.width = '550px'; - this.dialogConfig.panelClass = 'dialog'; - - this.dialogConfig.closeOnNavigation = false; - this.dialogConfig.position = { - top: window.innerHeight / 2 - 120 + 'px', left: window.innerWidth / 2 - 275 + 'px' - } - } - - ngOnInit() { - this.initDialog(); - let document = this.caseField.value; - if (document) { - this.createDocumentGroup( - document.document_url, - document.document_binary_url, - document.document_filename, - ); - } - } - - fileChangeEvent(fileInput: any) { - if (fileInput.target.files[0]) { - this.selectedFile = fileInput.target.files[0]; - - // Perform the file upload immediately on file selection - let documentUpload: FormData = new FormData(); - documentUpload.append('files', this.selectedFile, this.selectedFile.name); - documentUpload.append('classification', 'PUBLIC'); - this.documentManagement.uploadFile(documentUpload).subscribe(result => { - if (!this.uploadedDocument) { - this.createDocumentGroup(); - } - - let document = result._embedded.documents[0]; - this.setDocumentGroupValues( - document._links.self.href, - document._links.binary.href, - document.originalDocumentName, - ); - - this.valid = true; - }, (error: HttpError) => { - this.uploadError = this.getErrorMessage(error); - this.valid = false; - }); - } else { - this.selectedFile = null; - this.valid = true; - } - } - - private createDocumentGroup(url?: string, binaryUrl?: string, filename?: string): void { - this.uploadedDocument = this.registerControl(new FormGroup({ - document_url: new FormControl(url), - document_binary_url: new FormControl(binaryUrl), - document_filename: new FormControl(filename) - })); - } - - private setDocumentGroupValues(url: string, binaryUrl: string, filename: string): void { - this.uploadedDocument.get('document_url').setValue(url); - this.uploadedDocument.get('document_binary_url').setValue(binaryUrl); - this.uploadedDocument.get('document_filename').setValue(filename); - } - - private getErrorMessage(error: HttpError): string { - // Document Management unavailable - if (0 === error.status || 502 === error.status) { - return 'Document upload facility is not available at the moment'; - } - - return error.error; - } - - openFileDialog(): void { - this.fileInput.nativeElement.click(); - } - - fileSelectEvent() { - if (this.caseField.value) { - this.openDialog(this.dialogConfig); - } else { - this.openFileDialog(); - } - } - - openDialog(dialogConfig) { - const dialogRef = this.dialog.open(DocumentDialogComponent, dialogConfig); - dialogRef.beforeClose().subscribe(result => { - this.confirmReplaceResult = result; - this.triggerReplace(); - }); - } - - triggerReplace() { - if (this.confirmReplaceResult === 'Replace') { - this.openFileDialog(); - } - } -} diff --git a/src/app/shared/palette/document/write-document-field.html b/src/app/shared/palette/document/write-document-field.html deleted file mode 100644 index 711db0282..000000000 --- a/src/app/shared/palette/document/write-document-field.html +++ /dev/null @@ -1,16 +0,0 @@ -
- - -
- -
- -
-
- -
-
diff --git a/src/app/shared/palette/email/read-email-field.component.spec.ts b/src/app/shared/palette/email/read-email-field.component.spec.ts deleted file mode 100644 index 2bd27d1de..000000000 --- a/src/app/shared/palette/email/read-email-field.component.spec.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReadEmailFieldComponent } from './read-email-field.component'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { text } from '../../../test/helpers'; - -describe('ReadEmailFieldComponent', () => { - - const FIELD_TYPE: FieldType = { - id: 'Email', - type: 'Email' - }; - const VALUE = 'ccd@hmcts.net'; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE - }; - const EMPTY = '-'; - - let fixture: ComponentFixture; - let component: ReadEmailFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - ReadEmailFieldComponent - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadEmailFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render provided email as string', () => { - component.caseField.value = VALUE; - fixture.detectChanges(); - expect(text(de)).toEqual(VALUE); - }); - - it('render undefined value as empty string', () => { - component.caseField.value = undefined; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - - it('render null value as empty string', () => { - component.caseField.value = null; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); -}); diff --git a/src/app/shared/palette/email/read-email-field.component.ts b/src/app/shared/palette/email/read-email-field.component.ts deleted file mode 100644 index 424876a39..000000000 --- a/src/app/shared/palette/email/read-email-field.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Component } from '@angular/core'; -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; - -@Component({ - selector: 'ccd-read-email-field', - template: ` - - - - {{caseField.value}} - ` -}) -export class ReadEmailFieldComponent extends AbstractFieldReadComponent { - - isFieldValueEmpty(): boolean { - return (!this.caseField.value); - } - -} diff --git a/src/app/shared/palette/email/write-email-field.component.spec.ts b/src/app/shared/palette/email/write-email-field.component.spec.ts deleted file mode 100644 index 28cb9299a..000000000 --- a/src/app/shared/palette/email/write-email-field.component.spec.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { WriteEmailFieldComponent } from './write-email-field.component'; -import { DebugElement } from '@angular/core'; -import { MockComponent } from 'ng2-mock-component'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { By } from '@angular/platform-browser'; - -const FIELD_ID = 'PersonEmail'; -const FIELD_TYPE: FieldType = { - id: 'Email', - type: 'Email' -}; -const VALUE = 'ccd@hmcts.net'; -const CASE_FIELD: CaseField = { - id: FIELD_ID, - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE -}; - -const FORM_GROUP: FormGroup = new FormGroup({}); -const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(FIELD_ID, control); - return control; -}; - -describe('WriteEmailFieldComponent', () => { - - const $INPUT = By.css('.form-group input'); - - // Input is mocked so that one-way bound inputs can be tested - let Input: any = MockComponent({ selector: 'input', inputs: [ - 'type', - 'formControl' - ]}); - - let fixture: ComponentFixture; - let component: WriteEmailFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - PaletteUtilsModule - ], - declarations: [ - WriteEmailFieldComponent, - - // Mock - Input, - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteEmailFieldComponent); - component = fixture.componentInstance; - - component.registerControl = REGISTER_CONTROL; - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should add a formControl linked to the field ID to the formGroup', () => { - expect(FORM_GROUP.controls[FIELD_ID]).toBeTruthy(); - }); - - it('should initialise formControl with provided value', () => { - expect(FORM_GROUP.controls[FIELD_ID].value).toBe(VALUE); - }); - - it('should render text input element linked to formControl', () => { - let input = de.query($INPUT); - - expect(input.nativeElement.getAttribute('type')).toBe('email'); - expect(input.componentInstance.formControl).toEqual(component.emailControl); - }); -}); diff --git a/src/app/shared/palette/email/write-email-field.component.ts b/src/app/shared/palette/email/write-email-field.component.ts deleted file mode 100644 index 5df546f64..000000000 --- a/src/app/shared/palette/email/write-email-field.component.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { FormControl } from '@angular/forms'; -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; - -@Component({ - selector: 'ccd-write-email-field', - templateUrl: 'write-email-field.html' -}) -export class WriteEmailFieldComponent extends AbstractFieldWriteComponent implements OnInit { - - emailControl: FormControl; - - ngOnInit() { - this.emailControl = this.registerControl(new FormControl(this.caseField.value)); - } -} diff --git a/src/app/shared/palette/email/write-email-field.html b/src/app/shared/palette/email/write-email-field.html deleted file mode 100644 index a63f2f61b..000000000 --- a/src/app/shared/palette/email/write-email-field.html +++ /dev/null @@ -1,11 +0,0 @@ -
- - - - - -
diff --git a/src/app/shared/palette/fixed-list/fixed-list.module.ts b/src/app/shared/palette/fixed-list/fixed-list.module.ts deleted file mode 100644 index 185a1f86a..000000000 --- a/src/app/shared/palette/fixed-list/fixed-list.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FixedListPipe } from './fixed-list.pipe'; -import { ReadFixedListFieldComponent } from './read-fixed-list-field.component'; -import { WriteFixedListFieldComponent } from './write-fixed-list-field.component'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MarkdownModule } from '../../markdown/markdown.module'; - -@NgModule({ - imports: [ - CommonModule, - PaletteUtilsModule, - ReactiveFormsModule, - MarkdownModule - ], - declarations: [ - FixedListPipe, - ReadFixedListFieldComponent, - WriteFixedListFieldComponent - ], - entryComponents: [ - ReadFixedListFieldComponent, - WriteFixedListFieldComponent - ], - exports: [ - FixedListPipe - ] -}) -export class FixedListModule {} diff --git a/src/app/shared/palette/fixed-list/fixed-list.pipe.spec.ts b/src/app/shared/palette/fixed-list/fixed-list.pipe.spec.ts deleted file mode 100644 index 66a4ac32b..000000000 --- a/src/app/shared/palette/fixed-list/fixed-list.pipe.spec.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { FixedListPipe } from './fixed-list.pipe'; -import { FixedListItem } from '../../domain/definition/fixed-list-item.model'; - -describe('FixedListPipe', () => { - - const FIXED_LIST: FixedListItem[] = [ - { - code: 'M', - label: 'Male' - }, - { - code: 'F', - label: 'Female' - }, - { - code: 'O', - label: 'Other' - } - ]; - const EMPTY = ''; - - let fixedListPipe: FixedListPipe; - - beforeEach(() => { - fixedListPipe = new FixedListPipe(); - }); - - describe('given a value matching the code of a list item', () => { - it('should return the associated label', () => { - let label = fixedListPipe.transform('F', FIXED_LIST); - expect(label).toBe('Female'); - - let label2 = fixedListPipe.transform('M', FIXED_LIST); - expect(label2).toBe('Male'); - - let label3 = fixedListPipe.transform('O', FIXED_LIST); - expect(label3).toBe('Other'); - }); - }); - - describe('given a value NOT matching the code of ANY list item', () => { - it('should return an empty string for unknown value', () => { - let label = fixedListPipe.transform('X', FIXED_LIST); - expect(label).toBe(EMPTY); - }); - - it('should return an empty string for undefined value', () => { - let label = fixedListPipe.transform(undefined, FIXED_LIST); - expect(label).toBe(EMPTY); - }); - - it('should return an empty string for null value', () => { - let label = fixedListPipe.transform(null, FIXED_LIST); - expect(label).toBe(EMPTY); - }); - }); -}); diff --git a/src/app/shared/palette/fixed-list/fixed-list.pipe.ts b/src/app/shared/palette/fixed-list/fixed-list.pipe.ts deleted file mode 100644 index 7bb09a158..000000000 --- a/src/app/shared/palette/fixed-list/fixed-list.pipe.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import { FixedListItem } from '../../domain/definition/fixed-list-item.model'; - -@Pipe({ - name: 'ccdFixedList' -}) -export class FixedListPipe implements PipeTransform { - - private static readonly EMPTY = ''; - - transform(value: string, items: FixedListItem[]): any { - let item = items.find(i => i.code === value); - return item ? item.label : FixedListPipe.EMPTY; - } - -} diff --git a/src/app/shared/palette/fixed-list/read-fixed-list-field.component.spec.ts b/src/app/shared/palette/fixed-list/read-fixed-list-field.component.spec.ts deleted file mode 100644 index fd960089f..000000000 --- a/src/app/shared/palette/fixed-list/read-fixed-list-field.component.spec.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReadFixedListFieldComponent } from './read-fixed-list-field.component'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { FixedListPipe } from './fixed-list.pipe'; -import { CaseField } from '../../domain/definition/case-field.model'; - -describe('ReadFixedListFieldComponent', () => { - - const VALUE = 'F'; - const EXPECTED_LABEL = 'Female'; - const FIELD_TYPE: FieldType = { - id: 'Gender', - type: 'FixedList', - fixed_list_items: [ - { - code: 'M', - label: 'Male' - }, - { - code: VALUE, - label: EXPECTED_LABEL - }, - { - code: 'O', - label: 'Other' - } - ] - }; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE - }; - const EMPTY = '-'; - - let fixture: ComponentFixture; - let component: ReadFixedListFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - ReadFixedListFieldComponent, - FixedListPipe - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadFixedListFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render label associated to the value provided', () => { - component.caseField.value = VALUE; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EXPECTED_LABEL); - }); - - it('render undefined value as empty string', () => { - component.caseField.value = undefined; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - - it('render null value as empty string', () => { - component.caseField.value = null; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); -}); diff --git a/src/app/shared/palette/fixed-list/read-fixed-list-field.component.ts b/src/app/shared/palette/fixed-list/read-fixed-list-field.component.ts deleted file mode 100644 index 725d7bde3..000000000 --- a/src/app/shared/palette/fixed-list/read-fixed-list-field.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; -import { Component } from '@angular/core'; - -@Component({ - selector: 'ccd-read-fixed-list-field', - template: `- - {{caseField.value | ccdFixedList:caseField.field_type.fixed_list_items}}` -}) -export class ReadFixedListFieldComponent extends AbstractFieldReadComponent { - - isFieldValueEmpty(): boolean { - return (!this.caseField.value); - } - -} diff --git a/src/app/shared/palette/fixed-list/write-fixed-list-field.component.spec.ts b/src/app/shared/palette/fixed-list/write-fixed-list-field.component.spec.ts deleted file mode 100644 index b38c59f54..000000000 --- a/src/app/shared/palette/fixed-list/write-fixed-list-field.component.spec.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { By } from '@angular/platform-browser'; -import { WriteFixedListFieldComponent } from './write-fixed-list-field.component'; -import { attr, text } from '../../../test/helpers'; - -const VALUE = 'F'; -const EXPECTED_LABEL = 'Female'; -const FIELD_ID = 'MarritalStatus'; -const FIELD_TYPE: FieldType = { - id: 'Gender', - type: 'FixedList', - fixed_list_items: [ - { - code: 'M', - label: 'Male' - }, - { - code: VALUE, - label: EXPECTED_LABEL - }, - { - code: 'O', - label: 'Other' - } - ] -}; -const CASE_FIELD: CaseField = { - id: FIELD_ID, - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE -}; - -const FORM_GROUP: FormGroup = new FormGroup({}); -const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(FIELD_ID, control); - return control; -}; - -describe('WriteFixedListFieldComponent', () => { - - const $SELECT = By.css('.form-group select'); - const $OPTION = By.css('.form-group option'); - - let fixture: ComponentFixture; - let component: WriteFixedListFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - PaletteUtilsModule - ], - declarations: [ - WriteFixedListFieldComponent, - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteFixedListFieldComponent); - component = fixture.componentInstance; - - component.registerControl = REGISTER_CONTROL; - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should add a formControl linked to the field ID to the formGroup', () => { - expect(FORM_GROUP.controls[FIELD_ID]).toBeTruthy(); - }); - - it('should initialise formControl with provided value', () => { - expect(FORM_GROUP.controls[FIELD_ID].value).toBe(VALUE); - }); - - it('should render all options', () => { - let options = de.queryAll($OPTION); - - expect(options.length).toEqual(4); - expect(attr(options[0], 'value')).toEqual(''); - expect(text(options[0])).toEqual('--Select a value--'); - expect(attr(options[1], 'value')).toEqual('M'); - expect(text(options[1])).toEqual('Male'); - expect(attr(options[2], 'value')).toEqual('F'); - expect(text(options[2])).toEqual('Female'); - expect(attr(options[3], 'value')).toEqual('O'); - expect(text(options[3])).toEqual('Other'); - - }); - - it('should link select element to formControl', () => { - - component.fixedListControl.setValue('M'); - - let select = de.query($SELECT); - fixture.detectChanges(); - - expect(select.nativeElement.value).toEqual('M'); - }); -}); diff --git a/src/app/shared/palette/fixed-list/write-fixed-list-field.component.ts b/src/app/shared/palette/fixed-list/write-fixed-list-field.component.ts deleted file mode 100644 index babd1b289..000000000 --- a/src/app/shared/palette/fixed-list/write-fixed-list-field.component.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { FormControl } from '@angular/forms'; -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; - -@Component({ - selector: 'ccd-write-fixed-list-field', - templateUrl: './write-fixed-list-field.html' -}) -export class WriteFixedListFieldComponent extends AbstractFieldWriteComponent implements OnInit { - - fixedListControl: FormControl; - - ngOnInit() { - let notEmpty = this.caseField.value !== null && this.caseField.value !== undefined; - this.fixedListControl = this.registerControl(new FormControl(notEmpty ? this.caseField.value : '')); - } -} diff --git a/src/app/shared/palette/fixed-list/write-fixed-list-field.html b/src/app/shared/palette/fixed-list/write-fixed-list-field.html deleted file mode 100644 index 8cb5f10a5..000000000 --- a/src/app/shared/palette/fixed-list/write-fixed-list-field.html +++ /dev/null @@ -1,16 +0,0 @@ -
- - - - - -
diff --git a/src/app/shared/palette/label/label-field.component.spec.ts b/src/app/shared/palette/label/label-field.component.spec.ts deleted file mode 100644 index 6952da832..000000000 --- a/src/app/shared/palette/label/label-field.component.spec.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { LabelFieldComponent } from './label-field.component'; -import { DebugElement } from '@angular/core'; -import { By } from '@angular/platform-browser'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { MockComponent } from 'ng2-mock-component'; -import { LabelSubstitutorDirective } from '../../substitutor/label-substitutor.directive'; -import { LabelSubstitutionService } from '../../case-editor/label-substitution.service'; -import { FieldsUtils } from '../../utils/fields.utils'; - -describe('LabelFieldComponent', () => { - - const $CONTENT = By.css('dl>dt ccd-markdown'); - - const FIELD_TYPE: FieldType = { - id: 'Label', - type: 'Label' - }; - - const CASE_FIELD: CaseField = { - id: 'label', - label: 'Label Field Label', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: 'Label Field Value' - }; - - const LABEL_CASE_FIELD: CaseField = { - id: 'field', - label: '${label}', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: 'Label Field Value' - }; - - const EVENT_CASE_FIELDS: CaseField[] = [ - CASE_FIELD - ]; - - let MarkdownComponent: any = MockComponent({ selector: 'ccd-markdown', inputs: [ - 'content' - ]}); - let fixture: ComponentFixture; - let component: LabelFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - LabelFieldComponent, - LabelSubstitutorDirective, - MarkdownComponent - ], - providers: [ - FieldsUtils, - LabelSubstitutionService, - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(LabelFieldComponent); - })); - - describe('LabelFieldComponent without label substitution', () => { - beforeEach(() => { - component = fixture.componentInstance; - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - }); - - it('Should render a table with the field label in the markdown tag in the header', () => { - expect(de.query($CONTENT).nativeElement.getAttribute('ng-reflect-content')).toBe(CASE_FIELD.label); - }); - }); - - describe('LabelFieldComponent with label substitution', () => { - beforeEach(() => { - component = fixture.componentInstance; - - component.caseField = LABEL_CASE_FIELD; - component.eventFields = EVENT_CASE_FIELDS; - - de = fixture.debugElement; - fixture.detectChanges(); - }); - - it('Should render label after substitution of fields in label', () => { - expect(de.query($CONTENT).nativeElement.getAttribute('ng-reflect-content')).toBe(CASE_FIELD.value); - }); - }); -}); diff --git a/src/app/shared/palette/label/label-field.component.ts b/src/app/shared/palette/label/label-field.component.ts deleted file mode 100644 index 303c57cb5..000000000 --- a/src/app/shared/palette/label/label-field.component.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; -import { CaseField } from '../../domain/definition/case-field.model'; - -@Component({ - selector: 'ccd-label-field', - templateUrl: './label-field.html' -}) -export class LabelFieldComponent extends AbstractFieldReadComponent { - @Input() - eventFields: CaseField[] = []; -} diff --git a/src/app/shared/palette/label/label-field.html b/src/app/shared/palette/label/label-field.html deleted file mode 100644 index f8deea608..000000000 --- a/src/app/shared/palette/label/label-field.html +++ /dev/null @@ -1,6 +0,0 @@ -
-
- -
-
-
diff --git a/src/app/shared/palette/money-gbp/money-gbp-input.component.spec.ts b/src/app/shared/palette/money-gbp/money-gbp-input.component.spec.ts deleted file mode 100644 index bc326f8f7..000000000 --- a/src/app/shared/palette/money-gbp/money-gbp-input.component.spec.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormControl, ReactiveFormsModule } from '@angular/forms'; -import { DebugElement } from '@angular/core'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { By } from '@angular/platform-browser'; -import { MoneyGbpInputComponent } from './money-gbp-input.component'; -import { MockComponent } from 'ng2-mock-component'; -import createSpy = jasmine.createSpy; - -describe('MoneyGbpInputComponent', () => { - - const $INPUT = By.css('input'); - - let fixture: ComponentFixture; - let component: MoneyGbpInputComponent; - let de: DebugElement; - - let Input: any; - let onChange; - - beforeEach(async(() => { - - // Input is mocked so that one-way bound inputs can be tested - Input = MockComponent({ selector: 'input', inputs: [ - 'type', - 'value', - 'change', - 'keyup', - 'disabled' - ]}); - - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - PaletteUtilsModule - ], - declarations: [ - MoneyGbpInputComponent, - - // Mock - Input - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(MoneyGbpInputComponent); - component = fixture.componentInstance; - - onChange = createSpy('onChange'); - - component.registerOnChange(onChange); - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should convert pences to pounds for display', () => { - component.writeValue('12345'); - fixture.detectChanges(); - - let input = de.query($INPUT).componentInstance; - - expect(input.value).toEqual('123.45'); - }); - - it('should handle pences only', () => { - component.writeValue('45'); - fixture.detectChanges(); - - let input = de.query($INPUT).componentInstance; - - expect(input.value).toEqual('0.45'); - }); - - it('should handle 0', () => { - component.writeValue('0'); - fixture.detectChanges(); - - let input = de.query($INPUT).componentInstance; - - expect(input.value).toEqual('0.00'); - }); - - it('should handle null', () => { - component.writeValue(null); - fixture.detectChanges(); - - let input = de.query($INPUT).componentInstance; - - expect(input.value).toBeNull(); - }); - - it('should handle undefined', () => { - component.writeValue(undefined); - fixture.detectChanges(); - - let input = de.query($INPUT).componentInstance; - - expect(input.value).toBeNull(); - }); - - it('should convert pounds to pences', () => { - component.onChange({ target: { value: '123'}}); - - expect(onChange).toHaveBeenCalledWith('12300'); - }); - - it('should convert pounds and pences to pences', () => { - component.onChange({ target: { value: '123.45'}}); - - expect(onChange).toHaveBeenCalledWith('12345'); - }); - - it('should convert partial pences to pences', () => { - component.onChange({ target: { value: '123.1'}}); - - expect(onChange).toHaveBeenCalledWith('12310'); - }); - - it('should convert pences only to pences', () => { - component.onChange({ target: { value: '.1'}}); - - expect(onChange).toHaveBeenCalledWith('10'); - }); - - it('should keep empty ', () => { - component.onChange({ target: { value: ''}}); - - expect(onChange).toHaveBeenCalledWith(''); - }); - - it('should keep null', () => { - component.onChange({ target: { value: null}}); - - expect(onChange).toHaveBeenCalledWith(null); - }); - - it('should be invalid when contains letters', () => { - let results = component.validate({ value: 'x'} as FormControl); - - expect(results['pattern']).toBeTruthy(); - }); - - it('should be valid when digits', () => { - let results = component.validate({ value: '12.34'} as FormControl); - - expect(results).toBeUndefined(); - }); - - it('should be invalid when too many decimal places', () => { - let results = component.validate({ value: '12.345'} as FormControl); - - expect(results['pattern']).toBeTruthy(); - }); - - it('should be valid when empty string', () => { - let results = component.validate({ value: ''} as FormControl); - - expect(results).toBeUndefined(); - }); - - it('should not be valid when empty string and mandatory', () => { - component.mandatory = true; - let results = component.validate({ value: ''} as FormControl); - - expect(results).toEqual({pattern: 'This field is required'}); - }); - - it('should be valid when null', () => { - let results = component.validate({ value: null} as FormControl); - - expect(results).toBeUndefined(); - }); - - it('should not be valid when null and mandatory', () => { - component.mandatory = true; - let results = component.validate({ value: null} as FormControl); - - expect(results).toEqual({pattern: 'This field is required'}); - }); -}); diff --git a/src/app/shared/palette/money-gbp/money-gbp-input.component.ts b/src/app/shared/palette/money-gbp/money-gbp-input.component.ts deleted file mode 100644 index 75a83428d..000000000 --- a/src/app/shared/palette/money-gbp/money-gbp-input.component.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { Component, forwardRef, Input } from '@angular/core'; -import { ControlValueAccessor, FormControl, NG_VALIDATORS, NG_VALUE_ACCESSOR, ValidationErrors, Validator } from '@angular/forms'; - -@Component({ - selector: 'ccd-money-gbp-input', - template: ``, - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => MoneyGbpInputComponent), - multi: true, - }, - { - provide: NG_VALIDATORS, - useExisting: forwardRef(() => MoneyGbpInputComponent), - multi: true, - } - ] -}) -export class MoneyGbpInputComponent implements ControlValueAccessor, Validator { - - private static readonly PATTERN = /^\d*(\.\d{0,2})?$/; - - @Input() - id: string; - - @Input() - name: string; - - @Input() - mandatory: boolean; - - @Input() - formControl: FormControl; - - private rawValue: number; - public displayValue: string = null; - public disabled: boolean; - - // change events from the textarea - onChange(event) { - - // get value from input - let newValue = event.target.value; - - if (newValue && MoneyGbpInputComponent.PATTERN.test(newValue)) { - let parts = newValue.split('.'); - - if (!parts[1]) { - parts[1] = '00'; - } else { - while (2 > parts[1].length) { - parts[1] += '0'; - } - } - - this.rawValue = parts.join(''); - } else { - // When pattern not matched, value is passed as is so that it fails validation. - this.rawValue = newValue; - } - - // update the form - this.propagateChange(this.rawValue); - } - - writeValue(obj: any): void { - if (obj) { - this.rawValue = obj; - - let integerPart = obj.slice(0, -2) || '0'; - let decimalPart = obj.slice(-2); - - while (2 > decimalPart.length) { - decimalPart += '0'; - } - - this.displayValue = [integerPart, decimalPart].join('.'); - } - } - - registerOnChange(fn: any): void { - this.propagateChange = fn; - } - - registerOnTouched(_: any): void { - // Not used. - } - - setDisabledState(isDisabled: boolean): void { - this.disabled = isDisabled; - } - - private propagateChange = (_: any) => { }; - - onBlur() { - this.formControl.markAsTouched(); - this.propagateChange(this.rawValue); - } - - validate(control: FormControl): ValidationErrors { - if (this.mandatory && !control.value) { - return { - pattern: 'This field is required' - }; - } - if (control.value && !MoneyGbpInputComponent.PATTERN.test(control.value)) { - return { - pattern: 'Should only contain numbers with up to 2 decimal places' - }; - } - return undefined; - } - - registerOnValidatorChange(_: () => void): void { - // Not used. - } -} diff --git a/src/app/shared/palette/money-gbp/money-gbp.module.ts b/src/app/shared/palette/money-gbp/money-gbp.module.ts deleted file mode 100644 index 30d72e4f2..000000000 --- a/src/app/shared/palette/money-gbp/money-gbp.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ReactiveFormsModule } from '@angular/forms'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { ReadMoneyGbpFieldComponent } from './read-money-gbp-field.component'; -import { WriteMoneyGbpFieldComponent } from './write-money-gbp-field.component'; -import { MoneyGbpInputComponent } from './money-gbp-input.component'; -import { MarkdownModule } from '../../markdown/markdown.module'; - -@NgModule({ - imports: [ - CommonModule, - ReactiveFormsModule, - PaletteUtilsModule, - MarkdownModule - ], - declarations: [ - ReadMoneyGbpFieldComponent, - WriteMoneyGbpFieldComponent, - MoneyGbpInputComponent - ], - entryComponents: [ - ReadMoneyGbpFieldComponent, - WriteMoneyGbpFieldComponent - ], - exports: [ - ReadMoneyGbpFieldComponent - ] -}) -export class MoneyGbpModule {} diff --git a/src/app/shared/palette/money-gbp/read-money-gbp-field.component.spec.ts b/src/app/shared/palette/money-gbp/read-money-gbp-field.component.spec.ts deleted file mode 100644 index a855b5cab..000000000 --- a/src/app/shared/palette/money-gbp/read-money-gbp-field.component.spec.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReadMoneyGbpFieldComponent } from './read-money-gbp-field.component'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; - -describe('ReadMoneyGBPFieldComponent', () => { - - const FIELD_TYPE: FieldType = { - id: 'MoneyGBP', - type: 'MoneyGBP' - }; - const VALUE = 4220; - const EMPTY = '-'; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE - }; - - let fixture: ComponentFixture; - let component: ReadMoneyGbpFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - ReadMoneyGbpFieldComponent - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadMoneyGbpFieldComponent); - component = fixture.componentInstance; - - component.amount = undefined; - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - describe('from caseField value', () => { - it('should render provided value as GBP currency', () => { - component.caseField.value = VALUE; - component.ngOnInit(); - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual('£42.20'); - }); - - it('should prefix pences with leading 0.', () => { - component.caseField.value = 20; - component.ngOnInit(); - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual('£0.20'); - }); - - it('should format large number with commas', () => { - component.caseField.value = 420000020; - component.ngOnInit(); - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual('£4,200,000.20'); - }); - - it('should render undefined value as empty string', () => { - component.caseField.value = undefined; - component.ngOnInit(); - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - - it('should render null value as empty string', () => { - component.caseField.value = null; - component.ngOnInit(); - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - - it('should render unsupported values as empty string', () => { - component.caseField.value = 'bugger off, you who is reading that'; - component.ngOnInit(); - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - }); - - describe('from template value', () => { - it('should render provided value as GBP currency', () => { - component.amount = VALUE; - component.ngOnInit(); - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual('£42.20'); - }); - - it('should prefix pences with leading 0.', () => { - component.amount = 20; - component.ngOnInit(); - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual('£0.20'); - }); - - it('should format large number with commas', () => { - component.amount = 420000020; - component.ngOnInit(); - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual('£4,200,000.20'); - }); - - it('should render undefined value as empty string', () => { - component.amount = undefined; - component.ngOnInit(); - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - - it('should render null value as empty string', () => { - component.amount = null; - component.ngOnInit(); - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - - it('should render unsupported values as empty string', () => { - component.amount = 'bugger off, you who is reading that'; - component.ngOnInit(); - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - }); - -}); diff --git a/src/app/shared/palette/money-gbp/read-money-gbp-field.component.ts b/src/app/shared/palette/money-gbp/read-money-gbp-field.component.ts deleted file mode 100644 index 53050d5e2..000000000 --- a/src/app/shared/palette/money-gbp/read-money-gbp-field.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; - -@Component({ - selector: 'ccd-read-money-gbp-field', - template: `{{value / 100 | currency:'GBP':'symbol'}} - - - - ` -}) -export class ReadMoneyGbpFieldComponent extends AbstractFieldReadComponent implements OnInit { - - @Input() - amount: any; - value: any; - - ngOnInit(): void { - if (this.amount) { - this.value = this.amount; - } else if (this.caseField) { - this.value = this.caseField.value; - } - } - - isNumber(): boolean { - return null !== this.value && !isNaN(this.value); - } - -} diff --git a/src/app/shared/palette/money-gbp/write-money-gbp-field.component.spec.ts b/src/app/shared/palette/money-gbp/write-money-gbp-field.component.spec.ts deleted file mode 100644 index c686293dd..000000000 --- a/src/app/shared/palette/money-gbp/write-money-gbp-field.component.spec.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { WriteMoneyGbpFieldComponent } from './write-money-gbp-field.component'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { By } from '@angular/platform-browser'; -import { MoneyGbpInputComponent } from './money-gbp-input.component'; -import { CaseFieldService } from '../../domain/case-field.service'; - -const FIELD_ID = 'Wage'; -const FIELD_TYPE: FieldType = { - id: 'MoneyGBP', - type: 'MoneyGBP' -}; -const VALUE = '23'; -const CASE_FIELD: CaseField = { - id: FIELD_ID, - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE -}; - -const FORM_GROUP: FormGroup = new FormGroup({}); -const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(FIELD_ID, control); - return control; -}; - -describe('WriteMoneyGbpFieldComponent', () => { - - let fixture: ComponentFixture; - let component: WriteMoneyGbpFieldComponent; - let de: DebugElement; - let caseFieldService = new CaseFieldService(); - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - PaletteUtilsModule - ], - declarations: [ - WriteMoneyGbpFieldComponent, - MoneyGbpInputComponent, - ], - providers: [ - {provide: CaseFieldService, useValue: caseFieldService}, - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteMoneyGbpFieldComponent); - component = fixture.componentInstance; - - component.registerControl = REGISTER_CONTROL; - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should add a formControl linked to the field ID to the formGroup', () => { - expect(FORM_GROUP.controls[FIELD_ID]).toBeTruthy(); - }); - - it('should initialise formControl with provided value', () => { - expect(FORM_GROUP.controls[FIELD_ID].value).toBe(VALUE); - }); - - it('should render `ccd-money-gbp-input`', () => { - let input = de.query(By.directive(MoneyGbpInputComponent)); - - expect(input).toBeTruthy(); - }); -}); diff --git a/src/app/shared/palette/money-gbp/write-money-gbp-field.component.ts b/src/app/shared/palette/money-gbp/write-money-gbp-field.component.ts deleted file mode 100644 index 614d75337..000000000 --- a/src/app/shared/palette/money-gbp/write-money-gbp-field.component.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { FormControl } from '@angular/forms'; -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; - -@Component({ - selector: 'ccd-write-money-gbp-field', - templateUrl: './write-money-gbp-field.html' -}) -export class WriteMoneyGbpFieldComponent extends AbstractFieldWriteComponent implements OnInit { - - moneyGbpControl: FormControl; - - ngOnInit() { - this.moneyGbpControl = this.registerControl(new FormControl(this.caseField.value)); - } -} diff --git a/src/app/shared/palette/money-gbp/write-money-gbp-field.html b/src/app/shared/palette/money-gbp/write-money-gbp-field.html deleted file mode 100644 index 9cf140fde..000000000 --- a/src/app/shared/palette/money-gbp/write-money-gbp-field.html +++ /dev/null @@ -1,17 +0,0 @@ -
- - - -
- £ - -
- -
diff --git a/src/app/shared/palette/multi-select-list/multi-select-list.module.ts b/src/app/shared/palette/multi-select-list/multi-select-list.module.ts deleted file mode 100644 index 9e449c71d..000000000 --- a/src/app/shared/palette/multi-select-list/multi-select-list.module.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FixedListModule } from '../fixed-list/fixed-list.module'; -import { ReadMultiSelectListFieldComponent } from './read-multi-select-list-field.component'; -import { WriteMultiSelectListFieldComponent } from './write-multi-select-list-field.component'; -import { ReactiveFormsModule } from '@angular/forms'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { MarkdownModule } from '../../markdown/markdown.module'; - -@NgModule({ - imports: [ - CommonModule, - FixedListModule, - ReactiveFormsModule, - PaletteUtilsModule, - MarkdownModule - ], - declarations: [ - ReadMultiSelectListFieldComponent, - WriteMultiSelectListFieldComponent - ], - entryComponents: [ - ReadMultiSelectListFieldComponent, - WriteMultiSelectListFieldComponent - ] -}) -export class MultiSelectListModule {} diff --git a/src/app/shared/palette/multi-select-list/multi-select-list.scss b/src/app/shared/palette/multi-select-list/multi-select-list.scss deleted file mode 100644 index 212126bd9..000000000 --- a/src/app/shared/palette/multi-select-list/multi-select-list.scss +++ /dev/null @@ -1,15 +0,0 @@ -.multi-select-list-field-table { - - tr:first-child>td { - padding-top: 0; - } - - tr:last-child>td { - border-bottom: none; - } - - td.collection-actions { - width: 1px; - white-space: nowrap; - } -} diff --git a/src/app/shared/palette/multi-select-list/read-multi-select-list-field.component.spec.ts b/src/app/shared/palette/multi-select-list/read-multi-select-list-field.component.spec.ts deleted file mode 100644 index 8ae0c4fbe..000000000 --- a/src/app/shared/palette/multi-select-list/read-multi-select-list-field.component.spec.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { By } from '@angular/platform-browser'; -import { MockComponent } from 'ng2-mock-component'; -import { ReadMultiSelectListFieldComponent } from './read-multi-select-list-field.component'; -import { text } from '../../../test/helpers'; -import { FixedListPipe } from '../fixed-list/fixed-list.pipe'; - -describe('ReadMultiSelectListFieldComponent', () => { - - const $VALUES = By.css('table>tbody>tr>td'); - - const FIELD_TYPE: FieldType = { - id: 'MultiSelectList', - type: 'MultiSelectList', - fixed_list_items: [ - { - label: 'Pierre', - code: 'P' - }, - { - label: 'Paul', - code: 'PA' - }, - { - label: 'Jacques', - code: 'J' - } - ] - }; - const VALUES = [ 'P', 'PA', 'J' ]; - const CASE_FIELD = new CaseField(); - CASE_FIELD.id = 'x'; - CASE_FIELD.label = 'X'; - CASE_FIELD.field_type = FIELD_TYPE; - CASE_FIELD.value = VALUES; - - let FieldReadComponent = MockComponent({ - selector: 'ccd-field-read', - inputs: ['caseField'] - }); - - let fixture: ComponentFixture; - let component: ReadMultiSelectListFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - ReadMultiSelectListFieldComponent, - FixedListPipe, - - // Mock - FieldReadComponent - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadMultiSelectListFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render values as a table with one row and one cell per value', () => { - component.caseField.value = VALUES; - fixture.detectChanges(); - - let cells = de.queryAll($VALUES); - - expect(cells.length).toEqual(VALUES.length); - - for (let i = 0; i < VALUES.length; i++) { - - expect(FIELD_TYPE.fixed_list_items[i].label).toEqual(text(cells[i])); - - } - }); - - it('should NOT render anything when value is undefined', () => { - component.caseField.value = undefined; - fixture.detectChanges(); - - // length is 1 as we display - for empty value - expect(de.children.length).toBe(1); - }); - - it('should NOT render anything when value is null', () => { - component.caseField.value = null; - fixture.detectChanges(); - - // length is 1 as we display - for empty value - expect(de.children.length).toBe(1); - }); - - it('should NOT render anything when value is empty array', () => { - component.caseField.value = []; - fixture.detectChanges(); - - // length is 1 as we display - for empty value - expect(de.children.length).toBe(1); - }); -}); diff --git a/src/app/shared/palette/multi-select-list/read-multi-select-list-field.component.ts b/src/app/shared/palette/multi-select-list/read-multi-select-list-field.component.ts deleted file mode 100644 index c8f09470e..000000000 --- a/src/app/shared/palette/multi-select-list/read-multi-select-list-field.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component } from '@angular/core'; -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; - -@Component({ - selector: 'ccd-read-multi-select-list-field', - templateUrl: './read-multi-select-list-field.html', - styleUrls: ['./multi-select-list.scss'] -}) -export class ReadMultiSelectListFieldComponent extends AbstractFieldReadComponent { - - getCaseFieldValue(): string { - return this.caseField.value ? this.caseField.value : '-'; - } - - isFieldValueEmpty(): boolean { - return (!this.caseField.value); - } - -} diff --git a/src/app/shared/palette/multi-select-list/read-multi-select-list-field.html b/src/app/shared/palette/multi-select-list/read-multi-select-list-field.html deleted file mode 100644 index 92dc359af..000000000 --- a/src/app/shared/palette/multi-select-list/read-multi-select-list-field.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - -
{{ value | ccdFixedList:caseField.field_type.fixed_list_items }}
- - - - - diff --git a/src/app/shared/palette/multi-select-list/write-multi-select-list-field.component.spec.ts b/src/app/shared/palette/multi-select-list/write-multi-select-list-field.component.spec.ts deleted file mode 100644 index c4759fd0d..000000000 --- a/src/app/shared/palette/multi-select-list/write-multi-select-list-field.component.spec.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormArray, ReactiveFormsModule } from '@angular/forms'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { By } from '@angular/platform-browser'; -import { attr } from '../../../test/helpers'; -import { WriteMultiSelectListFieldComponent } from './write-multi-select-list-field.component'; - -const VALUES = [ 'Option1', 'Option3' ]; -const FIELD_ID = 'MultiSelectList1'; -const FIELD_TYPE: FieldType = { - id: 'MultiSelectList', - type: 'MultiSelectList', - fixed_list_items: [ - { - code: 'Option1', - label: 'Option 1' - }, - { - code: 'Option2', - label: 'Option 2' - }, - { - code: 'Option3', - label: 'Option 3' - } - ] -}; -const CASE_FIELD: CaseField = new CaseField(); -CASE_FIELD.id = FIELD_ID; -CASE_FIELD.label = 'X'; -CASE_FIELD.field_type = FIELD_TYPE; -CASE_FIELD.value = VALUES; - -const REGISTER_CONTROL = (control) => { - return control; -}; - -describe('WriteMultiSelectListFieldComponent', () => { - - const $CHECKBOXES = By.css('input[type="checkbox"]'); - const $SELECTED_CHECKBOXES = By.css('input[type="checkbox"]:checked'); - const $OPTION_1 = By.css('input[value="Option1"]'); - const $OPTION_2 = By.css('input[value="Option2"]'); - - let fixture: ComponentFixture; - let component: WriteMultiSelectListFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - PaletteUtilsModule - ], - declarations: [ - WriteMultiSelectListFieldComponent, - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteMultiSelectListFieldComponent); - component = fixture.componentInstance; - - component.registerControl = REGISTER_CONTROL; - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should register a FormArray', () => { - expect(component.checkboxes.constructor).toBe(FormArray); - }); - - it('should initialise FormArray with initial values', () => { - expect(component.checkboxes.controls.length).toEqual(2); - expect(component.checkboxes.controls[0].value).toEqual(VALUES[0]); - expect(component.checkboxes.controls[1].value).toEqual(VALUES[1]); - }); - - it('should render a checkbox for each available option', () => { - let checkboxes = de.queryAll($CHECKBOXES); - - expect(checkboxes.length).toEqual(FIELD_TYPE.fixed_list_items.length); - - FIELD_TYPE.fixed_list_items.forEach(item => { - expect(checkboxes.find(checkbox => attr(checkbox, 'value') === item.code)).toBeTruthy(); - }); - }); - - it('should mark as selected the initially selected checkboxes', () => { - let checkboxes = de.queryAll($SELECTED_CHECKBOXES); - - expect(checkboxes.length).toEqual(VALUES.length); - - VALUES.forEach(value => { - expect(checkboxes.find(checkbox => attr(checkbox, 'value') === value)).toBeTruthy(); - }); - }); - - it('should remove option from values when unselected', () => { - let option1 = de.query($OPTION_1).nativeElement; - option1.click(); - - fixture.detectChanges(); - - expect(option1.checked).toBeFalsy(); - expect(component.checkboxes.controls.length).toEqual(1); - expect(component.checkboxes.controls[0].value).not.toEqual(FIELD_TYPE.fixed_list_items[0].code); - }); - - it('should add option to values when selected', () => { - let option2 = de.query($OPTION_2).nativeElement; - option2.click(); - - fixture.detectChanges(); - - expect(option2.checked).toBeTruthy(); - expect(component.checkboxes.controls.length).toEqual(3); - expect(component.checkboxes.controls[2].value).toEqual(FIELD_TYPE.fixed_list_items[1].code); - }); -}); diff --git a/src/app/shared/palette/multi-select-list/write-multi-select-list-field.component.ts b/src/app/shared/palette/multi-select-list/write-multi-select-list-field.component.ts deleted file mode 100644 index cadbb6695..000000000 --- a/src/app/shared/palette/multi-select-list/write-multi-select-list-field.component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; -import { FormArray, FormControl } from '@angular/forms'; - -@Component({ - selector: 'ccd-write-multi-select-list-field', - templateUrl: './write-multi-select-list-field.html' -}) -export class WriteMultiSelectListFieldComponent extends AbstractFieldWriteComponent implements OnInit { - - checkboxes: FormArray; - - ngOnInit(): void { - this.checkboxes = new FormArray([]); - - // Initialise array with existing values - if (this.caseField.value && Array.isArray(this.caseField.value)) { - const values: string[] = this.caseField.value; - values.forEach(value => { - this.checkboxes.push(new FormControl(value)); - }); - } - - this.checkboxes = this.registerControl(this.checkboxes); - } - - onCheckChange(event) { - - if (!this.isSelected(event.target.value)) { - // Add a new control in the FormArray - this.checkboxes.push(new FormControl(event.target.value)); - } else { - // Remove the control form the FormArray - this.checkboxes.controls.forEach((ctrl: FormControl, i) => { - if (ctrl.value === event.target.value) { - this.checkboxes.removeAt(i); - return; - } - }); - } - } - - isSelected(code) { - return this.checkboxes.controls.find(control => control.value === code); - } - -} diff --git a/src/app/shared/palette/multi-select-list/write-multi-select-list-field.html b/src/app/shared/palette/multi-select-list/write-multi-select-list-field.html deleted file mode 100644 index cd86376e1..000000000 --- a/src/app/shared/palette/multi-select-list/write-multi-select-list-field.html +++ /dev/null @@ -1,22 +0,0 @@ -
- -
- - - {{caseField | ccdFieldLabel}} - {{caseField.hint_text}} - {{checkboxes.errors | ccdFirstError}} - - - - -
- - -
- -
- -
- -
diff --git a/src/app/shared/palette/number/read-number-field.component.spec.ts b/src/app/shared/palette/number/read-number-field.component.spec.ts deleted file mode 100644 index 8ab13c0ae..000000000 --- a/src/app/shared/palette/number/read-number-field.component.spec.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReadNumberFieldComponent } from './read-number-field.component'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; - -describe('ReadNumberFieldComponent', () => { - - const FIELD_TYPE: FieldType = { - id: 'Number', - type: 'Number' - }; - const VALUE = 42; - const EMPTY = '-'; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE - }; - - let fixture: ComponentFixture; - let component: ReadNumberFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - ReadNumberFieldComponent - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadNumberFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render provided value as number', () => { - component.caseField.value = VALUE; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(VALUE.toString()); - }); - - it('render undefined value as hyphen string', () => { - component.caseField.value = undefined; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - - it('render null value as hyphen string', () => { - component.caseField.value = null; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); -}); diff --git a/src/app/shared/palette/number/read-number-field.component.ts b/src/app/shared/palette/number/read-number-field.component.ts deleted file mode 100644 index 4f7f02543..000000000 --- a/src/app/shared/palette/number/read-number-field.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; -import { Component } from '@angular/core'; - -@Component({ - selector: 'ccd-read-number-field', - template: `{{ getCaseFieldValue() }}` -}) -export class ReadNumberFieldComponent extends AbstractFieldReadComponent { - - getCaseFieldValue(): string { - return this.caseField.value ? this.caseField.value : '-'; - } - - isFieldValueEmpty(): boolean { - return (!this.caseField.value); - } - -} diff --git a/src/app/shared/palette/number/write-number-field.component.spec.ts b/src/app/shared/palette/number/write-number-field.component.spec.ts deleted file mode 100644 index f8ee6737c..000000000 --- a/src/app/shared/palette/number/write-number-field.component.spec.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { WriteNumberFieldComponent } from './write-number-field.component'; -import { DebugElement } from '@angular/core'; -import { MockComponent } from 'ng2-mock-component'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { By } from '@angular/platform-browser'; - -const FIELD_ID = 'PersonAge'; -const FIELD_TYPE: FieldType = { - id: 'Number', - type: 'Number' -}; -const VALUE = '23'; -const CASE_FIELD: CaseField = { - id: FIELD_ID, - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE -}; - -const FORM_GROUP: FormGroup = new FormGroup({}); -const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(FIELD_ID, control); - return control; -}; - -describe('WriteNumberFieldComponent', () => { - - const $INPUT = By.css('.form-group input'); - - // Input is mocked so that one-way bound inputs can be tested - let Input: any = MockComponent({ selector: 'input', inputs: [ - 'type', - 'formControl' - ]}); - - let fixture: ComponentFixture; - let component: WriteNumberFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - PaletteUtilsModule - ], - declarations: [ - WriteNumberFieldComponent, - - // Mock - Input, - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteNumberFieldComponent); - component = fixture.componentInstance; - - component.registerControl = REGISTER_CONTROL; - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should add a formControl linked to the field ID to the formGroup', () => { - expect(FORM_GROUP.controls[FIELD_ID]).toBeTruthy(); - }); - - it('should initialise formControl with provided value', () => { - expect(FORM_GROUP.controls[FIELD_ID].value).toBe(VALUE); - }); - - it('should render text input element linked to formControl', () => { - let input = de.query($INPUT); - - expect(input.nativeElement.getAttribute('type')).toBe('number'); - expect(input.componentInstance.formControl).toEqual(component.numberControl); - }); -}); diff --git a/src/app/shared/palette/number/write-number-field.component.ts b/src/app/shared/palette/number/write-number-field.component.ts deleted file mode 100644 index aa716fa04..000000000 --- a/src/app/shared/palette/number/write-number-field.component.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { FormControl } from '@angular/forms'; -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; - -@Component({ - selector: 'ccd-write-number-field', - templateUrl: './write-number-field.html' -}) -export class WriteNumberFieldComponent extends AbstractFieldWriteComponent implements OnInit { - - numberControl: FormControl; - - ngOnInit() { - this.numberControl = this.registerControl(new FormControl(this.caseField.value)); - } -} diff --git a/src/app/shared/palette/number/write-number-field.html b/src/app/shared/palette/number/write-number-field.html deleted file mode 100644 index cc05b0a78..000000000 --- a/src/app/shared/palette/number/write-number-field.html +++ /dev/null @@ -1,11 +0,0 @@ -
- - - - - -
diff --git a/src/app/shared/palette/order-summary/fee-value.model.ts b/src/app/shared/palette/order-summary/fee-value.model.ts deleted file mode 100644 index 8187c46e7..000000000 --- a/src/app/shared/palette/order-summary/fee-value.model.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Fee } from './fee.model'; - -export class FeeValue { - value: Fee -} diff --git a/src/app/shared/palette/order-summary/fee.model.ts b/src/app/shared/palette/order-summary/fee.model.ts deleted file mode 100644 index 0ce5dd204..000000000 --- a/src/app/shared/palette/order-summary/fee.model.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class Fee { - FeeCode: string; - FeeAmount: string; - FeeDescription?: string; - FeeVersion: string; -} diff --git a/src/app/shared/palette/order-summary/order-summary.model.ts b/src/app/shared/palette/order-summary/order-summary.model.ts deleted file mode 100644 index af6df1150..000000000 --- a/src/app/shared/palette/order-summary/order-summary.model.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { FeeValue } from './fee-value.model'; - -export class OrderSummary { - PaymentReference: string; - Fees: FeeValue[]; - PaymentTotal: string; -} diff --git a/src/app/shared/palette/order-summary/order-summary.module.ts b/src/app/shared/palette/order-summary/order-summary.module.ts deleted file mode 100644 index 677bef04f..000000000 --- a/src/app/shared/palette/order-summary/order-summary.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NgModule } from '@angular/core'; -import { WriteOrderSummaryFieldComponent } from './write-order-summary-field.component'; -import { ComplexModule } from '../complex/complex.module'; -import { CommonModule } from '@angular/common'; -import { ReactiveFormsModule } from '@angular/forms'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { MoneyGbpModule } from '../money-gbp/money-gbp.module'; -import { ReadOrderSummaryFieldComponent } from './read-order-summary-field.component'; -import { ReadOrderSummaryRowComponent } from './read-order-summary-row.component'; - -@NgModule({ - imports: [ - CommonModule, - ComplexModule, - ReactiveFormsModule, - PaletteUtilsModule, - MoneyGbpModule - ], - declarations: [ - WriteOrderSummaryFieldComponent, - ReadOrderSummaryFieldComponent, - ReadOrderSummaryRowComponent, - ], - entryComponents: [ - WriteOrderSummaryFieldComponent, - ReadOrderSummaryFieldComponent, - ReadOrderSummaryRowComponent, - ], -}) -export class OrderSummaryModule {} diff --git a/src/app/shared/palette/order-summary/read-order-summary-field.component.spec.ts b/src/app/shared/palette/order-summary/read-order-summary-field.component.spec.ts deleted file mode 100644 index 2a34ca457..000000000 --- a/src/app/shared/palette/order-summary/read-order-summary-field.component.spec.ts +++ /dev/null @@ -1,218 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReadOrderSummaryFieldComponent } from './read-order-summary-field.component'; -import { OrderSummary } from './order-summary.model'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { By } from '@angular/platform-browser'; -import { text } from '../../../test/helpers'; -import { ReadOrderSummaryRowComponent } from './read-order-summary-row.component'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MoneyGbpModule } from '../money-gbp/money-gbp.module'; - -describe('ReadOrderSummaryFieldComponent', () => { - - const FIELD_TYPE: FieldType = { - id: 'PersonOrderSummary', - type: 'Complex' - }; - - const VALUE: OrderSummary = { - PaymentReference: 'RC-1521-1095-0964-3143', - Fees: [ - { - value: { - FeeCode: 'FEE0001', - FeeAmount: '4545', - FeeDescription: 'First fee description', - FeeVersion: '1' - } - }, - { - value: { - FeeCode: 'FEE0002', - FeeAmount: '0455', - FeeDescription: 'Second fee description', - FeeVersion: '2' - } - } - ], - PaymentTotal: '5000' - }; - const EMPTY = '-'; - const EXPECTED_FEE_AMOUNTS = ['£45.45', '£4.55']; - const EXPECTED_PAYMENT_TOTAL = '£50.00'; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'READONLY', - field_type: FIELD_TYPE, - value: VALUE - }; - const UNDEFINED_CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'READONLY', - field_type: FIELD_TYPE, - value: undefined - }; - const NULL_CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'READONLY', - field_type: FIELD_TYPE, - value: null - }; - - const $HEAD_ROW = By.css('table>thead>tr'); - const $BODY = By.css('table>tbody'); - - describe('Value exists', () => { - let fixture: ComponentFixture; - let component: ReadOrderSummaryFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - MoneyGbpModule - ], - declarations: [ - ReadOrderSummaryFieldComponent, - ReadOrderSummaryRowComponent, - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadOrderSummaryFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render provided order summary as a table', () => { - - let headRow = de.query($HEAD_ROW); - expect(headRow.children.length).toBe(3); - expect(text(headRow.children[0])).toBe('Code'); - expect(text(headRow.children[1])).toBe('Description'); - expect(text(headRow.children[2])).toBe('Amount'); - - let body = de.query($BODY); - expect(body.children.length).toEqual(VALUE.Fees.length + 1); - - for (let i = 1; i <= VALUE.Fees.length; i++) { - - let feeCode = text(de.query(By.css('table>tbody tr:nth-child(' + i + ') td:nth-child(1)'))); - let feeDescription = text(de.query(By.css('table>tbody tr:nth-child(' + i + ') td:nth-child(2)'))); - let feeAmount = text(de.query(By.css('table>tbody tr:nth-child(' + i + ') td:nth-child(3)'))); - - expect(feeCode).toBe(VALUE.Fees[i - 1].value.FeeCode); - expect(feeDescription).toBe(VALUE.Fees[i - 1].value.FeeDescription); - expect(feeAmount).toBe(EXPECTED_FEE_AMOUNTS[i - 1]); - } - - let paymentTotalLabel = text(de.query(By.css('table>tbody tr:last-child td:nth-child(2)'))) - expect(paymentTotalLabel).toBe('Total'); - - let paymentTotalValue = text(de.query(By.css('table>tbody tr:last-child td:nth-child(3)'))) - expect(paymentTotalValue).toBe(EXPECTED_PAYMENT_TOTAL); - - }); - }); - - describe('Undefined value', () => { - let fixture: ComponentFixture; - let component: ReadOrderSummaryFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - MoneyGbpModule - ], - declarations: [ - ReadOrderSummaryFieldComponent, - ReadOrderSummaryRowComponent, - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadOrderSummaryFieldComponent); - component = fixture.componentInstance; - - component.caseField = UNDEFINED_CASE_FIELD; - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render undefined case field value as empty table with column headers and Total rows only', () => { - let headRow = de.query($HEAD_ROW); - expect(headRow.children.length).toBe(3); - expect(text(headRow.children[0])).toBe('Code'); - expect(text(headRow.children[1])).toBe('Description'); - expect(text(headRow.children[2])).toBe('Amount'); - - let body = de.query($BODY); - expect(body.children.length).toBe(1); - - let paymentTotalLabel = text(de.query(By.css('table>tbody tr:last-child td:nth-child(2)'))) - expect(paymentTotalLabel).toBe('Total'); - - let paymentTotal = text(de.query(By.css('table>tbody tr:last-child td:nth-child(3)'))) - expect(paymentTotal).toBe(EMPTY); - }); - }); - - describe('Null value', () => { - let fixture: ComponentFixture; - let component: ReadOrderSummaryFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - MoneyGbpModule - ], - declarations: [ - ReadOrderSummaryFieldComponent, - ReadOrderSummaryRowComponent, - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadOrderSummaryFieldComponent); - component = fixture.componentInstance; - - component.caseField = NULL_CASE_FIELD; - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render null case field value as empty table with column headers and Total rows only', () => { - let headRow = de.query($HEAD_ROW); - expect(headRow.children.length).toBe(3); - expect(text(headRow.children[0])).toBe('Code'); - expect(text(headRow.children[1])).toBe('Description'); - expect(text(headRow.children[2])).toBe('Amount'); - - let body = de.query($BODY); - - expect(body.children.length).toBe(1); - - let paymentTotalLabel = text(de.query(By.css('table>tbody tr:last-child td:nth-child(2)'))) - expect(paymentTotalLabel).toBe('Total'); - - let paymentTotal = text(de.query(By.css('table>tbody tr:last-child td:nth-child(3)'))) - expect(paymentTotal).toBe(EMPTY); - }); - }); -}); diff --git a/src/app/shared/palette/order-summary/read-order-summary-field.component.ts b/src/app/shared/palette/order-summary/read-order-summary-field.component.ts deleted file mode 100644 index 181140a59..000000000 --- a/src/app/shared/palette/order-summary/read-order-summary-field.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component } from '@angular/core'; -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; -import { FeeValue } from './fee-value.model'; - -@Component({ - selector: 'ccd-read-order-summary-field', - templateUrl: './read-order-summary-field.html', - styleUrls: [ - './read-order-summary-field.scss' - ], -}) -export class ReadOrderSummaryFieldComponent extends AbstractFieldReadComponent { - - getFees(): FeeValue[] { - return this.caseField.value ? this.caseField.value.Fees : []; - } - - getPaymentTotal(): string { - return this.caseField.value ? this.caseField.value.PaymentTotal : ''; - } -} diff --git a/src/app/shared/palette/order-summary/read-order-summary-field.html b/src/app/shared/palette/order-summary/read-order-summary-field.html deleted file mode 100644 index fa6fddb26..000000000 --- a/src/app/shared/palette/order-summary/read-order-summary-field.html +++ /dev/null @@ -1,14 +0,0 @@ -
Order Summary
- - - - - - - - - - - - -
CodeDescriptionAmount
Total
diff --git a/src/app/shared/palette/order-summary/read-order-summary-field.scss b/src/app/shared/palette/order-summary/read-order-summary-field.scss deleted file mode 100644 index 00f776e19..000000000 --- a/src/app/shared/palette/order-summary/read-order-summary-field.scss +++ /dev/null @@ -1,58 +0,0 @@ -@import 'node_modules/govuk_frontend_toolkit/stylesheets/_typography'; -@import "~govuk_frontend_toolkit/stylesheets/_colours.scss"; - -$padding: 12px; - -.order-summary-title { - border: 0; - @include bold-24; -} - -table { - margin-bottom: 23px; - thead { - tr{ - td { - margin: 0; - border-bottom: 1px solid $black; - padding-top: 41px; - padding-bottom: 36px; - @include bold-16; - } - td:nth-child(3) { - text-align: right; - } - } - } - tbody { - tr { - td { - padding-top: $padding; - padding-bottom: $padding; - margin: 0; - border-bottom: 1px solid $black; - @include core-16; - } - td:nth-child(1) { - width: 20px; - } - td:nth-child(2) { - width: 70%; - } - td:nth-child(3) { - text-align: right; - width: 10%; - } - } - tr:last-child { - td:nth-child(1) { - border-bottom: 0px; - } - td:nth-child(2) { - @include bold-16; - text-align: right; - border-bottom: 0px; - } - } - } -} diff --git a/src/app/shared/palette/order-summary/read-order-summary-row.component.ts b/src/app/shared/palette/order-summary/read-order-summary-row.component.ts deleted file mode 100644 index 276b72ede..000000000 --- a/src/app/shared/palette/order-summary/read-order-summary-row.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Component, Input } from '@angular/core'; -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; -import { FeeValue } from './fee-value.model'; - -@Component({ - // tslint:disable-next-line - selector: '[ccdReadOrderSummaryRow]', - templateUrl: './read-order-summary-row.html', - styleUrls: [ - './read-order-summary-row.scss' - ], -}) -export class ReadOrderSummaryRowComponent extends AbstractFieldReadComponent { - - @Input() - feeValue: FeeValue; - - getFeeAmount(): string { - return this.feeValue.value ? this.feeValue.value.FeeAmount : ''; - } -} diff --git a/src/app/shared/palette/order-summary/read-order-summary-row.html b/src/app/shared/palette/order-summary/read-order-summary-row.html deleted file mode 100644 index 57168d8a0..000000000 --- a/src/app/shared/palette/order-summary/read-order-summary-row.html +++ /dev/null @@ -1,3 +0,0 @@ -{{feeValue.value.FeeCode}} -{{feeValue.value.FeeDescription}} - \ No newline at end of file diff --git a/src/app/shared/palette/order-summary/read-order-summary-row.scss b/src/app/shared/palette/order-summary/read-order-summary-row.scss deleted file mode 100644 index 50f736804..000000000 --- a/src/app/shared/palette/order-summary/read-order-summary-row.scss +++ /dev/null @@ -1,22 +0,0 @@ -@import 'node_modules/govuk_frontend_toolkit/stylesheets/_typography'; -@import "~govuk_frontend_toolkit/stylesheets/_colours.scss"; - -$padding: 12px; - -td { - padding-top: $padding; - padding-bottom: $padding; - margin: 0; - border-bottom: 1px solid $black; - @include core-16; -} -td:nth-child(1) { - width: 20px; -} -td:nth-child(2) { - width: 70%; -} -td:nth-child(3) { - text-align: right; - width: 10%; -} diff --git a/src/app/shared/palette/order-summary/write-order-summary-field.component.spec.ts b/src/app/shared/palette/order-summary/write-order-summary-field.component.spec.ts deleted file mode 100644 index 3a33ab95c..000000000 --- a/src/app/shared/palette/order-summary/write-order-summary-field.component.spec.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReadOrderSummaryFieldComponent } from './read-order-summary-field.component'; -import { OrderSummary } from './order-summary.model'; -import { DebugElement, Component, Input } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { By } from '@angular/platform-browser'; -import { text } from '../../../test/helpers'; -import { ReadOrderSummaryRowComponent } from './read-order-summary-row.component'; -import { ReactiveFormsModule, FormControl, AbstractControl, FormGroup } from '@angular/forms'; -import { MoneyGbpModule } from '../money-gbp/money-gbp.module'; -import { WriteOrderSummaryFieldComponent } from './write-order-summary-field.component'; - -describe('WriteOrderSummaryFieldComponent', () => { - - const FIELD_TYPE: FieldType = { - id: 'PersonOrderSummary', - type: 'Complex' - }; - - const VALUE: OrderSummary = { - PaymentReference: 'RC-1521-1095-0964-3143', - Fees: [ - { - value: { - FeeCode: 'FEE0001', - FeeAmount: '4545', - FeeDescription: 'First fee description', - FeeVersion: '1' - } - }, - { - value: { - FeeCode: 'FEE0002', - FeeAmount: '0455', - FeeDescription: 'Second fee description', - FeeVersion: '2' - } - } - ], - PaymentTotal: '5000' - }; - const EMPTY = '-'; - const EXPECTED_FEE_AMOUNTS = ['£45.45', '£4.55']; - const EXPECTED_PAYMENT_TOTAL = '£50.00'; - const ID = 'PersonOrderSummary'; - const CASE_FIELD: CaseField = { - id: ID, - label: 'X', - display_context: 'MANDATORY', - field_type: FIELD_TYPE, - value: VALUE - }; - const UNDEFINED_CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'MANDATORY', - field_type: FIELD_TYPE, - value: undefined - }; - const NULL_CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'MANDATORY', - field_type: FIELD_TYPE, - value: null - }; - - const $HEAD_ROW = By.css('table>thead>tr'); - const $BODY = By.css('table>tbody'); - - describe('Value exists', () => { - let fixture: ComponentFixture; - let component: WriteOrderSummaryFieldComponent; - let de: DebugElement; - - const FORM_GROUP: FormGroup = new FormGroup({}); - const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(ID, control); - return control; - }; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - MoneyGbpModule - ], - declarations: [ - WriteOrderSummaryFieldComponent, - // Mocks - ReadOrderSummaryFieldComponent, - ReadOrderSummaryRowComponent, - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteOrderSummaryFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - component.registerControl = REGISTER_CONTROL; - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render provided order summary as a table', () => { - let headRow = de.query($HEAD_ROW); - expect(headRow.children.length).toBe(3); - expect(text(headRow.children[0])).toBe('Code'); - expect(text(headRow.children[1])).toBe('Description'); - expect(text(headRow.children[2])).toBe('Amount'); - - let body = de.query($BODY); - expect(body.children.length).toEqual(VALUE.Fees.length + 1); - - for (let i = 1; i <= VALUE.Fees.length; i++) { - - let feeCode = text(de.query(By.css('table>tbody tr:nth-child(' + i + ') td:nth-child(1)'))); - let feeDescription = text(de.query(By.css('table>tbody tr:nth-child(' + i + ') td:nth-child(2)'))); - let feeAmount = text(de.query(By.css('table>tbody tr:nth-child(' + i + ') td:nth-child(3)'))); - - expect(feeCode).toBe(VALUE.Fees[i - 1].value.FeeCode); - expect(feeDescription).toBe(VALUE.Fees[i - 1].value.FeeDescription); - expect(feeAmount).toBe(EXPECTED_FEE_AMOUNTS[i - 1]); - } - - let paymentTotalLabel = text(de.query(By.css('table>tbody tr:last-child td:nth-child(2)'))) - expect(paymentTotalLabel).toBe('Total'); - - let paymentTotalValue = text(de.query(By.css('table>tbody tr:last-child td:nth-child(3)'))) - expect(paymentTotalValue).toBe(EXPECTED_PAYMENT_TOTAL); - }); - }); - - describe('Undefined value', () => { - let fixture: ComponentFixture; - let component: ReadOrderSummaryFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - MoneyGbpModule - ], - declarations: [ - ReadOrderSummaryFieldComponent, - ReadOrderSummaryRowComponent, - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadOrderSummaryFieldComponent); - component = fixture.componentInstance; - - component.caseField = UNDEFINED_CASE_FIELD; - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render undefined case field value as empty table with column headers and Total rows only', () => { - let headRow = de.query($HEAD_ROW); - expect(headRow.children.length).toBe(3); - expect(text(headRow.children[0])).toBe('Code'); - expect(text(headRow.children[1])).toBe('Description'); - expect(text(headRow.children[2])).toBe('Amount'); - - let body = de.query($BODY); - expect(body.children.length).toBe(1); - - let paymentTotalLabel = text(de.query(By.css('table>tbody tr:last-child td:nth-child(2)'))) - expect(paymentTotalLabel).toBe('Total'); - - let paymentTotal = text(de.query(By.css('table>tbody tr:last-child td:nth-child(3)'))) - expect(paymentTotal).toBe(EMPTY); - }); - }); - - describe('Null value', () => { - let fixture: ComponentFixture; - let component: ReadOrderSummaryFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - MoneyGbpModule - ], - declarations: [ - ReadOrderSummaryFieldComponent, - ReadOrderSummaryRowComponent, - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadOrderSummaryFieldComponent); - component = fixture.componentInstance; - - component.caseField = NULL_CASE_FIELD; - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render null case field value as empty table with column headers and Total rows only', () => { - let headRow = de.query($HEAD_ROW); - expect(headRow.children.length).toBe(3); - expect(text(headRow.children[0])).toBe('Code'); - expect(text(headRow.children[1])).toBe('Description'); - expect(text(headRow.children[2])).toBe('Amount'); - - let body = de.query($BODY); - - expect(body.children.length).toBe(1); - - let paymentTotalLabel = text(de.query(By.css('table>tbody tr:last-child td:nth-child(2)'))) - expect(paymentTotalLabel).toBe('Total'); - - let paymentTotal = text(de.query(By.css('table>tbody tr:last-child td:nth-child(3)'))) - expect(paymentTotal).toBe(EMPTY); - }); - }); -}); diff --git a/src/app/shared/palette/order-summary/write-order-summary-field.component.ts b/src/app/shared/palette/order-summary/write-order-summary-field.component.ts deleted file mode 100644 index 76c76b355..000000000 --- a/src/app/shared/palette/order-summary/write-order-summary-field.component.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; -import { FormControl, FormGroup, FormArray } from '@angular/forms'; - -@Component({ - selector: 'ccd-write-order-summary-field', - templateUrl: './write-order-summary-field.html' -}) -export class WriteOrderSummaryFieldComponent extends AbstractFieldWriteComponent implements OnInit { - - /* - These are implemented manually rather than using WriteComplexFieldComponent. The reason - is because the view is readonly the tree of form controls is not being built automatically - and has to be built manually. - */ - ngOnInit(): void { - let orderSummaryGroup: FormGroup = this.registerControl(new FormGroup({})); - let paymentReference: FormControl = new FormControl(this.caseField.value.PaymentReference); - orderSummaryGroup.addControl('PaymentReference', paymentReference); - let paymentTotal: FormControl = new FormControl(this.caseField.value.PaymentTotal); - orderSummaryGroup.addControl('PaymentTotal', paymentTotal); - let feesArray: FormArray = new FormArray([]); - this.caseField.value.Fees.forEach((fee) => { - feesArray.push(this.getFeeValue(fee.value)); - }); - orderSummaryGroup.addControl('Fees', feesArray); - } - - private getFeeValue(feeValue): FormGroup { - let feeGroup = new FormGroup({}); - feeGroup.addControl('FeeCode', new FormControl(feeValue.FeeCode)); - feeGroup.addControl('FeeAmount', new FormControl(feeValue.FeeAmount)); - feeGroup.addControl('FeeDescription', new FormControl(feeValue.FeeDescription)); - feeGroup.addControl('FeeVersion', new FormControl(feeValue.FeeVersion)); - let feeValueGroup = new FormGroup({}); - feeValueGroup.addControl('value', feeGroup); - return feeValueGroup; - } - -} diff --git a/src/app/shared/palette/order-summary/write-order-summary-field.html b/src/app/shared/palette/order-summary/write-order-summary-field.html deleted file mode 100644 index 915562a21..000000000 --- a/src/app/shared/palette/order-summary/write-order-summary-field.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/app/shared/palette/palette.module.ts b/src/app/shared/palette/palette.module.ts deleted file mode 100644 index 6a048aa09..000000000 --- a/src/app/shared/palette/palette.module.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { CaseUIToolkitModule } from '@hmcts/ccd-case-ui-toolkit'; -import { ReadTextFieldComponent } from './text/read-text-field.component'; -import { PaletteService } from './palette.service'; -import { ReadNumberFieldComponent } from './number/read-number-field.component'; -import { ReadEmailFieldComponent } from './email/read-email-field.component'; -import { ReadPhoneUKFieldComponent } from './phone-uk/read-phone-uk-field.component'; -import { ReadDateFieldComponent } from './date/read-date-field.component'; -import { FixedListModule } from './fixed-list/fixed-list.module'; -import { YesNoModule } from './yes-no/yes-no.module'; -import { ComplexModule } from './complex/complex.module'; -import { AddressModule } from './address/address.module'; -import { BaseFieldModule } from './base-field/base-field.module'; -import { WriteTextFieldComponent } from './text/write-text-field.component'; -import { ReactiveFormsModule } from '@angular/forms'; -import { UnsupportedFieldComponent } from './unsupported-field.component'; -import { ReadCollectionFieldComponent } from './collection/read-collection-field.component'; -import { PaletteUtilsModule } from './utils/utils.module'; -import { WritePhoneUKFieldComponent } from './phone-uk/write-phone-uk-field.component'; -import { WriteEmailFieldComponent } from './email/write-email-field.component'; -import { WriteCollectionFieldComponent } from './collection/write-collection-field.component'; -import { WriteNumberFieldComponent } from './number/write-number-field.component'; -import { MoneyGbpModule } from './money-gbp/money-gbp.module'; -import { ReadTextAreaFieldComponent } from './text-area/read-text-area-field.component'; -import { WriteTextAreaFieldComponent } from './text-area/write-text-area-field.component'; -import { MultiSelectListModule } from './multi-select-list/multi-select-list.module'; -import { WriteDateFieldComponent } from './date/write-date-field.component'; -import { DocumentModule } from './document/document.module'; -import { MarkdownModule } from '../markdown/markdown.module'; -import { FormValidatorsService } from '../../core/form/form-validators.service'; -import { OrderSummaryModule } from './order-summary/order-summary.module'; -import { CasePaymentHistoryViewerModule } from './payment/case-payment-history-viewer.module'; -import { SharedUtilsModule } from '../utils/shared-utils.module'; - -@NgModule({ - imports: [ - CommonModule, - BaseFieldModule, - FixedListModule, - YesNoModule, - ComplexModule, - MultiSelectListModule, - MoneyGbpModule, - ReactiveFormsModule, - PaletteUtilsModule, - DocumentModule, - CaseUIToolkitModule, - AddressModule, - MarkdownModule, - OrderSummaryModule, - CasePaymentHistoryViewerModule, - SharedUtilsModule, - ], - declarations: [ - UnsupportedFieldComponent, - - // Read - ReadTextFieldComponent, - ReadTextAreaFieldComponent, - ReadNumberFieldComponent, - ReadEmailFieldComponent, - ReadPhoneUKFieldComponent, - ReadDateFieldComponent, - ReadCollectionFieldComponent, - - // Write - WriteCollectionFieldComponent, - WriteTextFieldComponent, - WriteTextAreaFieldComponent, - WritePhoneUKFieldComponent, - WriteNumberFieldComponent, - WriteEmailFieldComponent, - WriteDateFieldComponent, - ], - entryComponents: [ - UnsupportedFieldComponent, - - // Read - ReadTextFieldComponent, - ReadTextAreaFieldComponent, - ReadNumberFieldComponent, - ReadEmailFieldComponent, - ReadPhoneUKFieldComponent, - ReadDateFieldComponent, - ReadCollectionFieldComponent, - - // Write - WriteCollectionFieldComponent, - WriteTextFieldComponent, - WriteTextAreaFieldComponent, - WritePhoneUKFieldComponent, - WriteNumberFieldComponent, - WriteEmailFieldComponent, - WriteDateFieldComponent, - ], - exports: [ - BaseFieldModule, - PaletteUtilsModule, - ], - providers: [ - PaletteService, - FormValidatorsService, - ] -}) -export class PaletteModule {} diff --git a/src/app/shared/palette/palette.service.spec.ts b/src/app/shared/palette/palette.service.spec.ts deleted file mode 100644 index 2a23ce14e..000000000 --- a/src/app/shared/palette/palette.service.spec.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { PaletteService } from './palette.service'; -import { ReadTextFieldComponent } from './text/read-text-field.component'; -import { ReadComplexFieldComponent } from './complex/read-complex-field.component'; -import { ReadNumberFieldComponent } from './number/read-number-field.component'; -import { ReadYesNoFieldComponent } from './yes-no/read-yes-no-field.component'; -import { ReadEmailFieldComponent } from './email/read-email-field.component'; -import { ReadPhoneUKFieldComponent } from './phone-uk/read-phone-uk-field.component'; -import { ReadDateFieldComponent } from './date/read-date-field.component'; -import { ReadFixedListFieldComponent } from './fixed-list/read-fixed-list-field.component'; -import { ReadMoneyGbpFieldComponent } from './money-gbp/read-money-gbp-field.component'; -import { WriteTextFieldComponent } from './text/write-text-field.component'; -import { UnsupportedFieldComponent } from './unsupported-field.component'; -import { ReadCollectionFieldComponent } from './collection/read-collection-field.component'; -import { WriteComplexFieldComponent } from './complex/write-complex-field.component'; -import { WritePhoneUKFieldComponent } from './phone-uk/write-phone-uk-field.component'; -import { WriteYesNoFieldComponent } from './yes-no/write-yes-no-field.component'; -import { WriteEmailFieldComponent } from './email/write-email-field.component'; -import { WriteFixedListFieldComponent } from './fixed-list/write-fixed-list-field.component'; -import { WriteCollectionFieldComponent } from './collection/write-collection-field.component'; -import { WriteNumberFieldComponent } from './number/write-number-field.component'; -import { WriteMoneyGbpFieldComponent } from './money-gbp/write-money-gbp-field.component'; -import { ReadTextAreaFieldComponent } from './text-area/read-text-area-field.component'; -import { WriteTextAreaFieldComponent } from './text-area/write-text-area-field.component'; -import { ReadMultiSelectListFieldComponent } from './multi-select-list/read-multi-select-list-field.component'; -import { WriteMultiSelectListFieldComponent } from './multi-select-list/write-multi-select-list-field.component'; -import { WriteDateFieldComponent } from './date/write-date-field.component'; -import { ReadDocumentFieldComponent } from './document/read-document-field.component'; -import { WriteDocumentFieldComponent } from './document/write-document-field.component'; -import { CaseField } from '../domain/definition/case-field.model'; -import { WriteAddressFieldComponent } from './address/write-address-field.component'; -import { ReadOrderSummaryFieldComponent } from './order-summary/read-order-summary-field.component'; -import { WriteOrderSummaryFieldComponent } from './order-summary/write-order-summary-field.component'; -import { CasePaymentHistoryViewerFieldComponent } from './payment/case-payment-history-viewer-field.component'; - -describe('PaletteService', () => { - - let paletteService: PaletteService; - - let assertComponent = function (type, write, component, fieldTypeId) { - let caseField = new CaseField(); - caseField.field_type = { id: fieldTypeId, type: type }; - expect(paletteService.getFieldComponentClass(caseField, write)).toBe(component); - }; - - beforeEach(() => { - paletteService = new PaletteService(); - }); - - describe('getFieldComponentClass', () => { - - it('should get UnsupportedField component class for unknown input', () => { - assertComponent(null, false, UnsupportedFieldComponent, 'AnID'); - }); - - it('should get ReadTextField component class for Text input', () => { - assertComponent('Text', false, ReadTextFieldComponent, 'AnID'); - }); - - it('should get WriteTextField component class for Text input', () => { - assertComponent('Text', true, WriteTextFieldComponent, 'AnID'); - }); - - it('should get ReadTextField component class for Postcode input', () => { - assertComponent('Postcode', false, ReadTextFieldComponent, 'AnID'); - }); - - it('should get WriteTextField component class for Postcode input', () => { - assertComponent('Postcode', true, WriteTextFieldComponent, 'AnID'); - }); - - it('should get ReadComplexField component class for ComplexType input', () => { - assertComponent('Complex', false, ReadComplexFieldComponent, 'AnID'); - }); - - it('should get WriteComplexField component class for Complex input', () => { - assertComponent('Complex', true, WriteComplexFieldComponent, 'AnID'); - }); - - it('should get ReadNumberField component class for Number input', () => { - assertComponent('Number', false, ReadNumberFieldComponent, 'AnID'); - }); - - it('should get WriteNumberField component class for Number input', () => { - assertComponent('Number', true, WriteNumberFieldComponent, 'AnID'); - }); - - it('should get ReadYesNoField component class for YesOrNo input', () => { - assertComponent('YesOrNo', false, ReadYesNoFieldComponent, 'AnID'); - }); - - it('should get WriteYesNoField component class for Text input', () => { - assertComponent('YesOrNo', true, WriteYesNoFieldComponent, 'AnID'); - }); - - it('should get ReadEmailField component class for Email input', () => { - assertComponent('Email', false, ReadEmailFieldComponent, 'AnID'); - }); - - it('should get WriteEmailField component class for Email input', () => { - assertComponent('Email', true, WriteEmailFieldComponent, 'AnID'); - }); - - it('should get ReadPhoneUKField component class for Phone UK input', () => { - assertComponent('PhoneUK', false, ReadPhoneUKFieldComponent, 'AnID'); - }); - - it('should get WritePhoneUKField component class for Phone UK input', () => { - assertComponent('PhoneUK', true, WritePhoneUKFieldComponent, 'AnID'); - }); - - it('should get ReadDateField component class for Date input', () => { - assertComponent('Date', false, ReadDateFieldComponent, 'AnID'); - }); - - it('should get WriteDateField component class for Date input', () => { - assertComponent('Date', true, WriteDateFieldComponent, 'AnID'); - }); - - it('should get ReadDateTimeField component class for DateTime input', () => { - assertComponent('DateTime', false, ReadDateFieldComponent, 'AnID'); - }); - - it('should get WriteDateTimeField component class for DateTime input', () => { - assertComponent('DateTime', true, WriteDateFieldComponent, 'AnID'); - }); - - it('should get ReadFixedListField component class for FixedList input', () => { - assertComponent('FixedList', false, ReadFixedListFieldComponent, 'AnID'); - }); - - it('should get WriteFixedListField component class for FixedList input', () => { - assertComponent('FixedList', true, WriteFixedListFieldComponent, 'AnID'); - }); - - it('should get ReadMoneyGbpField component class for MoneyGBP input', () => { - assertComponent('MoneyGBP', false, ReadMoneyGbpFieldComponent, 'AnID'); - }); - - it('should get WriteMoneyGbpField component class for MoneyGBP input', () => { - assertComponent('MoneyGBP', true, WriteMoneyGbpFieldComponent, 'AnID'); - }); - - it('should get ReadCollectionField component class for Collection input', () => { - assertComponent('Collection', false, ReadCollectionFieldComponent, 'AnID'); - }); - - it('should get WriteCollectionField component class for Collection input', () => { - assertComponent('Collection', true, WriteCollectionFieldComponent, 'AnID'); - }); - - it('should get ReadTextAreaField component class for TextArea input', () => { - assertComponent('TextArea', false, ReadTextAreaFieldComponent, 'AnID'); - }); - - it('should get WriteTextAreaField component class for TextArea input', () => { - assertComponent('TextArea', true, WriteTextAreaFieldComponent, 'AnID'); - }); - - it('should get ReadMultiSelectListField component class for MultiSelectList input', () => { - assertComponent('MultiSelectList', false, ReadMultiSelectListFieldComponent, 'AnID'); - }); - - it('should get WriteMultiSelectListField component class for MultiSelectList input', () => { - assertComponent('MultiSelectList', true, WriteMultiSelectListFieldComponent, 'AnID'); - }); - - it('should get ReadDocumentField component class for Document input', () => { - assertComponent('Document', false, ReadDocumentFieldComponent, 'AnID'); - }); - - it('should get WriteDocumentField component class for Document input', () => { - assertComponent('Document', true, WriteDocumentFieldComponent, 'AnID'); - }); - - it('should get ReadComplexFieldComponent component class for Complex field with AddressUK complex type', () => { - assertComponent('Complex', false, ReadComplexFieldComponent, 'AddressUK'); - }); - - it('should get WriteAddressFieldComponent component class for Complex field with AddressUK complex type', () => { - assertComponent('Complex', true, WriteAddressFieldComponent, 'AddressUK'); - }); - - it('should get ReadComplexFieldComponent component class for Complex field with AddressGlobalUK complex type', () => { - assertComponent('Complex', false, ReadComplexFieldComponent, 'AddressGlobalUK'); - }); - - it('should get WriteAddressFieldComponent component class for Complex field with AddressGlobalUK complex type', () => { - assertComponent('Complex', true, WriteAddressFieldComponent, 'AddressGlobalUK'); - }); - - it('should get ReadOrderSummaryFieldComponent component class for Complex field with OrderSummary complex type', () => { - assertComponent('Complex', false, ReadOrderSummaryFieldComponent, 'OrderSummary'); - }); - - it('should get WriteOrderSummaryFieldComponent component class for Complex field with OrderSummary complex type', () => { - assertComponent('Complex', true, WriteOrderSummaryFieldComponent, 'OrderSummary'); - }); - - it('should get CasePaymentHistoryViewerFieldComponent component class for CasePaymentHistoryViewer regardless of read/write', () => { - assertComponent('CasePaymentHistoryViewer', true, CasePaymentHistoryViewerFieldComponent, 'AnID'); - assertComponent('CasePaymentHistoryViewer', false, CasePaymentHistoryViewerFieldComponent, 'AnID'); - }); - - }); -}); diff --git a/src/app/shared/palette/palette.service.ts b/src/app/shared/palette/palette.service.ts deleted file mode 100644 index 409ff5329..000000000 --- a/src/app/shared/palette/palette.service.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { Injectable, Type } from '@angular/core'; -import { ReadTextFieldComponent } from './text/read-text-field.component'; -import { ReadTextAreaFieldComponent } from './text-area/read-text-area-field.component'; -import { ReadComplexFieldComponent } from './complex/read-complex-field.component'; -import { ReadNumberFieldComponent } from './number/read-number-field.component'; -import { ReadYesNoFieldComponent } from './yes-no/read-yes-no-field.component'; -import { ReadEmailFieldComponent } from './email/read-email-field.component'; -import { ReadPhoneUKFieldComponent } from './phone-uk/read-phone-uk-field.component'; -import { ReadDateFieldComponent } from './date/read-date-field.component'; -import { ReadFixedListFieldComponent } from './fixed-list/read-fixed-list-field.component'; -import { ReadMoneyGbpFieldComponent } from './money-gbp/read-money-gbp-field.component'; -import { WriteTextFieldComponent } from './text/write-text-field.component'; -import { UnsupportedFieldComponent } from './unsupported-field.component'; -import { ReadCollectionFieldComponent } from './collection/read-collection-field.component'; -import { WriteComplexFieldComponent } from './complex/write-complex-field.component'; -import { WritePhoneUKFieldComponent } from './phone-uk/write-phone-uk-field.component'; -import { WriteNumberFieldComponent } from './number/write-number-field.component'; -import { WriteYesNoFieldComponent } from './yes-no/write-yes-no-field.component'; -import { WriteEmailFieldComponent } from './email/write-email-field.component'; -import { WriteCollectionFieldComponent } from './collection/write-collection-field.component'; -import { WriteFixedListFieldComponent } from './fixed-list/write-fixed-list-field.component'; -import { WriteMoneyGbpFieldComponent } from './money-gbp/write-money-gbp-field.component'; -import { WriteTextAreaFieldComponent } from './text-area/write-text-area-field.component'; -import { ReadMultiSelectListFieldComponent } from './multi-select-list/read-multi-select-list-field.component'; -import { WriteMultiSelectListFieldComponent } from './multi-select-list/write-multi-select-list-field.component'; -import { WriteDateFieldComponent } from './date/write-date-field.component'; -import { ReadDocumentFieldComponent } from './document/read-document-field.component'; -import { WriteDocumentFieldComponent } from './document/write-document-field.component'; -import { LabelFieldComponent } from './label/label-field.component'; -import { WriteAddressFieldComponent } from './address/write-address-field.component'; -import { CaseField } from '../domain/definition/case-field.model'; -import { WriteOrderSummaryFieldComponent } from './order-summary/write-order-summary-field.component'; -import { ReadOrderSummaryFieldComponent } from './order-summary/read-order-summary-field.component'; -import { CasePaymentHistoryViewerFieldComponent } from './payment/case-payment-history-viewer-field.component'; - -@Injectable() -export class PaletteService { - - getFieldComponentClass(caseField: CaseField, write: boolean): Type<{}> { - switch (caseField.field_type.type) { - case 'Text': - case 'Postcode': - return write ? WriteTextFieldComponent : ReadTextFieldComponent; - case 'TextArea': - return write ? WriteTextAreaFieldComponent : ReadTextAreaFieldComponent; - case 'Number': - return write ? WriteNumberFieldComponent : ReadNumberFieldComponent; - case 'YesOrNo': - return write ? WriteYesNoFieldComponent : ReadYesNoFieldComponent; - case 'Email': - return write ? WriteEmailFieldComponent : ReadEmailFieldComponent; - case 'PhoneUK': - return write ? WritePhoneUKFieldComponent : ReadPhoneUKFieldComponent; - case 'Date': - case 'DateTime': - return write ? WriteDateFieldComponent : ReadDateFieldComponent; - case 'MoneyGBP': - return write ? WriteMoneyGbpFieldComponent : ReadMoneyGbpFieldComponent; - case 'FixedList': - return write ? WriteFixedListFieldComponent : ReadFixedListFieldComponent; - case 'Complex': - switch (caseField.field_type.id) { - case 'AddressGlobalUK': - case 'AddressUK': - return write ? WriteAddressFieldComponent : ReadComplexFieldComponent; - case 'OrderSummary': - return write ? WriteOrderSummaryFieldComponent : ReadOrderSummaryFieldComponent; - default: - return write ? WriteComplexFieldComponent : ReadComplexFieldComponent; - } - case 'Collection': - return write ? WriteCollectionFieldComponent : ReadCollectionFieldComponent; - case 'MultiSelectList': - return write ? WriteMultiSelectListFieldComponent : ReadMultiSelectListFieldComponent; - case 'Document': - return write ? WriteDocumentFieldComponent : ReadDocumentFieldComponent; - case 'Label': - return LabelFieldComponent; - case 'CasePaymentHistoryViewer': - return CasePaymentHistoryViewerFieldComponent; - default: - return UnsupportedFieldComponent; - } - } -} diff --git a/src/app/shared/palette/payment/case-payment-history-viewer-field.component.spec.ts b/src/app/shared/palette/payment/case-payment-history-viewer-field.component.spec.ts deleted file mode 100644 index e314f16ed..000000000 --- a/src/app/shared/palette/payment/case-payment-history-viewer-field.component.spec.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { CasePaymentHistoryViewerFieldComponent } from './case-payment-history-viewer-field.component'; -import { AppConfig } from '../../../app.config'; -import { MockComponent } from 'ng2-mock-component'; -import { By } from '@angular/platform-browser'; -import createSpyObj = jasmine.createSpyObj; - -describe('CasePaymentHistoryViewerFieldComponent', () => { - - const FIELD_TYPE: FieldType = { - id: 'CasePaymentHistoryViewer', - type: 'CasePaymentHistoryViewer' - }; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - }; - const CASE_REFERENCE = '1234123412341234'; - const PAYMENTS_URL = 'http://payment-api:123'; - - let appConfig; - let PaymentWebComponent; - - let fixture: ComponentFixture; - let component: CasePaymentHistoryViewerFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - appConfig = createSpyObj('AppConfig', ['getPaymentsUrl']); - appConfig.getPaymentsUrl.and.returnValue(PAYMENTS_URL); - - PaymentWebComponent = MockComponent({ selector: 'ccpay-payment-lib', inputs: [ - 'API_ROOT', - 'CCD_CASE_NUMBER' - ]}); - - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - CasePaymentHistoryViewerFieldComponent, - - // Mocks - PaymentWebComponent - ], - providers: [ - { provide: AppConfig, useValue: appConfig }, - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(CasePaymentHistoryViewerFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - component.caseReference = CASE_REFERENCE; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should render Payments web component', () => { - let paymentDe = de.query(By.directive(PaymentWebComponent)); - - expect(paymentDe).toBeDefined(); - - let paymentComponent = paymentDe.componentInstance; - expect(paymentComponent.API_ROOT).toEqual(PAYMENTS_URL); - expect(paymentComponent.CCD_CASE_NUMBER).toEqual(CASE_REFERENCE); - }); -}); diff --git a/src/app/shared/palette/payment/case-payment-history-viewer-field.component.ts b/src/app/shared/palette/payment/case-payment-history-viewer-field.component.ts deleted file mode 100644 index 4bd78cffb..000000000 --- a/src/app/shared/palette/payment/case-payment-history-viewer-field.component.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; -import { Component } from '@angular/core'; -import { AppConfig } from '../../../app.config'; - -@Component({ - selector: 'ccd-case-payment-history-viewer-field', - templateUrl: 'case-payment-history-viewer-field.html', -}) -export class CasePaymentHistoryViewerFieldComponent extends AbstractFieldReadComponent { - - constructor( - private appConfig: AppConfig - ) { - super(); - } - - getBaseURL() { - return this.appConfig.getPaymentsUrl(); - } - -} diff --git a/src/app/shared/palette/payment/case-payment-history-viewer-field.html b/src/app/shared/palette/payment/case-payment-history-viewer-field.html deleted file mode 100644 index 96af80f85..000000000 --- a/src/app/shared/palette/payment/case-payment-history-viewer-field.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/app/shared/palette/payment/case-payment-history-viewer.module.ts b/src/app/shared/palette/payment/case-payment-history-viewer.module.ts deleted file mode 100644 index 0aad31b2f..000000000 --- a/src/app/shared/palette/payment/case-payment-history-viewer.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CasePaymentHistoryViewerFieldComponent } from './case-payment-history-viewer-field.component'; -import { CommonModule } from '@angular/common'; -import { ReactiveFormsModule } from '@angular/forms'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { CaseUIToolkitModule } from '@hmcts/ccd-case-ui-toolkit'; -import { PaymentLibModule } from '@hmcts/ccpay-web-component'; - -@NgModule({ - imports: [ - CommonModule, - ReactiveFormsModule, - PaletteUtilsModule, - CaseUIToolkitModule, - PaymentLibModule, - ], - declarations: [ - CasePaymentHistoryViewerFieldComponent - ], - entryComponents: [ - CasePaymentHistoryViewerFieldComponent, - ] -}) -export class CasePaymentHistoryViewerModule {} diff --git a/src/app/shared/palette/phone-uk/read-phone-uk-field.component.spec.ts b/src/app/shared/palette/phone-uk/read-phone-uk-field.component.spec.ts deleted file mode 100644 index 4ef561143..000000000 --- a/src/app/shared/palette/phone-uk/read-phone-uk-field.component.spec.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReadPhoneUKFieldComponent } from './read-phone-uk-field.component'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; - -describe('ReadPhoneUKFieldComponent', () => { - - const FIELD_TYPE: FieldType = { - id: 'PhoneUK', - type: 'PhoneUK' - }; - const VALUE = '07123456789'; - const EMPTY = '-'; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE - }; - - let fixture: ComponentFixture; - let component: ReadPhoneUKFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - ReadPhoneUKFieldComponent - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadPhoneUKFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render provided phone number as string', () => { - component.caseField.value = VALUE; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(VALUE); - }); - - it('render undefined value as hyphen string', () => { - component.caseField.value = undefined; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - - it('render null value as hyphen string', () => { - component.caseField.value = null; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); -}); diff --git a/src/app/shared/palette/phone-uk/read-phone-uk-field.component.ts b/src/app/shared/palette/phone-uk/read-phone-uk-field.component.ts deleted file mode 100644 index 4ee0606ad..000000000 --- a/src/app/shared/palette/phone-uk/read-phone-uk-field.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; -import { Component } from '@angular/core'; - -@Component({ - selector: 'ccd-read-phone-uk-field', - template: `{{ getCaseFieldValue() }}` -}) -export class ReadPhoneUKFieldComponent extends AbstractFieldReadComponent { - - getCaseFieldValue(): string { - return this.caseField.value ? this.caseField.value : '-'; - } - - isFieldValueEmpty(): boolean { - return (!this.caseField.value); - } - -} diff --git a/src/app/shared/palette/phone-uk/write-phone-uk-field.component.spec.ts b/src/app/shared/palette/phone-uk/write-phone-uk-field.component.spec.ts deleted file mode 100644 index 57b13b0c0..000000000 --- a/src/app/shared/palette/phone-uk/write-phone-uk-field.component.spec.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { DebugElement } from '@angular/core'; -import { MockComponent } from 'ng2-mock-component'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { By } from '@angular/platform-browser'; -import { WritePhoneUKFieldComponent } from './write-phone-uk-field.component'; - -const FIELD_ID = 'PersonPhoneNumber'; -const FIELD_TYPE: FieldType = { - id: 'PhoneUK', - type: 'PhoneUK' -}; -const VALUE = '07123456789'; -const CASE_FIELD: CaseField = { - id: FIELD_ID, - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE -}; - -const FORM_GROUP: FormGroup = new FormGroup({}); -const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(FIELD_ID, control); - return control; -}; - -describe('WritePhoneUKFieldComponent', () => { - - const $INPUT = By.css('.form-group input'); - - // Input is mocked so that one-way bound inputs can be tested - let Input: any = MockComponent({ selector: 'input', inputs: [ - 'type', - 'formControl' - ]}); - - let fixture: ComponentFixture; - let component: WritePhoneUKFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - PaletteUtilsModule - ], - declarations: [ - WritePhoneUKFieldComponent, - - // Mock - Input, - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WritePhoneUKFieldComponent); - component = fixture.componentInstance; - - component.registerControl = REGISTER_CONTROL; - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should add a formControl linked to the field ID to the formGroup', () => { - expect(FORM_GROUP.controls[FIELD_ID]).toBeTruthy(); - }); - - it('should initialise formControl with provided value', () => { - expect(FORM_GROUP.controls[FIELD_ID].value).toBe(VALUE); - }); - - it('should render text input element linked to formControl', () => { - let input = de.query($INPUT); - - expect(input.nativeElement.getAttribute('type')).toBe('tel'); - expect(input.componentInstance.formControl).toEqual(component.phoneUkControl); - }); -}); diff --git a/src/app/shared/palette/phone-uk/write-phone-uk-field.component.ts b/src/app/shared/palette/phone-uk/write-phone-uk-field.component.ts deleted file mode 100644 index 8e47195f5..000000000 --- a/src/app/shared/palette/phone-uk/write-phone-uk-field.component.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; -import { FormControl } from '@angular/forms'; - -@Component({ - selector: 'ccd-write-phone-uk-field', - templateUrl: './write-phone-uk-field.html' -}) -export class WritePhoneUKFieldComponent extends AbstractFieldWriteComponent implements OnInit { - - phoneUkControl: FormControl; - - ngOnInit() { - this.phoneUkControl = this.registerControl(new FormControl(this.caseField.value)); - } - -} diff --git a/src/app/shared/palette/phone-uk/write-phone-uk-field.html b/src/app/shared/palette/phone-uk/write-phone-uk-field.html deleted file mode 100644 index 544fa471a..000000000 --- a/src/app/shared/palette/phone-uk/write-phone-uk-field.html +++ /dev/null @@ -1,10 +0,0 @@ -
- - - - -
diff --git a/src/app/shared/palette/text-area/read-text-area-field.component.spec.ts b/src/app/shared/palette/text-area/read-text-area-field.component.spec.ts deleted file mode 100644 index 71309b020..000000000 --- a/src/app/shared/palette/text-area/read-text-area-field.component.spec.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReadTextAreaFieldComponent } from './read-text-area-field.component'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { By } from '@angular/platform-browser'; -import { text } from '../../../test/helpers'; - -describe('ReadTextAreaFieldComponent', () => { - - const $SPAN = By.css('span'); - - const FIELD_TYPE: FieldType = { - id: 'Text', - type: 'Text' - }; - const VALUE = 'Hello world'; - const EMPTY = '-'; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE - }; - - let fixture: ComponentFixture; - let component: ReadTextAreaFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - ReadTextAreaFieldComponent - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadTextAreaFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render provided value as text', () => { - component.caseField.value = VALUE; - fixture.detectChanges(); - - let span = de.query($SPAN); - - expect(text(span)).toEqual(VALUE.toString()); - }); - - it('render undefined value as hyphen string', () => { - component.caseField.value = undefined; - fixture.detectChanges(); - - let span = de.query($SPAN); - - expect(text(span)).toEqual(EMPTY); - }); - - it('render null value as hyphen string', () => { - component.caseField.value = null; - fixture.detectChanges(); - - let span = de.query($SPAN); - - expect(text(span)).toEqual(EMPTY); - }); - - it('render text using `pre-wrap` styling to render line breaks', () => { - component.caseField.value = 'line1\nLine2'; - fixture.detectChanges(); - - let span = de.query($SPAN); - - let whiteSpace = window.getComputedStyle(span.nativeElement, null).getPropertyValue('white-space'); - expect(whiteSpace).toEqual('pre-wrap'); - }); -}); diff --git a/src/app/shared/palette/text-area/read-text-area-field.component.ts b/src/app/shared/palette/text-area/read-text-area-field.component.ts deleted file mode 100644 index ea8186c75..000000000 --- a/src/app/shared/palette/text-area/read-text-area-field.component.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component } from '@angular/core'; -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; - -@Component({ - template: `{{getCaseFieldValue()}}` -}) -export class ReadTextAreaFieldComponent extends AbstractFieldReadComponent { - - getCaseFieldValue(): string { - return this.caseField.value ? this.caseField.value : '-'; - } - - isFieldValueEmpty(): boolean { - return (!this.caseField.value); - } - -} diff --git a/src/app/shared/palette/text-area/write-text-area-field.component.spec.ts b/src/app/shared/palette/text-area/write-text-area-field.component.spec.ts deleted file mode 100644 index f4f608de8..000000000 --- a/src/app/shared/palette/text-area/write-text-area-field.component.spec.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { WriteTextAreaFieldComponent } from './write-text-area-field.component'; -import { DebugElement } from '@angular/core'; -import { MockComponent } from 'ng2-mock-component'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { By } from '@angular/platform-browser'; - -const FIELD_ID = 'PersonFirstName'; -const FIELD_TYPE: FieldType = { - id: 'TextArea', - type: 'TextArea' -}; -const VALUE = 'Hello world'; -const CASE_FIELD: CaseField = { - id: FIELD_ID, - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE -}; - -const FORM_GROUP: FormGroup = new FormGroup({}); -const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(FIELD_ID, control); - return control; -}; - -describe('WriteTextAreaFieldComponent', () => { - - const $INPUT = By.css('.form-group textarea'); - - // Textarea input is mocked so that one-way bound inputs can be tested - let Textarea: any = MockComponent({ selector: 'textarea', inputs: [ - 'formControl' - ]}); - - let fixture: ComponentFixture; - let component: WriteTextAreaFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - PaletteUtilsModule - ], - declarations: [ - WriteTextAreaFieldComponent, - - // Mock - Textarea, - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteTextAreaFieldComponent); - component = fixture.componentInstance; - - component.registerControl = REGISTER_CONTROL; - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should add a formControl linked to the field ID to the formGroup', () => { - expect(FORM_GROUP.controls[FIELD_ID]).toBeTruthy(); - }); - - it('should initialise formControl with provided value', () => { - expect(FORM_GROUP.controls[FIELD_ID].value).toBe(VALUE); - }); - - it('should render text input element linked to formControl', () => { - let input = de.query($INPUT); - - expect(input.componentInstance.formControl).toEqual(component.textareaControl); - }); -}); diff --git a/src/app/shared/palette/text-area/write-text-area-field.component.ts b/src/app/shared/palette/text-area/write-text-area-field.component.ts deleted file mode 100644 index 85f530725..000000000 --- a/src/app/shared/palette/text-area/write-text-area-field.component.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { FormControl } from '@angular/forms'; -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; - -@Component({ - selector: 'ccd-write-text-area-field', - templateUrl: './write-text-area-field.html' -}) -export class WriteTextAreaFieldComponent extends AbstractFieldWriteComponent implements OnInit { - - textareaControl: FormControl; - - ngOnInit() { - this.textareaControl = this.registerControl(new FormControl(this.caseField.value)); - } -} diff --git a/src/app/shared/palette/text-area/write-text-area-field.html b/src/app/shared/palette/text-area/write-text-area-field.html deleted file mode 100644 index 023d761da..000000000 --- a/src/app/shared/palette/text-area/write-text-area-field.html +++ /dev/null @@ -1,11 +0,0 @@ -
- - - - - -
diff --git a/src/app/shared/palette/text/read-text-field.component.spec.ts b/src/app/shared/palette/text/read-text-field.component.spec.ts deleted file mode 100644 index f55a45b19..000000000 --- a/src/app/shared/palette/text/read-text-field.component.spec.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReadTextFieldComponent } from './read-text-field.component'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; - -describe('ReadTextFieldComponent', () => { - - const FIELD_TYPE: FieldType = { - id: 'Text', - type: 'Text' - }; - const VALUE = 'Hello world'; - const EMPTY = '-'; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - field_type: FIELD_TYPE, - value: VALUE, - display_context: 'READONLY' - }; - - let fixture: ComponentFixture; - let component: ReadTextFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - ReadTextFieldComponent - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadTextFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('render provided value as text', () => { - component.caseField.value = VALUE; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(VALUE.toString()); - }); - - it('render undefined value as hyphen string', () => { - component.caseField.value = undefined; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); - - it('render null value as hyphen string', () => { - component.caseField.value = null; - fixture.detectChanges(); - - expect(de.nativeElement.textContent).toEqual(EMPTY); - }); -}); diff --git a/src/app/shared/palette/text/read-text-field.component.ts b/src/app/shared/palette/text/read-text-field.component.ts deleted file mode 100644 index 2bf555623..000000000 --- a/src/app/shared/palette/text/read-text-field.component.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Component } from '@angular/core'; -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; - -@Component({ - template: `{{ getCaseFieldValue() }}` -}) -export class ReadTextFieldComponent extends AbstractFieldReadComponent { - - getCaseFieldValue(): string { - return this.caseField.value ? this.caseField.value : '-'; - } - - isFieldValueEmpty(): boolean { - return (!this.caseField.value); - } - -} diff --git a/src/app/shared/palette/text/write-text-field.component.spec.ts b/src/app/shared/palette/text/write-text-field.component.spec.ts deleted file mode 100644 index 7e07aefb0..000000000 --- a/src/app/shared/palette/text/write-text-field.component.spec.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { WriteTextFieldComponent } from './write-text-field.component'; -import { DebugElement } from '@angular/core'; -import { MockComponent } from 'ng2-mock-component'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { By } from '@angular/platform-browser'; - -const FIELD_ID = 'PersonFirstName'; -const FIELD_TYPE: FieldType = { - id: 'Text', - type: 'Text' -}; -const VALUE = 'Hello world'; -const CASE_FIELD: CaseField = { - id: FIELD_ID, - label: 'X', - field_type: FIELD_TYPE, - value: VALUE, - display_context: 'OPTIONAL' -}; - -const FORM_GROUP: FormGroup = new FormGroup({}); -const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(FIELD_ID, control); - return control; -}; - -describe('WriteTextFieldComponent', () => { - - const $INPUT = By.css('.form-group input'); - - // Input is mocked so that one-way bound inputs can be tested - let Input: any = MockComponent({ selector: 'input', inputs: [ - 'type', - 'formControl' - ]}); - - let fixture: ComponentFixture; - let component: WriteTextFieldComponent; - let de: DebugElement; - - beforeEach(async(() => { - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - PaletteUtilsModule - ], - declarations: [ - WriteTextFieldComponent, - - // Mock - Input, - ], - providers: [] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteTextFieldComponent); - component = fixture.componentInstance; - - component.registerControl = REGISTER_CONTROL; - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should add a formControl linked to the field ID to the formGroup', () => { - expect(FORM_GROUP.controls[FIELD_ID]).toBeTruthy(); - }); - - it('should initialise formControl with provided value', () => { - expect(FORM_GROUP.controls[FIELD_ID].value).toBe(VALUE); - }); - - it('should render text input element linked to formControl', () => { - let input = de.query($INPUT); - - expect(input.nativeElement.getAttribute('type')).toBe('text'); - expect(input.componentInstance.formControl).toEqual(component.textControl); - }); -}); diff --git a/src/app/shared/palette/text/write-text-field.component.ts b/src/app/shared/palette/text/write-text-field.component.ts deleted file mode 100644 index 4d8a810b2..000000000 --- a/src/app/shared/palette/text/write-text-field.component.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { FormControl } from '@angular/forms'; -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; - -@Component({ - selector: 'ccd-write-text-field', - templateUrl: './write-text-field.html' -}) -export class WriteTextFieldComponent extends AbstractFieldWriteComponent implements OnInit { - - textControl: FormControl; - - ngOnInit() { - this.textControl = this.registerControl(new FormControl(this.caseField.value)); - } -} diff --git a/src/app/shared/palette/text/write-text-field.html b/src/app/shared/palette/text/write-text-field.html deleted file mode 100644 index c9115a668..000000000 --- a/src/app/shared/palette/text/write-text-field.html +++ /dev/null @@ -1,10 +0,0 @@ -
- - - - -
diff --git a/src/app/shared/palette/unsupported-field.component.ts b/src/app/shared/palette/unsupported-field.component.ts deleted file mode 100644 index f0f3de0ab..000000000 --- a/src/app/shared/palette/unsupported-field.component.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - template: `Field type not supported` -}) -export class UnsupportedFieldComponent {} diff --git a/src/app/shared/palette/utils/dash.pipe.spec.ts b/src/app/shared/palette/utils/dash.pipe.spec.ts deleted file mode 100644 index 4252a5ffe..000000000 --- a/src/app/shared/palette/utils/dash.pipe.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { DashPipe } from './dash.pipe'; - -describe('DashPipe', () => { - - let dashPipe: DashPipe; - - beforeEach(() => { - dashPipe = new DashPipe(); - }); - - it('should produce dash if empty field', () => { - expect(dashPipe.transform('')).toBe('-'); - }); - - it('should produce dash if null field', () => { - expect(dashPipe.transform(null)).toBe('-'); - }); - - it('should produce dash if undefined field', () => { - expect(dashPipe.transform(undefined)).toBe('-'); - }); - - it('should return original value if defined', () => { - expect(dashPipe.transform('value')).toBe('value'); - }); - -}); diff --git a/src/app/shared/palette/utils/dash.pipe.ts b/src/app/shared/palette/utils/dash.pipe.ts deleted file mode 100644 index d0e1306e8..000000000 --- a/src/app/shared/palette/utils/dash.pipe.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'ccdDash' -}) -export class DashPipe implements PipeTransform { - - transform(value: string): string { - return value ? value : '-'; - } -} diff --git a/src/app/shared/palette/utils/date.pipe.spec.ts b/src/app/shared/palette/utils/date.pipe.spec.ts deleted file mode 100644 index 2b6c54f4e..000000000 --- a/src/app/shared/palette/utils/date.pipe.spec.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { DatePipe } from './date.pipe'; - -describe('DatePipe', () => { - - let datePipe: DatePipe; - const EXPECTED_OFFSET = - new Date().getTimezoneOffset() / 60; - - beforeEach(() => { - datePipe = new DatePipe(); - }); - - it('should render correct date if UTC date in yyyy-mm-dd format', () => { - let message = datePipe.transform('2017-07-26', null, null); - - expect(message).toBe('26 Jul 2017'); - }); - - it('should render correct date if UTC date in yyyy-mm-ddZ format', () => { - let message = datePipe.transform('2017-07-26Z', null, null); - - expect(message).toBe('26 Jul 2017'); - }); - - it('should render correct date if UTC date in yyyy-mm-dd format and format is short', () => { - let message = datePipe.transform('2017-07-26', null, 'short'); - - expect(message).toBe('26 Jul 2017'); - }); - - it('should render yyyy-mm-dd only if UTC date in incomplete yyyy-mm-ddThh:mm:ss format with hh only', () => { - let message = datePipe.transform('2017-07-26T12', null, null); - - expect(message).toBe('26 Jul 2017'); - }); - - it('should render yyyy-mm-dd only if UTC date in incomplete yyyy-mm-ddThh:mm:ss format with hh and mm only', () => { - let message = datePipe.transform('2017-07-26T12:23', null, null); - - expect(message).toBe('26 Jul 2017'); - }); - - it('should render correct date if UTC date in yyyy-mm-ddThh:mm:ss AM format', () => { - let message = datePipe.transform('2017-07-26T09:09:05', 'local', null); - - expect(message).toBe('26 Jul 2017, ' + getExpectedHour(9) + ':09:05 AM'); - }); - - it('should render correct date if UTC date in yyyy-mm-ddThh:mm:ss noon format', () => { - let message = datePipe.transform('2017-07-26T12:09:05', 'local', null); - - expect(message).toBe('26 Jul 2017, ' + getExpectedHour(12) + ':09:05 PM'); - }); - - it('should render correct date if UTC date in yyyy-mm-ddThh:mm:ss PM format', () => { - let message = datePipe.transform('2017-07-26T20:10:05', 'local', null); - - expect(message).toBe('26 Jul 2017, ' + getExpectedHour(8) + ':10:05 PM'); - }); - - it('should render correct date if UTC date in yyyy-mm-ddThh:mm:ss midnight format', () => { - let message = datePipe.transform('2017-07-26T00:10:05', 'local', null); - - expect(message).toBe('26 Jul 2017, ' + getExpectedHour(12) + ':10:05 AM'); - }); - - it('should render correct date if UTC date in yyyy-mm-ddThh:mm:ss+hh:mm AM format', () => { - let message = datePipe.transform('2017-07-26T09:09:05+00:00', 'local', null); - - expect(message).toBe('26 Jul 2017, ' + getExpectedHour(9) + ':09:05 AM'); - }); - - it('should render correct date if UTC date in yyyy-mm-ddThh:mm:ss+hh:mm PM format', () => { - let message = datePipe.transform('2017-07-26T20:10:05+00:00', 'local', null); - - expect(message).toBe('26 Jul 2017, ' + getExpectedHour(8) + ':10:05 PM'); - }); - - it('should render correct date if UTC date in yyyy-mm-ddThh:mm:ssZ AM format', () => { - let message = datePipe.transform('2017-07-26T09:09:05Z', 'local', null); - - expect(message).toBe('26 Jul 2017, ' + getExpectedHour(9) + ':09:05 AM'); - }); - - it('should render correct date if UTC date in yyyy-mm-ddThh:mm:ssZ format', () => { - let message = datePipe.transform('2017-07-26T20:10:05Z', 'local', null); - - expect(message).toBe('26 Jul 2017, ' + getExpectedHour(8) + ':10:05 PM'); - }); - - it('should render correct date if short format specified for UTC date with time', () => { - let message = datePipe.transform('2017-07-26T20:10:05Z', 'utc', 'short'); - - expect(message).toBe('26 Jul 2017'); - }); - - it('should render correct date for local zone with time', () => { - let message = datePipe.transform('2017-07-26T20:10:05Z', 'local', null); - - expect(message).toBe('26 Jul 2017, ' + getExpectedHour(8) + ':10:05 PM'); - }); - - it('should render correct date if short format specified for UTC date without time', () => { - let message = datePipe.transform('2017-07-26Z', null, 'short'); - - expect(message).toBe('26 Jul 2017'); - }); - - function getExpectedHour(hour): number { - let expectedHour = hour + EXPECTED_OFFSET; - if (expectedHour > 12) { - expectedHour = expectedHour - 12; - } else if (expectedHour === 0) { - expectedHour = 12; - } - return expectedHour; - } -}); diff --git a/src/app/shared/palette/utils/date.pipe.ts b/src/app/shared/palette/utils/date.pipe.ts deleted file mode 100644 index a70488ba6..000000000 --- a/src/app/shared/palette/utils/date.pipe.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: 'ccdDate' -}) -export class DatePipe implements PipeTransform { - - private static readonly DATE_FORMAT = - /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?|Z)?$/; -// 1 2 3 4 5 6 7 8 9 10 11 - private static readonly MONTHS = [ - ['Jan'], ['Feb'], ['Mar'], ['Apr'], ['May'], ['Jun'], ['Jul'], ['Aug'], ['Sep'], ['Oct'], ['Nov'], ['Dec'], - ]; - - transform(value: string, zone: string, format: string): string { - let resultDate = null; - let offsetDate = null; - - if (value) { - let match: RegExpMatchArray = value.match(DatePipe.DATE_FORMAT); - if (zone === 'local') { - let date = this.getDate(match); - offsetDate = this.getOffsetDate(date); - } else { - offsetDate = this.getDate(match); - } - // RDM-1149 changed the pipe logic so that it doesn't add an hour to 'Summer Time' dates on DateTime field type - - resultDate = `${offsetDate.getDate()} ${DatePipe.MONTHS[offsetDate.getMonth()]} ${offsetDate.getFullYear()}`; - if (match[4] && match[5] && match[6] && format !== 'short') { - resultDate += ', '; - resultDate += this.getHour(offsetDate.getHours().toString()) + ':'; - resultDate += this.pad(offsetDate.getMinutes()) + ':'; - resultDate += this.pad(offsetDate.getSeconds()) + ' '; - resultDate += (this.toInt(offsetDate.getHours().toString()) >= 12) ? 'PM' : 'AM' ; - } - } - return resultDate; - } - - private getOffsetDate(date: Date): Date { - let localOffset = - date.getTimezoneOffset() / 60; - return new Date(date.getTime() + localOffset * 3600 * 1000); - } - - private getDate(match: RegExpMatchArray): Date { - let year = this.toInt(match[1]); - let month = this.toInt(match[2]) - 1; - let day = this.toInt(match[3]); - let resultDate; - if (match[4] && match[5] && match[6]) { - let hour = this.toInt(match[4]); - let minutes = this.toInt(match[5]); - let seconds = this.toInt(match[6]); - resultDate = new Date(year, month, day, hour, minutes, seconds, 0); - } else { - resultDate = new Date(year, month, day); - } - return resultDate; - } - - private getHour(hourStr: string): number { - let hourNum = this.toInt(hourStr); - if (hourNum > 12) { - hourNum = hourNum - 12; - } else if (hourNum === 0) { - hourNum = 12; - } - return hourNum; - } - - private toInt(str: string): number { - return parseInt(str, 10); - } - - private pad(num: any, padNum = 2): string { - const val = num !== undefined ? num.toString() : ''; - return val.length >= padNum ? val : new Array(padNum - val.length + 1).join('0') + val; - } -} diff --git a/src/app/shared/palette/utils/field-label.pipe.spec.ts b/src/app/shared/palette/utils/field-label.pipe.spec.ts deleted file mode 100644 index 16b846a6b..000000000 --- a/src/app/shared/palette/utils/field-label.pipe.spec.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { FieldLabelPipe } from './field-label.pipe'; -import { CaseField } from '../../domain/definition/case-field.model'; - -describe('FieldLabelPipe', () => { - - let fieldLabelPipe: FieldLabelPipe = new FieldLabelPipe(); - - it('should return empty string for null values', () => { - expect(fieldLabelPipe.transform(null)) - .toBe(''); - }); - - it('should return empty string for undefined label', () => { - expect(fieldLabelPipe.transform({} as CaseField)) - .toBe(''); - }); - - it('should return label for undefined display_context', () => { - expect(fieldLabelPipe.transform({ label: 'label'} as CaseField)) - .toBe('label'); - }); - - it('should add OPTIONAL label if display_context field is OPTIONAL', () => { - expect(fieldLabelPipe.transform({ label: 'label', display_context: 'OPTIONAL' } as CaseField)) - .toBe('label (Optional)'); - }); - - it('should return label if display_context field is NOT OPTIONAL', () => { - expect(fieldLabelPipe.transform({ label: 'label', display_context: 'ANYTHING ELSE' } as CaseField)) - .toBe('label'); - }); -}); diff --git a/src/app/shared/palette/utils/field-label.pipe.ts b/src/app/shared/palette/utils/field-label.pipe.ts deleted file mode 100644 index 5b805763a..000000000 --- a/src/app/shared/palette/utils/field-label.pipe.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import { CaseField } from '../../domain/definition/case-field.model'; - -@Pipe({ - name: 'ccdFieldLabel' -}) -export class FieldLabelPipe implements PipeTransform { - - transform (field: CaseField): string { - if (!field || !field.label) { - return ''; - } else if (!field.display_context) { - return field.label; - } - return field.label + (field.display_context.toUpperCase() === 'OPTIONAL' ? ' (Optional)' : ''); - } -} diff --git a/src/app/shared/palette/utils/first-error.pipe.spec.ts b/src/app/shared/palette/utils/first-error.pipe.spec.ts deleted file mode 100644 index a5c49c5be..000000000 --- a/src/app/shared/palette/utils/first-error.pipe.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { FirstErrorPipe } from './first-error.pipe'; - -describe('FirstErrorPipe', () => { - - const ERROR_MESSAGE = 'This is wrong'; - - let firstError: FirstErrorPipe; - - beforeEach(() => { - firstError = new FirstErrorPipe(); - }); - - it('should return empty string when null errors', () => { - let message = firstError.transform(null); - - expect(message).toBe(''); - }); - - it('should return empty string when empty errors', () => { - let message = firstError.transform({}); - - expect(message).toBe(''); - }); - - it('should return only error when 1 error', () => { - let message = firstError.transform({ - 'errorkey': ERROR_MESSAGE - }); - - expect(message).toBe(ERROR_MESSAGE); - }); - - it('should return only first error when multiple errors', () => { - let message = firstError.transform({ - 'errorkey': ERROR_MESSAGE, - 'error2': 'some other error' - }); - - expect(message).toBe(ERROR_MESSAGE); - }); -}); diff --git a/src/app/shared/palette/utils/first-error.pipe.ts b/src/app/shared/palette/utils/first-error.pipe.ts deleted file mode 100644 index 0ad2fe27d..000000000 --- a/src/app/shared/palette/utils/first-error.pipe.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import { ValidationErrors } from '@angular/forms'; - -@Pipe({ - name: 'ccdFirstError' -}) -export class FirstErrorPipe implements PipeTransform { - - transform(value: ValidationErrors): string { - if (!value) { - return ''; - } - - let keys = Object.keys(value); - - if (!keys.length) { - return ''; - } - if (keys[0] === 'required') { - return 'This field is required'; - } - return value[keys[0]]; - } - -} diff --git a/src/app/shared/palette/utils/is-compound.pipe.spec.ts b/src/app/shared/palette/utils/is-compound.pipe.spec.ts deleted file mode 100644 index 755febfc1..000000000 --- a/src/app/shared/palette/utils/is-compound.pipe.spec.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { IsCompoundPipe } from './is-compound.pipe'; -import { CaseField } from '../../domain/definition/case-field.model'; - -describe('IsCompoundPipe', () => { - - let isCompound: IsCompoundPipe = new IsCompoundPipe(); - - it('should identify null field as NOT compound', () => { - expect(isCompound.transform(null)) - .toBeFalsy(); - }); - - it('should identify undefined field_type as NOT compound', () => { - expect(isCompound.transform({} as CaseField)) - .toBeFalsy(); - }); - - it('should identify undefined field_type.type as NOT compound', () => { - expect(isCompound.transform({ field_type: { }} as CaseField)) - .toBeFalsy(); - }); - - it('should identify Text field as NOT compound', () => { - expect(isCompound.transform({ field_type: { type: 'Text' }} as CaseField)) - .toBeFalsy(); - }); - - it('should identify Complex field as compound', () => { - expect(isCompound.transform({ field_type: { type: 'Complex' }} as CaseField)) - .toBeTruthy(); - }); - - it('should identify Label fields as compound', () => { - expect(isCompound.transform({ field_type: { type: 'Label' }} as CaseField)) - .toBeTruthy(); - }); - - it('should identify AddressGlobal fields as compound', () => { - expect(isCompound.transform({ field_type: { type: 'AddressGlobal' }} as CaseField)) - .toBeTruthy(); - }); - -}); diff --git a/src/app/shared/palette/utils/is-compound.pipe.ts b/src/app/shared/palette/utils/is-compound.pipe.ts deleted file mode 100644 index 62e018c74..000000000 --- a/src/app/shared/palette/utils/is-compound.pipe.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { FieldTypeEnum } from '../../domain/definition/field-type-enum.model'; - -@Pipe({ - name: 'ccdIsCompound' -}) -export class IsCompoundPipe implements PipeTransform { - - private static readonly COMPOUND_TYPES: FieldTypeEnum[] = [ - 'Complex', 'Label', 'AddressGlobal', 'AddressUK', 'AddressGlobalUK' - ]; - - transform(field: CaseField): boolean { - if (!field || !field.field_type || !field.field_type.type) { - return false; - } - - return IsCompoundPipe.COMPOUND_TYPES.indexOf(field.field_type.type) !== -1; - } - -} diff --git a/src/app/shared/palette/utils/is-mandatory.pipe.spec.ts b/src/app/shared/palette/utils/is-mandatory.pipe.spec.ts deleted file mode 100644 index 4e6a2e4f1..000000000 --- a/src/app/shared/palette/utils/is-mandatory.pipe.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { CaseFieldService } from '../../domain/case-field.service'; -import { IsMandatoryPipe } from './is-mandatory.pipe'; -import { CaseField } from '../../domain/definition/case-field.model'; - -describe('IsReadOnlyPipe', () => { - - let caseFieldService = new CaseFieldService(); - let isMandatoryPipe: IsMandatoryPipe = new IsMandatoryPipe(caseFieldService); - - it('should identify null field as NOT mandatory', () => { - expect(isMandatoryPipe.transform(null)) - .toBeFalsy(); - }); - - it('should identify undefined display_context as NOT mandatory', () => { - expect(isMandatoryPipe.transform({} as CaseField)) - .toBeFalsy(); - }); - - it('should identify unknown display_context value as NOT mandatory', () => { - expect(isMandatoryPipe.transform({ display_context: ''} as CaseField)) - .toBeFalsy(); - }); - - it('should identify OPTIONAL display_context field as NOT mandatory', () => { - expect(isMandatoryPipe.transform({ display_context: 'OPTIONAL' } as CaseField)) - .toBeFalsy(); - }); - - it('should identify MANDATORY display_context field as NOT mandatory', () => { - expect(isMandatoryPipe.transform({ display_context: 'MANDATORY' } as CaseField)) - .toBeTruthy(); - }); - - it('should identify READONLY display_context field as NOT mandatory', () => { - expect(isMandatoryPipe.transform({ display_context: 'READONLY' } as CaseField)) - .toBeFalsy(); - }); -}); diff --git a/src/app/shared/palette/utils/is-mandatory.pipe.ts b/src/app/shared/palette/utils/is-mandatory.pipe.ts deleted file mode 100644 index 44dd23637..000000000 --- a/src/app/shared/palette/utils/is-mandatory.pipe.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import { CaseFieldService } from '../../domain/case-field.service'; -import { CaseField } from '../../domain/definition/case-field.model'; - -@Pipe({ - name: 'ccdIsMandatory' -}) -export class IsMandatoryPipe implements PipeTransform { - - constructor(private caseFieldService: CaseFieldService) {}; - - transform(field: CaseField): boolean { - return this.caseFieldService.isMandatory(field); - } -} diff --git a/src/app/shared/palette/utils/is-read-only.pipe.spec.ts b/src/app/shared/palette/utils/is-read-only.pipe.spec.ts deleted file mode 100644 index c08d3569d..000000000 --- a/src/app/shared/palette/utils/is-read-only.pipe.spec.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { IsReadOnlyPipe } from './is-read-only.pipe'; -import { CaseFieldService } from '../../domain/case-field.service'; -import { CaseField } from '../../domain/definition/case-field.model'; - -describe('IsReadOnlyPipe', () => { - - let caseFieldService = new CaseFieldService(); - let isReadOnly: IsReadOnlyPipe = new IsReadOnlyPipe(caseFieldService); - - it('should identify null field as NOT readOnly', () => { - expect(isReadOnly.transform(null)) - .toBeFalsy(); - }); - - it('should identify undefined display_context as NOT readOnly', () => { - expect(isReadOnly.transform({} as CaseField)) - .toBeFalsy(); - }); - - it('should identify unknown display_context value as NOT readOnly', () => { - expect(isReadOnly.transform({ display_context: ''} as CaseField)) - .toBeFalsy(); - }); - - it('should identify OPTIONAL display_context field as NOT readOnly', () => { - expect(isReadOnly.transform({ display_context: 'OPTIONAL' } as CaseField)) - .toBeFalsy(); - }); - - it('should identify MANDATORY display_context field as NOT readOnly', () => { - expect(isReadOnly.transform({ display_context: 'MANDATORY' } as CaseField)) - .toBeFalsy(); - }); - - it('should identify READONLY display_context field as NOT readOnly', () => { - expect(isReadOnly.transform({ display_context: 'READONLY' } as CaseField)) - .toBeTruthy(); - }); -}); diff --git a/src/app/shared/palette/utils/is-read-only.pipe.ts b/src/app/shared/palette/utils/is-read-only.pipe.ts deleted file mode 100644 index e24040f9d..000000000 --- a/src/app/shared/palette/utils/is-read-only.pipe.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import { CaseFieldService } from '../../domain/case-field.service'; -import { CaseField } from '../../domain/definition/case-field.model'; - -@Pipe({ - name: 'ccdIsReadOnly' -}) -export class IsReadOnlyPipe implements PipeTransform { - - constructor(private caseFieldService: CaseFieldService) {}; - - transform(field: CaseField): boolean { - return this.caseFieldService.isReadOnly(field); - } -} diff --git a/src/app/shared/palette/utils/utils.module.ts b/src/app/shared/palette/utils/utils.module.ts deleted file mode 100644 index 0cdc82a6b..000000000 --- a/src/app/shared/palette/utils/utils.module.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { DatePipe } from './date.pipe'; -import { FirstErrorPipe } from './first-error.pipe'; -import { FieldLabelPipe } from './field-label.pipe'; -import { IsCompoundPipe } from './is-compound.pipe'; -import { IsReadOnlyPipe } from './is-read-only.pipe'; -import { IsMandatoryPipe } from './is-mandatory.pipe'; -import { DashPipe } from './dash.pipe'; - -@NgModule({ - imports: [ - CommonModule - ], - declarations: [ - DatePipe, - FieldLabelPipe, - FirstErrorPipe, - IsCompoundPipe, - IsMandatoryPipe, - IsReadOnlyPipe, - DashPipe, - ], - exports: [ - DatePipe, - FieldLabelPipe, - FirstErrorPipe, - IsCompoundPipe, - IsMandatoryPipe, - IsReadOnlyPipe, - DashPipe, - ] -}) -export class PaletteUtilsModule {} diff --git a/src/app/shared/palette/yes-no/read-yes-no-field.component.spec.ts b/src/app/shared/palette/yes-no/read-yes-no-field.component.spec.ts deleted file mode 100644 index 9f7e32f0c..000000000 --- a/src/app/shared/palette/yes-no/read-yes-no-field.component.spec.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { ReadYesNoFieldComponent } from './read-yes-no-field.component'; -import { DebugElement } from '@angular/core'; -import { FieldType } from '../../domain/definition/field-type.model'; -import createSpyObj = jasmine.createSpyObj; -import { YesNoService } from './yes-no.service'; -import { CaseField } from '../../domain/definition/case-field.model'; - -describe('ReadYesNoFieldComponent', () => { - - const FIELD_TYPE: FieldType = { - id: 'YesOrNo', - type: 'YesOrNo' - }; - const VALUE = true; - const CASE_FIELD: CaseField = { - id: 'x', - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE - }; - const FORMATTED_VALUE = 'Yes'; - - let fixture: ComponentFixture; - let component: ReadYesNoFieldComponent; - let de: DebugElement; - - let yesNoService: any; - - beforeEach(async(() => { - yesNoService = createSpyObj('yesNoService', ['format']); - yesNoService.format.and.returnValue(FORMATTED_VALUE); - - TestBed - .configureTestingModule({ - imports: [], - declarations: [ - ReadYesNoFieldComponent - ], - providers: [ - { provide: YesNoService, useValue: yesNoService } - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(ReadYesNoFieldComponent); - component = fixture.componentInstance; - - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should render output of YesNoService::format method', () => { - expect(yesNoService.format).toHaveBeenCalledWith(VALUE); - expect(yesNoService.format).toHaveBeenCalledTimes(1); - expect(de.nativeElement.textContent).toEqual(FORMATTED_VALUE); - }); -}); diff --git a/src/app/shared/palette/yes-no/read-yes-no-field.component.ts b/src/app/shared/palette/yes-no/read-yes-no-field.component.ts deleted file mode 100644 index 40f4c2c22..000000000 --- a/src/app/shared/palette/yes-no/read-yes-no-field.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { AbstractFieldReadComponent } from '../base-field/abstract-field-read.component'; -import { Component, OnInit } from '@angular/core'; -import { YesNoService } from './yes-no.service'; - -@Component({ - selector: 'ccd-read-yes-no-field', - template: `{{ getCaseFieldValue() }}` -}) -export class ReadYesNoFieldComponent extends AbstractFieldReadComponent implements OnInit { - - formattedValue: string; - - constructor(private yesNoService: YesNoService) { - super(); - } - - ngOnInit() { - this.formattedValue = this.yesNoService.format(this.caseField.value); - } - - getCaseFieldValue(): string { - return this.caseField.value ? this.formattedValue : '-'; - } - - isFieldValueEmpty(): boolean { - return (!this.caseField.value); - } - -} diff --git a/src/app/shared/palette/yes-no/write-yes-no-field.component.spec.ts b/src/app/shared/palette/yes-no/write-yes-no-field.component.spec.ts deleted file mode 100644 index 104f1b964..000000000 --- a/src/app/shared/palette/yes-no/write-yes-no-field.component.spec.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; -import { FormGroup, ReactiveFormsModule } from '@angular/forms'; -import { WriteYesNoFieldComponent } from './write-yes-no-field.component'; -import { DebugElement } from '@angular/core'; -import { MockComponent } from 'ng2-mock-component'; -import { FieldType } from '../../domain/definition/field-type.model'; -import { CaseField } from '../../domain/definition/case-field.model'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { By } from '@angular/platform-browser'; -import createSpyObj = jasmine.createSpyObj; -import { YesNoService } from './yes-no.service'; - -const FIELD_ID = 'Billingual'; -const FIELD_TYPE: FieldType = { - id: 'YesOrNo', - type: 'YesOrNo' -}; -const VALUE = 'yes'; -const FORMATTED_VALUE = 'Yes'; -const CASE_FIELD: CaseField = { - id: FIELD_ID, - label: 'X', - display_context: 'OPTIONAL', - field_type: FIELD_TYPE, - value: VALUE -}; - -const FORM_GROUP: FormGroup = new FormGroup({}); -const REGISTER_CONTROL = (control) => { - FORM_GROUP.addControl(FIELD_ID, control); - return control; -}; - -describe('WriteYesNoFieldComponent', () => { - - const $INPUT = By.css('.form-group input'); - - // Input is mocked so that one-way bound inputs can be tested - let Input: any = MockComponent({ selector: 'input', inputs: [ - 'type', - 'formControl' - ]}); - - let fixture: ComponentFixture; - let component: WriteYesNoFieldComponent; - let de: DebugElement; - - let yesNoService: any; - - beforeEach(async(() => { - yesNoService = createSpyObj('yesNoService', ['format']); - yesNoService.format.and.returnValue(FORMATTED_VALUE); - - TestBed - .configureTestingModule({ - imports: [ - ReactiveFormsModule, - PaletteUtilsModule - ], - declarations: [ - WriteYesNoFieldComponent, - - // Mock - Input, - ], - providers: [ - { provide: YesNoService, useValue: yesNoService } - ] - }) - .compileComponents(); - - fixture = TestBed.createComponent(WriteYesNoFieldComponent); - component = fixture.componentInstance; - - component.registerControl = REGISTER_CONTROL; - component.caseField = CASE_FIELD; - - de = fixture.debugElement; - fixture.detectChanges(); - })); - - it('should add a formControl linked to the field ID to the formGroup', () => { - expect(FORM_GROUP.controls[FIELD_ID]).toBeTruthy(); - }); - - it('should initialise formControl with formatted provided value', () => { - expect(yesNoService.format).toHaveBeenCalledWith(VALUE); - expect(FORM_GROUP.controls[FIELD_ID].value).toBe(FORMATTED_VALUE); - }); - - it('should render radio input element linked to formControl', () => { - component.idPrefix = 'prefix_'; - fixture.detectChanges(); - - let input = de.query($INPUT); - expect(input.nativeElement.getAttribute('type')).toBe('radio'); - expect(input.componentInstance.formControl).toBe(component.yesNoControl); - }); -}); diff --git a/src/app/shared/palette/yes-no/write-yes-no-field.component.ts b/src/app/shared/palette/yes-no/write-yes-no-field.component.ts deleted file mode 100644 index 446db403a..000000000 --- a/src/app/shared/palette/yes-no/write-yes-no-field.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { FormControl } from '@angular/forms'; -import { AbstractFieldWriteComponent } from '../base-field/abstract-field-write.component'; -import { YesNoService } from './yes-no.service'; - -@Component({ - selector: 'ccd-write-yes-no-field', - templateUrl: './write-yes-no-field.html' -}) -export class WriteYesNoFieldComponent extends AbstractFieldWriteComponent implements OnInit { - - yesNoValues = [ 'Yes', 'No' ]; - yesNoControl: FormControl; - - constructor(private yesNoService: YesNoService) { - super(); - } - - ngOnInit() { - this.yesNoControl = this.registerControl(new FormControl(this.yesNoService.format(this.caseField.value))); - } - -} diff --git a/src/app/shared/palette/yes-no/write-yes-no-field.html b/src/app/shared/palette/yes-no/write-yes-no-field.html deleted file mode 100644 index fcaa8b9bc..000000000 --- a/src/app/shared/palette/yes-no/write-yes-no-field.html +++ /dev/null @@ -1,22 +0,0 @@ -
- -
- - - {{caseField | ccdFieldLabel}} - {{caseField.hint_text}} - {{yesNoControl.errors | ccdFirstError}} - - -
- -
- - -
- -
- -
- -
diff --git a/src/app/shared/palette/yes-no/yes-no.module.ts b/src/app/shared/palette/yes-no/yes-no.module.ts deleted file mode 100644 index 4670dfe4f..000000000 --- a/src/app/shared/palette/yes-no/yes-no.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { ReadYesNoFieldComponent } from './read-yes-no-field.component'; -import { YesNoService } from './yes-no.service'; -import { WriteYesNoFieldComponent } from './write-yes-no-field.component'; -import { ReactiveFormsModule } from '@angular/forms'; -import { PaletteUtilsModule } from '../utils/utils.module'; -import { MarkdownModule } from '../../markdown/markdown.module'; - -@NgModule({ - imports: [ - CommonModule, - ReactiveFormsModule, - PaletteUtilsModule, - MarkdownModule - ], - declarations: [ - ReadYesNoFieldComponent, - WriteYesNoFieldComponent - ], - entryComponents: [ - ReadYesNoFieldComponent, - WriteYesNoFieldComponent - ], - providers: [ - YesNoService - ] -}) -export class YesNoModule {} diff --git a/src/app/shared/palette/yes-no/yes-no.service.spec.ts b/src/app/shared/palette/yes-no/yes-no.service.spec.ts deleted file mode 100644 index db504841e..000000000 --- a/src/app/shared/palette/yes-no/yes-no.service.spec.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { YesNoService } from './yes-no.service'; - -describe('YesNoService', () => { - - const YES = 'Yes'; - const NO = 'No'; - const EMPTY = ''; - - let yesNoService: YesNoService; - - beforeEach(() => { - yesNoService = new YesNoService(); - }); - - describe(YES, () => { - it('should return "Yes" when value is `true`', () => { - expect(yesNoService.format(true)).toBe(YES); - }); - - it('should return "Yes" when value is "Yes"', () => { - expect(yesNoService.format('Yes')).toBe(YES); - }); - - it('should return "Yes" when value is "yes"', () => { - expect(yesNoService.format('yes')).toBe(YES); - }); - - it('should return "Yes" when value is "YES"', () => { - expect(yesNoService.format('YES')).toBe(YES); - }); - - it('should return "Yes" when value is "yeS"', () => { - expect(yesNoService.format('yeS')).toBe(YES); - }); - - it('should return "Yes" when value is "y"', () => { - expect(yesNoService.format('y')).toBe(YES); - }); - - it('should return "Yes" when value is "Y"', () => { - expect(yesNoService.format('Y')).toBe(YES); - }); - }); - - describe(NO, () => { - it('should return "No" when value is `false`', () => { - expect(yesNoService.format(false)).toBe(NO); - }); - - it('should return "No" when value is "No"', () => { - expect(yesNoService.format('No')).toBe(NO); - }); - - it('should return "No" when value is "no"', () => { - expect(yesNoService.format('no')).toBe(NO); - }); - - it('should return "No" when value is "NO"', () => { - expect(yesNoService.format('NO')).toBe(NO); - }); - - it('should return "No" when value is "n"', () => { - expect(yesNoService.format('n')).toBe(NO); - }); - - it('should return "No" when value is "N"', () => { - expect(yesNoService.format('N')).toBe(NO); - }); - }); - - describe('empty', () => { - it('should return empty string when value is undefined', () => { - expect(yesNoService.format(undefined)).toBe(EMPTY); - }); - - it('should return empty string when value is null', () => { - expect(yesNoService.format(null)).toBe(EMPTY); - }); - - it('should return empty string when value is not a supported value', () => { - expect(yesNoService.format('plop')).toBe(EMPTY); - expect(yesNoService.format('yesno')).toBe(EMPTY); - expect(yesNoService.format('nop')).toBe(EMPTY); - }); - }); -}); diff --git a/src/app/shared/palette/yes-no/yes-no.service.ts b/src/app/shared/palette/yes-no/yes-no.service.ts deleted file mode 100644 index be7bf7eee..000000000 --- a/src/app/shared/palette/yes-no/yes-no.service.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable() -export class YesNoService { - private static readonly YES_INPUTS: string[] = [ - 'Y', - 'YES' - ]; - private static readonly NO_INPUTS: string[] = [ - 'N', - 'NO' - ]; - private static readonly YES = 'Yes'; - private static readonly NO = 'No'; - private static readonly EMPTY = ''; - - format(value: any): string { - - if (this.isYes(value)) { - return YesNoService.YES; - } else if (this.isNo(value)) { - return YesNoService.NO; - } - - return YesNoService.EMPTY; - } - - private isYes(value: any): boolean { - switch (typeof(value)) { - case 'boolean': - return value; - case 'string': - return YesNoService.YES_INPUTS.indexOf(value.toUpperCase()) !== -1; - } - - return false; - } - - private isNo(value: any): boolean { - switch (typeof(value)) { - case 'boolean': - return !value; - case 'string': - return YesNoService.NO_INPUTS.indexOf(value.toUpperCase()) !== -1; - } - - return false; - } -} diff --git a/src/app/shared/remove-dialog/remove-dialog.component.html b/src/app/shared/remove-dialog/remove-dialog.component.html deleted file mode 100644 index ff8598293..000000000 --- a/src/app/shared/remove-dialog/remove-dialog.component.html +++ /dev/null @@ -1,17 +0,0 @@ - -
-
-

X

-
-
-

Are you sure you want to remove the item

-
-
- You are about to permanently remove an item, are you sure you want to - remove this item? -
-
- - -
-
diff --git a/src/app/shared/remove-dialog/remove-dialog.component.spec.ts b/src/app/shared/remove-dialog/remove-dialog.component.spec.ts deleted file mode 100644 index 7a0b5db54..000000000 --- a/src/app/shared/remove-dialog/remove-dialog.component.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { RemoveDialogComponent } from './remove-dialog.component'; -import { MatDialogRef } from '@angular/material'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; -import createSpyObj = jasmine.createSpyObj; - -describe('RemoveDialogComponent', () => { - const REMOVE_BUTTON = By.css('button[title="Remove"]'); - const CANCEL_BUTTON = By.css('button[title="Cancel"]'); - - let component: RemoveDialogComponent; - let fixture: ComponentFixture; - let de: DebugElement; - let matDialogRef: any; - - beforeEach(async(() => { - matDialogRef = createSpyObj>('MatDialogRef', ['close']); - - TestBed.configureTestingModule({ - declarations: [ RemoveDialogComponent ], - providers: [ - { provide: MatDialogRef, useValue: matDialogRef } - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(RemoveDialogComponent); - component = fixture.componentInstance; - de = fixture.debugElement; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should close dialog with `Remove` when remove button clicked', () => { - let removeButton = de.query(REMOVE_BUTTON); - - removeButton.nativeElement.click(); - fixture.detectChanges(); - - expect(matDialogRef.close).toHaveBeenCalledWith('Remove'); - }); - - it('should close dialog with `Cancel` when cancel button clicked', () => { - let removeButton = de.query(CANCEL_BUTTON); - - removeButton.nativeElement.click(); - fixture.detectChanges(); - - expect(matDialogRef.close).toHaveBeenCalledWith('Cancel'); - }); -}); diff --git a/src/app/shared/remove-dialog/remove-dialog.component.ts b/src/app/shared/remove-dialog/remove-dialog.component.ts deleted file mode 100644 index 9aeaa9266..000000000 --- a/src/app/shared/remove-dialog/remove-dialog.component.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Component } from '@angular/core'; -import { MatDialogRef } from '@angular/material'; - -@Component({ - selector: 'ccd-remove-dialog', - templateUrl: './remove-dialog.component.html', - styleUrls: ['../action-dialog.component.scss'] -}) -export class RemoveDialogComponent { - - result: string; - - constructor(private matDialogRef: MatDialogRef) {} - - remove() { - this.result = 'Remove'; - this.matDialogRef.close(this.result); - } - cancel() { - this.result = 'Cancel'; - this.matDialogRef.close(this.result); - } -} diff --git a/src/app/shared/save-or-discard-dialog/save-or-discard-dialog.component.html b/src/app/shared/save-or-discard-dialog/save-or-discard-dialog.component.html deleted file mode 100644 index 25ada1b91..000000000 --- a/src/app/shared/save-or-discard-dialog/save-or-discard-dialog.component.html +++ /dev/null @@ -1,16 +0,0 @@ - -
-
-

X

-
-
-

Would you like to save changes to the application?

-
-
- Would you like to save changes before you proceed? -
-
- - -
-
diff --git a/src/app/shared/save-or-discard-dialog/save-or-discard-dialog.component.spec.ts b/src/app/shared/save-or-discard-dialog/save-or-discard-dialog.component.spec.ts deleted file mode 100644 index 21927dbe7..000000000 --- a/src/app/shared/save-or-discard-dialog/save-or-discard-dialog.component.spec.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { SaveOrDiscardDialogComponent } from './save-or-discard-dialog.component'; -import { MatDialogRef } from '@angular/material'; -import { By } from '@angular/platform-browser'; -import { DebugElement } from '@angular/core'; -import createSpyObj = jasmine.createSpyObj; - -describe('SaveOrDiscardDialogComponent', () => { - const SAVE_BUTTON = By.css('button[title="Save"]'); - const DISCARD_BUTTON = By.css('button[title="Discard"]'); - - let component: SaveOrDiscardDialogComponent; - let fixture: ComponentFixture; - let de: DebugElement; - let matDialogRef: any; - - beforeEach(async(() => { - matDialogRef = createSpyObj>('MatDialogRef', ['close']); - - TestBed.configureTestingModule({ - declarations: [ SaveOrDiscardDialogComponent ], - providers: [ - { provide: MatDialogRef, useValue: matDialogRef } - ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(SaveOrDiscardDialogComponent); - component = fixture.componentInstance; - de = fixture.debugElement; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); - - it('should close dialog with `Save` when delete button clicked', () => { - let saveButton = de.query(SAVE_BUTTON); - - saveButton.nativeElement.click(); - fixture.detectChanges(); - - expect(matDialogRef.close).toHaveBeenCalledWith('Save'); - }); - - it('should close dialog with `Discard` when cancel button clicked', () => { - let discardButton = de.query(DISCARD_BUTTON); - - discardButton.nativeElement.click(); - fixture.detectChanges(); - - expect(matDialogRef.close).toHaveBeenCalledWith('Discard'); - }); -}); diff --git a/src/app/shared/save-or-discard-dialog/save-or-discard-dialog.component.ts b/src/app/shared/save-or-discard-dialog/save-or-discard-dialog.component.ts deleted file mode 100644 index bff797125..000000000 --- a/src/app/shared/save-or-discard-dialog/save-or-discard-dialog.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Component } from '@angular/core'; -import { MatDialogRef } from '@angular/material'; - -@Component({ - selector: 'ccd-save-or-discard-dialog', - templateUrl: './save-or-discard-dialog.component.html', - styleUrls: ['../action-dialog.component.scss'] -}) -export class SaveOrDiscardDialogComponent { - - result: string; - - constructor(private matDialogRef: MatDialogRef) {} - - cancel() { - this.result = 'Cancel'; - this.matDialogRef.close(this.result); - } - save() { - this.result = 'Save'; - this.matDialogRef.close(this.result); - } - discard() { - this.result = 'Discard'; - this.matDialogRef.close(this.result); - } -} diff --git a/src/app/shared/search/filters/search-filters.component.spec.ts b/src/app/shared/search/filters/search-filters.component.spec.ts index 955ec908d..90e731121 100644 --- a/src/app/shared/search/filters/search-filters.component.spec.ts +++ b/src/app/shared/search/filters/search-filters.component.spec.ts @@ -7,13 +7,12 @@ import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angul import { SearchService } from '../../../core/search/search.service'; import { Observable } from 'rxjs/Rx'; import { SearchInput } from '../../../core/search/search-input.model'; -import { OrderService } from '../../../core/order/order.service'; -import { AbstractFieldWriteComponent } from '../../palette/base-field/abstract-field-write.component'; import { JurisdictionService } from '../../jurisdiction.service'; import { CaseType } from '../../domain/definition/case-type.model'; import { createSearchInputs } from '../../../core/search/search-input.test.fixture'; import { WindowService } from '../../../core/utils/window.service'; import createSpyObj = jasmine.createSpyObj; +import { AbstractFieldWriteComponent, OrderService } from '@hmcts/ccd-case-ui-toolkit'; const JURISDICTION_1: Jurisdiction = { id: 'J1', @@ -177,36 +176,41 @@ describe('SearchFiltersComponent', () => { { provide: WindowService, useValue: windowService } ] }) - .compileComponents(); - - fixture = TestBed.createComponent(SearchFiltersComponent); - component = fixture.componentInstance; - - component.formGroup = TEST_FORM_GROUP; - component.jurisdictions = [ - JURISDICTION_1, - JURISDICTION_2 - ]; - - component.onApply.subscribe(searchHandler.applyFilters); - - de = fixture.debugElement; - fixture.detectChanges(); + .compileComponents() + .then(() => { + fixture = TestBed.createComponent(SearchFiltersComponent); + component = fixture.componentInstance; + + component.formGroup = TEST_FORM_GROUP; + component.jurisdictions = [ + JURISDICTION_1, + JURISDICTION_2 + ]; + component.onApply.subscribe(searchHandler.applyFilters); + + de = fixture.debugElement; + fixture.detectChanges(); + }); })); afterEach(async(() => { windowService.clearLocalStorage(); })); - it('should select the jurisdiction if there is only one jurisdiction', () => { + it('should select the jurisdiction if there is only one jurisdiction', async(() => { + resetCaseTypes(JURISDICTION_1, []); mockSearchService.getSearchInputs.and.returnValue(createObservableFrom(TEST_SEARCH_INPUTS)); - component.jurisdictions = [JURISDICTION_3]; + component.jurisdictions = [JURISDICTION_1]; fixture.detectChanges(); component.ngOnInit(); - fixture.detectChanges(); - expect(component.selected.jurisdiction).toBe(JURISDICTION_3); - expect(component.selected.caseType).toBe(null); - }); + + fixture + .whenStable() + .then(() => { + expect(component.selected.jurisdiction).toBe(JURISDICTION_1); + expect(component.selected.caseType).toBe(null); + }); + })); it('should select the first caseType ', () => { resetCaseTypes(JURISDICTION_3, [CASE_TYPE_1, CASE_TYPE_2]); diff --git a/src/app/shared/search/filters/search-filters.component.ts b/src/app/shared/search/filters/search-filters.component.ts index 3d792e859..e8b73ea65 100644 --- a/src/app/shared/search/filters/search-filters.component.ts +++ b/src/app/shared/search/filters/search-filters.component.ts @@ -8,7 +8,7 @@ import { WindowService } from '../../../core/utils/window.service'; import { FormGroup } from '@angular/forms'; import { PlatformLocation } from '@angular/common' import { JurisdictionService } from '../../jurisdiction.service'; -import { OrderService } from '../../../core/order/order.service'; +import { OrderService } from '@hmcts/ccd-case-ui-toolkit'; @Component({ selector: 'ccd-search-filters', diff --git a/src/app/shared/search/search-result-view-column.model.ts b/src/app/shared/search/search-result-view-column.model.ts index 9a9d57324..750954aaf 100644 --- a/src/app/shared/search/search-result-view-column.model.ts +++ b/src/app/shared/search/search-result-view-column.model.ts @@ -1,4 +1,4 @@ -import { FieldType } from '../../shared/domain/definition/field-type.model'; +import { FieldType } from '@hmcts/ccd-case-ui-toolkit'; export class SearchResultViewColumn { case_field_id: string; diff --git a/src/app/shared/search/search-result-view.model.ts b/src/app/shared/search/search-result-view.model.ts index aad5e2df6..519b977ce 100644 --- a/src/app/shared/search/search-result-view.model.ts +++ b/src/app/shared/search/search-result-view.model.ts @@ -1,7 +1,7 @@ import { SearchResultViewColumn } from './search-result-view-column.model'; import { SearchResultViewItem } from './search-result-view-item.model'; import { Type } from 'class-transformer'; -import { Draft } from '../domain/draft'; +import { Draft } from '@hmcts/ccd-case-ui-toolkit'; export class SearchResultView { @Type(() => SearchResultViewColumn) diff --git a/src/app/shared/search/search-result.component.spec.ts b/src/app/shared/search/search-result.component.spec.ts index d11f63359..2a98cb20f 100644 --- a/src/app/shared/search/search-result.component.spec.ts +++ b/src/app/shared/search/search-result.component.spec.ts @@ -5,7 +5,6 @@ import { SearchResultView } from './search-result-view.model'; import { RouterTestingModule } from '@angular/router/testing'; import { By } from '@angular/platform-browser'; import { SortSearchResultPipe } from './sorting/sort-search-result.pipe'; -import { CaseReferencePipe } from '../utils/case-reference.pipe'; import { SearchResultViewItemComparatorFactory } from './sorting/search-result-view-item-comparator-factory'; import { Jurisdiction } from '../domain/definition/jurisdiction.model'; import { ActivityService } from '../../core/activity/activity.service'; @@ -18,7 +17,7 @@ import { AppConfig } from '../../app.config'; import { CaseType } from '../domain/definition/case-type.model'; import { FormGroup } from '@angular/forms'; import createSpyObj = jasmine.createSpyObj; -import { Draft } from '../domain/draft'; +import { CaseReferencePipe, DRAFT_PREFIX } from '@hmcts/ccd-case-ui-toolkit'; @Component({ selector: 'ccd-field-read', @@ -271,7 +270,7 @@ describe('SearchResultComponent', () => { // draft let firstRowFirstCol = de.query(By.css('div>table>tbody tr:nth-child(1) td:nth-child(1) a')); - expect(firstRowFirstCol.nativeElement.textContent.trim()).toBe(Draft.DRAFT_PREFIX); + expect(firstRowFirstCol.nativeElement.textContent.trim()).toBe(DRAFT_PREFIX); let firstRowComponent = firstRow.children.slice(1, 3); let firstRowResult = RESULT_VIEW.results[0]; @@ -384,7 +383,7 @@ describe('SearchResultComponent', () => { it('should render DRAFT value in first column with hyperlink if case_id is DRAFT prefixed even if first column not null', () => { let firstRowFirstCol = de.query(By.css('div>table>tbody tr:nth-child(1) td:nth-child(1) a')); - expect(firstRowFirstCol.nativeElement.textContent.trim()).toBe(Draft.DRAFT_PREFIX); + expect(firstRowFirstCol.nativeElement.textContent.trim()).toBe(DRAFT_PREFIX); }); }); diff --git a/src/app/shared/search/search-result.component.ts b/src/app/shared/search/search-result.component.ts index 1ff472b65..84ccb7382 100644 --- a/src/app/shared/search/search-result.component.ts +++ b/src/app/shared/search/search-result.component.ts @@ -13,8 +13,7 @@ import { AppConfig } from '../../app.config'; import { CaseType } from '../domain/definition/case-type.model'; import { FormGroup } from '@angular/forms'; import { ActivityService } from '../../core/activity/activity.service'; -import { CaseReferencePipe } from '../utils/case-reference.pipe'; -import { Draft } from '../domain/draft'; +import { CaseReferencePipe, DRAFT_PREFIX } from '@hmcts/ccd-case-ui-toolkit'; @Component({ selector: 'ccd-search-result', @@ -155,7 +154,7 @@ export class SearchResultComponent implements OnChanges { } draftPrefixOrGet(col, result): any { - return result.case_id.startsWith(Draft.DRAFT_PREFIX) ? Draft.DRAFT_PREFIX : this.hyphenateIfCaseReferenceOrGet(col, result); + return result.case_id.startsWith(DRAFT_PREFIX) ? DRAFT_PREFIX : this.hyphenateIfCaseReferenceOrGet(col, result); } private isSortAscending(column: SearchResultViewColumn): boolean { @@ -198,6 +197,6 @@ export class SearchResultComponent implements OnChanges { return currentPage > 1 ? this.draftsCount : 0; } private numberOfDrafts(): number { - return this.resultView.results.filter(_ => _.case_id.startsWith(Draft.DRAFT_PREFIX)).length; + return this.resultView.results.filter(_ => _.case_id.startsWith(DRAFT_PREFIX)).length; } } diff --git a/src/app/shared/search/sorting/search-result-view-item-comparator-factory.spec.ts b/src/app/shared/search/sorting/search-result-view-item-comparator-factory.spec.ts index 158a2e20c..2c03e86c4 100644 --- a/src/app/shared/search/sorting/search-result-view-item-comparator-factory.spec.ts +++ b/src/app/shared/search/sorting/search-result-view-item-comparator-factory.spec.ts @@ -1,8 +1,7 @@ import { SearchResultViewItemComparatorFactory } from './search-result-view-item-comparator-factory'; import { SearchResultViewColumn } from '../search-result-view-column.model'; import { SearchResultViewItem } from '../search-result-view-item.model'; -import { FieldTypeEnum } from '../../domain/definition/field-type-enum.model'; -import { FieldType } from '../../domain/definition/field-type.model'; +import { FieldTypeEnum, FieldType } from '@hmcts/ccd-case-ui-toolkit/dist/shared/domain'; describe('SearchResultViewItemComparatorFactory', () => { diff --git a/src/app/shared/shared.module.ts b/src/app/shared/shared.module.ts index e96b7ca4f..b54e6787a 100644 --- a/src/app/shared/shared.module.ts +++ b/src/app/shared/shared.module.ts @@ -4,7 +4,9 @@ import { CommonModule } from '@angular/common'; import { NgxPaginationModule } from 'ngx-pagination'; import { SearchResultComponent } from './search/search-result.component'; import { SearchFiltersComponent } from './search/filters/search-filters.component'; -import { PaletteModule } from './palette/palette.module'; +import { PaletteModule, CaseFieldService, ConditionalShowModule, DocumentDialogComponent, + MarkdownModule, LabelFieldComponent, LabelSubstitutorModule, SharedUtilsModule, + DeleteOrCancelDialogComponent, SaveOrDiscardDialogComponent} from '@hmcts/ccd-case-ui-toolkit'; import { RouterModule } from '@angular/router'; import { EventTriggerModule } from './event-trigger/event-trigger.module'; import { CaseHeaderComponent } from './header/case-header.component'; @@ -14,18 +16,9 @@ import { SearchResultViewItemComparatorFactory } from './search/sorting/search-r import { CcdActivityComponent } from '../core/activity/ccd-activity/ccd-activity.component'; import { CcdActivityIconComponent } from '../core/activity/ccd-activity/ccd-activity-icon/ccd-activity-icon.component'; import { CcdActivityBannerComponent } from '../core/activity/ccd-activity/ccd-activity-banner/ccd-activity-banner.component'; -import { CaseFieldService } from './domain/case-field.service'; import { CaseHistoryComponent } from './case-history/case-history.component'; import { CaseHistoryResolver } from './case-history/case-history.resolver'; -import { LabelSubstitutorModule } from './substitutor/label-substitutor.module'; -import { ConditionalShowModule } from './conditional-show/conditional-show.module'; import { CaseHistoryService } from '../core/cases/case-history.service'; -import { DocumentDialogComponent } from './document-dialog/document-dialog.component'; -import { DeleteOrCancelDialogComponent } from './delete-or-cancel-dialog/delete-or-cancel-dialog.component'; -import { SaveOrDiscardDialogComponent } from './save-or-discard-dialog/save-or-discard-dialog.component'; -import { MarkdownModule } from './markdown/markdown.module'; -import { LabelFieldComponent } from './palette/label/label-field.component'; -import { SharedUtilsModule } from './utils/shared-utils.module'; @NgModule({ imports: [ diff --git a/src/app/shared/substitutor/label-substitutor.directive.spec.ts b/src/app/shared/substitutor/label-substitutor.directive.spec.ts deleted file mode 100644 index dfe7d5a5f..000000000 --- a/src/app/shared/substitutor/label-substitutor.directive.spec.ts +++ /dev/null @@ -1,808 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { By } from '@angular/platform-browser'; -import { DebugElement, Component, Input } from '@angular/core'; -import { LabelSubstitutorDirective } from './label-substitutor.directive'; -import { CaseField } from '../domain/definition/case-field.model'; -import { async } from '@angular/core/testing'; -import { FormGroup, FormControl } from '@angular/forms'; -import { FieldsUtils } from '../utils/fields.utils'; -import { LabelSubstitutionService } from '../case-editor/label-substitution.service'; -import createSpyObj = jasmine.createSpyObj; - -@Component({ - template: ` - {{caseField.label}}` -}) -class TestHostComponent { - - @Input() caseField: CaseField; - @Input() eventFields: CaseField[]; - @Input() formGroup: FormGroup; -} - -let field = (id, value, fieldType, label?) => { - let caseField = new CaseField(); - caseField.id = id; - caseField.value = value; - caseField.field_type = fieldType; - caseField.label = label; - return caseField; -}; - -describe('LabelSubstitutorDirective', () => { - - let comp: TestHostComponent; - let fixture: ComponentFixture; - let de: DebugElement; - let el: HTMLElement; - let labelSubstitutionService: any; - - beforeEach( async(() => { - labelSubstitutionService = createSpyObj('labelSubstitutionService', ['substituteLabel']); - - TestBed.configureTestingModule({ - declarations: [ LabelSubstitutorDirective, TestHostComponent ], - providers: [ FieldsUtils , - {provide: LabelSubstitutionService, useValue: labelSubstitutionService}] - }).compileComponents(); - - fixture = TestBed.createComponent(TestHostComponent); - comp = fixture.componentInstance; - de = fixture.debugElement.query(By.directive(LabelSubstitutorDirective)); - el = de.nativeElement; - })); - - describe('simple type fields', () => { - - it('should display label returned by label substitution service', () => { - let label = 'Label B with valueA=${LabelA} and valueA=${LabelA}:'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - comp.eventFields = [comp.caseField]; - labelSubstitutionService.substituteLabel.and.returnValue('Label B with valueA=ValueA and valueA=ValueA:'); - fixture.detectChanges(); - - expect(el.innerText).toBe('Label B with valueA=ValueA and valueA=ValueA:'); - }); - - it('should pass case field value to substitute label when case field value but no form field value present', () => { - let label = 'someLabel:'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - comp.eventFields = [comp.caseField, field('LabelA', 'ValueA', '')]; - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: 'ValueA' }, label); - }); - - it('should pass form value to substitute label if both case field and form values exist for same field', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - comp.eventFields = [comp.caseField, field('LabelA', 'ValueA1', '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl('ValueA2'), - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: 'ValueA2' }, label); - }); - - it('should pass correct values when both form field and case field values present for different fields', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - comp.eventFields = [comp.caseField, field('LabelD', 'ValueD', { - id: 'LabelD', - type: 'Text' - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl('ValueA'), - LabelC: new FormControl('ValueC') - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith( - { LabelB: '', LabelA: 'ValueA', LabelC: 'ValueC', LabelD: 'ValueD' }, label); - }); - }); - - describe('fixed list type fields', () => { - - it('should pass form field value when field is not read only and no case field value but form field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text', - }, label); - comp.eventFields = [comp.caseField, field('LabelA', '', { - id: 'LabelA', - type: 'FixedList', - fixed_list_items: [ - { - code: 'ValueA', - label: 'Option A' - }, - { - code: 'ValueC', - label: 'Option C' - } - ] - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl('ValueA') - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith( - { LabelB: '', LabelA: 'Option A' }, label); - }); - - it('should pass case field value when field is read only and no form field but case field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text', - }, label); - comp.eventFields = [comp.caseField, field('LabelA', 'ValueC', { - id: 'LabelA', - type: 'FixedList', - fixed_list_items: [ - { - code: 'ValueA', - label: 'Option A' - }, - { - code: 'ValueC', - label: 'Option C' - } - ] - }, '')]; - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith( - { LabelB: '', LabelA: 'Option C' }, label); - }); - - it('should pass field form value when field is not read only and both form and case field values present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text', - }, label); - comp.eventFields = [comp.caseField, field('LabelA', 'ValueC', { - id: 'LabelA', - type: 'FixedList', - fixed_list_items: [ - { - code: 'ValueA', - label: 'Option A' - }, - { - code: 'ValueC', - label: 'Option C' - } - ] - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl('ValueA') - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith( - { LabelB: '', LabelA: 'Option A' }, label); - }); - }); - - describe('multi list type fields', () => { - - it('should pass form field value when field is not read only and no case field value but form field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text', - }, label); - comp.eventFields = [comp.caseField, field('LabelA', '', { - id: 'LabelA', - type: 'MultiSelectList', - fixed_list_items: [ - { - code: 'ValueA', - label: 'Option A' - }, - { - code: 'ValueC', - label: 'Option C' - }, - { - code: 'ValueD', - label: 'Option D' - } - ] - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl(['ValueA', 'ValueD']) - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith( - { LabelB: '', LabelA: ['ValueA', 'ValueD'], 'LabelA-LABEL': ['Option A', 'Option D']}, label); - }); - - it('should pass case field value when field is read only and no form field but case field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text', - }, label); - comp.eventFields = [comp.caseField, field('LabelA', ['ValueC', 'ValueD'], { - id: 'LabelA', - type: 'MultiSelectList', - fixed_list_items: [ - { - code: 'ValueA', - label: 'Option A' - }, - { - code: 'ValueC', - label: 'Option C' - }, - { - code: 'ValueD', - label: 'Option D' - } - ] - }, '')]; - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith( - { LabelB: '', LabelA: ['ValueC', 'ValueD'], 'LabelA-LABEL': ['Option C', 'Option D']}, label); - }); - - it('should pass field form value when field is not read only and both form and case field values present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text', - }, label); - comp.eventFields = [comp.caseField, field('LabelA', 'ValueC', { - id: 'LabelA', - type: 'MultiSelectList', - fixed_list_items: [ - { - code: 'ValueA', - label: 'Option A' - }, - { - code: 'ValueC', - label: 'Option C' - }, - { - code: 'ValueD', - label: 'Option D' - } - ] - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl(['ValueA', 'ValueC']) - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith( - { LabelB: '', LabelA: ['ValueA', 'ValueC'], 'LabelA-LABEL': ['Option A', 'Option C']}, label); - }); - }); - - describe('MoneyGBP type fields', () => { - - it('should pass null value for null MoneyGBP', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - comp.eventFields = [comp.caseField, field('LabelA', null, { - id: 'LabelA', - type: 'MoneyGBP' - }, '')]; - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: null }, label); - }); - - it('should pass case field value with MoneyGBP when case field value but no form field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - comp.eventFields = [comp.caseField, field('LabelA', '20055', { - id: 'LabelA', - type: 'MoneyGBP' - }, '')]; - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: '£200.55' }, label); - }); - - it('should pass form field value with MoneyGBP when form field value but no case field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - comp.eventFields = [comp.caseField, field('LabelA', '', { - id: 'LabelA', - type: 'MoneyGBP' - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl('20055') - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: '£200.55' }, label); - }); - - it('should pass form field value with MoneyGBP when both form and case field values present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - comp.eventFields = [comp.caseField, field('LabelA', '99999', { - id: 'LabelA', - type: 'MoneyGBP' - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl('20055') - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: '£200.55' }, label); - }); - }); - - describe('Date type fields', () => { - - it('should pass case field value with Date when case field value but no form field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - comp.eventFields = [comp.caseField, field('LabelA', '2018-03-07', { - id: 'LabelA', - type: 'Date' - }, '')]; - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: '7 Mar 2018' }, label); - }); - - it('should pass form field value with Date when form field value but no case field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - comp.eventFields = [comp.caseField, field('LabelA', '', { - id: 'LabelA', - type: 'Date' - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl('2018-03-07') - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: '7 Mar 2018' }, label); - }); - - it('should pass form field value with Date when both form and case field values present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - comp.eventFields = [comp.caseField, field('LabelA', '2018-03-07', { - id: 'LabelA', - type: 'Date' - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl('2018-03-07') - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: '7 Mar 2018' }, label); - }); - - it('should pass form field value with invalid date when both form and case field values present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - comp.eventFields = [comp.caseField, field('LabelA', '2018-03', { - id: 'LabelA', - type: 'Date' - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl('2018-03') - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: '{ Invalid Date: 2018-03 }' }, label); - }); - }); - - describe('Collection type fields', () => { - - it('should pass form field value with comma delimited text items when case field value but no form field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - const VALUES = [ - { - value: 'Pierre', - }, - { - value: 'Paul', - }, - { - value: 'Jacques', - } - ]; - comp.eventFields = [comp.caseField, field('LabelA', VALUES, { - id: 'LabelA', - type: 'Collection', - collection_field_type: { - id: 'Text', - type: 'Text' - } - }, '')]; - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: VALUES}, label); - }); - - it('should pass form field value with comma delimited text items when form field value but no case field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - const VALUES = [ - { - value: 'Pierre', - }, - { - value: 'Paul', - }, - { - value: 'Jacques', - } - ]; - comp.eventFields = [comp.caseField, field('LabelA', [], { - id: 'LabelA', - type: 'Collection', - collection_field_type: { - id: 'Text', - type: 'Text' - } - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl(VALUES) - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: VALUES}, label); - }); - - it('should pass form field value with comma delimited text items when both form and case field values present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - const VALUES = [ - { - value: 'Pierre', - }, - { - value: 'Paul', - }, - { - value: 'Jacques', - } - ]; - comp.eventFields = [comp.caseField, field('LabelA', [ - { - value: 'Tom', - }, - { - value: 'George', - }, - { - value: 'John', - } - ], { - id: 'LabelA', - type: 'Collection', - collection_field_type: { - id: 'Text', - type: 'Text' - } - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl(VALUES) - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: VALUES}, label); - }); - }); - - describe('Collection of fixed list type fields', () => { - - it('should pass form field value with comma delimited label items when case field value but no form field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - const VALUES = [{value: 'ValueA'}, {value: 'ValueC'}, {value: 'ValueD'}]; - comp.eventFields = [comp.caseField, field('LabelA', VALUES, { - id: 'LabelA', - type: 'Collection', - collection_field_type: { - id: 'FixedList', - type: 'FixedList', - fixed_list_items: [ - { - code: 'ValueA', - label: 'Option A' - }, - { - code: 'ValueC', - label: 'Option C' - }, - { - code: 'ValueD', - label: 'Option D' - } - ] - } - }, '')]; - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: VALUES}, label); - }); - - it('should pass form field value with comma delimited label items when form field value but no case field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - const VALUES = [{value: 'ValueA'}, {value: 'ValueC'}, {value: 'ValueD'}]; - comp.eventFields = [comp.caseField, field('LabelA', [], { - id: 'LabelA', - type: 'Collection', - collection_field_type: { - id: 'FixedList', - type: 'FixedList', - fixed_list_items: [ - { - code: 'ValueA', - label: 'Option A' - }, - { - code: 'ValueC', - label: 'Option C' - }, - { - code: 'ValueD', - label: 'Option D' - } - ] - } - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl(VALUES) - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: VALUES}, label); - }); - - it('should pass form field value with comma delimited label items when both form and case field values present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - const VALUES = [{value: 'ValueA'}, {value: 'ValueC'}, {value: 'ValueD'}]; - comp.eventFields = [comp.caseField, field('LabelA', [{value: 'ValueD'}, {value: 'ValueD'}, {value: 'ValueD'}], { - id: 'LabelA', - type: 'Collection', - collection_field_type: { - id: 'FixedList', - type: 'FixedList', - fixed_list_items: [ - { - code: 'ValueA', - label: 'Option A' - }, - { - code: 'ValueC', - label: 'Option C' - }, - { - code: 'ValueD', - label: 'Option D' - } - ] - } - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl(VALUES) - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: VALUES}, label); - }); - }); - - describe('Collection of MoneyGBP type fields', () => { - - it('should pass form field value with comma delimited label items when case field value but no form field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - const RAW_VALUES = [{value: '12345'}, {value: '34888'}, {value: '9944521'}]; - const TRANSFORMED_VALUES = [{value: '£123.45'}, {value: '£348.88'}, {value: '£99,445.21'}]; - comp.eventFields = [comp.caseField, field('LabelA', RAW_VALUES, { - id: 'LabelA', - type: 'Collection', - collection_field_type: { - id: 'MoneyGBP', - type: 'MoneyGBP' - } - }, '')]; - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: TRANSFORMED_VALUES}, label); - }); - - it('should pass form field value with comma delimited label items when form field value but no case field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - const RAW_VALUES = [{value: '12345'}, {value: '34888'}, {value: '9944521'}]; - const TRANSFORMED_VALUES = [{value: '£123.45'}, {value: '£348.88'}, {value: '£99,445.21'}]; - comp.eventFields = [comp.caseField, field('LabelA', [], { - id: 'LabelA', - type: 'Collection', - collection_field_type: { - id: 'MoneyGBP', - type: 'MoneyGBP' - } - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl(RAW_VALUES) - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: TRANSFORMED_VALUES}, label); - }); - - it('should pass form field value with comma delimited label items when both form and case field values present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - const RAW_VALUES = [{value: '12345'}, {value: '34888'}, {value: '9944521'}]; - const TRANSFORMED_VALUES = [{value: '£123.45'}, {value: '£348.88'}, {value: '£99,445.21'}]; - comp.eventFields = [comp.caseField, field('LabelA', [{value: 'ValueD'}, {value: 'ValueD'}, {value: 'ValueD'}], { - id: 'LabelA', - type: 'Collection', - collection_field_type: { - id: 'MoneyGBP', - type: 'MoneyGBP' - } - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl(RAW_VALUES) - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: TRANSFORMED_VALUES}, label); - }); - }); - - describe('Collection of Date type fields', () => { - - it('should pass form field value with comma delimited label items when case field value but no form field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - const RAW_VALUES = [{value: '2018-03-07'}, {value: '2015-02-22'}, {value: '2017-12-12'}]; - const TRANSFORMED_VALUES = [{value: '7 Mar 2018'}, {value: '22 Feb 2015'}, {value: '12 Dec 2017'}]; - comp.eventFields = [comp.caseField, field('LabelA', RAW_VALUES, { - id: 'LabelA', - type: 'Collection', - collection_field_type: { - id: 'Date', - type: 'Date' - } - }, '')]; - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: TRANSFORMED_VALUES}, label); - }); - - it('should pass form field value with comma delimited label items when form field value but no case field value present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - const RAW_VALUES = [{value: '2018-03-07'}, {value: '2015-02-22'}, {value: '2017-12-12'}]; - const TRANSFORMED_VALUES = [{value: '7 Mar 2018'}, {value: '22 Feb 2015'}, {value: '12 Dec 2017'}]; - comp.eventFields = [comp.caseField, field('LabelA', [], { - id: 'LabelA', - type: 'Collection', - collection_field_type: { - id: 'Date', - type: 'Date' - } - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl(RAW_VALUES) - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: TRANSFORMED_VALUES}, label); - }); - - it('should pass form field value with comma delimited label items when both form and case field values present', () => { - let label = 'someLabel'; - comp.caseField = field('LabelB', '', { - id: 'LabelB', - type: 'Text' - }, label); - const RAW_VALUES = [{value: '2018-03-07'}, {value: '2015-02-22'}, {value: '2017-12-12'}]; - const TRANSFORMED_VALUES = [{value: '7 Mar 2018'}, {value: '22 Feb 2015'}, {value: '12 Dec 2017'}]; - comp.eventFields = [comp.caseField, field('LabelA', [{value: 'ValueD'}, {value: 'ValueD'}, {value: 'ValueD'}], { - id: 'LabelA', - type: 'Collection', - collection_field_type: { - id: 'Date', - type: 'Date' - } - }, '')]; - comp.formGroup = new FormGroup({ - LabelA: new FormControl(RAW_VALUES) - }); - fixture.detectChanges(); - - expect(labelSubstitutionService.substituteLabel).toHaveBeenCalledWith({ LabelB: '', LabelA: TRANSFORMED_VALUES}, label); - }); - }); -}); diff --git a/src/app/shared/substitutor/label-substitutor.directive.ts b/src/app/shared/substitutor/label-substitutor.directive.ts deleted file mode 100644 index f7675653c..000000000 --- a/src/app/shared/substitutor/label-substitutor.directive.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Directive, Input, OnInit, OnDestroy } from '@angular/core'; -import { FormGroup } from '@angular/forms'; -import { CaseField } from '../domain/definition/case-field.model'; -import { FieldsUtils } from '../utils/fields.utils'; -import { LabelSubstitutionService } from '../case-editor/label-substitution.service'; - -@Directive({ selector: '[ccdLabelSubstitutor]' }) -/** Checks all labels and substitutes any that reference other ones. -*/ -export class LabelSubstitutorDirective implements OnInit, OnDestroy { - - @Input() caseField: CaseField; - @Input() eventFields: CaseField[] = []; - @Input() formGroup: FormGroup; - - initialLabel: string; - - constructor(private fieldsUtils: FieldsUtils, private labelSubstitutionService: LabelSubstitutionService) {} - - ngOnInit() { - if (this.caseField.label) { - this.initialLabel = this.caseField.label; - this.formGroup = this.formGroup || new FormGroup({}); - // console.log('SubstitutorDirective FIELD: ' + this.caseField.id + ' init. Label: ' + this.caseField.label); - // console.log('SubstitutorDirective EVENT_FIELDS: ', this.eventFields); - this.caseField.label = this.getResolvedLabel(this.getReadOnlyAndFormFields()); - } - } - - ngOnDestroy() { - this.caseField.label = this.initialLabel; - } - - private getResolvedLabel(fields) { - // console.log('SubstitutorDirective FIELD ' + this.caseField.id + ' updatingVisibility based on fields: ', fields); - return this.labelSubstitutionService.substituteLabel(fields, this.caseField.label); - // console.log('SubstitutorDirective RESOLVED LABEL ', this.caseField.label); - } - - private getReadOnlyAndFormFields() { - let formFields = this.getFormFieldsValuesIncludingDisabled(); - // console.log('SubstitutorDirective FIELD ' + this.caseField.id + ' current form values including disabled: ', formFields); - return this.fieldsUtils.mergeLabelCaseFieldsAndFormFields(this.eventFields, formFields); - } - - private getFormFieldsValuesIncludingDisabled() { - return this.formGroup.getRawValue(); - } - -} diff --git a/src/app/shared/substitutor/label-substitutor.module.ts b/src/app/shared/substitutor/label-substitutor.module.ts deleted file mode 100644 index 9b27ede34..000000000 --- a/src/app/shared/substitutor/label-substitutor.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { NgModule } from '@angular/core'; -import { LabelSubstitutorDirective } from './label-substitutor.directive'; -import { FieldsUtils } from '../utils/fields.utils'; -import { CurrencyPipe } from '@angular/common'; - -@NgModule({ - declarations: [ - LabelSubstitutorDirective - ], - exports: [ - LabelSubstitutorDirective - ], - providers: [ - FieldsUtils, - CurrencyPipe, - ] -}) -export class LabelSubstitutorModule {} diff --git a/src/app/shared/utils/case-reference.pipe.spec.ts b/src/app/shared/utils/case-reference.pipe.spec.ts deleted file mode 100644 index b6e3c1e0f..000000000 --- a/src/app/shared/utils/case-reference.pipe.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { CaseReferencePipe } from './case-reference.pipe'; - -describe('CaseReferencePipe', () => { - - let caseReference: CaseReferencePipe; - - beforeEach(() => { - caseReference = new CaseReferencePipe(); - }); - - it('should hyphenate every 4th digit of case reference', () => { - expect(caseReference.transform('1234567890123456')).toBe('1234-5678-9012-3456'); - }); - - it('should return DRAFT case reference looks like a draft Id', () => { - expect(caseReference.transform('DRAFT123456789')).toBe('DRAFT'); - }); -}); diff --git a/src/app/shared/utils/case-reference.pipe.ts b/src/app/shared/utils/case-reference.pipe.ts deleted file mode 100644 index 45aba71c6..000000000 --- a/src/app/shared/utils/case-reference.pipe.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; -import { Draft } from '../domain/draft'; - -@Pipe({ - name: 'ccdCaseReference' -}) -export class CaseReferencePipe implements PipeTransform { - - transform(caseReference: string): string { - if (Draft.isDraft(caseReference)) { - return Draft.DRAFT_PREFIX; - } else { - return String(caseReference).replace(/(\d{4})(\d{4})(\d{4})(\d{4})/, '$1-$2-$3-$4'); - } - } -} diff --git a/src/app/shared/utils/fields.purger.ts b/src/app/shared/utils/fields.purger.ts deleted file mode 100644 index c4b996ea8..000000000 --- a/src/app/shared/utils/fields.purger.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { Injectable } from '@angular/core'; -import { CaseField } from '../domain/definition/case-field.model'; -import { FormBuilder, FormGroup, FormArray, Validators } from '@angular/forms'; -import { WizardPage } from '../domain/wizard-page.model'; -import { ShowCondition } from '../conditional-show/conditional-show.model'; -import { FieldsUtils } from '../utils/fields.utils'; -import { Predicate } from '../predicate'; - -@Injectable() -export class FieldsPurger { - - constructor( - private fieldsUtils: FieldsUtils, - ) {} - - clearHiddenFields(form, wizard, eventTrigger, currentPageId) { - this.clearHiddenFieldForFieldShowCondition(currentPageId, form, wizard, eventTrigger); - this.clearHiddenFieldForPageShowCondition(form, wizard); - } - - private clearHiddenFieldForPageShowCondition(form, wizard) { - let formFields = form.getRawValue(); - wizard.pages.forEach(wp => { - if (this.hasShowConditionPage(wp, formFields)) { - let condition = new ShowCondition(wp.show_condition); - if (this.isHidden(condition, formFields)) { - this.resetPage(form, wp); - } - } - }); - } - - private clearHiddenFieldForFieldShowCondition(currentPageId, form, wizard, eventTrigger) { - let formFields = form.getRawValue(); - let currentPage: WizardPage = wizard.getPage(currentPageId, this.fieldsUtils.buildCanShowPredicate(eventTrigger, form)); - currentPage.wizard_page_fields.forEach(wpf => { - let case_field = this.findCaseFieldByWizardPageFieldId(currentPage, wpf); - if (this.hasShowConditionField(case_field, formFields)) { - let condition = new ShowCondition(case_field.show_condition); - if (this.isHidden(condition, formFields)) { - this.resetField(form, case_field); - } - } - }); - } - - private isHidden(condition, formFields) { - return !condition.match(formFields.data); - } - - private findCaseFieldByWizardPageFieldId(currentPage, wizardPageField) { - return currentPage.case_fields.find(cf => cf.id === wizardPageField.case_field_id); - } - - private hasShowConditionPage(wizardPage, formFields): boolean { - return wizardPage.show_condition && formFields.data[this.getShowConditionKey(wizardPage.show_condition)]; - } - - private hasShowConditionField(case_field, formFields): boolean { - return case_field.show_condition && formFields.data[this.getShowConditionKey(case_field.show_condition)]; - } - - private getShowConditionKey(show_condition) { - return show_condition.split('=')[0]; - } - - private resetField(form, field) { - if (Array.isArray(field.value)) { - field.value.splice(0, field.value.length); - } else if (this.isObject(field.value)) { - field.value = {}; - } else { - field.value = ''; - } - (form.get('data') as FormGroup).removeControl(field.id); - } - - private resetPage(form, wizardPage: WizardPage) { - wizardPage.wizard_page_fields.forEach(wpf => { - let case_field = this.findCaseFieldByWizardPageFieldId(wizardPage, wpf); - this.resetField(form, case_field); - }); - } - - private getType(elem): string { - return Object.prototype.toString.call(elem).slice(8, -1); - } - - private isObject(elem) { - return this.getType(elem) === 'Object'; - }; -} diff --git a/src/app/shared/utils/fields.utils.ts b/src/app/shared/utils/fields.utils.ts deleted file mode 100644 index 730715b27..000000000 --- a/src/app/shared/utils/fields.utils.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { Injectable } from '@angular/core'; -import { CaseField } from '../domain/definition/case-field.model'; -import { CurrencyPipe, } from '@angular/common'; -import { DatePipe } from '../palette/utils/date.pipe'; -import { WizardPage } from '../domain/wizard-page.model'; -import { Predicate } from '../predicate'; - -@Injectable() -export class FieldsUtils { - - private static readonly currencyPipe: CurrencyPipe = new CurrencyPipe('en-GB'); - private static readonly datePipe: DatePipe = new DatePipe(); - public static readonly LABEL_SUFFIX = '-LABEL'; - - public static toValuesMap(caseFields: CaseField[]): any { - let valueMap = {}; - caseFields.forEach(field => { - valueMap[field.id] = field.value; - }); - return valueMap; - } - - private static readonly DEFAULT_MERGE_FUNCTION = function mergeFunction(field: CaseField, result: any) { - if (!result.hasOwnProperty(field.id)) { - result[field.id] = field.value; - } - }; - - private static readonly LABEL_MERGE_FUNCTION = function mergeFunction(field: CaseField, result: any) { - if (!result.hasOwnProperty(field.id)) { - result[field.id] = field.value; - } - switch (field.field_type.type) { - case 'FixedList': { - result[field.id] = FieldsUtils.getFixedListLabelByCodeOrEmpty(field, result[field.id] || field.value); - break; - } - case 'MultiSelectList': { - let fieldValue = result[field.id] || []; - result[field.id + FieldsUtils.LABEL_SUFFIX] = []; - fieldValue.forEach((code, idx) => { - result[field.id + FieldsUtils.LABEL_SUFFIX][idx] = FieldsUtils.getFixedListLabelByCodeOrEmpty(field, code); - }); - break; - } - case 'MoneyGBP': { - let fieldValue = (result[field.id] || field.value); - result[field.id] = FieldsUtils.getMoneyGBP(fieldValue); - break; - } - case 'Date': { - let fieldValue = (result[field.id] || field.value); - result[field.id] = FieldsUtils.getDate(fieldValue); - break; - } - case 'Collection': { - let elements = (result[field.id] || field.value); - if (elements) { - elements.forEach(elem => { - switch (field.field_type.collection_field_type.type) { - case 'MoneyGBP': { - elem.value = FieldsUtils.getMoneyGBP(elem.value); - break; - } - case 'Date': { - elem.value = FieldsUtils.getDate(elem.value); - break; - } - } - }); - } - break; - } - } - }; - - private static getMoneyGBP(fieldValue) { - return fieldValue ? FieldsUtils.currencyPipe.transform(fieldValue / 100, 'GBP', 'symbol') : fieldValue; - } - - private static getDate(fieldValue) { - try { - return FieldsUtils.datePipe.transform(fieldValue, null, 'dd-MM-yyyy'); - } catch (e) { - return this.textForInvalidField('Date', fieldValue); - } - } - - private static getFixedListLabelByCodeOrEmpty(field, code) { - let relevantItem = code ? field.field_type.fixed_list_items.find(item => item.code === code) : ''; - return relevantItem ? relevantItem.label : ''; - } - - private static textForInvalidField(type: string, invalidValue: string): string { - return `{ Invalid ${type}: ${invalidValue} }`; - } - - public buildCanShowPredicate(eventTrigger, form): Predicate { - let currentState = this.mergeCaseFieldsAndFormFields(eventTrigger.case_fields, form.controls['data'].value); - return (page: WizardPage): boolean => { - return page.parsedShowCondition.match(currentState); - }; - } - - mergeCaseFieldsAndFormFields(caseFields: CaseField[], formFields: any): any { - return this.mergeFields(caseFields, formFields, FieldsUtils.DEFAULT_MERGE_FUNCTION); - } - - mergeLabelCaseFieldsAndFormFields(caseFields: CaseField[], formFields: any): any { - return this.mergeFields(caseFields, formFields, FieldsUtils.LABEL_MERGE_FUNCTION); - } - - private mergeFields(caseFields: CaseField[], formFields: any, mergeFunction: (CaseField, any) => void) { - let result = this.cloneObject(formFields); - caseFields.forEach(field => { - mergeFunction(field, result); - }); - return result; - } - - private cloneObject(obj: any): any { - return Object.assign({}, obj); - } - -} diff --git a/src/app/shared/utils/shared-utils.module.ts b/src/app/shared/utils/shared-utils.module.ts deleted file mode 100644 index c4d709ae7..000000000 --- a/src/app/shared/utils/shared-utils.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { CaseReferencePipe } from './case-reference.pipe'; - -@NgModule({ - imports: [ - CommonModule, - ], - declarations: [ - CaseReferencePipe, - ], - exports: [ - CaseReferencePipe, - ] -}) -export class SharedUtilsModule {} diff --git a/src/app/workbasket/filters/workbasket-filters.component.spec.ts b/src/app/workbasket/filters/workbasket-filters.component.spec.ts index 72a8414e8..952fd7bc8 100644 --- a/src/app/workbasket/filters/workbasket-filters.component.spec.ts +++ b/src/app/workbasket/filters/workbasket-filters.component.spec.ts @@ -5,18 +5,16 @@ import { By } from '@angular/platform-browser'; import { Jurisdiction } from '../../shared/domain/definition/jurisdiction.model'; import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { ActivatedRoute, Router } from '@angular/router'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import 'rxjs/add/operator/do'; import { JurisdictionService } from '../../shared/jurisdiction.service'; import { CaseType } from '../../shared/domain/definition/case-type.model'; import { AlertService } from '../../core/alert/alert.service'; -import { OrderService } from '../../core/order/order.service'; import { WorkbasketInputFilterService } from '../workbasket-input-filter.service'; -import { AbstractFieldWriteComponent } from '../../shared/palette/base-field/abstract-field-write.component'; import { WorkbasketInputModel } from '../workbasket-input.model'; -import { FieldTypeEnum } from '../../shared/domain/definition/field-type-enum.model'; import { WindowService } from '../../core/utils/window.service'; import createSpyObj = jasmine.createSpyObj; +import { AbstractFieldWriteComponent, FieldTypeEnum, OrderService } from '@hmcts/ccd-case-ui-toolkit'; @Component({ selector: 'ccd-field-write', @@ -213,25 +211,26 @@ describe('WorkbasketFiltersComponent', () => { { provide: WindowService, useValue: windowService }, ] }) - .compileComponents(); - - fixture = TestBed.createComponent(WorkbasketFiltersComponent); - component = fixture.componentInstance; - - component.jurisdictions = [ - JURISDICTION_1, - JURISDICTION_2 - ]; - component.formGroup = TEST_FORM_GROUP; - component.defaults = { - jurisdiction_id: JURISDICTION_2.id, - case_type_id: DEFAULT_CASE_TYPE.id, - state_id: DEFAULT_CASE_STATE.id - }; - component.onApply.subscribe(workbasketHandler.applyFilters); - - de = fixture.debugElement; - fixture.detectChanges(); + .compileComponents() + .then(() => { + fixture = TestBed.createComponent(WorkbasketFiltersComponent); + component = fixture.componentInstance; + + component.jurisdictions = [ + JURISDICTION_1, + JURISDICTION_2 + ]; + component.formGroup = TEST_FORM_GROUP; + component.defaults = { + jurisdiction_id: JURISDICTION_2.id, + case_type_id: DEFAULT_CASE_TYPE.id, + state_id: DEFAULT_CASE_STATE.id + }; + component.onApply.subscribe(workbasketHandler.applyFilters); + + de = fixture.debugElement; + fixture.detectChanges(); + }); })); afterEach(async(() => { windowService.clearLocalStorage(); @@ -399,12 +398,16 @@ describe('WorkbasketFiltersComponent', () => { fixture.detectChanges(); let button = de.query($APPLY_BUTTON); - expect(button.nativeElement.disabled).toBeTruthy(); + fixture + .whenStable() + .then(() => { - component.selected.jurisdiction = JURISDICTION_1; - component.onJurisdictionIdChange(); - expect(component.workbasketInputsReady).toBeFalsy(); + expect(button.nativeElement.disabled).toBeTruthy(); + component.selected.jurisdiction = JURISDICTION_1; + component.onJurisdictionIdChange(); + expect(component.workbasketInputsReady).toBeFalsy(); + }); })); it('should have form group details added when apply button is clicked ', async(() => { @@ -539,25 +542,25 @@ describe('WorkbasketFiltersComponent', () => { { provide: WindowService, useValue: windowService } ] }) - .compileComponents(); - - fixture = TestBed.createComponent(WorkbasketFiltersComponent); - component = fixture.componentInstance; - //JURISDICTION_2.caseTypes = CRUD_FILTERED_CASE_TYPES; - component.jurisdictions = [ - JURISDICTION_1, - JURISDICTION_2 - ]; - component.formGroup = TEST_FORM_GROUP; - component.defaults = { - jurisdiction_id: JURISDICTION_2.id, - case_type_id: CASE_TYPES_2[1].id, - state_id: CASE_TYPES_2[1].states[1].id - }; - component.onApply.subscribe(workbasketHandler.applyFilters); - - de = fixture.debugElement; - fixture.detectChanges(); + .compileComponents() + .then(() => { + fixture = TestBed.createComponent(WorkbasketFiltersComponent); + component = fixture.componentInstance; + component.jurisdictions = [ + JURISDICTION_1, + JURISDICTION_2 + ]; + component.formGroup = TEST_FORM_GROUP; + component.defaults = { + jurisdiction_id: JURISDICTION_2.id, + case_type_id: CASE_TYPES_2[1].id, + state_id: CASE_TYPES_2[1].states[1].id + }; + component.onApply.subscribe(workbasketHandler.applyFilters); + + de = fixture.debugElement; + fixture.detectChanges(); + }); })); afterEach(async(() => { windowService.clearLocalStorage(); @@ -639,25 +642,26 @@ describe('WorkbasketFiltersComponent', () => { { provide: WindowService, useValue: windowService } ] }) - .compileComponents(); - - fixture = TestBed.createComponent(WorkbasketFiltersComponent); - component = fixture.componentInstance; - - component.jurisdictions = [ - JURISDICTION_1, - JURISDICTION_2 - ]; - component.formGroup = TEST_FORM_GROUP; - component.defaults = { - jurisdiction_id: JURISDICTION_2.id, - case_type_id: CRUD_FILTERED_CASE_TYPES[0].id, - state_id: CRUD_FILTERED_CASE_TYPES[0].states[0].id - }; - component.onApply.subscribe(workbasketHandler.applyFilters); - - de = fixture.debugElement; - fixture.detectChanges(); + .compileComponents() + .then(() => { + fixture = TestBed.createComponent(WorkbasketFiltersComponent); + component = fixture.componentInstance; + + component.jurisdictions = [ + JURISDICTION_1, + JURISDICTION_2 + ]; + component.formGroup = TEST_FORM_GROUP; + component.defaults = { + jurisdiction_id: JURISDICTION_2.id, + case_type_id: CRUD_FILTERED_CASE_TYPES[0].id, + state_id: CRUD_FILTERED_CASE_TYPES[0].states[0].id + }; + component.onApply.subscribe(workbasketHandler.applyFilters); + + de = fixture.debugElement; + fixture.detectChanges(); + }); })); afterEach(async(() => { windowService.clearLocalStorage(); @@ -714,25 +718,26 @@ describe('WorkbasketFiltersComponent', () => { { provide: WindowService, useValue: windowService } ] }) - .compileComponents(); - - fixture = TestBed.createComponent(WorkbasketFiltersComponent); - component = fixture.componentInstance; - - component.jurisdictions = [ - JURISDICTION_1, - JURISDICTION_2 - ]; - component.formGroup = TEST_FORM_GROUP; - component.defaults = { - jurisdiction_id: JURISDICTION_2.id, - case_type_id: CRUD_FILTERED_CASE_TYPES[1].id, - state_id: CRUD_FILTERED_CASE_TYPES[0].states[0].id - }; - component.onApply.subscribe(workbasketHandler.applyFilters); - - de = fixture.debugElement; - fixture.detectChanges(); + .compileComponents() + .then(() => { + fixture = TestBed.createComponent(WorkbasketFiltersComponent); + component = fixture.componentInstance; + + component.jurisdictions = [ + JURISDICTION_1, + JURISDICTION_2 + ]; + component.formGroup = TEST_FORM_GROUP; + component.defaults = { + jurisdiction_id: JURISDICTION_2.id, + case_type_id: CRUD_FILTERED_CASE_TYPES[1].id, + state_id: CRUD_FILTERED_CASE_TYPES[0].states[0].id + }; + component.onApply.subscribe(workbasketHandler.applyFilters); + + de = fixture.debugElement; + fixture.detectChanges(); + }); })); afterEach(async(() => { windowService.clearLocalStorage(); @@ -795,26 +800,26 @@ describe('WorkbasketFiltersComponent', () => { { provide: WindowService, useValue: windowService } ] }) - .compileComponents(); - - fixture = TestBed.createComponent(WorkbasketFiltersComponent); - component = fixture.componentInstance; - - component.jurisdictions = [ - JURISDICTION_1, - JURISDICTION_2 - ]; - component.formGroup = TEST_FORM_GROUP; - - component.defaults = { - jurisdiction_id: JURISDICTION_2.id, - case_type_id: DEFAULT_CASE_TYPE.id, - state_id: DEFAULT_CASE_STATE.id - }; - component.onApply.subscribe(workbasketHandler.applyFilters); - - de = fixture.debugElement; - fixture.detectChanges(); + .compileComponents() + .then(() => { + fixture = TestBed.createComponent(WorkbasketFiltersComponent); + component = fixture.componentInstance; + + component.jurisdictions = [ + JURISDICTION_1, + JURISDICTION_2 + ]; + component.formGroup = TEST_FORM_GROUP; + component.defaults = { + jurisdiction_id: JURISDICTION_2.id, + case_type_id: DEFAULT_CASE_TYPE.id, + state_id: DEFAULT_CASE_STATE.id + }; + component.onApply.subscribe(workbasketHandler.applyFilters); + + de = fixture.debugElement; + fixture.detectChanges(); + }); })); afterEach(async(() => { windowService.clearLocalStorage(); @@ -892,25 +897,26 @@ describe('WorkbasketFiltersComponent', () => { { provide: WindowService, useValue: windowService } ] }) - .compileComponents(); - - fixture = TestBed.createComponent(WorkbasketFiltersComponent); - component = fixture.componentInstance; - - component.jurisdictions = [ - JURISDICTION_1, - JURISDICTION_2 - ]; - component.formGroup = TEST_FORM_GROUP; - component.defaults = { - jurisdiction_id: JURISDICTION_2.id, - case_type_id: DEFAULT_CASE_TYPE.id, - state_id: DEFAULT_CASE_STATE.id - }; - component.onApply.subscribe(workbasketHandler.applyFilters); - - de = fixture.debugElement; - fixture.detectChanges(); + .compileComponents() + .then(() => { + fixture = TestBed.createComponent(WorkbasketFiltersComponent); + component = fixture.componentInstance; + + component.jurisdictions = [ + JURISDICTION_1, + JURISDICTION_2 + ]; + component.formGroup = TEST_FORM_GROUP; + component.defaults = { + jurisdiction_id: JURISDICTION_2.id, + case_type_id: DEFAULT_CASE_TYPE.id, + state_id: DEFAULT_CASE_STATE.id + }; + component.onApply.subscribe(workbasketHandler.applyFilters); + + de = fixture.debugElement; + fixture.detectChanges(); + }); })); it('should initially NOT select anything if jurisdiction is invalid and no case types', () => { diff --git a/src/app/workbasket/filters/workbasket-filters.component.ts b/src/app/workbasket/filters/workbasket-filters.component.ts index 0cc68b582..06f215330 100644 --- a/src/app/workbasket/filters/workbasket-filters.component.ts +++ b/src/app/workbasket/filters/workbasket-filters.component.ts @@ -6,11 +6,11 @@ import { CaseType } from '../../shared/domain/definition/case-type.model'; import { JurisdictionService } from '../../shared/jurisdiction.service'; import { ActivatedRoute, ActivatedRouteSnapshot, Router } from '@angular/router'; import { FormGroup } from '@angular/forms'; -import { OrderService } from '../../core/order/order.service'; import { WorkbasketInputFilterService } from '../workbasket-input-filter.service'; import { WorkbasketInputModel } from '../workbasket-input.model'; import { AlertService } from '../../core/alert/alert.service'; import 'rxjs/add/operator/do'; +import { OrderService } from '@hmcts/ccd-case-ui-toolkit'; @Component({ selector: 'ccd-workbasket-filters', diff --git a/src/app/workbasket/workbasket-input-filter.service.spec.ts b/src/app/workbasket/workbasket-input-filter.service.spec.ts index d3fe0bfd4..4bf222447 100644 --- a/src/app/workbasket/workbasket-input-filter.service.spec.ts +++ b/src/app/workbasket/workbasket-input-filter.service.spec.ts @@ -1,11 +1,11 @@ import { Response, ResponseOptions } from '@angular/http'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { WorkbasketInputFilterService } from './workbasket-input-filter.service'; import { AppConfig } from '../app.config'; -import { HttpService } from '../core/http/http.service'; import { WindowService } from '../core/utils/window.service'; import { WorkbasketInputModel } from './workbasket-input.model'; import createSpyObj = jasmine.createSpyObj; +import { HttpService } from '@hmcts/ccd-case-ui-toolkit'; describe('DefinitionsService', () => { const API_DATA_URL = 'http://data.ccd.reform/aggregated'; diff --git a/src/app/workbasket/workbasket-input-filter.service.ts b/src/app/workbasket/workbasket-input-filter.service.ts index 82dbf213d..98b6116fc 100644 --- a/src/app/workbasket/workbasket-input-filter.service.ts +++ b/src/app/workbasket/workbasket-input-filter.service.ts @@ -1,9 +1,9 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import 'rxjs/add/operator/map'; -import { HttpService } from '../core/http/http.service'; import { AppConfig } from '../app.config'; import { WorkbasketInputModel } from './workbasket-input.model'; +import { HttpService } from '@hmcts/ccd-case-ui-toolkit'; @Injectable() export class WorkbasketInputFilterService { diff --git a/src/app/workbasket/workbasket-input.model.ts b/src/app/workbasket/workbasket-input.model.ts index ecb83af54..d7678fa0d 100644 --- a/src/app/workbasket/workbasket-input.model.ts +++ b/src/app/workbasket/workbasket-input.model.ts @@ -1,4 +1,4 @@ -import { Orderable } from '../core/order/orderable.model'; +import { Orderable } from '@hmcts/ccd-case-ui-toolkit'; import { Field } from '../core/search/field.model'; export class WorkbasketInputModel implements Orderable { diff --git a/src/app/workbasket/workbasket.component.spec.ts b/src/app/workbasket/workbasket.component.spec.ts index 6b21e26a8..d297f8344 100644 --- a/src/app/workbasket/workbasket.component.spec.ts +++ b/src/app/workbasket/workbasket.component.spec.ts @@ -9,7 +9,7 @@ import { SearchService } from '../core/search/search.service'; import { WindowService } from '../core/utils/window.service'; import { JurisdictionService } from '../shared/jurisdiction.service'; import { SearchResultView } from '../shared/search/search-result-view.model'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { Jurisdiction } from '../shared/domain/definition/jurisdiction.model'; import { CaseState } from '../shared/domain/definition/case-state.model'; import { PaginationService } from '../core/pagination/pagination.service'; diff --git a/src/app/workbasket/workbasket.component.ts b/src/app/workbasket/workbasket.component.ts index 74950c9a1..b2befa1a8 100644 --- a/src/app/workbasket/workbasket.component.ts +++ b/src/app/workbasket/workbasket.component.ts @@ -12,7 +12,7 @@ import { PaginationService } from '../core/pagination/pagination.service'; import { CaseType } from '../shared/domain/definition/case-type.model'; import { FormGroup } from '@angular/forms'; import { SearchResultComponent } from '../shared/search/search-result.component'; -import { Observable } from 'rxjs/Observable'; +import { Observable } from 'rxjs'; import { AlertService } from '../core/alert/alert.service'; import { plainToClass } from 'class-transformer'; diff --git a/src/app/workbasket/workbasket.module.ts b/src/app/workbasket/workbasket.module.ts index a3ea0ce32..ce3ff6c0a 100644 --- a/src/app/workbasket/workbasket.module.ts +++ b/src/app/workbasket/workbasket.module.ts @@ -6,7 +6,7 @@ import { WorkbasketFiltersComponent } from './filters/workbasket-filters.compone import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { SharedModule } from '../shared/shared.module'; import { CaseUIToolkitModule } from '@hmcts/ccd-case-ui-toolkit'; -import { PaletteModule } from '../shared/palette/palette.module'; +import { PaletteModule } from '@hmcts/ccd-case-ui-toolkit'; @NgModule({ imports: [ diff --git a/src/polyfills.ts b/src/polyfills.ts index 1020a4d1c..3af717116 100644 --- a/src/polyfills.ts +++ b/src/polyfills.ts @@ -19,7 +19,7 @@ */ /** IE9, IE10 and IE11 requires all of the following polyfills. **/ -// import 'core-js/es6/symbol'; +import 'core-js/es6/symbol'; import 'core-js/es6/object'; // import 'core-js/es6/function'; // import 'core-js/es6/parse-int'; diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json index 18bad40ed..bfc96054b 100644 --- a/src/tsconfig.spec.json +++ b/src/tsconfig.spec.json @@ -4,10 +4,13 @@ "outDir": "../out-tsc/spec", "baseUrl": "./", "module": "commonjs", - "target": "es5", "types": [ "jasmine", "node" + ], + "lib": [ + "es2015", + "dom" ] }, "files": [ diff --git a/test/functional-tests/config/conf.js b/test/functional-tests/config/conf.js index f947c50f3..5aac9d403 100644 --- a/test/functional-tests/config/conf.js +++ b/test/functional-tests/config/conf.js @@ -57,4 +57,5 @@ exports.config = { SELENIUM_PROMISE_MANAGER: false, + allScriptsTimeout: 30000 }; diff --git a/test/functional-tests/pageObjects/caseListPage.js b/test/functional-tests/pageObjects/caseListPage.js index 094218c9c..e8f414030 100644 --- a/test/functional-tests/pageObjects/caseListPage.js +++ b/test/functional-tests/pageObjects/caseListPage.js @@ -21,7 +21,7 @@ class CaseListPage extends BasePage { //As we are now on the CCD landing page, we can set this to false and make use of protractor angular functionality - browser.ignoreSynchronization = false; + // browser.ignoreSynchronization = false; } diff --git a/test/page-objects/login.po.js b/test/page-objects/login.po.js index 36cae7ec1..3f8fe5b87 100644 --- a/test/page-objects/login.po.js +++ b/test/page-objects/login.po.js @@ -35,7 +35,7 @@ class Login extends BrowserUtils { } clickSignIn() { - + //browser.wait(10000); element(this._signIn).click(); } diff --git a/tsconfig.json b/tsconfig.json index a6c016bf3..50d188322 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,6 +12,8 @@ "node_modules/@types" ], "lib": [ + "es2015", + "es5", "es2017", "dom" ] diff --git a/yarn.lock b/yarn.lock index bd24f38c5..70f1d3e53 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,14 +9,14 @@ "@angular-devkit/core" "0.6.8" rxjs "^6.0.0" -"@angular-devkit/architect@0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.7.1.tgz#c1e999f6565e4596d0912ea30c190981f79a9481" +"@angular-devkit/architect@0.8.4": + version "0.8.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.8.4.tgz#095b382908d7dfaa2f64edfe93555dfac42957aa" dependencies: - "@angular-devkit/core" "0.7.1" - rxjs "^6.0.0" + "@angular-devkit/core" "0.8.4" + rxjs "~6.2.0" -"@angular-devkit/build-angular@~0.6.8": +"@angular-devkit/build-angular@^0.6.8": version "0.6.8" resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.6.8.tgz#ea108509f970efc9cd9087a47894c0164dd2d0c0" dependencies: @@ -91,228 +91,214 @@ rxjs "^6.0.0" source-map "^0.5.6" -"@angular-devkit/core@0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-0.7.1.tgz#a8c2ef8cca34d6918ebe618317fee5b0ec84a1e9" +"@angular-devkit/core@0.8.4": + version "0.8.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-0.8.4.tgz#ccc73308990c7bc912e2f2759bf29e069eabf42f" dependencies: ajv "~6.4.0" chokidar "^2.0.3" - rxjs "^6.0.0" + rxjs "~6.2.0" source-map "^0.5.6" -"@angular-devkit/schematics@0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-0.7.1.tgz#4b805c66e38f09553ee953e4c81f993432a582fe" +"@angular-devkit/schematics@0.8.4": + version "0.8.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-0.8.4.tgz#e19f6fc8b1e88277d921a286914dc9d01f139738" dependencies: - "@angular-devkit/core" "0.7.1" - rxjs "^6.0.0" + "@angular-devkit/core" "0.8.4" + rxjs "~6.2.0" -"@angular/animations@~6.0.6": - version "6.0.9" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-6.0.9.tgz#c077b8d7542117e42365e14f0f030ea9f9a7db78" +"@angular/animations@~6.1.8": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-6.1.9.tgz#1d87469e6f6b89a8713570dfbe97700ea85bd007" dependencies: tslib "^1.9.0" "@angular/cdk@^6.3.0": - version "6.4.2" - resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-6.4.2.tgz#e623cdbbe6258980b0fa93beafce0ea7c4e2c17b" + version "6.4.7" + resolved "https://registry.yarnpkg.com/@angular/cdk/-/cdk-6.4.7.tgz#1549b304dd412e82bd854cc55a7d5c6772ee0411" dependencies: tslib "^1.7.1" "@angular/cli@^6.0.8": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-6.1.1.tgz#a5d56ad2fbff71bead6b62d0000b1dda4099613d" - dependencies: - "@angular-devkit/architect" "0.7.1" - "@angular-devkit/core" "0.7.1" - "@angular-devkit/schematics" "0.7.1" - "@schematics/angular" "0.7.1" - "@schematics/update" "0.7.1" + version "6.2.4" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-6.2.4.tgz#e292a5e4d3184a40caec0337d8bc3cd597c5f292" + dependencies: + "@angular-devkit/architect" "0.8.4" + "@angular-devkit/core" "0.8.4" + "@angular-devkit/schematics" "0.8.4" + "@schematics/angular" "0.8.4" + "@schematics/update" "0.8.4" + json-schema-traverse "^0.4.1" opn "^5.3.0" - rxjs "^6.0.0" + rxjs "~6.2.0" semver "^5.1.0" symbol-observable "^1.2.0" yargs-parser "^10.0.0" -"@angular/common@~6.0.6": - version "6.0.9" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-6.0.9.tgz#e12fc4ea74cdb9f007af1098d3573c8d5441680a" +"@angular/common@~6.1.8": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-6.1.9.tgz#638fa8e8e30626116ea9ea36e6f2f00fed971f77" dependencies: tslib "^1.9.0" -"@angular/compiler-cli@~6.0.6": - version "6.0.9" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-6.0.9.tgz#a4b48b37d8b3dd8d702e034d4f062596d048a8a2" +"@angular/compiler-cli@~6.1.8": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-6.1.9.tgz#9ac56fc3ea274c897ccbb3c3fe0aaa100c01137d" dependencies: chokidar "^1.4.2" minimist "^1.2.0" reflect-metadata "^0.1.2" - tsickle "^0.29.0" + tsickle "^0.32.1" -"@angular/compiler@~6.0.6": - version "6.0.9" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-6.0.9.tgz#7d4fbb08f88cbef7cff78e11a9474e8df5516bee" +"@angular/compiler@~6.1.8": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-6.1.9.tgz#3696659f752b5e239f5186cea72cf17965b59cb8" dependencies: tslib "^1.9.0" -"@angular/core@~6.0.6": - version "6.0.9" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-6.0.9.tgz#a68cc0f5ddffa535df65f3e798ba2fcd6f6eec1b" +"@angular/core@~6.1.8": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-6.1.9.tgz#a21a35de551c95f276ecbb1f314949cc69326950" dependencies: tslib "^1.9.0" -"@angular/forms@~6.0.6": - version "6.0.9" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-6.0.9.tgz#4252626875319f09e03d6b5eb61ea8d274061b8f" +"@angular/forms@~6.1.8": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-6.1.9.tgz#d9d8591f4c74270e53e3184eb45e19ba490fdf32" dependencies: tslib "^1.9.0" -"@angular/http@~6.0.6": - version "6.0.9" - resolved "https://registry.yarnpkg.com/@angular/http/-/http-6.0.9.tgz#199c04cc0085bbeba44b9832ba029848c376d5a9" +"@angular/http@~6.1.8": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@angular/http/-/http-6.1.9.tgz#241f35207d62f86bc155feb124a1e73515d66fb6" dependencies: tslib "^1.9.0" "@angular/material@^6.3.0": - version "6.4.2" - resolved "https://registry.yarnpkg.com/@angular/material/-/material-6.4.2.tgz#f39529d56bad97f0470b886c3f30591b9d3a7d05" + version "6.4.7" + resolved "https://registry.yarnpkg.com/@angular/material/-/material-6.4.7.tgz#3c8f2d6a6a7904d97be29e06a84ffb62a8da6c16" dependencies: tslib "^1.7.1" optionalDependencies: parse5 "^5.0.0" -"@angular/platform-browser-dynamic@~6.0.6": - version "6.0.9" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-6.0.9.tgz#237fff728a518cc8fb89094638ff32c40d310374" +"@angular/platform-browser-dynamic@~6.1.8": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-6.1.9.tgz#e00f1a4948b4c299b17c9561d83f7ea588117818" dependencies: tslib "^1.9.0" -"@angular/platform-browser@~6.0.6": - version "6.0.9" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-6.0.9.tgz#3f6738046eca03fffdd4558ab3ca75673b6f11d1" +"@angular/platform-browser@~6.1.8": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-6.1.9.tgz#6c832e528c660ad880a16531754e65b9b97d4f9f" dependencies: tslib "^1.9.0" -"@angular/platform-server@~6.0.6": - version "6.0.9" - resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-6.0.9.tgz#b0fcdb46761aba4523f7ee21869247148ba1e1f3" +"@angular/platform-server@~6.1.8": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-6.1.9.tgz#431f40278b52779825d5e087283b5d823d72c29d" dependencies: domino "^2.0.1" tslib "^1.9.0" xhr2 "^0.1.4" -"@angular/router@~6.0.6": - version "6.0.9" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-6.0.9.tgz#c40572031c7ff2e1dfb5279a8cb508b962a85262" +"@angular/router@~6.1.8": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-6.1.9.tgz#29869e53442703c53a943ce375cbb0a0f36927fb" dependencies: tslib "^1.9.0" -"@angular/upgrade@~6.0.6": - version "6.0.9" - resolved "https://registry.yarnpkg.com/@angular/upgrade/-/upgrade-6.0.9.tgz#d04ec65f951fbddf50a51d681b477e9a6370200e" +"@angular/upgrade@~6.1.8": + version "6.1.9" + resolved "https://registry.yarnpkg.com/@angular/upgrade/-/upgrade-6.1.9.tgz#fe288f2818692d310c84fd040b676afa5b80fc9e" dependencies: tslib "^1.9.0" -"@babel/code-frame@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.51.tgz#bd71d9b192af978df915829d39d4094456439a0c" - dependencies: - "@babel/highlight" "7.0.0-beta.51" - -"@babel/code-frame@^7.0.0-beta.35": - version "7.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-rc.1.tgz#5c2154415d6c09959a71845ef519d11157e95d10" +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.0.0-beta.35": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" dependencies: - "@babel/highlight" "7.0.0-rc.1" + "@babel/highlight" "^7.0.0" -"@babel/generator@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.51.tgz#6c7575ffde761d07485e04baedc0392c6d9e30f6" +"@babel/generator@^7.0.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.2.tgz#fde75c072575ce7abbd97322e8fef5bae67e4630" dependencies: - "@babel/types" "7.0.0-beta.51" + "@babel/types" "^7.1.2" jsesc "^2.5.1" - lodash "^4.17.5" + lodash "^4.17.10" source-map "^0.5.0" trim-right "^1.0.1" -"@babel/helper-function-name@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.51.tgz#21b4874a227cf99ecafcc30a90302da5a2640561" - dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.51" - "@babel/template" "7.0.0-beta.51" - "@babel/types" "7.0.0-beta.51" - -"@babel/helper-get-function-arity@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.51.tgz#3281b2d045af95c172ce91b20825d85ea4676411" +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" dependencies: - "@babel/types" "7.0.0-beta.51" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" -"@babel/helper-split-export-declaration@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.51.tgz#8a6c3f66c4d265352fc077484f9f6e80a51ab978" +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" dependencies: - "@babel/types" "7.0.0-beta.51" + "@babel/types" "^7.0.0" -"@babel/highlight@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.51.tgz#e8844ae25a1595ccfd42b89623b4376ca06d225d" +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" + "@babel/types" "^7.0.0" -"@babel/highlight@7.0.0-rc.1": - version "7.0.0-rc.1" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-rc.1.tgz#e0ca4731fa4786f7b9500421d6ff5e5a7753e81e" +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" dependencies: chalk "^2.0.0" esutils "^2.0.2" - js-tokens "^3.0.0" + js-tokens "^4.0.0" -"@babel/parser@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0-beta.51.tgz#27cec2df409df60af58270ed8f6aa55409ea86f6" +"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.2.tgz#85c5c47af6d244fab77bce6b9bd830e38c978409" -"@babel/template@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.51.tgz#9602a40aebcf357ae9677e2532ef5fc810f5fbff" +"@babel/template@^7.0.0", "@babel/template@^7.1.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" dependencies: - "@babel/code-frame" "7.0.0-beta.51" - "@babel/parser" "7.0.0-beta.51" - "@babel/types" "7.0.0-beta.51" - lodash "^4.17.5" + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.1.2" + "@babel/types" "^7.1.2" -"@babel/traverse@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.51.tgz#981daf2cec347a6231d3aa1d9e1803b03aaaa4a8" - dependencies: - "@babel/code-frame" "7.0.0-beta.51" - "@babel/generator" "7.0.0-beta.51" - "@babel/helper-function-name" "7.0.0-beta.51" - "@babel/helper-split-export-declaration" "7.0.0-beta.51" - "@babel/parser" "7.0.0-beta.51" - "@babel/types" "7.0.0-beta.51" +"@babel/traverse@^7.0.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.0.tgz#503ec6669387efd182c3888c4eec07bcc45d91b2" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" debug "^3.1.0" globals "^11.1.0" - invariant "^2.2.0" - lodash "^4.17.5" + lodash "^4.17.10" -"@babel/types@7.0.0-beta.51": - version "7.0.0-beta.51" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.51.tgz#d802b7b543b5836c778aa691797abf00f3d97ea9" +"@babel/types@^7.0.0", "@babel/types@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.2.tgz#183e7952cf6691628afdc2e2b90d03240bac80c0" dependencies: esutils "^2.0.2" - lodash "^4.17.5" + lodash "^4.17.10" to-fast-properties "^2.0.0" -"@hmcts/ccd-case-ui-toolkit@1.2.5": - version "1.2.5" - resolved "https://registry.yarnpkg.com/@hmcts/ccd-case-ui-toolkit/-/ccd-case-ui-toolkit-1.2.5.tgz#d5ca9ee0b42cca676d690092970dce12261c8e7d" +"@hmcts/ccd-case-ui-toolkit@1.2.13": + version "1.2.13" + resolved "https://registry.yarnpkg.com/@hmcts/ccd-case-ui-toolkit/-/ccd-case-ui-toolkit-1.2.13.tgz#fabd5da50deb1a95b7e11159bcb4c0e0fd6ae30a" dependencies: govuk-elements-sass "^3.1.2" karma-jasmine-html-reporter "^1.2.0" + mocha "^5.0.5" "@hmcts/ccpay-web-component@~1.6.1": version "1.6.2" @@ -336,22 +322,22 @@ webpack-sources "^1.1.0" "@nguniversal/express-engine@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@nguniversal/express-engine/-/express-engine-6.0.0.tgz#f8bc7b5e940afb1ffdbdcb1bb22665d440ea0b0b" + version "6.1.0" + resolved "https://registry.yarnpkg.com/@nguniversal/express-engine/-/express-engine-6.1.0.tgz#384d761556a0accc0738ae89b8a63afb43e76a86" "@nguniversal/module-map-ngfactory-loader@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@nguniversal/module-map-ngfactory-loader/-/module-map-ngfactory-loader-6.0.0.tgz#0dd26c3f1c26d17bb21b8dfc0da53d82b7f11028" + version "6.1.0" + resolved "https://registry.yarnpkg.com/@nguniversal/module-map-ngfactory-loader/-/module-map-ngfactory-loader-6.1.0.tgz#49eb65ed4dc3a3273c920b905e0925e0ed2fbcb8" "@nicky-lenaers/ngx-scroll-to@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@nicky-lenaers/ngx-scroll-to/-/ngx-scroll-to-1.0.0.tgz#2afdc03e5b3218bbb5e19ec69fb1e7f7c8eb83dc" + version "1.1.1" + resolved "https://registry.yarnpkg.com/@nicky-lenaers/ngx-scroll-to/-/ngx-scroll-to-1.1.1.tgz#0ed2681c321b8f357c8e4f45300fec379ca82467" dependencies: tslib "^1.9.0" "@nodelib/fs.stat@^1.0.1": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz#50c1e2260ac0ed9439a181de3725a0168d59c48a" + version "1.1.2" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.2.tgz#54c5a964462be3d4d78af631363c18d6fa91ac26" "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" @@ -359,23 +345,22 @@ dependencies: any-observable "^0.3.0" -"@schematics/angular@0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-0.7.1.tgz#29db78d148d3260e9bb545c86a4c6bfbaed9e933" +"@schematics/angular@0.8.4": + version "0.8.4" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-0.8.4.tgz#ee3c8535476d7b49b1a5676f4a5eee3fc158506f" dependencies: - "@angular-devkit/core" "0.7.1" - "@angular-devkit/schematics" "0.7.1" - typescript ">=2.6.2 <2.8" + "@angular-devkit/core" "0.8.4" + "@angular-devkit/schematics" "0.8.4" + typescript ">=2.6.2 <2.10" -"@schematics/update@0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.7.1.tgz#56cf82df0bf8f5a0ef75aef94b7a9bc9598d7f51" +"@schematics/update@0.8.4": + version "0.8.4" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.8.4.tgz#dddd0f278a21db8d97be102f42ced8b37ba9be7b" dependencies: - "@angular-devkit/core" "0.7.1" - "@angular-devkit/schematics" "0.7.1" + "@angular-devkit/core" "0.8.4" + "@angular-devkit/schematics" "0.8.4" npm-registry-client "^8.5.1" - rc "^1.2.8" - rxjs "^6.0.0" + rxjs "~6.2.0" semver "^5.3.0" semver-intersect "^1.1.2" @@ -384,30 +369,30 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" "@types/jasmine@*", "@types/jasmine@~2.8.0": - version "2.8.8" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.8.tgz#bf53a7d193ea8b03867a38bfdb4fbb0e0bf066c9" + version "2.8.9" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.9.tgz#e028c891e8551fdf6de905d959581fc4fa0b5509" "@types/jasminewd2@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.3.tgz#0d2886b0cbdae4c0eeba55e30792f584bf040a95" + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.5.tgz#0910db4bd50202dea9fe6ec37517b0ae6a01a9e6" dependencies: "@types/jasmine" "*" "@types/node@^6.0.46": - version "6.0.115" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.115.tgz#2ebbd6e57589484c043a25ec3b75799c32f67520" + version "6.14.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.0.tgz#85c6998293fc6f2945915419296c7fbb63384f66" "@types/node@^8.0.30": - version "8.10.23" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.23.tgz#e5ccfdafff42af5397c29669b6d7d65f7d629a00" + version "8.10.36" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.36.tgz#eac05d576fbcd0b4ea3c912dc58c20475c08d9e4" "@types/q@^0.0.32": version "0.0.32" - resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" + resolved "http://registry.npmjs.org/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" "@types/selenium-webdriver@^3.0.0": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.10.tgz#e98cc6f05b4b436277671c784ee2f9d05a634f9b" + version "3.0.12" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.12.tgz#6affe5aed1ba379175075a889adbe2bc3aa62159" "@webassemblyjs/ast@1.4.3": version "1.4.3" @@ -525,17 +510,6 @@ "@webassemblyjs/wast-parser" "1.4.3" long "^3.2.0" -"@webpack-contrib/schema-utils@^1.0.0-beta.0": - version "1.0.0-beta.0" - resolved "https://registry.yarnpkg.com/@webpack-contrib/schema-utils/-/schema-utils-1.0.0-beta.0.tgz#bf9638c9464d177b48209e84209e23bee2eb4f65" - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chalk "^2.3.2" - strip-ansi "^4.0.0" - text-table "^0.2.0" - webpack-log "^1.1.2" - "@yarnpkg/lockfile@^1.0.2": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" @@ -568,9 +542,13 @@ acorn-dynamic-import@^3.0.0: dependencies: acorn "^5.0.0" +acorn@^4.0.4: + version "4.0.13" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" + acorn@^5.0.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8" + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" adm-zip@^0.4.9: version "0.4.11" @@ -586,18 +564,15 @@ agent-base@4, agent-base@^4.1.0, agent-base@^4.2.0: dependencies: es6-promisify "^5.0.0" +ajv-errors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" + ajv-keywords@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -ajv@^5.0.0, ajv@^5.1.0: +ajv@^5.0.0, ajv@^5.1.0, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: @@ -607,36 +582,28 @@ ajv@^5.0.0, ajv@^5.1.0: json-schema-traverse "^0.3.0" ajv@^6.1.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" + version "6.5.4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59" dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" - uri-js "^4.2.1" + uri-js "^4.2.2" ajv@~6.4.0: version "6.4.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.4.0.tgz#d3aff78e9277549771daf0164cff48482b754fc6" + resolved "http://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz#d3aff78e9277549771daf0164cff48482b754fc6" dependencies: fast-deep-equal "^1.0.0" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" uri-js "^3.0.2" -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - amdefine@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" -amdefine@>=0.0.4: +amdefine@>=0.0.4, amdefine@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -646,6 +613,16 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" +ansi-colors@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.1.0.tgz#dcfaacc90ef9187de413ec3ef8d5eb981a98808f" + +ansi-cyan@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" + dependencies: + ansi-wrap "0.1.0" + ansi-escapes@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -664,6 +641,12 @@ ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" +ansi-red@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" + dependencies: + ansi-wrap "0.1.0" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -716,7 +699,7 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -app-root-path@^2.0.1: +app-root-path@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.1.0.tgz#98bf6599327ecea199309866e8140368fd2e646a" @@ -747,6 +730,13 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +arr-diff@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" + dependencies: + arr-flatten "^1.0.1" + array-slice "^0.2.3" + arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" @@ -761,6 +751,10 @@ arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" +arr-union@^2.0.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" + arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" @@ -781,13 +775,6 @@ array-flatten@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" - array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" @@ -831,18 +818,16 @@ asn1.js@^4.0.0: minimalistic-assert "^1.0.0" asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + dependencies: + safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -assert@^1.1.1: +assert@^1.1.1, assert@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" dependencies: @@ -856,7 +841,7 @@ assertion-error-formatter@^2.0.0: pad-right "^0.2.2" repeat-string "^1.6.1" -assertion-error@^1.0.1: +assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -886,9 +871,9 @@ async-limiter@~1.0.0: async@1.x, async@^1.4.0, async@^1.5.0, async@^1.5.2, async@~1.5: version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + resolved "http://registry.npmjs.org/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.1.4, async@^2.6.0: +async@^2.1.4, async@^2.5.0, async@^2.6.0, async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" dependencies: @@ -899,8 +884,8 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" atob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" autoprefixer@^8.4.1: version "8.6.5" @@ -913,17 +898,13 @@ autoprefixer@^8.4.1: postcss "^6.0.23" postcss-value-parser "^3.2.3" -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" -aws4@^1.2.1, aws4@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" +aws4@^1.6.0, aws4@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" @@ -1102,43 +1083,43 @@ babel-plugin-check-es2015-constants@^6.22.0: babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + resolved "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" babel-plugin-syntax-async-generators@^6.5.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" + resolved "http://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" babel-plugin-syntax-class-constructor-call@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" + resolved "http://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" babel-plugin-syntax-class-properties@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" + resolved "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" babel-plugin-syntax-decorators@^6.13.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" + resolved "http://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" babel-plugin-syntax-dynamic-import@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" + resolved "http://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + resolved "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" babel-plugin-syntax-export-extensions@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" + resolved "http://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" babel-plugin-syntax-flow@^6.18.0: version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" + resolved "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + resolved "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" @@ -1546,10 +1527,10 @@ base@^0.11.1: pascalcase "^0.1.1" basic-auth@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.0.tgz#015db3f353e02e56377755f962742e8981e7bbba" + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" dependencies: - safe-buffer "5.1.1" + safe-buffer "5.1.2" batch@0.6.1: version "0.6.1" @@ -1576,8 +1557,8 @@ big.js@^3.1.3: resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + version "1.12.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" binaryextensions@2: version "2.1.1" @@ -1600,8 +1581,8 @@ blocking-proxy@^1.0.0: minimist "^1.2.0" bluebird@^3.3.0, bluebird@^3.4.1, bluebird@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + version "3.5.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" @@ -1652,12 +1633,6 @@ boolbase@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - boom@5.x.x: version "5.2.0" resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" @@ -1716,13 +1691,19 @@ brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" +browser-resolve@^1.11.0: + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + dependencies: + resolve "1.1.7" + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -1750,7 +1731,7 @@ browserify-des@^1.0.0: browserify-rsa@^4.0.0: version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + resolved "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" dependencies: bn.js "^4.1.0" randombytes "^2.0.1" @@ -1786,6 +1767,21 @@ browserstack@^1.5.1: dependencies: https-proxy-agent "^2.2.1" +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -1800,12 +1796,19 @@ buffer-xor@^1.0.3: buffer@^4.3.0: version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.0.6: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -1897,10 +1900,6 @@ camelcase-keys@^2.0.0: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - camelcase@^2.0.0, camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -1914,24 +1913,17 @@ camelcase@^4.0.0, camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864: - version "1.0.30000865" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" + version "1.0.30000890" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000890.tgz#86a18ffcc65d79ec6a437e985761b8bf1c4efeaf" capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + version "1.0.1" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - chai-as-promised@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" @@ -1943,19 +1935,19 @@ chai-like@^0.2.14: resolved "https://registry.yarnpkg.com/chai-like/-/chai-like-0.2.14.tgz#8d19101aa2071550c3eac2804b9ef6faf626cb46" chai@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" dependencies: - assertion-error "^1.0.1" - check-error "^1.0.1" - deep-eql "^3.0.0" + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" get-func-name "^2.0.0" - pathval "^1.0.0" - type-detect "^4.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1963,7 +1955,7 @@ chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.1: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" dependencies: @@ -1973,7 +1965,7 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4 chalk@~0.4.0: version "0.4.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + resolved "http://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" dependencies: ansi-styles "~1.0.0" has-color "~0.1.0" @@ -1991,7 +1983,11 @@ chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" -check-error@^1.0.1, check-error@^1.0.2: +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + +check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" @@ -2030,16 +2026,16 @@ chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3: fsevents "^1.2.2" chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" chrome-trace-event@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz#d395af2d31c87b90a716c831fe326f69768ec084" -ci-info@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" +ci-info@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" @@ -2057,8 +2053,8 @@ circular-json@^0.3.1: resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" circular-json@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.5.tgz#64182ef359042d37cd8e767fc9de878b1e9447d3" + version "0.5.7" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.7.tgz#b8be478d72ea58c7eeda26bf1cf1fba43d188842" class-transformer@^0.1.8: version "0.1.9" @@ -2073,11 +2069,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-css@4.1.x, clean-css@^4.1.11: - version "4.1.11" - resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.1.11.tgz#2ecdf145aba38f54740f26cefd0ff3e03e125d6a" +clean-css@4.2.x, clean-css@^4.1.11: + version "4.2.1" + resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" dependencies: - source-map "0.5.x" + source-map "~0.6.0" cli-boxes@^1.0.0: version "1.0.0" @@ -2095,10 +2091,6 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-spinners@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" - cli-table2@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/cli-table2/-/cli-table2-0.2.0.tgz#2d1ef7f218a0e786e214540562d4bd177fe32d97" @@ -2133,14 +2125,6 @@ clipboard@^2.0.0: select "^1.1.2" tiny-emitter "^2.0.0" -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - cliui@^3.0.3, cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" @@ -2193,11 +2177,11 @@ clone-stats@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" -clone@^1.0.0: +clone@^1.0.0, clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" -clone@^2.1.1: +clone@^2.1.1, clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" @@ -2218,10 +2202,10 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" codelyzer@^4.1.0: - version "4.4.2" - resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-4.4.2.tgz#af11fed6ddf9362ed5b174495467fb7315306fb1" + version "4.5.0" + resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-4.5.0.tgz#a65ddeeeca2894653253a89bfa229118ff9f59b1" dependencies: - app-root-path "^2.0.1" + app-root-path "^2.1.0" css-selector-tokenizer "^0.7.0" cssauron "^1.4.0" semver-dsl "^1.0.1" @@ -2236,14 +2220,14 @@ collection-visit@^1.0.0: object-visit "^1.0.0" color-convert@^1.9.0: - version "1.9.2" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" dependencies: - color-name "1.1.1" + color-name "1.1.3" -color-name@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" color-support@^1.1.3: version "1.1.3" @@ -2258,8 +2242,8 @@ colors@1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" colors@^1.1.0, colors@^1.1.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.1.tgz#4accdb89cf2cabc7f982771925e9468784f32f3d" + version "1.3.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" combine-lists@^1.0.0: version "1.0.1" @@ -2267,35 +2251,50 @@ combine-lists@^1.0.0: dependencies: lodash "^4.5.0" -combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: +combine-source-map@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/combine-source-map/-/combine-source-map-0.8.0.tgz#a58d0df042c186fcf822a8e8015f5450d2d79a8b" + dependencies: + convert-source-map "~1.1.0" + inline-source-map "~0.6.0" + lodash.memoize "~3.0.3" + source-map "~0.5.3" + +combined-stream@1.0.6: version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + resolved "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +combined-stream@~1.0.5, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" dependencies: delayed-stream "~1.0.0" commander@2.15.1: version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + resolved "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" -commander@2.16.x, commander@^2.12.1, commander@~2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50" - -commander@^2.9.0: +commander@2.17.x, commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" +commander@^2.12.1, commander@^2.9.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + commander@~2.14.1: version "2.14.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" + resolved "http://registry.npmjs.org/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" -compare-versions@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.3.0.tgz#af93ea705a96943f622ab309578b9b90586f39c3" +compare-versions@^3.2.1: + version "3.4.0" + resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" component-bind@1.0.0: version "1.0.0" @@ -2314,10 +2313,10 @@ component-inherit@0.0.3: resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" compressible@~2.0.14: - version "2.0.14" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.14.tgz#326c5f507fbb055f54116782b969a81b67a29da7" + version "2.0.15" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212" dependencies: - mime-db ">= 1.34.0 < 2" + mime-db ">= 1.36.0 < 2" compression@^1.5.2, compression@^1.7.1: version "1.7.3" @@ -2395,8 +2394,14 @@ content-type@~1.0.4: resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" convert-source-map@^1.5.0, convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + dependencies: + safe-buffer "~5.1.1" + +convert-source-map@~1.1.0: + version "1.1.3" + resolved "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860" cookie-signature@1.0.6: version "1.0.6" @@ -2422,8 +2427,8 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" copy-webpack-plugin@^4.5.1: - version "4.5.2" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz#d53444a8fea2912d806e78937390ddd7e632ee5c" + version "4.5.3" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.3.tgz#14a224d205e46f7a79f7956028e1da6df2225ff2" dependencies: cacache "^10.0.4" find-cache-dir "^1.0.0" @@ -2477,7 +2482,7 @@ create-error-class@^3.0.0: create-hash@^1.1.0, create-hash@^1.1.2: version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + resolved "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" dependencies: cipher-base "^1.0.1" inherits "^2.0.1" @@ -2487,7 +2492,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + resolved "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -2511,7 +2516,7 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^6.0.5: +cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" dependencies: @@ -2521,13 +2526,7 @@ cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -crypto-browserify@^3.11.0: +crypto-browserify@^3.11.0, crypto-browserify@^3.11.1: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" dependencies: @@ -2635,8 +2634,8 @@ custom-event@~1.0.0: resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" cvss@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cvss/-/cvss-1.0.3.tgz#70df9c4a4e07fdb9341f27a2847a21df25c3a83a" + version "1.0.4" + resolved "https://registry.yarnpkg.com/cvss/-/cvss-1.0.4.tgz#7f4093b0e462e2e6b11fe3dcd08168b8a8693163" cyclist@~0.2.2: version "0.2.2" @@ -2648,12 +2647,6 @@ d@1: dependencies: es5-ext "^0.10.9" -d@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" - dependencies: - es5-ext "~0.10.2" - dargs@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" @@ -2672,6 +2665,10 @@ date-fns@^1.27.2: version "1.29.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" +date-format@^0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/date-format/-/date-format-0.0.0.tgz#09206863ab070eb459acea5542cbd856b11966b3" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -2687,11 +2684,11 @@ dateformat@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" -debug@*, debug@3.1.0, debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" +debug@*: + version "4.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" dependencies: - ms "2.0.0" + ms "^2.1.1" debug@2, debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: version "2.6.9" @@ -2701,26 +2698,42 @@ debug@2, debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, de debug@2.2.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + resolved "http://registry.npmjs.org/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: ms "0.7.1" debug@2.3.3: version "2.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + resolved "http://registry.npmjs.org/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" dependencies: ms "0.7.2" -debug@^3, debug@^3.2.5: +debug@3.1.0, debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +debug@^0.7.2: + version "0.7.4" + resolved "http://registry.npmjs.org/debug/-/debug-0.7.4.tgz#06e1ea8082c2cb14e39806e22e2f6f757f92af39" + +debug@^3, debug@^3.1.0, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" dependencies: ms "^2.1.1" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +decamelize@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + dependencies: + xregexp "4.0.0" + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -2731,7 +2744,7 @@ decompress-response@^3.2.0, decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" -deep-eql@^3.0.0: +deep-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" dependencies: @@ -2749,18 +2762,30 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" +default-gateway@^2.6.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" + dependencies: + execa "^0.10.0" + ip-regex "^2.1.0" + default-require-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" dependencies: strip-bom "^3.0.0" +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" + object-keys "^1.0.12" define-property@^0.2.5: version "0.2.5" @@ -2858,20 +2883,20 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" detect-node@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" -diff@3.5.0, diff@^3.0.0, diff@^3.1.0, diff@^3.2.0, diff@^3.3.1, diff@^3.5.0: +diff@3.5.0, diff@^3.0.0, diff@^3.1.0, diff@^3.2.0, diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" diffie-hellman@^5.0.0: version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" @@ -2901,11 +2926,11 @@ dns-txt@^2.0.2: dependencies: buffer-indexof "^1.0.0" -dom-converter@~0.1: - version "0.1.4" - resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b" +dom-converter@~0.2: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" dependencies: - utila "~0.3" + utila "~0.4" dom-serialize@^2.2.0: version "2.2.1" @@ -2923,7 +2948,7 @@ dom-serializer@0: domelementtype "~1.1.1" entities "~1.1.1" -domain-browser@^1.1.1: +domain-browser@^1.1.1, domain-browser@^1.1.7: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -2942,8 +2967,8 @@ domhandler@2.1: domelementtype "1" domino@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/domino/-/domino-2.0.3.tgz#729fc28e0a54249ba5aaf95d2a35750d12201b01" + version "2.1.0" + resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.0.tgz#653ba7d331441113b42e40ba05f24253ec86e02e" domutils@1.1: version "1.1.6" @@ -2984,11 +3009,11 @@ duplexify@^3.4.2, duplexify@^3.6.0: stream-shift "^1.0.0" duration@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/duration/-/duration-0.2.0.tgz#5f9c4dfaafff655de986112efe25c5978dd85146" + version "0.2.1" + resolved "https://registry.yarnpkg.com/duration/-/duration-0.2.1.tgz#c87477ac08c2e540954b730094a5cb33bb1ae3d4" dependencies: - d "~0.1.1" - es5-ext "~0.10.2" + d "1" + es5-ext "~0.10.23" ecc-jsbn@~0.1.1: version "0.1.2" @@ -3010,16 +3035,16 @@ ejs@^2.5.7, ejs@^2.5.9: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" electron-to-chromium@^1.3.47: - version "1.3.52" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" + version "1.3.75" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.75.tgz#dd04551739e7371862b0ac7f4ddaa9f3f95b7e68" elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -3138,7 +3163,7 @@ errorhandler@^1.2.0: accepts "~1.3.3" escape-html "~1.0.3" -es-abstract@^1.5.1, es-abstract@^1.7.0: +es-abstract@^1.5.1: version "1.12.0" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" dependencies: @@ -3149,16 +3174,16 @@ es-abstract@^1.5.1, es-abstract@^1.7.0: is-regex "^1.0.4" es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" dependencies: - is-callable "^1.1.1" + is-callable "^1.1.4" is-date-object "^1.0.1" - is-symbol "^1.0.1" + is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2: - version "0.10.45" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653" +es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.23: + version "0.10.46" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572" dependencies: es6-iterator "~2.0.3" es6-symbol "~3.1.1" @@ -3173,12 +3198,12 @@ es6-iterator@~2.0.3: es6-symbol "^3.1.1" es6-promise@^4.0.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + version "4.2.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" es6-promise@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.0.2.tgz#010d5858423a5f118979665f46486a95c6ee2bb6" + resolved "http://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz#010d5858423a5f118979665f46486a95c6ee2bb6" es6-promisify@^5.0.0: version "5.0.0" @@ -3268,9 +3293,9 @@ eventemitter3@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" -events@^1.0.0: +events@^1.0.0, events@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + resolved "http://registry.npmjs.org/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" eventsource@0.1.6: version "0.1.6" @@ -3285,6 +3310,18 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" +execa@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + dependencies: + cross-spawn "^6.0.0" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -3351,13 +3388,13 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: homedir-polyfill "^1.0.1" expect@^23.0.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-23.5.0.tgz#18999a0eef8f8acf99023fde766d9c323c2562ed" + version "23.6.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-23.6.0.tgz#1e0c8d3ba9a581c87bd71fb9bc8862d443425f98" dependencies: ansi-styles "^3.2.0" - jest-diff "^23.5.0" + jest-diff "^23.6.0" jest-get-type "^22.1.0" - jest-matcher-utils "^23.5.0" + jest-matcher-utils "^23.6.0" jest-message-util "^23.4.0" jest-regex-util "^23.3.0" @@ -3370,7 +3407,7 @@ express-urlrewrite@^1.2.0: express@^4.16.2: version "4.16.3" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + resolved "http://registry.npmjs.org/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" dependencies: accepts "~1.3.5" array-flatten "1.1.1" @@ -3403,6 +3440,12 @@ express@^4.16.2: utils-merge "1.0.1" vary "~1.1.2" +extend-shallow@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" + dependencies: + kind-of "^1.1.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -3416,18 +3459,26 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@3, extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: +extend@3, extend@^3.0.0, extend@~3.0.1, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" external-editor@^2.0.4, external-editor@^2.1.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + resolved "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" tmp "^0.0.33" +external-editor@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -3481,8 +3532,8 @@ fast-deep-equal@^2.0.1: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" fast-glob@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf" + version "2.2.3" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.3.tgz#d09d378e9ef6b0076a0fa1ba7519d9d4d9699c28" dependencies: "@mrmlnc/readdir-enhanced" "^2.2.1" "@nodelib/fs.stat" "^1.0.1" @@ -3536,7 +3587,7 @@ figures@^1.7.0: file-loader@^1.1.11: version "1.1.11" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" + resolved "http://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" dependencies: loader-utils "^1.0.2" schema-utils "^0.4.5" @@ -3556,7 +3607,7 @@ fileset@0.2.x: glob "5.x" minimatch "2.x" -fileset@^2.0.2: +fileset@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" dependencies: @@ -3596,7 +3647,7 @@ finalhandler@1.1.0: finalhandler@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + resolved "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" dependencies: debug "2.6.9" encodeurl "~1.0.2" @@ -3627,6 +3678,12 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + dependencies: + locate-path "^3.0.0" + find@^0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/find/-/find-0.2.9.tgz#4b73f1ff9e56ad91b76e716407fe5ffe6554bb8c" @@ -3640,8 +3697,8 @@ first-chunk-stream@^2.0.0: readable-stream "^2.0.2" flow-parser@^0.*: - version "0.76.0" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.76.0.tgz#f7d4c4d26df74805c3a0babd5d8ea4c2cd57190b" + version "0.82.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.82.0.tgz#0ebb30452ecd5c3c620c8840a1f5a655cc1f8f7d" flush-write-stream@^1.0.0: version "1.0.3" @@ -3651,10 +3708,10 @@ flush-write-stream@^1.0.0: readable-stream "^2.0.4" follow-redirects@^1.0.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.1.tgz#67a8f14f5a1f67f962c2c46469c79eaec0a90291" + version "1.5.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.9.tgz#c9ed9d748b814a39535716e531b9196a845d89c6" dependencies: - debug "^3.1.0" + debug "=3.1.0" font-awesome@^4.7.0: version "4.7.0" @@ -3680,23 +3737,11 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -form-data@~2.3.1: +form-data@~2.3.1, form-data@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" dependencies: @@ -3755,6 +3800,14 @@ fs-extra@^5.0.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -3834,7 +3887,7 @@ get-stdin@^4.0.1: get-stream@3.0.0, get-stream@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + resolved "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" get-uri@^2.0.0: version "2.0.2" @@ -3926,7 +3979,7 @@ glob@7.0.x: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: +glob@7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -3937,13 +3990,14 @@ glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glo once "^1.3.0" path-is-absolute "^1.0.0" -glob@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" dependencies: + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "2 || 3" + minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" @@ -3972,8 +4026,8 @@ global-prefix@^1.0.1: which "^1.2.14" globals@^11.1.0: - version "11.7.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + version "11.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" globals@^9.18.0: version "9.18.0" @@ -4045,7 +4099,7 @@ good-listener@^1.2.2: got@^6.7.1: version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + resolved "http://registry.npmjs.org/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" dependencies: create-error-class "^3.0.0" duplexer3 "^0.1.4" @@ -4168,30 +4222,19 @@ handle-thing@^1.2.5: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" handlebars@^4.0.1, handlebars@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + version "4.0.12" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" dependencies: - async "^1.4.0" + async "^2.5.0" optimist "^0.6.1" - source-map "^0.4.4" + source-map "^0.6.1" optionalDependencies: - uglify-js "^2.6" - -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + uglify-js "^3.1.4" har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" @@ -4199,6 +4242,13 @@ har-validator@~5.0.3: ajv "^5.1.0" har-schema "^2.0.0" +har-validator@~5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" + dependencies: + ajv "^5.3.0" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -4315,15 +4365,6 @@ hasha@^2.2.0: is-stream "^1.0.1" pinkie-promise "^2.0.0" -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - he@1.1.1, he@1.1.x: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -4336,10 +4377,6 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - hoek@4.x.x: version "4.2.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" @@ -4375,12 +4412,12 @@ html-entities@^1.2.0: resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" html-minifier@^3.2.3: - version "3.5.19" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.19.tgz#ed53c4b7326fe507bc3a1adbcc3bbb56660a2ebd" + version "3.5.20" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.20.tgz#7b19fd3caa0cb79f7cde5ee5c3abdf8ecaa6bb14" dependencies: camel-case "3.0.x" - clean-css "4.1.x" - commander "2.16.x" + clean-css "4.2.x" + commander "2.17.x" he "1.1.x" param-case "2.1.x" relateurl "0.2.x" @@ -4388,7 +4425,7 @@ html-minifier@^3.2.3: html-webpack-plugin@^3.0.6: version "3.2.0" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" + resolved "http://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" dependencies: html-minifier "^3.2.3" loader-utils "^0.2.16" @@ -4426,7 +4463,7 @@ http-errors@1.6.2: http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" dependencies: depd "~1.1.2" inherits "2.0.3" @@ -4446,7 +4483,7 @@ http-proxy-agent@^2.1.0: http-proxy-middleware@~0.18.0: version "0.18.0" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" + resolved "http://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" dependencies: http-proxy "^1.16.2" is-glob "^4.0.0" @@ -4461,14 +4498,6 @@ http-proxy@^1.13.0, http-proxy@^1.16.2: follow-redirects "^1.0.0" requires-port "^1.0.0" -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -4492,12 +4521,18 @@ iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" -iconv-lite@0.4.23, iconv-lite@^0.4.17, iconv-lite@^0.4.4: +iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + dependencies: + safer-buffer ">= 2.1.2 < 3" + ieee754@^1.1.4: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" @@ -4547,6 +4582,13 @@ import-local@^1.0.0: pkg-dir "^2.0.0" resolve-cwd "^2.0.0" +import-local@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -4588,6 +4630,12 @@ ini@^1.3.0, ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" +inline-source-map@~0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/inline-source-map/-/inline-source-map-0.6.2.tgz#f9393471c18a79d1724f863fa38b586370ade2a5" + dependencies: + source-map "~0.5.3" + inquirer@^3.0.0, inquirer@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" @@ -4609,7 +4657,7 @@ inquirer@^3.0.0, inquirer@^3.3.0: inquirer@^5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" + resolved "http://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" @@ -4625,11 +4673,30 @@ inquirer@^5.2.0: strip-ansi "^4.0.0" through "^2.3.6" -internal-ip@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" +inquirer@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" dependencies: - meow "^3.3.0" + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.0" + figures "^2.0.0" + lodash "^4.17.10" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.1.0" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +internal-ip@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" + dependencies: + default-gateway "^2.6.0" + ipaddr.js "^1.5.2" interpret@^1.0.0, interpret@^1.1.0: version "1.1.0" @@ -4642,7 +4709,7 @@ into-stream@^3.1.0: from2 "^2.1.1" p-is-promise "^1.1.0" -invariant@^2.2.0, invariant@^2.2.2: +invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: @@ -4652,6 +4719,14 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + +ip-regex@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + ip@^1.1.0, ip@^1.1.4, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" @@ -4660,6 +4735,10 @@ ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" +ipaddr.js@^1.5.2: + version "1.8.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -4688,19 +4767,19 @@ is-buffer@^1.0.2, is-buffer@^1.1.5: is-builtin-module@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + resolved "http://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.1, is-callable@^1.1.3: +is-callable@^1.1.3, is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" is-ci@^1.0.10: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" dependencies: - ci-info "^1.0.0" + ci-info "^1.5.0" is-data-descriptor@^0.1.4: version "0.1.4" @@ -4837,7 +4916,7 @@ is-number@^4.0.0: is-obj@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + resolved "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" is-object@^1.0.1: version "1.0.1" @@ -4911,9 +4990,11 @@ is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + dependencies: + has-symbols "^1.0.0" is-typedarray@~1.0.0: version "1.0.0" @@ -4940,8 +5021,10 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" isbinaryfile@^3.0.0, isbinaryfile@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + dependencies: + buffer-alloc "^1.2.0" isexe@^2.0.0: version "2.0.0" @@ -4961,21 +5044,21 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-api@^1.3.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.6.tgz#0c695f17e533131de8c49e0657175dcfd8af8a8f" +istanbul-api@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.0.6.tgz#cd7b33ee678f6c01531d05f5e567ebbcd25f8ecc" dependencies: - async "^2.1.4" - compare-versions "^3.1.0" - fileset "^2.0.2" - istanbul-lib-coverage "^1.2.0" - istanbul-lib-hook "^1.2.0" - istanbul-lib-instrument "^2.1.0" - istanbul-lib-report "^1.1.4" - istanbul-lib-source-maps "^1.2.5" - istanbul-reports "^1.4.1" - js-yaml "^3.7.0" - mkdirp "^0.5.1" + async "^2.6.1" + compare-versions "^3.2.1" + fileset "^2.0.3" + istanbul-lib-coverage "^2.0.1" + istanbul-lib-hook "^2.0.1" + istanbul-lib-instrument "^3.0.0" + istanbul-lib-report "^2.0.2" + istanbul-lib-source-maps "^2.0.1" + istanbul-reports "^2.0.1" + js-yaml "^3.12.0" + make-dir "^1.3.0" once "^1.4.0" istanbul-instrumenter-loader@^3.0.1: @@ -4987,66 +5070,65 @@ istanbul-instrumenter-loader@^3.0.1: loader-utils "^1.1.0" schema-utils "^0.3.0" -istanbul-lib-coverage@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" +istanbul-lib-coverage@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" istanbul-lib-coverage@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda" -istanbul-lib-hook@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.1.tgz#f614ec45287b2a8fc4f07f5660af787575601805" +istanbul-lib-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz#918a57b75a0f951d552a08487ca1fa5336433d72" dependencies: append-transform "^1.0.0" istanbul-lib-instrument@^1.7.3: - version "1.10.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" + version "1.10.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" babylon "^6.18.0" - istanbul-lib-coverage "^1.2.0" + istanbul-lib-coverage "^1.2.1" semver "^5.3.0" -istanbul-lib-instrument@^2.1.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-2.3.2.tgz#b287cbae2b5f65f3567b05e2e29b275eaf92d25e" +istanbul-lib-instrument@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz#b5f066b2a161f75788be17a9d556f40a0cf2afc9" dependencies: - "@babel/generator" "7.0.0-beta.51" - "@babel/parser" "7.0.0-beta.51" - "@babel/template" "7.0.0-beta.51" - "@babel/traverse" "7.0.0-beta.51" - "@babel/types" "7.0.0-beta.51" + "@babel/generator" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" istanbul-lib-coverage "^2.0.1" semver "^5.5.0" -istanbul-lib-report@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5" +istanbul-lib-report@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz#430a2598519113e1da7af274ba861bd42dd97535" dependencies: - istanbul-lib-coverage "^1.2.0" - mkdirp "^0.5.1" - path-parse "^1.0.5" - supports-color "^3.1.2" + istanbul-lib-coverage "^2.0.1" + make-dir "^1.3.0" + supports-color "^5.4.0" -istanbul-lib-source-maps@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.5.tgz#ffe6be4e7ab86d3603e4290d54990b14506fc9b1" +istanbul-lib-source-maps@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz#ce8b45131d8293fdeaa732f4faf1852d13d0a97e" dependencies: debug "^3.1.0" - istanbul-lib-coverage "^1.2.0" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" + istanbul-lib-coverage "^2.0.1" + make-dir "^1.3.0" + rimraf "^2.6.2" + source-map "^0.6.1" -istanbul-reports@^1.4.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.0.tgz#c6c2867fa65f59eb7dcedb7f845dfc76aaee70f9" +istanbul-reports@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.0.1.tgz#fb8d6ea850701a3984350b977a969e9a556116a7" dependencies: handlebars "^4.0.11" @@ -5069,7 +5151,7 @@ istanbul@0.4.3: which "^1.1.1" wordwrap "^1.0.0" -istanbul@^0.4.0, istanbul@^0.4.3, istanbul@^0.4.5: +istanbul@0.4.5, istanbul@^0.4.0, istanbul@^0.4.3, istanbul@^0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" dependencies: @@ -5107,6 +5189,12 @@ jasmine-core@~2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" +jasmine-diff@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/jasmine-diff/-/jasmine-diff-0.1.3.tgz#93ccc2dcc41028c5ddd4606558074839f2deeaa8" + dependencies: + diff "^3.2.0" + jasmine-spec-reporter@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz#1d632aec0341670ad324f92ba84b4b32b35e9e22" @@ -5125,26 +5213,26 @@ jasminewd2@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e" -jest-diff@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.5.0.tgz#250651a433dd0050290a07642946cc9baaf06fba" +jest-diff@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-23.6.0.tgz#1500f3f16e850bb3d71233408089be099f610c7d" dependencies: chalk "^2.0.1" diff "^3.2.0" jest-get-type "^22.1.0" - pretty-format "^23.5.0" + pretty-format "^23.6.0" jest-get-type@^22.1.0: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.4.3.tgz#e3a8504d8479342dd4420236b322869f18900ce4" -jest-matcher-utils@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.5.0.tgz#0e2ea67744cab78c9ab15011c4d888bdd3e49e2a" +jest-matcher-utils@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz#726bcea0c5294261a7417afb6da3186b4b8cac80" dependencies: chalk "^2.0.1" jest-get-type "^22.1.0" - pretty-format "^23.5.0" + pretty-format "^23.6.0" jest-message-util@^23.4.0: version "23.4.0" @@ -5164,23 +5252,19 @@ jju@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" -js-base64@^2.1.8: - version "2.4.8" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033" - -js-base64@^2.4.3: +js-base64@^2.1.8, js-base64@^2.4.3: version "2.4.9" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03" -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -"js-tokens@^3.0.0 || ^4.0.0": +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" -js-yaml@3.x, js-yaml@^3.5.3, js-yaml@^3.7.0, js-yaml@^3.9.0: +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.5.3, js-yaml@^3.7.0, js-yaml@^3.9.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" dependencies: @@ -5296,13 +5380,7 @@ json-server@^0.12.1: update-notifier "^2.3.0" yargs "^10.0.3" -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -5312,11 +5390,11 @@ json3@3.3.2, json3@^3.3.2: json5@^0.5.0, json5@^0.5.1: version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + resolved "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" jsonfile@^2.1.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + resolved "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" optionalDependencies: graceful-fs "^4.1.6" @@ -5332,10 +5410,6 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -5369,13 +5443,13 @@ karma-cli@^1.0.1: resolve "^1.1.6" karma-coverage-istanbul-reporter@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.1.tgz#26b969317d191c6a897c783b4ffe7831cb92e684" + version "2.0.4" + resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.4.tgz#402ae4ed6eadb9d9dafbd408ffda17897c0d003a" dependencies: - istanbul-api "^1.3.1" + istanbul-api "^2.0.5" minimatch "^3.0.4" -karma-coverage@^1.0.0: +karma-coverage@^1.0.0, karma-coverage@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/karma-coverage/-/karma-coverage-1.1.2.tgz#cc09dceb589a83101aca5fe70c287645ef387689" dependencies: @@ -5427,6 +5501,51 @@ karma-source-map-support@^1.2.0: dependencies: source-map-support "^0.5.5" +karma-typescript@^3.0.5: + version "3.0.13" + resolved "https://registry.yarnpkg.com/karma-typescript/-/karma-typescript-3.0.13.tgz#8948afbd103ac1987a5961a0f43a1ba2871067cd" + dependencies: + acorn "^4.0.4" + assert "^1.4.1" + async "^2.1.4" + browser-resolve "^1.11.0" + browserify-zlib "^0.2.0" + buffer "^5.0.6" + combine-source-map "^0.8.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + convert-source-map "^1.5.0" + crypto-browserify "^3.11.1" + diff "^3.2.0" + domain-browser "^1.1.7" + events "^1.1.1" + glob "^7.1.1" + https-browserify "^1.0.0" + istanbul "0.4.5" + json-stringify-safe "^5.0.1" + karma-coverage "^1.1.1" + lodash "^4.17.4" + log4js "^1.1.1" + minimatch "^3.0.3" + os-browserify "^0.3.0" + pad "^2.0.0" + path-browserify "0.0.0" + process "^0.11.10" + punycode "^1.4.1" + querystring-es3 "^0.2.1" + readable-stream "^2.3.3" + remap-istanbul "^0.10.1" + source-map "0.6.1" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.3" + timers-browserify "^2.0.2" + tmp "0.0.29" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.10.3" + vm-browserify "0.0.4" + karma@^1.3.0: version "1.7.1" resolved "https://registry.yarnpkg.com/karma/-/karma-1.7.1.tgz#85cc08e9e0a22d7ce9cca37c4a1be824f6a2b1ae" @@ -5470,12 +5589,16 @@ keyv@3.0.0: json-buffer "3.0.0" killable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + +kind-of@^1.1.0: + version "1.1.0" + resolved "http://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" kind-of@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" + resolved "http://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" dependencies: is-buffer "^1.0.2" @@ -5505,9 +5628,9 @@ klaw-sync@^2.1.0: optionalDependencies: graceful-fs "^4.1.11" -klaw-sync@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-3.0.2.tgz#bf3a5ca463af5aec007201dbe8be7088ef29d067" +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" dependencies: graceful-fs "^4.1.11" @@ -5527,16 +5650,18 @@ lazy-cache@^0.2.3: version "0.2.7" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" dependencies: invert-kv "^1.0.0" +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + dependencies: + invert-kv "^2.0.0" + leb@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/leb/-/leb-0.3.0.tgz#32bee9fad168328d6aea8522d833f4180eed1da3" @@ -5550,8 +5675,10 @@ less-loader@^4.1.0: pify "^3.0.0" less@^3.0.4: - version "3.8.0" - resolved "https://registry.yarnpkg.com/less/-/less-3.8.0.tgz#44785e40c23841c15ba3be741d36bd2775dd0596" + version "3.8.1" + resolved "https://registry.yarnpkg.com/less/-/less-3.8.1.tgz#f31758598ef5a1930dd4caefa9e4340641e71e1d" + dependencies: + clone "^2.1.2" optionalDependencies: errno "^0.1.1" graceful-fs "^4.1.2" @@ -5570,8 +5697,8 @@ levn@~0.3.0: type-check "~0.3.2" license-webpack-plugin@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-1.3.1.tgz#688b76472188ef597918b7cae3eec7dc2fa5a0e8" + version "1.5.0" + resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-1.5.0.tgz#22ca0f12a884aee35bb61dfd8eab45fe36a04523" dependencies: ejs "^2.5.7" @@ -5608,29 +5735,22 @@ listr-verbose-renderer@^0.4.0: figures "^1.7.0" listr@^0.14.1: - version "0.14.1" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.1.tgz#8a7afa4a7135cee4c921d128e0b7dfc6e522d43d" + version "0.14.2" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.2.tgz#cbe44b021100a15376addfc2d79349ee430bfe14" dependencies: "@samverschueren/stream-to-observable" "^0.3.0" - cli-truncate "^0.2.1" - figures "^1.7.0" - indent-string "^2.1.0" is-observable "^1.1.0" is-promise "^2.1.0" is-stream "^1.1.0" listr-silent-renderer "^1.1.1" listr-update-renderer "^0.4.0" listr-verbose-renderer "^0.4.0" - log-symbols "^1.0.2" - log-update "^1.0.2" - ora "^0.2.3" p-map "^1.1.1" rxjs "^6.1.0" - strip-ansi "^3.0.1" load-json-file@^1.0.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -5640,7 +5760,7 @@ load-json-file@^1.0.0: load-json-file@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -5657,8 +5777,8 @@ load-json-file@^4.0.0: strip-bom "^3.0.0" loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" + version "2.3.1" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979" loader-utils@^0.2.16: version "0.2.17" @@ -5684,6 +5804,13 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + lodash-id@^0.14.0: version "0.14.0" resolved "https://registry.yarnpkg.com/lodash-id/-/lodash-id-0.14.0.tgz#baf48934e543a1b5d6346f8c84698b1a8c803896" @@ -5774,6 +5901,10 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" +lodash.memoize@~3.0.3: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-3.0.4.tgz#2dcbd2c287cbc0a55cc42328bd0c736150d53e3f" + lodash.mergewith@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" @@ -5811,17 +5942,17 @@ lodash.templatesettings@^3.0.0: lodash._reinterpolate "^3.0.0" lodash.escape "^3.0.0" -lodash@4, lodash@4.17.10, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.11.2, lodash@^4.13.1, lodash@^4.16.2, lodash@^4.17.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.0, lodash@~4.17.10: +lodash@4, lodash@^4.0.0, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.11.2, lodash@^4.13.1, lodash@^4.16.2, lodash@^4.17.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0, lodash@^4.5.0, lodash@~4.17.10: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + +lodash@4.17.10: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" lodash@^3.10.1, lodash@^3.8.0: version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - -lodash@^4.11.1: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + resolved "http://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" log-symbols@^1.0.2: version "1.0.2" @@ -5844,37 +5975,34 @@ log-update@^1.0.2: log4js@^0.6.31: version "0.6.38" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" + resolved "http://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz#2c494116695d6fb25480943d3fc872e662a522fd" dependencies: readable-stream "~1.0.2" semver "~4.3.3" +log4js@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-1.1.1.tgz#c21d29c7604089e4f255833e7f94b3461de1ff43" + dependencies: + debug "^2.2.0" + semver "^5.3.0" + streamroller "^0.4.0" + loglevel@^1.4.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" -loglevelnext@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/loglevelnext/-/loglevelnext-1.0.5.tgz#36fc4f5996d6640f539ff203ba819641680d75a2" - dependencies: - es6-symbol "^3.1.1" - object.assign "^4.1.0" - long@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - loose-envify@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0, loud-rejection@^1.6.0: +loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" dependencies: @@ -5914,15 +6042,21 @@ macos-release@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-1.1.0.tgz#831945e29365b470aa8724b0ab36c8f8959d10fb" -make-dir@^1.0.0, make-dir@^1.1.0: +make-dir@^1.0.0, make-dir@^1.1.0, make-dir@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" dependencies: pify "^3.0.0" make-error@^1.1.1: - version "1.3.4" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.4.tgz#19978ed575f9e9545d2ff8c13e33b5d18a67d535" + version "1.3.5" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" + +map-age-cleaner@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" + dependencies: + p-defer "^1.0.0" map-cache@^0.2.2: version "0.2.2" @@ -5938,20 +6072,21 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -marked@^0.3.19: - version "0.3.19" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" +marked@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.5.1.tgz#062f43b88b02ee80901e8e8d8e6a620ddb3aa752" math-random@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" dependencies: hash-base "^3.0.0" inherits "^2.0.1" + safe-buffer "^5.1.2" media-typer@0.3.0: version "0.3.0" @@ -5987,6 +6122,14 @@ mem@^1.1.0: dependencies: mimic-fn "^1.0.0" +mem@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^1.0.0" + p-is-promise "^1.1.0" + memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -6073,15 +6216,15 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.34.0 < 2", mime-db@~1.35.0: - version "1.35.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" +"mime-db@>= 1.36.0 < 2", mime-db@~1.36.0: + version "1.36.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: - version "2.1.19" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.20" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" dependencies: - mime-db "~1.35.0" + mime-db "~1.36.0" mime@1.4.1: version "1.4.1" @@ -6091,7 +6234,7 @@ mime@^1.3.4, mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" -mime@^2.0.3, mime@^2.1.0: +mime@^2.0.3, mime@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" @@ -6104,11 +6247,11 @@ mimic-response@^1.0.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" mini-css-extract-plugin@~0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.1.tgz#d2bcf77bb2596b8e4bd9257e43d3f9164c2e86cb" + version "0.4.4" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz#c10410a004951bd3cedac1da69053940fccb625d" dependencies: - "@webpack-contrib/schema-utils" "^1.0.0-beta.0" loader-utils "^1.1.0" + schema-utils "^1.0.0" webpack-sources "^1.1.0" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: @@ -6133,23 +6276,23 @@ minimatch@2.x: minimist@0.0.8: version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" minimist@^0.1.0: version "0.1.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" minimist@~0.0.1: version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" minipass@^2.2.1, minipass@^2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233" + version "2.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" dependencies: safe-buffer "^5.1.2" yallist "^3.0.0" @@ -6191,13 +6334,13 @@ mixin-object@^2.0.1: mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" mkdirp@~0.3.5: version "0.3.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" + resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz#de3e5f8961c88c787ee1368df849ac4413eca8d7" mocha@^5.0.5: version "5.2.0" @@ -6220,12 +6363,12 @@ moment@^2.20.1, moment@^2.21.0: resolved "https://registry.yarnpkg.com/moment/-/moment-2.22.2.tgz#3c257f9839fc0e93ff53149632239eb90783ff66" morgan@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.0.tgz#d01fa6c65859b76fcf31b3cb53a3821a311d8051" + version "1.9.1" + resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.9.1.tgz#0a8d16734a1d9afbc824b99df87e738e58e2da59" dependencies: basic-auth "~2.0.0" debug "2.6.9" - depd "~1.1.1" + depd "~1.1.2" on-finished "~2.3.0" on-headers "~1.0.1" @@ -6242,11 +6385,11 @@ move-concurrently@^1.0.1: ms@0.7.1: version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + resolved "http://registry.npmjs.org/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" ms@0.7.2: version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + resolved "http://registry.npmjs.org/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" ms@2.0.0: version "2.0.0" @@ -6317,12 +6460,12 @@ mz@^2.4.0: thenify-all "^1.0.0" nan@^2.10.0, nan@^2.9.2: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + version "2.11.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" nanoid@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-1.1.0.tgz#b18e806e1cdbfdbe030374d5cf08a48cbc80b474" + version "1.2.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-1.2.6.tgz#5b9427cabf41f5df1fc371b14c969ffcd3b095aa" nanomatch@^1.2.9: version "1.2.13" @@ -6349,15 +6492,7 @@ nconf@^0.10.0: secure-keys "^1.0.0" yargs "^3.19.0" -needle@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d" - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - -needle@^2.2.4: +needle@^2.2.1, needle@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" dependencies: @@ -6370,8 +6505,8 @@ negotiator@0.6.1: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" neo-async@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + version "2.5.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" netmask@^1.0.6: version "1.0.6" @@ -6386,24 +6521,24 @@ ng2-mock-component@^0.1.1: resolved "https://registry.yarnpkg.com/ng2-mock-component/-/ng2-mock-component-0.1.1.tgz#5980e8887523754f855febc0c11f6c20f016d865" ngx-device-detector@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/ngx-device-detector/-/ngx-device-detector-1.3.0.tgz#df36e034572ee4b3e68dda26f2c57c67f0280f2d" + version "1.3.3" + resolved "https://registry.yarnpkg.com/ngx-device-detector/-/ngx-device-detector-1.3.3.tgz#87371c03abe08a6bf1b96ab5ca891e6356b63913" ngx-md@~6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/ngx-md/-/ngx-md-6.0.0.tgz#67c9a1ac49f4608d43d5b309d8d7ecc8ae7a6898" + version "6.0.9" + resolved "https://registry.yarnpkg.com/ngx-md/-/ngx-md-6.0.9.tgz#0664ccf05e84e64afc1c134b89259452364ee4cb" dependencies: - marked "^0.3.19" - prismjs "^1.14.0" + marked "^0.5.0" + prismjs "^1.15.0" tslib "^1.9.0" ngx-pagination@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/ngx-pagination/-/ngx-pagination-3.1.1.tgz#fcde5cb5fd4a1bd6aa785ff062a55f3deefcd3ac" + version "3.2.1" + resolved "https://registry.yarnpkg.com/ngx-pagination/-/ngx-pagination-3.2.1.tgz#d82fe15b03a628621dabb835ebc90011f2557689" nice-try@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" no-case@^2.2.0: version "2.3.2" @@ -6419,9 +6554,9 @@ node-forge@0.7.5: version "0.7.5" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" -node-gyp@^3.3.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.7.0.tgz#789478e8f6c45e277aa014f3e28f958f286f9203" +node-gyp@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" dependencies: fstream "^1.0.0" glob "^7.0.3" @@ -6430,7 +6565,7 @@ node-gyp@^3.3.1: nopt "2 || 3" npmlog "0 || 1 || 2 || 3 || 4" osenv "0" - request ">=2.9.0 <2.82.0" + request "^2.87.0" rimraf "2" semver "~5.3.0" tar "^2.0.0" @@ -6479,9 +6614,9 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-sass@^4.9.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.2.tgz#5e63fe6bd0f2ae3ac9d6c14ede8620e2b8bdb437" +node-sass@^4.9.0, node-sass@^4.9.3: + version "4.9.3" + resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224" dependencies: async-foreach "^0.1.3" chalk "^1.1.1" @@ -6496,7 +6631,7 @@ node-sass@^4.9.0: meow "^3.7.0" mkdirp "^0.5.1" nan "^2.10.0" - node-gyp "^3.3.1" + node-gyp "^3.8.0" npmlog "^4.0.0" request "2.87.0" sass-graph "^2.2.4" @@ -6555,8 +6690,8 @@ normalize-url@2.0.1: sort-keys "^2.0.0" npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" "npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0": version "6.1.0" @@ -6568,8 +6703,8 @@ npm-bundled@^1.0.1: validate-npm-package-name "^3.0.0" npm-packlist@^1.1.6: - version "1.1.11" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" + version "1.1.12" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -6639,10 +6774,14 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -oauth-sign@~0.8.1, oauth-sign@~0.8.2: +oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + object-assign@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" @@ -6667,7 +6806,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-keys@^1.0.11, object-keys@^1.0.8: +object-keys@^1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -6677,15 +6816,6 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - object.getownpropertydescriptors@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" @@ -6736,13 +6866,7 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" -opn@^5.1.0, opn@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" - dependencies: - is-wsl "^1.1.0" - -opn@^5.2.0: +opn@^5.1.0, opn@^5.2.0, opn@^5.3.0: version "5.4.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" dependencies: @@ -6770,20 +6894,11 @@ options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" -ora@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" - dependencies: - chalk "^1.1.1" - cli-cursor "^1.0.2" - cli-spinners "^0.1.2" - object-assign "^4.0.1" - original@>=0.0.5: - version "1.0.1" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.1.tgz#b0a53ff42ba997a8c9cd1fb5daaeb42b9d693190" + version "1.0.2" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" dependencies: - url-parse "~1.4.0" + url-parse "^1.4.3" os-browserify@^0.3.0: version "0.3.0" @@ -6795,7 +6910,7 @@ os-homedir@^1.0.0: os-locale@^1.4.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + resolved "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" dependencies: lcid "^1.0.0" @@ -6807,6 +6922,14 @@ os-locale@^2.0.0: lcid "^1.0.0" mem "^1.1.0" +os-locale@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" + dependencies: + execa "^0.10.0" + lcid "^2.0.0" + mem "^4.0.0" + os-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/os-name/-/os-name-2.0.1.tgz#b9a386361c17ae3a21736ef0599405c9a8c5dc5e" @@ -6831,7 +6954,11 @@ p-cancelable@^0.3.0: p-cancelable@^0.4.0: version "0.4.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" + resolved "http://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" p-each-series@^1.0.0: version "1.0.0" @@ -6845,7 +6972,7 @@ p-finally@^1.0.0: p-is-promise@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" + resolved "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" p-lazy@^1.0.0: version "1.0.0" @@ -6857,12 +6984,24 @@ p-limit@^1.0.0, p-limit@^1.1.0: dependencies: p-try "^1.0.0" +p-limit@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + dependencies: + p-try "^2.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" dependencies: p-limit "^1.1.0" +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + dependencies: + p-limit "^2.0.0" + p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" @@ -6887,6 +7026,10 @@ p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" +p-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + pac-proxy-agent@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-2.0.2.tgz#90d9f6730ab0f4d2607dcdcd4d3d641aa26c3896" @@ -6925,6 +7068,12 @@ pad-right@^0.2.2: dependencies: repeat-string "^1.5.2" +pad@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/pad/-/pad-2.2.1.tgz#e53e5de1304bc4c6c38004cad803f7641cff3220" + dependencies: + wcwidth "^1.0.1" + pako@~1.0.2, pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" @@ -6945,7 +7094,7 @@ param-case@2.1.x: parse-asn1@^5.0.0: version "5.1.1" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" + resolved "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" @@ -6984,8 +7133,8 @@ parse5@^4.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" parse5@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.0.0.tgz#4d02710d44f3c3846197a11e205d4ef17842b81a" + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2" parsejson@0.0.3: version "0.0.3" @@ -7044,8 +7193,8 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" path-to-regexp@0.1.7: version "0.1.7" @@ -7084,13 +7233,13 @@ path@0.12.7: process "^0.11.1" util "^0.10.3" -pathval@^1.0.0: +pathval@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" pbkdf2@^3.0.3: - version "3.0.16" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -7102,10 +7251,6 @@ pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -7148,19 +7293,35 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + dependencies: + find-up "^3.0.0" + please-upgrade-node@^3.0.2: version "3.1.1" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.1.1.tgz#ed320051dfcc5024fae696712c8288993595e8ac" dependencies: semver-compare "^1.0.0" +plugin-error@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" + dependencies: + ansi-cyan "^0.1.1" + ansi-red "^0.1.1" + arr-diff "^1.0.1" + arr-union "^2.0.1" + extend-shallow "^1.1.2" + pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" portfinder@^1.0.13, portfinder@^1.0.9: - version "1.0.13" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + version "1.0.17" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a" dependencies: async "^1.5.2" debug "^2.2.0" @@ -7233,13 +7394,9 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -prettier@^1.12.1: - version "1.14.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.0.tgz#847c235522035fd988100f1f43cf20a7d24f9372" - -prettier@^1.7.4: - version "1.14.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.2.tgz#0ac1c6e1a90baa22a62925f41963c841983282f9" +prettier@^1.12.1, prettier@^1.7.4: + version "1.14.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.3.tgz#90238dd4c0684b7edce5f83b0fb7328e48bd0895" pretty-bytes@^4.0.2: version "4.0.2" @@ -7252,14 +7409,14 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" -pretty-format@^23.5.0: - version "23.5.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.5.0.tgz#0f9601ad9da70fe690a269cd3efca732c210687c" +pretty-format@^23.6.0: + version "23.6.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" dependencies: ansi-regex "^3.0.0" ansi-styles "^3.2.0" -prismjs@^1.14.0: +prismjs@^1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.15.0.tgz#8801d332e472091ba8def94976c8877ad60398d9" optionalDependencies: @@ -7300,8 +7457,8 @@ promise-inflight@^1.0.1: asap "~2.0.3" protractor-beautiful-reporter@^1.2.1: - version "1.2.3" - resolved "https://registry.yarnpkg.com/protractor-beautiful-reporter/-/protractor-beautiful-reporter-1.2.3.tgz#84a224d357703d90f2a498f691ecc62857442f93" + version "1.2.5" + resolved "https://registry.yarnpkg.com/protractor-beautiful-reporter/-/protractor-beautiful-reporter-1.2.5.tgz#c56194c704828c83e7a72d546f953fa30d3d4711" dependencies: circular-json "^0.3.1" fs-extra "^3.0.1" @@ -7326,13 +7483,13 @@ protractor-multiple-cucumber-html-reporter-plugin@^1.8.0: multiple-cucumber-html-reporter "^1.11.0" protractor-screenshoter-plugin@^0.10.1: - version "0.10.1" - resolved "https://registry.yarnpkg.com/protractor-screenshoter-plugin/-/protractor-screenshoter-plugin-0.10.1.tgz#0db218af99df381fce7254d47a2ebcaa307cf3f9" + version "0.10.3" + resolved "https://registry.yarnpkg.com/protractor-screenshoter-plugin/-/protractor-screenshoter-plugin-0.10.3.tgz#27de0caaa49eddda7cd80ab9ba809937733aafee" dependencies: circular-json "^0.5.1" - fs-extra "^5.0.0" - klaw-sync "^3.0.2" - lodash "^4.17.4" + fs-extra "^7.0.0" + klaw-sync "^6.0.0" + lodash "^4.17.11" mkdirp "^0.5.1" moment "^2.20.1" q "^1.5.1" @@ -7369,7 +7526,7 @@ proxy-addr@~2.0.3: proxy-agent@^2.0.0: version "2.3.1" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-2.3.1.tgz#3d49d863d46cf5f37ca8394848346ea02373eac6" + resolved "http://registry.npmjs.org/proxy-agent/-/proxy-agent-2.3.1.tgz#3d49d863d46cf5f37ca8394848346ea02373eac6" dependencies: agent-base "^4.2.0" debug "^3.1.0" @@ -7392,15 +7549,20 @@ pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +psl@^1.1.24: + version "1.1.29" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" + public-encrypt@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" create-hash "^1.1.0" parse-asn1 "^5.0.0" randombytes "^2.0.1" + safe-buffer "^5.1.2" pump@^2.0.0, pump@^2.0.1: version "2.0.1" @@ -7430,8 +7592,8 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" puppeteer@^1.6.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.8.0.tgz#9e8bbd2f5448cc19cac220efc0512837104877ad" + version "1.9.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.9.0.tgz#56dba79e7ea4faac807877bee3b23d63291fc59e" dependencies: debug "^3.1.0" extract-zip "^1.6.6" @@ -7458,23 +7620,19 @@ qs@6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" -qs@6.5.2, qs@~6.5.1: +qs@6.5.2, qs@~6.5.1, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - query-string@^5.0.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + resolved "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" dependencies: decode-uri-component "^0.2.0" object-assign "^4.1.0" strict-uri-encode "^1.0.0" -querystring-es3@^0.2.0: +querystring-es3@^0.2.0, querystring-es3@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -7483,12 +7641,12 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" querystringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755" + version "2.1.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" randomatic@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923" + version "3.1.0" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116" dependencies: is-number "^4.0.0" kind-of "^6.0.0" @@ -7533,7 +7691,7 @@ raw-loader@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" dependencies: @@ -7602,7 +7760,7 @@ read-pkg@^3.0.0: "readable-stream@1 || 2", readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -7614,16 +7772,16 @@ read-pkg@^3.0.0: readable-stream@1.0, readable-stream@~1.0.2: version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" dependencies: core-util-is "~1.0.0" inherits "~2.0.1" isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@1.1.x, readable-stream@~1.1.9: +readable-stream@1.1.x, readable-stream@^1.1.7, readable-stream@~1.1.9: version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -7632,7 +7790,7 @@ readable-stream@1.1.x, readable-stream@~1.1.9: readable-stream@~2.0.0, readable-stream@~2.0.6: version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" dependencies: core-util-is "~1.0.0" inherits "~2.0.1" @@ -7642,13 +7800,12 @@ readable-stream@~2.0.0, readable-stream@~2.0.6: util-deprecate "~1.0.1" readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" + graceful-fs "^4.1.11" + micromatch "^3.1.10" readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" recast@^0.12.5: version "0.12.9" @@ -7661,8 +7818,8 @@ recast@^0.12.5: source-map "~0.6.1" recast@^0.15.0: - version "0.15.3" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.15.3.tgz#5fc1fd1c8e2d4d027ee3977a176bbb8d1c83305e" + version "0.15.5" + resolved "https://registry.yarnpkg.com/recast/-/recast-0.15.5.tgz#6871177ee26720be80d7624e4283d5c855a5cb0b" dependencies: ast-types "0.11.5" esprima "~4.0.0" @@ -7764,9 +7921,20 @@ relateurl@0.2.x: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" +remap-istanbul@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/remap-istanbul/-/remap-istanbul-0.10.1.tgz#3aa58dd5021d499f336d3ba5bf3bbb91c1b88e37" + dependencies: + amdefine "^1.0.0" + istanbul "0.4.5" + minimatch "^3.0.3" + plugin-error "^0.1.2" + source-map "^0.6.1" + through2 "2.0.1" + remap-istanbul@^0.6.4: version "0.6.4" - resolved "https://registry.yarnpkg.com/remap-istanbul/-/remap-istanbul-0.6.4.tgz#ac551eff1aa641504b4f318d0303dda61e3bb695" + resolved "http://registry.npmjs.org/remap-istanbul/-/remap-istanbul-0.6.4.tgz#ac551eff1aa641504b4f318d0303dda61e3bb695" dependencies: amdefine "1.0.0" gulp-util "3.0.7" @@ -7779,18 +7947,18 @@ remove-trailing-separator@^1.0.1: resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" renderkid@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319" + version "2.0.2" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.2.tgz#12d310f255360c07ad8fde253f6c9e9de372d2aa" dependencies: css-select "^1.1.0" - dom-converter "~0.1" + dom-converter "~0.2" htmlparser2 "~3.3.0" strip-ansi "^3.0.0" - utila "~0.3" + utila "^0.4.0" repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" repeat-string@^0.2.2: version "0.2.2" @@ -7820,7 +7988,7 @@ request-progress@^2.0.1: dependencies: throttleit "^1.0.0" -request@2.87.0, request@^2.74.0, request@^2.81.0, request@^2.83.0, request@^2.87.0: +request@2.87.0: version "2.87.0" resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" dependencies: @@ -7845,32 +8013,30 @@ request@2.87.0, request@^2.74.0, request@^2.81.0, request@^2.83.0, request@^2.87 tunnel-agent "^0.6.0" uuid "^3.1.0" -"request@>=2.9.0 <2.82.0": - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" +request@^2.74.0, request@^2.81.0, request@^2.83.0, request@^2.87.0: + version "2.88.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" + aws-sign2 "~0.7.0" + aws4 "^1.8.0" caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" + combined-stream "~1.0.6" + extend "~3.0.2" forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" + form-data "~2.3.2" + har-validator "~5.1.0" + http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.4.3" tunnel-agent "^0.6.0" - uuid "^3.0.0" + uuid "^3.3.2" require-directory@^2.1.1: version "2.1.1" @@ -7909,7 +8075,7 @@ resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" -resolve@1.1.x: +resolve@1.1.7, resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" @@ -7947,12 +8113,6 @@ retry@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - rimraf@2, rimraf@^2.2.8, rimraf@^2.4.3, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" @@ -7961,7 +8121,7 @@ rimraf@2, rimraf@^2.2.8, rimraf@^2.4.3, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2. rimraf@~2.2.6: version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + resolved "http://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" @@ -7997,20 +8157,26 @@ rx-lite@*, rx-lite@^4.0.8: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" rx-polling@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rx-polling/-/rx-polling-1.0.0.tgz#47914b934e8f7c934e0d016ef7eb9019c55c9d48" + version "1.0.1" + resolved "https://registry.yarnpkg.com/rx-polling/-/rx-polling-1.0.1.tgz#d7dd8857633ba07ed4617dd333fcac51852693f1" rxjs-compat@^6.0.0-rc.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/rxjs-compat/-/rxjs-compat-6.2.2.tgz#3c0fcdb46130cc70aa55412c2b1147905ab4680a" + version "6.3.3" + resolved "https://registry.yarnpkg.com/rxjs-compat/-/rxjs-compat-6.3.3.tgz#2ab3b9ac0dac0c073749d55fef9c03ea1df2045c" rxjs@^5.5.2: - version "5.5.11" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.11.tgz#f733027ca43e3bec6b994473be4ab98ad43ced87" + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" dependencies: symbol-observable "1.0.1" rxjs@^6.0.0, rxjs@^6.1.0, rxjs@^6.2.1: + version "6.3.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" + dependencies: + tslib "^1.9.0" + +rxjs@~6.2.0: version "6.2.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" dependencies: @@ -8030,7 +8196,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0: +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -8043,15 +8209,16 @@ sass-graph@^2.2.4: scss-tokenizer "^0.2.3" yargs "^7.0.0" -sass-loader@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.0.3.tgz#6ca10871a1cc7549f8143db5a9958242c4e4ca2a" +sass-loader@^7.0.1, sass-loader@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d" dependencies: clone-deep "^2.0.1" loader-utils "^1.0.1" lodash.tail "^4.1.1" neo-async "^2.5.0" pify "^3.0.0" + semver "^5.5.0" saucelabs@^1.5.0: version "1.5.0" @@ -8061,7 +8228,7 @@ saucelabs@^1.5.0: sax@0.5.x: version "0.5.8" - resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" + resolved "http://registry.npmjs.org/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" sax@>=0.6.0, sax@^1.2.4: version "1.2.4" @@ -8073,11 +8240,19 @@ schema-utils@^0.3.0: dependencies: ajv "^5.0.0" -schema-utils@^0.4.0, schema-utils@^0.4.2, schema-utils@^0.4.3, schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" +schema-utils@^0.4.0, schema-utils@^0.4.2, schema-utils@^0.4.4, schema-utils@^0.4.5: + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + dependencies: + ajv "^6.1.0" + ajv-keywords "^3.1.0" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" dependencies: ajv "^6.1.0" + ajv-errors "^1.0.0" ajv-keywords "^3.1.0" scoped-regex@^1.0.0: @@ -8117,8 +8292,8 @@ selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: xml2js "^0.4.17" selfsigned@^1.9.1: - version "1.10.3" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz#d628ecf9e3735f84e8bafba936b3cf85bea43823" + version "1.10.4" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" dependencies: node-forge "0.7.5" @@ -8139,16 +8314,12 @@ semver-dsl@^1.0.1: semver "^5.3.0" semver-intersect@^1.1.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/semver-intersect/-/semver-intersect-1.3.1.tgz#8fa84a9e1028bd239e4530d1a3e181e698d884ba" + version "1.4.0" + resolved "https://registry.yarnpkg.com/semver-intersect/-/semver-intersect-1.4.0.tgz#bdd9c06bedcdd2fedb8cd352c3c43ee8c61321f3" dependencies: semver "^5.0.0" -"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", semver@^5.0.0, semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - -semver@^5.5.1: +"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", semver@^5.0.0, semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1: version "5.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" @@ -8211,10 +8382,6 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" @@ -8247,7 +8414,7 @@ setprototypeof@1.1.0: sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + resolved "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -8292,8 +8459,8 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" silent-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.0.tgz#2209706f1c850a9f1d10d0d840918b46f26e1bc9" + version "1.1.1" + resolved "https://registry.yarnpkg.com/silent-error/-/silent-error-1.1.1.tgz#f72af5b0d73682a2ba1778b7e32cd8aa7c2d8662" dependencies: debug "^2.2.0" @@ -8340,12 +8507,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - snyk-config@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/snyk-config/-/snyk-config-2.2.0.tgz#d400ce50e293ce5c3ade4cf46a53bea8205771e6" @@ -8606,8 +8767,8 @@ sort-keys@^2.0.0: is-plain-obj "^1.0.0" source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" source-list-map@~0.1.7: version "0.1.8" @@ -8629,14 +8790,7 @@ source-map-support@^0.4.0, source-map-support@^0.4.15, source-map-support@~0.4.0 dependencies: source-map "^0.5.6" -source-map-support@^0.5.0, source-map-support@^0.5.5: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13" - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-support@^0.5.7, source-map-support@^0.5.9: +source-map-support@^0.5.0, source-map-support@^0.5.5, source-map-support@^0.5.7, source-map-support@^0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" dependencies: @@ -8657,23 +8811,23 @@ source-map@0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" -source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" source-map@>=0.5.6: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" -source-map@^0.4.2, source-map@^0.4.4, source-map@~0.4.1: +source-map@^0.4.2, source-map@~0.4.1: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" dependencies: amdefine ">=0.0.4" -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.3: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" source-map@~0.2.0: version "0.2.0" @@ -8690,15 +8844,15 @@ spawn-cmd@0.0.2: resolved "https://registry.yarnpkg.com/spawn-cmd/-/spawn-cmd-0.0.2.tgz#6d5e251fad0eab00b0f193d245669a7a228ec0de" spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + version "3.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e" dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" spdx-expression-parse@^3.0.0: version "3.0.0" @@ -8708,8 +8862,8 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f" spdy-transport@^2.0.18: version "2.1.0" @@ -8828,8 +8982,8 @@ statuses@~1.4.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" stdout-stream@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" dependencies: readable-stream "^2.0.1" @@ -8867,6 +9021,15 @@ stream-shift@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" +streamroller@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.4.1.tgz#d435bd5974373abd9bd9068359513085106cc05f" + dependencies: + date-format "^0.0.0" + debug "^0.7.2" + mkdirp "^0.5.1" + readable-stream "^1.1.7" + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -8894,7 +9057,7 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string_decoder@^1.0.0, string_decoder@~1.1.1: +string_decoder@^1.0.0, string_decoder@^1.0.3, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" dependencies: @@ -8904,13 +9067,9 @@ string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" -stringstream@~0.0.4: - version "0.0.6" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + resolved "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" dependencies: ansi-regex "^2.0.0" @@ -8922,7 +9081,7 @@ strip-ansi@^4.0.0: strip-ansi@~0.1.0: version "0.1.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + resolved "http://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" strip-bom-stream@^2.0.0: version "2.0.0" @@ -8981,7 +9140,7 @@ stylus@^0.54.5: sax "0.5.x" source-map "0.1.x" -supports-color@5.4.0, supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0: +supports-color@5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" dependencies: @@ -8991,7 +9150,7 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^3.1.0, supports-color@^3.1.2: +supports-color@^3.1.0: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" dependencies: @@ -9003,6 +9162,12 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.0" +supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + dependencies: + has-flag "^3.0.0" + symbol-observable@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" @@ -9012,8 +9177,8 @@ symbol-observable@^1.1.0, symbol-observable@^1.2.0: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" tapable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" + version "1.1.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" tar@^2.0.0: version "2.2.1" @@ -9024,8 +9189,8 @@ tar@^2.0.0: inherits "2" tar@^4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd" + version "4.4.6" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" dependencies: chownr "^1.0.1" fs-minipass "^1.2.5" @@ -9105,7 +9270,7 @@ through2@^2.0.0: through@X.X.X, through@^2.3.6: version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" thunkify@^2.1.2: version "2.1.2" @@ -9123,7 +9288,7 @@ timed-out@^4.0.0, timed-out@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" -timers-browserify@^2.0.4: +timers-browserify@^2.0.2, timers-browserify@^2.0.4: version "2.0.10" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" dependencies: @@ -9133,6 +9298,12 @@ tiny-emitter@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.0.2.tgz#82d27468aca5ade8e5fd1e6d22b57dd43ebdfb7c" +tmp@0.0.29: + version "0.0.29" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" + dependencies: + os-tmpdir "~1.0.1" + tmp@0.0.30: version "0.0.30" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" @@ -9197,12 +9368,19 @@ toposort@^1.0.0: version "1.0.7" resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029" -tough-cookie@~2.3.0, tough-cookie@~2.3.3: +tough-cookie@~2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" dependencies: punycode "^1.4.1" +tough-cookie@~2.4.3: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + dependencies: + psl "^1.1.24" + punycode "^1.4.1" + traverse-chain@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" @@ -9220,14 +9398,14 @@ trim-right@^1.0.1: resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" "true-case-path@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" dependencies: - glob "^6.0.4" + glob "^7.1.2" ts-loader@^4.2.0: - version "4.4.2" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.4.2.tgz#778d4464b24436873c78f7f9e914d88194c2a248" + version "4.5.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.5.0.tgz#a1ce70b2dc799941fb2197605f0d67874097859b" dependencies: chalk "^2.3.0" enhanced-resolve "^4.0.0" @@ -9257,10 +9435,11 @@ tsconfig@^6.0.0: strip-bom "^3.0.0" strip-json-comments "^2.0.0" -tsickle@^0.29.0: - version "0.29.0" - resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.29.0.tgz#812806554bb46c1aa16eb0fe2a051da95ca8f5a4" +tsickle@^0.32.1: + version "0.32.1" + resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.32.1.tgz#f16e94ba80b32fc9ebe320dc94fbc2ca7f3521a5" dependencies: + jasmine-diff "^0.1.3" minimist "^1.2.0" mkdirp "^0.5.1" source-map "^0.6.0" @@ -9313,7 +9492,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-detect@^4.0.0: +type-detect@^4.0.0, type-detect@^4.0.5: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -9328,11 +9507,7 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -typescript@2.7.2, "typescript@>=2.6.2 <2.8": - version "2.7.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836" - -typescript@~2.9.1: +typescript@2.9.2, "typescript@>=2.6.2 <2.10", typescript@~2.9.1: version "2.9.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" @@ -9343,29 +9518,16 @@ uglify-es@^3.3.4: commander "~2.14.1" source-map "~0.6.1" -uglify-js@3.4.x: - version "3.4.6" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.6.tgz#bc546d53f3e02b05d97d0ca5a7abfe0fb0384ddb" +uglify-js@3.4.x, uglify-js@^3.1.4: + version "3.4.9" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" dependencies: - commander "~2.16.0" + commander "~2.17.1" source-map "~0.6.1" -uglify-js@^2.6: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - uglifyjs-webpack-plugin@^1.2.4, uglifyjs-webpack-plugin@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00" + version "1.3.0" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" dependencies: cacache "^10.0.4" find-cache-dir "^1.0.0" @@ -9400,14 +9562,14 @@ union-value@^1.0.0: set-value "^0.4.3" unique-filename@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" dependencies: unique-slug "^2.0.0" unique-slug@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" dependencies: imurmurhash "^0.1.4" @@ -9432,7 +9594,7 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -untildify@^3.0.2: +untildify@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/untildify/-/untildify-3.0.3.tgz#1e7b42b140bcfd922b22e70ca1265bfe3634c7c9" @@ -9475,7 +9637,7 @@ uri-js@^3.0.2: dependencies: punycode "^2.1.0" -uri-js@^4.2.1: +uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" dependencies: @@ -9485,17 +9647,13 @@ urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" -url-join@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" - url-loader@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.0.1.tgz#61bc53f1f184d7343da2728a1289ef8722ea45ee" + version "1.1.2" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8" dependencies: loader-utils "^1.1.0" mime "^2.0.3" - schema-utils "^0.4.3" + schema-utils "^1.0.0" url-parse-lax@^1.0.0: version "1.0.0" @@ -9509,7 +9667,7 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.1.8, url-parse@~1.4.0: +url-parse@^1.1.8, url-parse@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.3.tgz#bfaee455c889023219d757e045fa6a684ec36c15" dependencies: @@ -9565,11 +9723,7 @@ util@^0.10.3: dependencies: inherits "2.0.3" -utila@~0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226" - -utila@~0.4: +utila@^0.4.0, utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" @@ -9577,13 +9731,13 @@ utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" -uuid@^3.0.0, uuid@^3.0.1, uuid@^3.1.0, uuid@^3.2.1: +uuid@^3.0.1, uuid@^3.1.0, uuid@^3.2.1, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" v8-compile-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a" + version "2.0.2" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" v8flags@^3.0.0: version "3.1.1" @@ -9592,8 +9746,8 @@ v8flags@^3.0.0: homedir-polyfill "^1.0.1" validate-npm-package-license@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" @@ -9678,6 +9832,12 @@ wbuf@^1.1.0, wbuf@^1.7.2: dependencies: minimalistic-assert "^1.0.0" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + dependencies: + defaults "^1.0.3" + webassemblyjs@1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/webassemblyjs/-/webassemblyjs-1.4.3.tgz#0591893efb8fbde74498251cbe4b2d83df9239cb" @@ -9755,24 +9915,20 @@ webpack-core@^0.6.8: source-list-map "~0.1.7" source-map "~0.4.1" -webpack-dev-middleware@3.1.3, webpack-dev-middleware@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.1.3.tgz#8b32aa43da9ae79368c1bf1183f2b6cf5e1f39ed" +webpack-dev-middleware@3.4.0, webpack-dev-middleware@^3.1.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890" dependencies: - loud-rejection "^1.6.0" memory-fs "~0.4.1" - mime "^2.1.0" - path-is-absolute "^1.0.0" + mime "^2.3.1" range-parser "^1.0.3" - url-join "^4.0.0" - webpack-log "^1.0.1" + webpack-log "^2.0.0" webpack-dev-server@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.5.tgz#87477252e1ac6789303fb8cd3e585fa5d508a401" + version "3.1.9" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.9.tgz#8b32167624d2faff40dcedc2cbce17ed1f34d3e0" dependencies: ansi-html "0.0.7" - array-includes "^3.0.3" bonjour "^3.5.0" chokidar "^2.0.0" compression "^1.5.2" @@ -9782,13 +9938,14 @@ webpack-dev-server@^3.1.4: express "^4.16.2" html-entities "^1.2.0" http-proxy-middleware "~0.18.0" - import-local "^1.0.0" - internal-ip "1.2.0" + import-local "^2.0.0" + internal-ip "^3.0.1" ip "^1.1.5" killable "^1.0.0" loglevel "^1.4.1" opn "^5.1.0" portfinder "^1.0.9" + schema-utils "^1.0.0" selfsigned "^1.9.1" serve-index "^1.7.2" sockjs "0.3.19" @@ -9796,35 +9953,33 @@ webpack-dev-server@^3.1.4: spdy "^3.4.1" strip-ansi "^3.0.0" supports-color "^5.1.0" - webpack-dev-middleware "3.1.3" - webpack-log "^1.1.2" - yargs "11.0.0" + webpack-dev-middleware "3.4.0" + webpack-log "^2.0.0" + yargs "12.0.2" -webpack-log@^1.0.1, webpack-log@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-1.2.0.tgz#a4b34cda6b22b518dbb0ab32e567962d5c72a43d" +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" dependencies: - chalk "^2.1.0" - log-symbols "^2.1.0" - loglevelnext "^1.0.1" - uuid "^3.1.0" + ansi-colors "^3.0.0" + uuid "^3.3.2" webpack-merge@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.3.tgz#8aaff2108a19c29849bc9ad2a7fd7fce68e87c4a" + version "4.1.4" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" dependencies: lodash "^4.17.5" webpack-sources@^1.0.1, webpack-sources@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" dependencies: source-list-map "^2.0.0" source-map "~0.6.1" webpack-subresource-integrity@^1.1.0-rc.4: - version "1.1.0-rc.4" - resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.4.tgz#c5c4e3d690f9d2f64a9550e07a8767f9796aa5d8" + version "1.1.0-rc.7" + resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.7.tgz#6dce39897484aa4914560883f551b69aad93a408" dependencies: webpack-core "^0.6.8" @@ -9902,18 +10057,10 @@ win-release@^1.0.0: dependencies: semver "^5.0.1" -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - window-size@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -9930,7 +10077,7 @@ worker-farm@^1.5.2: wrap-ansi@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -10000,7 +10147,7 @@ xml2js@^0.4.17: xmlbuilder@~9.0.1: version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + resolved "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" xmlhttprequest-ssl@1.5.3: version "1.5.3" @@ -10010,6 +10157,10 @@ xregexp@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" +xregexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -10024,7 +10175,7 @@ y18n@^3.2.0, y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" -y18n@^4.0.0: +"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" @@ -10036,7 +10187,7 @@ yallist@^3.0.0, yallist@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" -yargs-parser@^10.0.0: +yargs-parser@^10.0.0, yargs-parser@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" dependencies: @@ -10066,22 +10217,22 @@ yargs-parser@^9.0.2: dependencies: camelcase "^4.1.0" -yargs@11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.0.0.tgz#c052931006c5eee74610e5fc0354bedfd08a201b" +yargs@12.0.2: + version "12.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" dependencies: cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" + decamelize "^2.0.0" + find-up "^3.0.0" get-caller-file "^1.0.1" - os-locale "^2.0.0" + os-locale "^3.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" string-width "^2.0.0" which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^10.1.0" yargs@^10.0.3: version "10.1.2" @@ -10102,7 +10253,7 @@ yargs@^10.0.3: yargs@^11.1.0: version "11.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + resolved "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" dependencies: cliui "^4.0.0" decamelize "^1.1.1" @@ -10119,7 +10270,7 @@ yargs@^11.1.0: yargs@^3.19.0: version "3.32.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" + resolved "http://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" dependencies: camelcase "^2.0.1" cliui "^3.0.3" @@ -10167,19 +10318,10 @@ yargs@^9.0.1: yargs@~1.2.6: version "1.2.6" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b" + resolved "http://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz#9c7b4a82fd5d595b2bf17ab6dcc43135432fe34b" dependencies: minimist "^0.1.0" -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" @@ -10191,24 +10333,24 @@ yeast@0.1.2: resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" yeoman-environment@^2.0.5, yeoman-environment@^2.1.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.3.1.tgz#1aa00cc474a8e48518ab2b0f64b43034215e9997" + version "2.3.3" + resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.3.3.tgz#1bd9720714cc49036e901503a789d809df8f51bf" dependencies: - chalk "^2.1.0" + chalk "^2.4.1" cross-spawn "^6.0.5" debug "^3.1.0" - diff "^3.3.1" + diff "^3.5.0" escape-string-regexp "^1.0.2" globby "^8.0.1" grouped-queue "^0.3.3" - inquirer "^5.2.0" + inquirer "^6.0.0" is-scoped "^1.0.0" lodash "^4.17.10" - log-symbols "^2.1.0" + log-symbols "^2.2.0" mem-fs "^1.1.0" strip-ansi "^4.0.0" text-table "^0.2.0" - untildify "^3.0.2" + untildify "^3.0.3" yeoman-generator@^2.0.5: version "2.0.5"