diff --git a/.circleci/config.yml b/.circleci/config.yml index 88c4db74c6..ec67d5cf7b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -12,9 +12,9 @@ references: - *npm_cache_key # Note: important that values of guids and keys have matching order!" study_keys: &study_keys - "osteo brain angio mbc testboston mpc prion atcp rgp" + "osteo brain angio mbc testboston mpc prion atcp rgp esc" study_guids: &study_guids - "CMI-OSTEO cmi-brain ANGIO cmi-mbc testboston cmi-mpc PRION atcp rgp" + "CMI-OSTEO cmi-brain ANGIO cmi-mbc testboston cmi-mpc PRION atcp rgp cmi-esc" config_deployment_dir: &config_deployment_dir config/deployment @@ -436,6 +436,8 @@ jobs: study_key: atcp - conditionally-launch-build-and-store: study_key: rgp + - conditionally-launch-build-and-store: + study_key: esc - conditionally-launch-build-and-store: study_key: prion @@ -541,6 +543,9 @@ workflows: - deploy-stored-build-job: <<: *deploy_branch_filters study_key: rgp + - deploy-stored-build-job: + <<: *deploy_branch_filters + study_key: esc - deploy-stored-build-job: <<: *deploy_branch_filters study_key: prion @@ -578,6 +583,9 @@ workflows: - build-and-deploy-job: name: rgp-nightly study_key: rgp + - build-and-deploy-job: + name: esc-nightly + study_key: esc - build-and-deploy-job: name: prion-nightly study_key: prion diff --git a/config/deployment/dev/dispatch.yaml b/config/deployment/dev/dispatch.yaml index 222ca300bd..e914c020be 100644 --- a/config/deployment/dev/dispatch.yaml +++ b/config/deployment/dev/dispatch.yaml @@ -11,6 +11,8 @@ dispatch: service: testboston - url: "mpc.dev.datadonationplatform.org/*" service: mpc + - url: "esc.dev.datadonationplatform.org/*" + service: esc - url: "prion.dev.datadonationplatform.org/*" service: prion - url: "pepper-dev.datadonationplatform.org/docs*" diff --git a/config/deployment/staging/dispatch.yaml b/config/deployment/staging/dispatch.yaml index 78029b67b0..c7810bbd05 100644 --- a/config/deployment/staging/dispatch.yaml +++ b/config/deployment/staging/dispatch.yaml @@ -11,6 +11,8 @@ dispatch: service: testboston - url: "mpc.staging.datadonationplatform.org/*" service: mpc + - url: "esc.staging.datadonationplatform.org/*" + service: esc - url: "prion.staging.datadonationplatform.org/*" service: prion - url: "pepper-staging.datadonationplatform.org/docs*" diff --git a/config/deployment/test/dispatch.yaml b/config/deployment/test/dispatch.yaml index b2481f8486..df7d2e9993 100644 --- a/config/deployment/test/dispatch.yaml +++ b/config/deployment/test/dispatch.yaml @@ -11,6 +11,8 @@ dispatch: service: testboston - url: "mpc.test.datadonationplatform.org/*" service: mpc + - url: "esc.test.datadonationplatform.org/*" + service: esc - url: "prion.test.datadonationplatform.org/*" service: prion - url: "pepper-test.datadonationplatform.org/docs*" diff --git a/config/pepperConfig.js.ctmpl b/config/pepperConfig.js.ctmpl index ed9498a1d0..7fdc0b474b 100644 --- a/config/pepperConfig.js.ctmpl +++ b/config/pepperConfig.js.ctmpl @@ -87,6 +87,22 @@ var DDP_ENV = { {{end}} {{end}} +{{if eq $study_guid "cmi-esc"}} + {{if eq $environment "dev"}} + DDP_ENV['auth0ClientId'] = "2LLtNaf1eoiwyMiORtgrcOzL0aASMNC3"; + DDP_ENV['projectGAToken'] = "UA-108484823-1"; + {{else if eq $environment "test"}} + DDP_ENV['auth0ClientId'] = "fixme-not-set"; + DDP_ENV['projectGAToken'] = "UA-108484823-1"; + {{else if eq $environment "staging"}} + DDP_ENV['auth0ClientId'] = "fixme-not-set"; + DDP_ENV['projectGAToken'] = "UA-108484823-1"; + {{else if eq $environment "prod"}} + DDP_ENV['auth0ClientId'] = "fixme-not-set"; + DDP_ENV['projectGAToken'] = "UA-61688341-15"; + {{end}} +{{end}} + {{if eq $study_guid "cmi-brain"}} {{if eq $environment "dev"}} DDP_ENV['auth0ClientId'] = "ZYh16tmcKQrMbWEqFOXSw4wQTvAcaQIJ"; diff --git a/ddp-workspace/README.md b/ddp-workspace/README.md index e46b6368ff..491cd522a7 100644 --- a/ddp-workspace/README.md +++ b/ddp-workspace/README.md @@ -24,6 +24,7 @@ DDP apps: ng serve ddp-angio ng serve ddp-atcp ng serve ddp-brain +ng serve ddp-esc ng serve ddp-mbc ng serve ddp-mpc ng serve ddp-osteo diff --git a/ddp-workspace/angular.json b/ddp-workspace/angular.json index 30e7029af5..fce0d35e9b 100644 --- a/ddp-workspace/angular.json +++ b/ddp-workspace/angular.json @@ -1735,6 +1735,156 @@ } } } + }, + "ddp-esc": { + "projectType": "application", + "schematics": { + "@schematics/angular:component": { + "style": "scss" + } + }, + "root": "projects/ddp-esc", + "sourceRoot": "projects/ddp-esc/src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "outputPath": "dist/ddp-esc", + "index": "projects/ddp-esc/src/index.html", + "main": "projects/ddp-esc/src/main.ts", + "polyfills": "projects/ddp-esc/src/polyfills.ts", + "tsConfig": "projects/ddp-esc/tsconfig.app.json", + "aot": true, + "assets": [ + "projects/ddp-esc/src/favicon.ico", + "projects/ddp-esc/src/favicon-alert.ico", + "projects/ddp-esc/src/assets", + { + "glob": "*.pdf", + "input": "projects/ddp-esc/src/pdf/", + "output": "/" + }, + { + "glob": "pepperConfig.js", + "input": "projects/ddp-esc/output-config/", + "output": "assets/config" + } + ], + "styles": [ + "projects/ddp-esc/src/theme.scss", + "projects/ddp-esc/src/styles.scss" + ], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "projects/ddp-esc/src/environments/environment.ts", + "with": "projects/ddp-esc/src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true, + "budgets": [ + { + "type": "initial", + "maximumWarning": "5mb", + "maximumError": "5mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "25kb" + } + ] + }, + "es5": { + "budgets": [ + { + "type": "anyComponentStyle", + "maximumWarning": "25kb" + } + ], + "tsConfig": "projects/ddp-esc/tsconfig.es5.json" + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "ddp-esc:build" + }, + "configurations": { + "production": { + "browserTarget": "ddp-esc:build:production" + }, + "es5": { + "browserTarget": "ddp-esc:build:es5" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "ddp-esc:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "projects/ddp-esc/src/test.ts", + "polyfills": "projects/ddp-esc/src/polyfills.ts", + "tsConfig": "projects/ddp-esc/tsconfig.spec.json", + "karmaConfig": "projects/ddp-esc/karma.conf.js", + "assets": [ + "projects/ddp-esc/src/favicon.ico", + "projects/ddp-esc/src/favicon-alert.ico", + "projects/ddp-esc/src/assets", + { + "glob": "*.pdf", + "input": "projects/ddp-esc/src/pdf/", + "output": "/" + } + ], + "styles": [ + "projects/ddp-esc/src/styles.scss" + ], + "scripts": [] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": [ + "projects/ddp-esc/tsconfig.app.json", + "projects/ddp-esc/tsconfig.spec.json", + "projects/ddp-esc/e2e/tsconfig.json" + ], + "exclude": [ + "**/node_modules/**" + ] + } + }, + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "projects/ddp-esc/e2e/protractor.conf.js", + "devServerTarget": "ddp-esc:serve" + }, + "configurations": { + "production": { + "devServerTarget": "ddp-esc:serve:production" + } + } + } + } } }, "defaultProject": "ddp-sdk", @@ -1743,4 +1893,4 @@ "style": "scss" } } -} +} \ No newline at end of file diff --git a/ddp-workspace/projects/ddp-esc/.browserslistrc b/ddp-workspace/projects/ddp-esc/.browserslistrc new file mode 100644 index 0000000000..80848532e4 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/.browserslistrc @@ -0,0 +1,12 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +> 0.5% +last 2 versions +Firefox ESR +not dead +not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/ddp-workspace/projects/ddp-esc/.editorconfig b/ddp-workspace/projects/ddp-esc/.editorconfig new file mode 100644 index 0000000000..e89330a618 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/.editorconfig @@ -0,0 +1,13 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false diff --git a/ddp-workspace/projects/ddp-esc/.gitignore b/ddp-workspace/projects/ddp-esc/.gitignore new file mode 100644 index 0000000000..deafd5f2b5 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/.gitignore @@ -0,0 +1,53 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/tmp +/out-tsc +# Only exists if Bazel was run +/bazel-out + +# dependencies +/node_modules + +# profiling files +chrome-profiler-events.json +speed-measure-plugin.json + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +.history/* + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# e2e +/e2e/*.js +/e2e/*.map + +# System Files +.DS_Store +Thumbs.db + +# ignore rendered configs--they will be rebuilt at deploy time +src/assets/config/* \ No newline at end of file diff --git a/ddp-workspace/projects/ddp-esc/app.yaml b/ddp-workspace/projects/ddp-esc/app.yaml new file mode 100644 index 0000000000..2b8637f828 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/app.yaml @@ -0,0 +1,18 @@ +service: esc +runtime: python37 + +# This setting will not matter except to prevent default automatic-scaling which prevents disabling +# earlier versions of this service +basic_scaling: + max_instances: 1 + +handlers: + - url: /(.*\.(css|eot|gz|html|ico|js|map|png|svg|ttf|woff|woff2|jpg|jpeg|gif|png|json|pdf)) + static_files: dist/\1 + upload: dist/(.*\.(css|eot|gz|html|ico|js|map|png|svg|ttf|woff|woff2|jpg|jpeg|gif|png|json|pdf)) + secure: always + + - url: /(.*) + static_files: dist/index.html + upload: dist/index.html + secure: always diff --git a/ddp-workspace/projects/ddp-esc/e2e/protractor.conf.js b/ddp-workspace/projects/ddp-esc/e2e/protractor.conf.js new file mode 100644 index 0000000000..7c798cfff0 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/e2e/protractor.conf.js @@ -0,0 +1,32 @@ +// @ts-check +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require('jasmine-spec-reporter'); + +/** + * @type { import("protractor").Config } + */ +exports.config = { + allScriptsTimeout: 11000, + specs: [ + './src/**/*.e2e-spec.ts' + ], + capabilities: { + browserName: 'chrome' + }, + directConnect: true, + baseUrl: 'http://localhost:4200/', + framework: 'jasmine', + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require('ts-node').register({ + project: require('path').join(__dirname, './tsconfig.json') + }); + jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; \ No newline at end of file diff --git a/ddp-workspace/projects/ddp-esc/e2e/src/app.e2e-spec.ts b/ddp-workspace/projects/ddp-esc/e2e/src/app.e2e-spec.ts new file mode 100644 index 0000000000..e81e01421e --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/e2e/src/app.e2e-spec.ts @@ -0,0 +1,23 @@ +import { AppPage } from './app.po'; +import { browser, logging } from 'protractor'; + +describe('workspace-project App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getTitleText()).toEqual('ddp-esc app is running!'); + }); + + afterEach(async () => { + // Assert that there are no errors emitted from the browser + const logs = await browser.manage().logs().get(logging.Type.BROWSER); + expect(logs).not.toContain(jasmine.objectContaining({ + level: logging.Level.SEVERE, + } as logging.Entry)); + }); +}); diff --git a/ddp-workspace/projects/ddp-esc/e2e/src/app.po.ts b/ddp-workspace/projects/ddp-esc/e2e/src/app.po.ts new file mode 100644 index 0000000000..b8498c26f2 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get(browser.baseUrl) as Promise; + } + + getTitleText() { + return element(by.css('app-root .content span')).getText() as Promise; + } +} diff --git a/ddp-workspace/projects/ddp-esc/e2e/tsconfig.json b/ddp-workspace/projects/ddp-esc/e2e/tsconfig.json new file mode 100644 index 0000000000..bc240fbf87 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/e2e/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "../../../out-tsc/e2e", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} diff --git a/ddp-workspace/projects/ddp-esc/karma.conf.js b/ddp-workspace/projects/ddp-esc/karma.conf.js new file mode 100644 index 0000000000..170d6df6e0 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/karma.conf.js @@ -0,0 +1,32 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../../coverage/ddp-esc'), + reports: ['html', 'lcovonly', 'text-summary'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/ddp-workspace/projects/ddp-esc/src/app-theme.scss b/ddp-workspace/projects/ddp-esc/src/app-theme.scss new file mode 100644 index 0000000000..38209428b6 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/app-theme.scss @@ -0,0 +1,51 @@ +@import '~@angular/material/theming'; +@include mat-core(); + +$md-primary: ( + 50: transparent, + 100: #FFFFFF, + 200: #F5F5F5, + 300: #A8A8A8, + 400: #666666, + 500: #313131, + 600: #90acd7, + 700: #ffc145, + 800: #8C8C8C, + 900: #5A5A5A, + 1000: #000000, + 1200: #AD0000, + 1300: #FAFAFA, + 1400: #FBE9D8, + 1500: #686868, + 1600: #FADFC4, + 1700: #333, + 1800: #F2F2F2, + 2000: #FFD3D3, + 2100: #6b5757, + 2200: #376996, + contrast: ( + 50: #000000, + 100: #000000, + 200: #000000, + 300: #000000, + 400: #000000, + 500: #000000, + 600: #000000, + 700: #000000, + 800: #000000, + 900: #000000, + 1000: #000000, + 1200: #000000, + 1300: #000000, + 1400: #000000, + 1500: #000000, + 1600: #000000, + 1700: #000000, + 1800: #000000, + 2000: #000000, + 2100: #000000, + 2200: #000000 + ) +); + +$app-theme: mat-palette($md-primary); \ No newline at end of file diff --git a/ddp-workspace/projects/ddp-esc/src/app/app-routing.module.ts b/ddp-workspace/projects/ddp-esc/src/app/app-routing.module.ts new file mode 100644 index 0000000000..6fa8f68e7d --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/app/app-routing.module.ts @@ -0,0 +1,233 @@ +import { NgModule } from '@angular/core'; +import { Routes, RouterModule } from '@angular/router'; + +import { + Auth0CodeCallbackComponent, + AuthGuard, + IrbGuard, + BrowserGuard +} from 'ddp-sdk'; + +import { + ActivityPageComponent, + ActivityComponent, + DashboardComponent, + LoginLandingComponent, + ErrorComponent, + StayInformedComponent, + PasswordComponent, + RedirectToLoginLandingComponent, + WorkflowStartActivityComponent, + InternationalPatientsComponent, + SessionExpiredComponent, + RedirectToAuth0LoginComponent +} from 'toolkit'; + +import { WelcomeComponent } from './components/welcome/welcome.component'; +import { MoreDetailsComponent } from './components/more-details/more-details.component'; +import { AboutUsComponent } from './components/about-us/about-us.component'; +import { DataReleaseComponent } from './components/data-release/data-release.component'; + +const routes: Routes = [ + { + path: 'about-you', + component: ActivityPageComponent, + canActivate: [ + IrbGuard, + BrowserGuard, + AuthGuard + ], + data: { + activityGuid: 'ABOUTYOU' + } + }, + { + path: 'consent', + component: ActivityPageComponent, + canActivate: [ + IrbGuard, + BrowserGuard, + AuthGuard + ], + data: { + activityGuid: 'CONSENT' + } + }, + { + path: 'followup-consent', + component: ActivityPageComponent, + canActivate: [ + IrbGuard, + BrowserGuard, + AuthGuard + ], + data: { + activityGuid: 'FOLLOWUPCONSENT' + } + }, + { + path: 'release-survey', + component: ActivityPageComponent, + canActivate: [ + IrbGuard, + BrowserGuard, + AuthGuard + ], + data: { + activityGuid: 'RELEASE' + } + }, + { + path: 'dashboard', + component: DashboardComponent, + canActivate: [ + IrbGuard, + BrowserGuard, + AuthGuard + ] + }, + { + path: 'auth', + component: Auth0CodeCallbackComponent, + canActivate: [IrbGuard] + }, + { + path: 'activity/:id', + component: ActivityComponent, + canActivate: [ + IrbGuard, + BrowserGuard, + AuthGuard + ] + }, + { + path: 'activity-link/:id', + component: ActivityComponent, + canActivate: [ + IrbGuard, + BrowserGuard, + AuthGuard + ] + }, + { + path: 'login-landing', + component: LoginLandingComponent, + canActivate: [IrbGuard] + }, + { + path: 'login-landing/:mode', + component: RedirectToAuth0LoginComponent, + canActivate: [IrbGuard] + }, + { + path: 'count-me-in', + component: WorkflowStartActivityComponent, + canActivate: [ + IrbGuard, + BrowserGuard + ] + }, + { + path: 'about-us', + component: AboutUsComponent, + canActivate: [IrbGuard] + }, + { + path: 'data-release', + component: DataReleaseComponent, + canActivate: [IrbGuard] + }, + { + path: 'error', + component: ErrorComponent, + canActivate: [IrbGuard] + }, + { + path: 'more-details', + component: MoreDetailsComponent, + canActivate: [IrbGuard] + }, + { + path: 'stay-informed', + component: StayInformedComponent, + canActivate: [IrbGuard] + }, + { + path: 'international-patients', + component: InternationalPatientsComponent, + canActivate: [IrbGuard] + }, + { + path: 'password-reset-done', + component: RedirectToLoginLandingComponent, + canActivate: [IrbGuard] + }, + { + path: 'session-expired', + component: SessionExpiredComponent, + canActivate: [ + IrbGuard, + BrowserGuard + ] + }, + { + path: 'password', + component: PasswordComponent + }, + { + path: 'updates', + component: WelcomeComponent, + canActivate: [IrbGuard] + }, + { + path: '', + component: WelcomeComponent, + pathMatch: 'full', + canActivate: [IrbGuard] + }, + { + path: 'permalink/consent/:id', + redirectTo: 'consent' + }, + { + path: 'permalink/followupconsent/:id', + redirectTo: 'followup-consent' + }, + { + path: 'permalink/aboutyou/:id', + redirectTo: 'about-you' + }, + { + path: 'permalink/release/:id', + redirectTo: 'release-survey' + }, + { + path: 'about-you/:id', + redirectTo: 'about-you' + }, + { + path: 'consent/:id', + redirectTo: 'consent' + }, + { + path: 'followup-consent/:id', + redirectTo: 'followup-consent' + }, + { + path: 'release-survey/:id', + redirectTo: 'release-survey' + }, + { + path: '**', + redirectTo: '' + } +]; + +@NgModule({ + imports: [RouterModule.forRoot(routes, { + enableTracing: false, + scrollPositionRestoration: 'top' + })], + exports: [RouterModule] +}) +export class AppRoutingModule { } diff --git a/ddp-workspace/projects/ddp-esc/src/app/app.module.ts b/ddp-workspace/projects/ddp-esc/src/app/app.module.ts new file mode 100644 index 0000000000..1b40337052 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/app/app.module.ts @@ -0,0 +1,139 @@ +import { NgModule, Injector, APP_INITIALIZER } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { LOCATION_INITIALIZED } from '@angular/common'; +import { AppRoutingModule } from './app-routing.module'; + +import { TranslateService } from '@ngx-translate/core'; + +import { + DdpModule, + LogLevel, + ConfigurationService, + AnalyticsEventsService, + AnalyticsEvent +} from 'ddp-sdk'; + +import { + ToolkitModule, + ToolkitConfigurationService, + AppComponent +} from 'toolkit'; + +import { WelcomeComponent } from './components/welcome/welcome.component'; +import { MoreDetailsComponent } from './components/more-details/more-details.component'; +import { AboutUsComponent } from './components/about-us/about-us.component'; +import { DataReleaseComponent } from './components/data-release/data-release.component'; + +const baseElt = document.getElementsByTagName('base'); + +let base = ''; +if (baseElt) { + base = baseElt[0].getAttribute('href'); +} + +declare const DDP_ENV: any; + +declare const ga: Function; + +export const toolkitConfig = new ToolkitConfigurationService(); +toolkitConfig.studyGuid = DDP_ENV.studyGuid; +toolkitConfig.aboutYouGuid = 'ABOUTYOU'; +toolkitConfig.consentGuid = 'CONSENT'; +toolkitConfig.releaseGuid = 'RELEASE'; +toolkitConfig.followupGuid = 'FOLLOWUPCONSENT'; +toolkitConfig.dashboardGuid = 'DASHBOARD'; +toolkitConfig.aboutYouUrl = 'about-you'; +toolkitConfig.consentUrl = 'consent'; +toolkitConfig.releaseUrl = 'release-survey'; +toolkitConfig.followupUrl = 'followup-consent'; +toolkitConfig.dashboardUrl = 'dashboard'; +toolkitConfig.activityUrl = 'activity'; +toolkitConfig.errorUrl = 'error'; +toolkitConfig.stayInformedUrl = 'stay-informed'; +toolkitConfig.internationalPatientsUrl = 'international-patients'; +toolkitConfig.mailingListDialogUrl = 'updates'; +toolkitConfig.phone = '651-229-6991'; +toolkitConfig.infoEmail = 'info@escproject.org'; +toolkitConfig.dataEmail = 'data@escproject.org' +toolkitConfig.twitterAccountId = 'ecscproject'; +toolkitConfig.facebookGroupId = 'ecscproject'; +toolkitConfig.countMeInUrl = 'https://joincountmein.org/'; +toolkitConfig.showDataRelease = true; +toolkitConfig.showInfoForPhysicians = true; +toolkitConfig.showBlog = false; + +export const sdkConfig = new ConfigurationService(); +sdkConfig.backendUrl = DDP_ENV.basePepperUrl; +sdkConfig.auth0Domain = DDP_ENV.auth0Domain; +sdkConfig.auth0ClientId = DDP_ENV.auth0ClientId; +sdkConfig.studyGuid = DDP_ENV.studyGuid; +sdkConfig.logLevel = LogLevel.Info; +sdkConfig.baseUrl = location.origin + base; +sdkConfig.auth0SilentRenewUrl = DDP_ENV.auth0SilentRenewUrl; +sdkConfig.loginLandingUrl = DDP_ENV.loginLandingUrl; +sdkConfig.auth0CodeRedirect = location.origin + base + 'auth'; +sdkConfig.localRegistrationUrl = sdkConfig.backendUrl + '/pepper/v1/register'; +sdkConfig.doLocalRegistration = DDP_ENV.doLocalRegistration; +sdkConfig.mapsApiKey = DDP_ENV.mapsApiKey; +sdkConfig.auth0Audience = DDP_ENV.auth0Audience; +sdkConfig.projectGAToken = DDP_ENV.projectGAToken; + +export function translateFactory(translate: TranslateService, injector: Injector) { + return () => new Promise((resolve: any) => { + const locationInitialized = injector.get(LOCATION_INITIALIZED, Promise.resolve(null)); + locationInitialized.then(() => { + const locale = 'en'; + translate.setDefaultLang(locale); + translate.use(locale).subscribe(() => { + console.log(`Successfully initialized '${locale}' language as default.`); + }, err => { + console.error(`Problem with '${locale}' language initialization.`); + }, () => { + resolve(null); + }); + }); + }); +} + +@NgModule({ + imports: [ + BrowserModule, + AppRoutingModule, + DdpModule, + ToolkitModule + ], + declarations: [ + WelcomeComponent, + MoreDetailsComponent, + AboutUsComponent, + DataReleaseComponent + ], + providers: [ + { + provide: 'ddp.config', + useValue: sdkConfig + }, + { + provide: 'toolkit.toolkitConfig', + useValue: toolkitConfig + }, + { + provide: APP_INITIALIZER, + useFactory: translateFactory, + deps: [ + TranslateService, + Injector + ], + multi: true + } + ], + bootstrap: [AppComponent] +}) +export class AppModule { + constructor(private analytics: AnalyticsEventsService) { + this.analytics.analyticEvents.subscribe((event: AnalyticsEvent) => { + ga('send', event); + ga('platform.send', event); + }); + } +} diff --git a/ddp-workspace/projects/ddp-esc/src/app/components/about-us/about-us.component.ts b/ddp-workspace/projects/ddp-esc/src/app/components/about-us/about-us.component.ts new file mode 100644 index 0000000000..1e8e8e704b --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/app/components/about-us/about-us.component.ts @@ -0,0 +1,95 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { ToolkitConfigurationService } from 'toolkit'; + +@Component({ + selector: 'about-us', + template: ` + +
+ +
+
+
+
+

+ Toolkit.Common.Organization + AboutUs.Organization.Section1.Part1 + Toolkit.Common.Organization, + AboutUs.Organization.Section1.Part2 + AboutUs.Organization.Section1.Part3. +

+

+ AboutUs.Organization.Section2.Part1 + AboutUs.Organization.Section2.Part2, + AboutUs.Organization.Section2.Part3 + AboutUs.Organization.Section2.Part4 + AboutUs.Organization.Section2.Part5 +

+
+ Broad Building +
+
+
+
+ +
+

{{team.Title}}

+ +
+
+ +
+
+

{{member.Name}}

+ +

+
+
+
+
+
+
+
+
+
+
+
` +}) +export class AboutUsComponent implements OnInit { + public countMeInUrl: string; + + constructor(@Inject('toolkit.toolkitConfig') private toolkitConfiguration: ToolkitConfigurationService) { } + + public ngOnInit(): void { + this.countMeInUrl = this.toolkitConfiguration.countMeInUrl; + } +} diff --git a/ddp-workspace/projects/ddp-esc/src/app/components/data-release/data-release.component.ts b/ddp-workspace/projects/ddp-esc/src/app/components/data-release/data-release.component.ts new file mode 100644 index 0000000000..e0c0a5a333 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/app/components/data-release/data-release.component.ts @@ -0,0 +1,79 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { ToolkitConfigurationService } from 'toolkit'; + +@Component({ + selector: 'data-release', + template: ` + +
+ + + +
+ ` +}) +export class DataReleaseComponent implements OnInit { + public dataEmail: string; + public dataEmailHref: string; + + constructor(@Inject('toolkit.toolkitConfig') private toolkitConfiguration: ToolkitConfigurationService) { } + + public ngOnInit(): void { + this.dataEmail = this.toolkitConfiguration.dataEmail; + this.dataEmailHref = `mailto:${this.dataEmail}`; + } +} diff --git a/ddp-workspace/projects/ddp-esc/src/app/components/more-details/more-details.component.ts b/ddp-workspace/projects/ddp-esc/src/app/components/more-details/more-details.component.ts new file mode 100644 index 0000000000..9fc921ade6 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/app/components/more-details/more-details.component.ts @@ -0,0 +1,145 @@ +import { Component, Inject, OnInit } from '@angular/core'; +import { ToolkitConfigurationService } from 'toolkit'; + +@Component({ + selector: 'more-details', + template: ` + +
+ + +
+
+
+
+

+ MoreDetails.MainText.Section1.Pt1 + Toolkit.Common.Organization, + MoreDetails.MainText.Section1.Pt2 + Toolkit.Common.Organization + MoreDetails.MainText.Section1.Pt3 +

+

MoreDetails.MainText.Section2

+
+
+

MoreDetails.HowProjectWorks.Title

+ +

MoreDetails.HowProjectWorks.AboutYourself.Title

+

+ MoreDetails.HowProjectWorks.AboutYourself.Text.Part1 + MoreDetails.HowProjectWorks.AboutYourself.Text.Link, + MoreDetails.HowProjectWorks.AboutYourself.Text.Part2 +

+ +

MoreDetails.HowProjectWorks.Permission.Title

+

MoreDetails.HowProjectWorks.Permission.Text

+ +

MoreDetails.HowProjectWorks.Request.Title

+

MoreDetails.HowProjectWorks.Request.Text

+ +

MoreDetails.HowProjectWorks.SendUs.Title

+

MoreDetails.HowProjectWorks.SendUs.Text

+ +

MoreDetails.HowProjectWorks.Analyze.Title

+

MoreDetails.HowProjectWorks.Analyze.Text

+ +

MoreDetails.HowProjectWorks.Share.Title

+

MoreDetails.HowProjectWorks.Share.Text

+ +

MoreDetails.HowProjectWorks.Learn.Title

+

MoreDetails.HowProjectWorks.Learn.Text

+
+
+

MoreDetails.FAQ.Title

+ +

MoreDetails.FAQ.Goal.Question

+

MoreDetails.FAQ.Goal.Section1

+

MoreDetails.FAQ.Goal.Section2

+

MoreDetails.FAQ.Goal.Section3

+ +

MoreDetails.FAQ.Research.Question

+

MoreDetails.FAQ.Research.Section1

+

MoreDetails.FAQ.Research.Section2

+ +

MoreDetails.FAQ.WhyBoth.Question

+

MoreDetails.FAQ.WhyBoth.Section1

+ +

MoreDetails.FAQ.Conduct.Question

+

+ MoreDetails.FAQ.Conduct.Text.Part1 + Toolkit.Common.Organization + MoreDetails.FAQ.Conduct.Text.Part2 + MoreDetails.FAQ.Conduct.Text.Part3. +

+ +

MoreDetails.FAQ.Involved.Question

+

MoreDetails.FAQ.Involved.Section1

+

MoreDetails.FAQ.Involved.Section2

+ +

MoreDetails.FAQ.Costs.Question

+

MoreDetails.FAQ.Costs.Text

+ +

MoreDetails.FAQ.TissueAndMedicalRecords.Question

+

MoreDetails.FAQ.TissueAndMedicalRecords.Text

+ +

MoreDetails.FAQ.TissueSample.Question

+

MoreDetails.FAQ.TissueSample.Text

+ +

MoreDetails.FAQ.ReceiveBack.Question

+

MoreDetails.FAQ.ReceiveBack.Text

+ +

MoreDetails.FAQ.Profit.Question

+

MoreDetails.FAQ.Profit.Text

+ +

MoreDetails.FAQ.Info.Question

+

MoreDetails.FAQ.Info.Text

+

+ MoreDetails.FAQ.Info.Link +

+
+
+

MoreDetails.FAQ.OtherQuestions.Title

+

+ MoreDetails.FAQ.OtherQuestions.Section1.Text + MoreDetails.FAQ.OtherQuestions.Section1.Link +

+

+ MoreDetails.FAQ.OtherQuestions.Section2.TextPt1 + {{ infoEmail }} + MoreDetails.FAQ.OtherQuestions.Section2.TextPt2 + {{phone}}. +

+
+
+
+
+
+ ` +}) +export class MoreDetailsComponent implements OnInit { + public infoEmail: string; + public phone: string; + public infoEmailHref: string; + public phoneHref: string; + public countMeInUrl: string; + + constructor(@Inject('toolkit.toolkitConfig') private toolkitConfiguration: ToolkitConfigurationService) { } + + public ngOnInit(): void { + this.infoEmail = this.toolkitConfiguration.infoEmail; + this.infoEmailHref = `mailto:${this.toolkitConfiguration.infoEmail}`; + this.phone = this.toolkitConfiguration.phone; + this.phoneHref = `tel:${this.toolkitConfiguration.phone}`; + this.countMeInUrl = this.toolkitConfiguration.countMeInUrl; + } +} diff --git a/ddp-workspace/projects/ddp-esc/src/app/components/welcome/welcome.component.ts b/ddp-workspace/projects/ddp-esc/src/app/components/welcome/welcome.component.ts new file mode 100644 index 0000000000..d3e5e9773f --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/app/components/welcome/welcome.component.ts @@ -0,0 +1,281 @@ +import { Component, OnInit } from '@angular/core'; +import { + AnalyticsEventsService, + BrowserContentService, + WindowRef, + AnalyticsEventCategories, + AnalyticsEventActions +} from 'ddp-sdk'; + +@Component({ + selector: 'welcome', + template: ` + +
+ +
+ +
+ + + +
+
+

+ Welcome.Intro.Title +

+

+ Welcome.Intro.Text +

+
+
+ + +
+
+
+ +
+
+

+ Welcome.FirstBlock.Text +

+
+
+ +
+
+
+ +
+
+

+ Welcome.SecondBlock.Title +

+

+ Welcome.SecondBlock.Text +

+
+ DNA Strand +
+ +
+
+
+ +
+
+

+ Welcome.ThirdBlock.Title +

+
+
+ +
+
+ Step 1 +

+ Welcome.ThirdBlock.FirstStep.Title +

+

+ Welcome.ThirdBlock.FirstStep.Subtitle +

+

+ Welcome.ThirdBlock.FirstStep.TextPt1 + Welcome.ThirdBlock.FirstStep.Link + Welcome.ThirdBlock.FirstStep.TextPt2 +

+
+
+ Step 2 +

+ Welcome.ThirdBlock.SecondStep.Title +

+

+ Welcome.ThirdBlock.SecondStep.Subtitle +

+

+

+ Welcome.ThirdBlock.SecondStep.Text2.Part1 + Welcome.ThirdBlock.SecondStep.Text2.Part2. +

+
+
+ Step 3 +

+ Welcome.ThirdBlock.ThirdStep.Title +

+

+ Welcome.ThirdBlock.ThirdStep.Subtitle +

+

+ Welcome.ThirdBlock.ThirdStep.Text +

+
+
+ + + +
+
+
+ +
+
+

+ Welcome.FourthBlock.TitlePt1 + Welcome.FourthBlock.TitlePt2 + Welcome.FourthBlock.TitlePt3 +

+

+ Welcome.FourthBlock.Text +

+
+
+ +
+
+
+ +
+
+

+ Welcome.FifthBlock.LeadTitle +

+
+
+
+
+ Target Cancer Foundation logo +
+
+
+
+

+ Welcome.FifthBlock.PartnersTitle +

+
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+ +
+
+

+ + Welcome.SixthBlock.TitlePt1 + +
+ + Welcome.SixthBlock.TitlePt2 + +

+

+ Welcome.SixthBlock.Text +

+
+
+ + +
+ ` +}) +export class WelcomeComponent implements OnInit { + public unsupportedBrowser: boolean; + private readonly HEADER_HEIGHT: number = 70; + + constructor( + private windowRef: WindowRef, + private analytics: AnalyticsEventsService, + private browserContent: BrowserContentService) { } + + public ngOnInit(): void { + this.unsupportedBrowser = this.browserContent.unsupportedBrowser(); + } + + public clickCountMeIn(): void { + this.doAnalytics(); + if (this.unsupportedBrowser) { + this.browserContent.emitWarningEvent(); + } + } + + public get showArrow(): boolean { + return this.windowRef.nativeWindow.pageYOffset <= this.HEADER_HEIGHT; + } + + public scrollTo(target: any): void { + this.isIE ? this.simpleScrolling(target) : this.smoothScrolling(target); + } + + private simpleScrolling(target: any): void { + this.windowRef.nativeWindow.scrollTo(0, target.offsetTop); + } + + private smoothScrolling(target: any): void { + this.windowRef.nativeWindow.scrollTo({ + top: target.offsetTop, + behavior: 'smooth' + }); + } + + private get isIE(): boolean { + return this.browserContent.unsupportedBrowser(); + } + + private doAnalytics(): void { + this.analytics.emitCustomEvent(AnalyticsEventCategories.ClickedCountMeIn, AnalyticsEventActions.FromMainPage); + } +} diff --git a/ddp-workspace/projects/ddp-esc/src/assets/.gitkeep b/ddp-workspace/projects/ddp-esc/src/assets/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/ddp-workspace/projects/ddp-esc/src/assets/i18n/en.json b/ddp-workspace/projects/ddp-esc/src/assets/i18n/en.json new file mode 100644 index 0000000000..1dcaaf8ade --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/assets/i18n/en.json @@ -0,0 +1,502 @@ +{ + "App": { + "Home": "Home", + "FAQ": "More Details/FAQ", + "About": "About Us", + "Join": "Join Mailing List", + "Info": "Information for Physicians", + "Data": "Data" + }, + "Common": { + "CMIButton": "count me in" + }, + "Welcome": { + "Intro": { + "Title": "You can have a direct impact on the future of Esophageal and Stomach Cancer", + "Text": "If you have been diagnosed with esophageal or gastric/stomach cancer, join a nationwide initiative of patients, doctors, and scientists by sharing your tumor samples, your medical information, and your voice. Together we can develop a comprehensive resource to accelerate discoveries that may inform future therapies." + }, + "FirstBlock": { + "Text": "There are significant unmet needs that prevent the development of better therapies for esophageal and gastric/stomach cancer patients, and diagnoses are rising dramatically. If you have esophageal or gastric/stomach cancer, you have the power to accelerate cancer research by combining your data with other patients." + }, + "SecondBlock": { + "Title": "Your tumor and medical record could unlock discoveries", + "Text": "The unique genetic information in your cancer could hold the key to rapid advances in cancer treatment. By analyzing the DNA in your samples, researchers can make discoveries that will ultimately lead to a better understanding and faster advances in the treatment of esophageal and gastric/stomach cancer. This information will be invaluable to cancer research for years to come." + }, + "ThirdBlock": { + "Title": "Here's how you can participate", + "FirstStep": { + "Title": "Step 1", + "Subtitle": "Tell us about yourself", + "TextPt1": "Click", + "Link": "\"Count Me In\"", + "TextPt2": "and complete a short online form to tell us about yourself and your esophageal or gastric/stomach cancer." + }, + "SecondStep": { + "Title": "Step 2", + "Subtitle": "Give us permission to collect your samples and data", + "Text1": "You will be directed to an online consent form where you can provide permission for the project to collect your saliva sample and medical record data. You may also choose to provide a blood sample and/or share access to your stored tumor samples. We will do the rest-- we'll send you the sample collection kit(s) and contact your doctors and hospitals to securely obtain copies of your medical records and tissue samples.", + "Text2": { + "Part1": "To learn more about how we collect samples see our", + "Part2": "FAQ" + } + }, + "ThirdStep": { + "Title": "Step 3", + "Subtitle": "Learn with us along the way", + "Text": "The data generated from your samples and medical records will be coupled with that of other patients, de-identified, and shared widely with the biomedical community. We may also ask you additional questions about your experiences to help with future studies. We will provide you with regular updates regarding key discoveries and progress from the project, however, please note that individual data cannot be shared." + } + }, + "FourthBlock": { + "TitlePt1": "The time to", + "TitlePt2": "act", + "TitlePt3": "is now", + "Text": "We are asking you to say \"Count Me In\" and donate something invaluable to cancer research. Your biological samples and medical information will be used for transformative genomic studies that will ultimately lead to a better understanding and faster advances in the treatment of esophageal and gastric/stomach cancer." + }, + "FifthBlock": { + "LeadTitle": "Lead Project Engagement Partner", + "PartnersTitle": "Our Advocacy Partners" + }, + "SixthBlock": { + "TitlePt1": "Please join us and say", + "TitlePt2": "\"Count Me In\"", + "Text": "With your help, patients can be the driving force behind cancer research." + } + }, + "AboutUs": { + "PageHeader": { + "Part1": "The Esophageal and Stomach Cancer Project is part of ", + "Part2": "a nonprofit organization that brings together patients and researchers as partners to accelerate discoveries in cancer research." + }, + "PageHeaderLink": { + "Part1": "Visit the", + "Part2": "website" + }, + "Title": "About us", + "Organization": { + "Section1": { + "Part1": "is stewarded by four leading organizations: Emerson Collective, a California-based social change organization; the Broad Institute of MIT and Harvard, a leading nonprofit biomedical research institution; the Biden Cancer Initiative, an independent nonprofit organization that builds on the federal government’s Cancer Moonshot; and the Dana-Farber Cancer Institute, a leading cancer hospital. For more information about", + "Part2": "go to", + "Part3": "joincountmein.org" + }, + "Section2": { + "Part1": "The Esophageal and Stomach Cancer Project is led by", + "Part2": "Dr. Adam Bass", + "Part3": "MD, an oncologist and esophageal and gastric/stomach cancer researcher. This project was designed and has been implemented collaboratively with esophageal and gastric/stomach cancer patients, patient advocates, cancer researchers, physicians, and clinical specialists. We leverage the power of", + "Part4": "Count Me In’s", + "Part5": "resources and the voice of the esophageal and gastric/stomach cancer community in order to focus cutting edge genomic science squarely on people living with esophageal and gastric/stomach cancer." + } + }, + "Teams": [ + { + "Title": "Leadership Team", + "Members": [ + { + "Name": "Adam Bass, MD", + "Bio": [ + "Adam Bass is an Associate Professor of medicine at Harvard Medical School, a physician/scientist at the Dana-Farber Cancer Institute and Brigham and Women’s Hospital and also is an associate member of the Broad Institute. Dr. Bass obtained his undergraduate degree from Amherst College and his MD degree at Duke University School of Medicine then pursued clinical training in internal medicine at the Massachusetts General Hospital and medical oncology at the Dana-Farber/Partners Cancer Center. At the completion of his clinical training, he was a post-doctoral fellow with Dr. Matthew Meyerson at both the Dana-Farber Cancer Institute and Broad Institute." + ], + "Photo": "assets/images/adam_bass.jpg", + "Alt": "Adam Bass photo" + }, + { + "Name": "Jim Palma", + "Bio": [ + "Jim Palma is the Executive Director of TargetCancer Foundation in Cambridge, MA. Since joining TargetCancer Foundation in 2010, Jim has overseen its growth from a small start-up to a nationally recognized foundation supporting comprehensive rare cancer research and patient support programs. In addition, Jim serves on the Board of Directors of the National Organization for Rare Disorders (NORD), and is a founding Co-Chair of the NORD Rare Cancers Coalition. Jim attended Loyola University Maryland, and has also completed studies at the Institute for Nonprofit Management and Leadership at the Questrom School of Business at Boston University." + ], + "Photo": "assets/images/jim_palma.jpg", + "Alt": "Jim Palma photo" + } + ] + }, + { + "Title": "Meet the Project Advisory Council", + "Members": [ + { + "Name": "Dana Deighton", + "Bio": [ + "Dana is an accomplished and enthusiastic marketing professional with decades of experience in corporate marketing and publishing, membership, and partner/project management. After 25 years at National Geographic, she is now in a new career in the health and wellness arena at Inspire, the leading social network for health.", + "Outside of work, she is also focused on healthcare advocacy and policy. In addition to serving as an Executive Board Member of the Esophageal Cancer Action Network (ECAN), she is a Patient Representative on the Locally Advanced Esophageal Cancer Guideline Panel for the American Society of Clinical Oncology (ASCO). Dana lives in Alexandria, VA, with her husband and three teenagers, and enjoys travel and walking and running outdoors." + ], + "Photo": "assets/images/dana_deighton.jpg", + "Alt": "Dana Deighton photo" + }, + { + "Name": "Bill Drake", + "Bio": [ + "A career marketing and advertising creative executive, Bill was diagnosed with Stage IV esophageal cancer on Sept 11, 2013. A life-long acid reflux condition prompted him to ask for an upper GI endoscopy despite having no symptoms associated with esophageal problems. After his diagnosis Bill responded to treatments with chemotherapy, radiation and immunotherapy under care at Massachusetts General Hospital, until he passed away in July 2019.", + "Bill was an avid esophageal cancer awareness advocate, and played a key role in assembling the Project Advisory Council for the Esophageal and Stomach Cancer Project. In addition, he served on the Board of the Esophageal Cancer Awareness Association and actively volunteered with TargetCancer Foundation. Bill produced and directed a series of YouTube videos called “Living with Esophageal Cancer” that features the stories of 8 esophageal cancer survivors." + ], + "Photo": "assets/images/bill_drake.jpg", + "Alt": "Bill Drake photo" + }, + { + "Name": "George Evans", + "Bio": [ + "A resident of Chappaqua, NY with his wife and two teenage children, George’s long career as a software engineer led to him most recently heading up the technology department for a hedge fund in NYC. George served on the Project Advisory Council from September 2017 to June 2018, when he passed away. George was diagnosed with Stage IV esophageal cancer on May 24, 2016 and tirelessly fought the disease." + ], + "Photo": "assets/images/george_evans.jpg", + "Alt": "George Evans photo" + }, + { + "Name": "Jeff Thomas", + "Bio": [ + "Jeff is nearing his 7 year survival anniversary. He volunteers with Imerman’s Angels, Livestrong at the YMCA, and a local men’s cancer support group. He still works full time and enjoys exotic (low budget) trips with his boys. He recently got his first tattoo (a periwinkle ribbon) while visiting Bali, Indonesia.", + "“I’m excited about playing a small part in the development of this program. I look forward to working with my fellow survivors to make this project the most comprehensive of its kind. Meeting the folks at the Broad Institute was a real pleasure. These are some of the smartest people I have ever met.”" + ], + "Photo": "assets/images/jeff_thomas.jpg", + "Alt": "Jeff Thomas photo" + } + ] + } + ] + }, + "MoreDetails": { + "Title": "Learn more about the Esophageal and Stomach Cancer Project", + "MainText": { + "Section1": { + "Pt1": "The Esophageal and Stomach Cancer Project takes a new approach to cancer research in which researchers partner directly with patients, who share their samples and clinical information in order to speed important discoveries. The project is part of", + "Pt2": "a nonprofit organization that brings together patients and researchers as partners to accelerate discoveries in cancer research.", + "Pt3": "is stewarded by four leading organizations: Emerson Collective, a California-based social change organization; the Broad Institute of MIT and Harvard, a leading nonprofit biomedical research institution; the Biden Cancer Initiative, an independent nonprofit organization that builds on the federal government’s Cancer Moonshot; and the Dana-Farber Cancer Institute, a leading cancer hospital. The project also works in collaboration with a growing coalition of nonprofit advocacy partners." + }, + "Section2": "Our goal is to reach out to patients with esophageal and gastric/stomach cancer around the United States and Canada in order to study their cancer using cutting-edge genomic and molecular research studies performed at the Broad Institute, and to leverage technology to allow patients to participate in these studies regardless of where they live." + }, + "HowProjectWorks": { + "Title": "Here's how the project works:", + "AboutYourself": { + "Title": "A. Tell us about yourself.", + "Text": { + "Part1": "Our goal is to perform genomics studies that will enable us to understand the genomic underpinnings of this disease. Click", + "Part2": "and complete a simple online form to tell us about yourself and your cancer. In order to understand this disease, we need to hear about your experiences with esophageal and gastric/stomach cancer and couple that information with what we learn from the DNA in your tumor.", + "Link": "\"Count Me In\"" + } + }, + "Permission": { + "Title": "B. Give us permission to collect your samples and data.", + "Text": "Complete an online consent form that requests your permission for the Esophageal and Stomach Cancer Project to obtain copies of your medical records and send you a saliva collection kit. You will be able to choose whether you would like to provide a blood sample, and/or access to a portion of your stored tumor tissue. We’ll also ask you to tell us where you received your medical care so we can contact your doctors and hospitals." + }, + "Request": { + "Title": "C. We’ll find and request your records and tissue.", + "Text": "Our team will contact your doctors and hospitals to obtain copies of your medical records. If you choose to opt-in and share a portion of your stored tumor samples with the study, we will ask pathology departments to send only a part of the tumor tissue, and not to send anything to us that might be needed for clinical care. You may also choose to provide a blood sample instead of, or in addition to, your stored tumor sample." + }, + "SendUs": { + "Title": "D. Provide us with a saliva and/or blood sample.", + "Text": "We’ll also send you a simple kit to collect a saliva sample, which will contain \"healthy\" DNA that can be compared with DNA from your tumor sample. We may also send you a simple kit to collect a blood sample. We ask that you bring in a blood tube to your health care providers office and ask them to draw a sample, which may contain DNA from your tumor. This may help us to understand the genomics of your cancer from a simple blood draw." + }, + "Analyze": { + "Title": "E. We’ll Analyze Your Tumor and Medical Data.", + "Text": "We will perform cutting-edge, comprehensive genomic analyses on your tumor and saliva sample. Sequencing data we generate will be securely stored in a protected database at the Broad Institute along with information from your medical record. Any information that would make it easy to identify you as an individual will be removed from all genomic and clinical data." + }, + "Share": { + "Title": "F. We’ll Share the Data with Other Researchers", + "Text": "Our database of genomic and medical information (with your identifying information removed) will be shared with the National Institutes of Health and the cancer research community, and will be able to be used for other genomic and molecular studies to help understand esophageal and gastric/stomach cancer and develop new therapies." + }, + "Learn": { + "Title": "G. Learn with us along the way.", + "Text": "We are excited to learn with you! Throughout the project, we will provide all patients who say “Count Me In” with regular updates about the status of the project and information about new studies that we are conducting. We will also share any discoveries from these research projects with you. We also may ask you additional questions about your experience to help with future studies — we want to hear what’s important to you." + } + }, + "FAQ": { + "Title": "Frequently Asked Questions", + "Goal": { + "Question": "1. What is the goal of this project?", + "Section1": "This project will connect esophageal and gastric/stomach cancer patients at clinics around the country with scientists using cutting-edge technology to study cancer's genetic and molecular causes. Cancer is not a single disease, and each tumor holds part of the puzzle.", + "Section2": "Today, very few patients have the ability to contribute their tumor samples and clinical data to cancer research, largely because they do not have a way of doing so. We believe everyone should have the opportunity to contribute to research, especially now that the combination of genome sequencing and internet-based communication has made it easier to give people that opportunity.", + "Section3": "We hope our initial studies will help us understand the genomic landscape of esophageal and gastric/stomach cancer. By discovering the genes that drive this disease and sharing this data, we hope that effective therapies to treat esophageal and gastric/stomach cancer can be developed." + }, + "Research": { + "Question": "2. What does it mean that you are conducting genomic and molecular research as part of this project?", + "Section1": "This study involves genomic and molecular research to better define the genes and molecules that are important in esophageal and gastric/stomach cancer. Cancers occur when the molecules that control normal cell growth (such as genes and proteins) are altered. Genes are composed of DNA letters, which contain the instructions that tell the cells in our bodies how to grow and work. Changes in the DNA letters of genes that occur in tumor cells and normal tissues are called alterations. Several alterations that occur in certain types of cancers have already been identified and have led to the development of new drugs that specifically target those alterations. However, the vast majority of tumors from patients have not been studied, which means there is a tremendous amount of information about the molecular basis of cancer that is still left to be discovered. Our goal is to discover more alterations involved in cancer, and to better understand those that have been previously described. We think this information could lead to the development of additional cancer therapies and cures.", + "Section2": "In order to define these gene alterations in your cancer, we will use a technology called DNA sequencing. Sequencing is a way of reading the DNA letters of your genes to identify alterations in genes that may contribute to the behavior of cells. Some changes in genes occur only in cancer cells. Others occur in normal cells as well, in the genes that may have been passed from parent to child. This research study will examine both kinds of genes." + }, + "WhyBoth": { + "Question": "3. Why are you studying both esophageal and gastric/stomach cancer?", + "Section1": "In the United States, the most common anatomic location where we see esophageal and gastric/stomach cancer is where the stomach and esophagus meet (often referred to as the gastroesophageal junction or GE Junction). In addition to cancers that arise at this junction, cancers that start in the esophagus may spread to the stomach, and cancers that start in the stomach may spread to the esophagus. Additionally, recent scientific studies indicate that these cancers are strikingly similar on the molecular level. By studying these cancers together we can further compare and contrast them to determine to what extent they have distinct biologic and clinical features." + }, + "Conduct": { + "Question": "4. Are there any costs for me to participate?", + "Text": { + "Part1": "This project is being conducted by", + "Part2": "and a growing coalition of non-profit advocacy partners. Our team — led by Dr. Adam Bass, a physician and cancer researcher— is made up of cancer researchers, physicians, clinical specialists, and patient advocates.", + "Part3": "Learn more about us here" + } + }, + "Involved": { + "Question": "5. How have patients been involved in the design of this project?", + "Section1": "We have worked closely with patients and patient advocates within the esophageal and gastric/stomach cancer community from the beginning of this project through its design and implementation. Patients have been involved in all aspects including concept, goals, messaging, forms, and even the design of this website.", + "Section2": "We're proud to have as our Advocacy Partners: TargetCancer Foundation, ECAN, ECAA, DeGregorio Family Foundation, Debbie's Dream Foundation, GI Cancers Alliance, Gastric Cancer Foundation, No Stomach for Cancer, and Hope for Stomach Cancer." + }, + "Costs": { + "Question": "6. Are there any costs for me to participate?", + "Text": "No, there are no costs to you. All associated costs related to acquiring medical records and tissue will be covered by the study." + }, + "TissueAndMedicalRecords": { + "Question": "7. After I provide my information, will I be asked to share my tumor tissue and medical records?", + "Text": "We will be asking for informed consent from all patients with esophageal and gastric/stomach cancer who enroll in this study. As part of the process of providing consent, we will ask your permission for the Esophageal and Stomach Cancer Project to obtain and analyze your stored tumor tissue and medical records, should you choose to share access to stored tumor tissue. We will keep you informed about our progress along the way." + }, + "TissueSample": { + "Question": "8. If I am asked to share a tissue sample, will my tissue be exhausted?", + "Text": "If you do elect to share tissue as part of the study, we will take every measure to ensure that your samples are not exhausted as a result of these studies. We will ask the pathologists who have access to your stored tumor samples to make sure that they send only a small portion to us. If there doesn’t appear to be enough to allow for future clinical testing, we will not request for your samples to be sent to us, and we will notify you that we did not use your samples for this reason. You may also choose to provide a blood sample in addition to, or instead of tissue samples if you have no tissue available or elect not to share your stored tissue samples." + }, + "ReceiveBack": { + "Question": "9. If my tissue, blood, and medical records are analyzed, will I receive any information back from this study?", + "Text": "You will not receive individual information from this study. Because our sequencing tests are performed in a research lab and not a clinical lab, we are not currently permitted to return personal genetic data to you. However, we will regularly update you with key discoveries that we make about this disease, overall results, and progress made through this research." + }, + "Profit": { + "Question": "10. Is this research being conducted for profit?", + "Text": "No. This project is a not-for-profit, academic research endeavor. Our mission is to generate, aggregate, and freely share data with the research community in a way that protects your personal information in order to fuel discoveries." + }, + "Info": { + "Question": "11. What information can I bring to my medical team so that I can discuss this study with them?", + "Text": "This provided PDF is designed to educate your medical team about the project:", + "Link": "Generate PDF for physicians" + }, + "OtherQuestions": { + "Title": "Do you have other questions?", + "Section1": { + "Text": "You can access a 1 page printable information sheet about the project linked here:", + "Link": "The Esophageal and Stomach Cancer Project" + }, + "Section2": { + "TextPt1": "If you have any other questions, please email us at", + "TextPt2": "or call us at" + } + } + } + }, + "DataRelease": { + "Title": "ESCproject Data", + "DataBrowser": "The Esophageal and Stomach Cancer Project Patient Data Browser", + "BrowserText": "Below is an interactive data browser for exploring the patient-reported data from the Esophageal and Stomach Cancer Project. This contains data from patients from the USA and Canada who signed consent.", + "PatientReported": "Patient-reported data included here are from patients who completed the following survey. An example of what patients see when they sign up is linked here:", + "InitialSurvey": "Initial intake survey", + "DataUse": { + "Text": "How to use the data browser:", + "List": [ + "On a computer, hover your cursor over any chart to see more information.", + "Click (or tap, on a mobile device) on any part of a chart to filter the entire browser to a subset of patients. The number of patients you have filtered down to is displayed in the upper left-hand corner.", + "Click or tap it again to remove the filter.", + "Using the toolbar in the bottom right corner of the browser, you can undo or redo your last action, reset all filters, or download an image of the browser." + ] + }, + "Updated": "This data will be updated periodically as new patients join the project and as new surveys are deployed. If you have any questions or feedback, please email", + "ThankYou": "Thank you to every patient who has said Count Me In and generously shared their experiences, information, and samples to accelerate discoveries.", + "Video": { + "Part1": "Here is a", + "Link": "walkthrough video", + "Part2": "on how to use the interactive data browser to explore the survey data." + }, + "Tableau": "ESC Data Browser" + }, + "Toolkit": { + "Common": { + "Organization": "Count Me In" + }, + "Header": { + "HeaderLogo": "Esophageal
& Stomach
Cancer Project", + "LearnMore": "Learn More", + "CountMeIn": "count me in", + "DataRelease": "Data" + }, + "Footer": { + "FooterLogo": "Esophageal
& Stomach
Cancer Project", + "Home": "Home", + "Data": "Data", + "FAQ": "More Details/FAQ", + "About": "About Us", + "Join": "Join Mailing List", + "Info": "Information for Physicians", + "Top": "▴ Back to top", + "Contacts": { + "ContactUs": "Contact Us:", + "Address": "415 Main St, Cambridge, MA", + "Zip": "02142, United States" + } + }, + "LoginLanding": { + "Text": "Please wait. You will be redirected to a destination soon..." + }, + "Dialogs": { + "JoinMailingList": { + "Title": "Stay informed!", + "Text": "Provide your email below and we'll keep you up-to-date on developments.
You can unsubscribe at any time.", + "Fields": { + "FirstName": { + "Placeholder": "First Name *", + "Error": "First Name is required" + }, + "LastName": { + "Placeholder": "Last Name *", + "Error": "Last Name is required" + }, + "Email": { + "Placeholder": "Email Address *", + "Error": "Please enter a valid Email Address" + }, + "ConfirmEmail": { + "Placeholder": "Email Confirmation (Reenter Email) *", + "Error": "Please enter a valid Email Address" + } + }, + "CancelButton": "CANCEL", + "SubmitButton": "JOIN", + "Required": "* Required field", + "MatchEmailsError": "Please ensure that both email fields are filled in and that the addresses match.", + "LoadingError": "We're sorry, but an error has occurred." + }, + "SessionWillExpire": { + "Title": "Your session will time-out soon", + "Text": "To protect your privacy, the system is going to log you out because you have been away for a while. Click “Continue” to stay logged in. Click “Sign Out” if you are done for now.", + "SignOut": "Sign Out", + "Continue": "Continue" + } + }, + "Warning": { + "Title": "Download Chrome or Safari to Continue", + "Text1": "This project is designed for use with the internet's safest and most popular browsers -- Chrome and Safari.", + "Text2": "It looks like you are using Internet Explorer. You will need to use another browser in order to join the project. We suggest you use Chrome or Safari to ensure that your experience with the website is smooth and secure.", + "Text3": { + "Pt1": "Click the following links to download", + "Pt2": "or", + "Pt3": "Chrome and Safari are always free.", + "Chrome": "Chrome (for Mac & PC)", + "Safari": "Safari (for Mac)" + }, + "SubmitButton": "OK" + }, + "StayInformed": { + "Title": "Stay Informed!", + "Text": "Thank you for joining the email list. We'll send you updates and keep you informed. You can unsubscribe at any time. If you have any questions about your status in the project, please email ", + "ReturnButton": "RETURN HOME" + }, + "Password": { + "Title": "Please enter the password", + "Text": "Please enter your password", + "SubmitButton": "SUBMIT", + "PasswordWrongError": "Incorrect password. Please try again.", + "OtherError": "We're sorry, but an error has occurred.", + "PasswordField": { + "Error": "Password is required" + } + }, + "InternationalPatients": { + "Title": "Information for International Patients", + "ThankYou": { + "TextPt1": "Thank you for your interest in joining the Esophageal and Stomach Cancer Project. Currently, the Esophageal and Stomach Cancer Project is open to patients in the United States or Canada. From the Country field on your survey, it appears that you do not live in the United States or Canada. If you do live or are treated in the United States or Canada, please reach out to us at ", + "TextPt2": "or" + }, + "Understand": "We understand that the experiences of every patient matters, and eventually want to extend these studies internationally. Understanding where people are registering from may enable us to better understand what parts of the world might be most interested in participating in the future of Count Me In projects." + }, + "Dashboard": { + "Title": "Dashboard" + }, + "ErrorPage": { + "Title": "We've encountered an error", + "Header": "We're sorry, but an error has occurred.", + "DefaultText": { + "TextPt1": "Please wait a moment and retry. If the trouble persists, please email us at", + "TextPt2": "or call us at" + } + }, + "ErrorCodes": { + "PASSWORD_RESET_LINK_EXPIRED": "Your password reset link has expired." + }, + "SessionExpired": { + "Text": { + "Pt1": "You were away for a while, so we logged you out as a security precaution.", + "Pt2": "Please log in again to return to the last page you were on." + }, + "LogInButton": "Log In" + } + }, + "SDK": { + "SubmitButton": "SUBMIT", + "CloseButton": "CLOSE", + "AddButton": "ADD", + "CancelButton": "CANCEL", + "NextButton": "NEXT", + "PreviousButton": "PREV", + "SavingButton": "SAVING", + "EditButton": "EDIT", + "ReviewButton": "VIEW", + "ValidateError": "Please correct any errors in the form.", + "CommunicationError": "There was a problem saving your data. Please check the form and your answers before submitting.", + "SaveError": "We're sorry but an error occurred.", + "ExportStudy": { + "Export": "EXPORT" + }, + "ListStudies": { + "StudyName": "Study Name", + "ParticipantCount": "Participant Count" + }, + "ListWorkspaces": { + "WorkspaceName": "Workspace Name", + "WorkspaceNamespace": "Workspace Namespace" + }, + "Login": { + "Login": "LOG IN", + "Logout": "LOG OUT" + }, + "SignInOut": { + "SignIn": "Sign In", + "SignOut": "Sign Out" + }, + "UserActivities": { + "ActivityName": "Form", + "Summary": "Summary", + "ActivityStatus": "Status", + "ActivityDate": "Created", + "ActivityActions": "Actions" + }, + "ManageParticipants": { + "GovernedParticipants": "Governed participants", + "ParticipantPlaceholder": "Participant", + "ParticipantsList": "Participants" + }, + "ParticipantProfile": { + "OpenProfile": "Profile", + "ViewAs": "View As", + "ManageParticipants": "Manage participants" + }, + "UserPreferences": { + "UserPreferencesTitle": "User preferences", + "UserPreferencesGender": "Sex", + "UserPreferencesLocale": "Preferred language" + }, + "Dashboard": { + "Title": "My Dashboard", + "Text": "The dashboard below describes each Esophageal and Stomach Cancer Project form and its status." + }, + "DatePicker": { + "Day": "Choose day...", + "Month": "Choose month...", + "Year": "Choose year...", + "January": "January", + "February": "February", + "March": "March", + "April": "April", + "May": "May", + "June": "June", + "July": "July", + "August": "August", + "September": "September", + "October": "October", + "November": "November", + "December": "December" + }, + "UserMenu": { + "DashboardButton": "Dashboard", + "SignOutButton": "Sign Out" + }, + "DetailsPlaceholder": { + "PluralForm": "characters remaining", + "SingularForm": "character remaining" + }, + "Title": { + "Default": "Esophageal and Stomach Cancer Project", + "Alert": "Your session will time-out soon" + }, + "EmailEntry": { + "InvalidEmail": "Please enter a valid email" + } + } +} \ No newline at end of file diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/about-page-broad-building.png b/ddp-workspace/projects/ddp-esc/src/assets/images/about-page-broad-building.png new file mode 100644 index 0000000000..f2d5ac9adf Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/about-page-broad-building.png differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/about-page-broad-hero.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/about-page-broad-hero.jpg new file mode 100644 index 0000000000..73f64b9955 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/about-page-broad-hero.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/adam_bass.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/adam_bass.jpg new file mode 100644 index 0000000000..7238fdf2fa Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/adam_bass.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/arrow.svg b/ddp-workspace/projects/ddp-esc/src/assets/images/arrow.svg new file mode 100644 index 0000000000..261695c97c --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/assets/images/arrow.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/bill_drake.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/bill_drake.jpg new file mode 100644 index 0000000000..bc90469f99 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/bill_drake.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/dana_deighton.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/dana_deighton.jpg new file mode 100644 index 0000000000..8cb1efc963 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/dana_deighton.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/debbies-dream-foundation.svg b/ddp-workspace/projects/ddp-esc/src/assets/images/debbies-dream-foundation.svg new file mode 100644 index 0000000000..7b78681c97 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/assets/images/debbies-dream-foundation.svg @@ -0,0 +1 @@ +debbies-dream-foundation \ No newline at end of file diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/degregorio-family-foundation.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/degregorio-family-foundation.jpg new file mode 100644 index 0000000000..f25e23d9e6 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/degregorio-family-foundation.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/dna-strand.svg b/ddp-workspace/projects/ddp-esc/src/assets/images/dna-strand.svg new file mode 100644 index 0000000000..29fc945dc2 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/assets/images/dna-strand.svg @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/esophageal-cancer-action-network.png b/ddp-workspace/projects/ddp-esc/src/assets/images/esophageal-cancer-action-network.png new file mode 100644 index 0000000000..0be012bae0 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/esophageal-cancer-action-network.png differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/esophageal-cancer-awareness-association.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/esophageal-cancer-awareness-association.jpg new file mode 100644 index 0000000000..231f02a41b Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/esophageal-cancer-awareness-association.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/facebook.svg b/ddp-workspace/projects/ddp-esc/src/assets/images/facebook.svg new file mode 100644 index 0000000000..d8049b96a8 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/assets/images/facebook.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/gastric-cancer-foundation.png b/ddp-workspace/projects/ddp-esc/src/assets/images/gastric-cancer-foundation.png new file mode 100644 index 0000000000..1433f0cfb1 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/gastric-cancer-foundation.png differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/george_evans.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/george_evans.jpg new file mode 100644 index 0000000000..0bfcbaef49 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/george_evans.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/gi-cancers-alliance.png b/ddp-workspace/projects/ddp-esc/src/assets/images/gi-cancers-alliance.png new file mode 100644 index 0000000000..7bd1a1d2a4 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/gi-cancers-alliance.png differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/home-image-lg.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/home-image-lg.jpg new file mode 100644 index 0000000000..d9cfb9d1d1 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/home-image-lg.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/home-image-md.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/home-image-md.jpg new file mode 100644 index 0000000000..1cea20ae7a Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/home-image-md.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/home-image-sm.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/home-image-sm.jpg new file mode 100644 index 0000000000..19cb5ddfc8 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/home-image-sm.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/home-image-xs.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/home-image-xs.jpg new file mode 100644 index 0000000000..d385a64abf Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/home-image-xs.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/hope-for-stomach-cancer.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/hope-for-stomach-cancer.jpg new file mode 100644 index 0000000000..f9553a286a Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/hope-for-stomach-cancer.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/jeff_thomas.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/jeff_thomas.jpg new file mode 100644 index 0000000000..7810ba9145 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/jeff_thomas.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/jim_palma.jpg b/ddp-workspace/projects/ddp-esc/src/assets/images/jim_palma.jpg new file mode 100644 index 0000000000..bdc180bf24 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/jim_palma.jpg differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/logo-broad-institute.png b/ddp-workspace/projects/ddp-esc/src/assets/images/logo-broad-institute.png new file mode 100644 index 0000000000..b7cb1d8df2 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/logo-broad-institute.png differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/logo-count-me-in.svg b/ddp-workspace/projects/ddp-esc/src/assets/images/logo-count-me-in.svg new file mode 100644 index 0000000000..74ba732e54 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/assets/images/logo-count-me-in.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/logo-dana-farber-cancer-institute.png b/ddp-workspace/projects/ddp-esc/src/assets/images/logo-dana-farber-cancer-institute.png new file mode 100644 index 0000000000..e2911ac1f4 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/logo-dana-farber-cancer-institute.png differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/no-stomach-for-cancer.png b/ddp-workspace/projects/ddp-esc/src/assets/images/no-stomach-for-cancer.png new file mode 100644 index 0000000000..006cf67ef1 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/no-stomach-for-cancer.png differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/project-logo.svg b/ddp-workspace/projects/ddp-esc/src/assets/images/project-logo.svg new file mode 100644 index 0000000000..c398826ee9 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/assets/images/project-logo.svg @@ -0,0 +1 @@ +prostate-cancer-project-isotype \ No newline at end of file diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/step-1.svg b/ddp-workspace/projects/ddp-esc/src/assets/images/step-1.svg new file mode 100644 index 0000000000..c3c1fcbe8e --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/assets/images/step-1.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/step-2.svg b/ddp-workspace/projects/ddp-esc/src/assets/images/step-2.svg new file mode 100644 index 0000000000..f451f69853 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/assets/images/step-2.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/step-3.svg b/ddp-workspace/projects/ddp-esc/src/assets/images/step-3.svg new file mode 100644 index 0000000000..6819842654 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/assets/images/step-3.svg @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/target-cancer-foundation-logo.png b/ddp-workspace/projects/ddp-esc/src/assets/images/target-cancer-foundation-logo.png new file mode 100644 index 0000000000..01ee6f8af9 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/assets/images/target-cancer-foundation-logo.png differ diff --git a/ddp-workspace/projects/ddp-esc/src/assets/images/twitter.svg b/ddp-workspace/projects/ddp-esc/src/assets/images/twitter.svg new file mode 100644 index 0000000000..d724c58de8 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/assets/images/twitter.svg @@ -0,0 +1,11 @@ + + + + + diff --git a/ddp-workspace/projects/ddp-esc/src/environments/environment.prod.ts b/ddp-workspace/projects/ddp-esc/src/environments/environment.prod.ts new file mode 100644 index 0000000000..3612073bc3 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/ddp-workspace/projects/ddp-esc/src/environments/environment.ts b/ddp-workspace/projects/ddp-esc/src/environments/environment.ts new file mode 100644 index 0000000000..7b4f817adb --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/environments/environment.ts @@ -0,0 +1,16 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/ddp-workspace/projects/ddp-esc/src/favicon-alert.ico b/ddp-workspace/projects/ddp-esc/src/favicon-alert.ico new file mode 100644 index 0000000000..3e2b853301 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/favicon-alert.ico differ diff --git a/ddp-workspace/projects/ddp-esc/src/favicon.ico b/ddp-workspace/projects/ddp-esc/src/favicon.ico new file mode 100644 index 0000000000..3e2b853301 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/favicon.ico differ diff --git a/ddp-workspace/projects/ddp-esc/src/index.html b/ddp-workspace/projects/ddp-esc/src/index.html new file mode 100644 index 0000000000..6b464029d7 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/index.html @@ -0,0 +1,58 @@ + + + + + + + Esophageal and Stomach Cancer Project + + + + + + + + + + + + + + + + + diff --git a/ddp-workspace/projects/ddp-esc/src/main.ts b/ddp-workspace/projects/ddp-esc/src/main.ts new file mode 100644 index 0000000000..6a0211c019 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/main.ts @@ -0,0 +1,12 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic().bootstrapModule(AppModule, { preserveWhitespaces: true }) + .catch(err => console.error(err)); diff --git a/ddp-workspace/projects/ddp-esc/src/pdf/ESCBrochure.pdf b/ddp-workspace/projects/ddp-esc/src/pdf/ESCBrochure.pdf new file mode 100644 index 0000000000..79414cbc10 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/pdf/ESCBrochure.pdf differ diff --git a/ddp-workspace/projects/ddp-esc/src/pdf/ESC_InitialIntakeSurvey.pdf b/ddp-workspace/projects/ddp-esc/src/pdf/ESC_InitialIntakeSurvey.pdf new file mode 100644 index 0000000000..3859c5bd8c Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/pdf/ESC_InitialIntakeSurvey.pdf differ diff --git a/ddp-workspace/projects/ddp-esc/src/pdf/physician.pdf b/ddp-workspace/projects/ddp-esc/src/pdf/physician.pdf new file mode 100644 index 0000000000..5e12e3adc2 Binary files /dev/null and b/ddp-workspace/projects/ddp-esc/src/pdf/physician.pdf differ diff --git a/ddp-workspace/projects/ddp-esc/src/polyfills.ts b/ddp-workspace/projects/ddp-esc/src/polyfills.ts new file mode 100644 index 0000000000..cf57eab18e --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/polyfills.ts @@ -0,0 +1,57 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** +* BROWSER POLYFILLS +*/ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** Evergreen browsers require these. **/ +/** import 'core-js/es6/reflect'; +import 'core-js/es7/reflect'; +import 'core-js/es7/array'; **/ + + +/** + * Required to support Web Animations `@angular/platform-browser/animations`. + * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation + **/ +import 'web-animations-js'; // Run `npm install --save web-animations-js`. + + + +/*************************************************************************************************** + * Zone JS is required by Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + +import 'hammerjs'; + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ + +/** + * Date, currency, decimal and percent pipes. + * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 + */ +// import 'intl'; // Run `npm install --save intl`. +/** + * Need to import at least one locale-data with intl. + */ +// import 'intl/locale-data/jsonp/en'; diff --git a/ddp-workspace/projects/ddp-esc/src/styles.scss b/ddp-workspace/projects/ddp-esc/src/styles.scss new file mode 100644 index 0000000000..3aa670336a --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/styles.scss @@ -0,0 +1,2124 @@ +@import 'app-theme.scss'; +$warning-height: 150px; + +html, +body { + margin: 0; + padding: 0; + height: 100%; + font-size: 16px; + padding-right: 0px !important; + background-color: mat-color($app-theme, 200); +} + +body { + font-family: 'Roboto', sans-serif; +} + +@media only screen and (min-width: 1380px) { + html { + font-size: 20px; + } +} + +@media only screen and (max-width: 1280px) { + html { + font-size: 16px; + } +} + +@media only screen and (max-width: 1024px) { + html { + font-size: 14px; + } +} + +h1 { + font-size: 2rem; +} + +h2 { + font-size: 1.2rem; +} + +h3 { + font-size: 1.1rem; +} + +p { + font-size: 1rem; +} + +a { + text-decoration: none !important; + outline: 0; +} + +a:hover, +a:active, +a:focus { + outline: 0; + color: mat-color($app-theme, 700); +} + +.row { + display: block; +} + +.intro-row { + margin-top: 150px; +} + +.row:after { + content: ""; + display: table; + clear: both; +} + +// App Header +.Header { + position: fixed; + top: 0; + left: 0; + width: 100%; + min-height: 90px; + padding: 0 35px 5px 35px !important; + z-index: 3; + display: flex; + justify-content: space-between; + background-color: mat-color($app-theme, 50); +} + +.HeaderInfo { + max-width: 660px; + display: inline-block; + margin: 0 0 0 20px; + + a { + color: mat-color($app-theme, 600); + } +} + +.HeaderInfo--scrolled { + margin: 0; +} + +.Header-navItemLink { + font-size: 1rem; + transition: color 0.3s ease; + cursor: pointer; + font-weight: 300; +} + +.Header--scrolled { + color: mat-color($app-theme, 400); +} + +.HeaderLink { + transition: color 0.3s ease; + color: mat-color($app-theme, 100); +} + +.HeaderLink:hover { + color: mat-color($app-theme, 700); +} + +.PageHeader-activity-subtitle { + font-size: 0.95rem; + font-weight: 300; + line-height: 1.6em; + color: mat-color($app-theme, 100); + margin: 5px 0 5px 0; +} + +.Header--scrolled { + background-color: mat-color($app-theme, 200); + box-shadow: 0 1px 8px mat-color($app-theme, 300); +} + +.Header-logoImg { + height: 68px; +} + +.Header-logo { + margin: 0 0 0 50px; + cursor: pointer; + height: 100%; + align-items: baseline; + display: flex; + align-self: flex-start; +} + +.Header-logo--small { + margin: 0; +} + +.Header-logo--hide { + display: none; +} + +.Header-link { + display: flex; + align-items: flex-start; +} + +.Header-logoText { + margin: 13px 0 0 10px; + color: mat-color($app-theme, 100); + font-size: 18px; + font-weight: 300; + line-height: 19px; +} + +.Header-logoText--Scrolled { + color: mat-color($app-theme, 400); +} + +.Header-nav { + margin: 0px 50px 0 0; +} + +.Header-nav--small { + margin: 0; +} + +.Header-navList { + display: flex; + margin: 0px; +} + +.Header-navList--small { + padding: 0; +} + +.Header-navItem { + display: inline-flex; + align-items: center; + font-size: 0.95rem; + line-height: 1.6em; + text-decoration: none; + padding: 0 0 0 20px; + transition: background-color 0.3s ease; +} + +.CountButton { + font-weight: 700; + border: 2px solid mat-color($app-theme, 100); + border-radius: 18px; + padding: 5px 20px; + color: mat-color($app-theme, 100); + text-decoration: none; + cursor: pointer; + outline: 0; + transition: all 0.3s ease; +} + +.CountButton:hover { + color: mat-color($app-theme, 700); + border: 2px solid mat-color($app-theme, 700); + transition: all 0.3s ease; +} + +.CountButton--Scrolled { + background-color: mat-color($app-theme, 2200); + border: none; + margin: 2px; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); + transition: box-shadow 0.3s ease; +} + +.CountButton--Scrolled:hover { + color: mat-color($app-theme, 100); + border: none; + box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15); +} + +.MenuButton { + display: inline-flex; + text-decoration: none; + color: mat-color($app-theme, 100); + cursor: pointer; +} + +.MenuButton-Icon--Scrolled { + color: mat-color($app-theme, 600); +} + +.SimpleButton { + background: none; + border: none; + padding: 0; + outline: none; + font-size: 1rem; + transition: color 0.3s ease; + cursor: pointer; + font-weight: 300; + text-decoration: none; + color: mat-color($app-theme, 100); + text-align: left; + transition: all 0.3s ease; +} + +.SimpleButton--Scrolled { + color: mat-color($app-theme, 2200); +} + +.SimpleButton:hover { + color: mat-color($app-theme, 700); + text-decoration: none; +} + +.SimpleButton:active { + text-decoration: none; + color: mat-color($app-theme, 600); +} + +.LastUpdatedText { + text-align: right; + font-weight: 300; + padding: 5px; + color: mat-color($app-theme, 800); +} + +// Footer +.Footer { + position: absolute; + bottom: 0; + width: 100%; + min-height: 185px; + /* Height of the footer */ + padding: 0 35px 0 35px; + z-index: 2; + background-color: mat-color($app-theme, 200); + display: flex; + flex-direction: column; +} + +.Footer-navigation { + display: flex; + flex-wrap: wrap; + justify-content: space-between; +} + +.Footer-logo { + width: 150px; + margin: 0 0 0 25px; + cursor: pointer; + display: flex; + align-items: flex-start; +} + +.Footer-logoCMI { + padding: 15px 25px 0 25px; +} + +.Footer-logoCMI-img { + height: 52px; + width: auto; +} + +.Footer-logoImg { + height: 68px; +} + +.Footer-logoText { + margin: 13px 0 0 10px; + color: mat-color($app-theme, 400); + font-size: 18px; + font-weight: 300; + line-height: 19px; +} + +.Footer-nav { + display: flex; + flex-direction: column; + margin: 30px 50px 0 25px; +} + +.Footer-navList { + display: flex; + flex-direction: row; + list-style-type: none; + flex-wrap: wrap; + padding: 0; +} + +.Footer-navItem { + font-size: 0.95rem; + line-height: 1.6em; + text-decoration: none; + padding-left: 20px; +} + +.Footer-navItem--first { + padding: 0; +} + +.Footer-navItemLink { + transition: color 0.3s ease; + cursor: pointer; + color: mat-color($app-theme, 500); + font-weight: 300; +} + +.Footer-navItemLink:hover { + color: mat-color($app-theme, 2200); + text-decoration: none; +} + +.Footer-contact { + font-size: 1rem; + display: flex; + flex-direction: row; + width: 100%; + padding: 10px 0 0 0; +} + +.Footer-contactList { + color: mat-color($app-theme, 500); + font-weight: 300; + list-style-type: none; + padding: 0; +} + +.Footer-contactList--right { + padding: 0 0 0 50px; +} + +.Footer-contactLink { + transition: color 0.3s ease; + cursor: pointer; + color: mat-color($app-theme, 500); + font-weight: 300; +} + +.Footer-contactLink:hover { + color: mat-color($app-theme, 2200); + text-decoration: none; +} + +.Footer-contactLogos { + padding-right: 5px; + height: 15px; +} + +@media only screen and (max-width: 1200px) { + .Footer-nav { + display: flex; + justify-content: center; + width: 100%; + margin: 30px 0 0 25px; + } +} + +// Page header +.MainContainer { + position: relative; + min-height: 100%; + background-color: mat-color($app-theme, 200); +} + +.PageHeader { + position: relative; + padding-top: 0; + margin-bottom: 20px; +} + +.PageHeader-background { + height: auto; + padding: 78px 0 5px 0; + color: mat-color($app-theme, 100); + width: 100%; + background-color: mat-color($app-theme, 600); + display: flex; +} + +.PageLayout { + max-width: 660px; + width: 100%; + margin: 0 auto; +} + +@media only screen and (min-width: 1440px) { + .PageLayout { + max-width: 900px; + } +} + +.PageLayout-dashboard { + max-width: 1200px !important; +} + +.PageHeader-title { + display: inline-block; + font-weight: 300; + font-size: 2.4rem; + line-height: 2.7rem; +} + +.PageHeader-subTitle { + white-space: normal; + font-size: 1rem; + font-weight: 300; + line-height: 1.6em; + color: mat-color($app-theme, 600); +} + +.PageHeader-title small { + color: mat-color($app-theme, 100); + font-style: italic; + font-weight: 300; + font-size: 55%; + display: block; + line-height: 1.5; +} + +.PageHeader-image .PageHeader-imageSpan { + display: inline-block; + width: 100%; + font-size: 0; + line-height: 0; + vertical-align: middle; + background-size: 100%; + background-position: 50% 50%; + background-repeat: no-repeat; + background-image: url(/assets/images/about-page-broad-hero.jpg); + position: relative; +} + +.PageHeader-image .PageHeader-imageSpan .PageHeader-imageInner { + padding-top: 42%; + display: block; + height: 0; +} + +.PageHeader-box { + position: relative; + bottom: 150px; + width: 60%; + margin: 0 auto !important; + border-radius: 2px; + background-color: mat-color($app-theme, 100); + text-align: left; + z-index: 1; +} + +.PageHeader-boxContent { + color: mat-color($app-theme, 1000); + padding: 40px; + font-size: 1.5rem; + line-height: 1.25; + font-weight: 300; +} + +.PageHeader-boxFooter { + border-top: 1px solid rgba(160, 160, 160, 0.2); + padding: 20px 40px; + font-weight: 300; + font-size: 0.95rem; +} + +.PageHeader-backgroundAboutUs { + height: auto; + padding: 120px 0 0 0; + margin-top: -300px; + color: mat-color($app-theme, 100); + width: 100%; + background-color: mat-color($app-theme, 600); + z-index: 2; +} + +.PageHeader-titleAboutUs { + margin: 100px 0 30px 0; + text-align: center; + display: block; +} + +.Message { + text-align: center; + color: mat-color($app-theme, 1000); + display: block; +} + +.Message-title { + font-size: 2.4rem; + font-weight: 300; + line-height: 1.25; + color: mat-color($app-theme, 1000); + margin-bottom: 18px; +} + +.Message-partners { + display: flex; + flex-flow: column; + justify-content: space-around; + align-items: center; + height: 210px; +} + +.partner-logo { + max-width: 250px; + width: 100%; +} + +.partner-logo--single { + max-width: 500px; + width: 100%; +} + +.Wrapper { + position: relative; + min-height: 100%; + margin: 0 35px; + padding-bottom: 250px; + background-color: mat-color($app-theme, 100); + z-index: 1; +} + +.NoMargin { + margin: 0 !important; +} + +.NoPadding { + padding: 0 !important; +} + +.Float--right { + float: right !important; +} + +.Position--relative { + position: relative; +} + +.row--moreBottomMargin { + margin-bottom: 120px; +} + +@media only screen and (max-width: 450px) { + .row--moreBottomMargin { + margin-bottom: 180px; + } +} + +.row--moreTopMargin { + margin-top: 40px; +} + +@media only screen and (max-width: 1480px) { + .Footer-logo { + order: 1; + } + + .Footer-logoCMI { + order: 2; + } + + .Footer-nav { + order: 3; + width: 100%; + } +} + +@media only screen and (max-width: 1025px) { + .Wrapper { + margin: 0; + padding-bottom: 350px; + } + + .Header-nav { + margin: 0; + } + + .Header-logo { + margin: 0; + } + + .Footer-logo { + margin: 0; + } + + .Footer-nav { + margin: 30px 50px 0 0; + } +} + +@media only screen and (max-width: 478px) { + + .Footer-logoImg, + .Header-logoImg { + width: 19px; + height: auto; + } + + .Footer-logoText, + .Header-logoText { + left: 28px; + font-size: 15px; + line-height: 17px; + } +} + +@media only screen and (max-width: 370px) { + .Header { + min-height: 65px; + } + + .Footer-logoImg, + .Header-logoImg { + width: 16px; + } + + .Footer-logoText, + .Header-logoText { + font-size: 13px; + line-height: 15px; + } +} + +@media only screen and (max-width: 770px) { + .PageHeader-box { + bottom: 0; + width: 100%; + margin: 0 auto !important; + } + + .PageHeader-titleAboutUs { + margin: 180px 0 30px 0 !important; + } + + + .PageHeader-backgroundAboutUs { + margin-top: -270px; + } +} + +@media only screen and (max-width: 810px) { + + .Footer-navList { + flex-direction: column; + } + + .Footer-navItem { + padding: 0; + } +} + +@media only screen and (max-width: 450px) { + + .PageContent-ol li, + .PageContent-ul li { + padding: 0 0 0 15px; + } + + .PageHeader-background { + padding: 50px 0 0 0; + margin-top: 0; + } + + .PageHeader-title { + padding: 20px 20px 0 20px; + } + + .PageContent { + padding: 20px 0 150px 0; + } + + .Message-title { + font-size: 2rem; + } + + .PageHeader-title { + padding: 20px 20px 0 20px; + } + + .PageHeader-activity-subtitle { + padding: 0 20px 10px 20px; + } + + .Modal-title { + margin: 0 !important; + font-size: 2rem !important; + line-height: 2rem !important; + } + + .Modal-text { + margin: 0 !important; + } + + .modal-message { + .warning-message-text { + margin: 0 !important; + } + } + + .mat-dialog-actions { + padding: 12px 0 0 0 !important; + + .ButtonFilled { + padding: 9px 10px !important; + } + } + + .Footer-logoCMI-img { + width: auto; + height: 40px; + } + + .Header, + .Footer { + padding: 0 15px !important; + } + + .PageHeader-subTitle { + font-size: 1rem; + line-height: 1.3rem; + } +} + +// Page +.PageContent { + padding: 50px 0 150px 0; +} + +.PageContent-section { + padding: 1rem 0; +} + +.PageContent-section.council { + padding: 1rem; +} + +.Dashboard-info-section { + display: flex; + flex-direction: column; + align-items: flex-end; + margin: 0 0 20px 0; + padding: 35px 35px 30px 35px; + background: mat-color($app-theme, 200); + border: 2px solid mat-color($app-theme, 600); + position: relative; + + .close-button { + display: flex; + justify-content: center; + position: absolute; + right: 0; + top: 0; + } +} + +ul { + li.PageContent-text-list { + padding: 0 !important; + margin: 10px 0 !important; + } +} + +.PageContent-text, +.PageContent-box-text { + font-weight: 300; + font-size: 1.1rem; + line-height: 1.6rem; + color: mat-color($app-theme, 1000); + text-align: left; +} + +.PageContent-image { + width: 100%; + height: auto; +} + +.Link { + color: mat-color($app-theme, 2200) !important; + cursor: pointer; + transition: all 0.3s ease; +} + +.Link:hover, +.Link:focus { + color: mat-color($app-theme, 700) !important; +} + +.PageContent-title { + font-size: 1.4rem; + color: mat-color($app-theme, 1000); + font-weight: 300; + line-height: 1.33; + margin: 2.1rem 0 1.3rem 0; +} + +.PageContent-title.council { + font-size: 2.2rem; + text-align: center; + margin: 2.5rem 0; +} + +.PageContent-sectionAboutUs { + padding: 0; +} + +.HorizontalLine { + margin: 40px 0; +} + +.topMarginMedium { + margin: 15px 0 0 0; +} + +.Italic { + font-style: italic; +} + +.Color--neutral { + color: mat-color($app-theme, 800) !important; +} + +.Normal { + font-weight: 300 !important; +} + +.ButtonFilled { + outline: none; + padding: 7px 20px; + border-radius: 30px !important; + border: none; + color: mat-color($app-theme, 100) !important; + font-size: 1rem; + font-weight: 300; + transition: all 0.3s ease-out; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12) !important; + background-color: mat-color($app-theme, 2200) !important; +} + +.ButtonFilled:focus { + outline: none; +} + +.ButtonFilled--white { + background-color: mat-color($app-theme, 100) !important; + color: mat-color($app-theme, 1500) !important; + font-size: 0.95rem; + margin-top: 20px; +} + +.ButtonFilled--white:hover { + background-color: mat-color($app-theme, 100) !important; +} + +.ButtonFilled--neutral { + background-color: mat-color($app-theme, 300) !important; + margin-right: 0px; +} + +.ButtonFilled--neutral--margin { + margin-right: 20px; +} + +.Button--rect { + float: right; + border-radius: 2px !important; + display: inline-block; + text-transform: uppercase; + font-size: 0.95rem; + font-weight: 300; + vertical-align: middle; + z-index: 1; + transition: all 0.3s ease-out; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); +} + +.Button--disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.ButtonFilled:hover, +.ButtonFloating:hover, +.Button--rect:hover { + box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15) !important; +} + +.ButtonFilled:hover, +.ButtonFilled:visited { + color: mat-color($app-theme, 100); +} + +// welcome +.Intro { + position: absolute; + top: 0; + margin: 0; + max-width: 100%; + display: inline-block; +} + +.Intro-image .Intro-imageSpan { + display: inline-block; + width: 100%; + font-size: 0; + line-height: 0; + vertical-align: middle; + background-size: 100%; + background-position: 50% 50%; + background-repeat: no-repeat; + background-image: url(/assets/images/home-image-lg.jpg); + position: relative; +} + +@media only screen and (min-width: 1280px) { + .Intro-image .Intro-imageSpan { + background-image: url(/assets/images/home-image-lg.jpg); + } + + .Intro-image .Intro-imageSpan .Intro-imageInner { + padding-top: 51% !important; + } +} + +@media only screen and (max-width: 1280px) { + .Intro-image .Intro-imageSpan { + background-image: url(/assets/images/home-image-md.jpg); + } + + .Intro-image .Intro-imageSpan .Intro-imageInner { + padding-top: 70% !important; + } +} + +@media only screen and (max-width: 800px) { + .Intro-image .Intro-imageSpan { + background-image: url(/assets/images/home-image-sm.jpg); + } + + .Intro-image .Intro-imageSpan .Intro-imageInner { + padding-top: 68% !important; + } +} + +@media only screen and (max-width: 700px) { + .Intro-image .Intro-imageSpan { + background-image: url(/assets/images/home-image-xs.jpg); + } + + .Intro-image .Intro-imageSpan .Intro-imageInner { + padding-top: 175% !important; + } +} + +.Intro-image .Intro-imageSpan .Intro-imageInner { + padding-top: 50%; + display: block; + height: 0; +} + +.Intro-arrow { + position: absolute; + bottom: 20px; + left: 50%; + margin-left: -32px; + opacity: 1; + z-index: 5; + cursor: pointer; +} + +.Intro-footer { + text-align: center; + margin: 0 0 -50px 0; +} + +.Intro-footerLogos { + margin: 10px 20px; + height: 30px; +} + +@media only screen and (max-width: 450px) { + .Intro-footerLogos { + margin: 10px 10px; + } +} + +.Message--intro { + margin-top: 150px; +} + +@media only screen and (max-width: 1500px) { + .Message--intro { + margin-top: 65px; + } +} + +@media only screen and (max-width: 1280px) { + .Message--intro { + margin-top: 150px; + } +} + +@media only screen and (max-width: 1024px) { + .Message--intro { + margin-top: 100px; + } + + .Footer-logoCMI { + padding-right: 0 !important; + } +} + +@media only screen and (max-width: 450px) { + .Message--intro { + margin-top: 100px; + } +} + +.Message--intro .Message-title, +.Message--intro .Message-text { + color: mat-color($app-theme, 1000); +} + +.Separator { + width: 1px; + background: mat-color($app-theme, 2100); + margin: 50px auto; + position: relative; + height: 125px; +} + +.Separator:before, +.Separator:after { + content: ' '; + display: block; + width: 7px; + height: 7px; + border-radius: 100%; + position: absolute; + left: -3px; + background: mat-color($app-theme, 2100); +} + +.Separator:before { + top: -3px; +} + +.Separator:after { + bottom: -3px; +} + +.DNAStrand { + width: 100%; + margin: 35px 0; +} + +.Message-text { + font-size: 1rem; + font-weight: 300; + color: mat-color($app-theme, 1000); + line-height: 1.6; + margin-bottom: 18px; +} + +.Message-step { + text-align: center; + margin: 25px 0 35px 0; + padding: 0 30px; +} + +.Message-stepImage { + max-height: 100%; +} + +.Message-stepTitle { + font-size: 1.5rem; + display: block; + font-weight: 400; + line-height: 1.33; + text-align: left; + padding: 40px 0 0 30px; +} + +.Message-stepSubtitle { + font-size: 0.95rem; + display: block; + font-weight: 500; + line-height: 1.33; + text-align: left; + padding: 0 0 20px 30px; +} + +.Message-stepText { + font-size: 0.95rem; + font-weight: 300; + line-height: 1.6; + text-align: left; + padding: 0 0 0 30px; + color: mat-color($app-theme, 1000); +} + +.Semibold { + font-weight: 400 !important; +} + +.ButtonBordered { + padding: 7px 20px; + border-radius: 18px; + background-color: transparent; + font-size: 1rem; + font-weight: 700; + border: 2px solid; + transition: color 0.3s ease, border-color 0.3s ease; +} + +.ButtonBordered, +.ButtonBordered:visited { + color: mat-color($app-theme, 2200) !important; + border-color: mat-color($app-theme, 2200) !important; + box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12) !important; + transition: all 0.3s ease-out; +} + +.ButtonBordered:hover { + text-decoration: none; + background-color: transparent; + color: mat-color($app-theme, 700) !important; + border-color: mat-color($app-theme, 700) !important; + box-shadow: 0 5px 11px 0 rgba(0, 0, 0, 0.18), 0 4px 15px 0 rgba(0, 0, 0, 0.15) !important; +} + +.Button--countMeIn { + margin: 0 auto !important; + text-align: center; + max-width: 180px; + cursor: pointer; + font-size: 1.2rem; + padding: 6px 15px 7px 15px; + border-radius: 22px; + display: block; +} + +.Color--study { + color: mat-color($app-theme, 2200); +} + +.Semibold { + font-weight: 400 !important; +} + +.PageContent-ol, +.PageContent-ul { + margin: 20px !important; + padding: 0 !important; + text-align: left !important; + font-weight: 300 !important; +} + +.PageContent-ol { + list-style-type: decimal; + list-style-position: outside; +} + +.PageContent-ol li, +.PageContent-ul li { + padding: 0 0 0 25px !important; + font-size: 1.1rem !important; + font-weight: 300 !important; + margin: 35px 0 20px 0 !important; + position: relative; +} + +.PageContent-ol li::before, +.PageContent-ul li::before { + position: absolute; + display: inline-block; + content: ""; + height: 100%; +} + +.NoListStyle { + list-style-type: none; +} + +.Login-landing-header { + height: 78px; + background-color: mat-color($app-theme, 600); +} + +.Modal-title { + font-size: 2.5rem; + line-height: 2.5rem; + color: rgba(0, 0, 0, 0.5); + margin: 10px 0 12px 0; + font-weight: 300; + display: flex; + justify-content: space-between; + position: relative; + + .mat-icon-button { + top: -20px; + right: -15px; + } +} + +.Modal-text { + color: rgba(0, 0, 0, 0.5); + font-size: 0.95rem; + line-height: 1.6rem; + font-weight: 300; + margin-bottom: 15px; +} + +.ErrorMessage a { + text-decoration: underline !important; +} + +.ErrorMessage { + border-top: 2px solid mat-color($app-theme, 1200); + margin-top: 30px; + font-size: 0.9rem; + color: mat-color($app-theme, 1200); + font-weight: 300; + padding: 15px 0; +} + +.ErrorMessage a { + text-decoration: underline !important; +} + +.ddp-activity-validation { + .ErrorMessageList { + list-style-type: square; + } + + .ErrorMessageItem { + font-size: 0.9rem; + color: mat-color($app-theme, 1200); + font-weight: 300; + margin: 10px 0 10px 0; + padding: 0 0 0 0; + } +} + +.JoinDialogFiled { + width: 100%; +} + +.JoinDialogNameField { + width: 50%; + margin: 0 30px 0 0; +} + +.JoinDialogLastnameField { + width: 50%; +} + +.JoinDialogGroupFields { + display: flex; +} + +.JoinField--margin { + margin-bottom: 5px; +} + +@media only screen and (max-width: 650px) { + .JoinDialogGroupFields { + flex-direction: column; + } + + .JoinDialogNameField { + width: 100%; + margin: 0; + } + + .JoinDialogLastnameField { + width: 100%; + } +} + +@media only screen and (max-width: 599px) { + .HeaderInfo { + margin: 0 + } +} + +.ResendEmailField { + width: 100%; + margin-bottom: 5px; +} + +.ConsentButtons { + display: flex; + justify-content: space-between; +} + +.NextButton { + width: 100%; + display: flex; + justify-content: flex-end; +} + +.WizardSteps { + position: relative; + margin: 40px 0 30px 0; + text-align: center; + cursor: pointer; +} + +.WizardSteps-background { + background: mat-color($app-theme, 100); + margin-top: 40px; + border-radius: 12px; + z-index: 0; + width: 100%; +} + +.WizardSteps-title { + padding: 60px 0 15px 0; + font-size: 1.1rem; + font-weight: 300; + color: mat-color($app-theme, 800); +} + +.WizardSteps-img { + position: absolute; + top: 0; + left: calc((100% - 70px) / 2); + width: 70px; + height: 85px; + background-color: mat-color($app-theme, 100); + box-shadow: 0 0 5px mat-color($app-theme, 800); +} + +.WizardSteps.completed .WizardSteps-background { + background: mat-color($app-theme, 1400); +} + +.WizardSteps.active.completed .WizardSteps-background { + background: mat-color($app-theme, 600); +} + +.WizardSteps.active.completed .WizardSteps-title { + color: mat-color($app-theme, 100); +} + +.Loader { + position: absolute; + top: 50%; + left: 50%; + border: 12px solid mat-color($app-theme, 600); + border-top: 12px solid mat-color($app-theme, 1600); + border-radius: 50%; + width: 60px; + height: 60px; + margin-top: -50px; + margin-left: -30px; + animation: spin 2s linear infinite; +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +.Sidenav li { + text-align: start; + padding: 0 !important; +} + +.Loader-height { + height: 50vh; +} + +.PageContent-box { + width: 100%; + padding: 3rem; + background: mat-color($app-theme, 200); + border: 2px solid mat-color($app-theme, 600); + box-shadow: none; + font-size: 1rem; +} + +.PageContent-box-text { + color: mat-color($app-theme, 1000); +} + +.PageContent-strong-text { + margin: 0 0 0 40px; +} + +@media only screen and (max-width: 450px) { + .PageContent-box { + padding: 2.2rem 2rem 2rem 2rem; + } +} + +.PageContent-contact-item { + font-weight: 300 !important; + font-size: 1.1rem !important; + line-height: 1.6rem; + color: mat-color($app-theme, 800) !important; + margin: 0 !important; +} + +.PageContent-list-item { + list-style-type: circle !important; +} + +.PageContent-info { + margin: 0 20px; +} + +.PageContent-closing-text { + color: mat-color($app-theme, 800); + font-size: 1rem; + font-weight: 300; + margin: 0 20px; +} + +.PageContent-closing-question { + margin: 35px 20px -25px 20px !important; +} + +.PageContent-infobox-section { + padding: 2rem 0 0 0; +} + +.PageContent-infobox { + padding: 1rem; + background: mat-color($app-theme, 200); + border: 2px solid mat-color($app-theme, 600); + box-shadow: none; + font-size: 1rem; + margin: 0 20px; +} + +.PageContent-subtitle { + color: mat-color($app-theme, 1000); + font-weight: 400; + font-size: 1.2rem; + line-height: 1.8rem; + margin: 2rem 0 1rem 0; +} + +.PageContent-subtitle.council { + margin-top: 0; + font-size: 1.4rem; + line-height: 1.4rem; +} + +.PageContent-subtitle-dashboard { + margin: 0.5rem 0 !important; +} + +.PageContent-text-dashboard { + font-size: 1rem !important; +} + +.reverse-row { + display: block; +} + +.council { + @media only screen and (min-width: 768px) { + .col-xs-offset-2 { + margin-left: auto; + } + + .reverse-row { + display: flex; + flex-direction: row-reverse; + } + } + + @media only screen and (max-width: 768px) { + .PageContent-image { + margin-bottom: 20px; + } + + .PageContent-text { + margin: 0; + } + } +} + +.council-row { + margin: 25px 0 150px 0; +} + +.PageContent-text br { + line-height: 2.5rem; +} + +.Button--cell { + font-size: 0.85rem; + min-width: 90px !important; + height: 30px; + line-height: 26px !important; + padding: 0 !important; + border-radius: 2px !important; + outline: none; +} + +.Announcements-section { + align-self: stretch; +} + +select { + background-color: rgba(255, 255, 255, 0.9); + width: 100%; + padding: 5px; + border: 1px solid mat-color($app-theme, 1800); + border-radius: 2px; + height: 3rem; + transition: all .3s; +} + +select:focus { + color: mat-color($app-theme, 600); + outline: none; +} + +select option { + color: black; +} + +select:-webkit-autofill { + background-color: transparent !important; +} + +@media only screen and (max-width: 767px) { + .Button--cell { + min-width: 95% !important; + } +} + +.warning-message { + position: fixed; + height: $warning-height; + top: 0; + left: 0; + width: 100%; + background-color: mat-color($app-theme, 2000); + z-index: 3; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + padding: 5px; +} + +.warning-message { + .warning-message-text { + color: mat-color($app-theme, 1700); + font-size: 1.1rem; + line-height: 1.1rem; + font-weight: 300; + width: 100%; + text-align: center; + } +} + +.modal-message { + .warning-message-text { + color: rgba(0, 0, 0, 0.5); + font-size: 0.95rem; + line-height: 1.6rem; + font-weight: 300; + margin-bottom: 15px; + } +} + +.warning-message-top { + top: $warning-height !important; +} + +.CenterDivTableau { + text-align: center; + display: block; + width: 100%; + margin-left: auto; + margin-right: auto; + max-width: 1060px; +} + +@media only screen and (min-width: 1440px) { + .CenterDivTableau { + max-width: 1200px; + } +} + +.youtube-video { + align-self: center; + position: relative; + padding-bottom: 56.25%; + height: 0; +} + +.youtube-video__iframe { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +// .ddp-list { +// margin: 20px; +// padding: 0; +// } + +// .ddp-list li { +// font-size: 1.1rem; +// font-weight: 300; +// margin: 35px 0 20px 0; +// color: mat-color($app-theme, 1700); +// padding: 0 0 0 25px; +// } + +// .ddp-list-inside { +// margin: 0; +// padding: 0; +// list-style-position: inside; +// } + +// .ddp-list-inside li { +// padding: 0; +// font-size: 1.2rem; +// font-weight: 400; +// } + +// .ddp-agreement-text { +// white-space: normal; +// margin: 0px; +// font-size: 1rem; +// font-weight: 300; +// color: mat-color($app-theme, 800); +// } + +// .ddp-question { +// margin: 35px 0 20px 0; +// font-weight: 300; +// font-size: 1.1rem; +// line-height: 1.6rem; +// color: mat-color($app-theme, 1700) !important; +// padding: 0; + +// .ddp-required-question-prompt { +// color: mat-color($app-theme, 800); +// font-size: 1.1rem; +// } + +// li { +// color: mat-color($app-theme, 800); +// } +// } + +// .ddp-question-neutral { +// color: mat-color($app-theme, 800) !important; +// } + +// .ddp-required-question-prompt { +// font-weight: 300; +// color: mat-color($app-theme, 1700) !important; +// } + +// .ddp-list { +// p { +// font-size: 1.1rem; +// color: mat-color($app-theme, 1700); +// } +// } + +// .ddp-dropdown { +// padding: 10px; +// margin: 0 0 5px 0; +// border: 1px solid mat-color($app-theme, 1800); +// border-radius: 2px; +// } + +// .ddp-block-body { +// margin: 20px 0 0 0; +// color: mat-color($app-theme, 800); + +// .PageContent-text { +// margin: 14px 0 0 0; +// color: mat-color($app-theme, 800); +// } +// } + +// .ddp-block-title-bold { +// color: mat-color($app-theme, 1000); +// font-weight: 400; +// font-size: 1.2rem; +// line-height: 1.8rem; +// margin: 2rem 0 1rem 0; +// } + +// .ddp-single-question { +// margin: 35px 20px 20px 45px; +// } + +.PageContent-contact { + list-style-type: disc; + margin: 10px 0 0 0; +} + +// .ddp-block-title-color { +// font-size: 1.2rem; +// line-height: 1.8rem; +// font-weight: 300; +// margin: 2rem 0 1rem 0; +// color: mat-color($app-theme, 800); +// } + +// .ddp-li-gray { +// color: mat-color($app-theme, 800) !important; +// } + +// .ddp-date-field-margin { +// margin: 0 15px 0 0; +// } + +// .ddp-content { +// width: 100%; +// } + +// .ddp-agreement { +// margin: 0 0 0 -25px; +// } + +// .ddp-group-block { +// margin: 0; +// } + +// .ddp-group-block-list { +// padding: 0 !important; +// } + +// .ddp-textarea-block { +// .mat-form-field-infix { +// border-top: 0 solid transparent !important; +// } +// } + +// .ddp-group-margin { +// margin: 20px; +// } + +// .ddp-textarea { +// height: 1.5rem !important; +// } + +// .ddp-composite-text { +// flex-grow: 1; +// margin-right: 30px; +// } + +// .ddp-close-button { +// margin-left: auto; +// cursor: pointer; +// color: mat-color($app-theme, 300); +// font-size: 1rem; +// font-weight: 900; +// } + +.ddp-user-menu-button { + outline: none; + font-size: 1rem; + font-weight: 300; + color: mat-color($app-theme, 1000); +} + +.ddp-user-menu-button:active, +.ddp-user-menu-button:focus, +.ddp-user-menu-button:hover { + color: mat-color($app-theme, 1000); +} + +.ddp-user { + color: mat-color($app-theme, 100); +} + +.ddp-user--scrolled { + color: mat-color($app-theme, 2200); +} + +// .ddp-institutions-form, +// .ddp-activity-question { +// display: inline-block; +// vertical-align: top; +// width: 100%; +// } + +// .ddp-hide-block { +// margin: 0 !important; +// padding: 0 !important; +// height: 0; +// } + +// .ddp-hide-subtitle { +// opacity: 0; +// transition: all 0.3s ease; +// } + +// .ddp-menu-text { +// padding: 0 16px !important; +// } + +// .ddp-dashboard { +// .dashboard-mobile-label { +// color: rgba(0, 0, 0, 0.54); +// } +// } + +// .dashboard-activity-button { +// font-size: 0.9rem; +// font-family: inherit; +// font-weight: 400; +// background: none; +// border: none; +// padding: 0; +// cursor: pointer; +// text-decoration: none; +// text-align: left; +// } + +// .ddp-picklist-option-list-item { +// height: auto !important; +// margin-bottom: 10px; +// } + +// .ddp-picklist-group-title { +// font-size: 1.25rem; +// font-weight: 500; +// } + +// .example-radio-group { +// display: flex; +// flex-direction: row; +// } + +// .ddp-login-button { +// @extend .mat-button; +// } + +// .ddp-activity-validation { +// margin: 5px; +// } + +// .subhead:after { +// content: ""; +// display: table; +// clear: both; +// } + +// /** +// Define the prompt to be displayed after a required question +// */ +// .ddp-required-question-prompt:after { +// content: ' *'; +// } + +// @media only screen and (max-width: 1100px) { +// .ddp-picklist-group-container { +// grid-template-columns: repeat(2, 50%) !important; +// } +// } + +// @media only screen and (max-width: 600px) { +// .ddp-picklist-group-container { +// grid-template-columns: repeat(1, 100%) !important; +// } +// } + +// .mat-snack-bar-container { +// box-shadow: 0 2px 2px rgba(0, 0, 0, .24), 0 0 2px rgba(0, 0, 0, .12); +// margin: 4px; +// background-color: mat-color($app-theme, 100); +// padding: 0px 0px 0px 0px !important; +// } + +// .mat-checkbox-label { +// color: mat-color($app-theme, 800); +// font-weight: 300; +// } + +// .mat-select-placeholder { +// color: mat-color($app-theme, 1700); +// } + +// .mat-radio-label { +// font-weight: 300; +// } + +// .mat-checkbox-layout { +// align-items: normal !important; +// } + +// .mat-input-flex { +// font-weight: 300; +// } + +// .mat-dialog-container { +// background-color: mat-color($app-theme, 1300); +// } + +// .mat-form-field-invalid .mat-form-field-label { +// color: mat-color($app-theme, 1200); +// } + +// .mat-error { +// color: mat-color($app-theme, 1200); +// } + +// .mat-form-field-invalid .mat-form-field-ripple { +// background-color: mat-color($app-theme, 1200); +// } + +// .mat-form-field-label-wrapper { +// font-weight: 300; +// font-size: 1rem; +// } + +// .mat-input-placeholder { +// font-weight: 300; +// font-size: 1rem; +// } + +// .mat-error { +// font-weight: 300; +// font-size: 0.75rem; +// } + +// .mat-checkbox-frame { +// border-color: mat-color($app-theme, 900); +// } + +// .mat-radio-outer-circle { +// border-color: mat-color($app-theme, 900); +// } + +// .mat-list-item-content { +// padding: 0px 4px !important; +// } + +// .mat-checkbox-layout .mat-checkbox-label { +// font-size: 1rem; +// } + +// .mat-radio-label-content { +// font-size: 1rem; +// } + +// .mat-form-field-infix { +// font-size: 1rem; +// } + +// .mat-list .mat-list-item .mat-list-item-content { +// display: block !important; +// } + +// .mat-input-element { +// height: 2.0rem !important; +// font-size: 1rem; +// } + +// input.mat-input-element { +// height: 1.2rem !important; +// font-size: 1rem; +// } + +// .mat-form-field .mat-form-field-subscript-wrapper { +// overflow: visible !important; +// } + +// .mat-input-element { +// line-height: 1.1rem; +// font-size: 1rem; +// } + +// .mat-radio-outer-circle, +// .mat-radio-inner-circle { +// height: 16px !important; +// width: 16px !important; +// } + +// .mat-radio-container { +// margin-top: 3px !important; +// height: 16px !important; +// width: 16px !important; +// } + +// .mat-radio-checked .mat-radio-inner-circle { +// transform: scale(.8) !important; +// } + +// .mat-menu-item { +// padding: 0 !important; +// } + +// @media only screen and (min-width: 768px) { + +// .mat-row:first-child, +// .mat-header-row:first-child { +// flex: 0 0 40% !important; +// } + +// .mat-row:last-child, +// .mat-header-row:last-child { +// flex: 0 0 15% !important; +// } +// } + +// .mat-checkbox-inner-container:hover .mat-checkbox-persistent-ripple { +// opacity: 0 !important; +// } + +// .mat-checkbox-inner-container { +// width: 20px !important; +// height: 20px !important; +// } + +// .mat-input-element { +// font-weight: 100 !important; +// } + +// .mat-select { +// font-weight: 100 !important; +// } + +// .ddp-helper { +// font-size: 0.8rem !important; +// color: mat-color($app-theme, 800) !important; +// } + +// .ddp-counter-color { +// color: mat-color($app-theme, 600) !important; +// } + +// .ddp-answer-container { +// display: flex; +// flex-direction: row; +// } + +// .mat-option-text { +// line-height: 16px !important; +// white-space: normal !important; +// } + +// @media only screen and (max-width: 480px) { +// .mat-option-text { +// font-size: 14px !important; +// } + +// .mat-form-field-placeholder { +// font-size: 12px !important; +// white-space: normal !important; +// } +// } + +.mat-drawer-content { + overflow: hidden !important; +} \ No newline at end of file diff --git a/ddp-workspace/projects/ddp-esc/src/test.ts b/ddp-workspace/projects/ddp-esc/src/test.ts new file mode 100644 index 0000000000..16317897b1 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/ddp-workspace/projects/ddp-esc/src/theme.scss b/ddp-workspace/projects/ddp-esc/src/theme.scss new file mode 100644 index 0000000000..82769dd08d --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/src/theme.scss @@ -0,0 +1,122 @@ +@import '~@angular/material/theming'; +@include mat-core(); + +$md-primary: ( + 50 : #eef2f9, + 100 : #dbe4f2, + 200 : #c8d6eb, + 300 : #b5c8e5, + 400 : #a3bade, + 500 : #90ACD7, + 600 : #7d9ed0, + 700 : #6b90c9, + 800 : #5882c3, + 900 : #4574bc, + A100 : #ffffff, + A200 : #ffffff, + A400 : #ffffff, + A700 : #3d68aa, + contrast: ( + 50 : #000000, + 100 : #000000, + 200 : #000000, + 300 : #000000, + 400 : #000000, + 500 : #000000, + 600 : #000000, + 700 : #000000, + 800 : #000000, + 900 : #000000, + A100 : #000000, + A200 : #000000, + A400 : #000000, + A700 : #000000, + ) +); + +$md-secondary: ( + 50 : #f5f8fc, + 100 : #e6eef9, + 200 : #d6e2f5, + 300 : #c5d6f0, + 400 : #b8ceed, + 500 : #acc5ea, + 600 : #a5bfe7, + 700 : #9bb8e4, + 800 : #92b0e1, + 900 : #82a3db, + A100 : #ffffff, + A200 : #ffffff, + A400 : #ffffff, + A700 : #e5efff, + contrast: ( + 50 : #000000, + 100 : #000000, + 200 : #000000, + 300 : #000000, + 400 : #000000, + 500 : #000000, + 600 : #000000, + 700 : #000000, + 800 : #000000, + 900 : #000000, + A100 : #000000, + A200 : #000000, + A400 : #000000, + A700 : #000000, + ) +); + +$md-warn: ( + 50 : #f9e0e0, + 100 : #f0b3b3, + 200 : #e68080, + 300 : #db4d4d, + 400 : #d42626, + 500 : #cc0000, + 600 : #c70000, + 700 : #c00000, + 800 : #b90000, + 900 : #ad0000, + A100 : #ffd7d7, + A200 : #ffa4a4, + A400 : #ff7171, + A700 : #ff5858, + contrast: ( + 50 : #000000, + 100 : #000000, + 200 : #000000, + 300 : #ffffff, + 400 : #ffffff, + 500 : #ffffff, + 600 : #ffffff, + 700 : #ffffff, + 800 : #ffffff, + 900 : #ffffff, + A100 : #000000, + A200 : #000000, + A400 : #000000, + A700 : #000000, + ) +); + + +$test-app-primary: mat-palette($md-primary, 500, 500, 500); +$test-app-accent: mat-palette($md-secondary, 900, 700, A500); +$test-app-warn: mat-palette($md-warn, 900, A400, A500); + +$test-app-theme: mat-light-theme($test-app-primary, $test-app-accent, $test-app-warn); + +@include angular-material-theme($test-app-theme); + + +.validation-div { + color: mat-color($test-app-warn); +} + + +.ddp-activity-validation { + @extend .ddp-activity-validation; + width: 100%; + margin: 0; +} \ No newline at end of file diff --git a/ddp-workspace/projects/ddp-esc/tsconfig.app.json b/ddp-workspace/projects/ddp-esc/tsconfig.app.json new file mode 100644 index 0000000000..e023f0a48a --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/tsconfig.app.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "../../out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ], + "angularCompilerOptions": { + "preserveWhitespaces": true + } +} diff --git a/ddp-workspace/projects/ddp-esc/tsconfig.es5.json b/ddp-workspace/projects/ddp-esc/tsconfig.es5.json new file mode 100644 index 0000000000..0b1a8c3705 --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/tsconfig.es5.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.app.json", + "compilerOptions": { + "target": "es5" + }, + "include": [ + "projects/ddp-esc/src/**/*.d.ts" + ] +} diff --git a/ddp-workspace/projects/ddp-esc/tsconfig.spec.json b/ddp-workspace/projects/ddp-esc/tsconfig.spec.json new file mode 100644 index 0000000000..ed5461c09c --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "../../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/ddp-workspace/projects/ddp-esc/tslint.json b/ddp-workspace/projects/ddp-esc/tslint.json new file mode 100644 index 0000000000..19e8161a0b --- /dev/null +++ b/ddp-workspace/projects/ddp-esc/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ] + } +} diff --git a/ddp-workspace/tsconfig.json b/ddp-workspace/tsconfig.json index a4bcf20e74..97b4d85fa9 100644 --- a/ddp-workspace/tsconfig.json +++ b/ddp-workspace/tsconfig.json @@ -89,6 +89,12 @@ }, { "path": "./projects/ddp-testboston/tsconfig.spec.json" + }, + { + "path": "./projects/ddp-esc/tsconfig.app.json" + }, + { + "path": "./projects/ddp-esc/tsconfig.spec.json" } ] }