diff --git a/.gitignore b/.gitignore index d150e2eb8..79682d0c1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,20 @@ dmp-frontend/dist.7z +.idea/ +*.iml +dmp-backend/src/main/ui-resources/static/vendor.bundle.js.map +dmp-backend/src/main/ui-resources/static/vendor.bundle.js +dmp-backend/src/main/ui-resources/static/unauthorized.module.chunk.js.map +dmp-backend/src/main/ui-resources/static/unauthorized.module.chunk.js +dmp-backend/src/main/ui-resources/static/styles.bundle.js.map +dmp-backend/src/main/ui-resources/static/styles.bundle.js +dmp-backend/src/main/ui-resources/static/polyfills.bundle.js.map +dmp-backend/src/main/ui-resources/static/polyfills.bundle.js +dmp-backend/src/main/ui-resources/static/main.bundle.js.map +dmp-backend/src/main/ui-resources/static/main.bundle.js +dmp-backend/src/main/ui-resources/static/lang/en.json +dmp-backend/src/main/ui-resources/static/inline.bundle.js.map +dmp-backend/src/main/ui-resources/static/inline.bundle.js +dmp-backend/src/main/ui-resources/static/index.html +dmp-backend/src/main/ui-resources/static/favicon.ico +dmp-backend/src/main/ui-resources/static/assets/lang/en.json +dmp-frontend/new 3.xml diff --git a/dmp-admin/package-lock.json b/dmp-admin/package-lock.json index ca43201dd..976e4eca1 100644 --- a/dmp-admin/package-lock.json +++ b/dmp-admin/package-lock.json @@ -1241,6 +1241,7 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", + "fsevents": "1.1.3", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -2964,6 +2965,910 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.7.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", diff --git a/dmp-admin/src/app/app.component.css b/dmp-admin/src/app/app.component.css index 8e856d79c..75fcc7987 100644 --- a/dmp-admin/src/app/app.component.css +++ b/dmp-admin/src/app/app.component.css @@ -17,4 +17,12 @@ .cursor{ cursor: pointer; +} + +.hide{ + display:none; +} + +.show { + display:block; } \ No newline at end of file diff --git a/dmp-admin/src/app/app.component.html b/dmp-admin/src/app/app.component.html index 503b172b9..8033861af 100644 --- a/dmp-admin/src/app/app.component.html +++ b/dmp-admin/src/app/app.component.html @@ -39,7 +39,8 @@ - + + diff --git a/dmp-admin/src/app/app.module.ts b/dmp-admin/src/app/app.module.ts index 035f88606..6f798be24 100644 --- a/dmp-admin/src/app/app.module.ts +++ b/dmp-admin/src/app/app.module.ts @@ -1,9 +1,19 @@ +import { CheckBoxComponent } from './components/checkbox/checkbox-component'; +import { FreeTextData } from './models/DataField/FreeTextData'; +import { BooleanDecisionComponent } from './components/booleanDecision/booleanDecision-component'; +import { FreeTextComponent } from './components/freetext/freetext-component'; +import { TextAreaComponent } from './components/textarea/textarea-component'; +import { RadioBoxComponent } from './components/radiobox/radiobox-component'; +import { WordlistComponent } from './components/wordlist/wordlist-component'; +import { AutocompleteComponent } from './components/autocomplete/autocomplete-component'; +import { ComboboxComponent } from './components/combobox/combobox-component'; + + import { BrowserModule } from '@angular/platform-browser'; import { RouterModule, Routes } from '@angular/router'; import { NgModule } from '@angular/core'; -//import { HttpModule, Http, Response, RequestOptions, RequestMethod, Headers, URLSearchParams } from '@angular/http'; import { HttpClientModule, HttpClient, HTTP_INTERCEPTORS } from '@angular/common/http'; -import { HttpModule} from '@angular/http'; +import { HttpModule } from '@angular/http'; import { DataTableModule } from "angular2-datatable"; import { NgbModule } from '@ng-bootstrap/ng-bootstrap'; import { DialogService } from "ng2-bootstrap-modal"; @@ -27,7 +37,7 @@ import { DatarepoService } from './services/datarepo-service'; import { GlobalInterceptor } from './services/interceptor'; import { Toolbox } from './services/toolbox'; -import { DataFilterPipe } from './pipes/data-filter.pipe'; +import { DataFilterPipe } from './pipes/data-filter.pipe'; import { DatasetProfileTableFilterPipe } from './pipes/datasetprofile-table-filter.pipe'; import { DmpTableFilterPipe } from './pipes/dmp-table-filter.pipe'; import { ServiceTableFilterPipe } from './pipes/service-table-filter.pipe'; @@ -61,6 +71,15 @@ import { DatareposEditorComponent } from './managers/datarepos-editor/datarepos- import { DatasetprofileEditorComponent } from './managers/datasetprofile-editor/datasetprofile-editor.component'; import { DatasetProfileGUIEditorComponent } from './dataset-profile-gui-editor/dataset-profile-gui-editor.component'; +import { FieldFormComponent } from './dataset-profile-form/field-form/field-form.component'; +import { FormComponent } from './dataset-profile-form/form/form.component'; +import { GroupFieldFormComponent } from './dataset-profile-form/groupfield-form/groupfield-form.component'; +import { RuleFormComponent } from './dataset-profile-form/rule-component/rule.component'; +import { SectionFormComponent } from './dataset-profile-form/section-form/section-form.component'; +import { PageFormComponent } from './dataset-profile-form/page-form/page-component'; +import { CompositeFieldFormComponent } from './dataset-profile-form/compositefield-form/compositefield-form.component'; + + @NgModule({ @@ -75,9 +94,20 @@ import { DatasetProfileGUIEditorComponent } from './dataset-profile-gui-editor/d ServiceTableFilterPipe, ResearcherTableFilterPipe, DatarepoTableFilterPipe, - + AppComponent, GooggleSignInComponent, + FieldFormComponent, + FormComponent, + GroupFieldFormComponent, + RuleFormComponent, + SectionFormComponent, + PageFormComponent, + CompositeFieldFormComponent, + ComboboxComponent, + AutocompleteComponent, + WordlistComponent, + RadioBoxComponent, DatasetsViewerComponent, ProfileEditorComponent, PropertiesEditorComponent, @@ -94,7 +124,11 @@ import { DatasetProfileGUIEditorComponent } from './dataset-profile-gui-editor/d ResearcherEditorComponent, DatareposEditorComponent, DatasetprofileEditorComponent, - DatasetProfileGUIEditorComponent + DatasetProfileGUIEditorComponent, + TextAreaComponent, + CheckBoxComponent, + BooleanDecisionComponent, + FreeTextComponent ], imports: [ BrowserModule, @@ -109,13 +143,13 @@ import { DatasetProfileGUIEditorComponent } from './dataset-profile-gui-editor/d AppRouting ], providers: [{ - provide: HTTP_INTERCEPTORS, - useClass: GlobalInterceptor, - multi: true, - }, - DatasetsServiceService, TokenService, DmpsServiceService, ResearcherService, - DialogService, DatasetProfileService, ProjectService, OrganisationService, DatarepoService, - DmpProfileService, RegistryService, ServiceService, NativeLoginService, HttpModule, Toolbox, HttpClient, RestBase], + provide: HTTP_INTERCEPTORS, + useClass: GlobalInterceptor, + multi: true, + }, + DatasetsServiceService, TokenService, DmpsServiceService, ResearcherService, + DialogService, DatasetProfileService, ProjectService, OrganisationService, DatarepoService, + DmpProfileService, RegistryService, ServiceService, NativeLoginService, HttpModule, Toolbox, HttpClient, RestBase], bootstrap: [AppComponent] }) export class AppModule { } diff --git a/dmp-admin/src/app/bootstrap/profile-editor/profile-editor.component.ts b/dmp-admin/src/app/bootstrap/profile-editor/profile-editor.component.ts index 2e510c887..ef479a242 100644 --- a/dmp-admin/src/app/bootstrap/profile-editor/profile-editor.component.ts +++ b/dmp-admin/src/app/bootstrap/profile-editor/profile-editor.component.ts @@ -12,7 +12,7 @@ declare function simple_notifier(type: string, title: string, message:string): a }) export class ProfileEditorComponent implements OnInit { - @Input('profileID') profileID: string = null; + public profileID: string = null; profile : any = new Array(); diff --git a/dmp-admin/src/app/common/validationTypes.ts b/dmp-admin/src/app/common/validationTypes.ts new file mode 100644 index 000000000..7dbeabd02 --- /dev/null +++ b/dmp-admin/src/app/common/validationTypes.ts @@ -0,0 +1,4 @@ +export enum ValidationTypes { + None = 0, + Required = 1 +} \ No newline at end of file diff --git a/dmp-admin/src/app/components/autocomplete/autocomplete-component.html b/dmp-admin/src/app/components/autocomplete/autocomplete-component.html new file mode 100644 index 000000000..aa75c0aff --- /dev/null +++ b/dmp-admin/src/app/components/autocomplete/autocomplete-component.html @@ -0,0 +1,13 @@ +
+
+
+ + +
+
+ + +
+
+ +
\ No newline at end of file diff --git a/dmp-admin/src/app/components/autocomplete/autocomplete-component.ts b/dmp-admin/src/app/components/autocomplete/autocomplete-component.ts new file mode 100644 index 000000000..28fbcb69e --- /dev/null +++ b/dmp-admin/src/app/components/autocomplete/autocomplete-component.ts @@ -0,0 +1,23 @@ +import { AutocompleteData } from '../../models/DataField/AutocompleteData'; +import { Field } from '../../models/DataSetProfile/Field'; +import { FormGroup } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { FormArray } from '@angular/forms/src/model'; + +@Component({ + selector: 'autocomplete-component', + templateUrl: './autocomplete-component.html' +}) +export class AutocompleteComponent implements OnInit{ + @Input() dataModel: Field; + @Input() form: FormGroup; + private data:AutocompleteData = new AutocompleteData(); + + ngOnInit(){ + this.data.type= "autocomplete"; + let autocomplete: AutocompleteData = new AutocompleteData(); + //this.dataModel.data = new JsonSerializer().fromJSONObject(this.data,AutocompleteData); + //(this.form.get("data")).push(autocomplete.buildForm()); + this.form.addControl("data", this.data.buildForm()); + } +} \ No newline at end of file diff --git a/dmp-admin/src/app/components/booleanDecision/booleanDecision-component.html b/dmp-admin/src/app/components/booleanDecision/booleanDecision-component.html new file mode 100644 index 000000000..2411edac1 --- /dev/null +++ b/dmp-admin/src/app/components/booleanDecision/booleanDecision-component.html @@ -0,0 +1,9 @@ +
+
+
+ + +
+
+ +
\ No newline at end of file diff --git a/dmp-admin/src/app/components/booleanDecision/booleanDecision-component.ts b/dmp-admin/src/app/components/booleanDecision/booleanDecision-component.ts new file mode 100644 index 000000000..c5f844075 --- /dev/null +++ b/dmp-admin/src/app/components/booleanDecision/booleanDecision-component.ts @@ -0,0 +1,19 @@ +import { Field } from '../../models/DataSetProfile/Field'; +import { BooleanDecisionData } from '../../models/DataField/BooleanDecisionData'; +import { FormGroup } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { FormArray } from '@angular/forms/src/model'; + +@Component({ + selector: 'booleanDecision-component', + templateUrl: './booleanDecision-component.html' +}) +export class BooleanDecisionComponent implements OnInit{ + @Input() dataModel: Field; + @Input() form: FormGroup; + private data:BooleanDecisionData = new BooleanDecisionData(); + + ngOnInit(){ + this.form.addControl("data", this.data.buildForm()); + } +} \ No newline at end of file diff --git a/dmp-admin/src/app/components/checkbox/checkbox-component.html b/dmp-admin/src/app/components/checkbox/checkbox-component.html new file mode 100644 index 000000000..2411edac1 --- /dev/null +++ b/dmp-admin/src/app/components/checkbox/checkbox-component.html @@ -0,0 +1,9 @@ +
+
+
+ + +
+
+ +
\ No newline at end of file diff --git a/dmp-admin/src/app/components/checkbox/checkbox-component.ts b/dmp-admin/src/app/components/checkbox/checkbox-component.ts new file mode 100644 index 000000000..d8553c086 --- /dev/null +++ b/dmp-admin/src/app/components/checkbox/checkbox-component.ts @@ -0,0 +1,20 @@ +import { Field } from '../../models/DataSetProfile/Field'; +import { CheckBoxData } from '../../models/DataField/CheckBoxData'; +import { BooleanDecisionData } from '../../models/DataField/BooleanDecisionData'; +import { FormGroup } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { FormArray } from '@angular/forms/src/model'; + +@Component({ + selector: 'checkbox-component', + templateUrl: './checkbox-component.html' +}) +export class CheckBoxComponent implements OnInit{ + @Input() dataModel: Field; + @Input() form: FormGroup; + private data:CheckBoxData = new CheckBoxData(); + + ngOnInit(){ + this.form.addControl("data", this.data.buildForm()); + } +} \ No newline at end of file diff --git a/dmp-admin/src/app/components/combobox/combobox-component.html b/dmp-admin/src/app/components/combobox/combobox-component.html new file mode 100644 index 000000000..a3eb851a1 --- /dev/null +++ b/dmp-admin/src/app/components/combobox/combobox-component.html @@ -0,0 +1,16 @@ +
+ + +
+
+ +
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/dmp-admin/src/app/components/combobox/combobox-component.ts b/dmp-admin/src/app/components/combobox/combobox-component.ts new file mode 100644 index 000000000..661018b15 --- /dev/null +++ b/dmp-admin/src/app/components/combobox/combobox-component.ts @@ -0,0 +1,25 @@ +import { Field } from '../../models/DataSetProfile/Field'; +import { FormGroup } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; + +@Component({ + selector: 'combobox-component', + templateUrl: './combobox-component.html' +}) +export class ComboboxComponent implements OnInit{ + @Input() dataModel: Field; + @Input() form: FormGroup; + type: string; + options = [{id:"autocomplete", value: "autocomplete"}, {id:"wordlist", value: "wordlist"}]; + + ngOnInit(){ + if (this.dataModel.data){ + this.type = this.form.get("data").get("type").value; + } + + } + + onchangeCombo(){ + if (this.form.get("data")) this.form.removeControl("data"); + } +} \ No newline at end of file diff --git a/dmp-admin/src/app/components/freetext/freetext-component.html b/dmp-admin/src/app/components/freetext/freetext-component.html new file mode 100644 index 000000000..2411edac1 --- /dev/null +++ b/dmp-admin/src/app/components/freetext/freetext-component.html @@ -0,0 +1,9 @@ +
+
+
+ + +
+
+ +
\ No newline at end of file diff --git a/dmp-admin/src/app/components/freetext/freetext-component.ts b/dmp-admin/src/app/components/freetext/freetext-component.ts new file mode 100644 index 000000000..0e1077469 --- /dev/null +++ b/dmp-admin/src/app/components/freetext/freetext-component.ts @@ -0,0 +1,21 @@ +import { Field } from '../../models/DataSetProfile/Field'; +import { FreeTextData } from '../../models/DataField/FreeTextData'; +import { CheckBoxData } from '../../models/DataField/CheckBoxData'; +import { BooleanDecisionData } from '../../models/DataField/BooleanDecisionData'; +import { FormGroup } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { FormArray } from '@angular/forms/src/model'; + +@Component({ + selector: 'freetext-component', + templateUrl: './freetext-component.html' +}) +export class FreeTextComponent implements OnInit{ + @Input() dataModel: Field; + @Input() form: FormGroup; + private data:FreeTextData = new FreeTextData(); + + ngOnInit(){ + this.form.addControl("data", this.data.buildForm()); + } +} \ No newline at end of file diff --git a/dmp-admin/src/app/components/radiobox/radiobox-component.html b/dmp-admin/src/app/components/radiobox/radiobox-component.html new file mode 100644 index 000000000..7e309f987 --- /dev/null +++ b/dmp-admin/src/app/components/radiobox/radiobox-component.html @@ -0,0 +1,28 @@ +
+
+ + +
+
+
+
+
+
+ + +
+
+ + +
+
+
+
+
+
+ + Add + + +
+ +
\ No newline at end of file diff --git a/dmp-admin/src/app/components/radiobox/radiobox-component.ts b/dmp-admin/src/app/components/radiobox/radiobox-component.ts new file mode 100644 index 000000000..e7064d84c --- /dev/null +++ b/dmp-admin/src/app/components/radiobox/radiobox-component.ts @@ -0,0 +1,32 @@ +import { FormGroup } from '@angular/forms'; +import { Field } from '../../models/DataSetProfile/Field'; +import { Component, Input, OnInit } from '@angular/core'; +import { RadioBoxData } from '../../models/DataField/RadioBoxData'; +import { FormArray } from '@angular/forms/src/model'; +import { ListingItem } from '../../models/Commons/ListingItem'; +import { JsonSerializer } from '../../utilities/JsonSerializer'; + +@Component({ + selector: 'radiobox-component', + templateUrl: './radiobox-component.html' +}) +export class RadioBoxComponent implements OnInit{ + @Input() dataModel: Field; + @Input() form: FormGroup; + private data: RadioBoxData = new RadioBoxData(); + private options = new Array(); + + ngOnInit(){ + if (this.form.get("data")) this.form.removeControl("data"); + this.form.addControl("data", this.data.buildForm()); + this.addNewRow(); + } + + addNewRow(){ + let radioListOptions:ListingItem = new ListingItem(); + (this.form.get("data").get("options")).push(radioListOptions.buildForm()); + this.data.options = []; + this.data.options.push(radioListOptions); + this.dataModel.data = new JsonSerializer().fromJSONObject(this.data,RadioBoxData); + } +} \ No newline at end of file diff --git a/dmp-admin/src/app/components/textarea/textarea-component.html b/dmp-admin/src/app/components/textarea/textarea-component.html new file mode 100644 index 000000000..2411edac1 --- /dev/null +++ b/dmp-admin/src/app/components/textarea/textarea-component.html @@ -0,0 +1,9 @@ +
+
+
+ + +
+
+ +
\ No newline at end of file diff --git a/dmp-admin/src/app/components/textarea/textarea-component.ts b/dmp-admin/src/app/components/textarea/textarea-component.ts new file mode 100644 index 000000000..2a04a5566 --- /dev/null +++ b/dmp-admin/src/app/components/textarea/textarea-component.ts @@ -0,0 +1,22 @@ +import { Field } from '../../models/DataSetProfile/Field'; +import { TextArea } from '../../models/DataField/TextArea'; +import { FreeTextData } from '../../models/DataField/FreeTextData'; +import { CheckBoxData } from '../../models/DataField/CheckBoxData'; +import { BooleanDecisionData } from '../../models/DataField/BooleanDecisionData'; +import { FormGroup } from '@angular/forms'; +import { Component, Input, OnInit } from '@angular/core'; +import { FormArray } from '@angular/forms/src/model'; + +@Component({ + selector: 'textarea-component', + templateUrl: './textarea-component.html' +}) +export class TextAreaComponent implements OnInit{ + @Input() dataModel: Field; + @Input() form: FormGroup; + private data:TextArea = new TextArea(); + + ngOnInit(){ + this.form.addControl("data", this.data.buildForm()); + } +} \ No newline at end of file diff --git a/dmp-admin/src/app/components/wordlist/wordlist-component.html b/dmp-admin/src/app/components/wordlist/wordlist-component.html new file mode 100644 index 000000000..73da25ad7 --- /dev/null +++ b/dmp-admin/src/app/components/wordlist/wordlist-component.html @@ -0,0 +1,28 @@ +
+
+
+ + +
+
+
+
+
+ + +
+
+ + +
+
+
+
+
+ + +
\ No newline at end of file diff --git a/dmp-admin/src/app/components/wordlist/wordlist-component.ts b/dmp-admin/src/app/components/wordlist/wordlist-component.ts new file mode 100644 index 000000000..00c33f8b9 --- /dev/null +++ b/dmp-admin/src/app/components/wordlist/wordlist-component.ts @@ -0,0 +1,34 @@ +import { FormGroup } from '@angular/forms'; +import { Field } from '../../models/DataSetProfile/Field'; +import { Component, Input, OnInit } from '@angular/core'; +import { WordListData } from '../../models/DataField/WordListData'; +import { FormArray } from '@angular/forms/src/model'; +import { ListingItem } from '../../models/Commons/ListingItem'; +import { JsonSerializer } from '../../utilities/JsonSerializer'; + +@Component({ + selector: 'wordlist-component', + templateUrl: './wordlist-component.html' +}) +export class WordlistComponent implements OnInit{ + @Input() dataModel: Field; + @Input() form: FormGroup; + private data: WordListData = new WordListData(); + private options = new Array(); + + ngOnInit(){ + this.data.type = "wordlist"; + // if (this.form.get("data")) this.form.removeControl("data"); + this.form.addControl("data", this.data.buildForm()); + if(!this.dataModel.data) + this.addNewRow(); + } + + addNewRow(){ + let wordListOptions:ListingItem = new ListingItem(); + (this.form.get("data").get("options")).push(wordListOptions.buildForm()); + this.data.options = []; + this.data.options.push(wordListOptions); + this.dataModel.data = new JsonSerializer().fromJSONObject(this.data,WordListData); + } +} \ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.html b/dmp-admin/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.html new file mode 100644 index 000000000..7424f1e1c --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.html @@ -0,0 +1,83 @@ +
+ + +
+ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
Multiplicity
+
+ + +
+ +
+ + +
+
+
+
+ + +
+
+ + +
+
+ +
+
+ + + + + + + +
\ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.ts b/dmp-admin/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.ts new file mode 100644 index 000000000..0ee11f88a --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/compositefield-form/compositefield-form.component.ts @@ -0,0 +1,57 @@ +import { Component, Input } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { FieldSet } from 'app/models/DataSetProfile/FieldSet'; +import { Field } from 'app/models/DataSetProfile/Field'; +import { FormArray, FormControl } from '@angular/forms/src/model'; + +@Component({ + selector: 'compositefield-form', + templateUrl: './compositefield-form.component.html', + styleUrls: [] +}) + +export class CompositeFieldFormComponent { + @Input() form: FormGroup; + @Input() dataModel: FieldSet; + @Input() indexPath: string; + + isComposite: boolean = false; + isMultiplicityEnabled: boolean = false; + + constructon() { } + + ngOnInit() { + //this.addNewField(); + if(this.form.get("multiplicity")) + if (this.form.get("multiplicity").value.min >1 || this.form.get("multiplicity").value.max >1 ) + this.isMultiplicityEnabled= true; + this.isComposite = this.dataModel.fields.length > 1; + } + + onIsCompositeChange(isComposite: boolean) { + if (!isComposite && (this.form.get("fields")).length > 1) { + for(let i = 0; i < (this.form.get("fields")).length - 1; i++) { + (this.form.get("fields")).removeAt(1); + } + this.dataModel.fields.splice(1); + } + } + + onIsMultiplicityEnabledChange(isMultiplicityEnabled: boolean) { + if (!isMultiplicityEnabled) { + (this.form.get('multiplicity').get("min")).setValue(0); + (this.form.get('multiplicity').get("max")).setValue(0); + } + } + + addNewField() { + let field: Field = new Field(); + this.dataModel.fields.push(field); + (this.form.get("fields")).push(field.buildForm()); + } + + DeleteField(index) { + this.dataModel.fields.splice(index, 1); + (this.form.get("fields")).removeAt(index); + } +} \ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/field-form/field-form.component.html b/dmp-admin/src/app/dataset-profile-form/field-form/field-form.component.html new file mode 100644 index 000000000..8de843522 --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/field-form/field-form.component.html @@ -0,0 +1,120 @@ +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
Multiplicity
+
+ + +
+ +
+ + +
+
+
+
+ + +
+
+
+ + +
+
+
+ +
+
+ +
+
+ +
+
+
+ + +
+
+
+ {{i + 1}}. Rule {{i + 1}} + +
+ +
+
+
+
+ +
+
+
+
+ + +
\ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/field-form/field-form.component.ts b/dmp-admin/src/app/dataset-profile-form/field-form/field-form.component.ts new file mode 100644 index 000000000..41c89f1dd --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/field-form/field-form.component.ts @@ -0,0 +1,53 @@ +import { Field } from '../../models/DataSetProfile/Field'; +import { Rule } from '../../models/DataSetProfile/Rule'; +import { Component, Input } from '@angular/core'; +import { FormGroup, FormControl, FormArray } from '@angular/forms'; +import { ValidationTypes } from 'app/common/validationTypes'; + +@Component({ + selector: 'field-form', + templateUrl: './field-form.component.html', + styleUrls: [] +}) + +export class FieldFormComponent { + @Input() form: FormGroup; + @Input() dataModel: Field; + @Input() showMultiplicity: boolean = true; + @Input() indexPath: string; + validationsOptions: Array; + isFieldMultiplicityEnabled: boolean = false; + + constructon() { + } + + ngOnInit() { + if (this.form.get("multiplicity")) + if (this.form.get("multiplicity").value.min > 1 || this.form.get("multiplicity").value.max > 1) + this.isFieldMultiplicityEnabled = true; + this.validationsOptions = [{ key: 0, value: ValidationTypes[0] }, { key: 1, value: ValidationTypes[1] }] + // this.addNewRule(); + } + + onIsFieldMultiplicityEnabledChange(isFieldMultiplicityEnabled: boolean) { + if (!isFieldMultiplicityEnabled) { + (this.form.get('multiplicity').get("min")).setValue(0); + (this.form.get('multiplicity').get("max")).setValue(0); + } + } + + addNewRule() { + let rule: Rule = new Rule(); + this.dataModel.visible.rules.push(rule); + (this.form.get("visible").get("rules")).push(rule.buildForm()); + } + + DeleteRule(index) { + this.dataModel.visible.rules.splice(index, 1); + (this.form.get("visible").get("rules")).removeAt(index); + } + + onchangeCombo() { + debugger; + } +} \ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/form/form.component.html b/dmp-admin/src/app/dataset-profile-form/form/form.component.html new file mode 100644 index 000000000..388ca31ce --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/form/form.component.html @@ -0,0 +1,73 @@ +
+
+
+
+
+ + +
+
+ Label is required. +
+
+
+
+ + + + + + + + + + +
+
+
\ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/form/form.component.ts b/dmp-admin/src/app/dataset-profile-form/form/form.component.ts new file mode 100644 index 000000000..b16ca40e2 --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/form/form.component.ts @@ -0,0 +1,94 @@ +import { Section } from '../../models/DataSetProfile/Section'; +import { JsonSerializer } from '../../utilities/JsonSerializer'; +import { DatasetProfileService } from '../../services/dataset-profile.service'; +import { RestBase } from '../../services/rest-base'; +import { DatasetProfileModel } from '../../models/DataSetProfile/DatasetProfileModel'; +import { Page } from '../../models/DataSetProfile/Page'; +import { Component, OnInit } from '@angular/core'; +import { FormGroup, FormControl } from '@angular/forms'; +import { SectionFormComponent } from '../section-form/section-form.component'; +import { FormArray } from '@angular/forms/src/model'; +import { Router, ActivatedRoute, ParamMap, Params } from '@angular/router'; +import { PageFormComponent } from '../page-form/page-component' + +@Component({ + selector: 'form-comp', + templateUrl: './form.component.html', + styleUrls: [] +}) + +export class FormComponent { + + dataModel: DatasetProfileModel; + form: FormGroup; + private profileID: string; + + constructor(public restBase: RestBase, private datasetProfileService: DatasetProfileService, private route: ActivatedRoute) { + this.profileID = route.snapshot.params['id']; + + } + + ngOnInit() { + + this.dataModel = new JsonSerializer().fromJSONObject(new DatasetProfileModel(), DatasetProfileModel); + this.form = this.dataModel.buildForm(); + if (this.profileID) { + this.datasetProfileService.getDatasetProfileById(this.profileID).subscribe((data) => { + + this.dataModel = new JsonSerializer().fromJSONObject(data, DatasetProfileModel); + this.form = this.dataModel.buildForm(); + }); + } + else{ + + this.addSection(); + this.addPage(0); + } + + // this.dataModel = new JsonSerializer().fromJSONObject(TestModel, DatasetProfileModel); + // this.form = this.dataModel.buildForm(); + } + + onIsMultiplicityEnabledChange(isMultiplicityEnabled: boolean) { + if (!isMultiplicityEnabled) { + (this.form.get('multiplicity').get("min")).setValue(0); + (this.form.get('multiplicity').get("max")).setValue(0); + } + } + + addSection() { + let section: Section = new Section(); + this.dataModel.sections.push(section); + (this.form.get("sections")).push(section.buildForm()); + } + + addPage(number) { + let page: Page = new Page(this.dataModel.pages.length); + this.dataModel.pages.push(page); + (this.form.get("pages")).push(page.buildForm()); + } + + DeleteSection(index) { + this.dataModel.sections.splice(index,1); + (this.form.get("sections")).removeAt(index) + } + + DeletePage(index) { + this.dataModel.pages.splice(index, 1); + (this.form.get("pages")).removeAt(index) + } + + createForm(data) { + return this.restBase.post("/admin/addDmp", data); + } + updateForm(id,data) { + return this.restBase.post("/admin/addDmp/"+id, data); + } + onSubmit() { + let data = this.form.value; + + if(this.profileID) this.updateForm(this.profileID, data).subscribe(); + else this.createForm(data).subscribe(); + } + +} \ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/groupfield-form/groupfield-form.component.html b/dmp-admin/src/app/dataset-profile-form/groupfield-form/groupfield-form.component.html new file mode 100644 index 000000000..3c63d1cd3 --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/groupfield-form/groupfield-form.component.html @@ -0,0 +1,66 @@ +
+ + +
+
+
+ + {{i + 1}}. Field {{i + 1}} + +
+ +
+
+
+
+ +
+
+
+
+ +
\ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/groupfield-form/groupfield-form.component.ts b/dmp-admin/src/app/dataset-profile-form/groupfield-form/groupfield-form.component.ts new file mode 100644 index 000000000..266de2f0e --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/groupfield-form/groupfield-form.component.ts @@ -0,0 +1,43 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { FieldGroup } from 'app/models/DataSetProfile/FieldGroup'; +import { FieldSet } from 'app/models/DataSetProfile/FieldSet'; +import { FormArray } from '@angular/forms/src/model'; +import { Field } from 'app/models/DataSetProfile/Field'; + +@Component({ + selector: 'groupfield-form', + templateUrl: './groupfield-form.component.html', + styleUrls: [] +}) + +export class GroupFieldFormComponent { + @Input() form: FormGroup; + @Input() dataModel: FieldGroup; + @Input() indexPath: string; + + constructor(){} + + ngOnInit(){ + //this.addNewField(); + } + + addNewFieldSet(){ + let compositeField: FieldSet = new FieldSet(); + + let field: Field = new Field(); //create field at the same time + compositeField.fields.push(field); + //(this.form.get("compositeFields").get("fields")).push(field.buildForm()); + + + this.dataModel.compositeFields.push(compositeField); + (this.form.get("compositeFields")).push(compositeField.buildForm()); + + } + + DeleteFieldSet(index){ + this.dataModel.compositeFields.splice(index, 1); + (this.form.get("compositeFields")).removeAt(index); + } + +} \ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/page-form/page-component.html b/dmp-admin/src/app/dataset-profile-form/page-form/page-component.html new file mode 100644 index 000000000..3ad68805d --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/page-form/page-component.html @@ -0,0 +1,8 @@ +
+
+
+ + +
+
+
\ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/page-form/page-component.ts b/dmp-admin/src/app/dataset-profile-form/page-form/page-component.ts new file mode 100644 index 000000000..5924b408a --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/page-form/page-component.ts @@ -0,0 +1,18 @@ +import { Component, Input, Output, EventEmitter } from '@angular/core'; +import { FormGroup } from '@angular/forms' +import { Page } from 'app/models/DataSetProfile/Page' + +@Component({ + selector: 'page-form', + templateUrl: './page-component.html', + styleUrls: [] +}) + +export class PageFormComponent { + @Input() form: FormGroup; + @Input() dataModel: Page; + + TargetValidation() { + } + +} \ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/rule-component/rule.component.html b/dmp-admin/src/app/dataset-profile-form/rule-component/rule.component.html new file mode 100644 index 000000000..7ddb10c84 --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/rule-component/rule.component.html @@ -0,0 +1,33 @@ +
+
+
+
+ + +
+
+ + +
+ + +
+ + +
+
+
+
\ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/rule-component/rule.component.ts b/dmp-admin/src/app/dataset-profile-form/rule-component/rule.component.ts new file mode 100644 index 000000000..01b70230f --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/rule-component/rule.component.ts @@ -0,0 +1,18 @@ +import { Component, Input, Output, EventEmitter } from '@angular/core'; +import { FormGroup } from '@angular/forms' +import { Rule } from 'app/models/DataSetProfile/Rule' + +@Component({ + selector: 'rule-form', + templateUrl: './rule.component.html', + styleUrls: [] +}) + +export class RuleFormComponent { +@Input() form: FormGroup; +@Input() dataModel: FormGroup; + +TargetValidation(){ +} + +} \ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/section-form/section-form.component.css b/dmp-admin/src/app/dataset-profile-form/section-form/section-form.component.css new file mode 100644 index 000000000..1ded10469 --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/section-form/section-form.component.css @@ -0,0 +1,5 @@ +.section-container { + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + padding: 24px; +} \ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/section-form/section-form.component.html b/dmp-admin/src/app/dataset-profile-form/section-form/section-form.component.html new file mode 100644 index 000000000..1d3730e4f --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/section-form/section-form.component.html @@ -0,0 +1,124 @@ +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
Page is required
+
+
+ + + +
+
+
+ + + + + + + + + +
+
+
+ + {{i + 1}}. Field {{i + 1}} + +
+ +
+
+
+
+ +
+
+
+
+ + + + + +
\ No newline at end of file diff --git a/dmp-admin/src/app/dataset-profile-form/section-form/section-form.component.ts b/dmp-admin/src/app/dataset-profile-form/section-form/section-form.component.ts new file mode 100644 index 000000000..ffa4723ac --- /dev/null +++ b/dmp-admin/src/app/dataset-profile-form/section-form/section-form.component.ts @@ -0,0 +1,79 @@ +import { Component, OnInit, Input, ViewEncapsulation } from '@angular/core'; +import { FormGroup } from '@angular/forms'; +import { Section } from 'app/models/DataSetProfile/Section'; +import { FieldGroup } from 'app/models/DataSetProfile/FieldGroup'; +import { FormArray } from '@angular/forms/src/model'; +import { DatasetProfileModel } from 'app/models/DataSetProfile/DatasetProfileModel'; +import { FieldSet } from 'app/models/DataSetProfile/FieldSet'; +import { Field } from 'app/models/DataSetProfile/Field'; +import { Page } from 'app/models/DataSetProfile/Page'; +import { JsonSerializer } from 'app/utilities/JsonSerializer'; + +@Component({ + selector: 'section-form', + templateUrl: './section-form.component.html', + styleUrls: ['./section-form.component.css'], + encapsulation: ViewEncapsulation.None +}) + +export class SectionFormComponent { + @Input() form: FormGroup; + @Input() dataModel: Section; + @Input() indexPath: string; + + constructor() { } + + ngOnInit() { + var self = this; + + this.form.root.get("pages").valueChanges.subscribe(function(value) { + self.keepPageSelectionValid(value); + }); + } + + // addGroupField() { + // let fieldGroup: FieldGroup = new FieldGroup(); + // if (this.dataModel.fieldGroups) + // this.dataModel.fieldGroups.push(fieldGroup); + // (this.form.get("fieldGroups")).push(fieldGroup.buildForm()); + // } + + addField() { + let fieldSet: FieldSet = new FieldSet(); + let field: Field = new Field(); + //let fieldGroup: FieldGroup = new FieldGroup(); + fieldSet.fields.push(field); + //fieldGroup.compositeFields.push(fieldSet); + if (this.dataModel.fieldSets) + this.dataModel.fieldSets.push(fieldSet); + (this.form.get("fieldSets")).push(fieldSet.buildForm()); + } + + // DeleteFieldGroup(index) { + // this.dataModel.fieldGroups.splice(index, 1); + // (this.form.get("fieldGroups")).removeAt(index) + // } + + addSectioninSection() { + let section: Section = new Section(); + this.dataModel.sections.push(section); + (this.form.get("sections")).push(section.buildForm()); + } + + DeleteSectionInSection(index) { + this.dataModel.sections.splice(index); + (this.form.get("sections")).removeAt(index); + } + + DeleteFieldSet(index){ + this.dataModel.fieldSets.splice(index, 1); + (this.form.get("fieldSets")).removeAt(index); + } + + keepPageSelectionValid(pagesJson: Array) { + let selectedPage = this.form.get("page").value as number; + let pages: Array = new JsonSerializer().fromJSONArray(pagesJson, Page); + if (!isNaN(selectedPage) && pages.find(elem => elem.id === selectedPage) === undefined) + this.form.get("page").reset(); + } +} \ No newline at end of file diff --git a/dmp-admin/src/app/datasets-viewer/datasets-viewer.component.html b/dmp-admin/src/app/datasets-viewer/datasets-viewer.component.html index 5095aca05..a92228921 100644 --- a/dmp-admin/src/app/datasets-viewer/datasets-viewer.component.html +++ b/dmp-admin/src/app/datasets-viewer/datasets-viewer.component.html @@ -12,7 +12,7 @@

Manage Datasets

- +
diff --git a/dmp-admin/src/app/login/googgle-sign-in/googgle-sign-in.component.ts b/dmp-admin/src/app/login/googgle-sign-in/googgle-sign-in.component.ts index dac20db7a..d98a5b343 100644 --- a/dmp-admin/src/app/login/googgle-sign-in/googgle-sign-in.component.ts +++ b/dmp-admin/src/app/login/googgle-sign-in/googgle-sign-in.component.ts @@ -23,7 +23,7 @@ export class GooggleSignInComponent implements OnInit, AfterViewInit { ngOnInit() { } - private clientId:string = '1010962018903-glegmqudqtl1lub0150vacopbu06lgsg.apps.googleusercontent.com'; + private clientId:string = '524432312250-sc9qsmtmbvlv05r44onl6l93ia3k9deo.apps.googleusercontent.com'; private scope = [ 'profile', diff --git a/dmp-admin/src/app/login/main-sign-in/main-sign-in.component.html b/dmp-admin/src/app/login/main-sign-in/main-sign-in.component.html index 660c3348b..c6a336722 100644 --- a/dmp-admin/src/app/login/main-sign-in/main-sign-in.component.html +++ b/dmp-admin/src/app/login/main-sign-in/main-sign-in.component.html @@ -3,7 +3,7 @@

- -
- - -
- -
- - -
- - - - - - - - - -
- - - - - - - - - - \ No newline at end of file diff --git a/dmp-backend/src/main/webapp/WEB-INF/web.xml b/dmp-backend/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 8cc95c48c..000000000 --- a/dmp-backend/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,107 +0,0 @@ - - - - dmp-backend - - - dmp-backend-proxy - org.springframework.web.servlet.DispatcherServlet - 1 - - - dmp-backend-proxy - /proxy/* - - - org.springframework.web.context.ContextLoaderListener - - - - - dmp-backend-login - org.springframework.web.servlet.DispatcherServlet - 1 - - - dmp-backend-login - /login/* - - - org.springframework.web.context.ContextLoaderListener - - - - dmp-backend-rest - org.springframework.web.servlet.DispatcherServlet - 1 - - - dmp-backend-rest - /rest/* - - - org.springframework.web.context.ContextLoaderListener - - - - - spring-web - org.springframework.web.servlet.DispatcherServlet - 1 - - - spring-web - /ui/* - - - org.springframework.web.context.ContextLoaderListener - - - - - - checks.EnvironmentChecker - - - - - - - contextConfigLocation - /WEB-INF/applicationContext.xml,/WEB-INF/spring-security.xml - - - - 30 - - - - springSecurityFilterChain - org.springframework.web.filter.DelegatingFilterProxy - - - springSecurityFilterChain - /rest/* - - - - - - encodingFilter - org.springframework.web.filter.CharacterEncodingFilter - - encoding - UTF-8 - - - forceEncoding - true - - - - encodingFilter - /* - - - - \ No newline at end of file diff --git a/dmp-backend/src/main/webapp/resources/css/home.css b/dmp-backend/src/main/webapp/resources/css/home.css deleted file mode 100644 index b59a8f8d3..000000000 --- a/dmp-backend/src/main/webapp/resources/css/home.css +++ /dev/null @@ -1,82 +0,0 @@ -div.form-group{ - margin-top: 5px; - margin-bottom: 5px; - margin-left: 10px; - margin-right: 10px; -} - - - -.modal-edit-form { - width: 80%; - margin: auto; - /* - background-color: yellow; - */ -} - - -/* - -table { - font-family: "Helvetica", "Lucida Sans", "Lucida Sans Unicode", "Luxi Sans", Tahoma, sans-serif; - box-shadow: 1px 1px 10px rgba(0,0,0,0.5); - border-collapse: collapse; - border-spacing: 0; -} -table { - margin: auto; -} -table, td, th { - padding: 7px; - text-align: center; - border: 1px solid rgb(8,48,107); -} -th { - background-color: rgb(8,81,156); - color: white; -} - -*/ - -/* - .node { - cursor: pointer; - } - - .overlay{ - background-color:#EEE; - } - - .node circle { - fill: #fff; - stroke: steelblue; - stroke-width: 1.5px; - } - - .node text { - font-size:10px; - font-family:sans-serif; - } - - .link { - fill: none; - stroke: #ccc; - stroke-width: 1.5px; - } - - .templink { - fill: none; - stroke: red; - stroke-width: 3px; - } - - .ghostCircle.show{ - display:block; - } - - .ghostCircle, .activeDrag .ghostCircle{ - display: none; - } - - */ \ No newline at end of file diff --git a/dmp-backend/src/main/webapp/resources/css/jquery.json-viewer.css b/dmp-backend/src/main/webapp/resources/css/jquery.json-viewer.css deleted file mode 100644 index 2c72ae5fa..000000000 --- a/dmp-backend/src/main/webapp/resources/css/jquery.json-viewer.css +++ /dev/null @@ -1,47 +0,0 @@ -/* Syntax highlighting for JSON objects */ -ul.json-dict, ol.json-array { - list-style-type: none; - margin: 0 0 0 1px; - border-left: 1px dotted #ccc; - padding-left: 2em; -} -.json-string { - color: #0B7500; -} -.json-literal { - color: #1A01CC; - font-weight: bold; -} - -/* Toggle button */ -a.json-toggle { - position: relative; - color: inherit; - text-decoration: none; -} -a.json-toggle:focus { - outline: none; -} -a.json-toggle:before { - color: #aaa; - content: "\25BC"; /* down arrow */ - position: absolute; - display: inline-block; - width: 1em; - left: -1em; -} -a.json-toggle.collapsed:before { - transform: rotate(-90deg); /* Use rotated down arrow, prevents right arrow appearing smaller than down arrow in some browsers */ - -ms-transform: rotate(-90deg); - -webkit-transform: rotate(-90deg); -} - -/* Collapsable placeholder links */ -a.json-placeholder { - color: #aaa; - padding: 0 1em; - text-decoration: none; -} -a.json-placeholder:hover { - text-decoration: underline; -} diff --git a/dmp-backend/src/main/webapp/resources/js/bootstrap-notify.min.js b/dmp-backend/src/main/webapp/resources/js/bootstrap-notify.min.js deleted file mode 100644 index 01e7f3091..000000000 --- a/dmp-backend/src/main/webapp/resources/js/bootstrap-notify.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t("object"==typeof exports?require("jquery"):jQuery)}(function(t){function s(s){var e=!1;return t('[data-notify="container"]').each(function(i,n){var a=t(n),o=a.find('[data-notify="title"]').text().trim(),r=a.find('[data-notify="message"]').html().trim(),l=o===t("
"+s.settings.content.title+"
").html().trim(),d=r===t("
"+s.settings.content.message+"
").html().trim(),g=a.hasClass("alert-"+s.settings.type);return l&&d&&g&&(e=!0),!e}),e}function e(e,n,a){var o={content:{message:"object"==typeof n?n.message:n,title:n.title?n.title:"",icon:n.icon?n.icon:"",url:n.url?n.url:"#",target:n.target?n.target:"-"}};a=t.extend(!0,{},o,a),this.settings=t.extend(!0,{},i,a),this._defaults=i,"-"===this.settings.content.target&&(this.settings.content.target=this.settings.url_target),this.animations={start:"webkitAnimationStart oanimationstart MSAnimationStart animationstart",end:"webkitAnimationEnd oanimationend MSAnimationEnd animationend"},"number"==typeof this.settings.offset&&(this.settings.offset={x:this.settings.offset,y:this.settings.offset}),(this.settings.allow_duplicates||!this.settings.allow_duplicates&&!s(this))&&this.init()}var i={element:"body",position:null,type:"info",allow_dismiss:!0,allow_duplicates:!0,newest_on_top:!1,showProgressbar:!1,placement:{from:"top",align:"right"},offset:20,spacing:10,z_index:1031,delay:5e3,timer:1e3,url_target:"_blank",mouse_over:null,animate:{enter:"animated fadeInDown",exit:"animated fadeOutUp"},onShow:null,onShown:null,onClose:null,onClosed:null,icon_type:"class",template:''};String.format=function(){for(var t=arguments[0],s=1;s .progress-bar').removeClass("progress-bar-"+t.settings.type),t.settings.type=i[n],this.$ele.addClass("alert-"+i[n]).find('[data-notify="progressbar"] > .progress-bar').addClass("progress-bar-"+i[n]);break;case"icon":var a=this.$ele.find('[data-notify="icon"]');"class"===t.settings.icon_type.toLowerCase()?a.removeClass(t.settings.content.icon).addClass(i[n]):(a.is("img")||a.find("img"),a.attr("src",i[n]));break;case"progress":var o=t.settings.delay-t.settings.delay*(i[n]/100);this.$ele.data("notify-delay",o),this.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i[n]).css("width",i[n]+"%");break;case"url":this.$ele.find('[data-notify="url"]').attr("href",i[n]);break;case"target":this.$ele.find('[data-notify="url"]').attr("target",i[n]);break;default:this.$ele.find('[data-notify="'+n+'"]').html(i[n])}var r=this.$ele.outerHeight()+parseInt(t.settings.spacing)+parseInt(t.settings.offset.y);t.reposition(r)},close:function(){t.close()}}},buildNotify:function(){var s=this.settings.content;this.$ele=t(String.format(this.settings.template,this.settings.type,s.title,s.message,s.url,s.target)),this.$ele.attr("data-notify-position",this.settings.placement.from+"-"+this.settings.placement.align),this.settings.allow_dismiss||this.$ele.find('[data-notify="dismiss"]').css("display","none"),(this.settings.delay<=0&&!this.settings.showProgressbar||!this.settings.showProgressbar)&&this.$ele.find('[data-notify="progressbar"]').remove()},setIcon:function(){"class"===this.settings.icon_type.toLowerCase()?this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon):this.$ele.find('[data-notify="icon"]').is("img")?this.$ele.find('[data-notify="icon"]').attr("src",this.settings.content.icon):this.$ele.find('[data-notify="icon"]').append('Notify Icon')},styleDismiss:function(){this.$ele.find('[data-notify="dismiss"]').css({position:"absolute",right:"10px",top:"5px",zIndex:this.settings.z_index+2})},styleURL:function(){this.$ele.find('[data-notify="url"]').css({backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)",height:"100%",left:0,position:"absolute",top:0,width:"100%",zIndex:this.settings.z_index+1})},placement:function(){var s=this,e=this.settings.offset.y,i={display:"inline-block",margin:"0px auto",position:this.settings.position?this.settings.position:"body"===this.settings.element?"fixed":"absolute",transition:"all .5s ease-in-out",zIndex:this.settings.z_index},n=!1,a=this.settings;switch(t('[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])').each(function(){e=Math.max(e,parseInt(t(this).css(a.placement.from))+parseInt(t(this).outerHeight())+parseInt(a.spacing))}),this.settings.newest_on_top===!0&&(e=this.settings.offset.y),i[this.settings.placement.from]=e+"px",this.settings.placement.align){case"left":case"right":i[this.settings.placement.align]=this.settings.offset.x+"px";break;case"center":i.left=0,i.right=0}this.$ele.css(i).addClass(this.settings.animate.enter),t.each(Array("webkit-","moz-","o-","ms-",""),function(t,e){s.$ele[0].style[e+"AnimationIterationCount"]=1}),t(this.settings.element).append(this.$ele),this.settings.newest_on_top===!0&&(e=parseInt(e)+parseInt(this.settings.spacing)+this.$ele.outerHeight(),this.reposition(e)),t.isFunction(s.settings.onShow)&&s.settings.onShow.call(this.$ele),this.$ele.one(this.animations.start,function(){n=!0}).one(this.animations.end,function(){s.$ele.removeClass(s.settings.animate.enter),t.isFunction(s.settings.onShown)&&s.settings.onShown.call(this)}),setTimeout(function(){n||t.isFunction(s.settings.onShown)&&s.settings.onShown.call(this)},600)},bind:function(){var s=this;if(this.$ele.find('[data-notify="dismiss"]').on("click",function(){s.close()}),this.$ele.mouseover(function(){t(this).data("data-hover","true")}).mouseout(function(){t(this).data("data-hover","false")}),this.$ele.data("data-hover","false"),this.settings.delay>0){s.$ele.data("notify-delay",s.settings.delay);var e=setInterval(function(){var t=parseInt(s.$ele.data("notify-delay"))-s.settings.timer;if("false"===s.$ele.data("data-hover")&&"pause"===s.settings.mouse_over||"pause"!=s.settings.mouse_over){var i=(s.settings.delay-t)/s.settings.delay*100;s.$ele.data("notify-delay",t),s.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i).css("width",i+"%")}t<=-s.settings.timer&&(clearInterval(e),s.close())},s.settings.timer)}},close:function(){var s=this,e=parseInt(this.$ele.css(this.settings.placement.from)),i=!1;this.$ele.attr("data-closing","true").addClass(this.settings.animate.exit),s.reposition(e),t.isFunction(s.settings.onClose)&&s.settings.onClose.call(this.$ele),this.$ele.one(this.animations.start,function(){i=!0}).one(this.animations.end,function(){t(this).remove(),t.isFunction(s.settings.onClosed)&&s.settings.onClosed.call(this)}),setTimeout(function(){i||(s.$ele.remove(),s.settings.onClosed&&s.settings.onClosed(s.$ele))},600)},reposition:function(s){var e=this,i='[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])',n=this.$ele.nextAll(i);this.settings.newest_on_top===!0&&(n=this.$ele.prevAll(i)),n.each(function(){t(this).css(e.settings.placement.from,s),s=parseInt(s)+parseInt(e.settings.spacing)+t(this).outerHeight()})}}),t.notify=function(t,s){var i=new e(this,t,s);return i.notify},t.notifyDefaults=function(s){return i=t.extend(!0,{},i,s)},t.notifyClose=function(s){"warning"===s&&(s="danger"),"undefined"==typeof s||"all"===s?t("[data-notify]").find('[data-notify="dismiss"]').trigger("click"):"success"===s||"info"===s||"warning"===s||"danger"===s?t(".alert-"+s+"[data-notify]").find('[data-notify="dismiss"]').trigger("click"):s?t(s+"[data-notify]").find('[data-notify="dismiss"]').trigger("click"):t('[data-notify-position="'+s+'"]').find('[data-notify="dismiss"]').trigger("click")},t.notifyCloseExcept=function(s){"warning"===s&&(s="danger"),"success"===s||"info"===s||"warning"===s||"danger"===s?t("[data-notify]").not(".alert-"+s).find('[data-notify="dismiss"]').trigger("click"):t("[data-notify]").not(s).find('[data-notify="dismiss"]').trigger("click")}}); \ No newline at end of file diff --git a/dmp-backend/src/main/webapp/resources/js/home.js b/dmp-backend/src/main/webapp/resources/js/home.js deleted file mode 100644 index 629e60022..000000000 --- a/dmp-backend/src/main/webapp/resources/js/home.js +++ /dev/null @@ -1,81 +0,0 @@ - - -$(document).ready(function(){ - $('[data-toggle="tooltip"]').tooltip({html:true}); -}); - - -function clickedShow(dmp){ - $("#jsonModal").find("div.modal-body > p").jsonViewer(dmp, {withQuotes: true, collapsed: true}); -} - -function clickedDelete(id){ - console.log(id); - $.notify( - { - title: "Deleting is disabled
", - message: "Deleting DMPs is currently not allowed." - }, - { - type: 'danger' - } - ); - -} - -function clickedEdit_Disabled(id){ - console.log(id); - $.notify({ - title: "Editing is disabled
", - message: "Editing DMPs is currently not allowed." - }); -} - -function clickedEdit(dmp) { - - console.log(dmp); - - var titles = ["DatasetProfileRuleset", "DatasetProfileViewStyle", "DatasetProfile"]; - - - $('#edit-dmp-modal-container').find('.modal-title').html("Edit DMP: "+dmp.id); - - var form = $('#edit-dmp-form'); - - form.find("#dmp-id").val(dmp.id); //set the current id on the hidden form element - - if((dmp.dataset != null) && (dmp.dataset.profile != null)){ - form.find('#dp-definition').val(vkbeautify.xml(dmp.dataset.profile.definition)); - if(dmp.dataset.profile.ruleset != 'undefined') - form.find('#dpr-definition').val(vkbeautify.xml(dmp.dataset.profile.ruleset.definition)); - if(dmp.dataset.profile.viewstyle != 'undefined') - form.find('#dpv-definition').val(vkbeautify.xml(dmp.dataset.profile.viewstyle.definition)); - } - - - - - //var listGroup = $(document.createElement('div')); - //listGroup.addClass("list-group"); - - //listGroup.append( "DatasetProfileRuleset" ); - - - - //console.log(listGroup); - - - //$('#edit-dmp-modal-container').find('.modal-body').html(""); - //$('#edit-dmp-modal-container').find('.modal-body').append(listGroup); - -} - - - -function loadTile(data){ - - if($("#tile-"+data.id).html() == ''){ - $("#tile-"+data.id).jsonViewer(data, {withQuotes: true, collapsed: true}); - } - -} \ No newline at end of file diff --git a/dmp-backend/src/main/webapp/resources/js/jquery.json-viewer.js b/dmp-backend/src/main/webapp/resources/js/jquery.json-viewer.js deleted file mode 100644 index 3ecbc3f7b..000000000 --- a/dmp-backend/src/main/webapp/resources/js/jquery.json-viewer.js +++ /dev/null @@ -1,148 +0,0 @@ -/** - * jQuery json-viewer - * @author: Alexandre Bodelot - */ -(function($){ - - /** - * Check if arg is either an array with at least 1 element, or a dict with at least 1 key - * @return boolean - */ - function isCollapsable(arg) { - return arg instanceof Object && Object.keys(arg).length > 0; - } - - /** - * Check if a string represents a valid url - * @return boolean - */ - function isUrl(string) { - var regexp = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/; - return regexp.test(string); - } - - /** - * Transform a json object into html representation - * @return string - */ - function json2html(json, options) { - var html = ''; - if (typeof json === 'string') { - /* Escape tags */ - json = json.replace(/&/g, '&').replace(//g, '>'); - if (isUrl(json)) - html += '' + json + ''; - else - html += '"' + json + '"'; - } - else if (typeof json === 'number') { - html += '' + json + ''; - } - else if (typeof json === 'boolean') { - html += '' + json + ''; - } - else if (json === null) { - html += 'null'; - } - else if (json instanceof Array) { - if (json.length > 0) { - html += '[
    '; - for (var i = 0; i < json.length; ++i) { - html += '
  1. '; - /* Add toggle button if item is collapsable */ - if (isCollapsable(json[i])) { - html += ''; - } - html += json2html(json[i], options); - /* Add comma if item is not last */ - if (i < json.length - 1) { - html += ','; - } - html += '
  2. '; - } - html += '
]'; - } - else { - html += '[]'; - } - } - else if (typeof json === 'object') { - var key_count = Object.keys(json).length; - if (key_count > 0) { - html += '{
    '; - for (var key in json) { - if (json.hasOwnProperty(key)) { - html += '
  • '; - var keyRepr = options.withQuotes ? - '"' + key + '"' : key; - /* Add toggle button if item is collapsable */ - if (isCollapsable(json[key])) { - html += '' + keyRepr + ''; - } - else { - html += keyRepr; - } - html += ': ' + json2html(json[key], options); - /* Add comma if item is not last */ - if (--key_count > 0) - html += ','; - html += '
  • '; - } - } - html += '
}'; - } - else { - html += '{}'; - } - } - return html; - } - - /** - * jQuery plugin method - * @param json: a javascript object - * @param options: an optional options hash - */ - $.fn.jsonViewer = function(json, options) { - options = options || {}; - - /* jQuery chaining */ - return this.each(function() { - - /* Transform to HTML */ - var html = json2html(json, options); - if (isCollapsable(json)) - html = '' + html; - - /* Insert HTML in target DOM element */ - $(this).html(html); - - /* Bind click on toggle buttons */ - $(this).off('click'); - $(this).on('click', 'a.json-toggle', function() { - var target = $(this).toggleClass('collapsed').siblings('ul.json-dict, ol.json-array'); - target.toggle(); - if (target.is(':visible')) { - target.siblings('.json-placeholder').remove(); - } - else { - var count = target.children('li').length; - var placeholder = count + (count > 1 ? ' items' : ' item'); - target.after('' + placeholder + ''); - } - return false; - }); - - /* Simulate click on toggle button when placeholder is clicked */ - $(this).on('click', 'a.json-placeholder', function() { - $(this).siblings('a.json-toggle').click(); - return false; - }); - - if (options.collapsed == true) { - /* Trigger click to collapse all nodes */ - $(this).find('a.json-toggle').click(); - } - }); - }; -})(jQuery); diff --git a/dmp-backend/src/main/webapp/resources/js/vkbeautify.0.99.00.js b/dmp-backend/src/main/webapp/resources/js/vkbeautify.0.99.00.js deleted file mode 100644 index 57effaeca..000000000 --- a/dmp-backend/src/main/webapp/resources/js/vkbeautify.0.99.00.js +++ /dev/null @@ -1,358 +0,0 @@ -/** -* vkBeautify - javascript plugin to pretty-print or minify text in XML, JSON, CSS and SQL formats. -* -* Version - 0.99.00.beta -* Copyright (c) 2012 Vadim Kiryukhin -* vkiryukhin @ gmail.com -* http://www.eslinstructor.net/vkbeautify/ -* -* Dual licensed under the MIT and GPL licenses: -* http://www.opensource.org/licenses/mit-license.php -* http://www.gnu.org/licenses/gpl.html -* -* Pretty print -* -* vkbeautify.xml(text [,indent_pattern]); -* vkbeautify.json(text [,indent_pattern]); -* vkbeautify.css(text [,indent_pattern]); -* vkbeautify.sql(text [,indent_pattern]); -* -* @text - String; text to beatufy; -* @indent_pattern - Integer | String; -* Integer: number of white spaces; -* String: character string to visualize indentation ( can also be a set of white spaces ) -* Minify -* -* vkbeautify.xmlmin(text [,preserve_comments]); -* vkbeautify.jsonmin(text); -* vkbeautify.cssmin(text [,preserve_comments]); -* vkbeautify.sqlmin(text); -* -* @text - String; text to minify; -* @preserve_comments - Bool; [optional]; -* Set this flag to true to prevent removing comments from @text ( minxml and mincss functions only. ) -* -* Examples: -* vkbeautify.xml(text); // pretty print XML -* vkbeautify.json(text, 4 ); // pretty print JSON -* vkbeautify.css(text, '. . . .'); // pretty print CSS -* vkbeautify.sql(text, '----'); // pretty print SQL -* -* vkbeautify.xmlmin(text, true);// minify XML, preserve comments -* vkbeautify.jsonmin(text);// minify JSON -* vkbeautify.cssmin(text);// minify CSS, remove comments ( default ) -* vkbeautify.sqlmin(text);// minify SQL -* -*/ - -(function() { - -function createShiftArr(step) { - - var space = ' '; - - if ( isNaN(parseInt(step)) ) { // argument is string - space = step; - } else { // argument is integer - switch(step) { - case 1: space = ' '; break; - case 2: space = ' '; break; - case 3: space = ' '; break; - case 4: space = ' '; break; - case 5: space = ' '; break; - case 6: space = ' '; break; - case 7: space = ' '; break; - case 8: space = ' '; break; - case 9: space = ' '; break; - case 10: space = ' '; break; - case 11: space = ' '; break; - case 12: space = ' '; break; - } - } - - var shift = ['\n']; // array of shifts - for(ix=0;ix<100;ix++){ - shift.push(shift[ix]+space); - } - return shift; -} - -function vkbeautify(){ - this.step = ' '; // 4 spaces - this.shift = createShiftArr(this.step); -}; - -vkbeautify.prototype.xml = function(text,step) { - - var ar = text.replace(/>\s{0,}<") - .replace(/ or -1) { - str += shift[deep]+ar[ix]; - inComment = true; - // end comment or // - if(ar[ix].search(/-->/) > -1 || ar[ix].search(/\]>/) > -1 || ar[ix].search(/!DOCTYPE/) > -1 ) { - inComment = false; - } - } else - // end comment or // - if(ar[ix].search(/-->/) > -1 || ar[ix].search(/\]>/) > -1) { - str += ar[ix]; - inComment = false; - } else - // // - if( /^<\w/.exec(ar[ix-1]) && /^<\/\w/.exec(ar[ix]) && - /^<[\w:\-\.\,]+/.exec(ar[ix-1]) == /^<\/[\w:\-\.\,]+/.exec(ar[ix])[0].replace('/','')) { - str += ar[ix]; - if(!inComment) deep--; - } else - // // - if(ar[ix].search(/<\w/) > -1 && ar[ix].search(/<\//) == -1 && ar[ix].search(/\/>/) == -1 ) { - str = !inComment ? str += shift[deep++]+ar[ix] : str += ar[ix]; - } else - // ... // - if(ar[ix].search(/<\w/) > -1 && ar[ix].search(/<\//) > -1) { - str = !inComment ? str += shift[deep]+ar[ix] : str += ar[ix]; - } else - // // - if(ar[ix].search(/<\//) > -1) { - str = !inComment ? str += shift[--deep]+ar[ix] : str += ar[ix]; - } else - // // - if(ar[ix].search(/\/>/) > -1 ) { - str = !inComment ? str += shift[deep]+ar[ix] : str += ar[ix]; - } else - // // - if(ar[ix].search(/<\?/) > -1) { - str += shift[deep]+ar[ix]; - } else - // xmlns // - if( ar[ix].search(/xmlns\:/) > -1 || ar[ix].search(/xmlns\=/) > -1) { - str += shift[deep]+ar[ix]; - } - - else { - str += ar[ix]; - } - } - - return (str[0] == '\n') ? str.slice(1) : str; -} - -vkbeautify.prototype.json = function(text,step) { - - var step = step ? step : this.step; - - if (typeof JSON === 'undefined' ) return text; - - if ( typeof text === "string" ) return JSON.stringify(JSON.parse(text), null, step); - if ( typeof text === "object" ) return JSON.stringify(text, null, step); - - return text; // text is not string nor object -} - -vkbeautify.prototype.css = function(text, step) { - - var ar = text.replace(/\s{1,}/g,' ') - .replace(/\{/g,"{~::~") - .replace(/\}/g,"~::~}~::~") - .replace(/\;/g,";~::~") - .replace(/\/\*/g,"~::~/*") - .replace(/\*\//g,"*/~::~") - .replace(/~::~\s{0,}~::~/g,"~::~") - .split('~::~'), - len = ar.length, - deep = 0, - str = '', - ix = 0, - shift = step ? createShiftArr(step) : this.shift; - - for(ix=0;ix/g,"") - .replace(/[ \r\n\t]{1,}xmlns/g, ' xmlns'); - return str.replace(/>\s{0,}<"); -} - -vkbeautify.prototype.jsonmin = function(text) { - - if (typeof JSON === 'undefined' ) return text; - - return JSON.stringify(JSON.parse(text), null, 0); - -} - -vkbeautify.prototype.cssmin = function(text, preserveComments) { - - var str = preserveComments ? text - : text.replace(/\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\//g,"") ; - - return str.replace(/\s{1,}/g,' ') - .replace(/\{\s{1,}/g,"{") - .replace(/\}\s{1,}/g,"}") - .replace(/\;\s{1,}/g,";") - .replace(/\/\*\s{1,}/g,"/*") - .replace(/\*\/\s{1,}/g,"*/"); -} - -vkbeautify.prototype.sqlmin = function(text) { - return text.replace(/\s{1,}/g," ").replace(/\s{1,}\(/,"(").replace(/\s{1,}\)/,")"); -} - -window.vkbeautify = new vkbeautify(); - -})(); - diff --git a/dmp-backend/src/test/java/TestRest.java b/dmp-backend/src/test/java/TestRest.java deleted file mode 100644 index b2fbcefaa..000000000 --- a/dmp-backend/src/test/java/TestRest.java +++ /dev/null @@ -1,307 +0,0 @@ -import static org.junit.Assert.*; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.UUID; - -import org.junit.Before; -import org.junit.Test; -import org.mortbay.jetty.HttpStatus; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.support.ClassPathXmlApplicationContext; -import org.springframework.http.ResponseEntity; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.type.CollectionType; -import com.fasterxml.jackson.databind.type.TypeFactory; -import com.google.gson.Gson; -import com.google.gson.JsonSyntaxException; - -import dao.entities.DMPDao; -import dao.entities.DMPProfileDao; -import dao.entities.DataRepositoryDao; -import dao.entities.DatasetDao; -import dao.entities.DatasetProfileDao; -import dao.entities.DatasetProfileRulesetDao; -import dao.entities.DatasetProfileViewstyleDao; -import dao.entities.OrganisationDao; -import dao.entities.ProjectDao; -import dao.entities.RegistryDao; -import dao.entities.ResearcherDao; -import dao.entities.ServiceDao; -import dao.entities.UserInfoDao; -import entities.DMP; -import entities.DatasetProfile; -import entities.DatasetProfileRuleset; -import entities.DatasetProfileViewstyle; -import entities.Project; -import entities.Service; -import helpers.SerializerProvider; -import rest.entities.DMPs; -import rest.entities.DatasetProfiles; -import rest.entities.Datasets; -import rest.entities.Projects; -import rest.entities.Services; - -@ComponentScan(basePackages = "dao, entities, controller, login, proxy, rest") -public class TestRest { - - @Autowired private DataRepositoryDao dataRepositoryDao; - @Autowired private DatasetDao datasetDao; - @Autowired private DatasetProfileDao datasetProfileDao; - @Autowired private DatasetProfileRulesetDao datasetProfileRulesetDao; - @Autowired private DatasetProfileViewstyleDao datasetProfileViewstyleDao; - @Autowired private DMPDao dMPDao; - @Autowired private DMPProfileDao dMPProfileDao; - @Autowired private OrganisationDao organisationDao; - @Autowired private ProjectDao projectDao; - @Autowired private RegistryDao registryDao; - @Autowired private ResearcherDao researcherDao; - @Autowired private ServiceDao serviceDao; - @Autowired private UserInfoDao userInfoDao; - - - Gson gson = new Gson(); - - private static String userID = "332ffc36-bd51-4d4e-bf9a-ffb01fdee05a"; - - private ApplicationContext context; - - private Projects projectsService; - private Datasets datasetsService; - private DatasetProfiles datasetProfilesService; - private DMPs dmpsService; - private Services servicesService; - - - @Before - public void setupAll() { - Authentication dummy = new UsernamePasswordAuthenticationToken(userID, "test-creds", new ArrayList<>()); - SecurityContextHolder.getContext().setAuthentication(dummy); - - context = new ClassPathXmlApplicationContext("applicationContextTEST.xml"); - - projectsService = context.getBean(Projects.class); - datasetsService = context.getBean(Datasets.class); - datasetProfilesService = context.getBean(DatasetProfiles.class); - dmpsService = context.getBean(DMPs.class); - servicesService = context.getBean(Services.class); - } - - -// @Test - public void testDatasetProfile() { -// DatasetProfile datasetProfile = new DatasetProfile(); -// datasetProfile.setLabel("Sample-Dataset-Profile"); -// datasetProfile.setDefinition("Sample-Dataset-Profile definition"); -// -// DatasetProfileRuleset dpr = new DatasetProfileRuleset(); -// dpr.setLabel("Sample-Dataset-Profile ruleset"); -// dpr.setDefinition("dpr definition"); -// datasetProfile.setRuleset(dpr); -// -// DatasetProfileViewstyle dpv = new DatasetProfileViewstyle(); -// dpv.setLabel("Sample-Dataset-Profile viewstyle"); -// dpv.setDefinition("dpv definition"); -// datasetProfile.setViewstyle(dpv); -// -// datasetProfilesService.createDatasetProfile(datasetProfile); -// -// assertNotNull(datasetProfile.getId()); - - } - -// @Test - public void testDatasetProfile2() { - -// DatasetProfile datasetProfile = new DatasetProfile(); -// datasetProfile.setLabel("Sample-Dataset-Profile-222"); -// datasetProfile.setDefinition("Sample-Dataset-Profile-222 definition"); -// -// DatasetProfileRuleset dpr = new DatasetProfileRuleset(); -// dpr.setLabel("Sample-Dataset-Profile-222 ruleset"); -// dpr.setDefinition("dpr definition"); -// datasetProfile.setRuleset(dpr); -// -// DatasetProfileViewstyle dpv = new DatasetProfileViewstyle(); -// dpv.setLabel("Sample-Dataset-Profile-222 viewstyle"); -// dpv.setDefinition("dpv definition"); -// datasetProfile.setViewstyle(dpv); -// -// ResponseEntity createResp = datasetProfilesService.createDatasetProfile(datasetProfile); -// assertEquals(201, createResp.getStatusCodeValue()); -// -// datasetProfile.setLabel("SAMPLE-DATASET-PROFILE-222"); -// dpr.setLabel("SAMPLE-DATASET-PROFILE-222"); -// dpv.setLabel("SAMPLE-DATASET-PROFILE-222"); -// -// ResponseEntity updResp = datasetProfilesService.updateDatasetProfile(datasetProfile); -// assertEquals(201, updResp.getStatusCodeValue()); -// -// ResponseEntity delResp = datasetProfilesService.deleteDatasetProfile(datasetProfile); -// assertEquals(200, delResp.getStatusCodeValue()); - - } - - - -// @Test - public void testServiceService() { - Service service = new Service(); - service.setId(UUID.fromString("37acad15-39a1-46f3-a6f3-1bf0eaefaadc")); - ResponseEntity delResp = servicesService.delete(service); - assertEquals(201, delResp.getStatusCodeValue()); - } - - - - //@Test - public void testUserProject() { - -// System.out.println(projectsService.listProjects().getBody()); - -// System.out.println(projectsService.getProjectsOfUser().getBody()); - - CollectionType typeReference = TypeFactory.defaultInstance().constructCollectionType(List.class, Project.class); - List userProjects = null; - try { - userProjects = SerializerProvider.fromJson(projectsService.getProjectsOfUser().getBody().toString(), typeReference) ; - } catch (Exception e) { - fail("Should not have thrown any exception"); - } - - assertNotNull(userProjects); - System.out.println(userProjects.size()); - - System.out.println(SerializerProvider.toJson(userProjects)); - - assertEquals("aaa", "aaa"); - - } - - //@Test - public void testDmpUser() { - -// System.out.println(dmpsService.getDmpsOfUser()); - - DMP dmp = new DMP(); - dmp.setId(UUID.fromString("52239f0e-4460-4459-a393-bffcb833f39d")); - - System.out.println(dmpsService.getDatasetsOfDMP(dmp).getBody()); - - assertEquals("aaa", "aaa"); - - - } - - - //@Test - public void testDmpClone() { - - System.out.println(dmpsService.getDmpsOfUser().getBody()); - - DMP dmp = new DMP(); - dmp.setId(UUID.fromString("8faad611-7083-497c-ad96-9459e47ee175")); - String clonedJSON = dmpsService.cloneDmpOfUser(dmp).toString(); - - System.out.println(clonedJSON); - - -// System.out.println(datasetsService.getAllDatasets().getBody()); - -// System.out.println(dmpsService.getDatasetsOfDMP(dmp).getBody()); - - assertEquals("aaa", "aaa"); - - - } - - - //@Test - public void testProject() { - - String projectJson = "{\"id\":\"d558e52c-a61b-4e16-a401-b27c579cf8e3\",\"dmps\":null,\"label\":\"Sample project\",\"abbreviation\":null,\"reference\":\"agasdfasdf\",\"uri\":\"hadfhadfgazfrg\",\"definition\":\"sdfgsdg\",\"startdate\":\"2017-11-01\",\"enddate\":\"2017-11-30\",\"status\":0,\"created\":1509638367900,\"modified\":1509638367900}"; - try { - Project project = SerializerProvider.fromJson(projectJson, Project.class); - System.out.println(SerializerProvider.toJson(project)); - } catch (Exception e) { - e.printStackTrace(); - } - - - /* -// System.out.println(dmpsService.getAllDMPs().getBody().toString()); - - String dmpJSON = dmpsService.getDMP("d0d01f5e-9aed-4733-a0cf-aabe44cd30c9").getBody().toString(); - System.out.println(dmpJSON); - - try { - DMP dmp = SerializerProvider.fromJson(dmpJSON, DMP.class); - ResponseEntity resp = dmpsService.softDelete(dmp); - resp.getStatusCode(); - - } - catch(Exception ex) { - - } - - //dmpsService.softDelete(dmp) - - //System.out.println(datasetsService.getAllDatasets().getBody()); - -// System.out.println(dmpsService.getDatasetsOfDMP(dmp).getBody()); - - */ - - - - assertEquals("aaa", "aaa"); - - - } - - @Test - public void testProject2() { - - -// String a = null; -// try { -// //a = (String)dmpsService.getDmpsOfUser().getBody(); -// -// Set dmps = new ObjectMapper().readValue(dmpsService.getDmpsOfUser().getBody().toString(), new TypeReference>(){}); -// System.out.println(dmps); -// -//// Set dmps = SerializerProvider.fromJson((String)dmpsService.getDmpsOfUser().getBody(), new TypeReference>(){}); -// } catch (Exception e) { -// -// e.printStackTrace(); -// } - - - CollectionType typeReference = TypeFactory.defaultInstance().constructCollectionType(List.class, DMP.class); - List dmps = null; - try { - dmps = SerializerProvider.fromJson(dmpsService.getDmpsOfUser().getBody().toString(), typeReference) ; - System.out.println(dmps); - } catch (Exception e) { - e.printStackTrace(); - fail("Should not have thrown any exception"); - } - - - assertEquals("aaa", "aaa"); - - } - - - - -} diff --git a/dmp-frontend/.angular-cli.json b/dmp-frontend/.angular-cli.json index d2bdb2410..7e79fbe3d 100644 --- a/dmp-frontend/.angular-cli.json +++ b/dmp-frontend/.angular-cli.json @@ -19,15 +19,10 @@ "testTsconfig": "tsconfig.spec.json", "prefix": "app", "styles": [ - "../node_modules/primeng/resources/themes/omega/theme.css" , - "../node_modules/primeng/resources/primeng.css", - "./../node_modules/bootstrap/dist/css/bootstrap.min.css", - "styles.css" + "styles.scss" ], "scripts": [ - "./../node_modules/bootstrap/dist/js/bootstrap.min.js", - "./assets/xml2json.min.js" - ], + ], "environmentSource": "environments/environment.ts", "environments": { "dev": "environments/environment.ts", @@ -63,4 +58,4 @@ "styleExt": "css", "component": {} } -} +} \ No newline at end of file diff --git a/dmp-frontend/.editorconfig b/dmp-frontend/.editorconfig deleted file mode 100644 index 6e87a003d..000000000 --- a/dmp-frontend/.editorconfig +++ /dev/null @@ -1,13 +0,0 @@ -# Editor configuration, see http://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/dmp-frontend/.vscode/launch.json b/dmp-frontend/.vscode/launch.json new file mode 100644 index 000000000..2ed69a337 --- /dev/null +++ b/dmp-frontend/.vscode/launch.json @@ -0,0 +1,35 @@ +{ + "version": "0.2.0", + "configurations": [ + + { + "name": "Launch Chrome", + "type": "chrome", + "request": "launch", + "url": "http://localhost:4200/#", + "webRoot": "${workspaceRoot}" + }, + { + "name": "Attach Chrome", + "type": "chrome", + "request": "attach", + "url": "http://localhost:4200/#", + "webRoot": "${workspaceRoot}" + }, + { + "name": "Launch Chrome (Test)", + "type": "chrome", + "request": "launch", + "url": "http://localhost:9876/debug.html", + "webRoot": "${workspaceRoot}" + }, + { + "name": "Launch Chrome (E2E)", + "type": "node", + "request": "launch", + "program": "${workspaceRoot}/node_modules/protractor/bin/protractor", + "protocol": "inspector", + "args": ["${workspaceRoot}/protractor.conf.js"] + } + ] + } \ No newline at end of file diff --git a/dmp-frontend/.vscode/settings.json b/dmp-frontend/.vscode/settings.json new file mode 100644 index 000000000..55712c19f --- /dev/null +++ b/dmp-frontend/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib" +} \ No newline at end of file diff --git a/dmp-frontend/karma.conf.js b/dmp-frontend/karma.conf.js deleted file mode 100644 index af139fada..000000000 --- a/dmp-frontend/karma.conf.js +++ /dev/null @@ -1,33 +0,0 @@ -// 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/cli'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - require('@angular/cli/plugins/karma') - ], - client:{ - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - reports: [ 'html', 'lcovonly' ], - fixWebpackSourcePaths: true - }, - angularCli: { - environment: 'dev' - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false - }); -}; diff --git a/dmp-frontend/package-lock.json b/dmp-frontend/package-lock.json index 16c4c69ac..7c25c48da 100644 --- a/dmp-frontend/package-lock.json +++ b/dmp-frontend/package-lock.json @@ -5,120 +5,206 @@ "requires": true, "dependencies": { "@angular-devkit/build-optimizer": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.13.tgz", - "integrity": "sha512-yEMkYU4YU8XlA5OauPhg22ZEWJ4X2VhiFKUwfeo4UWJ7lz4XWiuBJocrT5NHWqI1S0rOLpSixLXG9byvFMbavA==", + "version": "0.0.36", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.0.36.tgz", + "integrity": "sha512-EFFF7hBbVoTOzYfXuSlGhcDr8neafmwuBAIkzAekEjzik7OaTLq7LPG7As+ebed9ll+3DAGypnrpdIE1Tp/H/A==", "dev": true, "requires": { "loader-utils": "1.1.0", "source-map": "0.5.7", - "typescript": "2.3.4" + "typescript": "2.6.2", + "webpack-sources": "1.1.0" + }, + "dependencies": { + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", + "dev": true + } + } + }, + "@angular-devkit/core": { + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.0.22.tgz", + "integrity": "sha512-zxrNtTiv60liye/GGeRMnnGgLgAWoqlMTfPLMW0D1qJ4bbrPHtme010mpxS3QL4edcDtQseyXSFCnEkuo2MrRw==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "@angular-devkit/schematics": { + "version": "0.0.42", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.0.42.tgz", + "integrity": "sha512-elTiNL0Nx9oin2pfZTvMBU/d9sgutXaZe8n3xm2p7jfqQZry5MYYFES4hq+WIJjtV/X9gAniafncEpxuF7ikYw==", + "dev": true, + "requires": { + "@angular-devkit/core": "0.0.22", + "@ngtools/json-schema": "1.1.0", + "@schematics/schematics": "0.0.11", + "minimist": "1.2.0", + "rxjs": "5.5.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "rxjs": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.5.tgz", + "integrity": "sha512-D/MfQnPMBk8P8gfwGxvCkuaWBcG58W7dUMT//URPoYzIbDEKT0GezdirkK5whMgKFBATfCoTpxO8bJQGJ04W5A==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + } } }, "@angular/animations": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-4.3.6.tgz", - "integrity": "sha1-v5KD7HyMmLMvVp2E3NoQiQ/cAmI=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.1.1.tgz", + "integrity": "sha512-PHLBWDnAzr5b5l52pk5ZYmv/6m0YUe2ICwu5dmbS0d8Kf5dXadMphAWCDbljMF+djGyZeFq2/dQ/t7ygYl3YuA==", + "requires": { + "tslib": "1.7.1" + } + }, + "@angular/cdk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-5.0.1.tgz", + "integrity": "sha512-uK4Vyaf06J8KqePzq35BxMHRGolt35EnbZf9wjCs7eYaghbQ7Pk2xUGoynu5Lj1wAOn5N1/C1nT2/aAH/EE2rw==", "requires": { "tslib": "1.7.1" } }, "@angular/cli": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.3.1.tgz", - "integrity": "sha512-khmFQjuuqUxulvPnYTaThSf7Dw5B5blMuVsU8MkSe3mfdyc/x/DaKjfPXDfFNGoDiiSJfMwob2CT3OYQOPI2MQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-1.6.1.tgz", + "integrity": "sha512-cdXfUR1by7nCgg9H9HijV8aI36AmceMubBZ/k+UgICMd8DlkPCVBIWcUXLdoH/l6nuXb3gCucfJoThznlakNMw==", "dev": true, "requires": { - "@angular-devkit/build-optimizer": "0.0.13", + "@angular-devkit/build-optimizer": "0.0.36", + "@angular-devkit/schematics": "0.0.42", "@ngtools/json-schema": "1.1.0", - "@ngtools/webpack": "1.6.1", + "@ngtools/webpack": "1.9.1", + "@schematics/angular": "0.1.11", "autoprefixer": "6.7.7", - "chalk": "2.1.0", - "circular-dependency-plugin": "3.0.0", - "common-tags": "1.4.0", - "core-object": "3.1.4", - "css-loader": "0.28.5", + "chalk": "2.2.2", + "circular-dependency-plugin": "4.3.0", + "common-tags": "1.5.1", + "copy-webpack-plugin": "4.3.0", + "core-object": "3.1.5", + "css-loader": "0.28.7", "cssnano": "3.10.0", "denodeify": "1.2.1", - "diff": "3.3.0", - "ember-cli-normalize-entity-name": "1.0.0", "ember-cli-string-utils": "1.1.0", "exports-loader": "0.6.4", - "extract-text-webpack-plugin": "3.0.0", - "file-loader": "0.10.1", - "fs-extra": "4.0.1", - "get-caller-file": "1.0.2", + "extract-text-webpack-plugin": "3.0.2", + "file-loader": "1.1.5", + "fs-extra": "4.0.3", "glob": "7.1.2", - "heimdalljs": "0.2.5", - "heimdalljs-logger": "0.1.9", "html-webpack-plugin": "2.30.1", - "inflection": "1.12.0", - "inquirer": "3.2.2", - "isbinaryfile": "3.0.2", "istanbul-instrumenter-loader": "2.0.0", "karma-source-map-support": "1.2.0", - "less": "2.7.2", + "less": "2.7.3", "less-loader": "4.0.5", - "license-webpack-plugin": "0.5.1", + "license-webpack-plugin": "1.1.1", + "loader-utils": "1.1.0", "lodash": "4.17.4", "memory-fs": "0.4.1", "minimatch": "3.0.4", "node-modules-path": "1.0.1", - "node-sass": "4.5.3", + "node-sass": "4.7.2", "nopt": "4.0.1", "opn": "5.1.0", "portfinder": "1.0.13", - "postcss-loader": "1.3.3", - "postcss-url": "5.1.2", + "postcss-custom-properties": "6.2.0", + "postcss-loader": "2.0.9", + "postcss-url": "7.3.0", "raw-loader": "0.5.1", - "resolve": "1.4.0", - "rsvp": "3.6.2", - "rxjs": "5.4.3", + "resolve": "1.5.0", + "rxjs": "5.5.5", "sass-loader": "6.0.6", - "script-loader": "0.7.0", "semver": "5.4.1", "silent-error": "1.1.0", - "source-map-loader": "0.2.1", + "source-map-loader": "0.2.3", "source-map-support": "0.4.16", "style-loader": "0.13.2", "stylus": "0.54.5", "stylus-loader": "3.0.1", - "temp": "0.8.3", - "typescript": "2.3.4", - "url-loader": "0.5.9", - "walk-sync": "0.3.2", - "webpack": "3.4.1", - "webpack-dev-middleware": "1.12.0", - "webpack-dev-server": "2.5.1", - "webpack-merge": "4.1.0", + "uglifyjs-webpack-plugin": "1.1.4", + "url-loader": "0.6.2", + "webpack": "3.10.0", + "webpack-dev-middleware": "1.12.2", + "webpack-dev-server": "2.9.7", + "webpack-merge": "4.1.1", + "webpack-sources": "1.1.0", + "webpack-subresource-integrity": "1.0.3", "zone.js": "0.8.17" + }, + "dependencies": { + "chalk": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", + "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "rxjs": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.5.tgz", + "integrity": "sha512-D/MfQnPMBk8P8gfwGxvCkuaWBcG58W7dUMT//URPoYzIbDEKT0GezdirkK5whMgKFBATfCoTpxO8bJQGJ04W5A==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + } } }, "@angular/common": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-4.3.6.tgz", - "integrity": "sha1-7TfpMHx1Bt2DR5fBps9nXlK1tu4=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.1.1.tgz", + "integrity": "sha512-SFRzdDthoiKaMLuV+TAwjKXFWwTRFGuidlWC3BhUf8/HzNSePAdvfdQcqbEaE5buMn403OV105S9Tyx5tILQeA==", "requires": { "tslib": "1.7.1" } }, "@angular/compiler": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-4.3.6.tgz", - "integrity": "sha1-vhcN8Ji3HoNczt8WjV+3sj5QRbg=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.1.1.tgz", + "integrity": "sha512-k4J2kRiBjtjkDcDut2JVUpqQGLJWd8j3Don+swzZHuEklbLmsVRGM6u/fmH0K9TMwKHtC5Ycap8kj4bWXUYfwg==", "requires": { "tslib": "1.7.1" } }, "@angular/compiler-cli": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-4.3.6.tgz", - "integrity": "sha1-avpq72jdaB5hs5i+TWJw5choCxI=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.1.1.tgz", + "integrity": "sha512-X3n1V0fAsZzJDRLM2OPiOri8rrQ2ILFS0VDqPdHMa1HbpF0ZKe1Yyux2rhGSbS83a1Eanx6RqfDkrUalKEprbw==", "dev": true, "requires": { - "@angular/tsc-wrapped": "4.3.6", + "chokidar": "1.7.0", "minimist": "1.2.0", - "reflect-metadata": "0.1.10" + "reflect-metadata": "0.1.10", + "tsickle": "0.25.5" }, "dependencies": { "minimist": { @@ -130,76 +216,73 @@ } }, "@angular/core": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-4.3.6.tgz", - "integrity": "sha1-u6xj1o0Pe8s4nRKzQghlK+MofpY=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.1.1.tgz", + "integrity": "sha512-8HJ0lNM5Z+pf+JfOl5mAWgNfrdtnMhVcEGCEniJAQweKOfYCziuyB0ALkX/Q6jGmd2IshR36SarwCYEc5ttt/w==", "requires": { "tslib": "1.7.1" } }, "@angular/forms": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-4.3.6.tgz", - "integrity": "sha1-DyDEWXwWoVJ0XXzZVVmFWgpcZoc=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.1.1.tgz", + "integrity": "sha512-4iN/8N0DgnV82XIb/8PqlFIGrog8BHJlzQ9sdAlpT29biPFezFpqpsXkjLBouBc7oBFTgoyXMgWDj8IGRmwLGQ==", "requires": { "tslib": "1.7.1" } }, "@angular/http": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-4.3.6.tgz", - "integrity": "sha1-Vjgn0afV6J47fYa3f7vTZ7LAhZE=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.1.1.tgz", + "integrity": "sha512-oeiLX00TaFlGS5Y4EAGnxxVitN8T9X8olhSC+XDDAAL3JHTAyh4dj7me8vNZk1VaqPFa9AXu4D34vu1Zsm0c1g==", "requires": { "tslib": "1.7.1" } }, "@angular/language-service": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-4.3.6.tgz", - "integrity": "sha1-cc8tu0ZhVo89EqnA5LngQ++TvTo=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-5.1.1.tgz", + "integrity": "sha512-DWdUdOV8hxBs7D84V6pNR8KJbfdAWlwO1tzL2Rfpsdv/ZpkIFAOIc4BWpF7XhOtFqlnO8IVy5gg3ZFdUrnWu+w==", "dev": true }, + "@angular/material": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-5.0.1.tgz", + "integrity": "sha512-k95i58ZIVneLE61a5JliM10NSasy9P5C2JJUESo3s/rxt9dq/9XOWpUvNCy49OHYBRFJBlsyrLM6E2V7/tmq4w==", + "requires": { + "tslib": "1.7.1" + } + }, "@angular/platform-browser": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-4.3.6.tgz", - "integrity": "sha1-YVKx87eNAkb8XhUOL3ue1DN+O6Y=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.1.1.tgz", + "integrity": "sha512-QpkNXoO2pqURQJxXPhZo6RFeirKbr56O0SwoMpYfXGGN1qEIicoWZHobCUTp7/jvjx5Xjc7886Fvu/qJrE7wVA==", "requires": { "tslib": "1.7.1" } }, "@angular/platform-browser-dynamic": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.3.6.tgz", - "integrity": "sha1-nqv4JvEZyY+Fwqlu3LGKsAtO+xw=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.1.1.tgz", + "integrity": "sha512-xnin1eK5nF7EO4tYZvRlhT28DyhL3p4NKWsZQwfqyBwSF0T2mJ1vjhjCZVT0MmaOyt5D+0eUkHIhBDqeZyBMMQ==", "requires": { "tslib": "1.7.1" } }, - "@angular/platform-server": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-4.4.5.tgz", - "integrity": "sha1-dvI7LDhO1zldwXk8+Fl4iDuiy1A=", - "requires": { - "parse5": "3.0.2", - "tslib": "1.7.1", - "xhr2": "0.1.4" - } - }, "@angular/router": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-4.3.6.tgz", - "integrity": "sha1-ZAM+20/NoIoyPnUztKGCDA8o0TA=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.1.1.tgz", + "integrity": "sha512-96mBZS1b1Dt7HFOGKh5zI/1U6F3zT4cdjIaBmcCKkbyKhs3WRAPXxxCkuCwr6lWmBeQt4iEvSdXiHQbD0iCG7Q==", "requires": { "tslib": "1.7.1" } }, - "@angular/tsc-wrapped": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@angular/tsc-wrapped/-/tsc-wrapped-4.3.6.tgz", - "integrity": "sha1-GqZuCrLEeZpK0UtnXhOVOqX81DY=", - "dev": true, + "@covalent/core": { + "version": "1.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@covalent/core/-/core-1.0.0-rc.1.tgz", + "integrity": "sha1-majfr1PoModZlV7EBM4KwMjmDSU=", "requires": { - "tsickle": "0.21.6" + "tslib": "1.7.1" } }, "@ngtools/json-schema": { @@ -209,87 +292,125 @@ "dev": true }, "@ngtools/webpack": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.6.1.tgz", - "integrity": "sha512-a+nmdxKadC7Fz6NkolsAUzutjdajL3tupEfvJccwaBtmok/JJOps8a4lZnWKMTb/3+zsg8xZIGlSEXrTwPLNmA==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.9.1.tgz", + "integrity": "sha512-+Fa/cpwiVnQuOMUUVmBH7+/xkhZHG/uEL60FBt6Pv8yFdLoXkgYPllJKsph5uWGpv40/zlnDYQv7k7yngeCX2A==", "dev": true, "requires": { + "chalk": "2.2.2", + "enhanced-resolve": "3.4.1", "loader-utils": "1.1.0", "magic-string": "0.22.4", - "source-map": "0.5.7" + "semver": "5.4.1", + "source-map": "0.5.7", + "tree-kill": "1.2.0" + }, + "dependencies": { + "chalk": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", + "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + } } }, - "@ngui/auto-complete": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@ngui/auto-complete/-/auto-complete-0.16.0.tgz", - "integrity": "sha1-s02xfjG4DlhKx5uqc45AWsurEsc=", - "requires": { - "@ngui/utils": "0.8.1" - } + "@ngx-translate/core": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@ngx-translate/core/-/core-9.0.1.tgz", + "integrity": "sha1-AA8thjxMlMgY4UFu9DzKLFwMWEg=" }, - "@ngui/utils": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@ngui/utils/-/utils-0.8.1.tgz", - "integrity": "sha1-jxq5qCbjXrC68XQd2UOOgoT8Tvg=", - "requires": { - "@types/js-beautify": "0.0.28", - "js-beautify": "1.7.4" - } + "@ngx-translate/http-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ngx-translate/http-loader/-/http-loader-2.0.0.tgz", + "integrity": "sha1-nBbQfNBwxnraJwoulAKB64JrP0M=" }, - "@types/gapi": { - "version": "0.0.35", - "resolved": "https://registry.npmjs.org/@types/gapi/-/gapi-0.0.35.tgz", - "integrity": "sha512-6E+WHil3a2+ZQXxa+2Fg9WMi1SwVx9KXT3P/7VmfTwK9Uqw2F+TQ97Ig2yJ7cOa0fUEk4qgdQNKP4rzKZfNMOQ==" - }, - "@types/gapi.auth2": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/@types/gapi.auth2/-/gapi.auth2-0.0.31.tgz", - "integrity": "sha1-P5F/mcHxjgv05HghTYME/60cXe8=", - "requires": { - "@types/gapi": "0.0.35" - } - }, - "@types/jasmine": { - "version": "2.5.54", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.54.tgz", - "integrity": "sha512-B9YofFbUljs19g5gBKUYeLIulsh31U5AK70F41BImQRHEZQGm4GcN922UvnYwkduMqbC/NH+9fruWa/zrqvHIg==", - "dev": true - }, - "@types/jasminewd2": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.2.tgz", - "integrity": "sha1-X2jh5pe/ELxv2Mvy4Aaj1nEsW2Q=", + "@schematics/angular": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.1.11.tgz", + "integrity": "sha512-jYTantZjdYeDjxh9ZLYvGbDI0VeUxgSrcBjHvnHqMNe+YGJenY988ifWCwzjmOowj57maLrQQGrdoO7oUeNdyw==", "dev": true, "requires": { - "@types/jasmine": "2.5.54" + "@angular-devkit/core": "0.0.22" } }, - "@types/js-beautify": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@types/js-beautify/-/js-beautify-0.0.28.tgz", - "integrity": "sha1-MiC7vZL8DnKLpTBr+kSwBIghYS0=" - }, - "@types/node": { - "version": "6.0.90", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.90.tgz", - "integrity": "sha512-tXoGRVdi7wZX7P1VWoV9Wfk0uYDOAHdEYXAttuWgSrN76Q32wQlSrMX0Rgyv3RTEaQY2ZLQrzYHVM2e8rfo8sA==" - }, - "@types/q": { - "version": "0.0.32", - "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", - "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "@schematics/schematics": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@schematics/schematics/-/schematics-0.0.11.tgz", + "integrity": "sha512-HAXgAIuuAGjiIKohGlRUkmUTWYtNmclR12KHlQQxT9pHFdEb2OrpHjUp2YoV32jiU6jIZm4pf3ODwlPA0VbwnA==", "dev": true }, - "@types/selenium-webdriver": { - "version": "2.53.42", - "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.42.tgz", - "integrity": "sha1-dMt3+2BS7a/yqJhN2v2I1BnyXKw=", + "@types/arrify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/arrify/-/arrify-1.0.2.tgz", + "integrity": "sha512-gB1Oqypj/WbMjnWyCcvQdynRyfusKtqzUpt+EN/OtgFcjikC7ZV4qzS3SLbO1Ai2B0iVSgWvwR9A49lZGfivYg==", + "dev": true + }, + "@types/diff": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/diff/-/diff-3.2.2.tgz", + "integrity": "sha512-q3zfJvaTroV5BjAAR+peTHEGAAhGrPX0z2EzCzpt2mwFA+qzUn2nigJLqSekXRtdULKmT8am7zjvTMZSapIgHw==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, + "@types/mkdirp": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", + "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", + "dev": true, + "requires": { + "@types/node": "8.5.1" + } + }, + "@types/node": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.1.tgz", + "integrity": "sha512-SrmAO+NhnsuG/6TychSl2VdxBZiw/d6V+8j+DFo8O3PwFi+QeYXWHhAw+b170aSc6zYab6/PjEWRZHIDN9mNUw==", + "dev": true + }, + "@types/source-map-support": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.4.0.tgz", + "integrity": "sha512-9oVAi1Jlr274pbMGPEe0S3IPImV9knVNafa6E4MookD/fjOZAE6EmLkFX5ZjtZ9OXNPi2FCIZzUSMvwAUUKeSg==", + "dev": true, + "requires": { + "@types/node": "8.5.1" + } + }, + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=", + "dev": true + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", + "dev": true + }, + "@types/v8flags": { + "version": "github:types/npm-v8flags#de224ae1cd5fd7dbb4e7158a6cc7a29e5315930d", + "dev": true + }, + "@types/yn": { + "version": "github:types/npm-yn#ca75f6c82940fae6a06fb41d2d37a6aa9b4ea8e9", "dev": true }, "abbrev": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=" + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "dev": true }, "accepts": { "version": "1.3.4", @@ -297,14 +418,14 @@ "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", "dev": true, "requires": { - "mime-types": "2.1.16", + "mime-types": "2.1.17", "negotiator": "0.6.1" } }, "acorn": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz", - "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", "dev": true }, "acorn-dynamic-import": { @@ -324,52 +445,22 @@ } } }, - "adm-zip": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz", - "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=", - "dev": true - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, - "agent-base": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", - "integrity": "sha1-1t4Q1a9hMtW9aSQn1G/FOFOQlMc=", - "dev": true, - "requires": { - "extend": "3.0.1", - "semver": "5.0.3" - }, - "dependencies": { - "semver": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", - "integrity": "sha1-d0Zt5YnNXTyV8TiqeLxWmjy10no=", - "dev": true - } - } - }, "ajv": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.2.tgz", - "integrity": "sha1-R8aNaehvXZUxA7AHSpQw3GPaXjk=", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.1.tgz", + "integrity": "sha1-s4u4h22ehr7plJVqBOch6IskjrI=", "dev": true, "requires": { "co": "4.6.0", "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "ajv-keywords": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", - "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", "dev": true }, "align-text": { @@ -395,295 +486,6 @@ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true }, - "angular-2-data-table": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/angular-2-data-table/-/angular-2-data-table-0.1.2.tgz", - "integrity": "sha1-eiz/jPxKpxSpfTMwmLkRaqQourw=" - }, - "angular-4-data-table-bootstrap-4": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/angular-4-data-table-bootstrap-4/-/angular-4-data-table-bootstrap-4-0.2.0.tgz", - "integrity": "sha512-gw+3z96SSXZZFSjzAXEx69JecBZ9O5K2uMl/asCc7HFrLeS9Q2T0+HGrb4syODEBhJtey0JpzX4GGBotXuHfjg==", - "requires": { - "@angular/common": "4.3.6", - "@angular/core": "4.3.6", - "@angular/forms": "4.3.6", - "@angular/platform-browser": "4.3.6", - "@angular/platform-browser-dynamic": "4.3.6", - "@angular/platform-server": "4.4.5", - "@types/node": "8.0.44", - "rxjs": "5.4.3", - "ts-node": "3.3.0", - "zone.js": "0.8.17" - }, - "dependencies": { - "@types/node": { - "version": "8.0.44", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.44.tgz", - "integrity": "sha512-56TeARKE2uMi7xWhpRRws/QdnpSVx9i7E8esGiPYoj90jnonGfmV1vwRLvHWYjPxF5u5l7p5fgdKwdse+VeAQQ==" - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "ts-node": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.3.0.tgz", - "integrity": "sha1-wTxqMCTjC+EYDdUwOPwgkonUv2k=", - "requires": { - "arrify": "1.0.1", - "chalk": "2.1.0", - "diff": "3.3.0", - "make-error": "1.3.0", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map-support": "0.4.16", - "tsconfig": "6.0.0", - "v8flags": "3.0.0", - "yn": "2.0.0" - } - } - } - }, - "angular-google-signin": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/angular-google-signin/-/angular-google-signin-0.1.5.tgz", - "integrity": "sha1-VQbMWeTCRWIOsJDoOGnH9MoXUTw=", - "requires": { - "@types/gapi.auth2": "0.0.31" - } - }, - "angular-ide": { - "version": "0.9.31", - "resolved": "https://registry.npmjs.org/angular-ide/-/angular-ide-0.9.31.tgz", - "integrity": "sha1-UmTKq8vxhsQTSmeyP8ncJ0kaNho=", - "dev": true, - "requires": { - "angular-ide-loader": "0.9.13", - "chalk": "1.1.3", - "chokidar": "1.6.1", - "commander": "2.9.0", - "debug": "2.6.0", - "decompress-zip": "0.3.0", - "fs-extra": "2.1.2", - "homedir": "0.6.0", - "intercept-stdout": "0.1.2", - "jju": "1.3.0", - "moment": "2.18.1", - "mt-downloader": "2.2.1", - "q": "1.4.1", - "rxjs": "5.0.1", - "semver": "5.3.0", - "slashes": "1.0.5", - "tar-fs": "1.13.2", - "winston": "2.3.1", - "ws": "1.1.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "chokidar": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.6.1.tgz", - "integrity": "sha1-L0RHq16W5Q+z14n9kNTHLg5McMI=", - "dev": true, - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "debug": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", - "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "fs-extra": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", - "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "moment": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.18.1.tgz", - "integrity": "sha1-w2GT3Tzhwu7SrbfIAtu8d6gbHA8=", - "dev": true - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - }, - "rxjs": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.0.1.tgz", - "integrity": "sha1-Omm9+fDKCphjAzcNRwj3K9+sg1Y=", - "dev": true, - "requires": { - "symbol-observable": "1.0.4" - } - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "ws": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz", - "integrity": "sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg=", - "dev": true, - "requires": { - "options": "0.0.6", - "ultron": "1.0.2" - } - } - } - }, - "angular-ide-loader": { - "version": "0.9.13", - "resolved": "https://registry.npmjs.org/angular-ide-loader/-/angular-ide-loader-0.9.13.tgz", - "integrity": "sha1-VRqFc7ImmJ1YolwNHTRzDRWS5sE=", - "dev": true, - "requires": { - "slashes": "1.0.5", - "typescript": "2.3.4" - } - }, - "angular2-datatable": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/angular2-datatable/-/angular2-datatable-0.6.0.tgz", - "integrity": "sha1-ygCPdAh/DLh9pXCe0vLR0GF3JjI=", - "requires": { - "lodash": "4.17.4" - } - }, - "angular2-draggable": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/angular2-draggable/-/angular2-draggable-1.0.7.tgz", - "integrity": "sha1-NeH4HIzPPdljDyMmVYuILMEvDyk=" - }, - "angular2-number-picker": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/angular2-number-picker/-/angular2-number-picker-0.8.8.tgz", - "integrity": "sha1-YmlNjaSBfarjZU43O8zevYKZKCw=", - "requires": { - "@angular/common": "2.4.10", - "@angular/compiler": "2.4.10", - "@angular/core": "2.4.10", - "@angular/forms": "2.4.10", - "@angular/platform-browser": "2.4.10", - "@angular/platform-browser-dynamic": "2.4.10", - "rxjs": "5.4.3", - "zone.js": "0.7.8" - }, - "dependencies": { - "@angular/common": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-2.4.10.tgz", - "integrity": "sha1-o6aC0iKPow7CPdDrV8joh/uiaZc=" - }, - "@angular/compiler": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-2.4.10.tgz", - "integrity": "sha1-9R/TSCCyoCx8th+89JhzxYBW+ww=" - }, - "@angular/core": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-2.4.10.tgz", - "integrity": "sha1-C4MgplBlll2ZhkWx9c0892m0Qeo=" - }, - "@angular/forms": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-2.4.10.tgz", - "integrity": "sha1-BiEzqq3h87PJYvFZMgjFQbYi/QY=" - }, - "@angular/platform-browser": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-2.4.10.tgz", - "integrity": "sha1-y/JWCBSPtP/vlsxQBbpdez4JOQY=" - }, - "@angular/platform-browser-dynamic": { - "version": "2.4.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-2.4.10.tgz", - "integrity": "sha1-jfJd7CsGrcaQzJvCZEjezK682Ow=" - }, - "zone.js": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.7.8.tgz", - "integrity": "sha1-Tz/og01EWX8mOQU6D6Q43zT//e0=" - } - } - }, - "angular2-uuid": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/angular2-uuid/-/angular2-uuid-1.1.1.tgz", - "integrity": "sha1-cvA81TK39AAy6x7PufhFc4S+lW4=" - }, - "ansi-escapes": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz", - "integrity": "sha1-W65SvkJIeN2Xg+iRDj/Cki6DyBs=", - "dev": true - }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", @@ -697,15 +499,18 @@ "dev": true }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } }, "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { "micromatch": "2.3.11", @@ -718,19 +523,10 @@ "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", "dev": true }, - "append-transform": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "1.0.0" - } - }, "aproba": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.2.tgz", - "integrity": "sha512-ZpYajIfO0j2cOFTO955KUMIKNmj6zhX8kVztMAxFsDaMwz+9Z9SV0uou2pC9HJqcfpffOsjnbrDMvkNy+9RXPw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "are-we-there-yet": { @@ -741,38 +537,6 @@ "requires": { "delegates": "1.0.0", "readable-stream": "2.3.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } } }, "argparse": { @@ -796,7 +560,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", "dev": true }, "array-find-index": { @@ -811,11 +575,15 @@ "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", "dev": true }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.10.0" + } }, "array-union": { "version": "1.0.2", @@ -838,16 +606,11 @@ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, - "arraybuffer.slice": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", - "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "asap": { "version": "2.0.6", @@ -863,9 +626,9 @@ "dev": true }, "asn1.js": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", + "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", "dev": true, "requires": { "bn.js": "4.11.8", @@ -889,9 +652,9 @@ "dev": true }, "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", "dev": true, "requires": { "lodash": "4.17.4" @@ -923,10 +686,10 @@ "dev": true, "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000717", + "caniuse-db": "1.0.30000783", "normalize-range": "0.1.2", "num2fraction": "1.2.2", - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-value-parser": "3.3.0" } }, @@ -953,6 +716,12 @@ "js-tokens": "3.0.2" }, "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -1014,7 +783,7 @@ "dev": true, "requires": { "core-js": "2.5.0", - "regenerator-runtime": "0.11.0" + "regenerator-runtime": "0.11.1" } }, "babel-template": { @@ -1041,7 +810,7 @@ "babel-runtime": "6.26.0", "babel-types": "6.26.0", "babylon": "6.18.0", - "debug": "2.6.8", + "debug": "2.6.9", "globals": "9.18.0", "invariant": "2.2.2", "lodash": "4.17.4" @@ -1065,22 +834,10 @@ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "base64-js": { @@ -1089,12 +846,6 @@ "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", "dev": true }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", - "dev": true - }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -1111,82 +862,16 @@ "tweetnacl": "0.14.5" } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, "big.js": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz", - "integrity": "sha1-TK2iGTZS6zyp7I5VyQFWacmAaXg=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", "dev": true }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dev": true, - "requires": { - "buffers": "0.1.1", - "chainsaw": "0.1.0" - } - }, "binary-extensions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", - "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", - "dev": true - }, - "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", - "dev": true, - "requires": { - "readable-stream": "2.3.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, - "blob": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", - "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, "block-stream": { @@ -1199,27 +884,11 @@ "inherits": "2.0.3" } }, - "blocking-proxy": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-0.0.5.tgz", - "integrity": "sha1-RikF4Nz76pcPQao3Ij3anAexkSs=", - "dev": true, - "requires": { - "minimist": "1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, "bluebird": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "dev": true }, "bn.js": { "version": "4.11.8", @@ -1228,42 +897,27 @@ "dev": true }, "body-parser": { - "version": "1.17.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", - "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", "dev": true, "requires": { - "bytes": "2.4.0", - "content-type": "1.0.2", - "debug": "2.6.7", + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", "depd": "1.1.1", "http-errors": "1.6.2", - "iconv-lite": "0.4.15", + "iconv-lite": "0.4.19", "on-finished": "2.3.0", - "qs": "6.4.0", - "raw-body": "2.2.0", + "qs": "6.5.1", + "raw-body": "2.3.2", "type-is": "1.6.15" }, "dependencies": { - "bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", - "dev": true - }, - "debug": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", - "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "iconv-lite": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", "dev": true } } @@ -1278,7 +932,7 @@ "deep-equal": "1.0.1", "dns-equal": "1.0.0", "dns-txt": "2.0.2", - "multicast-dns": "6.1.1", + "multicast-dns": "6.2.1", "multicast-dns-service-types": "1.1.0" } }, @@ -1297,11 +951,6 @@ "hoek": "2.16.3" } }, - "bootstrap": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz", - "integrity": "sha1-WjiTlFSfIzMIdaOxUGVldPip63E=" - }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -1310,14 +959,6 @@ "requires": { "balanced-match": "1.0.0", "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - } } }, "braces": { @@ -1338,16 +979,17 @@ "dev": true }, "browserify-aes": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz", - "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", "dev": true, "requires": { "buffer-xor": "1.0.3", "cipher-base": "1.0.4", "create-hash": "1.1.3", - "evp_bytestokey": "1.0.2", - "inherits": "2.0.3" + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" } }, "browserify-cipher": { @@ -1356,9 +998,9 @@ "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", "dev": true, "requires": { - "browserify-aes": "1.0.6", + "browserify-aes": "1.1.1", "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.2" + "evp_bytestokey": "1.0.3" } }, "browserify-des": { @@ -1398,12 +1040,12 @@ } }, "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "0.2.9" + "pako": "1.0.6" } }, "browserslist": { @@ -1412,8 +1054,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000717", - "electron-to-chromium": "1.3.18" + "caniuse-db": "1.0.30000783", + "electron-to-chromium": "1.3.28" } }, "buffer": { @@ -1425,14 +1067,6 @@ "base64-js": "1.2.1", "ieee754": "1.1.8", "isarray": "1.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - } } }, "buffer-indexof": { @@ -1447,12 +1081,6 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "dev": true - }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -1466,16 +1094,31 @@ "dev": true }, "bytes": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.5.0.tgz", - "integrity": "sha1-TJQj6i0lLCcMQbK97+/5u2tiwGo=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true + "cacache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.1.tgz", + "integrity": "sha512-dRHYcs9LvG9cHgdPzjiI+/eS7e1xRhULrcyOx04RZQsszNJXU2SL9CyG60yLnge282Qq5nwTv+ieK2fH+WPZmA==", + "dev": true, + "requires": { + "bluebird": "3.5.0", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.1", + "mississippi": "1.3.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.0.0", + "unique-filename": "1.1.0", + "y18n": "3.2.1" + } }, "camel-case": { "version": "3.0.0", @@ -1483,7 +1126,7 @@ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "dev": true, "requires": { - "no-case": "2.3.1", + "no-case": "2.3.2", "upper-case": "1.1.3" } }, @@ -1510,22 +1153,23 @@ "dev": true, "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000717", + "caniuse-db": "1.0.30000783", "lodash.memoize": "4.1.2", "lodash.uniq": "4.5.0" } }, "caniuse-db": { - "version": "1.0.30000717", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000717.tgz", - "integrity": "sha1-J931/szdM4yZpiyXiMJpT5n2ftc=", + "version": "1.0.30000783", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000783.tgz", + "integrity": "sha1-FrMNRyZqT1FcxprgMWtnDJYDzb4=", "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "dev": true, + "optional": true }, "center-align": { "version": "0.1.3", @@ -1545,19 +1189,11 @@ } } }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dev": true, - "requires": { - "traverse": "0.3.9" - } - }, "chalk": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true, "requires": { "ansi-styles": "3.2.0", "escape-string-regexp": "1.0.5", @@ -1568,6 +1204,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, "requires": { "color-convert": "1.9.0" } @@ -1575,12 +1212,14 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true }, "supports-color": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", + "dev": true, "requires": { "has-flag": "2.0.0" } @@ -1601,8 +1240,31 @@ "is-glob": "2.0.1", "path-is-absolute": "1.0.1", "readdirp": "2.1.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } } }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -1614,20 +1276,26 @@ } }, "circular-dependency-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-3.0.0.tgz", - "integrity": "sha1-m2hpLjWw41EJmNAWS2rlARvqV2A=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-4.3.0.tgz", + "integrity": "sha512-L3W9L1S0wC64rq+QSaZzmWnJW7cVBgimxI2lNEFEX5biwlRG8EHRM68JFi+CX5ZkCGUWJHIpnhdVs181Zlq3wA==", "dev": true }, "clap": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.0.tgz", - "integrity": "sha1-WckP4+E3EEdG/xlGmiemNP9oyFc=", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", + "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "dev": true, "requires": { "chalk": "1.1.3" }, "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -1650,29 +1318,14 @@ } }, "clean-css": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.7.tgz", - "integrity": "sha1-ua6k+FZ5iJzz6ui0A0nsTr390DI=", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", + "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", "dev": true, "requires": { "source-map": "0.5.7" } }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -1682,34 +1335,12 @@ "string-width": "1.0.2", "strip-ansi": "3.0.1", "wrap-ansi": "2.1.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } } }, "clone": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", - "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", "dev": true }, "clone-deep": { @@ -1736,7 +1367,7 @@ "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "dev": true, "requires": { - "q": "1.5.0" + "q": "1.5.1" } }, "code-point-at": { @@ -1746,9 +1377,9 @@ "dev": true }, "codelyzer": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-3.1.2.tgz", - "integrity": "sha1-n/HwQfubXuXb60W6hm368EmDrwQ=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-4.0.2.tgz", + "integrity": "sha512-nYwOr49+IV09e7C4aXkVALRz0+XpHqZiUUcxHuDZH4xP1FBcHINyr3qvVhv5Gfm7XRmoLx32tsIhrQhW/gBcog==", "dev": true, "requires": { "app-root-path": "2.0.1", @@ -1765,7 +1396,7 @@ "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "dev": true, "requires": { - "clone": "1.0.2", + "clone": "1.0.3", "color-convert": "1.9.0", "color-string": "0.3.0" } @@ -1774,6 +1405,7 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true, "requires": { "color-name": "1.1.3" } @@ -1781,7 +1413,8 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "color-string": { "version": "0.3.0", @@ -1809,15 +1442,6 @@ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, - "combine-lists": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", - "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - }, "combined-stream": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", @@ -1830,57 +1454,46 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true }, "common-tags": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.4.0.tgz", - "integrity": "sha1-EYe+Tz1M8MBCfUP3Tu8fc1AWFMA=", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.5.1.tgz", + "integrity": "sha512-NrUYGY5TApAk9KB+IZXkR3GR4tA3g26HDsoiGt4kCMHZ727gOGkC+UNfq0Z22jE15bLkc/6RV5Jw1RBW6Usg6A==", "dev": true, "requires": { "babel-runtime": "6.26.0" } }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", - "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", - "dev": true - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "compressible": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.11.tgz", - "integrity": "sha1-FnGKdd4oPtjmBAQWJaIGRYZ5fYo=", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", + "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", "dev": true, "requires": { - "mime-db": "1.29.0" + "mime-db": "1.30.0" } }, "compression": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.0.tgz", - "integrity": "sha1-AwyfGY8WQ6BX13anOOki2kNzAS0=", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", + "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", "dev": true, "requires": { "accepts": "1.3.4", - "bytes": "2.5.0", - "compressible": "2.0.11", - "debug": "2.6.8", + "bytes": "3.0.0", + "compressible": "2.0.12", + "debug": "2.6.9", "on-headers": "1.0.1", "safe-buffer": "5.1.1", - "vary": "1.1.1" + "vary": "1.1.2" } }, "concat-map": { @@ -1889,31 +1502,21 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "config-chain": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", - "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", - "requires": { - "ini": "1.3.4", - "proto-list": "1.2.4" - } - }, - "connect": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.3.tgz", - "integrity": "sha512-GLSZqgjVxPvGYVD/2vz//gS201MEXk4b7t3nHV6OVnTdDNWi/Gm7Rpxs/ybvljPWvULys/wrzIV3jB3YvEc3nQ==", + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true, "requires": { - "debug": "2.6.8", - "finalhandler": "1.0.4", - "parseurl": "1.3.1", - "utils-merge": "1.0.0" + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" } }, "connect-history-api-fallback": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz", - "integrity": "sha1-5R0X+PDvDbkKZP20feMFFVbp8Wk=", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", "dev": true }, "console-browserify": { @@ -1944,15 +1547,15 @@ "dev": true }, "content-type": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", - "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, "cookie": { @@ -1967,15 +1570,61 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "copy-webpack-plugin": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.3.0.tgz", + "integrity": "sha512-5o1/xyWm8OYDmLFKAWMuPU3A/jZ4Z6kZSZGh36KD2XmtxnRa8lQyLx7bCNQm08BPaR/oqUdtJOr9jWfnYINp9g==", + "dev": true, + "requires": { + "cacache": "10.0.1", + "find-cache-dir": "1.0.0", + "globby": "7.1.1", + "is-glob": "4.0.0", + "loader-utils": "0.2.17", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "p-limit": "1.1.0", + "pify": "3.0.0", + "serialize-javascript": "1.4.0" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } + } + }, "core-js": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.0.tgz", "integrity": "sha1-VpwFCRi+ZIazg3VSAorgRmtxcIY=" }, "core-object": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.4.tgz", - "integrity": "sha1-bfQB6FgSS+n3Vy9MSjTGFQlS1LY=", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/core-object/-/core-object-3.1.5.tgz", + "integrity": "sha512-sA2/4+/PZ/KV6CKgjrVrrUVBKCkdDO02CUlQ0YKTQoYUwPYNOtOAcWlbYhd5v/1JqYaA6oZ4sDlOU4ppVw6Wbg==", "dev": true, "requires": { "chalk": "2.1.0" @@ -2029,7 +1678,7 @@ "cipher-base": "1.0.4", "inherits": "2.0.3", "ripemd160": "2.0.1", - "sha.js": "2.4.8" + "sha.js": "2.4.9" } }, "create-hmac": { @@ -2043,7 +1692,7 @@ "inherits": "2.0.3", "ripemd160": "2.0.1", "safe-buffer": "5.1.1", - "sha.js": "2.4.8" + "sha.js": "2.4.9" } }, "cross-spawn": { @@ -2067,9 +1716,9 @@ } }, "crypto-browserify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { "browserify-cipher": "1.0.0", @@ -2079,9 +1728,10 @@ "create-hmac": "1.1.6", "diffie-hellman": "5.0.2", "inherits": "2.0.3", - "pbkdf2": "3.0.13", + "pbkdf2": "3.0.14", "public-encrypt": "4.0.0", - "randombytes": "2.0.5" + "randombytes": "2.0.5", + "randomfill": "1.0.3" } }, "css-color-names": { @@ -2091,9 +1741,9 @@ "dev": true }, "css-loader": { - "version": "0.28.5", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.5.tgz", - "integrity": "sha512-/FJmsDD8e6xZOBHMFShN/BCjnrEybq0spYaTZ1QoZ10/jhUa1LDDojQELu/JJ1ykZZjt0nSwkYrb2Mfx3bZx3Q==", + "version": "0.28.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.7.tgz", + "integrity": "sha512-GxMpax8a/VgcfRrVy0gXD6yLd5ePYbXX/5zGgTVYp4wXtJklS8Z2VaUArJgc//f6/Dzil7BaJObdSv8eKKCPgg==", "dev": true, "requires": { "babel-code-frame": "6.26.0", @@ -2103,7 +1753,7 @@ "loader-utils": "1.1.0", "lodash.camelcase": "4.3.0", "object-assign": "4.1.1", - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-modules-extract-imports": "1.1.0", "postcss-modules-local-by-default": "1.2.0", "postcss-modules-scope": "1.1.0", @@ -2173,7 +1823,7 @@ "defined": "1.0.0", "has": "1.0.1", "object-assign": "4.1.1", - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-calc": "5.3.1", "postcss-colormin": "2.2.2", "postcss-convert-values": "2.6.1", @@ -2208,10 +1858,16 @@ "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", "dev": true, "requires": { - "clap": "1.2.0", + "clap": "1.2.3", "source-map": "0.5.7" } }, + "cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha1-QICG1AlVDCYxFVYZ6fp7ytw7mRs=", + "dev": true + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -2221,16 +1877,10 @@ "array-find-index": "1.0.2" } }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", "dev": true }, "d": { @@ -2239,7 +1889,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.29" + "es5-ext": "0.10.37" } }, "dashdash": { @@ -2259,11 +1909,6 @@ } } }, - "date-fns": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==" - }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -2271,9 +1916,9 @@ "dev": true }, "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { "ms": "2.0.0" @@ -2285,57 +1930,20 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, - "decompress-zip": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.3.0.tgz", - "integrity": "sha1-rjvLfjTGWHmt/nfhnDD4ZgK0vbA=", - "dev": true, - "requires": { - "binary": "0.3.0", - "graceful-fs": "4.1.11", - "mkpath": "0.1.0", - "nopt": "3.0.6", - "q": "1.5.0", - "readable-stream": "1.1.14", - "touch": "0.0.3" - }, - "dependencies": { - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1.1.0" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - } - } - }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", "dev": true }, - "default-require-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "strip-bom": "2.0.0" + "foreach": "2.0.5", + "object-keys": "1.0.11" } }, "defined": { @@ -2353,16 +1961,31 @@ "globby": "6.1.0", "is-path-cwd": "1.0.0", "is-path-in-cwd": "1.0.0", - "p-map": "1.1.1", + "p-map": "1.2.0", "pify": "3.0.0", - "rimraf": "2.6.1" + "rimraf": "2.6.2" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } } } }, @@ -2421,16 +2044,11 @@ "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", "dev": true }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, "diff": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.0.tgz", - "integrity": "sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg==" + "integrity": "sha512-w0XZubFWn0Adlsapj9EAWX0FqWdO4tz8kc3RiYdWLh4k/V8PTb6i0SMgXt0vRM3zyKnT8tKO7mUlieRQHIjMNg==", + "dev": true }, "diffie-hellman": { "version": "5.0.2", @@ -2439,42 +2057,18 @@ "dev": true, "requires": { "bn.js": "4.11.8", - "miller-rabin": "4.0.0", + "miller-rabin": "4.0.1", "randombytes": "2.0.5" } }, - "directory-encoder": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/directory-encoder/-/directory-encoder-0.7.2.tgz", - "integrity": "sha1-WbTiqk8lQi9sY7UntGL14tDdLFg=", + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", "dev": true, "requires": { - "fs-extra": "0.23.1", - "handlebars": "1.3.0", - "img-stats": "0.5.2" - }, - "dependencies": { - "fs-extra": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.23.1.tgz", - "integrity": "sha1-ZhHbpq3yq43Jxp+rN83fiBgVfj0=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.1" - } - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - } + "arrify": "1.0.1", + "path-type": "3.0.0" } }, "dns-equal": { @@ -2519,18 +2113,6 @@ } } }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "1.0.1", - "ent": "2.2.0", - "extend": "3.0.1", - "void-elements": "2.0.1" - } - }, "dom-serializer": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", @@ -2580,6 +2162,18 @@ "domelementtype": "1.3.0" } }, + "duplexify": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", + "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "stream-shift": "1.0.0" + } + }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", @@ -2590,38 +2184,22 @@ "jsbn": "0.1.1" } }, - "editorconfig": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.13.3.tgz", - "integrity": "sha512-WkjsUNVCu+ITKDj73QDvi0trvpdDWdkDyHybDGSXPfekLCqwmpD7CP7iPbvBgosNuLcI96XTDwNa75JyFl7tEQ==", - "requires": { - "bluebird": "3.5.0", - "commander": "2.11.0", - "lru-cache": "3.2.0", - "semver": "5.4.1", - "sigmund": "1.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-3.2.0.tgz", - "integrity": "sha1-cXibO39Tmb7IVl3aOKow0qCX7+4=", - "requires": { - "pseudomap": "1.0.2" - } - } - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "ejs": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz", + "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=", + "dev": true + }, "electron-to-chromium": { - "version": "1.3.18", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.18.tgz", - "integrity": "sha1-PcyZ2j5rZl9qu8ccKK1Ros1zGpw=", + "version": "1.3.28", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.28.tgz", + "integrity": "sha1-jdTmRYCGZE6fnwoc8y4qH53/2e4=", "dev": true }, "elliptic": { @@ -2639,15 +2217,6 @@ "minimalistic-crypto-utils": "1.0.1" } }, - "ember-cli-normalize-entity-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ember-cli-normalize-entity-name/-/ember-cli-normalize-entity-name-1.0.0.tgz", - "integrity": "sha1-CxT3vLxZmqEXtf3cgeT9A8S61bc=", - "dev": true, - "requires": { - "silent-error": "1.1.0" - } - }, "ember-cli-string-utils": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz", @@ -2675,104 +2244,6 @@ "once": "1.4.0" } }, - "engine.io": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", - "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", - "dev": true, - "requires": { - "accepts": "1.3.3", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "ws": "1.1.2" - }, - "dependencies": { - "accepts": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", - "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", - "dev": true, - "requires": { - "mime-types": "2.1.16", - "negotiator": "0.6.1" - } - }, - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "engine.io-client": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", - "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "2.3.3", - "engine.io-parser": "1.3.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parsejson": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "1.1.2", - "xmlhttprequest-ssl": "1.5.3", - "yeast": "0.1.2" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "engine.io-parser": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", - "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", - "dev": true, - "requires": { - "after": "0.8.2", - "arraybuffer.slice": "0.0.6", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.4", - "has-binary": "0.1.7", - "wtf-8": "1.0.0" - } - }, "enhanced-resolve": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", @@ -2785,18 +2256,6 @@ "tapable": "0.2.8" } }, - "ensure-posix-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.0.2.tgz", - "integrity": "sha1-pls+QtC3HPxYXrd0+ZQ8jZuRsMI=", - "dev": true - }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, "entities": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", @@ -2804,12 +2263,12 @@ "dev": true }, "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.6.tgz", + "integrity": "sha512-IsORQDpaaSwcDP4ZZnHxgE85werpo34VYn1Ud3mq+eUsF593faR8oCZNXrROVkpFu2TsbrNhHin0aUrTsQ9vNw==", "dev": true, "requires": { - "prr": "0.0.0" + "prr": "1.0.1" } }, "error-ex": { @@ -2821,24 +2280,48 @@ "is-arrayish": "0.2.1" } }, - "es5-ext": { - "version": "0.10.29", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.29.tgz", - "integrity": "sha512-KXla9NXo5sdaEkGSmbFPYgjH6m75kxsthL6GDRSug/Y2OiMoYm0I9giL39j4cgmaFmAbkIFJ6gG+SGKnLSmOvA==", + "es-abstract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", + "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", "dev": true, "requires": { - "es6-iterator": "2.0.1", + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.37", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", + "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" } }, "es6-iterator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", - "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.29", + "es5-ext": "0.10.37", "es6-symbol": "3.1.1" } }, @@ -2849,8 +2332,8 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.29", - "es6-iterator": "2.0.1", + "es5-ext": "0.10.37", + "es6-iterator": "2.0.3", "es6-set": "0.1.5", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" @@ -2863,8 +2346,8 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.29", - "es6-iterator": "2.0.1", + "es5-ext": "0.10.37", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", "event-emitter": "0.3.5" } @@ -2876,7 +2359,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.29" + "es5-ext": "0.10.37" } }, "es6-weak-map": { @@ -2886,8 +2369,8 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.29", - "es6-iterator": "2.0.1", + "es5-ext": "0.10.37", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1" } }, @@ -2900,7 +2383,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escope": { "version": "3.6.0", @@ -2943,9 +2427,9 @@ "dev": true }, "etag": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.0.tgz", - "integrity": "sha1-b2Ma7zNtbEY2K1F2QETOIWvjwFE=", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, "event-emitter": { @@ -2955,7 +2439,7 @@ "dev": true, "requires": { "d": "1.0.0", - "es5-ext": "0.10.29" + "es5-ext": "0.10.37" } }, "eventemitter3": { @@ -2980,9 +2464,9 @@ } }, "evp_bytestokey": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.2.tgz", - "integrity": "sha512-ni0r0lrm7AOzsh2qC5mi9sj8S0gmj5fLNjfFpxN05FB4tAVZEKotbkjOtLPqTCX/CXT7NsUr6juZb4IFJeNNdA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { "md5.js": "1.3.4", @@ -3017,56 +2501,6 @@ } } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-braces": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", - "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", - "dev": true, - "requires": { - "array-slice": "0.2.3", - "array-unique": "0.2.1", - "braces": "0.1.5" - }, - "dependencies": { - "braces": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", - "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", - "dev": true, - "requires": { - "expand-range": "0.1.1" - } - }, - "expand-range": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", - "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", - "dev": true, - "requires": { - "is-number": "0.1.1", - "repeat-string": "0.2.2" - } - }, - "is-number": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", - "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", - "dev": true - }, - "repeat-string": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", - "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", - "dev": true - } - } - }, "expand-brackets": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", @@ -3096,39 +2530,41 @@ } }, "express": { - "version": "4.15.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.15.4.tgz", - "integrity": "sha1-Ay4iU0ic+PzgJma+yj0R7XotrtE=", + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", "dev": true, "requires": { "accepts": "1.3.4", "array-flatten": "1.1.1", + "body-parser": "1.18.2", "content-disposition": "0.5.2", - "content-type": "1.0.2", + "content-type": "1.0.4", "cookie": "0.3.1", "cookie-signature": "1.0.6", - "debug": "2.6.8", + "debug": "2.6.9", "depd": "1.1.1", "encodeurl": "1.0.1", "escape-html": "1.0.3", - "etag": "1.8.0", - "finalhandler": "1.0.4", - "fresh": "0.5.0", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "1.1.2", "on-finished": "2.3.0", - "parseurl": "1.3.1", + "parseurl": "1.3.2", "path-to-regexp": "0.1.7", - "proxy-addr": "1.1.5", - "qs": "6.5.0", + "proxy-addr": "2.0.2", + "qs": "6.5.1", "range-parser": "1.2.0", - "send": "0.15.4", - "serve-static": "1.12.4", - "setprototypeof": "1.0.3", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", "statuses": "1.3.1", "type-is": "1.6.15", - "utils-merge": "1.0.0", - "vary": "1.1.1" + "utils-merge": "1.0.1", + "vary": "1.1.2" }, "dependencies": { "array-flatten": { @@ -3138,9 +2574,9 @@ "dev": true }, "qs": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.0.tgz", - "integrity": "sha512-fjVFjW9yhqMhVGwRExCXLhJKrLlkYSaxNWdyc9rmHlrVZbk35YHH312dFd7191uQeXkI3mKLZTIbSvIeFwFemg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", "dev": true } } @@ -3151,17 +2587,6 @@ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", "dev": true }, - "external-editor": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.0.4.tgz", - "integrity": "sha1-HtkZnanL/i7y96MbL96LDRI2iXI=", - "dev": true, - "requires": { - "iconv-lite": "0.4.18", - "jschardet": "1.5.1", - "tmp": "0.0.31" - } - }, "extglob": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", @@ -3169,18 +2594,26 @@ "dev": true, "requires": { "is-extglob": "1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + } } }, "extract-text-webpack-plugin": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.0.tgz", - "integrity": "sha1-kMqnkHvESfM1AF46x1MrQbAN5hI=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz", + "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "dev": true, "requires": { - "async": "2.5.0", + "async": "2.6.0", "loader-utils": "1.1.0", "schema-utils": "0.3.0", - "webpack-sources": "1.0.1" + "webpack-sources": "1.1.0" } }, "extsprintf": { @@ -3189,18 +2622,18 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true - }, "fast-deep-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", "dev": true }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, "fastparse": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", @@ -3213,25 +2646,17 @@ "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "dev": true, "requires": { - "websocket-driver": "0.6.5" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" + "websocket-driver": "0.7.0" } }, "file-loader": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.10.1.tgz", - "integrity": "sha1-gVA0EZiR/GRB+1pkwRvJPCLd2EI=", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.5.tgz", + "integrity": "sha512-RzGHDatcVNpGISTvCpfUfOGpYuSR7HSsSg87ki+wF6rw1Hm0RALPTiAdsxAq1UwLf0RRhbe22/eHK6nhXspiOQ==", "dev": true, "requires": { - "loader-utils": "1.1.0" + "loader-utils": "1.1.0", + "schema-utils": "0.3.0" } }, "filename-regex": { @@ -3240,16 +2665,6 @@ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, - "fileset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", - "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", - "dev": true, - "requires": { - "glob": "7.1.2", - "minimatch": "3.0.4" - } - }, "fill-range": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", @@ -3263,12 +2678,6 @@ "repeat-string": "1.6.1" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", @@ -3281,36 +2690,38 @@ } }, "finalhandler": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.4.tgz", - "integrity": "sha512-16l/r8RgzlXKmFOhZpHBztvye+lAhC5SU7hXavnerC9UfZqZxxXl3BzL8MhffPT3kF61lj9Oav2LKEzh0ei7tg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", "dev": true, "requires": { - "debug": "2.6.8", + "debug": "2.6.9", "encodeurl": "1.0.1", "escape-html": "1.0.3", "on-finished": "2.3.0", - "parseurl": "1.3.1", + "parseurl": "1.3.2", "statuses": "1.3.1", "unpipe": "1.0.0" } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "commondir": "1.0.1", + "make-dir": "1.1.0", + "pkg-dir": "2.0.0" } }, - "flat": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.0.0.tgz", - "integrity": "sha512-ji/WMv2jdsE+LaznpkIF9Haax0sdpTBozrz/Dtg4qSRMfbs8oVg4ypJunIRYPiMLvH/ed6OflXbnbTIKJhtgeg==", + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, "requires": { - "is-buffer": "1.1.5" + "locate-path": "2.0.0" } }, "flatten": { @@ -3319,6 +2730,16 @@ "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", "dev": true }, + "flush-write-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", + "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -3334,6 +2755,12 @@ "for-in": "1.0.2" } }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -3348,41 +2775,54 @@ "requires": { "asynckit": "0.4.0", "combined-stream": "1.0.5", - "mime-types": "2.1.16" + "mime-types": "2.1.17" } }, "forwarded": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "dev": true }, "fresh": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz", - "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "null-check": "1.0.0" + "inherits": "2.0.3", + "readable-stream": "2.3.3" } }, "fs-extra": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.1.tgz", - "integrity": "sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dev": true, "requires": { "graceful-fs": "4.1.11", - "jsonfile": "3.0.1", + "jsonfile": "4.0.0", "universalify": "0.1.1" } }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.3" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3398,13 +2838,13 @@ "graceful-fs": "4.1.11", "inherits": "2.0.3", "mkdirp": "0.5.1", - "rimraf": "2.6.1" + "rimraf": "2.6.2" } }, "function-bind": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", - "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "gauge": { @@ -3413,7 +2853,7 @@ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "requires": { - "aproba": "1.1.2", + "aproba": "1.2.0", "console-control-strings": "1.1.0", "has-unicode": "2.0.1", "object-assign": "4.1.1", @@ -3421,28 +2861,6 @@ "string-width": "1.0.2", "strip-ansi": "3.0.1", "wide-align": "1.1.2" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } } }, "gaze": { @@ -3455,6 +2873,23 @@ "globule": "1.2.0" } }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true, + "optional": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "optional": true, + "requires": { + "is-property": "1.0.2" + } + }, "get-caller-file": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", @@ -3512,6 +2947,23 @@ "requires": { "glob-parent": "2.0.0", "is-glob": "2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } } }, "glob-parent": { @@ -3521,6 +2973,23 @@ "dev": true, "requires": { "is-glob": "2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } } }, "globals": { @@ -3530,16 +2999,17 @@ "dev": true }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", "dev": true, "requires": { "array-union": "1.0.2", + "dir-glob": "2.0.0", "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "ignore": "3.3.7", + "pify": "3.0.0", + "slash": "1.0.0" } }, "globule": { @@ -3560,70 +3030,25 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, "handle-thing": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", "dev": true }, - "handlebars": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-1.3.0.tgz", - "integrity": "sha1-npsTCpPjiUkTItl1zz7BgYw3zjQ=", - "dev": true, - "requires": { - "optimist": "0.3.7", - "uglify-js": "2.3.6" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "optional": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "uglify-js": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", - "integrity": "sha1-+gmEdwtCi3qbKoBY9GNV0U/vIRo=", - "dev": true, - "optional": true, - "requires": { - "async": "0.2.10", - "optimist": "0.3.7", - "source-map": "0.1.43" - } - } - } - }, "har-schema": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true + "dev": true, + "optional": true }, "har-validator": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "dev": true, + "optional": true, "requires": { "ajv": "4.11.8", "har-schema": "1.0.5" @@ -3634,6 +3059,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "dev": true, + "optional": true, "requires": { "co": "4.6.0", "json-stable-stringify": "1.0.1" @@ -3647,7 +3073,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.0" + "function-bind": "1.1.1" } }, "has-ansi": { @@ -3659,25 +3085,10 @@ "ansi-regex": "2.1.1" } }, - "has-binary": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", - "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", "dev": true }, "has-unicode": { @@ -3723,33 +3134,6 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, - "heimdalljs": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/heimdalljs/-/heimdalljs-0.2.5.tgz", - "integrity": "sha1-aqVDCO7nk7ZCz/nPlHgURfN3MKw=", - "dev": true, - "requires": { - "rsvp": "3.2.1" - }, - "dependencies": { - "rsvp": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.2.1.tgz", - "integrity": "sha1-B8tKXfJa3Z6Cbrxn3Mn9idsn2Eo=", - "dev": true - } - } - }, - "heimdalljs-logger": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/heimdalljs-logger/-/heimdalljs-logger-0.1.9.tgz", - "integrity": "sha1-12raTkW3u294b8nAEKaOsuL68XY=", - "dev": true, - "requires": { - "debug": "2.6.8", - "heimdalljs": "0.2.5" - } - }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -3767,16 +3151,10 @@ "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", "dev": true }, - "homedir": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/homedir/-/homedir-0.6.0.tgz", - "integrity": "sha1-KyHbZr8Ipts4JJo+/1LX0YcGrx4=", - "dev": true - }, "hosted-git-info": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", "dev": true }, "hpack.js": { @@ -3789,38 +3167,6 @@ "obuf": "1.1.1", "readable-stream": "2.3.3", "wbuf": "1.7.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } } }, "html-comment-regex": { @@ -3836,19 +3182,27 @@ "dev": true }, "html-minifier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.3.tgz", - "integrity": "sha512-iKRzQQDuTCsq0Ultbi/mfJJnR0D3AdZKTq966Gsp92xkmAPCV4Xi08qhJ0Dl3ZAWemSgJ7qZK+UsZc0gFqK6wg==", + "version": "3.5.7", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.7.tgz", + "integrity": "sha512-GISXn6oKDo7+gVpKOgZJTbHMCUI2TSGfpg/8jgencWhWJsvEmsvp3M8emX7QocsXsYznWloLib3OeSfeyb/ewg==", "dev": true, "requires": { "camel-case": "3.0.0", - "clean-css": "4.1.7", - "commander": "2.11.0", + "clean-css": "4.1.9", + "commander": "2.12.2", "he": "1.1.1", "ncname": "1.0.0", "param-case": "2.1.1", "relateurl": "0.2.7", - "uglify-js": "3.0.28" + "uglify-js": "3.2.2" + }, + "dependencies": { + "commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", + "dev": true + } } }, "html-webpack-plugin": { @@ -3858,11 +3212,11 @@ "dev": true, "requires": { "bluebird": "3.5.0", - "html-minifier": "3.5.3", + "html-minifier": "3.5.7", "loader-utils": "0.2.17", "lodash": "4.17.4", "pretty-error": "2.1.1", - "toposort": "1.0.3" + "toposort": "1.0.6" }, "dependencies": { "loader-utils": { @@ -3871,7 +3225,7 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.1.3", + "big.js": "3.2.0", "emojis-list": "2.1.0", "json5": "0.5.1", "object-assign": "4.1.1" @@ -3899,6 +3253,30 @@ "requires": { "domelementtype": "1.3.0" } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true } } }, @@ -3918,8 +3296,22 @@ "inherits": "2.0.3", "setprototypeof": "1.0.3", "statuses": "1.3.1" + }, + "dependencies": { + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } } }, + "http-parser-js": { + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", + "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", + "dev": true + }, "http-proxy": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", @@ -3942,12 +3334,6 @@ "micromatch": "2.3.11" }, "dependencies": { - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", @@ -3971,32 +3357,15 @@ } }, "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", - "dev": true - }, - "https-proxy-agent": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", - "integrity": "sha1-NffabEjOTdv6JkiRrFk+5f+GceY=", - "dev": true, - "requires": { - "agent-base": "2.1.1", - "debug": "2.6.8", - "extend": "3.0.1" - } - }, - "humanize-plus": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/humanize-plus/-/humanize-plus-1.8.2.tgz", - "integrity": "sha1-pls0RZrWNnrbs3B6gqPJ+RYWcDA=", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, "iconv-lite": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", - "integrity": "sha512-sr1ZQph3UwHTR0XftSbK85OvBbxe/abLGzEnPENCQwmHf7sck8Oyu4ob3LgBxWWxRoM+QszeUyl7jbqapu2TqA==", + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", "dev": true }, "icss-replace-symbols": { @@ -4011,34 +3380,36 @@ "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "dev": true, "requires": { - "postcss": "6.0.9" + "postcss": "6.0.14" }, "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } }, "postcss": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.9.tgz", - "integrity": "sha512-bBE2AHNEBhF23TfET6AA/lFP8ah+qHOZoFJEflFG+HgvVLdTmMOrocx/4LVVDIn3w6jUssw1q2Exk1cc9UOI8w==", + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", + "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", "dev": true, "requires": { - "chalk": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.2.1" + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" } }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -4048,6 +3419,18 @@ "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", "dev": true }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, "image-size": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", @@ -4055,15 +3438,22 @@ "dev": true, "optional": true }, - "img-stats": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/img-stats/-/img-stats-0.5.2.tgz", - "integrity": "sha1-wgNJbELy2esuWrgjL6dWurMsnis=", + "import-local": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-0.1.1.tgz", + "integrity": "sha1-sReVcqrNwRxqkQCftDDbyrX2aKg=", "dev": true, "requires": { - "xmldom": "0.1.27" + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" } }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, "in-publish": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", @@ -4092,12 +3482,6 @@ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, - "inflection": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", - "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4114,59 +3498,6 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" - }, - "inquirer": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.2.2.tgz", - "integrity": "sha512-bTKLzEHJVATimZO/YFdLrom0lRx1BHfRYskFHfIMVkGdp8+dIZaxuU+4yrsS1lcu6YWywVQVVsfvdwESzbeqHw==", - "dev": true, - "requires": { - "ansi-escapes": "2.0.0", - "chalk": "2.1.0", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.0.4", - "figures": "2.0.0", - "lodash": "4.17.4", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "intercept-stdout": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/intercept-stdout/-/intercept-stdout-0.1.2.tgz", - "integrity": "sha1-Emq/H65sUJpCipjGGmMVWQQq6f0=", - "dev": true, - "requires": { - "lodash.toarray": "3.0.2" - } - }, "internal-ip": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", @@ -4177,9 +3508,9 @@ } }, "interpret": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz", - "integrity": "sha1-y8NcYu7uc/Gat7EKgBURQBr8D5A=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, "invariant": { @@ -4204,9 +3535,9 @@ "dev": true }, "ipaddr.js": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", - "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=", "dev": true }, "is-absolute-url": { @@ -4227,13 +3558,14 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.10.0" + "binary-extensions": "1.11.0" } }, "is-buffer": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true }, "is-builtin-module": { "version": "1.0.0", @@ -4244,6 +3576,18 @@ "builtin-modules": "1.1.1" } }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", @@ -4272,9 +3616,9 @@ "dev": true }, "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-finite": { @@ -4287,18 +3631,34 @@ } }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-my-json-valid": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", + "dev": true, + "optional": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" } }, "is-number": { @@ -4322,13 +3682,13 @@ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", "dev": true, "requires": { - "is-path-inside": "1.0.0" + "is-path-inside": "1.0.1" } }, "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { "path-is-inside": "1.0.2" @@ -4361,11 +3721,21 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true, + "optional": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } }, "is-stream": { "version": "1.1.0", @@ -4382,6 +3752,12 @@ "html-comment-regex": "1.1.1" } }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -4401,15 +3777,9 @@ "dev": true }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "isbinaryfile": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", - "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { @@ -4430,33 +3800,14 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "istanbul-api": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.1.11.tgz", - "integrity": "sha1-/MC0YeKzvaceMFFVE4I4doJX2d4=", - "dev": true, - "requires": { - "async": "2.5.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-hook": "1.0.7", - "istanbul-lib-instrument": "1.7.4", - "istanbul-lib-report": "1.1.1", - "istanbul-lib-source-maps": "1.2.1", - "istanbul-reports": "1.1.1", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "once": "1.4.0" - } - }, "istanbul-instrumenter-loader": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-2.0.0.tgz", "integrity": "sha1-5UkpAKsLuoNe+oAkywC+mz7qJwA=", "dev": true, "requires": { - "convert-source-map": "1.5.0", - "istanbul-lib-instrument": "1.7.4", + "convert-source-map": "1.5.1", + "istanbul-lib-instrument": "1.9.1", "loader-utils": "0.2.17", "object-assign": "4.1.1" }, @@ -4467,7 +3818,7 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.1.3", + "big.js": "3.2.0", "emojis-list": "2.1.0", "json5": "0.5.1", "object-assign": "4.1.1" @@ -4481,19 +3832,10 @@ "integrity": "sha512-0+1vDkmzxqJIn5rcoEqapSB4DmPxE31EtI2dF2aCkV5esN9EWHxZ0dwgDClivMXJqE7zaYQxq30hj5L0nlTN5Q==", "dev": true }, - "istanbul-lib-hook": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", - "integrity": "sha512-3U2HB9y1ZV9UmFlE12Fx+nPtFqIymzrqCksrXujm3NVbAZIJg/RfYgO1XiIa0mbmxTjWpVEVlkIZJ25xVIAfkQ==", - "dev": true, - "requires": { - "append-transform": "0.4.0" - } - }, "istanbul-lib-instrument": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.4.tgz", - "integrity": "sha1-6f2SDkdn89Ge3HZeLWs/XMvQ7qg=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz", + "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", "dev": true, "requires": { "babel-generator": "6.26.0", @@ -4505,219 +3847,12 @@ "semver": "5.4.1" } }, - "istanbul-lib-report": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "integrity": "sha512-tvF+YmCmH4thnez6JFX06ujIA19WPa9YUiwjc1uALF2cv5dmE3It8b5I8Ob7FHJ70H9Y5yF+TDkVa/mcADuw1Q==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", - "integrity": "sha512-mukVvSXCn9JQvdJl8wP/iPhqig0MRtuWuD4ZNKo6vB2Ik//AmhAKe3QnPN02dmkRe3lTudFk3rzoHhwU4hb94w==", - "dev": true, - "requires": { - "debug": "2.6.8", - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "rimraf": "2.6.1", - "source-map": "0.5.7" - } - }, - "istanbul-reports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.1.tgz", - "integrity": "sha512-P8G873A0kW24XRlxHVGhMJBhQ8gWAec+dae7ZxOBzxT4w+a9ATSPvRVK3LB1RAJ9S8bg2tOyWHAGW40Zd2dKfw==", - "dev": true, - "requires": { - "handlebars": "4.0.10" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } - } - }, - "handlebars": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "jasmine": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.7.0.tgz", - "integrity": "sha1-XPC7TllLRgC7QjVWA2YhKsWuobI=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "7.1.2", - "jasmine-core": "2.7.0" - }, - "dependencies": { - "jasmine-core": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.7.0.tgz", - "integrity": "sha1-UP+MT5LY71wLLBuEbdJj7YUVIJE=", - "dev": true - } - } - }, - "jasmine-core": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.6.4.tgz", - "integrity": "sha1-3skmzQqfoof7bbXHVfpIfnTOysU=", - "dev": true - }, - "jasmine-spec-reporter": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.1.1.tgz", - "integrity": "sha1-Wm1Yq11hvqcwn7wnkjlRF1axtYg=", - "dev": true, - "requires": { - "colors": "1.1.2" - } - }, - "jasminewd2": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.1.0.tgz", - "integrity": "sha1-2llSddGuYx3nNqwKfH2Fyfc+9lI=", - "dev": true - }, - "jju": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.3.0.tgz", - "integrity": "sha1-2t2e8BkkvHKLA/L3l5vb1i96Kqo=", - "dev": true - }, - "jquery": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz", - "integrity": "sha1-XE2d5lKvbNCncBVKYxu6ErAVx4c=" - }, "js-base64": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", - "integrity": "sha1-8OgK4DmkvWVLXygfyT8EqRSn/M4=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.0.tgz", + "integrity": "sha512-Wehd+7Pf9tFvGb+ydPm9TjYjV8X1YHOVyG8QyELZxEMqOhemVwGRmoG8iQ/soqI3n8v4xn59zaLxiCJiaaRzKA==", "dev": true }, - "js-beautify": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.7.4.tgz", - "integrity": "sha512-6YX1g+lIl0/JDxjFFbgj7fz6i0bWFa2Hdc7PfGqFhynaEiYe1NJ3R1nda0VGaRiGU82OllR+EGDoWFpGr3k5Kg==", - "requires": { - "config-chain": "1.1.11", - "editorconfig": "0.13.3", - "mkdirp": "0.5.1", - "nopt": "3.0.6" - }, - "dependencies": { - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1.1.0" - } - } - } - }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -4741,12 +3876,6 @@ "dev": true, "optional": true }, - "jschardet": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-1.5.1.tgz", - "integrity": "sha512-vE2hT1D0HLZCLLclfBSfkfTTedhVj0fubHpJBHKwwUWX0nSbhPAfk+SG9rTX95BYNmau8rGFfCeaT6T5OW1C2A==", - "dev": true - }, "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", @@ -4776,6 +3905,7 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, + "optional": true, "requires": { "jsonify": "0.0.0" } @@ -4799,9 +3929,9 @@ "dev": true }, "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { "graceful-fs": "4.1.11" @@ -4811,7 +3941,15 @@ "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true + "dev": true, + "optional": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true, + "optional": true }, "jsprim": { "version": "1.4.1", @@ -4833,103 +3971,6 @@ } } }, - "karma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.0.tgz", - "integrity": "sha1-b3oaQGRG+i4YfslTmGmPTO5HYmk=", - "dev": true, - "requires": { - "bluebird": "3.5.0", - "body-parser": "1.17.2", - "chokidar": "1.7.0", - "colors": "1.1.2", - "combine-lists": "1.0.1", - "connect": "3.6.3", - "core-js": "2.5.0", - "di": "0.0.1", - "dom-serialize": "2.2.1", - "expand-braces": "0.1.2", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "http-proxy": "1.16.2", - "isbinaryfile": "3.0.2", - "lodash": "3.10.1", - "log4js": "0.6.38", - "mime": "1.3.6", - "minimatch": "3.0.4", - "optimist": "0.6.1", - "qjobs": "1.1.5", - "range-parser": "1.2.0", - "rimraf": "2.6.1", - "safe-buffer": "5.1.1", - "socket.io": "1.7.3", - "source-map": "0.5.7", - "tmp": "0.0.31", - "useragent": "2.2.1" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - } - } - }, - "karma-chrome-launcher": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.1.1.tgz", - "integrity": "sha1-IWh5xorATY1RQOmWGboEtZr9Rs8=", - "dev": true, - "requires": { - "fs-access": "1.0.1", - "which": "1.3.0" - } - }, - "karma-cli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", - "integrity": "sha1-rmw8WKMTodALRRZMRVubhs4X+WA=", - "dev": true, - "requires": { - "resolve": "1.4.0" - } - }, - "karma-coverage-istanbul-reporter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-1.3.0.tgz", - "integrity": "sha1-0ULNnFVzHJ42Pvc3To7xoxvr+ts=", - "dev": true, - "requires": { - "istanbul-api": "1.1.11", - "minimatch": "3.0.4" - } - }, - "karma-jasmine": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.0.tgz", - "integrity": "sha1-IuTAa/mhguUpTR9wXjczgRuBCs8=", - "dev": true - }, - "karma-jasmine-html-reporter": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz", - "integrity": "sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw=", - "dev": true, - "requires": { - "karma-jasmine": "1.1.0" - } - }, "karma-source-map-support": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.2.0.tgz", @@ -4939,6 +3980,12 @@ "source-map-support": "0.4.16" } }, + "killable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -4964,15 +4011,15 @@ } }, "less": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/less/-/less-2.7.2.tgz", - "integrity": "sha1-No1sxz4fsDmBGDKAkYdDxdz5s98=", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/less/-/less-2.7.3.tgz", + "integrity": "sha512-KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==", "dev": true, "requires": { - "errno": "0.1.4", + "errno": "0.1.6", "graceful-fs": "4.1.11", "image-size": "0.5.5", - "mime": "1.3.6", + "mime": "1.6.0", "mkdirp": "0.5.1", "promise": "7.3.1", "request": "2.81.0", @@ -4995,16 +4042,22 @@ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true } } }, "license-webpack-plugin": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-0.5.1.tgz", - "integrity": "sha1-aNivEDSGqcTrzt237V071h84O+Q=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-1.1.1.tgz", + "integrity": "sha512-TjKOyiC0exqd4Idy/4M8/DETR22dXBZks387DuS5LbslxHiMRXGx/Q2F/j9IUtvEoH5uFvt72vRgk/G6f8j3Dg==", "dev": true, "requires": { - "object-assign": "4.1.1" + "ejs": "2.5.7" } }, "load-json-file": { @@ -5018,6 +4071,14 @@ "pify": "2.3.0", "pinkie-promise": "2.0.1", "strip-bom": "2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, "loader-runner": { @@ -5032,7 +4093,7 @@ "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "dev": true, "requires": { - "big.js": "3.1.3", + "big.js": "3.2.0", "emojis-list": "2.1.0", "json5": "0.5.1" } @@ -5045,37 +4106,12 @@ "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } } }, "lodash": { "version": "4.17.4", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" - }, - "lodash._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", "dev": true }, "lodash.assign": { @@ -5097,29 +4133,6 @@ "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, "lodash.memoize": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", @@ -5139,40 +4152,17 @@ "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", "dev": true }, - "lodash.toarray": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-3.0.2.tgz", - "integrity": "sha1-KyBPD6T1HChcbwDIHRzqWiMEEXk=", - "dev": true, - "requires": { - "lodash._arraycopy": "3.0.0", - "lodash._basevalues": "3.0.0", - "lodash.keys": "3.1.2" - } - }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, - "log4js": { - "version": "0.6.38", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", - "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", - "dev": true, - "requires": { - "readable-stream": "1.0.34", - "semver": "4.3.6" - }, - "dependencies": { - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", - "dev": true - } - } + "loglevel": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.0.tgz", + "integrity": "sha1-rgyqVhERSYxboTcj1vtjHSQAOTQ=", + "dev": true }, "longest": { "version": "1.0.1", @@ -5227,13 +4217,23 @@ "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", "dev": true, "requires": { - "vlq": "0.2.2" + "vlq": "0.2.3" + } + }, + "make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "dev": true, + "requires": { + "pify": "3.0.0" } }, "make-error": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", - "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=" + "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", + "dev": true }, "map-obj": { "version": "1.0.1", @@ -5241,15 +4241,6 @@ "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, - "matcher-collection": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-1.0.4.tgz", - "integrity": "sha1-L2auCGmZbynkPQtiyD3R1D5YF1U=", - "dev": true, - "requires": { - "minimatch": "3.0.4" - } - }, "math-expression-evaluator": { "version": "1.2.17", "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", @@ -5299,40 +4290,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.4", + "errno": "0.1.6", "readable-stream": "2.3.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } } }, "meow": { @@ -5391,13 +4350,30 @@ "normalize-path": "2.1.1", "object.omit": "2.0.1", "parse-glob": "3.0.4", - "regex-cache": "0.4.3" + "regex-cache": "0.4.4" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } } }, "miller-rabin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz", - "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { "bn.js": "4.11.8", @@ -5405,24 +4381,24 @@ } }, "mime": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz", - "integrity": "sha1-WR2E02U6awtKO5343lqoEI5y5eA=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true }, "mime-db": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", - "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=", + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", "dev": true }, "mime-types": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", "dev": true, "requires": { - "mime-db": "1.29.0" + "mime-db": "1.30.0" } }, "mimic-fn": { @@ -5446,7 +4422,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "1.1.8" @@ -5455,7 +4431,26 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mississippi": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-1.3.0.tgz", + "integrity": "sha1-0gFYPrEjJ+PFwWQqQEqcrPlONPU=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "duplexify": "3.5.1", + "end-of-stream": "1.4.0", + "flush-write-stream": "1.0.2", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "1.0.3", + "pumpify": "1.3.5", + "stream-each": "1.2.2", + "through2": "2.0.3" + } }, "mixin-object": { "version": "2.0.1", @@ -5479,20 +4474,24 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } }, - "mkpath": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", - "integrity": "sha1-dVSm+Nhxg0zJe1RisSLEwSTW3pE=", - "dev": true - }, - "moment": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.1.tgz", - "integrity": "sha1-VtoaLRy/AdOLfhr8McELz6GSkWc=" + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } }, "ms": { "version": "2.0.0", @@ -5500,27 +4499,10 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "mt-downloader": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/mt-downloader/-/mt-downloader-2.2.1.tgz", - "integrity": "sha1-pqZmQoJ9diYvZPxUDNsoMji0I3w=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "humanize-plus": "1.8.2", - "meow": "3.7.0", - "muxer": "1.0.1", - "progress": "1.1.8", - "ramda": "0.21.0", - "request": "2.81.0", - "rx": "4.1.0", - "valid-url": "1.0.9" - } - }, "multicast-dns": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.1.1.tgz", - "integrity": "sha1-bn3oalcIcqsXBYrepxYLvsqBTd4=", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.1.tgz", + "integrity": "sha512-uV3/ckdsffHx9IrGQrx613mturMdMqQ06WTq+C09NsStJ9iNG6RcUWgPKs1Rfjy+idZT6tfQoXEusGNnEZhT3w==", "dev": true, "requires": { "dns-packet": "1.2.2", @@ -5533,25 +4515,10 @@ "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", "dev": true }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "muxer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/muxer/-/muxer-1.0.1.tgz", - "integrity": "sha1-CQNxLbmqUpOJNo8Sm0uWv8B+JVs=", - "dev": true, - "requires": { - "rx": "4.1.0" - } - }, "nan": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", "dev": true, "optional": true }, @@ -5570,44 +4537,10 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, - "ng-sidebar": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ng-sidebar/-/ng-sidebar-6.0.4.tgz", - "integrity": "sha1-QtxRdV6FPBiBs7iFg1T0yEWpbzM=" - }, - "ng2-datepicker": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ng2-datepicker/-/ng2-datepicker-2.1.3.tgz", - "integrity": "sha512-09Hwrf9IHsWzp/2FPSGo00P/XtiHSsHLBCeFCK1LG1nuuhNZbQ7LXLR+e+znhjPJyTkhelmODkhmy5DByYWpcA==", - "requires": { - "date-fns": "1.29.0", - "ngx-slimscroll": "3.4.1" - } - }, - "ng4-loading-spinner": { - "version": "1.0.27", - "resolved": "https://registry.npmjs.org/ng4-loading-spinner/-/ng4-loading-spinner-1.0.27.tgz", - "integrity": "sha1-7HrRKbXcG1VZY7WvQQc2vISmPs4=", - "requires": { - "@angular/core": "4.3.6", - "rxjs": "5.4.3", - "zone.js": "0.8.17" - } - }, - "ngx-slimscroll": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/ngx-slimscroll/-/ngx-slimscroll-3.4.1.tgz", - "integrity": "sha512-PMbOai2OeXCFCHnPigYXquN6fAUeAc+CC3AhHugt9wIp8xUB6lIt8OqOWS3IPRRaeKQWyxFCuDfiPKY8n2QuOQ==" - }, - "ngx-webstorage": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ngx-webstorage/-/ngx-webstorage-1.8.0.tgz", - "integrity": "sha1-zQhbmPvHpyzI8qqkDGyASzjUVt4=" - }, "no-case": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz", - "integrity": "sha1-euuhxzpSGEJlVUt9wDuvcg34AIE=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { "lower-case": "1.1.4" @@ -5635,7 +4568,7 @@ "npmlog": "4.1.2", "osenv": "0.1.4", "request": "2.81.0", - "rimraf": "2.6.1", + "rimraf": "2.6.2", "semver": "5.3.0", "tar": "2.2.1", "which": "1.3.0" @@ -5661,21 +4594,21 @@ } }, "node-libs-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", - "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", "dev": true, "requires": { "assert": "1.4.1", - "browserify-zlib": "0.1.4", + "browserify-zlib": "0.2.0", "buffer": "4.9.1", "console-browserify": "1.1.0", "constants-browserify": "1.0.0", - "crypto-browserify": "3.11.1", + "crypto-browserify": "3.12.0", "domain-browser": "1.1.7", "events": "1.1.1", - "https-browserify": "0.0.1", - "os-browserify": "0.2.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", "path-browserify": "0.0.0", "process": "0.11.10", "punycode": "1.4.1", @@ -5683,46 +4616,12 @@ "readable-stream": "2.3.3", "stream-browserify": "2.0.1", "stream-http": "2.7.2", - "string_decoder": "0.10.31", + "string_decoder": "1.0.3", "timers-browserify": "2.0.4", "tty-browserify": "0.0.0", "url": "0.11.0", "util": "0.10.3", "vm-browserify": "0.0.4" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - }, - "dependencies": { - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - } } }, "node-modules-path": { @@ -5732,9 +4631,9 @@ "dev": true }, "node-sass": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.5.3.tgz", - "integrity": "sha1-0JydEXlkEjnRuX/8YjH9zsU+FWg=", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.7.2.tgz", + "integrity": "sha512-CaV+wLqZ7//Jdom5aUFCpGNoECd7BbNhjuwdsX/LkXBrHl8eb1Wjw4HvWqcFvhr5KuNgAk8i/myf/MQ1YYeroA==", "dev": true, "optional": true, "requires": { @@ -5750,20 +4649,33 @@ "lodash.mergewith": "4.6.0", "meow": "3.7.0", "mkdirp": "0.5.1", - "nan": "2.6.2", + "nan": "2.8.0", "node-gyp": "3.6.2", "npmlog": "4.1.2", - "request": "2.81.0", + "request": "2.79.0", "sass-graph": "2.2.4", - "stdout-stream": "1.4.0" + "stdout-stream": "1.4.0", + "true-case-path": "1.0.2" }, "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true, + "optional": true + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, - "optional": true, "requires": { "ansi-styles": "2.2.1", "escape-string-regexp": "1.0.5", @@ -5772,10 +4684,65 @@ "supports-color": "2.0.0" } }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "optional": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.11.0", + "is-my-json-valid": "2.16.1", + "pinkie-promise": "2.0.1" + } + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true, + "optional": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3", + "uuid": "3.1.0" + } + }, "supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", "dev": true, "optional": true } @@ -5794,7 +4761,7 @@ "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { "hosted-git-info": "2.5.0", @@ -5860,12 +4827,6 @@ "boolbase": "1.0.0" } }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, "num2fraction": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", @@ -5890,10 +4851,10 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", "dev": true }, "object.omit": { @@ -5947,15 +4908,6 @@ "wrappy": "1.0.2" } }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.1.0" - } - }, "opn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", @@ -5965,21 +4917,6 @@ "is-wsl": "1.1.0" } }, - "optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", - "dev": true, - "requires": { - "wordwrap": "0.0.3" - } - }, - "options": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", - "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", - "dev": true - }, "original": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", @@ -6002,9 +4939,9 @@ } }, "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, "os-homedir": { @@ -6060,24 +4997,35 @@ } }, "p-map": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.1.1.tgz", - "integrity": "sha1-BfXkrpegaDcbwqXMhr+9vBnErno=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", "dev": true }, "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", "dev": true }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, "param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "dev": true, "requires": { - "no-case": "2.3.1" + "no-case": "2.3.2" } }, "parse-asn1": { @@ -6086,11 +5034,11 @@ "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", "dev": true, "requires": { - "asn1.js": "4.9.1", - "browserify-aes": "1.0.6", + "asn1.js": "4.9.2", + "browserify-aes": "1.1.1", "create-hash": "1.1.3", - "evp_bytestokey": "1.0.2", - "pbkdf2": "3.0.13" + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" } }, "parse-glob": { @@ -6103,6 +5051,23 @@ "is-dotfile": "1.0.3", "is-extglob": "1.0.0", "is-glob": "2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } } }, "parse-json": { @@ -6114,45 +5079,10 @@ "error-ex": "1.3.1" } }, - "parse5": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz", - "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA=", - "requires": { - "@types/node": "6.0.90" - } - }, - "parsejson": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", - "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "dev": true, - "requires": { - "better-assert": "1.0.2" - } - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "requires": { - "better-assert": "1.0.2" - } - }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true, - "requires": { - "better-assert": "1.0.2" - } - }, "parseurl": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", - "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", "dev": true }, "path-browserify": { @@ -6162,13 +5092,10 @@ "dev": true }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -6201,39 +5128,38 @@ "dev": true }, "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "pify": "3.0.0" } }, "pbkdf2": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.13.tgz", - "integrity": "sha512-+dCHxDH+djNtjgWmvVC/my3SYBAKpKNqKSjLkp+GtWWYe4XPE+e/PSD2aCanlEZZnqPk2uekTKNC/ccbwd2X2Q==", + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", "dev": true, "requires": { "create-hash": "1.1.3", "create-hmac": "1.1.6", "ripemd160": "2.0.1", "safe-buffer": "5.1.1", - "sha.js": "2.4.8" + "sha.js": "2.4.9" } }, "performance-now": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true + "dev": true, + "optional": true }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "pinkie": { @@ -6251,6 +5177,15 @@ "pinkie": "2.0.4" } }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + }, "portfinder": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", @@ -6258,7 +5193,7 @@ "dev": true, "requires": { "async": "1.5.2", - "debug": "2.6.8", + "debug": "2.6.9", "mkdirp": "0.5.1" }, "dependencies": { @@ -6271,17 +5206,23 @@ } }, "postcss": { - "version": "5.2.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", - "integrity": "sha1-z09Ze4ZNZcikkrLqvp1wbIecOIs=", + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { "chalk": "1.1.3", - "js-base64": "2.1.9", + "js-base64": "2.4.0", "source-map": "0.5.7", "supports-color": "3.2.3" }, "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", @@ -6302,6 +5243,21 @@ "dev": true } } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } } } }, @@ -6311,7 +5267,7 @@ "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "dev": true, "requires": { - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-message-helpers": "2.0.0", "reduce-css-calc": "1.3.0" } @@ -6323,7 +5279,7 @@ "dev": true, "requires": { "colormin": "1.1.2", - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-value-parser": "3.3.0" } }, @@ -6333,17 +5289,57 @@ "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "dev": true, "requires": { - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-value-parser": "3.3.0" } }, + "postcss-custom-properties": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-6.2.0.tgz", + "integrity": "sha512-eNR2h9T9ciKMoQEORrPjH33XeN/nuvVuxArOKmHtsFbGbNss631tgTrKou3/pmjAZbA4QQkhLIkPQkIk3WW+8w==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "postcss": "6.0.14" + }, + "dependencies": { + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "postcss": { + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", + "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "postcss-discard-comments": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "dev": true, "requires": { - "postcss": "5.2.17" + "postcss": "5.2.18" } }, "postcss-discard-duplicates": { @@ -6352,7 +5348,7 @@ "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "dev": true, "requires": { - "postcss": "5.2.17" + "postcss": "5.2.18" } }, "postcss-discard-empty": { @@ -6361,7 +5357,7 @@ "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "dev": true, "requires": { - "postcss": "5.2.17" + "postcss": "5.2.18" } }, "postcss-discard-overridden": { @@ -6370,7 +5366,7 @@ "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "dev": true, "requires": { - "postcss": "5.2.17" + "postcss": "5.2.18" } }, "postcss-discard-unused": { @@ -6379,7 +5375,7 @@ "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "dev": true, "requires": { - "postcss": "5.2.17", + "postcss": "5.2.18", "uniqs": "2.0.0" } }, @@ -6389,7 +5385,7 @@ "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", "dev": true, "requires": { - "postcss": "5.2.17", + "postcss": "5.2.18", "uniqid": "4.1.1" } }, @@ -6426,15 +5422,45 @@ } }, "postcss-loader": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-1.3.3.tgz", - "integrity": "sha1-piHqH6KQYqg5cqRvVEhncTAZFus=", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.0.9.tgz", + "integrity": "sha512-sgoXPtmgVT3aBAhU47Kig8oPF+mbXl8Unjvtz1Qj1q2D2EvSVJW2mKJNzxv5y/LvA9xWwuvdysvhc7Zn80UWWw==", "dev": true, "requires": { "loader-utils": "1.1.0", - "object-assign": "4.1.1", - "postcss": "5.2.17", - "postcss-load-config": "1.2.0" + "postcss": "6.0.14", + "postcss-load-config": "1.2.0", + "schema-utils": "0.3.0" + }, + "dependencies": { + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "postcss": { + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", + "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-merge-idents": { @@ -6444,7 +5470,7 @@ "dev": true, "requires": { "has": "1.0.1", - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-value-parser": "3.3.0" } }, @@ -6454,7 +5480,7 @@ "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "dev": true, "requires": { - "postcss": "5.2.17" + "postcss": "5.2.18" } }, "postcss-merge-rules": { @@ -6465,7 +5491,7 @@ "requires": { "browserslist": "1.7.7", "caniuse-api": "1.6.1", - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-selector-parser": "2.2.3", "vendors": "1.0.1" } @@ -6483,7 +5509,7 @@ "dev": true, "requires": { "object-assign": "4.1.1", - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-value-parser": "3.3.0" } }, @@ -6493,7 +5519,7 @@ "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "dev": true, "requires": { - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-value-parser": "3.3.0" } }, @@ -6504,7 +5530,7 @@ "dev": true, "requires": { "alphanum-sort": "1.0.2", - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-value-parser": "3.3.0", "uniqs": "2.0.0" } @@ -6517,7 +5543,7 @@ "requires": { "alphanum-sort": "1.0.2", "has": "1.0.1", - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-selector-parser": "2.2.3" } }, @@ -6527,34 +5553,36 @@ "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=", "dev": true, "requires": { - "postcss": "6.0.9" + "postcss": "6.0.14" }, "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } }, "postcss": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.9.tgz", - "integrity": "sha512-bBE2AHNEBhF23TfET6AA/lFP8ah+qHOZoFJEflFG+HgvVLdTmMOrocx/4LVVDIn3w6jUssw1q2Exk1cc9UOI8w==", + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", + "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", "dev": true, "requires": { - "chalk": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.2.1" + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" } }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -6565,34 +5593,36 @@ "dev": true, "requires": { "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.9" + "postcss": "6.0.14" }, "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } }, "postcss": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.9.tgz", - "integrity": "sha512-bBE2AHNEBhF23TfET6AA/lFP8ah+qHOZoFJEflFG+HgvVLdTmMOrocx/4LVVDIn3w6jUssw1q2Exk1cc9UOI8w==", + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", + "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", "dev": true, "requires": { - "chalk": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.2.1" + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" } }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -6603,34 +5633,36 @@ "dev": true, "requires": { "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.9" + "postcss": "6.0.14" }, "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } }, "postcss": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.9.tgz", - "integrity": "sha512-bBE2AHNEBhF23TfET6AA/lFP8ah+qHOZoFJEflFG+HgvVLdTmMOrocx/4LVVDIn3w6jUssw1q2Exk1cc9UOI8w==", + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", + "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", "dev": true, "requires": { - "chalk": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.2.1" + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" } }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -6641,34 +5673,36 @@ "dev": true, "requires": { "icss-replace-symbols": "1.1.0", - "postcss": "6.0.9" + "postcss": "6.0.14" }, "dependencies": { - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } }, "postcss": { - "version": "6.0.9", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.9.tgz", - "integrity": "sha512-bBE2AHNEBhF23TfET6AA/lFP8ah+qHOZoFJEflFG+HgvVLdTmMOrocx/4LVVDIn3w6jUssw1q2Exk1cc9UOI8w==", + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", + "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", "dev": true, "requires": { - "chalk": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.2.1" + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" } }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -6678,7 +5712,7 @@ "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "dev": true, "requires": { - "postcss": "5.2.17" + "postcss": "5.2.18" } }, "postcss-normalize-url": { @@ -6689,7 +5723,7 @@ "requires": { "is-absolute-url": "2.1.0", "normalize-url": "1.9.1", - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-value-parser": "3.3.0" } }, @@ -6699,7 +5733,7 @@ "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "dev": true, "requires": { - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-value-parser": "3.3.0" } }, @@ -6709,7 +5743,7 @@ "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "dev": true, "requires": { - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-value-parser": "3.3.0" } }, @@ -6719,7 +5753,7 @@ "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "dev": true, "requires": { - "postcss": "5.2.17" + "postcss": "5.2.18" } }, "postcss-reduce-transforms": { @@ -6729,7 +5763,7 @@ "dev": true, "requires": { "has": "1.0.1", - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-value-parser": "3.3.0" } }, @@ -6751,7 +5785,7 @@ "dev": true, "requires": { "is-svg": "2.1.0", - "postcss": "5.2.17", + "postcss": "5.2.18", "postcss-value-parser": "3.3.0", "svgo": "0.7.2" } @@ -6763,23 +5797,51 @@ "dev": true, "requires": { "alphanum-sort": "1.0.2", - "postcss": "5.2.17", + "postcss": "5.2.18", "uniqs": "2.0.0" } }, "postcss-url": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-5.1.2.tgz", - "integrity": "sha1-mLMWW+jVkkccsMqt3iwNH4MvEz4=", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/postcss-url/-/postcss-url-7.3.0.tgz", + "integrity": "sha512-VBP6uf6iL3AZra23nkPkOEkS/5azj1xf/toRrjfkolfFEgg9Gyzg9UhJZeIsz12EGKZTNVeGbPa2XtaZm/iZvg==", "dev": true, "requires": { - "directory-encoder": "0.7.2", - "js-base64": "2.1.9", - "mime": "1.3.6", + "mime": "1.6.0", "minimatch": "3.0.4", "mkdirp": "0.5.1", - "path-is-absolute": "1.0.1", - "postcss": "5.2.17" + "postcss": "6.0.14", + "xxhashjs": "0.2.1" + }, + "dependencies": { + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "postcss": { + "version": "6.0.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", + "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", + "dev": true, + "requires": { + "chalk": "2.3.0", + "source-map": "0.6.1", + "supports-color": "4.5.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "postcss-value-parser": { @@ -6795,7 +5857,7 @@ "dev": true, "requires": { "has": "1.0.1", - "postcss": "5.2.17", + "postcss": "5.2.18", "uniqs": "2.0.0" } }, @@ -6821,11 +5883,6 @@ "utila": "0.4.0" } }, - "primeng": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/primeng/-/primeng-4.3.0.tgz", - "integrity": "sha1-aH7NHhoVjPDodC78fam5M4zUcMM=" - }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -6838,12 +5895,6 @@ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "dev": true }, - "progress": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", - "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", - "dev": true - }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -6854,147 +5905,33 @@ "asap": "2.0.6" } }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, - "protractor": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.1.2.tgz", - "integrity": "sha1-myIXQXCaTGLVzVPGqt1UpxE36V8=", - "dev": true, - "requires": { - "@types/node": "6.0.90", - "@types/q": "0.0.32", - "@types/selenium-webdriver": "2.53.42", - "blocking-proxy": "0.0.5", - "chalk": "1.1.3", - "glob": "7.1.2", - "jasmine": "2.7.0", - "jasminewd2": "2.1.0", - "optimist": "0.6.1", - "q": "1.4.1", - "saucelabs": "1.3.0", - "selenium-webdriver": "3.0.1", - "source-map-support": "0.4.16", - "webdriver-js-extender": "1.0.0", - "webdriver-manager": "12.0.6" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.1" - } - }, - "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - }, - "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "webdriver-manager": { - "version": "12.0.6", - "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.0.6.tgz", - "integrity": "sha1-PfGkgZdwELTL+MnYXHpXeCjA5ws=", - "dev": true, - "requires": { - "adm-zip": "0.4.7", - "chalk": "1.1.3", - "del": "2.2.2", - "glob": "7.1.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "q": "1.4.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.4.1", - "xml2js": "0.4.19" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - } - } + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true }, "proxy-addr": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", - "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", "dev": true, "requires": { - "forwarded": "0.1.0", - "ipaddr.js": "1.4.0" + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" } }, "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "public-encrypt": { "version": "4.0.0", @@ -7010,15 +5947,26 @@ } }, "pump": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.2.tgz", - "integrity": "sha1-Oz7mUS+U8OV1U4wXmV+fFpkKXVE=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", "dev": true, "requires": { "end-of-stream": "1.4.0", "once": "1.4.0" } }, + "pumpify": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.3.5.tgz", + "integrity": "sha1-G2ccYZlAq8rqwK0OOjwWS+dgmTs=", + "dev": true, + "requires": { + "duplexify": "3.5.1", + "inherits": "2.0.3", + "pump": "1.0.3" + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -7026,22 +5974,17 @@ "dev": true }, "q": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz", - "integrity": "sha1-3QG6ydBtMObyGa7LglPunr3DCPE=", - "dev": true - }, - "qjobs": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.1.5.tgz", - "integrity": "sha1-ZZ3p8s+NzCehSBJ28gU3cnI4LnM=", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, "qs": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true + "dev": true, + "optional": true }, "query-string": { "version": "4.3.4", @@ -7071,16 +6014,10 @@ "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", "dev": true }, - "ramda": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.21.0.tgz", - "integrity": "sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=", - "dev": true - }, "randomatic": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { "is-number": "3.0.0", @@ -7127,6 +6064,16 @@ "safe-buffer": "5.1.1" } }, + "randomfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", + "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "dev": true, + "requires": { + "randombytes": "2.0.5", + "safe-buffer": "5.1.1" + } + }, "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", @@ -7134,28 +6081,15 @@ "dev": true }, "raw-body": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", - "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", "dev": true, "requires": { - "bytes": "2.4.0", - "iconv-lite": "0.4.15", + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", "unpipe": "1.0.0" - }, - "dependencies": { - "bytes": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", - "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", - "integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es=", - "dev": true - } } }, "raw-loader": { @@ -7173,6 +6107,25 @@ "load-json-file": "1.1.0", "normalize-package-data": "2.4.0", "path-type": "1.1.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, "read-pkg-up": { @@ -7183,18 +6136,42 @@ "requires": { "find-up": "1.1.2", "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + } } }, "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { "core-util-is": "1.0.2", "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "readdirp": { @@ -7207,38 +6184,6 @@ "minimatch": "3.0.4", "readable-stream": "2.3.3", "set-immediate-shim": "1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } } }, "redent": { @@ -7260,6 +6205,14 @@ "balanced-match": "0.4.2", "math-expression-evaluator": "1.2.17", "reduce-function-call": "1.0.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } } }, "reduce-function-call": { @@ -7269,6 +6222,14 @@ "dev": true, "requires": { "balanced-match": "0.4.2" + }, + "dependencies": { + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + } } }, "reflect-metadata": { @@ -7278,25 +6239,24 @@ "dev": true }, "regenerate": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz", - "integrity": "sha1-0ZQcZ7rUN+G+dkM63Vs4X5WxkmA=", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", "dev": true }, "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", "dev": true }, "regex-cache": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", - "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3", - "is-primitive": "2.0.0" + "is-equal-shallow": "0.1.3" } }, "regexpu-core": { @@ -7305,7 +6265,7 @@ "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "dev": true, "requires": { - "regenerate": "1.3.2", + "regenerate": "1.3.3", "regjsgen": "0.2.0", "regjsparser": "0.1.5" } @@ -7384,6 +6344,7 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "dev": true, + "optional": true, "requires": { "aws-sign2": "0.6.0", "aws4": "1.6.0", @@ -7398,13 +6359,13 @@ "is-typedarray": "1.0.0", "isstream": "0.1.2", "json-stringify-safe": "5.0.1", - "mime-types": "2.1.16", + "mime-types": "2.1.17", "oauth-sign": "0.8.2", "performance-now": "0.2.0", "qs": "6.4.0", "safe-buffer": "5.1.1", "stringstream": "0.0.5", - "tough-cookie": "2.3.2", + "tough-cookie": "2.3.3", "tunnel-agent": "0.6.0", "uuid": "3.1.0" } @@ -7434,24 +6395,29 @@ "dev": true }, "resolve": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { "path-parse": "1.0.5" } }, - "restore-cursor": { + "resolve-cwd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "resolve-from": "3.0.0" } }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -7462,9 +6428,9 @@ } }, "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { "glob": "7.1.2" @@ -7480,40 +6446,13 @@ "inherits": "2.0.3" } }, - "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", - "dev": true - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "is-promise": "2.1.0" - } - }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", - "dev": true - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "4.0.8" + "aproba": "1.2.0" } }, "rxjs": { @@ -7527,7 +6466,7 @@ "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", "dev": true }, "sass-graph": { @@ -7549,28 +6488,11 @@ "integrity": "sha512-c3/Zc+iW+qqDip6kXPYLEgsAu2lf4xz0EZDplB7EmSUMda12U1sGJPetH55B/j9eu0bTtKzKlNPWWyYC7wFNyQ==", "dev": true, "requires": { - "async": "2.5.0", + "async": "2.6.0", "clone-deep": "0.3.0", "loader-utils": "1.1.0", "lodash.tail": "4.1.1", "pify": "3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "saucelabs": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz", - "integrity": "sha1-0kDoAJ33+ocwbsRXimm6O1xCT+4=", - "dev": true, - "requires": { - "https-proxy-agent": "1.0.0" } }, "sax": { @@ -7585,16 +6507,7 @@ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "dev": true, "requires": { - "ajv": "5.2.2" - } - }, - "script-loader": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.0.tgz", - "integrity": "sha1-aF3H5waeDe56kmdPDrxbD1W6pew=", - "dev": true, - "requires": { - "raw-loader": "0.5.1" + "ajv": "5.5.1" } }, "scss-tokenizer": { @@ -7604,7 +6517,7 @@ "dev": true, "optional": true, "requires": { - "js-base64": "2.1.9", + "js-base64": "2.4.0", "source-map": "0.4.4" }, "dependencies": { @@ -7626,29 +6539,6 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, - "selenium-webdriver": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.0.1.tgz", - "integrity": "sha1-ot6l2kqX9mcuiefKcnbO+jZRR6c=", - "dev": true, - "requires": { - "adm-zip": "0.4.7", - "rimraf": "2.6.1", - "tmp": "0.0.30", - "xml2js": "0.4.19" - }, - "dependencies": { - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - } - } - }, "selfsigned": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", @@ -7661,7 +6551,8 @@ "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true }, "semver-dsl": { "version": "1.0.1", @@ -7673,20 +6564,20 @@ } }, "send": { - "version": "0.15.4", - "resolved": "https://registry.npmjs.org/send/-/send-0.15.4.tgz", - "integrity": "sha1-mF+qPihLAnPHkzZKNcZze9k5Bbk=", + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", "dev": true, "requires": { - "debug": "2.6.8", + "debug": "2.6.9", "depd": "1.1.1", "destroy": "1.0.4", "encodeurl": "1.0.1", "escape-html": "1.0.3", - "etag": "1.8.0", - "fresh": "0.5.0", + "etag": "1.8.1", + "fresh": "0.5.2", "http-errors": "1.6.2", - "mime": "1.3.4", + "mime": "1.4.1", "ms": "2.0.0", "on-finished": "2.3.0", "range-parser": "1.2.0", @@ -7694,38 +6585,44 @@ }, "dependencies": { "mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", - "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true } } }, + "serialize-javascript": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", + "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", + "dev": true + }, "serve-index": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.0.tgz", - "integrity": "sha1-0rKA/FYNYW7oG0i/D6gqvtJIXOc=", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "dev": true, "requires": { "accepts": "1.3.4", "batch": "0.6.1", - "debug": "2.6.8", + "debug": "2.6.9", "escape-html": "1.0.3", "http-errors": "1.6.2", - "mime-types": "2.1.16", - "parseurl": "1.3.1" + "mime-types": "2.1.17", + "parseurl": "1.3.2" } }, "serve-static": { - "version": "1.12.4", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.4.tgz", - "integrity": "sha1-m2qpjutyU8Tu3Ewfb9vKYJkBqWE=", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", "dev": true, "requires": { "encodeurl": "1.0.1", "escape-html": "1.0.3", - "parseurl": "1.3.1", - "send": "0.15.4" + "parseurl": "1.3.2", + "send": "0.16.1" } }, "set-blocking": { @@ -7747,18 +6644,19 @@ "dev": true }, "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", "dev": true }, "sha.js": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz", - "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "2.0.3", + "safe-buffer": "5.1.1" } }, "shallow-clone": { @@ -7799,11 +6697,6 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -7816,13 +6709,13 @@ "integrity": "sha1-IglwbxyFCp8dENDYQJGLRvJuG8k=", "dev": true, "requires": { - "debug": "2.6.8" + "debug": "2.6.9" } }, - "slashes": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/slashes/-/slashes-1.0.5.tgz", - "integrity": "sha1-IEeY9sYyAU1gm12JtqV6eq9wgo0=", + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", "dev": true }, "sntp": { @@ -7834,142 +6727,6 @@ "hoek": "2.16.3" } }, - "socket.io": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", - "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", - "dev": true, - "requires": { - "debug": "2.3.3", - "engine.io": "1.8.3", - "has-binary": "0.1.7", - "object-assign": "4.1.0", - "socket.io-adapter": "0.5.0", - "socket.io-client": "1.7.3", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - }, - "object-assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", - "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", - "dev": true - } - } - }, - "socket.io-adapter": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", - "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", - "dev": true, - "requires": { - "debug": "2.3.3", - "socket.io-parser": "2.3.1" - }, - "dependencies": { - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "socket.io-client": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", - "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", - "dev": true, - "requires": { - "backo2": "1.0.2", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "2.3.3", - "engine.io-client": "1.8.3", - "has-binary": "0.1.7", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseuri": "0.0.5", - "socket.io-parser": "2.3.1", - "to-array": "0.1.4" - }, - "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "debug": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", - "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true, - "requires": { - "ms": "0.7.2" - } - }, - "ms": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", - "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", - "dev": true - } - } - }, - "socket.io-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", - "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", - "dev": true, - "requires": { - "component-emitter": "1.1.2", - "debug": "2.2.0", - "isarray": "0.0.1", - "json3": "3.3.2" - }, - "dependencies": { - "debug": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", - "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true, - "requires": { - "ms": "0.7.1" - } - }, - "ms": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", - "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", - "dev": true - } - } - }, "sockjs": { "version": "0.3.18", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", @@ -7989,17 +6746,17 @@ } }, "sockjs-client": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.2.tgz", - "integrity": "sha1-8CEqhVDkyUaMjM6u79LjSTwDOtU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", + "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", "dev": true, "requires": { - "debug": "2.6.8", + "debug": "2.6.9", "eventsource": "0.1.6", "faye-websocket": "0.11.1", "inherits": "2.0.3", "json3": "3.3.2", - "url-parse": "1.1.9" + "url-parse": "1.2.0" }, "dependencies": { "faye-websocket": { @@ -8008,7 +6765,7 @@ "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", "dev": true, "requires": { - "websocket-driver": "0.6.5" + "websocket-driver": "0.7.0" } } } @@ -8031,45 +6788,37 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true }, "source-map-loader": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.1.tgz", - "integrity": "sha1-SBJr6SML1H+tBeRqjDwuPS2r5Qc=", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.3.tgz", + "integrity": "sha512-MYbFX9DYxmTQFfy2v8FC1XZwpwHKYxg3SK8Wb7VPBKuhDjz8gi9re2819MsG4p49HDyiOSUKlmZ+nQBArW5CGw==", "dev": true, "requires": { - "async": "0.9.2", + "async": "2.6.0", "loader-utils": "0.2.17", - "source-map": "0.1.43" + "source-map": "0.6.1" }, "dependencies": { - "async": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", - "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=", - "dev": true - }, "loader-utils": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.1.3", + "big.js": "3.2.0", "emojis-list": "2.1.0", "json5": "0.5.1", "object-assign": "4.1.1" } }, "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true } } }, @@ -8077,6 +6826,7 @@ "version": "0.4.16", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.16.tgz", "integrity": "sha512-A6vlydY7H/ljr4L2UOhDSajQdZQ6dMD7cLH0pzwcmwLyc9u8PNI4WGtnfDDzX7uzGL6c/T+ORL97Zlh+S4iOrg==", + "dev": true, "requires": { "source-map": "0.5.7" } @@ -8108,7 +6858,7 @@ "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", "dev": true, "requires": { - "debug": "2.6.8", + "debug": "2.6.9", "handle-thing": "1.2.5", "http-deceiver": "1.2.7", "safe-buffer": "5.1.1", @@ -8122,45 +6872,13 @@ "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", "dev": true, "requires": { - "debug": "2.6.8", + "debug": "2.6.9", "detect-node": "2.0.3", "hpack.js": "2.1.6", "obuf": "1.1.1", "readable-stream": "2.3.3", "safe-buffer": "5.1.1", "wbuf": "1.7.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } } }, "sprintf-js": { @@ -8193,11 +6911,14 @@ } } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true + "ssri": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.0.0.tgz", + "integrity": "sha512-728D4yoQcQm1ooZvSbywLkV1RjfITZXh0oWrhM/lnsx3nAHx7LsRGJWB/YyvoceAYRq98xqbstiN4JBv1/wNHg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } }, "statuses": { "version": "1.3.1", @@ -8213,41 +6934,6 @@ "optional": true, "requires": { "readable-stream": "2.3.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "optional": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.1.1" - } - } } }, "stream-browserify": { @@ -8258,38 +6944,16 @@ "requires": { "inherits": "2.0.3", "readable-stream": "2.3.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } + } + }, + "stream-each": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "stream-shift": "1.0.0" } }, "stream-http": { @@ -8303,40 +6967,14 @@ "readable-stream": "2.3.3", "to-arraybuffer": "1.0.1", "xtend": "4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } } }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -8344,37 +6982,24 @@ "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } }, "stringstream": { "version": "0.0.5", @@ -8418,7 +7043,8 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, "style-loader": { "version": "0.13.2", @@ -8436,7 +7062,7 @@ "dev": true, "requires": { "css-parse": "1.7.0", - "debug": "2.6.8", + "debug": "2.6.9", "glob": "7.0.6", "mkdirp": "0.5.1", "sax": "0.5.8", @@ -8486,12 +7112,12 @@ } }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "2.0.0" } }, "svgo": { @@ -8532,85 +7158,22 @@ "inherits": "2.0.3" } }, - "tar-fs": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.13.2.tgz", - "integrity": "sha1-Qz6Hn5U41+Hog7qRSQTzOcZBSDU=", - "dev": true, - "requires": { - "mkdirp": "0.5.1", - "pump": "1.0.2", - "tar-stream": "1.5.4" - } - }, - "tar-stream": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.4.tgz", - "integrity": "sha1-NlSc8E7RrumyowwBQyUiONr5QBY=", - "dev": true, - "requires": { - "bl": "1.2.1", - "end-of-stream": "1.4.0", - "readable-stream": "2.3.3", - "xtend": "4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, - "temp": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", - "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2", - "rimraf": "2.2.8" - }, - "dependencies": { - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - } - } - }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, "thunky": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", @@ -8632,21 +7195,6 @@ "setimmediate": "1.0.5" } }, - "tmp": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", - "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -8660,44 +7208,24 @@ "dev": true }, "toposort": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.3.tgz", - "integrity": "sha1-8CzYp0vYvi/A6YYRw7rLlaFxhpw=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", + "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", "dev": true }, - "touch": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.3.tgz", - "integrity": "sha1-Ua7z1ElXHU8oel2Hyci0kYGg2x0=", - "dev": true, - "requires": { - "nopt": "1.0.10" - }, - "dependencies": { - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1.1.0" - } - } - } - }, "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", "dev": true, "requires": { "punycode": "1.4.1" } }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", "dev": true }, "trim-newlines": { @@ -8712,52 +7240,114 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "true-case-path": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz", + "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=", + "dev": true, + "optional": true, + "requires": { + "glob": "6.0.4" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "dev": true, + "optional": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, "ts-node": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.2.2.tgz", - "integrity": "sha1-u9KOOK9Kqj6WB2xGbhsiAZfBo84=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.0.1.tgz", + "integrity": "sha512-F9AHAfL7QO+W8QPnEY4dzjCV2RPDK76mzYkQVB/7BuGOJWFxJgGezdyvCdtfVtE1QOOen3DnJONsenzIqIKqYQ==", "dev": true, "requires": { + "@types/arrify": "1.0.2", + "@types/diff": "3.2.2", + "@types/minimist": "1.2.0", + "@types/mkdirp": "0.5.2", + "@types/node": "8.5.1", + "@types/source-map-support": "0.4.0", + "@types/v8flags": "github:types/npm-v8flags#de224ae1cd5fd7dbb4e7158a6cc7a29e5315930d", + "@types/yn": "github:types/npm-yn#ca75f6c82940fae6a06fb41d2d37a6aa9b4ea8e9", "arrify": "1.0.1", - "chalk": "2.1.0", + "chalk": "2.3.0", "diff": "3.3.0", "make-error": "1.3.0", "minimist": "1.2.0", "mkdirp": "0.5.1", - "source-map-support": "0.4.16", - "tsconfig": "6.0.0", + "source-map-support": "0.5.0", + "tsconfig": "7.0.0", "v8flags": "3.0.0", "yn": "2.0.0" }, "dependencies": { + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true - } - } - }, - "tsconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", - "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", - "requires": { - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.0.tgz", + "integrity": "sha512-vUoN3I7fHQe0R/SJLKRdKYuEdRGogsviXFkHHo17AWaTGv17VLnxw+CFXvqy+y4ORZ3doWLQcxRYfwKrsd/H7Q==", + "dev": true, + "requires": { + "source-map": "0.6.1" + } + }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "dev": true, + "requires": { + "@types/strip-bom": "3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1" + } } } }, "tsickle": { - "version": "0.21.6", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.21.6.tgz", - "integrity": "sha1-U7Abl5xcE/2xOvs/uVgXflmRWI0=", + "version": "0.25.5", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.25.5.tgz", + "integrity": "sha512-CgOT/1WqOKtE1fyvqB+kTJ7bizE33xj1TyUIzGbxJBGCbQmknCrZbb35DtxMiK6pJo4CrPyoS8iGFddfHKtSNA==", "dev": true, "requires": { "minimist": "1.2.0", @@ -8780,38 +7370,28 @@ "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=" }, "tslint": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.3.2.tgz", - "integrity": "sha1-5WRZ+wlacwfxA7hAUhdPXju+9u0=", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.8.0.tgz", + "integrity": "sha1-H0mtWy53x2w69N3K5VKuTjYS6xM=", "dev": true, "requires": { "babel-code-frame": "6.26.0", - "colors": "1.1.2", + "builtin-modules": "1.1.1", + "chalk": "2.1.0", + "commander": "2.11.0", "diff": "3.3.0", "glob": "7.1.2", - "optimist": "0.6.1", - "resolve": "1.4.0", + "minimatch": "3.0.4", + "resolve": "1.5.0", "semver": "5.4.1", "tslib": "1.7.1", - "tsutils": "2.8.0" - }, - "dependencies": { - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - } + "tsutils": "2.13.0" } }, "tsutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.8.0.tgz", - "integrity": "sha1-AWAXNymzvxOGKN0UoVN+AIUdgUo=", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.13.0.tgz", + "integrity": "sha512-FuWzNJbMsp3gcZMbI3b5DomhW4Ia41vMxjN63nKWI0t7f+I3UmHfRl0TrXJTwI2LUduDG+eR1Mksp3pvtlyCFQ==", "dev": true, "requires": { "tslib": "1.7.1" @@ -8828,6 +7408,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, + "optional": true, "requires": { "safe-buffer": "5.1.1" } @@ -8846,23 +7427,43 @@ "dev": true, "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.16" + "mime-types": "2.1.17" } }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, "typescript": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.3.4.tgz", - "integrity": "sha1-PTgyGCgjHkNPKHUUlZw3qCtin0I=", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", + "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", "dev": true }, "uglify-js": { - "version": "3.0.28", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.28.tgz", - "integrity": "sha512-0h/qGay016GG2lVav3Kz174F3T2Vjlz2v6HCt+WDQpoXfco0hWwF5gHK9yh88mUYvIC+N7Z8NT8WpjSp1yoqGA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.2.2.tgz", + "integrity": "sha512-++1NO/zZIEdWf6cDIGceSJQPX31SqIpbVAHwFG5+240MtZqPG/NIPoinj8zlXQtAfMBqEt1Jyv2FiLP3n9gVhQ==", "dev": true, "requires": { - "commander": "2.11.0", - "source-map": "0.5.7" + "commander": "2.12.2", + "source-map": "0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "uglify-to-browserify": { @@ -8873,70 +7474,45 @@ "optional": true }, "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.1.4.tgz", + "integrity": "sha512-fRrOJ5tv6YCsJIhP9mPRnfgyo4DVNSIfNOa7Gs9aT1NNpeJc85W7GcbVxQgc+9rU3No6tnkbMqZ4xsgRBU+HGQ==", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.0.1" + "cacache": "10.0.1", + "find-cache-dir": "1.0.0", + "schema-utils": "0.3.0", + "serialize-javascript": "1.4.0", + "source-map": "0.6.1", + "uglify-es": "3.2.2", + "webpack-sources": "1.1.0", + "worker-farm": "1.5.2" }, "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "commander": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", + "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", "dev": true }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "uglify-es": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.2.2.tgz", + "integrity": "sha512-l+s5VLzFwGJfS+fbqaGf/Dfwo1MF13jLOF2ekL0PytzqEqQ6cVppvHf4jquqFok+35USMpKjqkYxy6pQyUcuug==", "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" + "commander": "2.12.2", + "source-map": "0.6.1" } } } }, - "ultron": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", - "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", - "dev": true - }, "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", @@ -8958,6 +7534,24 @@ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + }, "universalify": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", @@ -8995,19 +7589,20 @@ } }, "url-loader": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", - "integrity": "sha512-B7QYFyvv+fOBqBVeefsxv6koWWtjmHaMFT6KZWti4KRw8YUD/hOU+3AECvXuzyVawIBx3z7zQRejXCDSO5kk1Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.6.2.tgz", + "integrity": "sha512-h3qf9TNn53BpuXTTcpC+UehiRrl0Cv45Yr/xWayApjw6G8Bg2dGke7rIwDQ39piciWCWrC+WiqLjOh3SUp9n0Q==", "dev": true, "requires": { "loader-utils": "1.1.0", - "mime": "1.3.6" + "mime": "1.6.0", + "schema-utils": "0.3.0" } }, "url-parse": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.1.9.tgz", - "integrity": "sha1-xn8dd11R8KGJEd17P/rSe7nlvRk=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", "dev": true, "requires": { "querystringify": "1.0.0", @@ -9025,25 +7620,8 @@ "user-home": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", - "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=" - }, - "useragent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", - "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", - "dev": true, - "requires": { - "lru-cache": "2.2.4", - "tmp": "0.0.31" - }, - "dependencies": { - "lru-cache": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", - "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", - "dev": true - } - } + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true }, "util": { "version": "0.10.3", @@ -9075,31 +7653,26 @@ "dev": true }, "utils-merge": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", - "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", "dev": true }, "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", "dev": true }, "v8flags": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.0.tgz", "integrity": "sha512-AGl+C+4qpeSu2g3JxCD/mGFFOs/vVZ3XREkD3ibQXEqr4Y4zgIrPWW124/IKJFHOIVFIoH8miWrLf0o84HYjwA==", + "dev": true, "requires": { "user-home": "1.1.1" } }, - "valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA=", - "dev": true - }, "validate-npm-package-license": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", @@ -9111,9 +7684,9 @@ } }, "vary": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.1.tgz", - "integrity": "sha1-Z1Neu2lMHVIldFeYRmUyP1h+jTc=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", "dev": true }, "vendors": { @@ -9142,9 +7715,9 @@ } }, "vlq": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.2.tgz", - "integrity": "sha1-4xbVJXtAuGu0PLjV/qXX9U1rDKE=", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", "dev": true }, "vm-browserify": { @@ -9156,29 +7729,13 @@ "indexof": "0.0.1" } }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", - "dev": true - }, - "walk-sync": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-0.3.2.tgz", - "integrity": "sha512-FMB5VqpLqOCcqrzA9okZFc0wq0Qbmdm396qJxvQZhDpyu0W95G9JCmp74tx7iyYnyOcBtUuKJsgIKAqjozvmmQ==", - "dev": true, - "requires": { - "ensure-posix-path": "1.0.2", - "matcher-collection": "1.0.4" - } - }, "watchpack": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", "dev": true, "requires": { - "async": "2.5.0", + "async": "2.6.0", "chokidar": "1.7.0", "graceful-fs": "4.1.11" } @@ -9192,110 +7749,59 @@ "minimalistic-assert": "1.0.0" } }, - "webdriver-js-extender": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", - "integrity": "sha1-gcUzqeM9W/tZe05j4s2yW1R3dRU=", - "dev": true, - "requires": { - "@types/selenium-webdriver": "2.53.42", - "selenium-webdriver": "2.53.3" - }, - "dependencies": { - "adm-zip": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", - "integrity": "sha1-ph7VrmkFw66lizplfSUDMJEFJzY=", - "dev": true - }, - "sax": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", - "integrity": "sha1-VjsZx8HeiS4Jv8Ty/DDjwn8JUrk=", - "dev": true - }, - "selenium-webdriver": { - "version": "2.53.3", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", - "integrity": "sha1-0p/1qVff8aG0ncRXdW5OS/vc4IU=", - "dev": true, - "requires": { - "adm-zip": "0.4.4", - "rimraf": "2.6.1", - "tmp": "0.0.24", - "ws": "1.1.2", - "xml2js": "0.4.4" - } - }, - "tmp": { - "version": "0.0.24", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", - "integrity": "sha1-1qXhmNFKmDXMby18PZ4wJCjIzxI=", - "dev": true - }, - "xml2js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", - "integrity": "sha1-MREBAAMAiuGSQOuhdJe1fHKcVV0=", - "dev": true, - "requires": { - "sax": "0.6.1", - "xmlbuilder": "9.0.4" - } - } - } - }, "webpack": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.4.1.tgz", - "integrity": "sha1-TD9PP7MYFVpNsMtqNv8FxWl0GPQ=", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", + "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", "dev": true, "requires": { - "acorn": "5.1.1", + "acorn": "5.2.1", "acorn-dynamic-import": "2.0.2", - "ajv": "5.2.2", - "ajv-keywords": "2.1.0", - "async": "2.5.0", + "ajv": "5.5.1", + "ajv-keywords": "2.1.1", + "async": "2.6.0", "enhanced-resolve": "3.4.1", "escope": "3.6.0", - "interpret": "1.0.3", + "interpret": "1.1.0", "json-loader": "0.5.7", "json5": "0.5.1", "loader-runner": "2.3.0", "loader-utils": "1.1.0", "memory-fs": "0.4.1", "mkdirp": "0.5.1", - "node-libs-browser": "2.0.0", + "node-libs-browser": "2.1.0", "source-map": "0.5.7", - "supports-color": "4.2.1", + "supports-color": "4.5.0", "tapable": "0.2.8", "uglifyjs-webpack-plugin": "0.4.6", "watchpack": "1.4.0", - "webpack-sources": "1.0.1", + "webpack-sources": "1.1.0", "yargs": "8.0.2" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "find-up": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "cliui": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "requires": { - "locate-path": "2.0.0" + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" } }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -9328,6 +7834,12 @@ "pify": "2.3.0" } }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -9349,19 +7861,73 @@ "read-pkg": "2.0.0" } }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "requires": { - "has-flag": "2.0.0" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.1.0" } }, "which-module": { @@ -9389,6 +7955,38 @@ "which-module": "2.0.0", "y18n": "3.2.1", "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + } } }, "yargs-parser": { @@ -9398,49 +7996,90 @@ "dev": true, "requires": { "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "0.1.8", + "source-map": "0.4.4" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" } } } }, "webpack-dev-middleware": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", - "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", + "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", "dev": true, "requires": { "memory-fs": "0.4.1", - "mime": "1.3.6", + "mime": "1.6.0", "path-is-absolute": "1.0.1", "range-parser": "1.2.0", "time-stamp": "2.0.0" } }, "webpack-dev-server": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.5.1.tgz", - "integrity": "sha1-oC5yaoe7YD211xq7fW0mSb8Qx2k=", + "version": "2.9.7", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.9.7.tgz", + "integrity": "sha512-Pu7uoQFgQj5RE5wmlfkpYSzihMKxulwEuO2xCsaMnAnyRSApwoVi3B8WCm9XbigyWTHaIMzYGkB90Vr6leAeTQ==", "dev": true, "requires": { "ansi-html": "0.0.7", + "array-includes": "3.0.3", "bonjour": "3.5.0", "chokidar": "1.7.0", - "compression": "1.7.0", - "connect-history-api-fallback": "1.3.0", + "compression": "1.7.1", + "connect-history-api-fallback": "1.5.0", + "debug": "3.1.0", "del": "3.0.0", - "express": "4.15.4", + "express": "4.16.2", "html-entities": "1.2.1", "http-proxy-middleware": "0.17.4", + "import-local": "0.1.1", "internal-ip": "1.2.0", - "opn": "4.0.2", + "ip": "1.1.5", + "killable": "1.0.0", + "loglevel": "1.6.0", + "opn": "5.1.0", "portfinder": "1.0.13", "selfsigned": "1.10.1", - "serve-index": "1.9.0", + "serve-index": "1.9.1", "sockjs": "0.3.18", - "sockjs-client": "1.1.2", + "sockjs-client": "1.1.4", "spdy": "3.4.7", "strip-ansi": "3.0.1", - "supports-color": "3.2.3", - "webpack-dev-middleware": "1.12.0", + "supports-color": "4.5.0", + "webpack-dev-middleware": "1.12.2", "yargs": "6.6.0" }, "dependencies": { @@ -9450,34 +8089,13 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { - "number-is-nan": "1.0.1" - } - }, - "opn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", - "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "pinkie-promise": "2.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "ms": "2.0.0" } }, "yargs": { @@ -9513,37 +8131,55 @@ } }, "webpack-merge": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.0.tgz", - "integrity": "sha1-atciI7PguDflMeRZfBmfkJNhUR4=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.1.tgz", + "integrity": "sha512-geQsZ86YkXOVOjvPC5yv3JSNnL6/X3Kzh935AQ/gJNEYXEfJDQFu/sdFuktS9OW2JcH/SJec8TGfRdrpHshH7A==", "dev": true, "requires": { "lodash": "4.17.4" } }, "webpack-sources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", - "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", "dev": true, "requires": { "source-list-map": "2.0.0", - "source-map": "0.5.7" + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.3.tgz", + "integrity": "sha1-wGBtQAkLBwzeQovsjfNgMhbkcus=", + "dev": true, + "requires": { + "webpack-core": "0.6.9" } }, "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", "dev": true, "requires": { - "websocket-extensions": "0.1.1" + "http-parser-js": "0.4.9", + "websocket-extensions": "0.1.3" } }, "websocket-extensions": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz", - "integrity": "sha1-domUmcGEtu91Q3fC27DNbLVdKec=", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", "dev": true }, "when": { @@ -9580,28 +8216,6 @@ "dev": true, "requires": { "string-width": "1.0.2" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } } }, "window-size": { @@ -9610,40 +8224,22 @@ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", "dev": true }, - "winston": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.3.1.tgz", - "integrity": "sha1-C0hCDZeMAYBM8CMLZIhhWYIloRk=", + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "worker-farm": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.5.2.tgz", + "integrity": "sha512-XxiQ9kZN5n6mmnW+mFJ+wXjNNI/Nx4DIdaAKLX1Bn6LYBWlN/zaBhu34DQYPZ1AJobQuu67S2OfDdNSVULvXkQ==", "dev": true, "requires": { - "async": "1.0.0", - "colors": "1.0.3", - "cycle": "1.0.3", - "eyes": "0.1.8", - "isstream": "0.1.2", - "stack-trace": "0.0.10" - }, - "dependencies": { - "async": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", - "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", - "dev": true - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - } + "errno": "0.1.6", + "xtend": "4.0.1" } }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -9652,28 +8248,6 @@ "requires": { "string-width": "1.0.2", "strip-ansi": "3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } } }, "wrappy": { @@ -9682,67 +8256,27 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "ws": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", - "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", - "dev": true, - "requires": { - "options": "0.0.6", - "ultron": "1.0.2" - } - }, - "wtf-8": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", - "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", - "dev": true - }, - "xhr2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", - "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" - }, "xml-char-classes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", "dev": true }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "dev": true, - "requires": { - "sax": "1.2.4", - "xmlbuilder": "9.0.4" - } - }, - "xmlbuilder": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.4.tgz", - "integrity": "sha1-UZy0ymhtAFqEINNJbz8MruzKWA8=", - "dev": true - }, - "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", - "dev": true - }, - "xmlhttprequest-ssl": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", - "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", - "dev": true - }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, + "xxhashjs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.1.tgz", + "integrity": "sha1-m76b6JYUKXbfo0wGGy0GjEPTDeA=", + "dev": true, + "requires": { + "cuint": "0.2.2" + } + }, "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", @@ -9783,28 +8317,6 @@ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", "dev": true, "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } } } }, @@ -9827,16 +8339,11 @@ } } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true }, "zone.js": { "version": "0.8.17", diff --git a/dmp-frontend/package.json b/dmp-frontend/package.json index 7e0f263b1..3ed9b91f0 100644 --- a/dmp-frontend/package.json +++ b/dmp-frontend/package.json @@ -12,56 +12,32 @@ }, "private": true, "dependencies": { - "@angular/animations": "^4.3.6", - "@angular/common": "^4.3.6", - "@angular/compiler": "^4.3.6", - "@angular/core": "^4.3.6", - "@angular/forms": "^4.3.6", - "@angular/http": "^4.3.6", - "@angular/platform-browser": "^4.3.6", - "@angular/platform-browser-dynamic": "^4.3.6", - "@angular/router": "^4.3.6", - "@ngui/auto-complete": "^0.16.0", - "angular-2-data-table": "^0.1.2", - "angular-4-data-table-bootstrap-4": "^0.2.0", - "angular-google-signin": "^0.1.5", - "angular2-datatable": "^0.6.0", - "angular2-draggable": "^1.0.7", - "angular2-number-picker": "^0.8.8", - "angular2-uuid": "^1.1.1", - "bootstrap": "^3.3.7", + "@angular/animations": "^5.1.1", + "@angular/cdk": "^5.0.1", + "@angular/common": "5.1.1", + "@angular/compiler": "5.1.1", + "@angular/core": "5.1.1", + "@angular/forms": "5.1.1", + "@angular/http": "5.1.1", + "@angular/material": "^5.0.1", + "@angular/platform-browser": "5.1.1", + "@angular/platform-browser-dynamic": "5.1.1", + "@angular/router": "5.1.1", + "@covalent/core": "^1.0.0-rc.1", + "@ngx-translate/core": "^9.0.1", + "@ngx-translate/http-loader": "^2.0.0", "core-js": "^2.4.1", - "flat": "^4.0.0", - "jquery": "^3.2.1", - "moment": "^2.19.1", - "ng-sidebar": "^6.0.4", - "ng2-datepicker": "^2.1.3", - "ng4-loading-spinner": "^1.0.27", - "ngx-webstorage": "^1.8.0", - "primeng": "^4.3.0", "rxjs": "^5.4.2", "zone.js": "^0.8.17" }, "devDependencies": { - "@angular/cli": "1.3.1", - "@angular/compiler-cli": "^4.3.6", - "@angular/language-service": "^4.3.6", - "@types/jasmine": "~2.5.53", - "@types/jasminewd2": "~2.0.2", - "@types/node": "^6.0.90", - "angular-ide": "^0.9.31", - "codelyzer": "~3.1.1", - "jasmine-core": "~2.6.2", - "jasmine-spec-reporter": "~4.1.0", - "karma": "~1.7.0", - "karma-chrome-launcher": "~2.1.1", - "karma-cli": "~1.0.1", - "karma-coverage-istanbul-reporter": "^1.2.1", - "karma-jasmine": "~1.1.0", - "karma-jasmine-html-reporter": "^0.2.2", - "protractor": "~5.1.2", - "ts-node": "~3.2.0", - "tslint": "~5.3.2", - "typescript": "~2.3.3" + "@angular/cli": "1.6.1", + "@angular/compiler-cli": "^5.1.1", + "@angular/language-service": "^5.1.1", + "@types/node": "^8.5.1", + "codelyzer": "~4.0.2", + "ts-node": "~4.0.1", + "tslint": "~5.8.0", + "typescript": "2.4.2" } } diff --git a/dmp-frontend/protractor.conf.js b/dmp-frontend/protractor.conf.js deleted file mode 100644 index 7ee3b5ee8..000000000 --- a/dmp-frontend/protractor.conf.js +++ /dev/null @@ -1,28 +0,0 @@ -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { SpecReporter } = require('jasmine-spec-reporter'); - -exports.config = { - allScriptsTimeout: 11000, - specs: [ - './e2e/**/*.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: 'e2e/tsconfig.e2e.json' - }); - jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); - } -}; diff --git a/dmp-frontend/src/app/app-routing.module.ts b/dmp-frontend/src/app/app-routing.module.ts index d761efa26..70e2a6879 100644 --- a/dmp-frontend/src/app/app-routing.module.ts +++ b/dmp-frontend/src/app/app-routing.module.ts @@ -1,47 +1,53 @@ -import { NgModule } from '@angular/core'; +import { InvitationAcceptedComponent } from './invitation-accepted/invitation-accepted.component'; +import { UnauthorizedComponent } from './unauthorized/unauthorized.component'; +import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; -import { PageNotFoundComponent } from './not-found.component'; -import { HomepageComponent } from './homepage/homepage.component'; +import { PageNotFoundComponent } from './not-found.component'; +import { HomepageComponent } from './homepage/homepage.component'; import { DynamicFormComponent } from './form/dynamic-form.component'; import { AuthGuard } from './guards/auth.guard'; -import { ProjectsComponent } from './projects/projects.component'; -import { DatasetsComponent } from './datasets/dataset.component'; -import { DmpComponent } from './dmps/dmp.component'; import { AppComponent } from './app.component'; -import { MainSignInComponent } from './login/main-sign-in/main-sign-in.component'; -import { DmpDetailedComponent } from './viewers/dmp-detailed/dmp-detailed.component'; -import { ProjectDetailedComponent } from './viewers/project-detailed/project-detailed.component'; - +import { ProjectListingModel } from './models/projects/ProjectListingModel'; +import { ProjectListingComponent } from './projects/project-listing.component'; +import { DataManagementPlanListingComponent } from './dmps/dmp-listing.component'; +import { ProjectEditorComponent } from './projects/editor/project-editor.component'; +import { DataManagementPlanEditorComponent } from './dmps/editor/dmp-editor.component'; +import { DatasetEditorComponent } from './datasets/editor/dataset-editor.component'; +import { DatasetListingComponent } from './datasets/dataset-listing.component'; +import { DatasetWizardComponent } from './dataset-wizard/dataset-wizard.component'; +import { LoginComponent } from './user-management/login/login.component'; const appRoutes: Routes = [ - //{ path: 'dynamic-form/:id', component: DynamicFormComponent, canActivate: [AuthGuard] }, - { path: 'dynamic-form', component: DynamicFormComponent, canActivate: [AuthGuard] }, - { path: 'dataset', component: DatasetsComponent }, - { path: 'login', component: MainSignInComponent}, - { path: 'projects', component: ProjectsComponent}, - { path: 'project', component: ProjectDetailedComponent}, - { path: 'dmps', component: DmpComponent}, - { path: 'dmp', component: DmpDetailedComponent }, - { path: 'welcome', component: HomepageComponent}, - { path: '', redirectTo: '/login', pathMatch: 'full' }, - { path: '**', component: PageNotFoundComponent }, - /* - { - path: '', - redirectTo: 'app-root', - pathMatch: 'full' - } - */ + + { path: 'dynamic-form/:id', component: DynamicFormComponent, canActivate: [AuthGuard] }, + { path: 'projects', component: ProjectListingComponent, canActivate: [AuthGuard] }, + { path: 'project/:id', component: ProjectEditorComponent, canActivate: [AuthGuard] }, + { path: 'projects/new', component: ProjectEditorComponent, canActivate: [AuthGuard] }, + { path: 'dmps', component: DataManagementPlanListingComponent, canActivate: [AuthGuard] }, + { path: 'dmp/:id', component: DataManagementPlanEditorComponent, canActivate: [AuthGuard] }, + { path: 'dmps/new', component: DataManagementPlanEditorComponent, canActivate: [AuthGuard] }, + { path: 'datasets', component: DatasetListingComponent, canActivate: [AuthGuard] }, + //{ path: 'dataset/new', component: DatasetWizardComponent, canActivate: [AuthGuard] }, + { path: 'dataset/new/:dmpId', component: DatasetWizardComponent, canActivate: [AuthGuard] }, + { path: 'dataset/:id', component: DatasetWizardComponent, canActivate: [AuthGuard] }, + { path: 'datasets/new', component: DatasetWizardComponent, canActivate: [AuthGuard] }, + { path: 'datasets/:dmpId', component: DatasetListingComponent, canActivate: [AuthGuard] }, + { path: 'invitation/:id', component: InvitationAcceptedComponent}, + { path: 'login', loadChildren: './user-management/login.module#LoginModule' }, + { path: "unauthorized", loadChildren: './unauthorized/unauthorized.module#UnauthorizedModule' }, + { path: 'welcome', component: HomepageComponent, canActivate: [AuthGuard] }, + { path: '', redirectTo: '/welcome', pathMatch: 'full' }, + ]; @NgModule({ imports: [ RouterModule.forRoot( appRoutes - ,{ - useHash: true + , { + useHash: false //,enableTracing: true <-- debugging purposes only - } + } ) ], exports: [ diff --git a/dmp-frontend/src/app/app.component.css b/dmp-frontend/src/app/app.component.css deleted file mode 100644 index 7c3bd07bf..000000000 --- a/dmp-frontend/src/app/app.component.css +++ /dev/null @@ -1,160 +0,0 @@ -.hide{ - display:none; -} - -.show { - display:block; -} - -.ng-valid[required], .ng-valid.required { - border-left: 5px solid #42A948; /* green */ - } - - .ng-invalid:not(form) { - border-left: 5px solid #a94442; /* red */ - } - - -.navbar-center { - position: absolute; - width: 100%; - left: 0; - text-align: center; - vertical-align: middle; - margin:0 auto; -} - -.invisible { - display:none; -} - -.visible { - display:block; -} - -.cursor{ - cursor: pointer; -} - -.navbar { - -webkit-box-shadow: 0px 0px 12px 2px rgba(0,0,0,0.73); - -moz-box-shadow: 0px 0px 12px 2px rgba(0,0,0,0.73); - box-shadow: 0px 0px 12px 2px rgba(0,0,0,0.73); - margin-bottom: 5px; -} - - -.navbar-title { - /* - width: 100%; - position: absolute; - left: 0; - */ - margin:0 auto; - text-align: center; -} -.navbar-toggle { - z-index:3; -} - -.arrange-horizontally > * { - display: inline-block; - /*text-align: center;*/ - white-space: nowrap -} -.arrange-vertically > * { - display: block; -} - - -/* FOR THE SIDEBAR */ - -.parent_div{ - height:100%; - width:100%; - float:left; -} - -.child_div_left{ - height:100%; - float:left; -} - -.child_div_right{ - height:100%; - float:right; -} - - -.sidenav { - - display:none; - - border-radius: 15px; - - z-index: 1; - width: 0px; - /* - top: 0px; - height: 100%; - left: 0px; - */ - overflow-x: hidden; - background-color: #f8f8f8; - transition: 0.5s; - padding-top: 60px; -} - -.sidenav.expanded{ - width: 15%; - - - display: block; - - border-style: solid; - border-width: thin; - - border-radius: 15px; - padding-top: 60px; -} - -#appBody { - width : 100%; - transition: 0.5s; -} -#appBody.expanded{ - width: 85%; -} - - - -.sidenav a { - padding: 8px 8px 8px 32px; - text-decoration: none; - font-size: 25px; - color: #818181; - display: block; - transition: 0.5s; -} - -.sidenav a:hover { - color: #000; -} - -.sidenav .closebtn { - position: absolute; - top: 0; - right: 25px; - font-size: 36px; - margin-left: 50px; -} - -#main { - transition: margin-left .5s; - /*padding: 16px;*/ -} - -@media screen and (max-height: 450px) { - .sidenav {padding-top: 15px;} - .sidenav a {font-size: 18px;} -} diff --git a/dmp-frontend/src/app/app.component.html b/dmp-frontend/src/app/app.component.html index 31fb54d23..a084d2545 100644 --- a/dmp-frontend/src/app/app.component.html +++ b/dmp-frontend/src/app/app.component.html @@ -1,92 +1,4 @@ - -
- - -
- - -
- -
- - -
- - - - -
- - - - - -
- + +
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/app.component.scss b/dmp-frontend/src/app/app.component.scss new file mode 100644 index 000000000..47e1dc8ad --- /dev/null +++ b/dmp-frontend/src/app/app.component.scss @@ -0,0 +1,2 @@ +body { +} \ No newline at end of file diff --git a/dmp-frontend/src/app/app.component.ts b/dmp-frontend/src/app/app.component.ts index 9bf4b41f0..1a570e1f3 100644 --- a/dmp-frontend/src/app/app.component.ts +++ b/dmp-frontend/src/app/app.component.ts @@ -1,77 +1,46 @@ -import { Component, OnInit} from '@angular/core'; -import { ServerService } from './services/server.service'; -import { FieldBase } from '../app/form/fields/field-base'; -import { JsonObjest } from '../app/entities/JsonObject.class'; -import { TokenService, TokenProvider } from './services/login/token.service'; +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, ActivatedRoute, NavigationExtras } from '@angular/router'; -import { MainSignInComponent } from './login/main-sign-in/main-sign-in.component'; -import {BreadcrumbModule,MenuItem} from 'primeng/primeng'; - -import { BreadcrumbComponent } from './widgets/breadcrumb/breadcrumb.component'; - -import { AutocompleteRemoteComponent } from './form/fields/autocomplete-remote/autocomplete-remote.component'; +import { TranslateService } from '@ngx-translate/core'; -declare var $ :any; +declare const gapi: any; + +declare var $: any; @Component({ selector: 'app-root', templateUrl: './app.component.html', - styleUrls: ['./app.component.css'], - providers: [] + styleUrls: ['./app.component.scss'], + providers: [], + encapsulation: ViewEncapsulation.None }) export class AppComponent implements OnInit { - - fields: any[]; - sliderExpanded : boolean = false; - - - breadcrumbHome: MenuItem = {icon: 'fa fa-home', routerLink: "/welcome"}; - breadcrumbData: MenuItem[] = new Array(); - - - - constructor(private tokenService : TokenService, private router: Router, private route: ActivatedRoute) { + constructor(private router: Router, private route: ActivatedRoute, private translate: TranslateService) { + // this language will be used as a fallback when a translation isn't found in the current language + translate.setDefaultLang('en'); + // the lang to use, if the lang isn't available, it will use the current loader to get them + translate.use('en'); } ngOnInit() { - } - - slideNav(){ - - $("#appSidebar").toggleClass("expanded"); - $("#appBody").toggleClass("expanded"); - - } - - - - //loggedInAs : string = null; - - showLogin : boolean = false; - - - login(){ + login() { //redirect to login page - this.router.navigate(['/login'], { queryParams: { /*refresh : Math.random() ,returnUrl: this.state.url*/ }}); - } - - logout(){ - this.tokenService.logout(); + this.router.navigate(['/login'], { queryParams: { /*refresh : Math.random() ,returnUrl: this.state.url*/ } }); } + logout() { - goToDMPs(){ - this.router.navigate(['/dmps'], { queryParams: { /*refresh : Math.random() ,returnUrl: this.state.url*/ }}); } - goToProjects(){ - this.router.navigate(['/projects'], { queryParams: { /*refresh : Math.random() ,returnUrl: this.state.url*/ }}); + goToDMPs() { + this.router.navigate(['/dmps'], { queryParams: { /*refresh : Math.random() ,returnUrl: this.state.url*/ } }); } - + goToProjects() { + this.router.navigate(['/projects'], { queryParams: { /*refresh : Math.random() ,returnUrl: this.state.url*/ } }); + } } diff --git a/dmp-frontend/src/app/app.constants.ts b/dmp-frontend/src/app/app.constants.ts new file mode 100644 index 000000000..218244444 --- /dev/null +++ b/dmp-frontend/src/app/app.constants.ts @@ -0,0 +1,6 @@ +export const HostConfiguration = { + Server: 'http://dl043.madgik.di.uoa.gr:8080/', + App: 'http://dl043.madgik.di.uoa.gr:8080/' + //CASHost: 'https://login-devel.uoa.gr/login', + //Service: 'http://elkefinman/login' +} \ No newline at end of file diff --git a/dmp-frontend/src/app/app.module.ts b/dmp-frontend/src/app/app.module.ts index 46dfd0356..b0a2872aa 100644 --- a/dmp-frontend/src/app/app.module.ts +++ b/dmp-frontend/src/app/app.module.ts @@ -1,77 +1,61 @@ + +import { HostConfiguration } from './app.constants'; +import { LoginOptions } from './user-management/utilties/LoginOptions'; +import { LoginModule } from './user-management/login.module'; +import { InvitationAcceptedComponent } from './invitation-accepted/invitation-accepted.component'; +import { InvitationComponent } from './invitation/invitation.component'; +import { UnauthorizedComponent } from './unauthorized/unauthorized.component'; +import { PaginationService } from './form/pagination/pagination-service'; +import { TableOfContentsFieldComponent } from './form/tableOfContents/table-of-content-field/table-of-content-field.component'; +import { ProgressBarComponent } from './form/pprogress-bar/progress-bar.component'; +import { TableOfContentsSectionComponent } from './form/tableOfContents/table-of-content-section/table-of-content-section.component'; +import { TableOfContentsGroupComponent } from './form/tableOfContents/table-of-content-group/table-of-content-group.component'; +import { TableOfContentsFieldSetComponent } from './form/tableOfContents/table-of-content-fieldset/table-of-content-fieldset.component'; +import { TableOfContentsComponent } from './form/tableOfContents/table-of-contents.component'; +import { DynamicFieldRadioBoxComponent } from './form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component'; +import { DynamicFieldBooleanDecisionComponent } from './form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component'; +import { AutocompleteRemoteComponent } from './form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component'; +import { DynamicFieldDropdownComponent } from './form/dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown'; +import { DynamicFieldCheckBoxComponent } from './form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox'; +import { VisibilityRulesService } from './visibility-rules/visibility-rules.service'; +import { DynamicFormSectionComponent } from './form/dynamic-form-section/dynamic-form-section'; +import { DynamicFormCompositeFieldComponent } from './form/dynamic-form-composite-field/dynamic-form-composite-field'; import { BrowserModule } from '@angular/platform-browser'; import { NgModule, forwardRef } from '@angular/core'; import { FormsModule, ReactiveFormsModule, NG_VALUE_ACCESSOR } from '@angular/forms'; -import { HttpClientModule } from '@angular/common/http'; +import { HttpClientModule, HttpClient } from '@angular/common/http'; import { HttpModule } from '@angular/http'; import { RouterModule, Routes, Router } from '@angular/router'; -//import {DataTableModule } from 'angular-4-data-table-bootstrap-4'; -import { DataTableModule } from "angular2-datatable"; - -//import { OrganisationTableFilterPipe } from './pipes/organisation-table-filter.pipe'; - import { AppComponent } from './app.component'; -import { RestBase } from './services/rest-base'; import { DynamicFormComponent } from './form/dynamic-form.component'; -import { DynamicFormFieldComponent } from './form/fields/dynamic-form-field.component'; -import { ServerService } from './services/server.service'; -import { GlobalVariables } from './services/global-variables.service'; -import { TokenService, TokenProvider } from './services/login/token.service'; -import { LocalStorageService } from 'ngx-webstorage'; -import { dataModelBuilder } from './services/dataModelBuilder.service'; +import { DynamicFormFieldComponent } from './form/dynamic-fields/dynamic-form-field.component'; import { DynamicFormGroupComponent } from './form/dynamic-form-group/dynamic-form-group.component'; -import { AppRoutingModule } from './app-routing.module'; +import { AppRoutingModule } from './app-routing.module'; import { AuthGuard } from './guards/auth.guard'; -import { PageNotFoundComponent } from './not-found.component'; -import { HomepageComponent } from './homepage/homepage.component'; -import { TocComponent } from './form/tableOfContents/toc.component'; -import { ConfirmationComponent } from './widgets/confirmation/confirmation.component'; - - -import { PaginationService } from './services/pagination.service'; -import { EestoreService } from './services/eestore.service'; -import { GlobalInterceptor } from './services/interceptor'; - - -import { TabModule } from './tabs/tab.module'; -import { AngularDraggableModule } from 'angular2-draggable'; - -import { NativeLoginService } from './services/login/native-login.service'; -import { GooggleSignInComponent } from './login/googgle-sign-in/googgle-sign-in.component'; -import { MainSignInComponent } from './login/main-sign-in/main-sign-in.component'; -import { NguiAutoCompleteModule } from '@ngui/auto-complete'; - +import { PageNotFoundComponent } from './not-found.component'; +import { HomepageComponent } from './homepage/homepage.component'; import { HTTP_INTERCEPTORS } from '@angular/common/http'; +import { CommonModule } from '@angular/common'; -import {BreadcrumbModule,MenuItem} from 'primeng/primeng'; - -import { CommonModule } from '@angular/common'; - -import { DatasetTableFilterPipe } from './pipes/dataset-table-filter.pipe'; -import { DatasetStatusFilterPipe } from './pipes/dataset-status-filter.pipe'; -import { DatasetsComponent } from './datasets/dataset.component'; - - -import { DmpComponent } from './dmps/dmp.component'; -import { DmpTableFilterPipe } from './pipes/dmp-table-filter.pipe'; -import { DmpStatusFilterPipe } from './pipes/dmp-status-filter.pipe'; -import { DmpVersionFilterPipe } from './pipes/dmp-version-filter.pipe'; - - -import { ProjectTableFilterPipe } from './pipes/project-table-filter.pipe'; -import { ProjectsComponent } from './projects/projects.component'; -import { ProjectDetailComponent } from './projects/project.detail'; -import { ModalComponent } from './modal/modal.component'; -import { NgDatepickerModule } from 'ng2-datepicker'; - -import { StatusToString } from './pipes/various/status-to-string'; -import { SidebarModule } from 'ng-sidebar'; -import { AutocompleteRemoteComponent } from './form/fields/autocomplete-remote/autocomplete-remote.component'; - -import { Ng4LoadingSpinnerModule } from 'ng4-loading-spinner'; -import { BreadcrumbComponent } from './widgets/breadcrumb/breadcrumb.component'; -import { DmpDetailedComponent } from './viewers/dmp-detailed/dmp-detailed.component'; -import { ProjectDetailedComponent } from './viewers/project-detailed/project-detailed.component'; - +import { TranslateModule } from '@ngx-translate/core'; +import { TranslateLoader } from '@ngx-translate/core'; +import { TranslateHttpLoader } from '@ngx-translate/http-loader'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { SharedModule } from './shared/shared.module'; +import { MaterialModule } from './shared/material/material.module'; +import { AuthService } from './services/auth/auth.service'; +import { ProjectListingComponent } from './projects/project-listing.component'; +import { DashboardService } from './services/dashboard/dashboard.service'; +import { DatasetService } from './services/dataset/dataset.service'; +import { BaseHttpService } from './utilities/cite-http-service-module/base-http.service'; +import { DataManagementPlanListingComponent } from './dmps/dmp-listing.component'; +import { ProjectEditorComponent } from './projects/editor/project-editor.component'; +import { DataManagementPlanEditorComponent } from './dmps/editor/dmp-editor.component'; +import { FigurecardComponent } from './shared/components/figurecard/figurecard.component'; +import { DatasetListingComponent } from './datasets/dataset-listing.component'; +import { DatasetEditorComponent } from './datasets/editor/dataset-editor.component'; +import { DatasetWizardComponent } from './dataset-wizard/dataset-wizard.component'; +import { AutocompleteComponent } from './shared/components/autocomplete/autocomplete.component'; @@ -81,56 +65,91 @@ import { ProjectDetailedComponent } from './viewers/project-detailed/project-det DynamicFormComponent, DynamicFormFieldComponent, DynamicFormGroupComponent, - TocComponent, - GooggleSignInComponent, - MainSignInComponent, + DynamicFormCompositeFieldComponent, + DynamicFieldBooleanDecisionComponent, + DynamicFieldRadioBoxComponent, + TableOfContentsComponent, + TableOfContentsFieldSetComponent, + TableOfContentsGroupComponent, + TableOfContentsSectionComponent, PageNotFoundComponent, HomepageComponent, - ModalComponent, - ProjectDetailComponent, - ProjectsComponent, - DmpComponent, - DatasetsComponent, - ConfirmationComponent, + ProjectListingComponent, + DatasetListingComponent, + DataManagementPlanListingComponent, AutocompleteRemoteComponent, - - ProjectTableFilterPipe, - DmpVersionFilterPipe, - DmpStatusFilterPipe, - DmpTableFilterPipe, - DatasetTableFilterPipe, - DatasetStatusFilterPipe, - StatusToString, - BreadcrumbComponent, DmpDetailedComponent, ProjectDetailedComponent + DynamicFieldDropdownComponent, + DynamicFormSectionComponent, + TableOfContentsFieldComponent, + ProgressBarComponent, + DynamicFieldCheckBoxComponent, + ProjectEditorComponent, + DataManagementPlanEditorComponent, + InvitationComponent, + InvitationAcceptedComponent, + DatasetWizardComponent, + FigurecardComponent, + DatasetEditorComponent, + AutocompleteComponent ], imports: [ BrowserModule, ReactiveFormsModule, + SharedModule, FormsModule, + LoginModule.forRoot({ + loginProviders: [ + LoginOptions.facebookOauth, + LoginOptions.googleOauth, + LoginOptions.nativeLogin, + LoginOptions.linkedInOauth, + LoginOptions.twitterOauth + ], + facebookConfiguration: { clientId: "110586756143149" }, + googleConfiguration: { clientId: '524432312250-sc9qsmtmbvlv05r44onl6l93ia3k9deo.apps.googleusercontent.com' }, + linkedInConfiguration: { + clientId: "86bl8vfk77clh9", + oauthUrl: "https://www.linkedin.com/oauth/v2/authorization", + redirectUri: HostConfiguration.App + "login/linkedin", + accessTokenUri: "https://www.linkedin.com/oauth/v2/accessToken", + clientSecret: "2OCO9e3wKylW05Tt" + }, + twitterConfiguration: { clientId: "HiR4hQH9HNubKC5iKQy0l4mAZ", oauthUrl: "https://api.twitter.com/oauth/authenticate" } + }), HttpModule, HttpClientModule, - TabModule, CommonModule, AppRoutingModule, - AngularDraggableModule, - DataTableModule, - NgDatepickerModule, - Ng4LoadingSpinnerModule, - NguiAutoCompleteModule, - BreadcrumbModule, - SidebarModule.forRoot() - + BrowserAnimationsModule, + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useFactory: HttpLoaderFactory, + deps: [HttpClient] + } + }), + BrowserAnimationsModule, + MaterialModule + ], + providers: [ + VisibilityRulesService, + PaginationService, + AuthGuard, + AuthService, + DashboardService, + DatasetService, + BaseHttpService + ], + entryComponents: [ + InvitationComponent, ], - providers: [{ - provide: HTTP_INTERCEPTORS, - useClass: GlobalInterceptor, - multi: true, - }, - ServerService, dataModelBuilder, GlobalVariables, AuthGuard, PaginationService, TokenService, LocalStorageService, RestBase, EestoreService,NativeLoginService - ], bootstrap: [AppComponent] }) export class AppModule { constructor() { } } + +export function HttpLoaderFactory(httpClient: HttpClient) { + return new TranslateHttpLoader(httpClient, 'assets/lang/', '.json'); +} diff --git a/dmp-frontend/src/app/dataset-wizard/dataset-wizard.component.html b/dmp-frontend/src/app/dataset-wizard/dataset-wizard.component.html new file mode 100644 index 000000000..57d67afeb --- /dev/null +++ b/dmp-frontend/src/app/dataset-wizard/dataset-wizard.component.html @@ -0,0 +1,103 @@ +
+

New {{datasetWizardModel?.dmp?.project?.label}} Dataset

+

{{datasetWizardModel?.dmp?.project?.label}} Dataset

+ + +
+ {{'DATASET-WIZARD.FIRST-STEP.TITLE' | translate}} + + + + + + {{profile.label}} + + + {{baseErrorModel['Criteria.status']}} + + + +
+
+ +
+ {{'DATASET-WIZARD.SECOND-STEP.TITLE' | translate}} + + +
{{chip.name.substring(0, 1).toUpperCase()}}
+ {{chip.name}} +
+ +
+ {{option.name}} +
+
+ +
+ + + +
{{chip.label.substring(0, 1).toUpperCase()}}
+ {{chip.name}} +
+ +
+ {{option.name}} +
+
+ +
+ + + +
{{chip.label.substring(0, 1).toUpperCase()}}
+ {{chip.name}} +
+ +
+ {{option.name}} +
+
+ +
+ + + +
{{chip.label.substring(0, 1).toUpperCase()}}
+ {{chip.label}} +
+ +
+ {{option.label}} +
+
+ +
+ + +
+
+ + {{'DATASET-WIZARD.THIRD-STEP.TITLE' | translate}} + + + +
+ + +
\ No newline at end of file diff --git a/dmp-frontend/src/app/dataset-wizard/dataset-wizard.component.scss b/dmp-frontend/src/app/dataset-wizard/dataset-wizard.component.scss new file mode 100644 index 000000000..90db00ca7 --- /dev/null +++ b/dmp-frontend/src/app/dataset-wizard/dataset-wizard.component.scss @@ -0,0 +1,46 @@ +.full-width { + width: 100%; +} + +.input-table { + table-layout: fixed; +} + +.table-card .mat-grid-tile { + background: rgba(0, 0, 0, 0.32); +} + +.dataset-wizard { + .full-width { + width: 100%; + } + mat-form-field { + width: 100%; + padding: 3px; + } + + td-chips { + margin-top: 20px; + } + + .navigation-buttons-container { + margin-top: 20px; + } + + .mat-card { + margin: 16px 0; + } + + p { + margin: 16px; + } + + .left-button { + float: left; + } + + .description-area { + height: 100px; + } + +} diff --git a/dmp-frontend/src/app/dataset-wizard/dataset-wizard.component.ts b/dmp-frontend/src/app/dataset-wizard/dataset-wizard.component.ts new file mode 100644 index 000000000..fc35c438d --- /dev/null +++ b/dmp-frontend/src/app/dataset-wizard/dataset-wizard.component.ts @@ -0,0 +1,254 @@ +import { DatasetProfileDefinitionModel } from '../models/DatasetProfileDefinitionModel'; +import { TranslateService } from '@ngx-translate/core'; +import { BaseErrorModel } from '../models/error/BaseErrorModel'; +import { ActivatedRoute, Router, Params } from '@angular/router'; +import { DatasetService } from '../services/dataset/dataset.service'; +import { DatasetWizardModel } from '../models/datasets/DatasetWizardModel'; +import { DatasetProfileCriteria } from '../models/criteria/dataset-profile/DatasetProfileCriteria'; +import { Component, ViewChild, OnInit, AfterViewInit, ViewEncapsulation } from "@angular/core"; +import { DataManagementPlanService } from "../services/data-management-plan/data-management-plan.service"; +import { FormGroup, Validators, FormBuilder } from "@angular/forms"; +import { AutoCompleteConfiguration } from "../shared/components/autocomplete/AutoCompleteConfiguration"; +import { DatasetWizardService } from "../services/dataset-wizard/dataset-wizard.service"; +import { DataManagementPlanCriteria } from "../models/criteria/data-management-plan/DataManagementPlanCriteria"; +import { DataManagementPlanModel } from "../models/data-managemnt-plans/DataManagementPlanModel"; +import { JsonSerializer } from "../utilities/JsonSerializer"; +import { Observable } from "rxjs/Observable"; +import { RequestItem } from "../models/criteria/RequestItem"; +import { MatPaginator, MatSort, MatSnackBar } from "@angular/material"; +import { SnackBarNotificationComponent } from "../shared/components/notificaiton/snack-bar-notification.component"; +import { DatasetProfileModel } from '../models/datasetprofile/DatasetProfileModel'; +import { ExternalSourcesItemModel } from '../models/external-sources/ExternalSourcesItemModel'; +import { ExternalSourcesService } from '../services/external-sources/external-sources.service'; + +@Component({ + selector: 'app-dataset-wizard-component', + templateUrl: 'dataset-wizard.component.html', + styleUrls: ['./dataset-wizard.component.scss'], + providers: [DatasetWizardService, ExternalSourcesService, DataManagementPlanService], + encapsulation: ViewEncapsulation.None +}) +export class DatasetWizardComponent implements AfterViewInit { + + //dmpAutoCompleteConfiguration: AutoCompleteConfiguration; + //datasetProfileAutoCompleteConfiguration: AutoCompleteConfiguration; + datasetWizardModel: DatasetWizardModel; + isNew = true; + formGroup: FormGroup; + + availableProfiles: DatasetProfileModel[] = []; + + filtereddataRepositoriesAsync: boolean = false; + filteredRegistriesAsync: boolean = false; + filteredServicesAsync: boolean = false; + filteredExternalDatasetsAsync: boolean = false; + + filtereddataRepositories: ExternalSourcesItemModel[]; + filteredRegistries: ExternalSourcesItemModel[]; + filteredServices: ExternalSourcesItemModel[]; + filteredExternalDatasets: ExternalSourcesItemModel[]; + + constructor( + private datasetWizardService: DatasetWizardService, + private formBuilder: FormBuilder, + private datasetService: DatasetService, + private route: ActivatedRoute, + public snackBar: MatSnackBar, + public router: Router, + public language: TranslateService, + public externalSourcesService: ExternalSourcesService, + public dataManagementPlanService: DataManagementPlanService + ) { + + } + + isLinear = false; + firstStepFormGroup: FormGroup; + secondFormGroup: FormGroup; + + ngOnInit() { + let dmpRequestItem: RequestItem = new RequestItem(); + dmpRequestItem.criteria = new DataManagementPlanCriteria(); + //this.dmpAutoCompleteConfiguration = new AutoCompleteConfiguration(this.datasetWizardService.userDmps.bind(this.datasetWizardService), dmpRequestItem); + + + this.route.params.subscribe((params: Params) => { + const itemId = params['id']; + const dmpId = params['dmpId']; + if (itemId != null) { + this.isNew = false; + this.datasetWizardService.getSingle(itemId).map(data => data as DatasetWizardModel) + .subscribe(data => { + this.datasetWizardModel = JsonSerializer.fromJSONObject(data, DatasetWizardModel); + this.formGroup = this.datasetWizardModel.buildForm(); + this.loadDatasetProfiles(); + }); + } else if (dmpId != null) { + this.isNew = true; + this.dataManagementPlanService.getSingle(dmpId).map(data => data as DataManagementPlanModel) + .subscribe(data => { + this.datasetWizardModel = new DatasetWizardModel(); + setTimeout(() => { + this.datasetWizardModel.dmp = data; + this.formGroup = this.datasetWizardModel.buildForm(); + this.loadDatasetProfiles(); + }); + }); + } else { + + } + }); + + + } + + loadDatasetProfiles() { + let datasetProfileRequestItem: RequestItem = new RequestItem(); + datasetProfileRequestItem.criteria = new DatasetProfileCriteria(); + datasetProfileRequestItem.criteria.id = this.datasetWizardModel.dmp.id; + this.datasetWizardService.getAvailableProfiles(datasetProfileRequestItem).subscribe(items => { + this.availableProfiles = items; + }); + } + ngAfterViewInit() { + // this.route.params.subscribe((params: Params) => { + // const itemId = params['id']; + + // if (itemId != null) { + // this.isNew = false; + // this.dataManagementPlanService.getSingle(itemId).map(data => data as DataManagementPlanModel) + // .subscribe(data => { + // this.dataManagementPlan = new JsonSerializer().fromJSONObject(data, DataManagementPlanModel); + // this.formGroup = this.dataManagementPlan.buildForm(); + // }); + // } else { + // this.dataManagementPlan = new DataManagementPlanModel(); + // setTimeout(() => { + // this.formGroup = this.dataManagementPlan.buildForm(); + // }); + // } + // }); + } + + public cancel(): void { + //this.router.navigate(['/dataManagementPlans']); + } + + + formSubmit(): void { + //this.touchAllFormFields(this.formGroup); + //if(this.isNew)return; + if (!this.isFormValid()) { return; } + this.onSubmit(); + } + + public isFormValid() { + return this.formGroup.valid; + } + + onSubmit(): void { + this.datasetWizardService.createDataset(this.formGroup.value).subscribe( + complete => { + this.datasetWizardService.getSingle(complete.id).subscribe( + result => { + this.datasetWizardModel = JsonSerializer.fromJSONObject(result, DatasetWizardModel); + } + ) + this.onCallbackSuccess() + }, + error => this.onCallbackError(error) + ); + } + + onCallbackSuccess(): void { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: this.isNew ? 'GENERAL.SNACK-BAR.SUCCESSFUL-CREATION' : 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-success'] + }) + } + + onCallbackError(error: any) { + this.setErrorModel(error.error); + //this.validateAllFormFields(this.formGroup); + } + + public setErrorModel(errorModel: BaseErrorModel) { + Object.keys(errorModel).forEach(item => { + (this.datasetWizardModel.errorModel)[item] = (errorModel)[item]; + }) + } + + filterdataRepositories(value: string): void { + + this.filtereddataRepositories = undefined; + if (value) { + this.filtereddataRepositoriesAsync = true; + + this.externalSourcesService.searchDatasetRepository(value).subscribe(items => { + this.filtereddataRepositories = items; + this.filtereddataRepositoriesAsync = false; + + // this.filteredOrganisations = items.filter((filteredObj: any) => { + // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // }); + + }); + } + } + + filterRegistries(value: string): void { + + this.filteredRegistries = undefined; + if (value) { + this.filteredRegistriesAsync = true; + + this.externalSourcesService.searchDatasetRegistry(value).subscribe(items => { + this.filteredRegistries = items; + this.filteredRegistriesAsync = false; + + // this.filteredOrganisations = items.filter((filteredObj: any) => { + // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // }); + + }); + } + } + + filterServices(value: string): void { + + this.filteredServices = undefined; + if (value) { + this.filteredServicesAsync = true; + + this.externalSourcesService.searchDatasetService(value).subscribe(items => { + this.filteredServices = items; + this.filteredServicesAsync = false; + + // this.filteredOrganisations = items.filter((filteredObj: any) => { + // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // }); + + }); + } + } + + + filterExternalDatasets(value: string): void { + + this.filteredExternalDatasets = undefined; + if (value) { + this.filteredExternalDatasetsAsync = true; + + this.externalSourcesService.searchDatasetSExternalDatasetservice(value).subscribe(items => { + this.filteredExternalDatasets = items; + this.filteredExternalDatasetsAsync = false; + + // this.filteredOrganisations = items.filter((filteredObj: any) => { + // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // }); + + }); + } + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/datasets/dataset-listing.component.html b/dmp-frontend/src/app/datasets/dataset-listing.component.html new file mode 100644 index 000000000..3c4e24dbe --- /dev/null +++ b/dmp-frontend/src/app/datasets/dataset-listing.component.html @@ -0,0 +1,84 @@ +
+

{{titlePrefix}} {{'DATASET-LISTING.TITLE' | translate}}

+ + + + + + + + + + + + {{'DATASET-LISTING.COLUMNS.NAME' | translate}} + {{row.label}} + + + + + {{'DATASET-LISTING.COLUMNS.DMP' | translate}} + {{row.dmp}} + + + + + {{'DATASET-LISTING.COLUMNS.PROFILE' | translate}} + {{row.profile}} + + + + + {{'DATASET-LISTING.COLUMNS.DATAREPOSITORIES' | translate}} + {{row.dataRepositories}} + + + + + {{'DATASET-LISTING.COLUMNS.REGISTRIES' | translate}} + {{row.registries}} + + + + + {{'DATASET-LISTING.COLUMNS.SERVICES' | translate}} + {{row.services}} + + + + + + + + {{'DATASET-LISTING.COLUMNS.DESCRIPTION' | translate}} + {{row.description}} + + + + + {{'DATASET-LISTING.COLUMNS.CREATED' | translate}} + {{row.created | date:'shortDate'}} + + + + + {{'DATASET-LISTING.COLUMNS.ACTIONS' | translate}} + + + + + + + + + + + + +
\ No newline at end of file diff --git a/dmp-frontend/src/app/datasets/dataset-listing.component.scss b/dmp-frontend/src/app/datasets/dataset-listing.component.scss new file mode 100644 index 000000000..2688cb118 --- /dev/null +++ b/dmp-frontend/src/app/datasets/dataset-listing.component.scss @@ -0,0 +1,35 @@ +.mat-table { + margin: 24px; +} + +.mat-fab-bottom-right { + top: auto !important; + right: 20px !important; + bottom: 10px !important; + left: auto !important; + position: fixed !important; +} + +.full-width { + width: 100%; +} + +.mat-card { + margin: 16px 0; +} + +.mat-row { + cursor: pointer; +} + +mat-row:hover { + background-color: lightgray; +} + +// mat-row:nth-child(even){ +// background-color:red; +// } + +mat-row:nth-child(odd){ + background-color:#eef0fb; + } \ No newline at end of file diff --git a/dmp-frontend/src/app/datasets/dataset-listing.component.ts b/dmp-frontend/src/app/datasets/dataset-listing.component.ts new file mode 100644 index 000000000..5ae82eabf --- /dev/null +++ b/dmp-frontend/src/app/datasets/dataset-listing.component.ts @@ -0,0 +1,150 @@ +import { Component, ViewChild, OnInit, AfterViewInit } from "@angular/core"; +import { MatPaginator, MatSort, MatSnackBar } from "@angular/material"; +import { Router, Params, ActivatedRoute } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DataSource } from "@angular/cdk/table"; + +import { DatasetCriteriaComponent } from "../shared/components/criteria/datasets/datasets-criteria.component"; +import { DatasetCriteria } from "../models/criteria/dataset/DatasetCriteria"; +import { Observable } from "rxjs/Observable"; +import { DataTableRequest } from "../models/data-table/DataTableRequest"; +import { SnackBarNotificationComponent } from "../shared/components/notificaiton/snack-bar-notification.component"; +import { DatasetService } from "../services/dataset/dataset.service"; +import { DatasetListingModel } from "../models/datasets/DatasetListingModel"; +import { PageEvent } from '@angular/material'; +import { DataManagementPlanService } from "@app/services/data-management-plan/data-management-plan.service"; +import { DataManagementPlanModel } from "@app/models/data-managemnt-plans/DataManagementPlanModel"; + + +@Component({ + selector: 'app-dataset-listing-component', + templateUrl: 'dataset-listing.component.html', + styleUrls: ['./dataset-listing.component.scss'], + providers: [DatasetService, DataManagementPlanService] +}) +export class DatasetListingComponent implements OnInit { + + @ViewChild(MatPaginator) _paginator: MatPaginator; + @ViewChild(MatSort) sort: MatSort; + @ViewChild(DatasetCriteriaComponent) criteria: DatasetCriteriaComponent; + + + dataSource: DatasetDataSource | null; + displayedColumns: String[] = ['label', 'dmp', 'profile', 'dataRepositories', 'registries', 'services', 'description', 'created', 'actions']; + pageEvent: PageEvent; + titlePrefix: String; + dmpId: String; + + statuses = [ + { value: '0', viewValue: 'Active' }, + { value: '1', viewValue: 'Inactive' } + ]; + + constructor( + private datasetService: DatasetService, + private router: Router, + private languageService: TranslateService, + public snackBar: MatSnackBar, + public route: ActivatedRoute, + public dataManagementPlanService: DataManagementPlanService + ) { + + } + + + ngOnInit() { + this.route.params.subscribe((params: Params) => { + this.dmpId = params['dmpId']; + if(this.dmpId != null) this.setDmpTitle(this.dmpId); + this.criteria.setCriteria(this.getDefaultCriteria(this.dmpId)); + this.refresh(); + this.criteria.setRefreshCallback(() => this.refresh()); + }); + } + + setDmpTitle(dmpId: String) { + this.dataManagementPlanService.getSingle(dmpId).map(data => data as DataManagementPlanModel) + .subscribe(data => { + this.titlePrefix = data.label; + }); + } + + refresh() { + this.dataSource = new DatasetDataSource(this.datasetService, this._paginator, this.sort, this.languageService, this.snackBar, this.criteria); + } + + rowClick(rowId: String) { + this.router.navigate(['/dataset/' + rowId]); + } + + getDefaultCriteria(dmpId: String): DatasetCriteria { + const defaultCriteria = new DatasetCriteria(); + if (dmpId != null) { + defaultCriteria.dmpIds.push(dmpId); + } + return defaultCriteria; + } + +} + +export class DatasetDataSource extends DataSource { + + totalCount = 0; + isLoadingResults = false; + + constructor( + private _service: DatasetService, + private _paginator: MatPaginator, + private _sort: MatSort, + private _languageService: TranslateService, + private _snackBar: MatSnackBar, + private _criteria: DatasetCriteriaComponent + ) { + super(); + + } + + connect(): Observable { + const displayDataChanges = [ + this._paginator.page + //this._sort.matSortChange + ]; + + + return Observable.merge(...displayDataChanges) + .startWith(null) + .switchMap(() => { + setTimeout(() => { + this.isLoadingResults = true; + }); + const startIndex = this._paginator.pageIndex * this._paginator.pageSize; + const request = new DataTableRequest(startIndex, this._paginator.pageSize); + request.criteria = this._criteria.criteria; + return this._service.getPaged(request); + }) + .catch((error: any) => { + this._snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.SNACK-BAR.FORMS-BAD-REQUEST', language: this._languageService }, + duration: 3000, + extraClasses: ['snackbar-warning'] + }); + //this._criteria.criteria.onCallbackError(error); + return Observable.of(null); + }) + .map(result => { + setTimeout(() => { + this.isLoadingResults = false; + }); + return result; + }) + .map(result => { + if (!result) { return []; } + if (this._paginator.pageIndex === 0) { this.totalCount = result.totalCount; } + return result.data; + }); + } + + disconnect() { + // No-op + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/datasets/dataset.component.css b/dmp-frontend/src/app/datasets/dataset.component.css deleted file mode 100644 index 44ba4eb62..000000000 --- a/dmp-frontend/src/app/datasets/dataset.component.css +++ /dev/null @@ -1,47 +0,0 @@ -.invisible { - display:none; -} - -.visible { - display:block; -} - -tr.hover:hover > * { - background-color: #eeeeee; -} - -.editor-container{ - padding-top: 10px; - padding-right: 10px; - padding-bottom: 10px; - padding-left: 10px; -} - -.button-150px { - max-width: 150px; -} - -.ng-template{ - text-align: right; -} - -.grayout-empty-table { - opacity: 0.6; /* Real browsers */ - filter: alpha(opacity = 60); /* MSIE */ - text-align: center; - vertical-align: middle; -} - -.btncustom{ - background-color:#337ab7; - color:white; - margin-top:15px; -} - -.cursor-hand{ - cursor: pointer; -} - -.hidden-keepspace{ - visibility: hidden; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/datasets/dataset.component.ts b/dmp-frontend/src/app/datasets/dataset.component.ts deleted file mode 100644 index 202fc9f0a..000000000 --- a/dmp-frontend/src/app/datasets/dataset.component.ts +++ /dev/null @@ -1,267 +0,0 @@ -import { Component, OnInit, Input, ViewChild, NgZone, Output, EventEmitter } from '@angular/core'; -import { GoogleSignInSuccess } from 'angular-google-signin'; -import { Router, ActivatedRoute } from '@angular/router'; -import { ServerService } from '../../app/services/server.service'; -import { Project } from '../entities/model/project'; -import { Dataset } from '../entities/model/dataset'; -import { Dmp } from '../entities/model/dmp'; -import {DataTable} from 'angular2-datatable'; -import { DropdownField } from '../../app/form/fields/dropdown/field-dropdown'; -import { Param } from '../entities/model/param'; -import { StatusToString } from '../pipes/various/status-to-string'; -import { ConfirmationComponent } from '../widgets/confirmation/confirmation.component'; -import { Ng4LoadingSpinnerService } from 'ng4-loading-spinner'; - -declare var $: any; - - -import '../../assets/custom.js'; -declare function simple_notifier(type: string, title: string, message:string): any; - -@Component({ - selector: 'datasets-table', - templateUrl: 'dataset.html', - styleUrls: ['./dataset.component.css'], - providers: [ServerService] -}) - -export class DatasetsComponent implements OnInit { - - // Start ALTERNATIVE - //whole dmp data model - tableData : any[] = new Array(); - - //organisation editor data model - editingOrganisation: any = {}; - organisationEditorForm : any; - - //required by the table - public filterQuery = ""; - public rowsOnPage = 10; - public sortBy = "label"; - public sortOrder = "asc"; - - dmpIdforDatasets: string; - - - // for tableIds - showIDs : boolean = false; -// END ALTERNATIVE - - returnUrl: string; - @Input() datasets: Dataset[]; - @Input() datasetProfileDropDown: DropdownField; - @Input() datasetCount = 0; - - @Input() dmpLabelforDatasets: string; - @Input() statusDropDown: DropdownField; - dataset: any; - saveAndDescribe:boolean; - - dataSetValue: boolean = true; - - uriRegex = "/^([a-z0-9+.-]+):(?://(?:((?:[a-z0-9-._~!$&'()*+,;=:]|%[0-9A-F]{2})*)@)?((?:[a-z0-9-._~!$&'()*+,;=]|%[0-9A-F]{2})*)(?::(\d*))?(/(?:[a-z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?|(/?(?:[a-z0-9-._~!$&'()*+,;=:@]|%[0-9A-F]{2})+(?:[a-z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?)(?:\?((?:[a-z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*))?(?:#((?:[a-z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*))?$/i"; - - - constructor( - - private serverService: ServerService, - private route: ActivatedRoute, - private router: Router, - private ngZone: NgZone, - private spinnerService: Ng4LoadingSpinnerService) { - - this.dataset = this.createEmptyDataset(); - - this.datasetProfileDropDown = new DropdownField(); - this.datasetProfileDropDown.options = []; - this.saveAndDescribe = false; - this.statusDropDown = new DropdownField(); - this.statusDropDown.options= [{key:'', value:null},{key:'0', value:"Active"},{key:'1', value:"Inactive"}] - - } - - ngOnInit() { - - - this.route - .queryParams - .subscribe(params => { - this.dmpIdforDatasets = params['dmpid']; - this.getDatasets(); - }); - - - this.serverService.getAllDatsetsProfile().subscribe( - response => { - response.forEach((datasetprofile) => { - let params = new Param(); - params.key = datasetprofile.id; - params.value = datasetprofile.label; - this.datasetProfileDropDown.options.push(params); - }, - error => { - simple_notifier("danger",null,"Could not load User's Dataset Profiles"); - } - - ); - - } - ) - } - - createEmptyDataset(){ - return { - id: null, - label: '', - reference: '', - uri: '', - status: 0, - properties: '', - profile: { "id": '' }, - dmp: { "id": '' } - } - } - - SaveDataset(){ - if(this.dataset.id ==null){ - this.dataset.dmp = { "id": this.dmpIdforDatasets } - this.dataset.profile = { "id": this.dataset.profile } - this.serverService.createDatasetForDmp(this.dataset).subscribe( - response => { - simple_notifier("success",null,"Created dataset"); - this.getDatasets(); - if (this.saveAndDescribe == true) - this.describeDataset(response); - }, - error=>{ - simple_notifier("danger",null,"Could not create Dataset"); - } - ) - $("#newDatasetModal").modal("hide"); - - } - else{ - - this.dataset.dmp = { "id": this.dmpIdforDatasets }; - this.dataset.profile = { "id": this.dataset.profile }; - this.dataset.creator = {"id" : this.dataset.creator }; - - this.serverService.updateDatsetsProfile(this.dataset).subscribe( - response => { - simple_notifier("success",null,"Dataset edited"); - this.getDatasets(); - if (this.saveAndDescribe == true) - this.describeDataset(response); - }, - error => { - simple_notifier("danger",null,"Could not edit dataset"); - } - ) - $("#newDatasetModal").modal("hide"); - } - - } - - getDatasets(muted?: boolean){ - this.spinnerService.show(); - this.serverService.getDatasetForDmp({ "id": this.dmpIdforDatasets }).subscribe( - response => { - this.tableData = response; - if(muted && muted!=true) - simple_notifier("success",null,"Updated datasets table"); - }, - error => { - simple_notifier("danger",null,"Could not update datasets table"); - }, - () =>{ - this.spinnerService.hide(); - } - ); - } - - - getDatasetForDmpMethod(dmpid) { - this.spinnerService.show(); - this.serverService.getDatasetForDmp({ "id": dmpid }).subscribe( - response => { - this.tableData = response; - - }, - error => { - console.log("could not retrieve dataset for dpm: "+dmpid); - }, - () =>{ - this.spinnerService.hide(); - } - ); - } - - editRow(item, event) { - if (event.toElement.id == "editDataset"){ - //this.dataset = item; - this.dataset.label = item.label; - this.dataset.uri = item.uri; - this.dataset.created = item.created; - this.dataset.status = item.status; - this.dataset.description = item.description; - //this.dataset.dmp = item.dmp; - this.dataset.profile = item.profile==null ? null : item.profile.id; - this.dataset.id = item.id; - this.dataset.creator = item.creator; - $("#newDatasetModal").modal("show"); - } - else if(event.toElement.id == "describeDataset"){ - this.describeDataset(item); - } - - } - - newDataset() { - this.dataset = this.createEmptyDataset(); - this.dataset.dmp =this.dmpLabelforDatasets; - this.dataset.status = 0; - $("#newDatasetModal").modal("show"); - } - - SaveDescribeDataset(){ - this.saveAndDescribe = true; - this.SaveDataset(); - } - - describeDataset(item) { - this.router.navigate(['/dynamic-form'], { queryParams: {id: item.profile.id, datasetId:item.id, label: item.label}}); - //this.ngZone.run(() => this.router.navigate(['dynamic-form', {id: item.profile.id, datasetId:item.id, label: item.label}])); - } - - markDatasetForDelete(dataset){ - this.dataset = dataset; - } - - deleteDataset(confirmation){ - if(confirmation==true) - this.deleteRow(this.dataset); - } - - - deleteRow(dataset){ - this.serverService.deleteDataset(dataset).subscribe( - response => { - simple_notifier("success",null,"Deleted dataset"); - this.getDatasets(); - }, - err => { - - if(err.status>=200 && err.status<300) - simple_notifier("success",null,"Deleted dataset"); - else - simple_notifier("danger",null,"Could not delete the dataset"); - this.getDatasets(); - - } - ); - } - - - -} diff --git a/dmp-frontend/src/app/datasets/dataset.html b/dmp-frontend/src/app/datasets/dataset.html deleted file mode 100644 index ff2f5c9d8..000000000 --- a/dmp-frontend/src/app/datasets/dataset.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - -
- ID - - Label - - Uri - - Profile - - Description - - Created at - - Status - - Actions -
No elements
{{dataset.id}}{{(dataset?.label?.length > 80) ? (dataset?.label | slice:0:80)+'...':(dataset?.label) }}{{(dataset?.uri?.length > 40) ? (dataset?.uri | slice:0:40)+'...':(dataset?.uri) }}{{(dataset?.profile?.label?.length > 40) ? (dataset?.profile?.label | slice:0:40)+'...':(dataset?.profile?.label) }}{{(dataset?.description?.length > 40) ? (dataset?.description | slice:0:40)+'...':(dataset?.description) }}{{dataset?.created | date:'yyyy-MM-dd HH:mm:ss Z'}}{{dataset?.status | statusToString }} - - - - - -
- - -
- - - - - - - diff --git a/dmp-frontend/src/app/datasets/editor/dataset-editor.component.html b/dmp-frontend/src/app/datasets/editor/dataset-editor.component.html new file mode 100644 index 000000000..12e14b714 --- /dev/null +++ b/dmp-frontend/src/app/datasets/editor/dataset-editor.component.html @@ -0,0 +1,99 @@ +
+
+ + + + + {{baseErrorModel.label}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + + {{baseErrorModel.uri}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + + + + {{errorModel.description}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + + +
+ +
\ No newline at end of file diff --git a/dmp-frontend/src/app/datasets/editor/dataset-editor.component.scss b/dmp-frontend/src/app/datasets/editor/dataset-editor.component.scss new file mode 100644 index 000000000..289699735 --- /dev/null +++ b/dmp-frontend/src/app/datasets/editor/dataset-editor.component.scss @@ -0,0 +1,38 @@ +.full-width { + width: 100%; +} + +.input-table { + table-layout: fixed; +} + +.table-card .mat-grid-tile { + background: rgba(0, 0, 0, 0.32); +} + +.project-editor { + .mat-form-field-full-width{ + mat-form-field { + width: 100%; + padding: 3px; + } + } + + + .mat-card { + margin: 16px 0; + } + + p { + margin: 16px; + } + + .left-button { + float: left; + } + + .description-area { + height: 100px; + } + +} diff --git a/dmp-frontend/src/app/datasets/editor/dataset-editor.component.ts b/dmp-frontend/src/app/datasets/editor/dataset-editor.component.ts new file mode 100644 index 000000000..4e369f0fa --- /dev/null +++ b/dmp-frontend/src/app/datasets/editor/dataset-editor.component.ts @@ -0,0 +1,128 @@ +import { AfterViewInit, Component, Input, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; +import { MatPaginator, MatSort, MatSnackBar } from "@angular/material"; +import { Router, ActivatedRoute, Params } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DataSource } from "@angular/cdk/table"; +import { Observable } from "rxjs/Observable"; +import { JsonSerializer } from "../../utilities/JsonSerializer"; +import { FormGroup } from "@angular/forms"; +import { SnackBarNotificationComponent } from "../../shared/components/notificaiton/snack-bar-notification.component"; +import { BaseErrorModel } from "../../models/error/BaseErrorModel"; +import { DatasetService } from "../../services/dataset/dataset.service"; +import { DatasetModel } from "../../models/datasets/DatasetModel"; +import { ExternalSourcesService } from "../../services/external-sources/external-sources.service"; +import { ExternalSourcesItemModel } from "../../models/external-sources/ExternalSourcesItemModel"; + + + +@Component({ + selector: 'app-dataset-editor-component', + templateUrl: 'dataset-editor.component.html', + styleUrls: ['./dataset-editor.component.scss'], + providers: [DatasetService, ExternalSourcesService], + encapsulation: ViewEncapsulation.None +}) +export class DatasetEditorComponent implements AfterViewInit { + + isNew = true; + dataset: DatasetModel; + @Input() formGroup: FormGroup = null; + + // filtereddataRepositoriesAsync: boolean = false; + // filteredRegistriesAsync: boolean = false; + // filteredServicesAsync: boolean = false; + + // filtereddataRepositories: ExternalSourcesItemModel[]; + // filteredRegistries: ExternalSourcesItemModel[]; + // filteredServices: ExternalSourcesItemModel[]; + + constructor( + private datasetService: DatasetService, + private externalSourcesService: ExternalSourcesService, + private route: ActivatedRoute, + public snackBar: MatSnackBar, + public router: Router, + public language: TranslateService, + ) { + + } + + ngAfterViewInit() { + /* this.route.params.subscribe((params: Params) => { + const itemId = params['id']; + + if (itemId != null) { + this.isNew = false; + this.datasetService.getSingle(itemId).map(data => data as DatasetModel) + .subscribe(data => { + this.dataset = new JsonSerializer().fromJSONObject(data, DatasetModel); + this.formGroup = this.dataset.buildForm(); + }); + } else { + this.dataset = new DatasetModel(); + setTimeout(() => { + this.formGroup = this.dataset.buildForm(); + }); + } + }); */ + } + + + public cancel(): void { + this.router.navigate(['/datasets']); + } + + // filterdataRepositories(value: string): void { + + // this.filtereddataRepositories = undefined; + // if (value) { + // this.filtereddataRepositoriesAsync = true; + + // this.externalSourcesService.searchDMPOrganizations(value).subscribe(items => { + // this.filtereddataRepositories = items; + // this.filtereddataRepositoriesAsync = false; + + // // this.filteredOrganisations = items.filter((filteredObj: any) => { + // // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // // }); + + // }); + // } + // } + + // filterRegistries(value: string): void { + + // this.filteredRegistries = undefined; + // if (value) { + // this.filteredRegistriesAsync = true; + + // this.externalSourcesService.searchDMPResearchers(value).subscribe(items => { + // this.filteredRegistries = items; + // this.filteredRegistriesAsync = false; + + // // this.filteredOrganisations = items.filter((filteredObj: any) => { + // // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // // }); + + // }); + // } + // } + + // filterServices(value: string): void { + + // this.filteredServices = undefined; + // if (value) { + // this.filteredServicesAsync = true; + + // this.externalSourcesService.searchDatasetService(value).subscribe(items => { + // this.filteredServices = items; + // this.filteredServicesAsync = false; + + // // this.filteredOrganisations = items.filter((filteredObj: any) => { + // // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // // }); + + // }); + // } + // } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/dmps/dmp-listing.component.html b/dmp-frontend/src/app/dmps/dmp-listing.component.html new file mode 100644 index 000000000..44003cc95 --- /dev/null +++ b/dmp-frontend/src/app/dmps/dmp-listing.component.html @@ -0,0 +1,75 @@ +
+

{{'DMP-LISTING.TITLE' | translate}}

+ + + + + + + + + + + + {{'DMP-LISTING.COLUMNS.NAME' | translate}} + {{row.label}} + + + + + {{'DMP-LISTING.COLUMNS.PROJECT' | translate}} + {{row.project}} + + + + + + + + {{'DMP-LISTING.COLUMNS.RESEARCHERS' | translate}} + {{row.researchers}} + + + + + {{'DMP-LISTING.COLUMNS.ORGANISATIONS' | translate}} + {{row.organisations}} + + + + + {{'DMP-LISTING.COLUMNS.VERSION' | translate}} + {{row.version}} + + + + {{'DMP-LISTING.COLUMNS.ACTIONS' | translate}} + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/dmp-frontend/src/app/dmps/dmp-listing.component.scss b/dmp-frontend/src/app/dmps/dmp-listing.component.scss new file mode 100644 index 000000000..4ad3cb49f --- /dev/null +++ b/dmp-frontend/src/app/dmps/dmp-listing.component.scss @@ -0,0 +1,27 @@ +.mat-table { + margin: 24px; +} + +.mat-fab-bottom-right { + top: auto !important; + right: 20px !important; + bottom: 10px !important; + left: auto !important; + position: fixed !important; +} + +.full-width { + width: 100%; +} + +.mat-card { + margin: 16px 0; +} + +.mat-row { + cursor: pointer; +} + +mat-row:hover { + background-color: lightgray; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/dmps/dmp-listing.component.ts b/dmp-frontend/src/app/dmps/dmp-listing.component.ts new file mode 100644 index 000000000..da2aac5de --- /dev/null +++ b/dmp-frontend/src/app/dmps/dmp-listing.component.ts @@ -0,0 +1,140 @@ +import { InvitationComponent } from '../invitation/invitation.component'; +import { Component, ViewChild, OnInit, AfterViewInit } from "@angular/core"; +import { MatPaginator, MatSort, MatSnackBar, MatDialog } from "@angular/material"; +import { Router } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DataSource } from "@angular/cdk/table"; +import { Observable } from "rxjs/Observable"; +import { SnackBarNotificationComponent } from "../shared/components/notificaiton/snack-bar-notification.component"; +import { DataManagementPlanService } from "../services/data-management-plan/data-management-plan.service"; +import { DataManagementPlanCriteriaComponent } from "../shared/components/criteria/data-management-plan/dmp-criteria.component"; +import { DataManagementPlanCriteria } from "../models/criteria/data-management-plan/DataManagementPlanCriteria"; +import { DataManagementPlanListingModel } from "../models/data-managemnt-plans/DataManagementPlanListingModel"; +import { DataTableRequest } from '../models/data-table/DataTableRequest'; + + + +@Component({ + selector: 'app-dmp-listing-component', + templateUrl: 'dmp-listing.component.html', + styleUrls: ['./dmp-listing.component.scss'], + providers: [DataManagementPlanService] +}) +export class DataManagementPlanListingComponent implements OnInit { + + @ViewChild(MatPaginator) _paginator: MatPaginator; + @ViewChild(MatSort) sort: MatSort; + @ViewChild(DataManagementPlanCriteriaComponent) criteria: DataManagementPlanCriteriaComponent; + + dataSource: DataManagementPlanDataSource | null; + displayedColumns: String[] = ['name', 'project', 'researchers', 'organisations', 'version', 'actions']; + + constructor( + private dataManagementPlanService: DataManagementPlanService, + private router: Router, + private languageService: TranslateService, + public snackBar: MatSnackBar, + public dialog: MatDialog + ) { + + } + + ngOnInit() { + this.criteria.setCriteria(this.getDefaultCriteria()); + this.refresh(); + this.criteria.setRefreshCallback(() => this.refresh()); + } + + refresh() { + this.dataSource = new DataManagementPlanDataSource(this.dataManagementPlanService, this._paginator, this.sort, this.languageService, this.snackBar, this.criteria, ); + } + + rowClick(rowId: String) { + this.router.navigate(['/dmp/' + rowId]); + } + + addDataset(rowId: String) { + this.router.navigate(['/dataset/new/' + rowId]); + } + + showDatasets(rowId: String) { + this.router.navigate(['/datasets/' + rowId]); + } + + newVersion(rowId: String) { + //this.router.navigate(['/datasets/' + rowId]); + } + + getDefaultCriteria(): DataManagementPlanCriteria { + const defaultCriteria = new DataManagementPlanCriteria(); + return defaultCriteria; + } + + openShareDialog(rowId: any, rowName: any) { + let dialogRef = this.dialog.open(InvitationComponent, { + height: '200px', + width: '700px', + data: { + dmpId: rowId, + dmpName: rowName + } + }); + } +} + +export class DataManagementPlanDataSource extends DataSource { + + totalCount = 0; + isLoadingResults = false; + + constructor( + private _service: DataManagementPlanService, + private _paginator: MatPaginator, + private _sort: MatSort, + private _languageService: TranslateService, + private _snackBar: MatSnackBar, + private _criteria: DataManagementPlanCriteriaComponent + ) { + super(); + } + + connect(): Observable { + const displayDataChanges = [ + this._paginator.page + ]; + + return Observable.merge(...displayDataChanges) + .startWith(null) + .switchMap(() => { + setTimeout(() => { + this.isLoadingResults = true; + }); + const startIndex = this._paginator.pageIndex * this._paginator.pageSize; + const request = new DataTableRequest(startIndex, this._paginator.pageSize); + request.criteria = this._criteria.criteria; + return this._service.getPaged(request); + }) + .catch((error: any) => { + this._snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.SNACK-BAR.FORMS-BAD-REQUEST', language: this._languageService }, + duration: 3000, + extraClasses: ['snackbar-warning'] + }); + return Observable.of(null); + }) + .map(result => { + setTimeout(() => { + this.isLoadingResults = false; + }); + return result; + }) + .map(result => { + if (!result) { return []; } + if (this._paginator.pageIndex === 0) { this.totalCount = result.totalCount; } + return result.data; + }); + } + + disconnect() { + } +} diff --git a/dmp-frontend/src/app/dmps/dmp.component.css b/dmp-frontend/src/app/dmps/dmp.component.css deleted file mode 100644 index f158a1bec..000000000 --- a/dmp-frontend/src/app/dmps/dmp.component.css +++ /dev/null @@ -1,69 +0,0 @@ -.invisible { - display:none; -} - -.visible { - display:block; -} - -tr.hover:hover > * { - background-color: #eeeeee; -} - -.editor-container{ - padding-top: 10px; - padding-right: 10px; - padding-bottom: 10px; - padding-left: 10px; -} - -.button-150px { - max-width: 150px; -} - -.ng-template{ - text-align: right; -} - -.grayout-empty-table { - opacity: 0.6; /* Real browsers */ - filter: alpha(opacity = 60); /* MSIE */ - text-align: center; - vertical-align: middle; -} - -.btncustom{ - background-color:#337ab7; - color:white; - margin-top:15px; -} - -.btnMoreFilters{ - background-color:#337ab7; - color:white; - margin-bottom:0px; -} - -.table>thead>tr.rowFilter>th { - border-bottom: 0px solid white; - -} - -.table>thead>tr>th.rowFilterTopBorder{ - border-top: 0px solid white; -} - -.table-button { - font-size: 1em; - padding: 2px; -} - - -.centered-text{ - text-align: center; -} - -.url-like{ - color: #0645AD; - cursor: pointer; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/dmps/dmp.component.ts b/dmp-frontend/src/app/dmps/dmp.component.ts deleted file mode 100644 index c26303cb6..000000000 --- a/dmp-frontend/src/app/dmps/dmp.component.ts +++ /dev/null @@ -1,277 +0,0 @@ -import { Component, OnInit, Input, Output, EventEmitter, ViewChild } from '@angular/core'; -import { GoogleSignInSuccess } from 'angular-google-signin'; -import { Router, ActivatedRoute } from '@angular/router'; -import { ServerService } from '../../app/services/server.service'; -import { Dmp } from '../entities/model/dmp'; -import { Dataset } from '../entities/model/dataset'; -import { Project } from '../entities/model/project'; -import { ConfirmationComponent } from '../widgets/confirmation/confirmation.component'; - -import { DataTable } from 'angular2-datatable'; -import { DropdownField } from '../../app/form/fields/dropdown/field-dropdown'; -import { Param } from '../entities/model/param'; -import { ModalComponent } from '../modal/modal.component'; -import { HttpErrorResponse } from '@angular/common/http'; -import { FormGroup, FormControl } from '@angular/forms'; //na dw an xreiazontai -import { NgForm } from '@angular/forms'; -import { DatasetsComponent } from '../datasets/dataset.component'; -import { StatusToString } from '../pipes/various/status-to-string'; -import {MenuItem} from 'primeng/primeng'; - -declare var $ :any; - -import '../../assets/custom.js'; -declare function simple_notifier(type: string, title: string, message:string): any; - -@Component({ - selector: 'dmps', - templateUrl: 'dmps.html', - styleUrls: ['./dmp.component.css'], - providers: [ServerService] -}) - -export class DmpComponent implements OnInit{ - - //whole dmp data model - tableData : any[] = new Array(); - - //required by the table - public filterQuery = ""; - public rowsOnPage = 10; - public sortBy = "label"; - public sortOrder = "asc"; - - // for tableIds - showIDs : boolean = false; - - - dmp : any; - - @Input() projectsDropDown:DropdownField; - @Input() statusDropDown: DropdownField; - - @ViewChild(DatasetsComponent) datasetsComponent:DatasetsComponent; - - - constructor( - private serverService: ServerService, - private route: ActivatedRoute, - private router: Router){ - this.projectsDropDown = new DropdownField(); - this.projectsDropDown.options = []; - this.statusDropDown = new DropdownField(); - this.statusDropDown.options= [{key:'', value:null},{key:'0', value:"Active"},{key:'1', value:"Inactive"}] - //this.projects = []; - - } - - - clearDmp() { - - this.dmp = { - id: null, - label: '', - previous:'', - version:'', - //profileData:'', - //project: '', - //profile:{} - } - - } - - ngOnInit() { - - this.getDmps(); - - this.serverService.getAllProjects().subscribe( - response => { - //let params = new Param(); - response.forEach((dmp) => { - let params = new Param(); - params.key = dmp.id; - params.value = dmp.label; - this.projectsDropDown.options.push(params); - }); - - }, - (err: HttpErrorResponse) => { - simple_notifier("danger",null,"Could not load User's Projects"); - } - ) - - this.clearDmp(); - - - } - - - getDmps(muted? : boolean){ - this.serverService.getDmpOfUser().subscribe( - response => { - this.tableData = response; - if(muted && muted!=true) - simple_notifier("success",null,"Refreshed DMPs"); - }, - (err: HttpErrorResponse) => { - simple_notifier("danger",null,"Could not refresh DMPs"); - } - ); - } - - newDMP(){ - - this.dmp.project = {"id" : this.dmp.project}; - this.dmp["version"] = 1; - - this.serverService.createDmpForCurrentUser(this.dmp) - .subscribe( - response =>{ - simple_notifier("success",null,"DMP created"); - this.getDmps(); - }, - error => { - simple_notifier("danger",null,"Could not create the DMP"); - } - ); - $("#newDmpModal").modal("hide"); - } - - updateDMP(){ - - this.dmp.project = {"id":this.dmp.project}; - this.dmp.creator = {"id": this.dmp.creator}; - - this.serverService.updateDmp(this.dmp) - .subscribe( - response =>{ - simple_notifier("success",null,"Edited the DMP"); - this.getDmps(); - }, - error =>{ - simple_notifier("danger",null,"Failed to edit the DMP"); - } - ); - $("#newDmpModal").modal("hide"); - $("#newVersionDmpModal").modal("hide"); - - } - - cloneDMP(dmp){ - dmp = {"id": dmp.id, "label": dmp.label}; - this.serverService.cloneDmp(dmp).subscribe( - response => { - simple_notifier("success",null,"Successfully cloned the DMP"); - this.getDmps(); - }, - error => { - simple_notifier("danger",null,"Failed to clone the DMP"); - } - ); - $("#newVersionDmpModal").modal("hide"); - } - - SaveDmp(){ - if (this.dmp.id == null) - this.newDMP(); - else - this.updateDMP(); - } - - - editDmp(item){ - this.dmp = Object.assign({}, item); - this.dmp.project = item.project.id; - $("#newDmpModal").modal("show"); - } - - editDmpVersion(item){ - this.dmp = Object.assign({}, item); - this.dmp.project = item.project.id; - $("#newVersionDmpModal").modal("show"); - } - - newDmpForm(item){ - - this.clearDmp(); - - $("#newDmpModal").modal("show"); - } - - markDMPForDelete(dmp){ - this.dmp = dmp; - } - - deleteDMP(confirmation){ - if(confirmation==true) - this.deleteRow(this.dmp); - } - - deleteRow(dmp){ - - this.dmp = {"id": this.dmp.id}; //only id is needed to delete - - this.serverService.deleteDmp(dmp).subscribe( - response => { - simple_notifier("success",null,"Successfully deleted the DMP"); - this.getDmps(); - }, - (err: HttpErrorResponse) => { - if(err.status>=200 && err.status<300) - simple_notifier("success",null,"Successfully deleted the DMP"); - else - simple_notifier("danger",null,"Failed to delete the DMP"); - this.getDmps(); - } - ); - - } - - clickFilters(element){ - if(element.textContent == "More filters") - element.textContent = "Less Filters"; - else - element.textContent = "More Filters"; - } - - SelectDMPStatus(dmp, event, oldValue){ - console.log(dmp); - let cannotChangeStatus:boolean; - if(dmp.status == 2){ - this.serverService.getDatasetForDmp({ "id": dmp.id }).subscribe( - response => { - response.forEach(dataset => { - if(dataset.status !==2 || dataset.status !==3){ - cannotChangeStatus=true; - } - return; - }); - if(cannotChangeStatus == true){ - dmp.status = 0; - $("#messageForChangingStatus").modal("show"); - } - }, - error => { - console.log("could not retrieve dataset for dpm: "+dmp.id); - } - ); - } - - } - - showDatasetsOfDmp(item){ - this.router.navigate(['/dataset'], { queryParams: { "dmpid":item.id , "label":item.label}}); - } - - viewDetailedDMP(dmp){ - console.log(dmp) - this.router.navigate(['/dmp'], { queryParams: { "dmpid":dmp.id, "label":dmp.label }}); - } - - viewDetailedProject(dmp){ - console.log(dmp) - this.router.navigate(['/project'], { queryParams: { "projectid":dmp.project.id, "label":dmp.project.label }}); - } - - -} diff --git a/dmp-frontend/src/app/dmps/dmps.html b/dmp-frontend/src/app/dmps/dmps.html deleted file mode 100644 index 6ffb2966c..000000000 --- a/dmp-frontend/src/app/dmps/dmps.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
- - -
-
- ID - - Label - - Version - - Previous - - Project - - Description - - Created at - - Status - - Actions - - -
No elements
{{dmp?.id}}{{dmp?.version}}{{dmp?.previous}}{{(dmp?.description?.length > 40) ? (dmp?.description | slice:0:40)+'...':(dmp?.description) }}{{dmp?.created | date:'yyyy-MM-dd HH:mm:ss Z'}}{{dmp?.status | statusToString }} - - - - - - - - - -
- - - -
- - - - - - - - - - - - - - diff --git a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.html b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.html new file mode 100644 index 000000000..43c2a1e24 --- /dev/null +++ b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.html @@ -0,0 +1,81 @@ +
+
+ + {{'DMP-EDITOR.TITLE.NEW' | translate}} + {{formGroup.get('label').value}} + + + + + {{baseErrorModel.label}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + + {{errorModel.description}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + + + + +
{{chip.label.substring(0, 1).toUpperCase()}}
+ {{chip.label}} +
+ +
+ {{option.label}} +
+
+ +
+ + + +
{{chip.name.substring(0, 1).toUpperCase()}}
+ {{chip.name}} +
+ +
+ {{option.name}} +
+
+ +
+ + + +
{{chip.name.substring(0, 1).toUpperCase()}}
+ {{chip.name}} +
+ +
+ {{option.name}} +
+
+ +
+ +
+ + + + +
+ +
+
+
+ +
\ No newline at end of file diff --git a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.scss b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.scss new file mode 100644 index 000000000..f5333f1db --- /dev/null +++ b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.scss @@ -0,0 +1,39 @@ +.full-width { + width: 100%; +} + +.input-table { + table-layout: fixed; +} + +.table-card .mat-grid-tile { + background: rgba(0, 0, 0, 0.32); +} + +.data-management-plan-editor { + + .mat-form-field-full-width{ + mat-form-field { + width: 100%; + padding: 3px; + } + } + + + .mat-card { + margin: 16px 0; + } + + p { + margin: 16px; + } + + .left-button { + float: left; + } + + .description-area { + height: 100px; + } + +} diff --git a/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts new file mode 100644 index 000000000..82b3e8049 --- /dev/null +++ b/dmp-frontend/src/app/dmps/editor/dmp-editor.component.ts @@ -0,0 +1,194 @@ +import { Component, ViewChild, OnInit, AfterViewInit, ViewEncapsulation } from "@angular/core"; +import { MatPaginator, MatSort, MatSnackBar } from "@angular/material"; +import { Router, ActivatedRoute, Params } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DataSource } from "@angular/cdk/table"; +import { Observable } from "rxjs/Observable"; +import { JsonSerializer } from "../../utilities/JsonSerializer"; +import { FormGroup } from "@angular/forms"; +import { SnackBarNotificationComponent } from "../../shared/components/notificaiton/snack-bar-notification.component"; +import { BaseErrorModel } from "../../models/error/BaseErrorModel"; +import { DataManagementPlanService } from "../../services/data-management-plan/data-management-plan.service"; +import { DataManagementPlanModel } from "../../models/data-managemnt-plans/DataManagementPlanModel"; +import { ExternalSourcesService } from "../../services/external-sources/external-sources.service"; +import { ExternalSourcesItemModel } from "../../models/external-sources/ExternalSourcesItemModel"; +import { RequestItem } from "../../models/criteria/RequestItem"; +import { DatasetProfileCriteria } from "../../models/criteria/dataset/DatasetProfileCriteria"; +import { DataManagementPlanCriteriaComponent } from "../../shared/components/criteria/data-management-plan/dmp-criteria.component"; +import { DatasetProfileModel } from "../../models/datasets/DatasetProfileModel"; +import { AutoCompleteConfiguration } from "../../shared/components/autocomplete/AutoCompleteConfiguration"; +import { ProjectCriteria } from "../../models/criteria/project/ProjectCriteria"; +import { ProjectService } from "../../services/project/project.service"; + + + +@Component({ + selector: 'app-dmp-editor-component', + templateUrl: 'dmp-editor.component.html', + styleUrls: ['./dmp-editor.component.scss'], + providers: [DataManagementPlanService, ExternalSourcesService, ProjectService], + encapsulation: ViewEncapsulation.None +}) +export class DataManagementPlanEditorComponent implements AfterViewInit { + + + isNew = true; + dataManagementPlan: DataManagementPlanModel; + formGroup: FormGroup = null; + + filteringOrganisationsAsync: boolean = false; + filteringResearchersAsync: boolean = false; + filteredProfilesAsync: boolean = false; + filteredOrganisations: ExternalSourcesItemModel[]; + filteredResearchers: ExternalSourcesItemModel[]; + filteredProfiles: DatasetProfileModel[]; + + projectAutoCompleteConfiguration: AutoCompleteConfiguration; + + constructor( + private dataManagementPlanService: DataManagementPlanService, + private projectService: ProjectService, + private externalSourcesService: ExternalSourcesService, + private route: ActivatedRoute, + public snackBar: MatSnackBar, + public router: Router, + public language: TranslateService, + private _service: DataManagementPlanService + ) { + + } + + ngAfterViewInit() { + this.route.params.subscribe((params: Params) => { + const itemId = params['id']; + + let projectRequestItem: RequestItem = new RequestItem(); + projectRequestItem.criteria = new ProjectCriteria(); + this.projectAutoCompleteConfiguration = new AutoCompleteConfiguration(this.projectService.getWithExternal.bind(this.projectService), projectRequestItem); + + if (itemId != null) { + this.isNew = false; + this.dataManagementPlanService.getSingle(itemId).map(data => data as DataManagementPlanModel) + .subscribe(data => { + this.dataManagementPlan = JsonSerializer.fromJSONObject(data, DataManagementPlanModel); + this.formGroup = this.dataManagementPlan.buildForm(); + }); + } else { + this.dataManagementPlan = new DataManagementPlanModel(); + setTimeout(() => { + this.formGroup = this.dataManagementPlan.buildForm(); + }); + } + }); + } + + formSubmit(): void { + //this.touchAllFormFields(this.formGroup); + if (!this.isFormValid()) { return; } + this.onSubmit(); + } + + public isFormValid() { + return this.formGroup.valid; + } + + onSubmit(): void { + this.dataManagementPlanService.createDataManagementPlan(this.formGroup.value).subscribe( + complete => this.onCallbackSuccess(), + error => this.onCallbackError(error) + ); + } + + onCallbackSuccess(): void { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: this.isNew ? 'GENERAL.SNACK-BAR.SUCCESSFUL-CREATION' : 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-success'] + }) + this.router.navigate(['/dmps']); + } + + onCallbackError(error: any) { + this.setErrorModel(error.error); + //this.validateAllFormFields(this.formGroup); + } + + public setErrorModel(errorModel: BaseErrorModel) { + Object.keys(errorModel).forEach(item => { + (this.dataManagementPlan.errorModel)[item] = (errorModel)[item]; + }) + } + + public cancel(): void { + this.router.navigate(['/dmps']); + } + + public invite(): void { + this.router.navigate(['/invite/'+this.dataManagementPlan.id]); + } + + filterOrganisations(value: string): void { + + this.filteredOrganisations = undefined; + if (value) { + this.filteringOrganisationsAsync = true; + + this.externalSourcesService.searchDMPOrganizations(value).subscribe(items => { + this.filteredOrganisations = items; + this.filteringOrganisationsAsync = false; + + // this.filteredOrganisations = items.filter((filteredObj: any) => { + // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // }); + + }); + + } + } + + filterResearchers(value: string): void { + + this.filteredResearchers = undefined; + if (value) { + this.filteringResearchersAsync = true; + + this.externalSourcesService.searchDMPResearchers(value).subscribe(items => { + this.filteredResearchers = items; + this.filteringResearchersAsync = false; + + // this.filteredOrganisations = items.filter((filteredObj: any) => { + // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // }); + + }); + } + } + + filterProfiles(value: string): void { + + this.filteredProfiles = undefined; + if (value) { + this.filteredProfilesAsync = true; + + // this.externalSourcesService.searchDMPProfiles(value).subscribe(items => { + // this.filteredProfiles = items; + // this.filteredProfilesAsync = false; + + // // this.filteredOrganisations = items.filter((filteredObj: any) => { + // // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // // }); + + // }); + + const request = new RequestItem(); + let criteria = new DatasetProfileCriteria(); + criteria.like = value; + request.criteria = criteria; + this._service.searchDMPProfiles(request).subscribe(items => { + this.filteredProfiles = items; + this.filteredProfilesAsync = false; + }); + } + } + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/DataModel.ts b/dmp-frontend/src/app/entities/DataModel.ts deleted file mode 100644 index bd3c66386..000000000 --- a/dmp-frontend/src/app/entities/DataModel.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { GroupBase } from '../form/dynamic-form-group/group-base'; -import { FieldBase } from '../form/fields/field-base'; -import { Attribute } from './model/attribute'; -import { Source } from './model/source'; -import { Section } from './model/section'; - -export class DataModel { - - private fIndex : Map>; - private fIndSources : Map; - - groups: GroupBase[] = []; - fields: FieldBase[] = []; - semanticAttr: Attribute[]; - sections: Section[]; - - //need to add more class fields to describe the remaining elements of the json object fetched from the service. - //e.g. the current dataset's metadata information, the DataRepository description information, etc - - constructor(){ - - } - - public buildIndex(){ - - - this.fIndex = new Map>(); - - this.fields.forEach((field) => { - //console.log("fieldid:" +field.key); - this.fIndex.set(field.key, field); - }); - - this.groups.forEach((group) => { - group.groupFields.forEach((field) => { - //console.log("groupid: "+group.key + "fieldid:" +field.key); - this.fIndex.set(field.key, field); - }); - }); - - - this.groups.forEach((group) => { - if (group.compositeFields != undefined){ - group.compositeFields.groupFields.forEach((field) => { - //console.log("groupid: "+group.key + "fieldid:" +field.key); - this.fIndex.set(field.key, field); - }); - } - }); - - } - - public getFieldByKey(key){ - return this.fIndex.get(key); - } - - - - - - -} diff --git a/dmp-frontend/src/app/entities/JsonObject.class.ts b/dmp-frontend/src/app/entities/JsonObject.class.ts deleted file mode 100644 index 401fb5d9d..000000000 --- a/dmp-frontend/src/app/entities/JsonObject.class.ts +++ /dev/null @@ -1,10 +0,0 @@ -import {Title} from "../../app/entities/view/viewTitle.view"; -import {ViewStyle} from "../../app/entities/view/viewStyle.view"; - -export class JsonObjest { - groups: any[]; - fields: any[]; - title: Title; - viewStyle: ViewStyle; - renderStyle: string; -} diff --git a/dmp-frontend/src/app/entities/datasetprofile.ts b/dmp-frontend/src/app/entities/datasetprofile.ts deleted file mode 100644 index 558bbbfa6..000000000 --- a/dmp-frontend/src/app/entities/datasetprofile.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Func } from './functions/func'; -import { Model } from './model/model'; -import { View } from './view2/view'; - -@Injectable() -export class DatasetProfile{ - - view: View; - model: Model; - func: Func[]; - -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/functions/func.ts b/dmp-frontend/src/app/entities/functions/func.ts deleted file mode 100644 index 7d76b176d..000000000 --- a/dmp-frontend/src/app/entities/functions/func.ts +++ /dev/null @@ -1,9 +0,0 @@ - - -export class Func { - - id: string; - signature:string; - code: string; - -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/model/dataset.ts b/dmp-frontend/src/app/entities/model/dataset.ts deleted file mode 100644 index d30143efc..000000000 --- a/dmp-frontend/src/app/entities/model/dataset.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Injectable } from '@angular/core'; - -export class Dataset { - id:string; - name: string; - uriDataset: string; - dmp:string; - profile:string; - profileId:string; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/model/datatype.ts b/dmp-frontend/src/app/entities/model/datatype.ts deleted file mode 100644 index c4a2f1a17..000000000 --- a/dmp-frontend/src/app/entities/model/datatype.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Injectable } from '@angular/core'; -import { DatatypeField } from './datatypefield'; - -@Injectable() -export class Datatype { - id: string; - fields: DatatypeField[]; - -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/model/datatypefield.ts b/dmp-frontend/src/app/entities/model/datatypefield.ts deleted file mode 100644 index 102247e2a..000000000 --- a/dmp-frontend/src/app/entities/model/datatypefield.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Injectable } from '@angular/core'; - -@Injectable() -export class DatatypeField{ - id: string; - ordinal: number; - datatype: string; - -} diff --git a/dmp-frontend/src/app/entities/model/dmp.ts b/dmp-frontend/src/app/entities/model/dmp.ts deleted file mode 100644 index 08e2ce961..000000000 --- a/dmp-frontend/src/app/entities/model/dmp.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Injectable } from '@angular/core'; - -export class Dmp { - id:string; - dataset: string; - label: string; - organisations:string; - previous:string; - profile:string; - profileData:string; - projectLabel:string; - projectid:string; - version: number; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/model/model.ts b/dmp-frontend/src/app/entities/model/model.ts deleted file mode 100644 index 9f9d98710..000000000 --- a/dmp-frontend/src/app/entities/model/model.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Attribute } from './attribute'; -import { Datatype } from './datatype'; -import { Rule } from '../common/rule'; - -@Injectable() -export class Model { - attributes : Attribute[]; - rules: Rule[]; - datatypes : Datatype[]; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/model/project.ts b/dmp-frontend/src/app/entities/model/project.ts deleted file mode 100644 index ea25b4e20..000000000 --- a/dmp-frontend/src/app/entities/model/project.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Dmp } from './dmp' -import { Dataset } from './dataset' - -export class Project { - label: string; - id: string; - abbreviation: string; - definition: string; - uri: string; - dmp: Dmp; - dataset: Dataset; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/model/section.ts b/dmp-frontend/src/app/entities/model/section.ts index fe540dd8c..9234283d8 100644 --- a/dmp-frontend/src/app/entities/model/section.ts +++ b/dmp-frontend/src/app/entities/model/section.ts @@ -1,13 +1,11 @@ import { Injectable } from '@angular/core'; -import { GroupBase } from '../../form/dynamic-form-group/group-base'; @Injectable() export class Section { title: string; - description:string; + description: string; id: string; defaultVisibility: boolean; ordinal: number; - groupFields: GroupBase[]; - page:number; + page: number; } \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/plandefinition.class.ts b/dmp-frontend/src/app/entities/plandefinition.class.ts deleted file mode 100644 index 104a81da5..000000000 --- a/dmp-frontend/src/app/entities/plandefinition.class.ts +++ /dev/null @@ -1,9 +0,0 @@ -import {ViewStyleProfile} from "../../app/entities/view/viewProfile.view"; - -class PlanDefinition{ - -viewStyle: ViewStyleProfile; -dataModel:{}; -rules:{}; - -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/view/field.view.ts b/dmp-frontend/src/app/entities/view/field.view.ts deleted file mode 100644 index c441c03ea..000000000 --- a/dmp-frontend/src/app/entities/view/field.view.ts +++ /dev/null @@ -1,14 +0,0 @@ -import {Title} from "../../../app/entities/view/viewTitle.view"; -import {ViewStyle} from "../../../app/entities/view/viewStyle.view"; - -export class Field { - description: {}; - extendedDescription:{}; - title:Title; - viewStyle:ViewStyle; - visible:{}; - group:string; - id:string; - ordinal:string; - -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/view/viewFieldGroup.view.ts b/dmp-frontend/src/app/entities/view/viewFieldGroup.view.ts deleted file mode 100644 index 6901936cf..000000000 --- a/dmp-frontend/src/app/entities/view/viewFieldGroup.view.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {Title} from "../../../app/entities/view/viewTitle.view"; -import {GroupVisibility} from "../../../app/entities/view/viewGrVisibility.view"; - -export class FieldGroup{ - description: {}; - extendedDescription:{}; - title: Title; - visible: GroupVisibility; - id: string; - ordinal: string; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/view/viewGrVisibility.view.ts b/dmp-frontend/src/app/entities/view/viewGrVisibility.view.ts deleted file mode 100644 index 91d1d3b83..000000000 --- a/dmp-frontend/src/app/entities/view/viewGrVisibility.view.ts +++ /dev/null @@ -1,4 +0,0 @@ -export class GroupVisibility{ - rules: any[]; - style: string; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/view/viewProfile.view.ts b/dmp-frontend/src/app/entities/view/viewProfile.view.ts deleted file mode 100644 index fbd47bea2..000000000 --- a/dmp-frontend/src/app/entities/view/viewProfile.view.ts +++ /dev/null @@ -1,8 +0,0 @@ -import {Field} from "../../../app/entities/view/field.view"; -import {FieldGroup} from "../../../app/entities/view/viewFieldGroup.view"; - -export class ViewStyleProfile{ - - fieldGroup: FieldGroup - field: Field -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/view/viewStyle.view.ts b/dmp-frontend/src/app/entities/view/viewStyle.view.ts deleted file mode 100644 index cd0814ec5..000000000 --- a/dmp-frontend/src/app/entities/view/viewStyle.view.ts +++ /dev/null @@ -1,4 +0,0 @@ -export class ViewStyle{ - _cssclass:string; - _renderstyle:string; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/view/viewTitle.view.ts b/dmp-frontend/src/app/entities/view/viewTitle.view.ts deleted file mode 100644 index 74de1b099..000000000 --- a/dmp-frontend/src/app/entities/view/viewTitle.view.ts +++ /dev/null @@ -1,3 +0,0 @@ -export class Title { - __cdata:string -} \ No newline at end of file diff --git a/dmp-frontend/src/app/entities/view2/field.ts b/dmp-frontend/src/app/entities/view2/field.ts deleted file mode 100644 index 30c6f5d15..000000000 --- a/dmp-frontend/src/app/entities/view2/field.ts +++ /dev/null @@ -1,23 +0,0 @@ - -import { Injectable } from '@angular/core'; -import { Rule } from '../common/rule'; - -@Injectable() -export class Field { - id: string; - group: string; - ordinal: number; - title: string; - titleLang: string; - description: string; - descriptionLang: string; - ext_description: string; - ext_descriptionLang: string; - visibilityStyle: string = 'any'; - visibilityRules: Rule[]; - - renderStyle: string; - cssClass: string; - - -} diff --git a/dmp-frontend/src/app/entities/view2/fieldGroup.ts b/dmp-frontend/src/app/entities/view2/fieldGroup.ts deleted file mode 100644 index 51d85f368..000000000 --- a/dmp-frontend/src/app/entities/view2/fieldGroup.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Rule } from '../common/rule'; - -@Injectable() -export class FieldGroup{ - - id: string; - ordinal: number; - title: string; - titleLang: string; - description: string; - descriptionLang: string; - ext_description: string; - ext_descriptionLang: string; - visibilityStyle: string = 'any'; - visibilityRules: Rule[]; - -} diff --git a/dmp-frontend/src/app/entities/view2/view.ts b/dmp-frontend/src/app/entities/view2/view.ts deleted file mode 100644 index bf56d31bd..000000000 --- a/dmp-frontend/src/app/entities/view2/view.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Field } from './field'; -import { FieldGroup } from './fieldGroup'; - -@Injectable() -export class View { - fieldGroups: FieldGroup[]; - fields : Field[]; - -} diff --git a/dmp-frontend/src/app/form/fields/autocomplete-remote/autocomplete-remote.component.css b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.css similarity index 100% rename from dmp-frontend/src/app/form/fields/autocomplete-remote/autocomplete-remote.component.css rename to dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.css diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.html b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.html new file mode 100644 index 000000000..d2834228f --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/autocomplete-remote/autocomplete-remote.component.spec.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.spec.ts similarity index 100% rename from dmp-frontend/src/app/form/fields/autocomplete-remote/autocomplete-remote.component.spec.ts rename to dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.spec.ts diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.ts new file mode 100644 index 000000000..294f4a41b --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-autocomplete/autocomplete-remote.component.ts @@ -0,0 +1,91 @@ +import { Field } from '../../../models/Field'; +import { Component, OnInit, Input, Output, EventEmitter, forwardRef, ViewEncapsulation } from '@angular/core'; +import { ControlValueAccessor, FormControl, FormGroup, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; + +declare var $: any; + + +@Component({ + selector: 'df-autocomplete', + templateUrl: './autocomplete-remote.component.html', + styleUrls: ['./autocomplete-remote.component.css'], + encapsulation: ViewEncapsulation.None +}) + + + +export class AutocompleteRemoteComponent implements OnInit/* , ControlValueAccessor */ { + + + @Input() field: Field; + @Input() form: FormGroup; + + private textFormGroup = new FormGroup({ text: new FormControl("") }); + private loading: boolean; + values: any[] = new Array(); + typeaheadMS: number = 1400; + + constructor() { + + } + + + ngOnInit() { + let valueChanges = this.textFormGroup.controls['text'].valueChanges.share(); + valueChanges.subscribe(searchTerm => { + this.loading = true; + if (this.form.controls['text'].value) + this.resetFormGroupValue(); + }); + + valueChanges + .debounceTime(this.typeaheadMS) + .subscribe(searchTerm => { + if (typeof searchTerm === 'string') { + this.updateByQuery(searchTerm) + } + }); + + + } + + + resetFormGroupValue() { + this.form.patchValue({ value: null }, { emitEvent: false }); + } + + + updateByQuery(query: string) { + // this.serverService.getThroughProxy(this.field.data.url, query).subscribe( + // response => { + // this.values.length = 0; + // /* response.data.forEach(element => { + // this.values.push(element.attributes.name); + // }); */ + // }, + // error => { + // } + // ); + } + + + onChange: any = () => { }; + onTouched: any = () => { }; + + + registerOnChange(fn) { + this.onChange = fn; + } + + registerOnTouched(fn) { + this.onTouched = fn; + } + + /* writeValue(value) { + if (value) { + this.value = value; + } + } */ + +} + diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component.css b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component.css new file mode 100644 index 000000000..f7be5b613 --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component.css @@ -0,0 +1,3 @@ +.radio-label { + margin-left: 10px; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component.html b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component.html new file mode 100644 index 000000000..7899a785f --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component.html @@ -0,0 +1,7 @@ +
+ + Yes +
+ No +
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component.ts new file mode 100644 index 000000000..1535432af --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-boolean-decision/dynamic-field-boolean-decision.component.ts @@ -0,0 +1,21 @@ +import { FormGroup } from '@angular/forms'; +import { Field } from '../../../models/Field'; +import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; +import { FieldBase } from '../field-base'; + +@Component({ + selector: 'df-booleanDecision', + templateUrl: './dynamic-field-boolean-decision.component.html', + styleUrls: [ + './dynamic-field-boolean-decision.component.css' + ], + encapsulation: ViewEncapsulation.None +}) +export class DynamicFieldBooleanDecisionComponent implements OnInit{ + @Input() field: Field; + @Input() form: FormGroup; + + ngOnInit(){ + + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox.css b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox.css new file mode 100644 index 000000000..f947dfb22 --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox.css @@ -0,0 +1,7 @@ +.checkbox-label { + margin-left: 10px; +} + +.checkbox-icon { + margin-left: 0px; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox.html b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox.html new file mode 100644 index 000000000..e4aaf4246 --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox.html @@ -0,0 +1,6 @@ +
+ {{field.data.label}} + +
+ + \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox.ts new file mode 100644 index 000000000..68da3eb8e --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-checkbox/dynamic-field-checkbox.ts @@ -0,0 +1,19 @@ +import { Field } from '../../../models/Field'; +import { FormGroup } from '@angular/forms'; +import { Component, Input, ViewEncapsulation } from '@angular/core'; +import { FieldBase } from '../field-base'; + +@Component({ + selector: 'df-checkbox', + templateUrl: './dynamic-field-checkbox.html', + styleUrls: [ + './dynamic-field-checkbox.css' + ], + encapsulation: ViewEncapsulation.None +}) +export class DynamicFieldCheckBoxComponent { + @Input() field: Field; + @Input() form: FormGroup; + + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/checkbox/field-checkbox.css b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown.css similarity index 100% rename from dmp-frontend/src/app/form/fields/checkbox/field-checkbox.css rename to dmp-frontend/src/app/form/dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown.css diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown.html b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown.html new file mode 100644 index 000000000..a0ba2b0fd --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown.html @@ -0,0 +1,9 @@ +
+ + + {{opt.label}} + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + +
\ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown.ts new file mode 100644 index 000000000..d18c78f35 --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-dropdown/dynamic-field-dropdown.ts @@ -0,0 +1,21 @@ +import { FormGroup } from '@angular/forms'; +import { Field } from '../../../models/Field'; +import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; +import { FieldBase } from '../field-base'; + +@Component({ + selector: 'df-dropdown', + templateUrl: './dynamic-field-dropdown.html', + styleUrls: [ + './dynamic-field-dropdown.css' + ], + encapsulation: ViewEncapsulation.None +}) +export class DynamicFieldDropdownComponent implements OnInit { + @Input() field: Field; + @Input() form: FormGroup; + + ngOnInit() { + + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component.css b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component.css new file mode 100644 index 000000000..f7be5b613 --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component.css @@ -0,0 +1,3 @@ +.radio-label { + margin-left: 10px; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component.html b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component.html new file mode 100644 index 000000000..2153f7a93 --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component.html @@ -0,0 +1,9 @@ +
+ +
+ {{option.label}} +
+
+
+ + \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component.ts new file mode 100644 index 000000000..c107b156d --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-field-radiobox/dynamic-field-radiobox.component.ts @@ -0,0 +1,21 @@ +import { FormGroup } from '@angular/forms'; +import { Field } from '../../../models/Field'; +import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; +import { FieldBase } from '../field-base'; + +@Component({ + selector: 'df-radiobox', + templateUrl: './dynamic-field-radiobox.component.html', + styleUrls: [ + './dynamic-field-radiobox.component.css' + ], + encapsulation: ViewEncapsulation.None +}) +export class DynamicFieldRadioBoxComponent implements OnInit { + @Input() field: Field; + @Input() form: FormGroup; + + ngOnInit() { + + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.css b/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.css new file mode 100644 index 000000000..4e3148b1f --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.css @@ -0,0 +1,18 @@ +.full-width { + width: 100%; +} + +.field-component { + /* border:1px solid grey; + border-radius: 2px; + padding: 10px; + margin-bottom: 10px; */ +} + +.field-extended-desc { + color: lightslategray; +} + +.content-left-margin { + margin-left: 10px; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/dynamic-form-field.component.html b/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.html similarity index 55% rename from dmp-frontend/src/app/form/fields/dynamic-form-field.component.html rename to dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.html index e968a33d6..ddfc08b4e 100644 --- a/dmp-frontend/src/app/form/fields/dynamic-form-field.component.html +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.html @@ -1,124 +1,158 @@ - - -
-
- - -
{{field.description}}
- - - -
- - - - -
- - -
- -
- - - - -
- -
- - -
-
-
-
- -
- - -
-
The field "{{field.label}}" is required
-
The field {{field.label}} must match a regular expression {{field.regex}}
-
The field {{field.label}} custom Validation
-
- - -
- - + + +
+
{{field.description}}
+
+ {{field.extendedDescription}} +
+ +
+ + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + +
+ +
+ +
+ +
+
+ +
+ +
+ +
+ +
+ +
+ + + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + +
+ +
+ +
+ +
+ +
+ +
+ + + + +
+
+ + + + + + + + + + + + + + \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.ts b/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.ts new file mode 100644 index 000000000..d1472b899 --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-fields/dynamic-form-field.component.ts @@ -0,0 +1,50 @@ +import { VisibilityRulesService } from '../../visibility-rules/visibility-rules.service'; +import { VisibilityRuleSource } from '../../visibility-rules/models/VisibilityRuleSource'; +import { Field } from '../../models/Field'; +import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormGroup, ValidatorFn, AbstractControl, Validators } from '@angular/forms'; +import { ActivatedRoute } from '@angular/router'; + +import { FieldBase } from './field-base'; +import { RuleStyle } from '../../entities/common/rulestyle'; + + +@Component({ + selector: 'df-field', + templateUrl: './dynamic-form-field.component.html', + // styles: ['.checkBoxLabelCustom {font-weight: 700;}'] + styleUrls: [ + './dynamic-form-field.component.css' + ], + encapsulation: ViewEncapsulation.None +}) + +export class DynamicFormFieldComponent { + @Input() field: Field; + @Input() form: FormGroup; + @Input() pathName:string; + @Input() path:string; + + constructor(private route: ActivatedRoute,private visibilityRulesService:VisibilityRulesService) { } + + + ngOnChanges(changeRecord) { + + } + + clearInput(){ + } + + get isValid() { + return this.form.get("value").valid; + } + get isValidRequired() { + return this.form.get("value").hasError("required"); + } + get isValidPattern() { + return this.form.get("value").hasError("pattern"); + } + get isValidCustom() { + return this.form.get("value").hasError("forbiddenName"); + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/field-base.ts b/dmp-frontend/src/app/form/dynamic-fields/field-base.ts similarity index 96% rename from dmp-frontend/src/app/form/fields/field-base.ts rename to dmp-frontend/src/app/form/dynamic-fields/field-base.ts index 3b4e8aa5e..21882a23f 100644 --- a/dmp-frontend/src/app/form/fields/field-base.ts +++ b/dmp-frontend/src/app/form/dynamic-fields/field-base.ts @@ -1,51 +1,51 @@ -import { Rule } from '../../entities/common/rule'; -import { Attribute } from '../../entities/model/attribute'; - -export class FieldBase{ - value: T; - key: string; - label: string; - required:boolean; - order:number; - rules: Rule[]; - visible: boolean | string; - controlType:string; - group:string; - description:string; - attributes: Attribute; - regex:string; - url: string; - datatype: string; - - constructor(options: { - value?: T, - key?: string, - label?: string, - required?:boolean, - order?: number, - rules?: Rule[], - visible?: boolean | string, - controlType?: string - group?: string - description?: string, - attributes?: Attribute, - regex?:string, - url?: string, - datatype?:string - } = {}) { - this.value = options.value; - this.key = options.key || ''; - this.label = options.label || ''; - this.required = !! options.required; - this.order = options.order === undefined ? 1 : options.order; - this.rules = options.rules; - this.visible = options.visible; - this.controlType = options.controlType || ''; - this.group = options.group || ''; - this.description = options.description || ''; - this.attributes = options.attributes || new Attribute(); - this.regex = options.regex || ''; - this.url = options.url || ""; - this.datatype = options.datatype || ""; - } +import { Rule } from '../../entities/common/rule'; +import { Attribute } from '../../entities/model/attribute'; + +export class FieldBase{ + value: T; + key: string; + label: string; + required:boolean; + order:number; + rules: Rule[]; + visible: boolean | string; + controlType:string; + group:string; + description:string; + attributes: Attribute; + regex:string; + url: string; + datatype: string; + + constructor(options: { + value?: T, + key?: string, + label?: string, + required?:boolean, + order?: number, + rules?: Rule[], + visible?: boolean | string, + controlType?: string + group?: string + description?: string, + attributes?: Attribute, + regex?:string, + url?: string, + datatype?:string + } = {}) { + this.value = options.value; + this.key = options.key || ''; + this.label = options.label || ''; + this.required = !! options.required; + this.order = options.order === undefined ? 1 : options.order; + this.rules = options.rules; + this.visible = options.visible; + this.controlType = options.controlType || ''; + this.group = options.group || ''; + this.description = options.description || ''; + this.attributes = options.attributes || new Attribute(); + this.regex = options.regex || ''; + this.url = options.url || ""; + this.datatype = options.datatype || ""; + } } \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.css b/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.css new file mode 100644 index 000000000..a8e80f398 --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.css @@ -0,0 +1,18 @@ +.full-width { + width: 100%; +} + +.fieldset-component { + /* border:1px solid grey; + border-radius: 2px; + padding: 10px; + margin-bottom: 10px; */ +} + +.fieldset-extended-desc { + color: lightslategray; +} + +.content-left-margin { + /* margin-left: 10px; */ +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.html b/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.html new file mode 100644 index 000000000..909f688d2 --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.html @@ -0,0 +1,39 @@ +
+ +
+
{{compositeField.title}}
+
+
{{compositeField.description}}
+
+ {{compositeField.extendedDescription}} +
+ +
+
+ + +
+
{{compositeField.title}}
+
+
{{compositeField.description}}
+
+ {{compositeField.extendedDescription}} +
+
+ + + +
+ +
+
+
+
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.ts b/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.ts new file mode 100644 index 000000000..f90ca0daf --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-form-composite-field/dynamic-form-composite-field.ts @@ -0,0 +1,34 @@ +import { VisibilityRulesService } from '../../visibility-rules/visibility-rules.service'; +import { CompositeField } from '../../models/CompositeField'; +import { FormGroup, FormArray } from '@angular/forms'; +import { Section } from '../../entities/model/section'; +import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; +import { Field } from '../../models/Field'; +@Component({ + selector: 'df-composite-field', + templateUrl: './dynamic-form-composite-field.html', + styleUrls: [ + './dynamic-form-composite-field.css' + ], + encapsulation: ViewEncapsulation.None, +}) +export class DynamicFormCompositeFieldComponent implements OnInit { + + @Input() compositeField: CompositeField + @Input() form: FormGroup; + @Input() pathName: string; + @Input() path: string; + + constructor(private visibilityRulesService: VisibilityRulesService) { } + + ngOnInit() { + } + + addMultipleField(fieldIndex: number) { + let field: Field = this.compositeField.fields[fieldIndex].cloneForMultiplicity(fieldIndex, ""); + this.compositeField.fields[fieldIndex].multiplicityItems.push(field); + ((this.form.get("fields").get('' + fieldIndex).get('multiplicityItems'))).push(field.buildForm()); + } + + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.css b/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.css index a5d0bf7e9..2f19bc1c6 100644 --- a/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.css +++ b/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.css @@ -4,4 +4,19 @@ .show { display:block; +} + +.group-component { + /* border:1px solid grey; + border-radius: 2px; + padding: 10px; + margin-bottom: 10px; */ +} + +.group-extended-desc { + color: lightslategray; +} + +.content-left-margin { + /* margin-left: 10px; */ } \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.html b/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.html index 21bd4975c..d202b56e9 100644 --- a/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.html +++ b/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.html @@ -1,27 +1,23 @@ -
-

{{group.title}}

-
- - - - -
- -
-
- -
- - - - - +
+ +
+ + - \ No newline at end of file + +
+ +
+
+
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.ts b/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.ts index efd22c76b..e7e0b1331 100644 --- a/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.ts +++ b/dmp-frontend/src/app/form/dynamic-form-group/dynamic-form-group.component.ts @@ -1,34 +1,35 @@ -import { DataModel } from '../../entities/DataModel'; -import { GroupBase } from './group-base'; -import { Component, Input, OnInit } from '@angular/core'; -import { FormGroup, Validators, FormControl } from '@angular/forms'; +import { VisibilityRulesService } from '../../visibility-rules/visibility-rules.service'; +import { FieldGroup } from '../../models/FieldGroup'; +import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; +import { FormGroup, Validators, FormControl, FormArray } from '@angular/forms'; import { NgForm } from '@angular/forms'; -import { FieldBase } from '../fields/field-base'; -import { TextboxField } from '../fields/textbox/field-textbox'; import { Rule } from '../../entities/common/rule'; +import { CompositeField } from '../../models/CompositeField'; @Component({ selector: 'df-group', templateUrl: './dynamic-form-group.component.html', - styleUrls: ['./dynamic-form-group.component.css'] + styleUrls: ['./dynamic-form-group.component.css'], + encapsulation: ViewEncapsulation.None, }) export class DynamicFormGroupComponent implements OnInit { - @Input() dataModel: DataModel; - @Input() group: GroupBase; + @Input() group: FieldGroup @Input() form: FormGroup; - @Input() customStyle: {}; - @Input() classFromJson: string ; + @Input() pathName: string; - constructor() { + @Input() path: string; + + + constructor(private visibilityRulesService: VisibilityRulesService) { } ngOnInit() { - let st = this.group.style == "any" ? "" : this.group.style; - this.classFromJson = this.group.class == "" ? "" : this.group.class; + //let st = this.group.style == "any" ? "" : this.group.style; + //this.classFromJson = this.group.class == "" ? "" : this.group.class; - this.customStyle = {}; + /* this.customStyle = {}; if (st != "") { st.replace(/"/g, '\\"'); @@ -39,44 +40,40 @@ export class DynamicFormGroupComponent implements OnInit { //this.customStyle[entry[0]] = '2px solid #c1baba'; var a = entry[0]; this.customStyle[a] = entry[1]; - } - } + } */ + } -} + addMultipleField(fieldsetIndex: number) { + let compositeField: CompositeField = this.group.compositeFields[fieldsetIndex].cloneForMultiplicity(fieldsetIndex); + this.group.compositeFields[fieldsetIndex].multiplicityItems.push(compositeField); + ((this.form.get("compositeFields").get('' + fieldsetIndex).get('multiplicityItems'))).push(compositeField.buildForm()); + } - addFieldSet(){ - debugger; + addFieldSet() { + /* debugger; let subgroup: any = {}; - this.group.compositeFields.groupFields.forEach((field, i )=>{ debugger; - this.form.addControl(field.key +"_"+i, new FormControl("") ) + this.group.compositeFields.groupFields.forEach((field, i) => { + debugger; + this.form.addControl(field.key + "_" + i, new FormControl("")) if (field.controlType == "textbox") { let newfield: FieldBase; let rule = new Rule(); newfield = new TextboxField({ - label: field.label+"_"+i, - key: field.key +"_"+i, - value: "", - order: field.order, - rules: field.rules, - visible: field.visible, - group: field.group, - description: field.description + label: field.label + "_" + i, + key: field.key + "_" + i, + value: "", + order: field.order, + rules: field.rules, + visible: field.visible, + group: field.group, + description: field.description }); this.group.compositeFields.groupFields.push(newfield) - } - - }); - } + } - shouldIShow(){ - let show = false; - this.group.compositeFields.groupFields.forEach((field, i )=>{ - if(field.visible) - show = true; - }) - return show; + }); */ } } diff --git a/dmp-frontend/src/app/form/dynamic-form-group/group-base.ts b/dmp-frontend/src/app/form/dynamic-form-group/group-base.ts deleted file mode 100644 index 6b40acb5b..000000000 --- a/dmp-frontend/src/app/form/dynamic-form-group/group-base.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Rule } from '../../entities/common/rule'; -import { FieldBase } from '../fields/field-base'; -export class GroupBase{ - value: T; - key: string; - title: string; - rules: Rule[]; - groupFields: FieldBase[]; - visible: boolean; - order:number; - controlType:string; - section:string; - style:string; - class: string; - page: number; - compositeFields: GroupBase; - - constructor(options: { - value?: T, - key?: string, - title?: string, - rules?: Rule[], - groupFields?: FieldBase[], - visible?: boolean, - order?: number, - controlType?: string - section?: string, - style?:string - class?:string, - page?:number, - compositeFields?:GroupBase - } = {}) { - this.value = options.value; - this.key = options.key || ''; - this.title = options.title || ''; - this.rules = options.rules; - this.groupFields = options.groupFields; - this.visible = options.visible; - this.order = options.order === undefined ? 1 : options.order; - this.controlType = options.controlType || ''; - this.section = options.section || ''; - this.style = options.style || ''; - this.class = options.class || ''; - this.page = options.page || 1; - this.compositeFields = options.compositeFields; - } -} diff --git a/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.css b/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.css new file mode 100644 index 000000000..2f6ca0157 --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.css @@ -0,0 +1,3 @@ +.section-component { + margin-bottom: 10px; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.html b/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.html new file mode 100644 index 000000000..44ceeb416 --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.html @@ -0,0 +1,83 @@ + + + + +
+ + + + + {{path}} {{section.title}} + + +

{{section.description}}

+

{{section.extendedDescription}}

+
+
+ + + +
+ +
+ + + + +
+
+ +
+
+ +
+
+
+
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.ts b/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.ts new file mode 100644 index 000000000..7a6901833 --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-form-section/dynamic-form-section.ts @@ -0,0 +1,41 @@ +import { VisibilityRulesService } from '../../visibility-rules/visibility-rules.service'; +import { FormGroup, Form, FormArray } from '@angular/forms'; +import { Component, Input, OnInit, ViewEncapsulation } from '@angular/core'; +import { CompositeField } from '../../models/CompositeField'; +import { Section } from '@app/models/Section'; + + +@Component({ + selector: 'df-section', + templateUrl: './dynamic-form-section.html', + styleUrls: [ + './dynamic-form-section.css' + ], + encapsulation: ViewEncapsulation.None, +}) +export class DynamicFormSectionComponent implements OnInit { + + @Input() section: Section + @Input() form: FormGroup; + @Input() pathName: string; + @Input() path: string; + constructor(private visibilityRulesService: VisibilityRulesService) { } + + ngOnInit() { + } + + addMultipleField(fieldsetIndex: number) { + let compositeField: CompositeField = this.section.compositeFields[fieldsetIndex].cloneForMultiplicity(fieldsetIndex); + this.section.compositeFields[fieldsetIndex].multiplicityItems.push(compositeField); + ((this.form.get("compositeFields").get('' + fieldsetIndex).get('multiplicityItems'))).push(compositeField.buildForm()); + } + + isVisible(pathname: string, fieldSet: CompositeField): boolean { + if (!this.visibilityRulesService.isElementVisible(pathname, fieldSet.id)) return false; + for (var i = 0; i < fieldSet.fields.length; i++) { + if (!this.visibilityRulesService.isElementVisible(pathname+'.fields.'+i, fieldSet.fields[i].id)) + return false; + } + return true; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-form.component.css b/dmp-frontend/src/app/form/dynamic-form.component.css deleted file mode 100644 index 80406e064..000000000 --- a/dmp-frontend/src/app/form/dynamic-form.component.css +++ /dev/null @@ -1,111 +0,0 @@ -.hide{ - display:none; -} - -.show { - display:block; -} - -.btncustom{ - background-color:#337ab7; - color:white; - margin-top:15px; -} - -.parent-div { - height: calc(100vh - 60px - 32px); /* is height_of(window) - heigh_of(app-header-bar) - height_of(breadcrumb) */ - width:100%; -} - - - -.child-div-left{ - - -webkit-box-shadow: 0px 0px 9px 2px rgba(0,0,0,0.75); - -moz-box-shadow: 0px 0px 9px 2px rgba(0,0,0,0.75); - box-shadow: 0px 0px 9px 2px rgba(0,0,0,0.75); - - padding:0px; - height: 100%; - -webkit-transition: width 0.5s; /* For Safari 3.1 to 6.0 */ - transition: width 0.5s; - -} - - -.collapsed-div-caret{ - position: absolute; - width: 120px; - left: 98%; - top: 103px; - transform: translate(-50%, -50%); - z-index: 9999; - font-size: 1.3em; - cursor: pointer; -} - -.child-div-caret{ - position: absolute; - left: 120%; - top: 50%; - transform: translate(-50%, -50%); - z-index: 9999; - font-size: 1.3em; - cursor: pointer; -} - - -.child-div-right { - overflow-y: scroll; - - height: calc(100% - 44px); - - -webkit-transition: 0.5s; /* For Safari 3.1 to 6.0 */ - transition: width 0.5s; - -} - -.shrink-width{ - width: 0px; - /*visibility:hidden;*/ -} - - - -.form-body-container{ - padding-bottom: 10px; - height: calc(100vh - 85px - 32px - 138px); /* is height_of(window) - heigh_of(app-header-bar) - height_of(breadcrumb) - height_of(form-footer-bar) */ - overflow-y:scroll; -} - -.form-footer-seperator{ - - border-style: solid; - border-width: 1px; - border-color: rgb(112, 112, 112); - - /* - -webkit-box-shadow: 0px 0px 11px 1px rgba(0,0,0,0.75); - -moz-box-shadow: 0px 0px 11px 1px rgba(0,0,0,0.75); - box-shadow: 0px 0px 11px 1px rgba(0,0,0,0.75); - */ - - /*border-width: thin;*/ - width:100%; -} - -.form-footer-container { - - /* - -webkit-box-shadow: 0px -3px 5px 0px rgba(128,128,128,1); - -moz-box-shadow: 0px -3px 5px 0px rgba(128,128,128,1); - box-shadow: 0px -3px 5px 0px rgba(128,128,128,1); - */ - - height: 138px; -} - -.progress{ - margin-top: 8px; - margin-bottom: 0px; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-form.component.html b/dmp-frontend/src/app/form/dynamic-form.component.html index 499f96a41..1d6fbc41b 100644 --- a/dmp-frontend/src/app/form/dynamic-form.component.html +++ b/dmp-frontend/src/app/form/dynamic-form.component.html @@ -1,143 +1,50 @@ -
- -
- -
+
+ + -
- -
-
-

{{section.title}}

-
-
- + + + + + +
+
+ + +
+
+ +
+ + +
+
+
+ + {{section.title}} +
+ +
-
- -
- -

{{section.title}}

-
-
- -
-
- -
-
- - - - - -
- - - - - - + + +
- -
- - -
- - - - - - -
- - -
- - -
- - -
- - -
- - -
- -
-

Table of Contents

-
- - -
-
- -
- -
- - - + +
- - - - - \ No newline at end of file + \ No newline at end of file diff --git a/dmp-frontend/src/app/form/dynamic-form.component.scss b/dmp-frontend/src/app/form/dynamic-form.component.scss new file mode 100644 index 000000000..8a8505a43 --- /dev/null +++ b/dmp-frontend/src/app/form/dynamic-form.component.scss @@ -0,0 +1,63 @@ + + +.ng-sidebar { + width: 40%; +} + +/* .toc-container { + background: #f9f9f9 none repeat scroll 0 0; + border: 1px solid #aaa; + display: table; + font-size: 95%; + margin-bottom: 1em; + padding: 20px; + width: 100%; +} */ + +.ui-steps .ui-steps-item { + min-width: 10%; +} + +.dynamic-form-editor { + // background-color: #e0e0e0; + // min-height: 80vh; + mat-vertical-stepper { + background-color: #e0e0e0; + } +} + +.ng-sidebar-container { + overflow: inherit !important; + +} + +/* .ng-sidebar__content { + overflow: inherit !important; +} */ + +.alignment-center{ + text-align: center; +} + + +.demo-progress-bar-container { + + width: 100%; + + + } + +.form-progress-bar { + + margin: 20px 0; + + } + + .full-width{ + width:100%; + } + + .full-height{ + height:100%; + } + diff --git a/dmp-frontend/src/app/form/dynamic-form.component.ts b/dmp-frontend/src/app/form/dynamic-form.component.ts index 0ff2d5167..ef9647a91 100644 --- a/dmp-frontend/src/app/form/dynamic-form.component.ts +++ b/dmp-frontend/src/app/form/dynamic-form.component.ts @@ -1,77 +1,57 @@ -import { Component, Input, OnInit, AfterViewChecked, ViewChild, forwardRef } from '@angular/core'; +import { DatasetWizardModel } from '../models/datasets/DatasetWizardModel'; +import { DatasetWizardComponent } from '../dataset-wizard/dataset-wizard.component'; +import { DatasetProfileDefinitionModel } from '../models/DatasetProfileDefinitionModel'; +import { VisibilityRulesService } from '../visibility-rules/visibility-rules.service'; +import { Rule } from '../models/Rule'; +import { Section } from '../models/Section'; + +import { JsonSerializer } from '../utilities/JsonSerializer'; +import { Component, Input, OnInit, AfterViewChecked, ViewChild, forwardRef, ViewEncapsulation } from '@angular/core'; import { FormGroup, Validators, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; import { NgForm } from '@angular/forms'; import { Router, ActivatedRoute, ParamMap, Params } from '@angular/router'; import 'rxjs/add/operator/switchMap'; +import { Location } from '@angular/common'; +import {MatSidenavModule} from '@angular/material/sidenav'; +import { BaseHttpService } from '../utilities/cite-http-service-module/base-http.service'; +import { DatasetWizardService } from '../services/dataset-wizard/dataset-wizard.service'; -//import { FieldBase } from '../../app/form/fields/field-base'; -import { FieldControlService } from '../../app/services/field-control.service'; -import { ServerService } from '../../app/services/server.service'; -import { dataModelBuilder } from '../../app/services/dataModelBuilder.service'; -import { DataModel } from '../entities/DataModel'; -import { GroupBase } from './dynamic-form-group/group-base'; -import { PaginationService } from '../../app/services/pagination.service'; -import { TokenService, TokenProvider } from '../services/login/token.service'; -import { ModalComponent } from '../modal/modal.component'; -import { AutocompleteRemoteComponent } from './fields/autocomplete-remote/autocomplete-remote.component'; - -import {Location} from '@angular/common'; - -import { AngularDraggableModule } from 'angular2-draggable'; - -import {MenuItem} from 'primeng/primeng'; - -import './../../assets/xml2json.min.js'; -declare var X2JS: any; - -var flatten = require('flat'); -declare var $ :any; - - -import * as scroll from '../../assets/jquery.scrollTo.min.js'; - - -import '../../assets/custom.js'; -declare function simple_notifier(type: string, title: string, message:string): any; - - -//import '../../assets/perfect-scrollbar/perfect-scrollbar.js'; -declare var PerfectScrollbar : any; +declare function simple_notifier(type: string, title: string, message: string): any; @Component({ selector: 'dynamic-form', templateUrl: './dynamic-form.component.html', styleUrls: [ - './dynamic-form.component.css', - '../../assets/perfect-scrollbar/perfect-scrollbar.css' + './dynamic-form.component.scss' ], providers: [ - FieldControlService, ServerService, dataModelBuilder - ] + ], + encapsulation: ViewEncapsulation.None, }) export class DynamicFormComponent implements OnInit { - @Input() dataModel: DataModel = new DataModel(); + @Input() dataModel: DatasetWizardModel = new DatasetWizardModel(); + @Input() path: string; form: FormGroup; - payLoad = ''; - @Input() dirtyValues: number = 0; - // pagination object - @Input() pagination: any = {}; - finalizeStatus:boolean = false; id: string; - datasetId: string; - //datasetProperties:string; + // @Input() datasetId: string; + pathName: string; + pages: Array; + activeStepperIndex: number = 1; + visibleSidebar: boolean = false; + datasetProfileDefinitionModel: DatasetProfileDefinitionModel + private progressbar: boolean = false; + private currentPageIndex: number = 0; private fragment: string; - xml2jsonOBJ: any; - - expandedToc : boolean = true; - - - constructor(private qcs: FieldControlService, private serverService: ServerService, private dataModelService: dataModelBuilder, private router: Router, - private _location: Location, private route: ActivatedRoute, private pagerService: PaginationService, private tokenService: TokenService) { - this.form = this.qcs.toFormGroup(new Array(), new Array()); - this.xml2jsonOBJ = new X2JS(); + constructor(private router: Router, + private _location: Location, + private route: ActivatedRoute, + private visibilityRulesService: VisibilityRulesService, + private http: BaseHttpService, + private datasetWizardService: DatasetWizardService, + ) { + //this.datasetId = route.snapshot.params['id']; } getSubForm(subformName) { @@ -80,235 +60,92 @@ export class DynamicFormComponent implements OnInit { ngOnInit() { + this.datasetProfileDefinitionModel = this.dataModel.datasetProfileDefinition + this.pages = this.getPages(this.datasetProfileDefinitionModel); + this.createPagination(); + this.form = this.datasetProfileDefinitionModel.buildForm(); + this.visibilityRulesService.formGroup = this.form; + let rules: Rule[] = JsonSerializer.fromJSONArray(this.datasetProfileDefinitionModel.rules, Rule); + this.visibilityRulesService.buildVisibilityRules(rules) + this.progressbar = true; + this.route.fragment.subscribe((fragment: string) => { + var self = this; + setTimeout(function () { self.scrollTo(fragment) }); + }); + + this.route.queryParams.subscribe((params) => { + if (params && "page" in params) + this.changeCurrentPage(params["page"]); + }); + + /* else{ + + this.addSection(); + } + this.dataModel = new JsonSerializer().fromJSONObject(TestModel,DatasetModel); + this.form = this.dataModel.buildForm(); + this.visibilityRulesService.formGroup = this.form; + let rules:Rule[] = new JsonSerializer().fromJSONArray(TestModel.rules,Rule); + this.visibilityRulesService.buildVisibilityRules(rules) */ + } + + submit() { + } + + onSubmit(){ + this.datasetWizardService.saveDataset(this.dataModel.id, this.form.value).subscribe(data => { + this.router.navigateByUrl("/datasets/" + this.dataModel.dmp.id); + }); + } + toggleSidebar() { + this.visibleSidebar = !this.visibleSidebar; + } - //this.route.fragment.subscribe(fragment => { this.fragment = fragment; }); //navigate to certain section of the page, it doesn't use anymore - let sub = this.route.queryParams.subscribe(params => { - this.id = params.id; - this.datasetId = params.datasetId; - //this.datasetProperties = params.datasetProperties + getPages(model: DatasetProfileDefinitionModel): Array { + let pageSet = new Set(); + + model.sections.forEach(section => { + pageSet.add(section.page); }); - - this.serverService.getDatasetByID(this.datasetId).subscribe( - (data) => { - var flatList; - var formValues = ""; - if (data.properties) { - console.log("Found already submitted form, loading that one!"); - simple_notifier("info",null,"Resumed previous form"); - formValues = JSON.parse(data.properties); - flatList = flatten(formValues); - //this.patchForm(flatList); - if(data.status == 2) this.finalizeStatus=true; - } - - //the call for the dataset profile above - independent - this.serverService.getDatasetProfileByID(this.id).subscribe( - - response => { - - console.log("response"); - console.log(response); - - const data = response; - - //replace the xmls {model,view,rule} definitions with json -- https://github.com/abdmob/x2js library - data.definition = this.xml2jsonOBJ.xml_str2json(data.definition); - data.ruleset.definition = this.xml2jsonOBJ.xml_str2json(data.ruleset.definition); - data.viewstyle.definition = this.xml2jsonOBJ.xml_str2json(data.viewstyle.definition); - //can be converted back to xml (which shouldn't be needed) with this.xml2jsonOBJ.json2xml_str - - console.log("this.serverService.getFields"); - - console.log("data.dataset") - console.log(data.definition) - console.log(data.ruleset.definition) - console.log(data.viewstyle.definition) - - - this.dataModel = new DataModel(); - this.dataModel = this.dataModelService.getDataModel(data, formValues); //get formvalues and acossiate them with fields - - this.form = this.qcs.toFormGroup(this.dataModel.fields, this.dataModel.groups); - - this.form.valueChanges.subscribe(data => { - // console.log('Form changes', data); - let dirtyValuesArray: Array = []; - let count = 0; - let countDirtyValues = 0; - let percentage = 0; - Object.keys(this.form.controls).forEach((c) => { - //count++; - let currentControl = this.form.controls[c]; - if (currentControl.dirty) - dirtyValuesArray.push(currentControl.value); - - }); - - Object.keys(this.form.value).forEach((c) => { - //count++; - Object.keys(this.form.value[c]).forEach((item) => { - let value = this.form.value[c][item] - if (typeof(value) == "string") value.trim(); - if(typeof(value)== "boolean") value.toString(); - if (value != undefined && value != "") - countDirtyValues++; //TODO REMOVE SPACES FROM EMPTY STRING - }); - - - }); - - this.dataModel.groups.forEach(grp => { - grp.groupFields.forEach((fld) => { - if (fld.visible == true || fld.visible == "true") - count++; - // if (fld.value != undefined && fld.value != " ") - // countDirtyValues++; - }); - }); - //console.log(count); - // var percentage = Math.floor(dirtyValuesArray.length * 100 / count); - percentage = Math.floor(countDirtyValues * 100 / count); - this.dirtyValues = percentage; - }) - - //this.form = this.qcs.toFormGroup(this.fields); - - console.log("SUMMARY: ======>"); - console.log(this.dataModel); - console.log(this.form); - - this.route.paramMap //this is how i get the projects's id - - // initialize to page 1 - this.setPage(1); - - }, - err => { - console.log("There was an error fetching the data from server"); - console.log(err); - } - ); - //end- klhsh gia to dataset profiel - }, - (err) => { - - }); - - var formScroller = new PerfectScrollbar("#form-container"); - var tocScroller = new PerfectScrollbar("#toc-container"); - - - - //this.breadcrumbService.breadcrumbDataEmitter - + return Array.from(pageSet).sort((a, b) => a - b); } - scrollToElemID(elemID) { - scroll("#" + elemID); + shouldDisplaySection(section: Section): Boolean { + return (section.page) == this.currentPageIndex; } - - private patchForm(flatList: any) { - - - for (var prop in flatList) { - if (flatList.hasOwnProperty(prop)) { - if (prop.endsWith('.id') || prop.endsWith('.answer') || prop.endsWith('.value')) continue; - //console.log("updating value of "+prop +" to "+flatList[prop].valueOf()) - this.form.get(prop).setValue(flatList[prop].valueOf()); - } - } - + createPagination() { + /*this.pages.forEach(item => { + this.stepperItems.push({ + label: '', + }) + });*/ } - ngAfterViewChecked(): void { //navigate to certain section of the page - try { - document.querySelector('#' + this.fragment).scrollIntoView(); - } catch (e) { } + changePageIndex(index: any) { + this.router.navigate([this.route.snapshot.url[0] + "/" + this.route.snapshot.url[1]], { queryParams: { page: this.pages[index - 1] } }); } - submitForm(final){ - debugger; - this.serverService.getDatasetByID(this.datasetId).subscribe( - (data) => { - if (final) data.status = 2; - - //data.properties = ""; - data.properties = JSON.stringify(this.form.value); - - data.profile = {"id": data.profile.id}; - - this.serverService.setDataset(data).subscribe( - (data) => { - - console.log("Updated dataset"); - - if (final){ - this._location.back(); - simple_notifier("success",null,"Finalized form progress"); - } - else{ - simple_notifier("success",null,"Saved form progress"); - } - - }, - (err) => { - simple_notifier("danger",null,"Could not save form progress"); - }); - }, - (err) => { - simple_notifier("danger",null,"Could not save form progress"); - }); + scrollTo(sectionID: string) { + if (!sectionID) return; + var element = document.querySelector('#' + sectionID); + if (!element) return; + element.scrollIntoView(); + this.visibleSidebar = true; + var scrollElement = document.querySelector('.scrollableContent'); + //scrollElement.scrollTop = topElement.offsetTop; } - SaveForm() { - let final = false; - this.submitForm(false); - - this.payLoad = JSON.stringify(this.form.value); + changeCurrentPage(pageString: string) { + if (!pageString) return; + var page = parseInt(pageString); + if (isNaN(page)) return; + var pageIndex = this.pages.indexOf(page); + if (pageIndex === -1) return; + this.currentPageIndex = page; } - - SaveFinalizeForm(){ - $("#confirmModal").modal("hide"); - let final = true; - this.submitForm(final); - } - - shouldIShow(element) { //pagination , pages are declared in xml for every groupfield - - if (this.pagination.currentPage == element.page){ - return true; - } - else - return false; - - } - - setPage(page: number) { - - if (page < 1 || page > this.pagination.totalPages) { - return; - } - var pagesize = 4; - // get pagination object from service - this.pagination = this.pagerService.getPagination(this.dataModel.groups, this.dataModel.groups.length, page, pagesize); - - //get current page of items - // this.dataModel.sections.forEach(section => { - // if (section.groupFields.length > 0) { - // section.groupFields = this.dataModel.groups.slice(this.pagination.startIndex, this.pagination.endIndex + 1); - // } - // }); - //this.dataModel.groups = this.dataModel.groups.slice(this.pagination.startIndex, this.pagination.endIndex + 1); - } - - - toggleTOC(){ - this.expandedToc = !this.expandedToc; - } - } \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/autocomplete-remote/autocomplete-remote.component.html b/dmp-frontend/src/app/form/fields/autocomplete-remote/autocomplete-remote.component.html deleted file mode 100644 index 8a4246bf0..000000000 --- a/dmp-frontend/src/app/form/fields/autocomplete-remote/autocomplete-remote.component.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/dmp-frontend/src/app/form/fields/autocomplete-remote/autocomplete-remote.component.ts b/dmp-frontend/src/app/form/fields/autocomplete-remote/autocomplete-remote.component.ts deleted file mode 100644 index 8c632888a..000000000 --- a/dmp-frontend/src/app/form/fields/autocomplete-remote/autocomplete-remote.component.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { Component, OnInit,Input, Output, EventEmitter, forwardRef} from '@angular/core'; -import { Validators, ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; - -import { ServerService } from '../../../services/server.service'; -import { UUID } from 'angular2-uuid'; -import { NguiAutoCompleteModule } from '@ngui/auto-complete'; - -declare var $: any; - - -@Component({ - selector: 'autocomplete-remote', - templateUrl: './autocomplete-remote.component.html', - styleUrls: ['./autocomplete-remote.component.css'], - providers: [ - { - provide: NG_VALUE_ACCESSOR, - useExisting: forwardRef(() => AutocompleteRemoteComponent), - multi: true - } - ] - }) - - - -export class AutocompleteRemoteComponent implements OnInit, ControlValueAccessor { - - - id : string = UUID.UUID(); - @Input() label : string; - @Input() url : string; - selectedValue : string; - - - values : any[] = new Array(); - - query : string = ""; - - - constructor(private serverService :ServerService) { - - } - - - ngOnInit() { - this.updateByQuery(this.query); //just to trigger the first call - } - - - - updateByQuery(query : string){ - this.serverService.getThroughProxy(this.url, query).subscribe( - response => { - this.values.length = 0; //clear array; -- this is quite a fast and memory efficient way - response.data.forEach(element => { - this.values.push(element.attributes.name); - }); - }, - error => { - console.log(error); - } - ); - } - - - onChange: any = () => { }; - onTouched: any = () => { }; - - get value() { - this.value = this.selectedValue; - return this.selectedValue; - } - - set value(val) { - this.selectedValue = val; - this.onChange(val); - this.onTouched(); - } - - - - registerOnChange(fn) { - this.onChange = fn; - } - - registerOnTouched(fn) { - this.onTouched = fn; - } - - writeValue(value) { - if (value) { - this.value = value; - } - } - -} - diff --git a/dmp-frontend/src/app/form/fields/checkbox/field-checkbox.html b/dmp-frontend/src/app/form/fields/checkbox/field-checkbox.html deleted file mode 100644 index e1c70d593..000000000 --- a/dmp-frontend/src/app/form/fields/checkbox/field-checkbox.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/checkbox/field-checkbox.ts b/dmp-frontend/src/app/form/fields/checkbox/field-checkbox.ts deleted file mode 100644 index 37dae71a8..000000000 --- a/dmp-frontend/src/app/form/fields/checkbox/field-checkbox.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {FieldBase} from '../field-base'; - -export class CheckBoxField extends FieldBase{ - controlType = 'checkbox'; - type: "checkbox"; - - constructor(options: {} = {}){ - super(options); - this.type = options['type'] || []; - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/dropdown/field-dropdown.ts b/dmp-frontend/src/app/form/fields/dropdown/field-dropdown.ts index 0da8d0f49..51155bff6 100644 --- a/dmp-frontend/src/app/form/fields/dropdown/field-dropdown.ts +++ b/dmp-frontend/src/app/form/fields/dropdown/field-dropdown.ts @@ -1,11 +1,9 @@ -import {FieldBase} from '../field-base'; -export class DropdownField extends FieldBase{ +export class DropdownField { controlType = 'dropdown'; options: {key: string, value: string}[] =[]; constructor(options: {} = {}){ - super(options); this.options = options['options'] || []; } } \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/dynamic-form-field.component.ts b/dmp-frontend/src/app/form/fields/dynamic-form-field.component.ts deleted file mode 100644 index 16729d0d8..000000000 --- a/dmp-frontend/src/app/form/fields/dynamic-form-field.component.ts +++ /dev/null @@ -1,236 +0,0 @@ -import { DataModel } from '../../entities/DataModel'; -import { Component, Input, OnInit } from '@angular/core'; -import { FormGroup, ValidatorFn, AbstractControl, Validators } from '@angular/forms'; -import { ActivatedRoute } from '@angular/router'; - -import { FieldBase } from './field-base'; -import { GroupBase } from '../../form/dynamic-form-group/group-base'; -import { DropdownField } from '../../form/fields/dropdown/field-dropdown'; -import { RuleStyle } from '../../entities/common/rulestyle'; - - -@Component({ - selector: 'df-field', - templateUrl: './dynamic-form-field.component.html', - styles: ['.checkBoxLabelCustom {font-weight: 700;}'] -}) - -export class DynamicFormFieldComponent { - @Input() dataModel: DataModel; - @Input() field: FieldBase; - @Input() form: FormGroup; - - private fragment: string; - - constructor(private route: ActivatedRoute) { } - - ngOnChanges(changeRecord) { - } - - - get isValid() { - return this.form.controls[this.field.key].valid; - } - get isValidRequired() { - return this.form.controls[this.field.key].hasError("required"); - } - get isValidPattern() { - return this.form.controls[this.field.key].hasError("pattern"); - } - get isValidCustom() { - return this.form.controls[this.field.key].hasError("forbiddenName"); - } - - public ngOnInit() { //dropdown lists take only one of the available sources - for (var i = 0, len = this.dataModel.groups.length; i < len; i++) { - let dropdownField: any; - dropdownField = this.dataModel.groups[i].groupFields.find(x => x.controlType == "dropdown"); - if (dropdownField != undefined) { - if (dropdownField.attributes.sources != undefined) - dropdownField.options = dropdownField.attributes.sources[0].value; - } - - } - this.toggleVisibility(null, this.field, this.field.controlType == "checkbox") - - this.route.fragment.subscribe(fragment => { this.fragment = fragment; }); //navigate to certain section of the page - } - - ngAfterViewChecked(): void { //navigate to certain section of the page - try { - document.querySelector('#' + this.fragment).scrollIntoView(); - } catch (e) { } - } - ruleVisibleMethod(field, rule, dataModel) { //visibility rule -- checks if target field is visible - dataModel.fields.forEach(fld => { - if (fld.label == rule._target && fld.visible == true) - field.visible = true; - - }); - if (field.visible == true) - return true; - } - FieldValueRuleMethod(field, rule, targetField) { //fieldValue rule -- checks the value of target and apply rules, at the same time when the field becomes visible /calling the AddvalidationRules we apply the validation rules for the new field - - var fieldValue = this.form.get(field.key).value;//to do: change field.value - if (rule._ruleStyle == "range") { - if (parseInt(rule._from) < parseInt(field.value) && parseInt(field.value) < parseInt(rule._to)) { - console.log("visible" + field.value) - targetField.visible = true; - this.AddvalidationRules(targetField); - } else { - this.hideField(targetField, rule); - } - - } - if (rule._ruleStyle == "boolean" && field.value !== undefined) { //boolean Decision field - let ruleValue = rule.value.__text; - if (field.value.toString() == ruleValue) { //field.value.value.toString() == ruleValue - targetField.visible = true; - this.AddvalidationRules(targetField); - } else { - this.hideField(targetField, rule); - } - } - if (rule._ruleStyle == "checked") { //checkbox field - if (field.value == true) { - targetField.visible = true; - this.AddvalidationRules(targetField); - } else { - this.hideField(targetField, rule); - } - } - if (rule._ruleStyle == "unchecked") { //checkbox field - if (field.value !== "") { - if (field.value == false) { - targetField.visible = true; - this.AddvalidationRules(targetField); - } else { - this.hideField(targetField, rule); - } - } - - } - if (rule._ruleStyle == "existence") { - if (field.visible == "true" || field.visible == true) { - targetField.visible = true; - this.AddvalidationRules(targetField); - } else { - this.hideField(targetField, rule); - } - } - if (rule._ruleStyle == "regex") { - if (new RegExp(rule.__cdata).test(field.value)) { - targetField.visible = true; - this.AddvalidationRules(targetField); - } else { - this.hideField(targetField, rule); - } - } - if (rule._ruleStyle == "dropdownValue") { //dropdown field - let fieldValue = this.form.get(field.key).value; - let ruleValue; - let ruleValueBoolean = false; - if (rule.value.length) - rule.value.forEach(value => { - if (fieldValue.toString() == value.__text) - ruleValueBoolean = true; - return; - }); - else - ruleValue = rule.value.__text; - if (fieldValue.toString() == ruleValue || ruleValueBoolean.valueOf() == true) { //field.value.value.toString() == ruleValue - targetField.visible = true; - this.AddvalidationRules(targetField); - } else { - this.hideField(targetField, rule); - } - } - } - - hideField(targetField, rule) { - targetField.visible = false; - targetField.value = ' '; - if (this.form.controls[targetField.key].hasError("pattern")) - this.form.controls[targetField.key].reset(); //the regex error message didn't remove without field reset - this.form.controls[targetField.key].clearValidators(); // when a field is hidden must clear the validators and the errors - this.form.controls[targetField.key].updateValueAndValidity(); - } - - findTargetField (field, rule){ - // var targetField = this.dataModel.getFieldByKey(rule._target); - let targetFields = new Array(); - if (this.dataModel.getFieldByKey(rule._target) == undefined) { - this.dataModel.groups.forEach(gr => { - if (gr.key == rule._target) { - gr.groupFields.forEach(field=>{ - targetFields.push(field); - }); - if(gr.compositeFields) - gr.compositeFields.groupFields.forEach(field=>{ - targetFields.push(field); - }); - } - }) - } else { - targetFields.push(this.dataModel.getFieldByKey(rule._target)); - } - return targetFields; - } - - toggleVisibility(e, field, ckb) { //ckb the checkbox only send this parameter, it's essential to change the field value - if (ckb) { - if (e) this.form.get(field.key).patchValue(e.target.checked) - field.value = this.form.get(field.key).value; - } - if (field.rules.length != undefined && field.rules.length > 1) - field.rules.forEach(rule => { - if (rule._type == "fieldValue") { - let targetFieldsArray = this.findTargetField(field,rule); - targetFieldsArray.forEach(targetField =>{ - this.FieldValueRuleMethod(field, rule, targetField); - }) - } - }); - else if (field.rules._type == "fieldValue") { - let targetFieldsArray = this.findTargetField(field,field.rules); - targetFieldsArray.forEach(targetField =>{ - this.FieldValueRuleMethod(field, field.rules, targetField); - }) - - } - } - - AddvalidationRules(field) { - if (this.dataModel.getFieldByKey(field.key).attributes.validation != undefined) { - let arrayVal = new Array(); - this.dataModel.getFieldByKey(field.key).attributes.validation.forEach(rule => { - if (rule.ruleStyle.toString() == RuleStyle[RuleStyle.existence]) { - this.dataModel.getFieldByKey(field.key).required = true; - arrayVal.push(Validators.required); - } - if (rule.ruleStyle.toString() == RuleStyle[RuleStyle.regex]) { - this.dataModel.getFieldByKey(field.key).regex = rule.regex; - arrayVal.push(Validators.pattern(rule.regex)); - } - if (rule.ruleStyle.toString() == RuleStyle[RuleStyle.customValidation]) { - arrayVal.push(this.forbiddenNameValidator(/nothing/i)); - } - - }); - this.form.controls[field.key].setValidators(arrayVal); //Multiple Validators, Usage of array because setValidator override any validators that are provided during initialistaion - this.form.controls[field.key].updateValueAndValidity(); //hide--> visible must update the validators - - } - - } - - forbiddenNameValidator(nameRe: RegExp): ValidatorFn { - return (control: AbstractControl): { [key: string]: any } => { - const forbidden = nameRe.test(control.value); - return forbidden ? { 'forbiddenName': { value: control.value } } : null; - }; - } - - -} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/label/label.ts b/dmp-frontend/src/app/form/fields/label/label.ts deleted file mode 100644 index 7c888ed78..000000000 --- a/dmp-frontend/src/app/form/fields/label/label.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {FieldBase} from '../field-base'; - -export class LabelField extends FieldBase { - controlType = 'label'; - type: string; - - constructor (options: {} = {}) { - super(options); - this.type = options['type'] || ''; - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/radiobox/field-radiobox.css b/dmp-frontend/src/app/form/fields/radiobox/field-radiobox.css deleted file mode 100644 index bf67b66d0..000000000 --- a/dmp-frontend/src/app/form/fields/radiobox/field-radiobox.css +++ /dev/null @@ -1 +0,0 @@ -@CHARSET "UTF-8"; \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/radiobox/field-radiobox.html b/dmp-frontend/src/app/form/fields/radiobox/field-radiobox.html deleted file mode 100644 index 4782d55a7..000000000 --- a/dmp-frontend/src/app/form/fields/radiobox/field-radiobox.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/radiobox/field-radiobox.ts b/dmp-frontend/src/app/form/fields/radiobox/field-radiobox.ts deleted file mode 100644 index 94be627eb..000000000 --- a/dmp-frontend/src/app/form/fields/radiobox/field-radiobox.ts +++ /dev/null @@ -1,13 +0,0 @@ -import {FieldBase} from '../field-base'; - -export class RadioBoxField extends FieldBase{ - controlType = 'radiobox'; - type: "radio"; - answers: Array; - - constructor(options: {} = {}){ - super(options); - this.type = options['type'] || []; - this.answers = options['answers'] || [] - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/textarea/textarea.ts b/dmp-frontend/src/app/form/fields/textarea/textarea.ts deleted file mode 100644 index 6bcd3592d..000000000 --- a/dmp-frontend/src/app/form/fields/textarea/textarea.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {FieldBase} from '../field-base'; - -export class TextAreaField extends FieldBase { - controlType = 'textarea'; - type: string; - - constructor (options: {} = {}) { - super(options); - this.type = options['type'] || ''; - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/textbox/field-textbox.css b/dmp-frontend/src/app/form/fields/textbox/field-textbox.css deleted file mode 100644 index bf67b66d0..000000000 --- a/dmp-frontend/src/app/form/fields/textbox/field-textbox.css +++ /dev/null @@ -1 +0,0 @@ -@CHARSET "UTF-8"; \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/textbox/field-textbox.html b/dmp-frontend/src/app/form/fields/textbox/field-textbox.html deleted file mode 100644 index c11f1aa1d..000000000 --- a/dmp-frontend/src/app/form/fields/textbox/field-textbox.html +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dmp-frontend/src/app/form/fields/textbox/field-textbox.ts b/dmp-frontend/src/app/form/fields/textbox/field-textbox.ts deleted file mode 100644 index 6e5ebe6f0..000000000 --- a/dmp-frontend/src/app/form/fields/textbox/field-textbox.ts +++ /dev/null @@ -1,11 +0,0 @@ -import {FieldBase} from '../field-base'; - -export class TextboxField extends FieldBase { - controlType = 'textbox'; - type: string; - - constructor (options: {} = {}) { - super(options); - this.type = options['type'] || ''; - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/pagination/pagination-service.ts b/dmp-frontend/src/app/form/pagination/pagination-service.ts new file mode 100644 index 000000000..31b452b2b --- /dev/null +++ b/dmp-frontend/src/app/form/pagination/pagination-service.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@angular/core' +@Injectable() +export class PaginationService { + + private currentPageIndex: number; + + public setCurrentIndex(currentPageIndex: number): void { + this.currentPageIndex = currentPageIndex; + } + + public getCurrentIndex():number{ + return this.currentPageIndex; + } + + public isElementVisible(elementPage: number):boolean { + return elementPage == this.currentPageIndex ; //TODO + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.html b/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.html new file mode 100644 index 000000000..07b6bc6d6 --- /dev/null +++ b/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.html @@ -0,0 +1,5 @@ + + +
+ +
\ No newline at end of file diff --git a/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.ts b/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.ts new file mode 100644 index 000000000..58f757f96 --- /dev/null +++ b/dmp-frontend/src/app/form/pprogress-bar/progress-bar.component.ts @@ -0,0 +1,69 @@ +import { VisibilityRulesService } from '../../visibility-rules/visibility-rules.service'; +import { ViewEncapsulation } from '@angular/core'; + +import { Component, Input, OnInit } from '@angular/core'; +import { FormGroup, FormControl, FormArray } from '@angular/forms' +@Component({ + selector: 'progress-bar', + templateUrl: './progress-bar.component.html', + styles: ['.alwaysVisible .ui-progressbar-label { display:block!important; }'], + encapsulation: ViewEncapsulation.None +}) +export class ProgressBarComponent implements OnInit { + @Input() formGroup: FormGroup + @Input("progressValueAccuracy") public accuracy: number = 1; + determinateProgressValue: number; + + constructor(private visibilityRulesService: VisibilityRulesService) { } + + private value: number = 0; + ngOnInit() { + this.calculateValueForProgressbar() + this.formGroup + .valueChanges + .subscribe(control => { + this.calculateValueForProgressbar(); + }); + } + + calculateValueForProgressbar() { + var progressSoFar = this.countFormControlsWithValue(this.formGroup); + var total = this.getFormControlDepthLength(this.formGroup); + var perc = (progressSoFar / total) * 100; + this.value = Number.parseFloat(perc.toPrecision(this.accuracy)); + } + + countFormControlsWithValue(form: FormGroup): number { + let value = 0; + Object.keys(form.controls).forEach(key => { + let control = form.controls[key] + if (control instanceof FormGroup) value += this.countFormControlsWithValue(control); + else if (control instanceof FormArray) { + let formArray = (control); + for (let i = 0; i < formArray.length; i++) { + value += this.countFormControlsWithValue(formArray.get("" + i)) + } + } + else if (key === "value" && control.value != null && control.value != "") value++; + }); + return value; + } + + getFormControlDepthLength(form: FormGroup): number { + let value = 0; + Object.keys(form.controls).forEach(key => { + let control = form.controls[key]; + if (control instanceof FormGroup) { value += this.getFormControlDepthLength(control); } + else if (control instanceof FormArray) { + let formArray = (control); + for (let i = 0; i < formArray.length; i++) { + if (formArray.get("" + i).value && this.visibilityRulesService.isElementVisible(null, formArray.get("" + i).value.id)) + value += this.getFormControlDepthLength(formArray.get("" + i)) + } + } + else if (key === "value" && this.visibilityRulesService.isElementVisible(null, form.controls["id"].value)) + value++; + }); + return value; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/tableOfContents/base-table-of-content.component.ts b/dmp-frontend/src/app/form/tableOfContents/base-table-of-content.component.ts new file mode 100644 index 000000000..f9f2e730a --- /dev/null +++ b/dmp-frontend/src/app/form/tableOfContents/base-table-of-content.component.ts @@ -0,0 +1,10 @@ +import { ActivatedRouteSnapshot, Router, ActivatedRoute } from '@angular/router'; + +export class BaseTableOfContent { + constructor(public router: Router, public route: ActivatedRoute) { } + + scrollToId(elementId, page: number) { + //this.paginationService.setCurrentIndex(page-1); + this.router.navigate([this.route.snapshot.url[0] + "/" + this.route.snapshot.url[1]], { fragment: elementId, queryParams: { page: page } }); + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-content-field/table-of-content-field.component.html b/dmp-frontend/src/app/form/tableOfContents/table-of-content-field/table-of-content-field.component.html new file mode 100644 index 000000000..991aa1a51 --- /dev/null +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-content-field/table-of-content-field.component.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-content-field/table-of-content-field.component.ts b/dmp-frontend/src/app/form/tableOfContents/table-of-content-field/table-of-content-field.component.ts new file mode 100644 index 000000000..b23056191 --- /dev/null +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-content-field/table-of-content-field.component.ts @@ -0,0 +1,23 @@ +import { VisibilityRulesService } from '../../../visibility-rules/visibility-rules.service'; +import { BaseTableOfContent } from '../base-table-of-content.component'; +import { CompositeField } from '../../../models/CompositeField'; +import { Field } from '../../../models/Field'; +import { Section } from '../../../models/Section'; +import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; +import {Router, ActivatedRoute} from '@angular/router' + + +@Component({ + selector: 'table-of-contents-field', + templateUrl: '/table-of-content-field.component.html', + providers: [] + }) +export class TableOfContentsFieldComponent extends BaseTableOfContent{ + @Input() model:Field; + @Input() index:number; + @Input() public path:string; + @Input() public page: number; + constructor(public router: Router, public route: ActivatedRoute,private visibilityRulesService: VisibilityRulesService) { + super(router, route) + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-content-fieldset/table-of-content-fieldset.component.html b/dmp-frontend/src/app/form/tableOfContents/table-of-content-fieldset/table-of-content-fieldset.component.html new file mode 100644 index 000000000..0e42a2a00 --- /dev/null +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-content-fieldset/table-of-content-fieldset.component.html @@ -0,0 +1 @@ + diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-content-fieldset/table-of-content-fieldset.component.ts b/dmp-frontend/src/app/form/tableOfContents/table-of-content-fieldset/table-of-content-fieldset.component.ts new file mode 100644 index 000000000..0af8888b8 --- /dev/null +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-content-fieldset/table-of-content-fieldset.component.ts @@ -0,0 +1,26 @@ +import { VisibilityRulesService } from '../../../visibility-rules/visibility-rules.service'; +import { BaseTableOfContent } from '../base-table-of-content.component'; +import { CompositeField } from '../../../models/CompositeField'; +import { FieldGroup } from '../../../models/FieldGroup'; +import { Section } from '../../../models/Section'; +import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; +import { Router, ActivatedRoute } from '@angular/router' + +//import * as $ from '../../../../node_modules/jquery/dist/jquery' + + +@Component({ + selector: 'table-of-contents-fieldset', + templateUrl: '/table-of-content-fieldset.component.html', + providers: [] +}) +export class TableOfContentsFieldSetComponent extends BaseTableOfContent { + + @Input() model: CompositeField; + @Input() index: number; + @Input() public path: string; + @Input() public page: number; + constructor(public router: Router, public route: ActivatedRoute,private visibilityRulesService: VisibilityRulesService) { + super(router, route) + } +} diff --git a/dmp-frontend/src/app/viewers/dmp-detailed/dmp-detailed.component.css b/dmp-frontend/src/app/form/tableOfContents/table-of-content-group/table-of-content-group.component.html similarity index 100% rename from dmp-frontend/src/app/viewers/dmp-detailed/dmp-detailed.component.css rename to dmp-frontend/src/app/form/tableOfContents/table-of-content-group/table-of-content-group.component.html diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-content-group/table-of-content-group.component.ts b/dmp-frontend/src/app/form/tableOfContents/table-of-content-group/table-of-content-group.component.ts new file mode 100644 index 000000000..39a891966 --- /dev/null +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-content-group/table-of-content-group.component.ts @@ -0,0 +1,30 @@ +import { VisibilityRulesService } from '../../../visibility-rules/visibility-rules.service'; +import { BaseTableOfContent } from '../base-table-of-content.component'; +import { FieldGroup } from '../../../models/FieldGroup'; +import { Section } from '../../../models/Section'; +import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; +import {Router, ActivatedRoute} from '@angular/router' +//import * as $ from '../../../../node_modules/jquery/dist/jquery' + + +@Component({ + selector: 'table-of-contents-group', + templateUrl: '/table-of-content-group.component.html', + providers: [] +}) +export class TableOfContentsGroupComponent extends BaseTableOfContent { + + @Input() model: FieldGroup; + @Input() index: number; + @Input() public path: string; + @Input() public page: number; + /* @Output() + setPage:EventEmitter = new EventEmitter(); + + */ + constructor(public router: Router, public route: ActivatedRoute,private visibilityRulesService: VisibilityRulesService) { + super(router, route) + } + + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-content-section/table-of-content-section.component.html b/dmp-frontend/src/app/form/tableOfContents/table-of-content-section/table-of-content-section.component.html new file mode 100644 index 000000000..1dde97aeb --- /dev/null +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-content-section/table-of-content-section.component.html @@ -0,0 +1,10 @@ + +{{path + ' ' + model.title}} + + + +
    +
  • + +
  • +
\ No newline at end of file diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-content-section/table-of-content-section.component.ts b/dmp-frontend/src/app/form/tableOfContents/table-of-content-section/table-of-content-section.component.ts new file mode 100644 index 000000000..e50a680f5 --- /dev/null +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-content-section/table-of-content-section.component.ts @@ -0,0 +1,28 @@ +import { VisibilityRulesService } from '../../../visibility-rules/visibility-rules.service'; +import { BaseTableOfContent } from '../base-table-of-content.component'; +import { Section } from '../../../models/Section'; +import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; +import { ActivatedRouteSnapshot,Router,ActivatedRoute } from '@angular/router'; + +//import * as $ from '../../../../node_modules/jquery/dist/jquery' + + +@Component({ + selector: 'table-of-contents-section', + templateUrl: '/table-of-content-section.component.html', + providers: [] +}) +export class TableOfContentsSectionComponent extends BaseTableOfContent implements OnInit { + + @Input() model: Section; + @Input() index: number; + @Input() public path: string; + @Input() public page: number; + constructor(public router: Router,public route:ActivatedRoute,private visibilityRulesService: VisibilityRulesService){ + super(router,route) + } + ngOnInit() { + + } + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.html b/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.html new file mode 100644 index 000000000..78fa65451 --- /dev/null +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.html @@ -0,0 +1,7 @@ + +
    +
  • + + +
  • +
\ No newline at end of file diff --git a/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.ts b/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.ts new file mode 100644 index 000000000..e65184be4 --- /dev/null +++ b/dmp-frontend/src/app/form/tableOfContents/table-of-contents.component.ts @@ -0,0 +1,25 @@ +import { DatasetProfileDefinitionModel } from '../../models/DatasetProfileDefinitionModel'; +import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; + +//import * as $ from '../../../../node_modules/jquery/dist/jquery' + +//import * as scroll from '../../../assets/jquery.scrollTo.min.js'; + +@Component({ + selector: 'table-of-content', + templateUrl: '/table-of-contents.component.html', + styleUrls: ['./toc.component.css'], + providers: [] +}) +export class TableOfContentsComponent implements OnInit{ + + @Input() model:DatasetProfileDefinitionModel; + public path:string=""; + /* @Output() + setPage:EventEmitter = new EventEmitter(); + + */ ngOnInit(){ + + } + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/form/tableOfContents/toc.component.html b/dmp-frontend/src/app/form/tableOfContents/toc.component.html deleted file mode 100644 index 45a50bf33..000000000 --- a/dmp-frontend/src/app/form/tableOfContents/toc.component.html +++ /dev/null @@ -1,20 +0,0 @@ - - - \ No newline at end of file diff --git a/dmp-frontend/src/app/form/tableOfContents/toc.component.ts b/dmp-frontend/src/app/form/tableOfContents/toc.component.ts deleted file mode 100644 index db1cb50cf..000000000 --- a/dmp-frontend/src/app/form/tableOfContents/toc.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; -import { DataModel } from '../../entities/DataModel'; - -//import * as $ from '../../../../node_modules/jquery/dist/jquery' - -import * as scroll from '../../../assets/jquery.scrollTo.min.js'; - -@Component({ - selector: 'toc', - templateUrl: '/toc.component.html', - styleUrls: ['./toc.component.css'], - providers: [] -}) -export class TocComponent implements OnInit{ - - @Input() dataModel: DataModel; - private headers = new Array(); - - @Output() - setPage:EventEmitter = new EventEmitter(); - - ngOnInit(){ - var len = this.dataModel.groups.length; // I don't use headers , I use datamodel.groupfields - for (var i=0; i + +
+
+
+ + +
+
+ + +
+
+ + +
+
+
-
-

Hello {{ userInfo?.name!=null ? userInfo?.name : userInfo?.email }}

-

Welcome {{ userInfo?.created != userInfo?.lastloggedin ? "back" : "" }} to the Data Management Plans composer application.

- -
+ - \ No newline at end of file + + + + +
\ No newline at end of file diff --git a/dmp-frontend/src/app/homepage/homepage.component.ts b/dmp-frontend/src/app/homepage/homepage.component.ts index c8d1ea827..ccfb7b604 100644 --- a/dmp-frontend/src/app/homepage/homepage.component.ts +++ b/dmp-frontend/src/app/homepage/homepage.component.ts @@ -1,32 +1,38 @@ import { Component, OnInit } from '@angular/core'; import { Router, ActivatedRoute } from '@angular/router'; -import { ServerService } from '../../app/services/server.service'; +import { DashboardService } from '../../app/services/dashboard/dashboard.service'; +import { DashboardStatisticsModel } from '../models/dashboard/DashboardStatisticsModel'; +import { JsonSerializer } from '../utilities/JsonSerializer'; @Component({ selector: 'homepage', templateUrl: './homepage.component.html', styleUrls: ['./homepage.component.css'], - providers: [] + providers: [] }) -export class HomepageComponent implements OnInit{ +export class HomepageComponent implements OnInit { private userInfo: any; + private dashboardStatisticsData: DashboardStatisticsModel = new DashboardStatisticsModel(); - constructor(private serverService: ServerService, private route: ActivatedRoute, private router: Router){ - + constructor( + private route: ActivatedRoute, + private router: Router, + private dashBoardService: DashboardService + ) { + this.dashboardStatisticsData.totalDataManagementPlanCount = 0; + this.dashboardStatisticsData.totalDataSetCount = 0; + this.dashboardStatisticsData.totalProjectCount = 0; } ngOnInit() { - this.serverService.whoami().subscribe( - userInfo => { - this.userInfo = userInfo; - }, - error => { - } - ); + this.dashBoardService.getStatistics().subscribe(results => { + //let data = results['payload']; + this.dashboardStatisticsData = JsonSerializer.fromJSONObject(results, DashboardStatisticsModel); + }) + } - } \ No newline at end of file diff --git a/dmp-frontend/src/app/viewers/project-detailed/project-detailed.component.css b/dmp-frontend/src/app/invitation-accepted/invitation-accepted.component.html similarity index 100% rename from dmp-frontend/src/app/viewers/project-detailed/project-detailed.component.css rename to dmp-frontend/src/app/invitation-accepted/invitation-accepted.component.html diff --git a/dmp-frontend/src/app/invitation-accepted/invitation-accepted.component.ts b/dmp-frontend/src/app/invitation-accepted/invitation-accepted.component.ts new file mode 100644 index 000000000..0aeadf2b6 --- /dev/null +++ b/dmp-frontend/src/app/invitation-accepted/invitation-accepted.component.ts @@ -0,0 +1,34 @@ +import { JsonSerializer } from '../utilities/JsonSerializer'; +import { UserInvitationCriteria } from '../models/criteria/invitation/UserInvitationCriteria'; +import { RequestItem } from '../models/criteria/RequestItem'; +import { Invitation } from '../models/invitation/Invitation'; +import { InvitationService } from '../services/invitation/invitation.service'; +import { User } from '../models/invitation/User'; +import { Component, OnInit, Inject } from "@angular/core"; +import { FormGroup } from '@angular/forms'; +import { Params, ActivatedRoute, Router } from '@angular/router'; +import { MAT_DIALOG_DATA } from '@angular/material'; + +@Component({ + selector: 'app-invitation-accepted-component', + templateUrl: 'invitation-accepted.component.html', + providers: [InvitationService] + +}) +export class InvitationAcceptedComponent implements OnInit { + constructor( + private invitationService: InvitationService, + private route: ActivatedRoute, + public router: Router + ) { } + + ngOnInit(): void { + this.route.params.subscribe(params => { + let id = params["id"] + this.invitationService.exchange(id).subscribe(id=>{ + this.router.navigate(["dmp/"+id]) + }) + } + ) + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/invitation/invitation.component.html b/dmp-frontend/src/app/invitation/invitation.component.html new file mode 100644 index 000000000..eaa942967 --- /dev/null +++ b/dmp-frontend/src/app/invitation/invitation.component.html @@ -0,0 +1,23 @@ +
+

{{'INVITATION-EDITOR.TITLE' | translate}} {{data.dmpName}}

+
+ + +
{{chip.name.substring(0, 1).toUpperCase()}}
+ {{chip.name}} +
+ +
+ {{option.name}} +
+
+ +
+
+
+
+ +
+
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/widgets/breadcrumb/breadcrumb.component.css b/dmp-frontend/src/app/invitation/invitation.component.scss similarity index 100% rename from dmp-frontend/src/app/widgets/breadcrumb/breadcrumb.component.css rename to dmp-frontend/src/app/invitation/invitation.component.scss diff --git a/dmp-frontend/src/app/invitation/invitation.component.ts b/dmp-frontend/src/app/invitation/invitation.component.ts new file mode 100644 index 000000000..32527c36f --- /dev/null +++ b/dmp-frontend/src/app/invitation/invitation.component.ts @@ -0,0 +1,62 @@ +import { JsonSerializer } from '../utilities/JsonSerializer'; +import { UserInvitationCriteria } from '../models/criteria/invitation/UserInvitationCriteria'; +import { RequestItem } from '../models/criteria/RequestItem'; +import { Invitation } from '../models/invitation/Invitation'; +import { InvitationService } from '../services/invitation/invitation.service'; +import { User } from '../models/invitation/User'; +import { Component, OnInit, Inject } from "@angular/core"; +import { FormGroup } from '@angular/forms'; +import { Params, ActivatedRoute, Router } from '@angular/router'; +import { MAT_DIALOG_DATA } from '@angular/material'; + +@Component({ + selector: 'app-invitation-component', + templateUrl: 'invitation.component.html', + providers: [InvitationService] + +}) +export class InvitationComponent implements OnInit { + + private formGroup: FormGroup; + + private filteredUsersAsync: boolean = false; + + private filteredUsers: User[]; + + constructor( + private invitationService: InvitationService, + private route: ActivatedRoute, + public router: Router, + @Inject(MAT_DIALOG_DATA) public data: any + ) { } + + ngOnInit(): void { + let invitation = new Invitation(); + invitation.dataManagementPlan = this.data.dmpId; + this.formGroup = invitation.buildForm(); + } + + + send(value: any) { + this.invitationService.inviteUsers(this.formGroup.value).subscribe(); + } + + filterUsers(value: string): void { + this.filteredUsers = undefined; + if (value) { + this.filteredUsersAsync = true; + let request = new RequestItem(); + request.criteria = { like: value } + this.invitationService.getUsers(request).subscribe(items => { + this.filteredUsers = JsonSerializer.fromJSONArray(items, User); + if (!this.filteredUsers || this.filteredUsers.length == 0) { + let user = new User(); + user.email = value; + user.name = value; + this.filteredUsers.push(user) + } + this.filteredUsersAsync = false; + }); + } + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/login/googgle-sign-in/googgle-sign-in.component.css b/dmp-frontend/src/app/login/googgle-sign-in/googgle-sign-in.component.css deleted file mode 100644 index 7ecba8a01..000000000 --- a/dmp-frontend/src/app/login/googgle-sign-in/googgle-sign-in.component.css +++ /dev/null @@ -1,11 +0,0 @@ -.nomargin{ - margin-top: 0px; - margin-bottom: 0px; - margin-left: 0px; - margin-right: 0px; -} - -.width-range { - max-width: 500px; - min-width: 300px; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/login/googgle-sign-in/googgle-sign-in.component.html b/dmp-frontend/src/app/login/googgle-sign-in/googgle-sign-in.component.html deleted file mode 100644 index e84f17f92..000000000 --- a/dmp-frontend/src/app/login/googgle-sign-in/googgle-sign-in.component.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - -
- - -
- - - - diff --git a/dmp-frontend/src/app/login/googgle-sign-in/googgle-sign-in.component.spec.ts b/dmp-frontend/src/app/login/googgle-sign-in/googgle-sign-in.component.spec.ts deleted file mode 100644 index ee11f64bd..000000000 --- a/dmp-frontend/src/app/login/googgle-sign-in/googgle-sign-in.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { GooggleSignInComponent } from './googgle-sign-in.component'; - -describe('GooggleSignInComponent', () => { - let component: GooggleSignInComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ GooggleSignInComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(GooggleSignInComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/dmp-frontend/src/app/login/main-sign-in/main-sign-in.component.css b/dmp-frontend/src/app/login/main-sign-in/main-sign-in.component.css deleted file mode 100644 index e49f49b9a..000000000 --- a/dmp-frontend/src/app/login/main-sign-in/main-sign-in.component.css +++ /dev/null @@ -1,75 +0,0 @@ -.form-signin -{ - max-width: 330px; - padding: 15px; - margin: 0 auto; -} -.form-signin .form-signin-heading, .form-signin .checkbox -{ - margin-bottom: 10px; -} -.form-signin .checkbox -{ - font-weight: normal; -} -.form-signin .form-control -{ - position: relative; - font-size: 16px; - height: auto; - padding: 10px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -.form-signin .form-control:focus -{ - z-index: 2; -} -.form-signin input[type="text"] -{ - margin-bottom: -1px; - border-bottom-left-radius: 0; - border-bottom-right-radius: 0; -} -.form-signin input[type="password"] -{ - margin-bottom: 10px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.account-wall -{ - margin-top: 20px; - padding: 40px 0px 20px 0px; - background-color: #f7f7f7; - -moz-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3); - -webkit-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3); - box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3); -} -.login-title -{ - color: #555; - font-size: 18px; - font-weight: 400; - display: block; -} -.profile-img -{ - width: 96px; - height: 96px; - margin: 0 auto 10px; - display: block; - -moz-border-radius: 50%; - -webkit-border-radius: 50%; - border-radius: 50%; -} -.need-help -{ - margin-top: 10px; -} -.new-account -{ - display: block; - margin-top: 10px; -} \ No newline at end of file diff --git a/dmp-frontend/src/app/login/main-sign-in/main-sign-in.component.html b/dmp-frontend/src/app/login/main-sign-in/main-sign-in.component.html deleted file mode 100644 index 660c3348b..000000000 --- a/dmp-frontend/src/app/login/main-sign-in/main-sign-in.component.html +++ /dev/null @@ -1,43 +0,0 @@ -
-
-
-

- -
-
- -
- -
-
-
- -
-
- -
- diff --git a/dmp-frontend/src/app/login/main-sign-in/main-sign-in.component.spec.ts b/dmp-frontend/src/app/login/main-sign-in/main-sign-in.component.spec.ts deleted file mode 100644 index cd7c7a960..000000000 --- a/dmp-frontend/src/app/login/main-sign-in/main-sign-in.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { MainSignInComponent } from './main-sign-in.component'; - -describe('MainSignInComponent', () => { - let component: MainSignInComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ MainSignInComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(MainSignInComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/dmp-frontend/src/app/login/main-sign-in/main-sign-in.component.ts b/dmp-frontend/src/app/login/main-sign-in/main-sign-in.component.ts deleted file mode 100644 index 31290388e..000000000 --- a/dmp-frontend/src/app/login/main-sign-in/main-sign-in.component.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { NativeLoginService } from '../../services/login/native-login.service'; -import { TokenService, TokenProvider } from '../../services/login/token.service'; -import {Router} from '@angular/router'; -import {MenuItem} from 'primeng/primeng'; - -import '../../../assets/custom.js'; -declare function simple_notifier(type: string, title: string, message:string): any; - -@Component({ - selector: 'app-main-sign-in', - templateUrl: './main-sign-in.component.html', - styleUrls: ['./main-sign-in.component.css'] -}) -export class MainSignInComponent implements OnInit { - - - nativeLoginForm : any; - - creds : any = {"username":"","password":""}; - - - constructor( private fb: FormBuilder, private nativeLogin : NativeLoginService, private tokenService : TokenService, private router : Router) { - - } - - - createForm(){ - - this.nativeLoginForm = this.fb.group({ - username: ['', Validators.required ], - password: ['', Validators.required ] - }); - - } - - - ngOnInit() { - this.createForm(); - if(this.tokenService.isLoggedIn()){ - this.router.navigate(['/welcome'], { queryParams: { /*returnUrl: this.state.url*/ }}); - } - } - - - login(){ - //login using the credentials - - this.nativeLogin.login(this.creds.username, this.creds.password).subscribe( - response => { - - simple_notifier("success",null,"Successful login"); - - this.tokenService.login(response['token'], TokenProvider.native, this.creds.username, response['email']); - this.router.navigate(['/welcome'], { queryParams: { /*returnUrl: this.state.url*/ }}); - }, - err => { - simple_notifier("danger",null,"Failed to login"); - } - ); - - } - -} diff --git a/dmp-frontend/src/app/modal/modal.component.ts b/dmp-frontend/src/app/modal/modal.component.ts deleted file mode 100644 index cb135700c..000000000 --- a/dmp-frontend/src/app/modal/modal.component.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { Component, OnInit, Input,Output,EventEmitter, ViewChild, ElementRef, NgZone } from '@angular/core'; -import { ServerService } from '../../app/services/server.service'; -import { DropdownField } from '../../app/form/fields/dropdown/field-dropdown'; -import { Param } from '../entities/model/param'; -import { Dataset } from '../entities/model/dataset'; -import { Project } from '../entities/model/project'; -import { DataTable, DataTableTranslations, DataTableResource } from 'angular-4-data-table-bootstrap-4'; -import { Router, ActivatedRoute } from '@angular/router'; - -declare var jquery:any; -declare var $ :any; - -@Component({ - selector: 'modal', - templateUrl: './modal.html' -}) - -export class ModalComponent implements OnInit { - - @Input() datasetDropDown: DropdownField; - // public dataSetVisibe:boolean; - @Input() datasets: Dataset[]; - public project: Project; - datasetResource :DataTableResource; - @Input() datasetCount = 0; - @ViewChild('modalDmps') modalDmps; - - @Input() - public item:any - showValue:boolean - @Input() - get show(){ - return this.showValue; - } - @Output() - public showChange = new EventEmitter(); - - set show(value:any){ - this.showValue = value - this.showChange.emit(this.showValue) - } - - dataSetValue:boolean - @Input() - get dataSetVisibe(){ - return this.dataSetValue; - } - @Output() - public dataSetValueChange = new EventEmitter(); - - set dataSetVisibe(value:any){ - this.dataSetValue = value; - this.dataSetValueChange.emit(this.dataSetValue) - } - - constructor(private serverService: ServerService, private router: Router, private ngZone: NgZone) { - this.datasetDropDown = new DropdownField(); - this.datasetDropDown.options = []; - //this.dataSetVisibe= false; - this.datasets = []; - this.project = new Project(); - - - } - - ngOnInit() { - - this.serverService.listDmpsLabelID().subscribe( - response => { - console.log("response"); - console.log(response); - //let params = new Param(); - response.forEach((dmp) => { - let params = new Param(); - params.key = dmp.id; - params.value = dmp.label; - this.datasetDropDown.options.push(params); - }); - - } - ) - if(this.show) this.showModal() - } - - - - showModal(){ - this.project.label = this.item.label; - this.project.abbreviation = this.item.abbreviation; - this.project.uri = this.item.uri; - this.project.id = this.item.id; - $("#exampleModalDmps").modal("show"); - } - - closeModal(){ - $("#exampleModalDmps").modal("hide"); - this.show = false; - } - - showDatasets(dmpId, event) { - debugger; - this.dataSetVisibe = true; - $("#exampleModalDmps").modal("hide"); - this.show = false; - // this.ngZone.run(() => this.router.navigateByUrl('dataset')); //change router - - } - - afterLoad(){ - this.datasetResource = new DataTableResource(this.datasets); - this.datasetResource.count().then(count => this.datasetCount = count); - } -} - diff --git a/dmp-frontend/src/app/modal/modal.html b/dmp-frontend/src/app/modal/modal.html deleted file mode 100644 index 4944d2848..000000000 --- a/dmp-frontend/src/app/modal/modal.html +++ /dev/null @@ -1,58 +0,0 @@ - - - - diff --git a/dmp-frontend/src/app/models/BaseModel.ts b/dmp-frontend/src/app/models/BaseModel.ts new file mode 100644 index 000000000..c4cfd9e90 --- /dev/null +++ b/dmp-frontend/src/app/models/BaseModel.ts @@ -0,0 +1,4 @@ +import { FormBuilder } from '@angular/forms'; +export abstract class BaseModel{ + public formBuilder:FormBuilder = new FormBuilder(); +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/CompositeField.ts b/dmp-frontend/src/app/models/CompositeField.ts new file mode 100644 index 000000000..c91f9f504 --- /dev/null +++ b/dmp-frontend/src/app/models/CompositeField.ts @@ -0,0 +1,74 @@ +import { FormGroup } from '@angular/forms'; +import { JsonSerializer } from '../utilities/JsonSerializer'; +import { Serializable } from './interfaces/Serializable'; +import { BaseModel } from './BaseModel'; +import { Field } from './Field' +import { Multiplicity } from './Multiplicity'; +export class CompositeField extends BaseModel implements Serializable { + public fields: Array = new Array(); + public ordinal: number + public id: string + public multiplicity: Multiplicity; + public multiplicityItems: Array = new Array(); + public title: string + public description: string + public extendedDescription: string + public hasCommentField: boolean; + public commentFieldValue: string; + + fromJSONObject(item: any): CompositeField { + + this.fields = JsonSerializer.fromJSONArray(item.fields, Field); + this.ordinal = item.ordinal; + this.id = item.id; + this.title = item.title; + this.description = item.description; + this.extendedDescription = item.extendedDescription; + this.hasCommentField = item.hasCommentField; + this.commentFieldValue = item.commentFieldValue; + this.multiplicity = JsonSerializer.fromJSONObject(item.multiplicity, Multiplicity); + //this.multiplicity = new Multiplicity(); + //this.multiplicity.max = 2; + if(item.multiplicityItems)this.multiplicityItems = JsonSerializer.fromJSONArray(item.multiplicityItems, CompositeField); + return this; + } + + buildForm(): FormGroup { + let formGroup = this.formBuilder.group({ + id: this.id, + ordinal: this.ordinal, + title: this.title, + description: this.description, + extendedDescription: this.extendedDescription, + hasCommentField: this.hasCommentField, + commentFieldValue: this.commentFieldValue + }); + + let fieldsFormArray = new Array(); + this.fields.forEach(item => { + let form: FormGroup = item.buildForm(); + fieldsFormArray.push(form) + }) + formGroup.addControl('fields', this.formBuilder.array(fieldsFormArray)); + + let multiplicityItemsFormArray = new Array(); + this.multiplicityItems.forEach(item => { + let form: FormGroup = item.buildForm(); + multiplicityItemsFormArray.push(form) + }) + formGroup.addControl('multiplicityItems', this.formBuilder.array(multiplicityItemsFormArray)); + + return formGroup; + } + + cloneForMultiplicity(index: number): CompositeField { + let newItem: CompositeField = new CompositeField(); + newItem.id = 'multiple_' + this.id + '_' + index; + this.fields.forEach(field => { + newItem.fields.push(field.cloneForMultiplicity(this.fields.indexOf(field), newItem.id + "_")); + }); + newItem.ordinal = this.ordinal; + + return newItem; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/DatasetProfileDefinitionModel.ts b/dmp-frontend/src/app/models/DatasetProfileDefinitionModel.ts new file mode 100644 index 000000000..a28c72fc1 --- /dev/null +++ b/dmp-frontend/src/app/models/DatasetProfileDefinitionModel.ts @@ -0,0 +1,30 @@ +import { Rule } from './Rule'; +import { BaseModel } from './BaseModel'; +import { FormBuilder, FormGroup } from '@angular/forms'; +import { FormGenerator } from './interfaces/FormGenerator'; +import { JsonSerializer } from '../utilities/JsonSerializer'; +import { Section } from './Section'; +import { Serializable } from './interfaces/Serializable'; +export class DatasetProfileDefinitionModel extends BaseModel implements Serializable,FormGenerator{ + public status:number + public rules:Rule[]; + public sections:Array
+ fromJSONObject(item:any):DatasetProfileDefinitionModel{ + this.status = item.status; + this.sections = JsonSerializer.fromJSONArray(item.sections,Section); + this.rules = JsonSerializer.fromJSONArray(item.rules,Rule); + return this; + } + + buildForm():FormGroup{ + let formGroup:FormGroup = new FormBuilder().group({}); + let sectionsFormArray = new Array(); + this.sections.forEach(item => { + let form: FormGroup = item.buildForm(); + sectionsFormArray.push(form) + }) + formGroup.addControl('sections', this.formBuilder.array(sectionsFormArray)); + return formGroup; + } + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/DefaultValue.ts b/dmp-frontend/src/app/models/DefaultValue.ts new file mode 100644 index 000000000..470622aed --- /dev/null +++ b/dmp-frontend/src/app/models/DefaultValue.ts @@ -0,0 +1,24 @@ +import { BaseModel } from './BaseModel'; +import { FormGroup } from '@angular/forms'; +import { FormGenerator } from './interfaces/FormGenerator'; +import { Serializable } from './interfaces/Serializable'; + +export class DefaultValue extends BaseModel implements Serializable, FormGenerator{ + public type: string; + public value: string; + + fromJSONObject(item: any): DefaultValue { + this.type = item.type; + this.value = item.value; + return this; + } + + buildForm(): FormGroup { + let formGroup = this.formBuilder.group({ + type: [this.type], + value: [this.value] + + }); + return formGroup; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/Field.ts b/dmp-frontend/src/app/models/Field.ts new file mode 100644 index 000000000..c21090a1f --- /dev/null +++ b/dmp-frontend/src/app/models/Field.ts @@ -0,0 +1,94 @@ +import { BaseModel } from './BaseModel'; +import { FormGroup, Validators } from '@angular/forms'; +import { FormGenerator } from './interfaces/FormGenerator'; +import { JsonSerializer } from '../utilities/JsonSerializer'; +import { Serializable } from './interfaces/Serializable'; +import { Multiplicity } from './Multiplicity'; +import { DefaultValue } from './DefaultValue'; +import { ValidationTypes } from '@app/models/common/ValidationTypes'; + +export class Field extends BaseModel implements Serializable, FormGenerator{ + + public id: string; + public title: string; + public value: string; + public defaultValue: DefaultValue; + public description: string; + public extendedDescription: string; + public viewStyle: any; + public defaultVisibility: boolean; + public page: number; + public multiplicity: Multiplicity; + public multiplicityItems: Array = new Array(); + public data: any; + public validations: Array;//Array + public validationRequired = false; + + fromJSONObject(item: any): Field { + this.id = item.id; + this.title = item.title; + //this.value = item.value; + this.description = item.description; + this.extendedDescription = item.extendedDescription; + this.viewStyle = item.viewStyle; + this.defaultVisibility = item.defaultVisibility; + this.page = item.page; + this.validations = item.validations; + this.multiplicity = JsonSerializer.fromJSONObject(item.multiplicity, Multiplicity); + this.defaultValue = JsonSerializer.fromJSONObject(item.defaultValue, DefaultValue); + this.value = this.defaultValue.value && !item.value ? this.defaultValue.value : item.value; + //this.multiplicity = new Multiplicity(); + //this.multiplicity.max = 2; + if(item.multiplicityItems)this.multiplicityItems = JsonSerializer.fromJSONArray(item.multiplicityItems, Field); + this.data = item.data; + return this; + } + + + + + buildForm(): FormGroup { + if(this.validations) + this.validations.forEach(validation => { + if (validation == ValidationTypes.Required ) this.validationRequired = true; + }); + + let formGroup = this.formBuilder.group({ + id: [this.id], + data:[this.data], + /* title: [this.title], */ + value: [this.value, this.validationRequired == true? Validators.required:null]/* , + description: [this.description], + extendedDescription:[this.extendedDescription], + viewStyle: [this.viewStyle], + defaultVisibility:[this.defaultVisibility], + page:[this.page], + data:[this.data] */ + }); + + let multiplicityItemsFormArray = new Array(); + this.multiplicityItems.forEach(item => { + let form: FormGroup = item.buildForm(); + multiplicityItemsFormArray.push(form) + }) + formGroup.addControl('multiplicityItems', this.formBuilder.array(multiplicityItemsFormArray)); + + return formGroup; + } + + cloneForMultiplicity(index: number, idPath: string): Field { + let newItem: Field = new Field(); + + newItem.id = idPath ? idPath + index : 'multiple_' + this.id + '_' + index; + newItem.title = this.title; + newItem.description = this.description; + newItem.extendedDescription = this.extendedDescription; + newItem.viewStyle = this.viewStyle; + newItem.defaultVisibility = this.defaultVisibility; + newItem.page = this.page; + newItem.multiplicity = null; + newItem.data = this.data; + + return newItem; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/FieldGroup.ts b/dmp-frontend/src/app/models/FieldGroup.ts new file mode 100644 index 000000000..20eed5f8e --- /dev/null +++ b/dmp-frontend/src/app/models/FieldGroup.ts @@ -0,0 +1,55 @@ +import { CompositeField } from './CompositeField'; +import { BaseModel } from './BaseModel'; +import { FormGroup } from '@angular/forms'; +import { FormGenerator } from './interfaces/FormGenerator'; +import { Validation } from './Validation'; +import { Rule } from './Rule'; +import { JsonSerializer } from '../utilities/JsonSerializer'; +import { Serializable } from './interfaces/Serializable'; +import { Field } from './Field'; + +export class FieldGroup extends BaseModel implements Serializable, FormGenerator{ + public id: string; + public title: string; + public section: string; + public value: string; + public description: string; + public extendedDescription: string; + public defaultVisibility: boolean; + public page: number; + public compositeFields: Array = new Array(); + + fromJSONObject(item: any): FieldGroup { + this.id = item.id; + this.title = item.title; + this.value = item.value; + this.description = item.description; + this.extendedDescription = item.extendedDescription; + this.defaultVisibility = item.defaultVisibility; + this.page = item.page; + this.compositeFields = JsonSerializer.fromJSONArray(item.compositeFields, CompositeField); + return this; + } + + buildForm(): FormGroup { + let formGroup: FormGroup = this.formBuilder.group({ + /* id: [this.id], + title: [this.title], + value: [this.value], + description: [this.description], + extendedDescription: [this.extendedDescription], + defaultVisibility: [this.defaultVisibility], + page: [this.page] */ + }); + let compositeFieldsFormArray = new Array(); + if (this.compositeFields) { + this.compositeFields.forEach(item => { + let form: FormGroup = item.buildForm(); + compositeFieldsFormArray.push(form) + }) + } + formGroup.addControl('compositeFields', this.formBuilder.array(compositeFieldsFormArray)); + + return formGroup; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/Multiplicity.ts b/dmp-frontend/src/app/models/Multiplicity.ts new file mode 100644 index 000000000..268de5fea --- /dev/null +++ b/dmp-frontend/src/app/models/Multiplicity.ts @@ -0,0 +1,23 @@ +import { BaseModel } from './BaseModel'; +import { FormGroup } from '@angular/forms'; +import { FormGenerator } from './interfaces/FormGenerator'; +import { Serializable } from './interfaces/Serializable'; +export class Multiplicity extends BaseModel implements Serializable, FormGenerator{ + public min: number; + public max: number; + + fromJSONObject(item: any): Multiplicity { + this.min = item.min; + this.max = item.max; + return this; + } + + buildForm(): FormGroup { + let formGroup = this.formBuilder.group({ + min: [this.min], + max: [this.max] + + }); + return formGroup; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/Rule.ts b/dmp-frontend/src/app/models/Rule.ts new file mode 100644 index 000000000..e626ba6d3 --- /dev/null +++ b/dmp-frontend/src/app/models/Rule.ts @@ -0,0 +1,18 @@ +import { BaseModel } from './BaseModel'; +import { FormGroup } from '@angular/forms'; +import { FormGenerator } from './interfaces/FormGenerator'; +import { Serializable } from './interfaces/Serializable'; +export class Rule extends BaseModel implements Serializable{ + public sourceField:string; + public targetField:string; + public requiredValue; + public type: string; + + fromJSONObject(item:any):Rule{ + this.sourceField = item.sourceField; + this.targetField = item.targetField; + this.requiredValue = item.requiredValue; + this.type = item.type; + return this; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/Section.ts b/dmp-frontend/src/app/models/Section.ts new file mode 100644 index 000000000..14fdba3af --- /dev/null +++ b/dmp-frontend/src/app/models/Section.ts @@ -0,0 +1,64 @@ +import { BaseModel } from './BaseModel'; +import { FormGenerator } from './interfaces/FormGenerator'; +import { FormBuilder, FormControl, FormGroup } from '@angular/forms'; +import { JsonSerializer } from '../utilities/JsonSerializer'; +import { Serializable } from './interfaces/Serializable'; +import { FieldGroup } from './FieldGroup'; +import { CompositeField } from './CompositeField'; + +export class Section extends BaseModel implements Serializable
, FormGenerator{ + public sections: Array
= new Array
(); + //public fieldGroups: Array; + public defaultVisibility: boolean; + public page: number; + public id: string + public title: string + public description: string; + public compositeFields: Array = new Array(); + + fromJSONObject(item: any): Section { + this.sections = JsonSerializer.fromJSONArray(item.sections, Section); + //this.fieldGroups = new JsonSerializer().fromJSONArray(item.fieldGroups, FieldGroup); + this.page = item.page; + this.defaultVisibility = item.defaultVisibility; + this.id = item.id; + this.title = item.title; + this.description = item.description; + this.compositeFields = JsonSerializer.fromJSONArray(item.fieldSets, CompositeField); + return this; + } + + buildForm(): FormGroup { + let formGroup: FormGroup = new FormBuilder().group({}); + let sectionsFormArray = new Array(); + if (this.sections) { + this.sections.forEach(item => { + let form: FormGroup = item.buildForm(); + sectionsFormArray.push(form) + }) + } + let fieldGroupsFormArray = new Array(); + // if (this.fieldGroups) { + // this.fieldGroups.forEach(item => { + // let form: FormGroup = item.buildForm(); + // fieldGroupsFormArray.push(form) + // }) + // } + let compositeFieldsFormArray = new Array(); + if (this.compositeFields) { + this.compositeFields.forEach(item => { + let form: FormGroup = item.buildForm(); + compositeFieldsFormArray.push(form) + }) + } + formGroup.addControl('compositeFields', this.formBuilder.array(compositeFieldsFormArray)); + formGroup.addControl('sections', this.formBuilder.array(sectionsFormArray)); + // formGroup.addControl('fieldGroups', this.formBuilder.array(fieldGroupsFormArray)); + /* formGroup.addControl('defaultVisibility', new FormControl(this.defaultVisibility)) + formGroup.addControl('page', new FormControl(this.page)) + formGroup.addControl('id', new FormControl(this.id)) + formGroup.addControl('title', new FormControl(this.title)) + formGroup.addControl('description', new FormControl(this.description)) */ + return formGroup; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/Serializable.ts b/dmp-frontend/src/app/models/Serializable.ts new file mode 100644 index 000000000..9798b8902 --- /dev/null +++ b/dmp-frontend/src/app/models/Serializable.ts @@ -0,0 +1,3 @@ +export interface Serializable { + fromJSONObject(item: Object): T; +} diff --git a/dmp-frontend/src/app/models/Status.ts b/dmp-frontend/src/app/models/Status.ts new file mode 100644 index 000000000..888f52a39 --- /dev/null +++ b/dmp-frontend/src/app/models/Status.ts @@ -0,0 +1,4 @@ +export enum Status { + Active = 0, + Inactive = 1 +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/Validation.ts b/dmp-frontend/src/app/models/Validation.ts new file mode 100644 index 000000000..fc0ec9367 --- /dev/null +++ b/dmp-frontend/src/app/models/Validation.ts @@ -0,0 +1,21 @@ +import { BaseModel } from './BaseModel'; +import { FormGroup } from '@angular/forms'; +import { FormGenerator } from './interfaces/FormGenerator'; +import { Serializable } from './interfaces/Serializable'; +export class Validation extends BaseModel implements Serializable,FormGenerator{ + public type:string; + public value:string; + + fromJSONObject(item:any):Validation{ + this.type = item.type; + this.value = item.value; + return this; + } + + buildForm():FormGroup{ + return this.formBuilder.group({ + type: [this.type], + value: [this.value], + }); + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/common/ValidationTypes.ts b/dmp-frontend/src/app/models/common/ValidationTypes.ts new file mode 100644 index 000000000..49f99ca51 --- /dev/null +++ b/dmp-frontend/src/app/models/common/ValidationTypes.ts @@ -0,0 +1,4 @@ +export enum ValidationTypes { + None = 0, + Required = 1 + } \ No newline at end of file diff --git a/dmp-frontend/src/app/models/criteria/BaseCriteria.ts b/dmp-frontend/src/app/models/criteria/BaseCriteria.ts new file mode 100644 index 000000000..446922e5c --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/BaseCriteria.ts @@ -0,0 +1,6 @@ +import { FormGenerator } from "../../utilities/forms/FormGenerator"; +import { BaseCriteriaErrorModel } from "./BaseCriteriaErrorModel"; + +export class BaseCriteria { + public like: string; +} diff --git a/dmp-frontend/src/app/models/criteria/BaseCriteriaErrorModel.ts b/dmp-frontend/src/app/models/criteria/BaseCriteriaErrorModel.ts new file mode 100644 index 000000000..b19407afe --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/BaseCriteriaErrorModel.ts @@ -0,0 +1,3 @@ +export class BaseCriteriaErrorModel { + public like: String; +} diff --git a/dmp-frontend/src/app/models/criteria/RequestItem.ts b/dmp-frontend/src/app/models/criteria/RequestItem.ts new file mode 100644 index 000000000..976e7af91 --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/RequestItem.ts @@ -0,0 +1,6 @@ +import { FormGenerator } from "../../utilities/forms/FormGenerator"; +import { BaseCriteriaErrorModel } from "./BaseCriteriaErrorModel"; + +export class RequestItem { + public criteria: T; +} diff --git a/dmp-frontend/src/app/models/criteria/data-management-plan/DataManagementPlanCriteria.ts b/dmp-frontend/src/app/models/criteria/data-management-plan/DataManagementPlanCriteria.ts new file mode 100644 index 000000000..674a51492 --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/data-management-plan/DataManagementPlanCriteria.ts @@ -0,0 +1,6 @@ +import { BaseCriteria } from "../BaseCriteria"; +import { ProjectModel } from "../../projects/ProjectModel"; + +export class DataManagementPlanCriteria extends BaseCriteria { + public projects: ProjectModel[] = []; +} diff --git a/dmp-frontend/src/app/models/criteria/data-management-plan/DataManagementPlanCriteriaErrorModel.ts b/dmp-frontend/src/app/models/criteria/data-management-plan/DataManagementPlanCriteriaErrorModel.ts new file mode 100644 index 000000000..a3a9abfec --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/data-management-plan/DataManagementPlanCriteriaErrorModel.ts @@ -0,0 +1,5 @@ +import { BaseCriteriaErrorModel } from "../BaseCriteriaErrorModel"; + +export class DataManagementPlanCriteriaErrorModel extends BaseCriteriaErrorModel{ + +} diff --git a/dmp-frontend/src/app/models/criteria/dataset-profile/DatasetProfileCriteria.ts b/dmp-frontend/src/app/models/criteria/dataset-profile/DatasetProfileCriteria.ts new file mode 100644 index 000000000..84dcd95d9 --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/dataset-profile/DatasetProfileCriteria.ts @@ -0,0 +1,4 @@ +import { BaseCriteria } from '../BaseCriteria'; +export class DatasetProfileCriteria extends BaseCriteria { + public id: String; +} diff --git a/dmp-frontend/src/app/models/criteria/dataset/DatasetCriteria.ts b/dmp-frontend/src/app/models/criteria/dataset/DatasetCriteria.ts new file mode 100644 index 000000000..a74ddc498 --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/dataset/DatasetCriteria.ts @@ -0,0 +1,6 @@ +import { BaseCriteria } from "../BaseCriteria"; + +export class DatasetCriteria extends BaseCriteria { + public status: Number; + public dmpIds: String[] = []; +} diff --git a/dmp-frontend/src/app/models/criteria/dataset/DatasetCriteriaErrorModel.ts b/dmp-frontend/src/app/models/criteria/dataset/DatasetCriteriaErrorModel.ts new file mode 100644 index 000000000..4c8c081a5 --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/dataset/DatasetCriteriaErrorModel.ts @@ -0,0 +1,5 @@ +import { BaseCriteriaErrorModel } from "../BaseCriteriaErrorModel"; + +export class DatasetCriteriaErrorModel extends BaseCriteriaErrorModel{ + public status: Number; +} diff --git a/dmp-frontend/src/app/models/criteria/dataset/DatasetProfileCriteria.ts b/dmp-frontend/src/app/models/criteria/dataset/DatasetProfileCriteria.ts new file mode 100644 index 000000000..e5c93a99b --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/dataset/DatasetProfileCriteria.ts @@ -0,0 +1,5 @@ +import { BaseCriteria } from "../BaseCriteria"; + +export class DatasetProfileCriteria extends BaseCriteria { + +} diff --git a/dmp-frontend/src/app/models/criteria/external-dataset/ExetrnalDatasetCriteriaErrorModel.ts b/dmp-frontend/src/app/models/criteria/external-dataset/ExetrnalDatasetCriteriaErrorModel.ts new file mode 100644 index 000000000..24ae980a2 --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/external-dataset/ExetrnalDatasetCriteriaErrorModel.ts @@ -0,0 +1,4 @@ +import { BaseCriteriaErrorModel } from '../BaseCriteriaErrorModel'; +export class ExternalDatasetCriteriaErrorModel extends BaseCriteriaErrorModel { + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/criteria/external-dataset/ExternalDatasetCriteria.ts b/dmp-frontend/src/app/models/criteria/external-dataset/ExternalDatasetCriteria.ts new file mode 100644 index 000000000..6682f7702 --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/external-dataset/ExternalDatasetCriteria.ts @@ -0,0 +1,4 @@ +import { BaseCriteria } from '../BaseCriteria'; +export class ExternalDatasetCriteria extends BaseCriteria{ + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/criteria/invitation/UserInvitationCriteria.ts b/dmp-frontend/src/app/models/criteria/invitation/UserInvitationCriteria.ts new file mode 100644 index 000000000..077ea7f43 --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/invitation/UserInvitationCriteria.ts @@ -0,0 +1,4 @@ +import { BaseCriteria } from '../BaseCriteria'; +export class UserInvitationCriteria extends BaseCriteria{ + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/criteria/project/ProjectCriteria.ts b/dmp-frontend/src/app/models/criteria/project/ProjectCriteria.ts new file mode 100644 index 000000000..4ae9e5616 --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/project/ProjectCriteria.ts @@ -0,0 +1,6 @@ +import { BaseCriteria } from "../BaseCriteria"; + +export class ProjectCriteria extends BaseCriteria { + public periodStart: Date; + public periodEnd: Date; +} diff --git a/dmp-frontend/src/app/models/criteria/project/ProjectCriteriaErrorModel.ts b/dmp-frontend/src/app/models/criteria/project/ProjectCriteriaErrorModel.ts new file mode 100644 index 000000000..1838fd648 --- /dev/null +++ b/dmp-frontend/src/app/models/criteria/project/ProjectCriteriaErrorModel.ts @@ -0,0 +1,6 @@ +import { BaseCriteriaErrorModel } from "../BaseCriteriaErrorModel"; + +export class ProjectCriteriaErrorModel extends BaseCriteriaErrorModel{ + public PeriodStart: String; + public PeriodEnd: String; +} diff --git a/dmp-frontend/src/app/models/dashboard/DashboardStatisticsModel.ts b/dmp-frontend/src/app/models/dashboard/DashboardStatisticsModel.ts new file mode 100644 index 000000000..2af2dd294 --- /dev/null +++ b/dmp-frontend/src/app/models/dashboard/DashboardStatisticsModel.ts @@ -0,0 +1,15 @@ +import { Serializable } from "../Serializable"; + +export class DashboardStatisticsModel implements Serializable{ + public totalDataManagementPlanCount: number; + public totalProjectCount: number; + public totalDataSetCount: number; + + fromJSONObject(item: any): DashboardStatisticsModel { + this.totalDataManagementPlanCount = item.totalDataManagementPlanCount; + this.totalProjectCount = item.totalProjectCount; + this.totalDataSetCount = item.totalDataSetCount; + return this; + } + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/data-managemnt-plans/DataManagementPlanListingModel.ts b/dmp-frontend/src/app/models/data-managemnt-plans/DataManagementPlanListingModel.ts new file mode 100644 index 000000000..8930e9e09 --- /dev/null +++ b/dmp-frontend/src/app/models/data-managemnt-plans/DataManagementPlanListingModel.ts @@ -0,0 +1,23 @@ +import { Serializable } from "../Serializable"; + +export class DataManagementPlanListingModel implements Serializable { + public id: String; + public label: String; + public project: String; + public profile: String; + public researchers: String; + public organisations: String; + public version: number; + + fromJSONObject(item: any): DataManagementPlanListingModel { + this.id = item.id; + this.label = item.label; + this.project = item.project; + this.profile = item.profile; + this.researchers = item.researchers; + this.organisations = item.organisations; + this.version = item.version; + + return this; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/data-managemnt-plans/DataManagementPlanModel.ts b/dmp-frontend/src/app/models/data-managemnt-plans/DataManagementPlanModel.ts new file mode 100644 index 000000000..7ce3d5ea3 --- /dev/null +++ b/dmp-frontend/src/app/models/data-managemnt-plans/DataManagementPlanModel.ts @@ -0,0 +1,77 @@ +import { Serializable } from "../Serializable"; +import { ValidationContext } from "../../utilities/validators/ValidationContext"; +import { FormGroup, FormBuilder, FormControl, Validators } from "@angular/forms"; +import { BackendErrorValidator } from "../../utilities/validators/BackendErrorValidator"; +import { BaseErrorModel } from "../error/BaseErrorModel"; +import { ExternalSourcesItemModel } from "../external-sources/ExternalSourcesItemModel"; +import { ProjectModel } from "../projects/ProjectModel"; +import { OrganisationModel } from "../organisation/OrganisationModel"; +import { ResearcherModel } from "../researcher/ResearcherModel"; +import { JsonSerializer } from "../../utilities/JsonSerializer"; +import { ProfileModel } from "../profile/ProfileModel"; +import { Status } from "../Status"; + +export class DataManagementPlanModel implements Serializable { + public id: String; + public label: String; + public previous: String; + public version: number; + public status: Status = Status.Active; + public description: String; + public project: ProjectModel; + public organisations: OrganisationModel[] = []; + public researchers: ResearcherModel[] = []; + public profiles: ProfileModel[] = []; + + public errorModel: BaseErrorModel = new BaseErrorModel(); + + fromJSONObject(item: any): DataManagementPlanModel { + this.id = item.id; + this.label = item.label; + this.previous = item.previous; + this.version = item.version; + this.status = item.status; + this.description = item.description; + this.project = JsonSerializer.fromJSONObject(item.project, ProjectModel); + this.organisations = JsonSerializer.fromJSONArray(item.organisations, OrganisationModel); + this.researchers = JsonSerializer.fromJSONArray(item.researchers, ResearcherModel); + this.profiles = JsonSerializer.fromJSONArray(item.profiles, ProfileModel); + + return this; + } + + buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { + if (context == null) { context = this.createValidationContext(); } + + const formGroup = new FormBuilder().group({ + id: [{ value: this.id, disabled: disabled }, context.getValidation('id').validators], + label: [{ value: this.label, disabled: disabled }, context.getValidation('label').validators], + previous: [{ value: this.previous, disabled: disabled }, context.getValidation('previous').validators], + version: [{ value: this.version, disabled: disabled }, context.getValidation('version').validators], + status: [{ value: this.status, disabled: disabled }, context.getValidation('status').validators], + description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators], + project: [{ value: this.project, disabled: disabled }, context.getValidation('project').validators], + organisations: [{ value: this.organisations, disabled: disabled }, context.getValidation('organisations').validators], + researchers: [{ value: this.researchers, disabled: disabled }, context.getValidation('researchers').validators], + profiles: [{ value: this.profiles, disabled: disabled }, context.getValidation('profiles').validators] + }); + + return formGroup; + } + + createValidationContext(): ValidationContext { + const baseContext: ValidationContext = new ValidationContext(); + baseContext.validation.push({ key: 'id', validators: [ BackendErrorValidator(this.errorModel, 'id')] }); + baseContext.validation.push({ key: 'label', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'label')] }); + baseContext.validation.push({ key: 'previous', validators: [BackendErrorValidator(this.errorModel, 'previous')] }); + baseContext.validation.push({ key: 'version', validators: [BackendErrorValidator(this.errorModel, 'version')] }); + baseContext.validation.push({ key: 'status', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'status')] }); + baseContext.validation.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'description')] }); + baseContext.validation.push({ key: 'project', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'project')] }); + baseContext.validation.push({ key: 'organisations', validators: [BackendErrorValidator(this.errorModel, 'organisations')] }); + baseContext.validation.push({ key: 'researchers', validators: [BackendErrorValidator(this.errorModel, 'researchers')] }); + baseContext.validation.push({ key: 'profiles', validators: [BackendErrorValidator(this.errorModel, 'profiles')] }); + + return baseContext; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/data-table/DataTableData.ts b/dmp-frontend/src/app/models/data-table/DataTableData.ts new file mode 100644 index 000000000..f5a1e78d8 --- /dev/null +++ b/dmp-frontend/src/app/models/data-table/DataTableData.ts @@ -0,0 +1,4 @@ +export class DataTableData { + data = new Array(); + totalCount = 0; +} diff --git a/dmp-frontend/src/app/models/data-table/DataTableRequest.ts b/dmp-frontend/src/app/models/data-table/DataTableRequest.ts new file mode 100644 index 000000000..b85da378f --- /dev/null +++ b/dmp-frontend/src/app/models/data-table/DataTableRequest.ts @@ -0,0 +1,13 @@ +import { BaseCriteria } from "../criteria/BaseCriteria"; +import { RequestItem } from "../criteria/RequestItem"; + +export class DataTableRequest extends RequestItem { + offset = 0; + length = 0; + + constructor(offset: number, length: number) { + super(); + this.length = length; + this.offset = offset; + } +} diff --git a/dmp-frontend/src/app/models/dataRepositories/DataRepositoryModel.ts b/dmp-frontend/src/app/models/dataRepositories/DataRepositoryModel.ts new file mode 100644 index 000000000..13d429099 --- /dev/null +++ b/dmp-frontend/src/app/models/dataRepositories/DataRepositoryModel.ts @@ -0,0 +1,17 @@ +import { Serializable } from "../Serializable"; + +export class DataRepositoryModel implements Serializable { + public id: String; + public name: String; + public pid: String; + public uri: String; + + fromJSONObject(item: any): DataRepositoryModel { + this.id = item.id; + this.name = item.name; + this.pid = item.pid; + this.uri = item.uri; + + return this; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/dataset-wizard/DatasetWizardModel.ts b/dmp-frontend/src/app/models/dataset-wizard/DatasetWizardModel.ts new file mode 100644 index 000000000..51f73d11a --- /dev/null +++ b/dmp-frontend/src/app/models/dataset-wizard/DatasetWizardModel.ts @@ -0,0 +1,60 @@ + + +// export class DatasetWizardModel implements Serializable { +// public id: String; +// public label: String; +// public previous: String; +// public version: number; +// public status: String; +// public description: String; +// public project: ProjectModel; +// public organisations: OrganisationModel[] = []; +// public researchers: ResearcherModel[] = []; + +// public errorModel: BaseErrorModel = new BaseErrorModel(); + +// fromJSONObject(item: any): DataManagementPlanModel { +// this.id = item.id; +// this.label = item.label; +// this.previous = item.previous; +// this.version = item.version; +// this.status = item.status; +// this.description = item.description; +// this.project = new JsonSerializer().fromJSONObject(item.project, ProjectModel); +// this.organisations = new JsonSerializer().fromJSONArray(item.organisations, OrganisationModel); +// this.researchers = new JsonSerializer().fromJSONArray(item.researchers, ResearcherModel); + +// return this; +// } + +// buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { +// if (context == null) { context = this.createValidationContext(); } + +// const formGroup = new FormBuilder().group({ +// label: [{ value: this.label, disabled: disabled }, context.getValidation('label').validators], +// previous: [{ value: this.previous, disabled: disabled }, context.getValidation('previous').validators], +// version: [{ value: this.version, disabled: disabled }, context.getValidation('version').validators], +// status: [{ value: this.status, disabled: disabled }, context.getValidation('status').validators], +// description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators], +// project: [{ value: this.project, disabled: disabled }, context.getValidation('project').validators], +// organisations: [{ value: this.organisations, disabled: disabled }, context.getValidation('description').validators], +// researchers: [{ value: this.researchers, disabled: disabled }, context.getValidation('researchers').validators], +// }); + +// return formGroup; +// } + +// createValidationContext(): ValidationContext { +// const baseContext: ValidationContext = new ValidationContext(); +// baseContext.validation.push({ key: 'label', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'label')] }); +// baseContext.validation.push({ key: 'previous', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'previous')] }); +// baseContext.validation.push({ key: 'version', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'version')] }); +// baseContext.validation.push({ key: 'status', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'status')] }); +// baseContext.validation.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'description')] }); +// baseContext.validation.push({ key: 'project', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'project')] }); +// baseContext.validation.push({ key: 'organisations', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'organisations')] }); +// baseContext.validation.push({ key: 'researchers', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'researchers')] }); + +// return baseContext; +// } +// } \ No newline at end of file diff --git a/dmp-frontend/src/app/models/datasetprofile/DatasetProfileModel.ts b/dmp-frontend/src/app/models/datasetprofile/DatasetProfileModel.ts new file mode 100644 index 000000000..538aed2b8 --- /dev/null +++ b/dmp-frontend/src/app/models/datasetprofile/DatasetProfileModel.ts @@ -0,0 +1,33 @@ +import { BaseErrorModel } from '../error/BaseErrorModel'; +import { BackendErrorValidator } from '../../utilities/validators/BackendErrorValidator'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { ValidationContext } from '../../utilities/validators/ValidationContext'; +import { Serializable } from "../Serializable"; + +export class DatasetProfileModel implements Serializable { + public id: String; + public label: String; + public errorModel: BaseErrorModel = new BaseErrorModel(); + + fromJSONObject(item: any): DatasetProfileModel { + this.id = item.id; + this.label = item.label; + return this; + } + + buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { + if (context == null) { context = this.createValidationContext(); } + + const formGroup = new FormBuilder().group({ + id: [{ value: this.id, disabled: disabled }, context.getValidation('id').validators] + }); + + return formGroup; + } + + createValidationContext(): ValidationContext { + const baseContext: ValidationContext = new ValidationContext(); + baseContext.validation.push({ key: 'id', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'id')] }); + return baseContext; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/datasets/DatasetListingModel.ts b/dmp-frontend/src/app/models/datasets/DatasetListingModel.ts new file mode 100644 index 000000000..376e7f918 --- /dev/null +++ b/dmp-frontend/src/app/models/datasets/DatasetListingModel.ts @@ -0,0 +1,33 @@ +import { Serializable } from "../Serializable"; + +export class DatasetListingModel implements Serializable { + public id: String; + public label:String; + public dmp: String; + public profile: String; + public dataRepositories: String; + public registries: String; + public services: String; + public description: String; + public status: Number; + public created: Date; + //public uri: String; + // public reference: String; + + fromJSONObject(item: any): DatasetListingModel { + this.id = item.id; + this.label = item.label; + this.dmp = item.dmp; + this.profile = item.profile; + this.dataRepositories = item.dataRepositories; + this.registries = item.registries; + this.services = item.services; + //this.reference = item.reference; + //this.uri = item.uri; + this.status = item.status; + this.description = item.description; + this.created = item.created; + + return this; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/datasets/DatasetModel.ts b/dmp-frontend/src/app/models/datasets/DatasetModel.ts new file mode 100644 index 000000000..002673c32 --- /dev/null +++ b/dmp-frontend/src/app/models/datasets/DatasetModel.ts @@ -0,0 +1,69 @@ +import { Serializable } from "../Serializable"; +import { ValidationContext } from "../../utilities/validators/ValidationContext"; +import { FormGroup, FormBuilder, FormControl, Validators } from "@angular/forms"; +import { BackendErrorValidator } from "../../utilities/validators/BackendErrorValidator"; +import { BaseErrorModel } from "../error/BaseErrorModel"; +import { ExternalSourcesItemModel } from "../external-sources/ExternalSourcesItemModel"; +import { ServiceModel } from "../services/ServiceModel"; +import { JsonSerializer } from "../../utilities/JsonSerializer"; +import { RegisterModel } from "../registers/RegisterModel"; +import { DataRepositoryModel } from "../dataRepositories/DataRepositoryModel"; + +export class DatasetModel implements Serializable { + public id: String; + public label: String; + public profile: String; + public uri: String; + public status: String; + public description: String; + public services: ServiceModel[] = []; + public registries: RegisterModel[] = []; + public dataRepositories: DataRepositoryModel[] = []; + + public errorModel: BaseErrorModel = new BaseErrorModel(); + + fromJSONObject(item: any): DatasetModel { + this.id = item.id; + this.label = item.label; + this.profile = item.profile; + this.uri = item.uri; + this.status = item.status; + this.description = item.description; + this.services = JsonSerializer.fromJSONArray(item.services, ServiceModel); + this.registries = JsonSerializer.fromJSONArray(item.registries, RegisterModel); + this.dataRepositories = JsonSerializer.fromJSONArray(item.dataRepositories, DataRepositoryModel); + + return this; + } + + buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { + if (context == null) { context = this.createValidationContext(); } + + const formGroup = new FormBuilder().group({ + label: [{ value: this.label, disabled: disabled }, context.getValidation('label').validators], + profile: [{ value: this.profile, disabled: disabled }, context.getValidation('profile').validators], + uri: [{ value: this.uri, disabled: disabled }, context.getValidation('uri').validators], + status: [{ value: this.status, disabled: disabled }, context.getValidation('status').validators], + description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators], + services: [{ value: this.services, disabled: disabled }, context.getValidation('services').validators], + registries: [{ value: this.registries, disabled: disabled }, context.getValidation('registries').validators], + dataRepositories: [{ value: this.dataRepositories, disabled: disabled }, context.getValidation('dataRepositories').validators] + }); + + return formGroup; + } + + createValidationContext(): ValidationContext { + const baseContext: ValidationContext = new ValidationContext(); + baseContext.validation.push({ key: 'label', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'label')] }); + baseContext.validation.push({ key: 'profile', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'profile')] }); + baseContext.validation.push({ key: 'uri', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'uri')] }); + baseContext.validation.push({ key: 'status', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'status')] }); + baseContext.validation.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'description')] }); + baseContext.validation.push({ key: 'services', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'services')] }); + baseContext.validation.push({ key: 'registries', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'registries')] }); + baseContext.validation.push({ key: 'dataRepositories', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'dataRepositories')] }); + + return baseContext; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/datasets/DatasetProfileModel.ts b/dmp-frontend/src/app/models/datasets/DatasetProfileModel.ts new file mode 100644 index 000000000..3f67e43d1 --- /dev/null +++ b/dmp-frontend/src/app/models/datasets/DatasetProfileModel.ts @@ -0,0 +1,13 @@ +import { Serializable } from "../Serializable"; + +export class DatasetProfileModel { + public id : String; + public label: String; + + // fromJSONObject(item:any): DatasetProfileModel{ + // this.id = item.id; + // this.label = item.label; + + // return this; + // } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts b/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts new file mode 100644 index 000000000..8e4243512 --- /dev/null +++ b/dmp-frontend/src/app/models/datasets/DatasetWizardModel.ts @@ -0,0 +1,80 @@ +import { DatasetProfileDefinitionModel } from '../DatasetProfileDefinitionModel'; +import { DatasetProfileModel } from '../datasetprofile/DatasetProfileModel'; +import { DataManagementPlanModel } from '../data-managemnt-plans/DataManagementPlanModel'; +import { Serializable } from "../Serializable"; +import { ValidationContext } from "../../utilities/validators/ValidationContext"; +import { FormGroup, FormBuilder, FormControl, Validators } from "@angular/forms"; +import { BackendErrorValidator } from "../../utilities/validators/BackendErrorValidator"; +import { BaseErrorModel } from "../error/BaseErrorModel"; +import { ExternalSourcesItemModel } from "../external-sources/ExternalSourcesItemModel"; +import { ServiceModel } from "../services/ServiceModel"; +import { JsonSerializer } from "../../utilities/JsonSerializer"; +import { RegisterModel } from "../registers/RegisterModel"; +import { DataRepositoryModel } from "../dataRepositories/DataRepositoryModel"; +import { ExternalDatasetModel } from '@app/models/external-dataset/ExternalDatasetModel'; + +export class DatasetWizardModel implements Serializable { + public id: String; + public label: String; + public profile: DatasetProfileModel = new DatasetProfileModel; + public uri: String; + public status: String; + public description: String; + public services: ServiceModel[] = []; + public registries: RegisterModel[] = []; + public dataRepositories: DataRepositoryModel[] = []; + public externalDatasets: ExternalDatasetModel[] = []; + public dmp: DataManagementPlanModel = new DataManagementPlanModel(); + public datasetProfileDefinition = new DatasetProfileDefinitionModel(); + public errorModel: BaseErrorModel = new BaseErrorModel(); + + fromJSONObject(item: any): DatasetWizardModel { + this.id = item.id; + this.label = item.label; + this.profile = item.profile; + this.uri = item.uri; + this.status = item.status; + this.description = item.description; + this.services = JsonSerializer.fromJSONArray(item.services, ServiceModel); + this.registries = JsonSerializer.fromJSONArray(item.registries, RegisterModel); + this.dataRepositories = JsonSerializer.fromJSONArray(item.dataRepositories, DataRepositoryModel); + this.dmp = JsonSerializer.fromJSONObject(item.dmp, DataManagementPlanModel); + this.profile = JsonSerializer.fromJSONObject(item.profile, DatasetWizardModel); + this.datasetProfileDefinition = JsonSerializer.fromJSONObject(item.datasetProfileDefinition, DatasetProfileDefinitionModel); + return this; + } + + buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { + if (context == null) { context = this.createValidationContext(); } + + const formGroup = new FormBuilder().group({ + label: [{ value: this.label, disabled: disabled }, context.getValidation('label').validators], + uri: [{ value: this.uri, disabled: disabled }, context.getValidation('uri').validators], + status: [{ value: this.status, disabled: disabled }, context.getValidation('status').validators], + description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators], + services: [{ value: this.services, disabled: disabled }, context.getValidation('services').validators], + registries: [{ value: this.registries, disabled: disabled }, context.getValidation('registries').validators], + dataRepositories: [{ value: this.dataRepositories, disabled: disabled }, context.getValidation('dataRepositories').validators], + externalDatasets: [{ value: this.externalDatasets, disabled: disabled }, context.getValidation('externalDatasets').validators], + dmp: [{ value: this.dmp, disabled: disabled }, context.getValidation('dmp').validators], + profile: [{ value: this.profile, disabled: disabled }, context.getValidation('profile').validators], + + }); + return formGroup; + } + + createValidationContext(): ValidationContext { + const baseContext: ValidationContext = new ValidationContext(); + baseContext.validation.push({ key: 'label', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'label')] }); + baseContext.validation.push({ key: 'profile', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'profile')] }); + baseContext.validation.push({ key: 'uri', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'uri')] }); + baseContext.validation.push({ key: 'status', validators: [BackendErrorValidator(this.errorModel, 'status')] }); + baseContext.validation.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'description')] }); + baseContext.validation.push({ key: 'services', validators: [BackendErrorValidator(this.errorModel, 'services')] }); + baseContext.validation.push({ key: 'registries', validators: [BackendErrorValidator(this.errorModel, 'registries')] }); + baseContext.validation.push({ key: 'dataRepositories', validators: [BackendErrorValidator(this.errorModel, 'dataRepositories')] }); + baseContext.validation.push({ key: 'externalDatasets', validators: [BackendErrorValidator(this.errorModel, 'externalDatasets')] }); + baseContext.validation.push({ key: 'dmp', validators: [BackendErrorValidator(this.errorModel, 'dmp')] }); //TODO + return baseContext; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/error/BaseErrorModel.ts b/dmp-frontend/src/app/models/error/BaseErrorModel.ts new file mode 100644 index 000000000..c2bab43b0 --- /dev/null +++ b/dmp-frontend/src/app/models/error/BaseErrorModel.ts @@ -0,0 +1,3 @@ +export class BaseErrorModel { + +} diff --git a/dmp-frontend/src/app/models/external-dataset/ExternalDatasetModel.ts b/dmp-frontend/src/app/models/external-dataset/ExternalDatasetModel.ts new file mode 100644 index 000000000..d648bc8cb --- /dev/null +++ b/dmp-frontend/src/app/models/external-dataset/ExternalDatasetModel.ts @@ -0,0 +1,30 @@ +import { BaseErrorModel } from '../error/BaseErrorModel'; +import { Serializable } from "../Serializable"; +import { FormGenerator } from "../interfaces/FormGenerator"; +import { FormGroup, FormBuilder } from "@angular/forms"; + +export class ExternalDatasetModel implements Serializable, FormGenerator{ + + public abbreviation: String; + public id: String; + public label: String; + public reference: String; + public errorModel: BaseErrorModel; + fromJSONObject(item: any): ExternalDatasetModel { + this.abbreviation = item.abbreviation; + this.id = item.id; + this.label = item.label; + this.reference = item.reference; + + return this; + } + + buildForm(): FormGroup { + return new FormBuilder().group({ + id: [this.id], + abbreviation: [this.abbreviation], + label: [this.label], + reference: [this.reference] + }) + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/external-sources/ExternalSourcesItemModel.ts b/dmp-frontend/src/app/models/external-sources/ExternalSourcesItemModel.ts new file mode 100644 index 000000000..aec2fd4b4 --- /dev/null +++ b/dmp-frontend/src/app/models/external-sources/ExternalSourcesItemModel.ts @@ -0,0 +1,5 @@ +export interface ExternalSourcesItemModel { + id: String; + name: String; + description: String; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/http/BaseHttpResponseModel.ts b/dmp-frontend/src/app/models/http/BaseHttpResponseModel.ts new file mode 100644 index 000000000..8a95259f6 --- /dev/null +++ b/dmp-frontend/src/app/models/http/BaseHttpResponseModel.ts @@ -0,0 +1,5 @@ +export interface BaseHttpResponseModel { + statusCode: number; + message: String; + payload: T; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/interfaces/FormGenerator.ts b/dmp-frontend/src/app/models/interfaces/FormGenerator.ts new file mode 100644 index 000000000..05cc5c8ff --- /dev/null +++ b/dmp-frontend/src/app/models/interfaces/FormGenerator.ts @@ -0,0 +1,4 @@ +import { AbstractControl } from '@angular/forms'; +export interface FormGenerator{ + buildForm():T +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/interfaces/Serializable.ts b/dmp-frontend/src/app/models/interfaces/Serializable.ts new file mode 100644 index 000000000..26bc7c1bc --- /dev/null +++ b/dmp-frontend/src/app/models/interfaces/Serializable.ts @@ -0,0 +1,3 @@ +export interface Serializable { + fromJSONObject(item: Object): T; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/invitation/Invitation.ts b/dmp-frontend/src/app/models/invitation/Invitation.ts new file mode 100644 index 000000000..49bc99485 --- /dev/null +++ b/dmp-frontend/src/app/models/invitation/Invitation.ts @@ -0,0 +1,17 @@ +import { FormGenerator } from '../interfaces/FormGenerator'; +import { User } from './User'; +import { FormGroup, FormBuilder } from '@angular/forms'; +export class Invitation implements FormGenerator{ + + public dataManagementPlan: string; + public users = new Array(); + + buildForm(): FormGroup { + let formGroup = new FormBuilder().group({ + dataManagementPlan:[this.dataManagementPlan], + users:[this.users] + }) + + return formGroup; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/invitation/User.ts b/dmp-frontend/src/app/models/invitation/User.ts new file mode 100644 index 000000000..94818636d --- /dev/null +++ b/dmp-frontend/src/app/models/invitation/User.ts @@ -0,0 +1,25 @@ +import { FormGenerator } from '../interfaces/FormGenerator'; +import { Serializable } from '../interfaces/Serializable'; +import { FormGroup, FormBuilder } from '@angular/forms'; +export class User implements Serializable, FormGenerator{ + + public id: string; + public email:string; + public name:string; + + fromJSONObject(item: any): User { + this.id = item.id; + this.email = item.email; + this.name = item.name; + return this; + } + + buildForm(): FormGroup { + return new FormBuilder().group({ + id:[this.id], + email:[this.email], + name:[this.name] + }) + } + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/login/Credential.ts b/dmp-frontend/src/app/models/login/Credential.ts new file mode 100644 index 000000000..6af148802 --- /dev/null +++ b/dmp-frontend/src/app/models/login/Credential.ts @@ -0,0 +1,4 @@ +export class Credential { + public username: string; + public password: string; +} diff --git a/dmp-frontend/src/app/models/login/LoginInfo.ts b/dmp-frontend/src/app/models/login/LoginInfo.ts new file mode 100644 index 000000000..6e18cdf70 --- /dev/null +++ b/dmp-frontend/src/app/models/login/LoginInfo.ts @@ -0,0 +1,12 @@ +export enum LoginProviders { + Google = 1, + Facebook = 2, + Twitter = 3, + LinkedIn = 4 +} + +export class LoginInfo { + public ticket: string; + public provider: LoginProviders; + public data?: any; +} diff --git a/dmp-frontend/src/app/models/login/Principal.ts b/dmp-frontend/src/app/models/login/Principal.ts new file mode 100644 index 000000000..6d5049447 --- /dev/null +++ b/dmp-frontend/src/app/models/login/Principal.ts @@ -0,0 +1,26 @@ +import { Serializable } from '../Serializable'; + +export class Principal implements Serializable { + + id: number; + token: string; + name: string; + expiresAt: Date; + appRoles: Principal.AppRole[]; + + fromJSONObject(item: any): Principal { + this.id = item.id; + this.token = item.token; + this.name = item.name; + this.expiresAt = item.expiresAt; + this.appRoles = item.appRoles; + return this; + } +} + +export namespace Principal { + export enum AppRole { + Admin = 0, + User = 1 + } +} diff --git a/dmp-frontend/src/app/models/organisation/OrganisationModel.ts b/dmp-frontend/src/app/models/organisation/OrganisationModel.ts new file mode 100644 index 000000000..16bf9752a --- /dev/null +++ b/dmp-frontend/src/app/models/organisation/OrganisationModel.ts @@ -0,0 +1,18 @@ +import { Serializable } from "../Serializable"; + + +export class OrganisationModel implements Serializable { + public id: String; + public name: String; + public description: String; + public reference: String; + + fromJSONObject(item: any): OrganisationModel { + this.id = item.id; + this.name = item.name; + this.description = item.abbreviation; + this.reference = item.reference; + + return this; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/profile/ProfileModel.ts b/dmp-frontend/src/app/models/profile/ProfileModel.ts new file mode 100644 index 000000000..6447d18b3 --- /dev/null +++ b/dmp-frontend/src/app/models/profile/ProfileModel.ts @@ -0,0 +1,18 @@ +import { Serializable } from "../Serializable"; + + +export class ProfileModel implements Serializable { + public id: String; + public label: String; + public description: String; + public reference: String; + + fromJSONObject(item: any): ProfileModel { + this.id = item.id; + this.label = item.label; + this.description = item.abbreviation; + this.reference = item.reference; + + return this; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/projects/ProjectListingModel.ts b/dmp-frontend/src/app/models/projects/ProjectListingModel.ts new file mode 100644 index 000000000..003fc5461 --- /dev/null +++ b/dmp-frontend/src/app/models/projects/ProjectListingModel.ts @@ -0,0 +1,27 @@ +import { Serializable } from "../Serializable"; + +export class ProjectListingModel implements Serializable { + public id: String; + public label: String; + public abbreviation: String; + public reference: String; + public uri: String; + public status: String; + public startDate: Date; + public endDate: Date; + public description: String; + + fromJSONObject(item: any): ProjectListingModel { + this.id = item.id; + this.label = item.label; + this.abbreviation = item.abbreviation; + this.reference = item.reference; + this.uri = item.uri; + this.status = item.status; + this.startDate = new Date(item.startdate); + this.endDate = new Date(item.enddate); + this.description = item.description; + + return this; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/projects/ProjectModel.ts b/dmp-frontend/src/app/models/projects/ProjectModel.ts new file mode 100644 index 000000000..c2d45a98a --- /dev/null +++ b/dmp-frontend/src/app/models/projects/ProjectModel.ts @@ -0,0 +1,66 @@ +import { Serializable } from "../Serializable"; +import { ValidationContext } from "../../utilities/validators/ValidationContext"; +import { FormGroup, FormBuilder, FormControl, Validators } from "@angular/forms"; +import { BackendErrorValidator } from "../../utilities/validators/BackendErrorValidator"; +import { BaseErrorModel } from "../error/BaseErrorModel"; +import { Status } from "../Status"; + +export class ProjectModel implements Serializable { + public id: String; + public label: String; + public abbreviation: String; + public reference: String; + public uri: String; + public status: Status = Status.Active; + public startDate: Date; + public endDate: Date; + public description: String; + + public errorModel: BaseErrorModel = new BaseErrorModel(); + + fromJSONObject(item: any): ProjectModel { + this.id = item.id; + this.label = item.label; + this.abbreviation = item.abbreviation; + this.reference = item.reference; + this.uri = item.uri; + this.status = item.status; + this.startDate = new Date(item.startDate); + this.endDate = new Date(item.endDate); + this.description = item.description; + + return this; + } + + buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup { + if (context == null) { context = this.createValidationContext(); } + + const formGroup = new FormBuilder().group({ + id: [{ value: this.id, disabled: disabled }, context.getValidation('id').validators], + label: [{ value: this.label, disabled: disabled }, context.getValidation('label').validators], + abbreviation: [{ value: this.abbreviation, disabled: disabled }, context.getValidation('abbreviation').validators], + reference: [{ value: this.reference, disabled: disabled }], + uri: [{ value: this.uri, disabled: disabled }, context.getValidation('uri').validators], + status: [{ value: this.status, disabled: disabled }, context.getValidation('label').validators], + description: [{ value: this.description, disabled: disabled }, context.getValidation('description').validators], + startDate: [{ value: this.startDate, disabled: disabled }, context.getValidation('startDate').validators], + endDate: [{ value: this.endDate, disabled: disabled }, context.getValidation('endDate').validators] + }); + + return formGroup; + } + + createValidationContext(): ValidationContext { + const baseContext: ValidationContext = new ValidationContext(); + baseContext.validation.push({ key: 'id', validators: [] }); + baseContext.validation.push({ key: 'label', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'label')] }); + baseContext.validation.push({ key: 'abbreviation', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'abbreviation')] }); + baseContext.validation.push({ key: 'uri', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'uri')] }); + baseContext.validation.push({ key: 'status', validators: [] }); + baseContext.validation.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'description')] }); + baseContext.validation.push({ key: 'startDate', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'startDate')] }); + baseContext.validation.push({ key: 'endDate', validators: [Validators.required, BackendErrorValidator(this.errorModel, 'endDate')] }); + + return baseContext; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/registers/RegisterModel.ts b/dmp-frontend/src/app/models/registers/RegisterModel.ts new file mode 100644 index 000000000..f52389330 --- /dev/null +++ b/dmp-frontend/src/app/models/registers/RegisterModel.ts @@ -0,0 +1,21 @@ +import { Serializable } from "../Serializable"; + +export class RegisterModel implements Serializable { + public abbreviation: String; + public definition: String; + public id: String; + public label: String; + public reference: String; + public uri: String; + + fromJSONObject(item: any): RegisterModel { + this.abbreviation = item.abbreviation; + this.definition = item.definition; + this.id = item.id; + this.label = item.label; + this.reference = item.reference; + this.uri = item.uri; + + return this; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/researcher/ResearcherModel.ts b/dmp-frontend/src/app/models/researcher/ResearcherModel.ts new file mode 100644 index 000000000..03cbace90 --- /dev/null +++ b/dmp-frontend/src/app/models/researcher/ResearcherModel.ts @@ -0,0 +1,17 @@ +import { Serializable } from "../Serializable"; + +export class ResearcherModel implements Serializable { + public id: String; + public name: String; + public uri: String; + public email: String; + + fromJSONObject(item: any): ResearcherModel { + this.id = item.id; + this.name = item.name; + this.email = item.email; + this.uri = item.uri; + + return this; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/models/services/ServiceModel.ts b/dmp-frontend/src/app/models/services/ServiceModel.ts new file mode 100644 index 000000000..90f5a8194 --- /dev/null +++ b/dmp-frontend/src/app/models/services/ServiceModel.ts @@ -0,0 +1,21 @@ +import { Serializable } from "../Serializable"; + +export class ServiceModel implements Serializable { + public id: String; + public abbreviation: String; + public definition: String; + public uri: String; + public label: String; + public reference: String; + + fromJSONObject(item: any): ServiceModel { + this.id = item.id; + this.abbreviation = item.abbreviation; + this.definition = item.definition; + this.uri = item.uri; + this.label = item.label; + this.reference = item.reference; + + return this; + } +} diff --git a/dmp-frontend/src/app/pipes/dataset-status-filter.pipe.ts b/dmp-frontend/src/app/pipes/dataset-status-filter.pipe.ts deleted file mode 100644 index 92fb26bd5..000000000 --- a/dmp-frontend/src/app/pipes/dataset-status-filter.pipe.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as _ from "lodash"; -import { Pipe, PipeTransform } from "@angular/core"; - -@Pipe({ - name: "datasetstatusFilter" -}) -export class DatasetStatusFilterPipe implements PipeTransform { - - transform(array: any[], status: number): any { - - if (status) { - - return _.filter(array, row => { - - return ( - row.status == status - ) - }); - - } - return array; - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/pipes/dataset-table-filter.pipe.ts b/dmp-frontend/src/app/pipes/dataset-table-filter.pipe.ts deleted file mode 100644 index 98abedbe7..000000000 --- a/dmp-frontend/src/app/pipes/dataset-table-filter.pipe.ts +++ /dev/null @@ -1,28 +0,0 @@ -import * as _ from "lodash"; -import {Pipe, PipeTransform} from "@angular/core"; - -@Pipe({ - name: "datasetTableFilter" -}) -export class DatasetTableFilterPipe implements PipeTransform { - - transform(array: any[], query: string): any { - - if (query) { - - return _.filter(array, row => { - if (row.uri == null) row.uri = ""; - if (row.label == null) row.label = ""; - if (row.id == null) row.id = ""; - return ( - - row.label.indexOf(query) > -1 - //|| row.version == query - //|| row.id.indexOf(query) > -1 - ) - }); - - } - return array; - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/pipes/dmp-status-filter.pipe.ts b/dmp-frontend/src/app/pipes/dmp-status-filter.pipe.ts deleted file mode 100644 index bf4af0093..000000000 --- a/dmp-frontend/src/app/pipes/dmp-status-filter.pipe.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as _ from "lodash"; -import { Pipe, PipeTransform } from "@angular/core"; - -@Pipe({ - name: "dmpstatusFilter" -}) -export class DmpStatusFilterPipe implements PipeTransform { - - transform(array: any[], status: number): any { - - if (status) { - - return _.filter(array, row => { - - return ( - row.status == status - ) - }); - - } - return array; - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/pipes/dmp-table-filter.pipe.ts b/dmp-frontend/src/app/pipes/dmp-table-filter.pipe.ts deleted file mode 100644 index 9b5f08f0b..000000000 --- a/dmp-frontend/src/app/pipes/dmp-table-filter.pipe.ts +++ /dev/null @@ -1,29 +0,0 @@ -import * as _ from "lodash"; -import {Pipe, PipeTransform} from "@angular/core"; - -@Pipe({ - name: "dmpTableFilter" -}) -export class DmpTableFilterPipe implements PipeTransform { - - transform(array: any[], query: string): any { - - if (query) { - - return _.filter(array, row => { - if (row.uri == null) row.uri = ""; - if (row.label == null) row.label = ""; - if (row.id == null) row.id = ""; - return ( - - row.label.indexOf(query) > -1 || - - //row.version == query || - row.id.indexOf(query) > -1 - ) - }); - - } - return array; - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/pipes/dmp-version-filter.pipe.ts b/dmp-frontend/src/app/pipes/dmp-version-filter.pipe.ts deleted file mode 100644 index 0ce5c54f8..000000000 --- a/dmp-frontend/src/app/pipes/dmp-version-filter.pipe.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as _ from "lodash"; -import {Pipe, PipeTransform} from "@angular/core"; - -@Pipe({ - name: "dmpVersionFilter" -}) -export class DmpVersionFilterPipe implements PipeTransform { - - transform(array: any[], version: number): any { - - if (version) { - - return _.filter(array, row => { - return ( - row.version == version - ) - }); - - } - return array; - } - } \ No newline at end of file diff --git a/dmp-frontend/src/app/pipes/project-table-filter.pipe.ts b/dmp-frontend/src/app/pipes/project-table-filter.pipe.ts deleted file mode 100644 index e1b667b5d..000000000 --- a/dmp-frontend/src/app/pipes/project-table-filter.pipe.ts +++ /dev/null @@ -1,28 +0,0 @@ -import * as _ from "lodash"; -import {Pipe, PipeTransform} from "@angular/core"; - -@Pipe({ - name: "projectTableFilter" -}) -export class ProjectTableFilterPipe implements PipeTransform { - - transform(array: any[], query: string, userid : string, onlyMyProjects : boolean): any { - - if (query || userid) { - - return _.filter(array, row => { - - if(onlyMyProjects){ - return (row.label.indexOf(query) > -1) && (row.creationUser.id==userid); - } - else{ - return row.label.indexOf(query) > -1; - } - - }); - - } - return array; - } - -} \ No newline at end of file diff --git a/dmp-frontend/src/app/pipes/various/status-to-string.ts b/dmp-frontend/src/app/pipes/various/status-to-string.ts deleted file mode 100644 index 18e8b3a67..000000000 --- a/dmp-frontend/src/app/pipes/various/status-to-string.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Pipe, PipeTransform } from '@angular/core'; - -@Pipe({ - name: "statusToString" -}) - -export class StatusToString implements PipeTransform { - - transform(input: any) : any { - - if(input < 0) { - return "Deleted"; - } - else if(input == 0) { - return "Active"; - } - else if(input == 1) { - return "Inactive"; - } - else if(input == 2) { - return "Submitted"; - } - else if(input == 3) { - return "Cancel"; - } - else { - return input.toString(); - } - - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/projects/editor/project-editor.component.html b/dmp-frontend/src/app/projects/editor/project-editor.component.html new file mode 100644 index 000000000..bd2ef3aa8 --- /dev/null +++ b/dmp-frontend/src/app/projects/editor/project-editor.component.html @@ -0,0 +1,69 @@ +
+
+ + {{'PROJECT-EDITOR.TITLE.NEW' | translate}} + {{formGroup.get('label').value}} + + + + + {{baseErrorModel.label}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + + {{baseErrorModel.abbreviation}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + + {{baseErrorModel.uri}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + + + + +
+ + + + + {{this.project.errorModel.startDate}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + + + + + + {{baseErrorModel.endDate}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + +
+ + + + {{errorModel.description}} + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + + +
+ + + +
+ +
+
+
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/projects/editor/project-editor.component.scss b/dmp-frontend/src/app/projects/editor/project-editor.component.scss new file mode 100644 index 000000000..31e8a8de3 --- /dev/null +++ b/dmp-frontend/src/app/projects/editor/project-editor.component.scss @@ -0,0 +1,35 @@ +.full-width { + width: 100%; +} + +.input-table { + table-layout: fixed; +} + +.table-card .mat-grid-tile { + background: rgba(0, 0, 0, 0.32); +} + +.project-editor { + mat-form-field { + width: 100%; + padding: 3px; + } + + .mat-card { + margin: 16px 0; + } + + p { + margin: 16px; + } + + .left-button { + float: left; + } + + .description-area { + height: 100px; + } + +} diff --git a/dmp-frontend/src/app/projects/editor/project-editor.component.ts b/dmp-frontend/src/app/projects/editor/project-editor.component.ts new file mode 100644 index 000000000..d7817f28b --- /dev/null +++ b/dmp-frontend/src/app/projects/editor/project-editor.component.ts @@ -0,0 +1,152 @@ +import { Component, ViewChild, OnInit, AfterViewInit, ViewEncapsulation } from "@angular/core"; +import { MatPaginator, MatSort, MatSnackBar } from "@angular/material"; +import { Router, ActivatedRoute, Params } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DataSource } from "@angular/cdk/table"; +import { Observable } from "rxjs/Observable"; +import { DataManagementPlanService } from "../../services/data-management-plan/data-management-plan.service"; +import { ProjectModel } from "../../models/projects/ProjectModel"; +import { ProjectService } from "../../services/project/project.service"; +import { JsonSerializer } from "../../utilities/JsonSerializer"; +import { FormGroup, AbstractControl, FormControl, FormArray } from "@angular/forms"; +import { SnackBarNotificationComponent } from "../../shared/components/notificaiton/snack-bar-notification.component"; +import { BaseErrorModel } from "../../models/error/BaseErrorModel"; +import { TdDialogService } from "@covalent/core"; + + + +@Component({ + selector: 'app-project-editor-component', + templateUrl: 'project-editor.component.html', + styleUrls: ['./project-editor.component.scss'], + providers: [ProjectService], + encapsulation: ViewEncapsulation.None +}) +export class ProjectEditorComponent implements AfterViewInit { + + isNew = true; + project: ProjectModel; + formGroup: FormGroup = null; + + constructor( + private projectService: ProjectService, + private route: ActivatedRoute, + public snackBar: MatSnackBar, + public router: Router, + public language: TranslateService, + private dialogService: TdDialogService + ) { + + } + + ngAfterViewInit() { + this.route.params.subscribe((params: Params) => { + const itemId = params['id']; + + if (itemId != null) { + this.isNew = false; + this.projectService.getSingle(itemId).map(data => data as ProjectModel) + .subscribe(data => { + this.project = JsonSerializer.fromJSONObject(data, ProjectModel); + this.formGroup = this.project.buildForm(); + }); + } else { + this.project = new ProjectModel(); + setTimeout(() => { + this.formGroup = this.project.buildForm(); + }); + } + }); + } + + formSubmit(): void { + this.touchAllFormFields(this.formGroup); + if (!this.isFormValid()) { return; } + this.onSubmit(); + } + + public isFormValid() { + return this.formGroup.valid; + } + + onSubmit(): void { + this.projectService.createProject(this.formGroup.value).subscribe( + complete => this.onCallbackSuccess(), + error => this.onCallbackError(error) + ); + } + + onCallbackSuccess(): void { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: this.isNew ? 'GENERAL.SNACK-BAR.SUCCESSFUL-CREATION' : 'GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-success'] + }) + this.router.navigate(['/projects']); + } + + onCallbackError(errorResponse: any) { + this.setErrorModel(errorResponse.error); + this.validateAllFormFields(this.formGroup); + } + + public setErrorModel(errorModel: BaseErrorModel) { + Object.keys(errorModel).forEach(item => { + (this.project.errorModel)[item] = (errorModel)[item]; + }) + } + + public cancel(): void { + this.router.navigate(['/projects']); + } + + public delete(): void { + this.language.get('GENERAL.DELETE-CONFIRMATION').subscribe((messages: any) => { + this.dialogService.openConfirm({ + message: messages.MESSAGE, + title: messages.TITLE, + cancelButton: messages.NEGATIVE, + acceptButton: messages.POSITIVE + }).afterClosed().subscribe((accept: boolean) => { + if (accept) { + this.projectService.inactivate(this.project.id).subscribe( + complete => { this.router.navigate(['/projects']); }, + error => this.onCallbackError(error) + ); + } + }); + }); + } + + public touchAllFormFields(formControl: AbstractControl) { + if (formControl instanceof FormControl) { + formControl.markAsTouched(); + } else if (formControl instanceof FormGroup) { + Object.keys(formControl.controls).forEach(item => { + const control = formControl.get(item); + this.touchAllFormFields(control); + }) + } + else if (formControl instanceof FormArray) { + formControl.controls.forEach(item => { + this.touchAllFormFields(item); + }) + } + } + + public validateAllFormFields(formControl: AbstractControl) { + if (formControl instanceof FormControl) { + formControl.updateValueAndValidity({ emitEvent: false }) + } else if (formControl instanceof FormGroup) { + Object.keys(formControl.controls).forEach(item => { + const control = formControl.get(item); + this.validateAllFormFields(control); + }) + } + else if (formControl instanceof FormArray) { + formControl.controls.forEach(item => { + this.validateAllFormFields(item); + }) + } + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/projects/project-listing.component.html b/dmp-frontend/src/app/projects/project-listing.component.html new file mode 100644 index 000000000..4811b5a99 --- /dev/null +++ b/dmp-frontend/src/app/projects/project-listing.component.html @@ -0,0 +1,53 @@ +
+

{{'PROJECT-LISTING.TITLE' | translate}}

+ + + + + + + + + + + + {{'PROJECT-LISTING.COLUMNS.NAME' | translate}} + {{row.label}} + + + + + {{'PROJECT-LISTING.COLUMNS.ABBREVIATION' | translate}} + {{row.abbreviation}} + + + + + {{'PROJECT-LISTING.COLUMNS.START' | translate}} + {{row.startDate | date:'shortDate'}} + + + + + {{'PROJECT-LISTING.COLUMNS.END' | translate}} + {{row.endDate | date:'shortDate'}} + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/dmp-frontend/src/app/projects/project-listing.component.scss b/dmp-frontend/src/app/projects/project-listing.component.scss new file mode 100644 index 000000000..b2f6556a1 --- /dev/null +++ b/dmp-frontend/src/app/projects/project-listing.component.scss @@ -0,0 +1,32 @@ +.mat-table { + margin: 24px; +} + + +.mat-fab-bottom-right { + top: auto !important; + right: 20px !important; + bottom: 10px !important; + left: auto !important; + position: fixed !important; +} + +.full-width { + width: 100%; +} + +.mat-card { + margin: 16px 0; +} + +.mat-row { + cursor: pointer; +} + +mat-row:hover { + background-color: lightgray; +} + +mat-row:nth-child(odd){ + background-color:#eef0fb; + } \ No newline at end of file diff --git a/dmp-frontend/src/app/projects/project-listing.component.ts b/dmp-frontend/src/app/projects/project-listing.component.ts new file mode 100644 index 000000000..e4bdedc84 --- /dev/null +++ b/dmp-frontend/src/app/projects/project-listing.component.ts @@ -0,0 +1,126 @@ +import { Component, ViewChild, OnInit, AfterViewInit, ViewEncapsulation } from "@angular/core"; +import { MatPaginator, MatSort, MatSnackBar } from "@angular/material"; +import { Router } from "@angular/router"; +import { TranslateService } from "@ngx-translate/core"; +import { DataSource } from "@angular/cdk/table"; +import { ProjectListingModel } from "../models/projects/ProjectListingModel"; +import { ProjectService } from "../services/project/project.service"; +import { ProjectCriteriaComponent } from "../shared/components/criteria/projects/projects-criteria.component"; +import { ProjectCriteria } from "../models/criteria/project/ProjectCriteria"; +import { Observable } from "rxjs/Observable"; +import { DataTableRequest } from "../models/data-table/DataTableRequest"; +import { SnackBarNotificationComponent } from "../shared/components/notificaiton/snack-bar-notification.component"; + +@Component({ + selector: 'app-project-listing-component', + templateUrl: 'project-listing.component.html', + styleUrls: ['./project-listing.component.scss'], + providers: [ProjectService], + encapsulation: ViewEncapsulation.None +}) +export class ProjectListingComponent implements OnInit { + + @ViewChild(MatPaginator) _paginator: MatPaginator; + @ViewChild(MatSort) sort: MatSort; + @ViewChild(ProjectCriteriaComponent) criteria: ProjectCriteriaComponent; + + dataSource: ProjectDataSource | null; + displayedColumns: String[] = ['name', 'abbreviation', 'start', 'end']; + + constructor( + private projectService: ProjectService, + private router: Router, + private languageService: TranslateService, + public snackBar: MatSnackBar, + ) { + + } + + ngOnInit() { + this.criteria.setCriteria(this.getDefaultCriteria()); + this.refresh(); + this.criteria.setRefreshCallback(() => this.refresh()); + } + + refresh() { + this.dataSource = new ProjectDataSource(this.projectService, this._paginator, this.sort, this.languageService, this.snackBar, this.criteria); + } + + rowClick(rowId: String) { + this.router.navigate(['/project/' + rowId]); + } + + getDefaultCriteria(): ProjectCriteria { + const defaultCriteria = new ProjectCriteria(); + return defaultCriteria; + } +} + +export class ProjectDataSource extends DataSource { + + totalCount = 0; + isLoadingResults = false; + + constructor( + private _service: ProjectService, + private _paginator: MatPaginator, + private _sort: MatSort, + private _languageService: TranslateService, + private _snackBar: MatSnackBar, + private _criteria: ProjectCriteriaComponent + ) { + super(); + + //this._paginator.page.subscribe((pageEvent: PageEvent) => { + // this.store.dispatch(new LoadPhotosRequestAction(pageEvent.pageIndex, pageEvent.pageSize)) + //}) + } + + connect(): Observable { + const displayDataChanges = [ + this._paginator.page + //this._sort.matSortChange + ]; + + // If the user changes the sort order, reset back to the first page. + //this._sort.matSortChange.subscribe(() => { + // this._paginator.pageIndex = 0; + //}) + + return Observable.merge(...displayDataChanges) + .startWith(null) + .switchMap(() => { + setTimeout(() => { + this.isLoadingResults = true; + }); + const startIndex = this._paginator.pageIndex * this._paginator.pageSize; + const request = new DataTableRequest(startIndex, this._paginator.pageSize); + request.criteria = this._criteria.criteria; + return this._service.getPaged(request); + }) + .catch((error: any) => { + this._snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.SNACK-BAR.FORMS-BAD-REQUEST', language: this._languageService }, + duration: 3000, + extraClasses: ['snackbar-warning'] + }); + this._criteria.onCallbackError(error.error); + return Observable.of(null); + }) + .map(result => { + setTimeout(() => { + this.isLoadingResults = false; + }); + return result; + }) + .map(result => { + if (!result) { return []; } + if (this._paginator.pageIndex === 0) { this.totalCount = result.totalCount; } + return result.data; + }); + } + + disconnect() { + // No-op + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/projects/project.css b/dmp-frontend/src/app/projects/project.css deleted file mode 100644 index 2c6b2c7e6..000000000 --- a/dmp-frontend/src/app/projects/project.css +++ /dev/null @@ -1,62 +0,0 @@ -:host /deep/ .index-column, -:host /deep/ .index-column-header { - text-align: right; -} - -:host /deep/ .data-table .data-table-row.selected { - background-color: #E4EDF9; -} - -a.editGridColumn{ - color: #333; -} - -.invisible { - display:none; -} - -.visible { - display:block; -} - -tr.hover:hover > * { - background-color: #eeeeee; -} - -.editor-container{ - padding-top: 10px; - padding-right: 10px; - padding-bottom: 10px; - padding-left: 10px; -} - -.button-150px { - max-width: 150px; -} - -.ng-template{ - text-align: right; -} - -.grayout-empty-table { - opacity: 0.6; /* Real browsers */ - filter: alpha(opacity = 60); /* MSIE */ - text-align: center; - vertical-align: middle; -} - -.btncustom{ - background-color:#337ab7; - color:white; - margin-top:15px; -} - -a{ - cursor: pointer; -} -.not-active { - pointer-events: none; - cursor:not-allowed; - opacity: 0.5; - filter: alpha(opacity=50); /* For IE8 and earlier */ - } \ No newline at end of file diff --git a/dmp-frontend/src/app/projects/project.detail.ts b/dmp-frontend/src/app/projects/project.detail.ts deleted file mode 100644 index cf4c3f839..000000000 --- a/dmp-frontend/src/app/projects/project.detail.ts +++ /dev/null @@ -1,33 +0,0 @@ -import 'rxjs/add/operator/switchMap'; -import { Component, OnInit, HostBinding } from '@angular/core'; -import { Observable } from 'rxjs/Observable'; -import { Router, ActivatedRoute, ParamMap } from '@angular/router'; - -@Component({ - template: ` -
-

"{{ project.name }}"

-
- {{ project.id }}
-
- - -
-
- ` -}) -export class ProjectDetailComponent implements OnInit { - - - constructor( - private route: ActivatedRoute, - private router: Router, - ) {} - - ngOnInit() { - // this.hero$ = this.route.paramMap - // .switchMap((params: ParamMap) => - // this.service.getHero(params.get('id'))); - } - -} \ No newline at end of file diff --git a/dmp-frontend/src/app/projects/project.html b/dmp-frontend/src/app/projects/project.html deleted file mode 100644 index 2dfdaac4a..000000000 --- a/dmp-frontend/src/app/projects/project.html +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - -
- -
-
- ID - - Label - - Αbbreviation - - Start Date - - End Date - - Status - - Description - - Actions -
No elements
{{project?.id}}{{(project?.label?.length > 40) ? (project?.label | slice:0:40)+'...':(project?.label) }}{{project?.abbreviation}}{{project?.startdate | date:'yyyy-MM-dd HH:mm:ss Z' }}{{project?.enddate | date:'yyyy-MM-dd HH:mm:ss Z'}}{{project?.status | statusToString}}{{(project?.description?.length > 40) ? (project?.description | slice:0:40)+'...':(project?.description) }} - - - - -
- - - - -
- - - - diff --git a/dmp-frontend/src/app/projects/projects.component.ts b/dmp-frontend/src/app/projects/projects.component.ts deleted file mode 100644 index eab4fe99b..000000000 --- a/dmp-frontend/src/app/projects/projects.component.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { Component, OnInit, Input, Output, EventEmitter, ViewChild } from '@angular/core'; -import {Observable} from 'rxjs/Observable'; -import {GoogleSignInSuccess} from 'angular-google-signin'; -import { Router, ActivatedRoute } from '@angular/router'; -import { ServerService } from '../../app/services/server.service'; -import { Project } from '../entities/model/project'; -import { Dmp } from '../entities/model/dmp'; -import { Dataset } from '../entities/model/dataset'; -//import { DataTable, DataTableTranslations, DataTableResource } from 'angular-4-data-table-bootstrap-4'; -import {DataTable} from 'angular2-datatable'; -import { DropdownField } from '../../app/form/fields/dropdown/field-dropdown'; -import { Param } from '../entities/model/param'; -import { ModalComponent } from '../modal/modal.component'; -import { HttpErrorResponse } from '@angular/common/http'; -import { FormGroup, FormControl } from '@angular/forms'; //na dw an xreiazontai -import { NgForm } from '@angular/forms'; -import { DatepickerOptions } from 'ng2-datepicker'; -import { StatusToString} from '../pipes/various/status-to-string'; -import { ConfirmationComponent } from '../widgets/confirmation/confirmation.component'; -import {MenuItem} from 'primeng/primeng'; - -import { ProjectTableFilterPipe } from '../pipes/project-table-filter.pipe'; - - -declare var $ :any; - -import '../../assets/custom.js'; -declare function simple_notifier(type: string, title: string, message:string): any; - - -@Component({ - selector: 'projects', - templateUrl: 'project.html', - styleUrls: ['./project.css'], - providers: [ServerService] -}) - -export class ProjectsComponent implements OnInit{ - -// Start ALTERNATIVE - //whole dmp data model - tableData : any[] = new Array(); - - //organisation editor data model - editingOrganisation: any = {}; - organisationEditorForm : any; - - //required by the table - public filterQuery = ""; - public rowsOnPage = 10; - public sortBy = "label"; - public sortOrder = "asc"; - - - // for tableIds - showIDs : boolean = false; - - statusDropDown: DropdownField; - - project: any; - - whoami: any; - onlyMyProjects : boolean = false; - - options: DatepickerOptions = { - minYear: 1900, - maxYear: 2050, - displayFormat: 'MMM D[,] YYYY', - barTitleFormat: 'MMMM YYYY', - firstCalendarDay: 0 // 0 - Sunday, 1 - Monday - }; - - //breadcrumbHome: MenuItem = {icon: 'fa fa-home'}; - breadcrumbData: MenuItem[] = new Array(); - - constructor( - private serverService: ServerService, - private route: ActivatedRoute, - private router: Router) { - this.statusDropDown = new DropdownField(); - this.statusDropDown.options= [{key:'0', value:"Active"},{key:'1', value:"Inactive"}] - this.project = this.getEmptyProject(); - } - - ngAfterViewInit() { - - } - -getEmptyProject(){ - return { - label: '', - abbreviation:'', - reference:'', - uri:'', - description:'', - enddate:'', - startdate:'' - } -} - - - ngOnInit() { - - this.getProjects(); - - this.serverService.whoami().subscribe( - response => { - this.whoami = response; - console.log(this.whoami) - }, - err => { - simple_notifier("danger",null,"Could not retrieve user config"); - } - ); - - } - - -getProjects(muted? : boolean){ - //this.serverService.getProjectsOfUser().subscribe( - this.serverService.getAllProjects().subscribe( - response => { - this.tableData = response; - if(muted && muted!=true) - simple_notifier("success",null,"Updated projects table"); - }, - err => { - simple_notifier("danger",null,"Could not retrieve projects"); - } -); -} - - - -showDatasets(){ //dmpId, event - //this.dataSetVisibe = true; - -} - - -SaveProject(){ - - let action : Observable; - - if(this.project.id == null) //means it's a new one - action = this.serverService.createProject(this.project); - else - action = this.serverService.updateProject(this.project); - action.subscribe( - response =>{ - this.getProjects(); - simple_notifier("success",null, (this.project.id == null) ? "Created" : "Updated" +" projects table"); - }, - error => { - simple_notifier("danger",null, "Could not "+ (this.project.id == null) ? "create" : "update" + " projects table"); - } - ); - - $("#newEditProjectModal").modal("hide"); -} - - newProject(){ - this.project = this.getEmptyProject(); - $("#newEditProjectModal").modal("show"); - - } - - editRow(item, event){ - this.project = Object.assign({}, item); //this will have id - that defines whether it's an update or not - this.project.creationUser = {"id":this.project.creationUser.id}; - $("#newEditProjectModal").modal("show"); - - return false; - } - - - /* - markProjectForDelete(project){ - this.project = project; - } - - deleteProject(confirmation){ - if(confirmation==true) - this.deleteRow(this.project); - } - */ - -} diff --git a/dmp-frontend/src/app/services/auth/auth.service.ts b/dmp-frontend/src/app/services/auth/auth.service.ts new file mode 100644 index 000000000..be6a91dd8 --- /dev/null +++ b/dmp-frontend/src/app/services/auth/auth.service.ts @@ -0,0 +1,134 @@ +import { Injectable } from '@angular/core'; +import { HttpHeaders } from '@angular/common/http'; +import { HttpClient } from '@angular/common/http'; +import { HostConfiguration } from '../../app.constants'; +import { Principal } from '../../models/login/Principal'; +import { Credential } from '../../models/login/Credential'; +import { Observable } from 'rxjs/Rx'; +import { MatSnackBar } from '@angular/material'; +import { TranslateService } from '@ngx-translate/core'; +import { Router } from '@angular/router'; +import { JsonSerializer } from '../../utilities/JsonSerializer'; +import { LoginInfo } from '../../models/login/LoginInfo'; +import { SnackBarNotificationComponent } from '../../shared/components/notificaiton/snack-bar-notification.component'; + +@Injectable() +export class AuthService { + private actionUrl: string; + private headers: HttpHeaders; + + constructor( + private http: HttpClient, + public snackBar: MatSnackBar, + public language: TranslateService, + public router: Router + ) { + + this.actionUrl = HostConfiguration.Server + 'auth/'; + + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } + + private clear(): void { + localStorage.removeItem('principal'); + } + + public current(principal?: Principal): Principal { + if (principal) { + localStorage.setItem('principal', JSON.stringify(principal)); + return principal; + } + const principalJson = localStorage.getItem('principal'); + if (!principalJson) { return null; } + const principalObj = JSON.parse(principalJson) as Principal; + return principalObj; + } + + //public login(credential: Credential): Observable { + // const url = this.actionUrl + 'login'; + + // return this.http.post(url, credential, { headers: this.headers }) + // .map((res: Response) => { + // let principal = this.current(new JsonSerializer().fromJSONObject(res, Principal)); + // //this.loginContextSubject.next(true); + // return principal; + // }) + // .catch((error: any) => { + // //this.loginContextSubject.next(false); + // return Observable.throw(error); + // }); + //} + + public login(loginInfo: LoginInfo): Observable { + const url = this.actionUrl + 'externallogin'; + + return this.http.post(url, loginInfo, { headers: this.headers }) + .map((res: any) => { + const principal = this.current(JsonSerializer.fromJSONObject(res.payload, Principal)); + //this.loginContextSubject.next(true); + return principal; + }) + .catch((error: any) => { + //this.loginContextSubject.next(false); + return Observable.throw(error); + }); + } + + public logout(): void { + const url = this.actionUrl + 'logout'; + const principal = this.current(); + this.clear(); + + if (!principal) { return; } + let headers = this.headers; + headers = headers.set('AuthToken', principal.token) + this.http.post(url, null, { headers: headers }).subscribe( + res => this.onLogOutSuccess(res), + error => this.onLogOutError(error) + ) + } + + public me(): Observable { + const url = this.actionUrl + '/me'; + const principal = this.current(); + if (!principal) { + this.clear(); + return Observable.of(); + } + let headers = this.headers; + headers = headers.set('AuthToken', principal.token) + return this.http.post(url, null, { headers: headers }) + .map((r: Response) => { + const princ = this.current(JsonSerializer.fromJSONObject(r.json(), Principal)); + //this.loginContextSubject.next(true); + return princ; + }) + .catch((error: any) => { + console.warn('could not retrieve me info:\n', error); + this.clear(); + const princ = this.current(); + this.router.navigate(['/login']); + return Observable.of(princ); + }); + } + + public onLogOutSuccess(logoutMessage: any) { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-LOGOUT', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-success'] + }) + this.router.navigate(['/login']); + } + + public onLogOutError(errorMessage: string) { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.SNACK-BAR.UNSUCCESSFUL-LOGOUT', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-warning'] + }) + this.router.navigate(['/login']); + } +} diff --git a/dmp-frontend/src/app/services/dashboard/dashboard.service.ts b/dmp-frontend/src/app/services/dashboard/dashboard.service.ts new file mode 100644 index 000000000..7556a37a8 --- /dev/null +++ b/dmp-frontend/src/app/services/dashboard/dashboard.service.ts @@ -0,0 +1,31 @@ +import 'rxjs/add/operator/map'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { HostConfiguration } from './../../app.constants'; +import { BaseHttpService } from '../../utilities/cite-http-service-module/base-http.service'; +import { Observable } from 'rxjs/Observable'; +import { DashboardStatisticsModel } from '../../models/dashboard/DashboardStatisticsModel'; + + + + +@Injectable() +export class DashboardService { + + private actionUrl: string; + private headers: HttpHeaders; + + constructor(private http: BaseHttpService) { + + this.actionUrl = HostConfiguration.Server + 'dashboard/'; + + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } + + getStatistics(): Observable { + return this.http.get(this.actionUrl + 'getStatistics', { headers: this.headers }); + } + +} diff --git a/dmp-frontend/src/app/services/data-management-plan/data-management-plan.service.ts b/dmp-frontend/src/app/services/data-management-plan/data-management-plan.service.ts new file mode 100644 index 000000000..59610030d --- /dev/null +++ b/dmp-frontend/src/app/services/data-management-plan/data-management-plan.service.ts @@ -0,0 +1,51 @@ +import 'rxjs/add/operator/map'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { HostConfiguration } from './../../app.constants'; +import { BaseHttpService } from '../../utilities/cite-http-service-module/base-http.service'; +import { Observable } from 'rxjs/Observable'; +import { DataTableRequest } from '../../models/data-table/DataTableRequest'; +import { DataTableData } from '../../models/data-table/DataTableData'; +import { DataManagementPlanModel } from '../../models/data-managemnt-plans/DataManagementPlanModel'; +import { DataManagementPlanListingModel } from '../../models/data-managemnt-plans/DataManagementPlanListingModel'; +import { DataManagementPlanCriteria } from '../../models/criteria/data-management-plan/DataManagementPlanCriteria'; +import { DatasetProfileCriteria } from '../../models/criteria/dataset/DatasetProfileCriteria'; +import { RequestItem } from '../../models/criteria/RequestItem'; +import { DatasetProfileModel } from '../../models/datasets/DatasetProfileModel'; + + +@Injectable() +export class DataManagementPlanService { + + private actionUrl: string; + private headers: HttpHeaders; + + constructor(private http: BaseHttpService) { + + this.actionUrl = HostConfiguration.Server + 'dmps/'; + + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } + + getPaged(dataTableRequest: DataTableRequest): Observable> { + return this.http.post>(this.actionUrl + 'getPaged', dataTableRequest, { headers: this.headers }); + } + + getSingle(id: String): Observable { + return this.http.get(this.actionUrl + 'getSingle/' + id, { headers: this.headers }); + } + + createDataManagementPlan(dataManagementPlanModel: DataManagementPlanModel): Observable { + return this.http.post(this.actionUrl + 'createOrUpdate', dataManagementPlanModel, { headers: this.headers }); + } + + inactivate(id: String): Observable { + return this.http.delete(this.actionUrl + 'inactivate/' + id, { headers: this.headers }); + } + + searchDMPProfiles(dataSetProfileRequest: RequestItem): Observable { + return this.http.post(this.actionUrl + "datasetprofiles/get", dataSetProfileRequest, { headers: this.headers }); + } +} diff --git a/dmp-frontend/src/app/services/dataModelBuilder.service.ts b/dmp-frontend/src/app/services/dataModelBuilder.service.ts deleted file mode 100644 index d5ea40346..000000000 --- a/dmp-frontend/src/app/services/dataModelBuilder.service.ts +++ /dev/null @@ -1,383 +0,0 @@ -import { Injectable } from '@angular/core'; -import { DropdownField } from '../../app/form/fields/dropdown/field-dropdown'; -import { FieldBase } from '../../app/form/fields/field-base'; -import { TextboxField } from '../../app/form/fields/textbox/field-textbox'; -import { CheckBoxField } from '../../app/form/fields/checkbox/field-checkbox'; -import { RadioBoxField } from '../../app/form/fields/radiobox/field-radiobox'; -import { TextAreaField } from '../../app/form/fields/textarea/textarea'; -import { LabelField } from '../../app/form/fields/label/label'; -import { DataModel } from '../entities/DataModel'; -import { Rule } from '../entities/common/rule'; -import { GroupBase } from '../form/dynamic-form-group/group-base'; -import { Attribute } from '../entities/model/attribute'; -import { Param } from '../entities/model/param'; -import { Section } from '../entities/model/section'; -import { RestBase } from '../services/rest-base'; - -@Injectable() -export class dataModelBuilder { - - private dataModel: DataModel; - private fields: FieldBase[]; - - constructor(private restBase: RestBase) { } - - public getDataModel(data, dataValues) { - - if (this.dataModel != null) - return this.dataModel; - - this.dataModel = new DataModel(); - this.fields = this.buildFields(data.viewstyle.definition.root.fields.field); - - this.dataModel.semanticAttr = new Array(new Attribute); - this.dataModel.semanticAttr = this.getFieldsAttributes(data.definition.root.fields.fieldset, data.ruleset.definition.root.functions.function, this.fields); - this.dataModel.groups = this.getGroups(data.viewstyle.definition.root.fieldGroups.fieldGroup, this.fields, dataValues); - this.dataModel.sections = this.getSections(data.viewstyle.definition.root.sections.section, this.dataModel.groups); - this.dataModel.buildIndex(); - - this.checkDuplicateInObject('order', this.dataModel.groups[13].groupFields); //for future use , for composite field - - return this.dataModel; - } - - - private buildFields(fields: any[]) { - let fieldsVisible: FieldBase[] = []; - fields.forEach(element => { - if (element.viewStyle._renderstyle == "freetext") { - let newfield: FieldBase; - let rule = new Rule(); - newfield = new TextboxField({ - label: element.title.__cdata, - key: element._id, - value: element.value, - order: element._ordinal, - rules: element.visible.rule != undefined ? element.visible.rule : rule, - visible: element._defaultVisibility, - group: element._group, - description: element.description.__cdata - }); - - fieldsVisible.push(newfield); - } - else if (element.viewStyle._renderstyle == "dropdown" || element.viewStyle._renderstyle == "combobox") {//to choose one of these in xml - let newfield: DropdownField; - let rule = new Rule(); - newfield = new DropdownField({ - label: element.title.__cdata, - key: element._id, - value: element.value, - order: element._ordinal, - rules: element.visible.rule != undefined ? element.visible.rule : rule, - visible: element._defaultVisibility, - description: element.description.__cdata, - group: element._group - }); - fieldsVisible.push(newfield); - } - else if (element.viewStyle._renderstyle == "checkbox" || element.viewStyle._renderstyle == "checkBox") { - let newfield: CheckBoxField; - let rule = new Array(); - newfield = new CheckBoxField({ - label: element.title.__cdata, - key: element._id, - value: false, - order: element._ordinal, - rules: element.visible.rule != undefined ? element.visible.rule : rule, - visible: element._defaultVisibility, - group: element._group, - description: element.description.__cdata, - type: "checkbox" - }); - fieldsVisible.push(newfield); - } - else if (element.viewStyle._renderstyle == "booleanDesicion") { - let newfield: RadioBoxField; - let rule = new Array(); - newfield = new RadioBoxField({ - label: element.title.__cdata, - key: element._id, - value: element.value, - order: element._ordinal, - rules: element.visible.rule != undefined ? element.visible.rule : rule, - visible: element._defaultVisibility, - group: element._group, - type: "radio", - description: element.description.__cdata, - answers: [ - { - id: 1, - answer: "Yes", - value: true - }, - { - id: 2, - answer: "No", - value: false - }] - }); - fieldsVisible.push(newfield); - } else if (element.viewStyle._renderstyle == "textarea") { - let newfield: FieldBase; - let rule = new Rule(); - newfield = new TextAreaField({ - label: element.title.__cdata, - key: element._id, - value: element.value, - order: element._ordinal, - rules: element.visible.rule != undefined ? element.visible.rule : rule, - visible: element._defaultVisibility, - group: element._group, - description: element.description.__cdata - }); - - fieldsVisible.push(newfield); - } - - else if (element.viewStyle._renderstyle == "label") { - let newfield: FieldBase; - let rule = new Rule(); - newfield = new LabelField({ - label: element.title.__cdata, - key: element._id, - value: element.value, - order: element._ordinal, - rules: element.visible.rule != undefined ? element.visible.rule : rule, - visible: element._defaultVisibility, - group: element._group, - description: element.description.__cdata - }); - - fieldsVisible.push(newfield); - } - }); - fieldsVisible.sort((a, b) => a.order - b.order); - return fieldsVisible; - } - - private getGroups(fieldGroups: any, fields: any[], dataValues) { - let groups: GroupBase[] = []; - - if (fieldGroups.length > 1) { - fieldGroups.forEach(fieldGroup => { // each fiedgroup fills with its fields from json - let newfldGroup = new GroupBase(); - let compositeFields = new GroupBase(); - newfldGroup.groupFields = new Array(); - compositeFields.groupFields = new Array(); - - - fields.forEach(field => { - if (fieldGroup._id == field.group) { - if (dataValues != "")//--------------------------SET VALUES--------------------------------------------------------------------------------------- - if (dataValues[fieldGroup._id][field.key] != undefined) // to put values in fields - field.value = dataValues[fieldGroup._id][field.key].value == undefined ? dataValues[fieldGroup._id][field.key] : dataValues[fieldGroup._id][field.key].value; - - if(field.order.toString().split(".").length > 1){//--------------Composite Fields Multiplicity -------------------------------------------------- - compositeFields.groupFields.push(field); - newfldGroup.compositeFields = compositeFields; - }else - newfldGroup.groupFields.push(field); - } else { - //this.dataModel.fields.push(field); - } - //TO DO FIELDSET WITH MULTIPLICITY - // if (dataValues != "") - // if (dataValues[fieldGroup._id][field.key] != undefined){ - // let keys = new Array(); - // Object.keys(dataValues[fieldGroup._id]).forEach(key=>{if(key.startsWith(field.key+"_"))keys.push(key)}) - // if (keys.length) - // if (field.controlType == "textbox") { - // let newfield: FieldBase; - // let rule = new Rule(); - // newfield = new TextboxField({ - // label: field.label+"_"+ 1, - // key: keys[0], - // value: dataValues[fieldGroup._id][keys[0]].value, - // order: field.order, - // rules: field.rules, - // visible: field.visible, - // group: field.group, - // description: field.description - // });debugger; - // newfldGroup.groupFields.push(newfield); - // } - // } - - - - - }); - - newfldGroup.title = fieldGroup.title.__cdata; - newfldGroup.key = fieldGroup._id; - newfldGroup.section = fieldGroup._section; - newfldGroup.style = fieldGroup.visible._style; - newfldGroup.class = fieldGroup.visible._cssclass; - newfldGroup.page = fieldGroup._page; - groups.push(newfldGroup) - }); - } - - else { - let newfldGroup = new GroupBase(); - newfldGroup.groupFields = new Array(); - fields.forEach(field => { //for one fieldgroup, because xml to json transformation doesn't create array of one fieldfroup - if (fieldGroups._id == field.group) { - newfldGroup.groupFields.push(field); - } else - this.dataModel.fields.push(field); - }); - newfldGroup.title = fieldGroups.title.__cdata; - newfldGroup.key = fieldGroups._id; - newfldGroup.section = fieldGroups._section; - groups.push(newfldGroup) - } - return groups; - } - - addAttributesToFields(attr, functions, fields, multiplicity){ - - let newAttribute = new Attribute(); - newAttribute.datatype = attr._datatype; - newAttribute.defaultValue = attr.defaultValue._value; - newAttribute.id = attr._id; - newAttribute.multiplicityMax = attr.multiplicity._max; - newAttribute.multiplicityMin = attr.multiplicity._min; - newAttribute.ordinal = attr._ordinal - if (multiplicity){ - fields.find(x => x.key == newAttribute.id).order = fields.find(x => x.key == newAttribute.id).order +'.'+ newAttribute.ordinal; - fields.find(x => x.key == newAttribute.id).multiplicity = true; - } - newAttribute.ordinal = attr._ordinal; - newAttribute.sources = new Array(); - newAttribute.validation = new Array(); - //newAttribute.validation.push(attr.validation.rule); - //-----------------Sources--------------------------------------------------------------- - if (attr.sources) { - newAttribute.sources.push(attr.sources.source); - if (attr.sources.source.length != undefined) { - for (var i = 0; i < attr.sources.source.length; i++) { - if (attr.sources.source[i]._type == "url") { - newAttribute.url = attr.sources.source[i].value._value; - break; - } - } - } - if (attr.sources.source._type == "url") { - newAttribute.url = attr.sources.source.value._value; - } - } - //-----------Rules------------------------------------------------------------------------ - if(attr.validation.rule != undefined) - if (attr.validation.rule.length) - for (var i = 0, len = attr.validation.rule.length; i < len; i++) { - let rule = new Rule(); - rule.ruleStyle = attr.validation.rule[i]._ruleStyle; - rule.ruleType = attr.validation.rule[i]._type; - if (attr.validation.rule[i]._ruleStyle == "regex") - rule.regex = attr.validation.rule[i].__cdata; - if (attr.validation.rule[i]._ruleStyle == "customValidation") { - rule.method = attr.validation.rule[i]._method; - functions.forEach(fnc => { - if (fnc._id == rule.method) - rule.methodJs = fnc.script.__cdata; - }); - } - newAttribute.validation.push(rule); - } - else { - if (attr.validation.rule) { - let rule = new Rule(); - rule.ruleStyle = attr.validation.rule._ruleStyle; - rule.ruleType = attr.validation.rule._type; - if (attr.validation.rule._ruleStyle == "regex") - rule.regex = attr.validation.rule.__cdata; - if (attr.validation.rule._ruleStyle == "customValidation") { - rule.method = attr.validation.rule._method; - functions.forEach(fnc => { - if (fnc._id == rule.method) - rule.methodJs = fnc.__cdata; - }); - } - newAttribute.validation.push(rule); } - } - - - - fields.sort((a, b) => a.order - b.order); - - return newAttribute; - } - - private getFieldsAttributes(fieldsets: any, functions: any, fields: any[]) { - let attribute: Attribute[] = []; - let newAttribute = new Attribute(); - let multiplicityParam = false; - fieldsets.forEach(fieldset => { - let multiplicityParam = false; - if (fieldset.fields.field.length){ - if(fieldset.multiplicity._max >1 || fieldset.multiplicity._max == "n") - multiplicityParam = true; - fieldset.fields.field.forEach(fieldAttribute=>{ - newAttribute = this.addAttributesToFields(fieldAttribute, functions, fields, multiplicityParam) - attribute.push(newAttribute); - if (newAttribute.url !== undefined) - fields.find(x => x.key == newAttribute.id).url = newAttribute.url; - fields.find(x => x.key == newAttribute.id).attributes.sources = newAttribute.sources; - fields.find(x => x.key == newAttribute.id).attributes.validation = newAttribute.validation; - }) - }else{ - if(fieldset.multiplicity._max >1 || fieldset.multiplicity._max == "n") - multiplicityParam = true; - newAttribute = this.addAttributesToFields(fieldset.fields.field, functions, fields, multiplicityParam) - attribute.push(newAttribute); - if (newAttribute.url !== undefined) - fields.find(x => x.key == newAttribute.id).url = newAttribute.url; - fields.find(x => x.key == newAttribute.id).attributes.sources = newAttribute.sources; - fields.find(x => x.key == newAttribute.id).attributes.validation = newAttribute.validation; - } - }); - return attribute; - - } - - private getSections(sections: any, fieldGroups: GroupBase[]) { - let sects: Section[] = []; - - if (sections.length) { - sections.forEach(section => { - let newSection = new Section(); - newSection.defaultVisibility = section.defaultVisibility; - newSection.description = section.description; - newSection.id = section._id; - newSection.title = section.title; - newSection.ordinal = section._ordinal; - newSection.page = section._page; - newSection.groupFields = new Array(); - fieldGroups.forEach(fldgroup => { - if (fldgroup.section == newSection.id) - newSection.groupFields.push(fldgroup); - }) - sects.push(newSection); - }); - } - sects.sort((a, b) => a.ordinal - b.ordinal); - return sects; - } - - - checkDuplicateInObject(propertyName, inputArray) { - let DuplicateArray = []; - inputArray.forEach(item => { - for(var i=0; i): Observable { + return this.http.post(this.actionUrl + 'userDmps', criteria, { headers: this.headers }); + } + + public getAvailableProfiles(criteria: RequestItem): Observable { + return this.http.post(this.actionUrl + 'getAvailableProfiles/', criteria, { headers: this.headers }); + } + + public getSingle(id:String): Observable { + return this.http.get(this.actionUrl + 'getSingle/'+id,{ headers: this.headers }); + } + + createDataset(datasetModel: DatasetWizardModel): Observable { + return this.http.post(this.actionUrl + 'createOrUpdate', datasetModel, { headers: this.headers }); + } + + public saveDataset(datasetId:String, formValue){ + return this.http.post(HostConfiguration.Server +'datasetprofile/save/'+datasetId, formValue, { headers: this.headers }) + } +} diff --git a/dmp-frontend/src/app/services/dataset/dataset.service.ts b/dmp-frontend/src/app/services/dataset/dataset.service.ts new file mode 100644 index 000000000..09574da64 --- /dev/null +++ b/dmp-frontend/src/app/services/dataset/dataset.service.ts @@ -0,0 +1,33 @@ +import 'rxjs/add/operator/map'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { HostConfiguration } from './../../app.constants'; +import { BaseHttpService } from '../../utilities/cite-http-service-module/base-http.service'; +import { Observable } from 'rxjs/Observable'; +import { DataTableRequest } from '../../models/data-table/DataTableRequest'; +import { DataTableData } from '../../models/data-table/DataTableData'; +import { DatasetListingModel } from '../../models/datasets/DatasetListingModel'; +import { DatasetModel } from '../../models/datasets/DatasetModel'; +import { DatasetCriteria } from '../../models/criteria/dataset/DatasetCriteria'; + + +@Injectable() +export class DatasetService { + + private actionUrl: string; + private headers: HttpHeaders; + + constructor(private http: BaseHttpService) { + + this.actionUrl = HostConfiguration.Server + 'datasets/'; + + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } + + getPaged(dataTableRequest: DataTableRequest): Observable> { + return this.http.post>(this.actionUrl + 'getPaged', dataTableRequest, { headers: this.headers }); + } + +} diff --git a/dmp-frontend/src/app/services/eestore.service.ts b/dmp-frontend/src/app/services/eestore.service.ts deleted file mode 100644 index 904b8080c..000000000 --- a/dmp-frontend/src/app/services/eestore.service.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Component, Input, OnInit, AfterViewChecked, ViewChild, Injectable } from '@angular/core'; - -import {RestBase} from './rest-base'; - - -@Injectable() -export class EestoreService implements OnInit { - - base: string = "https://eestore.paas2.uninett.no/api/"; - - datarepo: string = this.base+"datarepo/"; - projectrepo: string = this.base+"projectrepo/"; - organizationrepo: string = this.base+"organizationrepo/"; - metadataschemarepo: string = this.base+"metadataschemarepo/"; - servicerepo: string = this.base+"servicerepo/"; - personrepo: string = this.base+"personrepo/"; - config: string = this.base+"config/"; - configtags: string = this.base+"configtags/"; - - - constructor(public restBase: RestBase) { - } - - ngOnInit(){ - - } - - - getDataRepos(){ - return this.restBase.proxy_get(this.datarepo); - } - - getProjectRepos(){ - return this.restBase.proxy_get(this.projectrepo); - } - - getOrganizationRepos(){ - return this.restBase.proxy_get(this.organizationrepo); - } - - getMetadataSchemaRepos(){ - return this.restBase.proxy_get(this.metadataschemarepo); - } - - getServiceRepos(){ - return this.restBase.proxy_get(this.servicerepo); - } - - getPersonRepos(){ - return this.restBase.proxy_get(this.personrepo); - } - - getConfigs(){ - return this.restBase.proxy_get(this.config); - } - - getConfigTags(){ - return this.restBase.proxy_get(this.configtags); - } - -} \ No newline at end of file diff --git a/dmp-frontend/src/app/services/external-dataset/external-dataset.service.ts b/dmp-frontend/src/app/services/external-dataset/external-dataset.service.ts new file mode 100644 index 000000000..0bf377306 --- /dev/null +++ b/dmp-frontend/src/app/services/external-dataset/external-dataset.service.ts @@ -0,0 +1,44 @@ +import { ProjectCriteria } from '../../models/criteria/project/ProjectCriteria'; +import { RequestItem } from '../../models/criteria/RequestItem'; +import { ExternalDatasetModel } from '../../models/external-dataset/ExternalDatasetModel'; +import { DataTableData } from '../../models/data-table/DataTableData'; +import { ExternalDatasetCriteria } from '../../models/criteria/external-dataset/ExternalDatasetCriteria'; +import { DataTableRequest } from '../../models/data-table/DataTableRequest'; +import { Injectable } from '@angular/core'; +import { HttpHeaders } from '@angular/common/http'; +import { BaseHttpService } from '../../utilities/cite-http-service-module/base-http.service'; +import { HostConfiguration } from './../../app.constants'; +import { Observable } from 'rxjs/Observable'; + + +@Injectable() +export class ExternalDatasetService { + + private actionUrl: string; + private headers: HttpHeaders; + + constructor(private http: BaseHttpService) { + + this.actionUrl = HostConfiguration.Server + 'externaldatasets/'; + + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } + + getPaged(dataTableRequest: DataTableRequest): Observable> { + return this.http.post>(this.actionUrl + 'getPaged', dataTableRequest, { headers: this.headers }); + } + + /* get(requestItem: RequestItem): Observable { + return this.http.post(this.actionUrl + 'get', requestItem, { headers: this.headers }); + }*/ + + getWithExternal(requestItem: RequestItem): Observable { + return this.http.post(this.actionUrl + 'getWithExternal', requestItem, { headers: this.headers }); + } + + getSingle(id: string): Observable { + return this.http.get(this.actionUrl + 'getSingle/' + id, { headers: this.headers }); + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/services/external-sources/external-sources.service.ts b/dmp-frontend/src/app/services/external-sources/external-sources.service.ts new file mode 100644 index 000000000..6a9a37425 --- /dev/null +++ b/dmp-frontend/src/app/services/external-sources/external-sources.service.ts @@ -0,0 +1,53 @@ +import 'rxjs/add/operator/map'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { HostConfiguration } from './../../app.constants'; +import { BaseHttpService } from '../../utilities/cite-http-service-module/base-http.service'; +import { Observable } from 'rxjs/Observable'; +import { ExternalSourcesItemModel } from '../../models/external-sources/ExternalSourcesItemModel'; + + +@Injectable() +export class ExternalSourcesService { + + private actionUrl: string; + private headers: HttpHeaders; + + constructor(private http: BaseHttpService) { + + this.actionUrl = HostConfiguration.Server + 'external/'; + + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } + + public searchDatasetRegistry(like: string): Observable { + return this.http.get(this.actionUrl + "registries" + "?query=" + like, { headers: this.headers }); + } + + public searchDatasetRepository(like: string): Observable { + return this.http.get(this.actionUrl + "datarepos" + "?query=" + like, { headers: this.headers }); + } + + public searchDatasetService(like: string): Observable { + return this.http.get(this.actionUrl + "services" + "?query=" + like, { headers: this.headers }); + } + + public searchDatasetSExternalDatasetservice(like: string): Observable { + return this.http.get(this.actionUrl + "datasets" + "?query=" + like, { headers: this.headers }); + } + + public searchDMPResearchers(like: string): Observable { + return this.http.get(this.actionUrl + "researchers" + "?query=" + like, { headers: this.headers }); + } + + public searchDMPOrganizations(like: string): Observable { + return this.http.get(this.actionUrl + "organisations" + "?query=" + like, { headers: this.headers }); + } + + public searchDMPProfiles(like: string): Observable { + return this.http.get(this.actionUrl + "datasetprofiles/get" + "?query=" + like, { headers: this.headers }); + } + +} diff --git a/dmp-frontend/src/app/services/field-control.service.ts b/dmp-frontend/src/app/services/field-control.service.ts deleted file mode 100644 index bbf62148f..000000000 --- a/dmp-frontend/src/app/services/field-control.service.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Injectable } from '@angular/core'; -import { FormControl, FormGroup, Validators } from '@angular/forms'; - -import { FieldBase } from '../../app/form/fields/field-base'; -import { GroupBase } from '../form/dynamic-form-group/group-base'; - -@Injectable() -export class FieldControlService { - constructor(){ } - - - toFormGroup(fields: FieldBase[], groups: GroupBase[]){ - - let form: any = {}; - - groups.forEach(group => { - let subgroup: any = {}; - let subgroupFieldset: any = {}; - let fieldset: boolean = false; - group.groupFields.forEach(field => { - //if(field.attributes.validation != undefined) - // field.attributes.validation.forEach(val => { - // if (val.ruleStyle.toString()=="existence"){ - // field.required = true; - // } - // if (val.ruleStyle.toString()=="regex"){ - // field.regex = val.regex; - // } - // }); - subgroup[field.key] = field.required ? new FormControl(field.value || '', Validators.required) : new FormControl(field.value || '') - - if (group.compositeFields!=undefined){ - fieldset = true; - group.compositeFields.groupFields.forEach(field => { - //subgroupFieldset[field.key] = field.required ? new FormControl(field.value || '', Validators.required) : new FormControl(field.value || '') - subgroup[field.key] = field.required ? new FormControl(field.value || '', Validators.required) : new FormControl(field.value || ''); - }); - } - }); - - - //PLEASE CHANGE THE group.key TO BE SAME AS THE ONE ON THE DYNAMIC-FORM-GROUP-COMPONENT.html - if (fieldset){ - //subgroup["FieldSet"+ group.key] = form[group.key] = new FormGroup(subgroupFieldset); - form[group.key] = new FormGroup(subgroup); - } - - else - form[group.key] = new FormGroup(subgroup); - //console.log("FORM_GROUP_GROUP: "); - //console.log(form); - }); - //add also the spare fields into the form - fields.forEach(field => { - form[field.key] = field.required ? new FormControl(field.value || '', Validators.required) : new FormControl(field.value || '') - }); - - //console.log("FORM_GROUP: "); - //console.log(form); - return new FormGroup(form); - } - - -} \ No newline at end of file diff --git a/dmp-frontend/src/app/services/global-variables.service.ts b/dmp-frontend/src/app/services/global-variables.service.ts deleted file mode 100644 index 80fba05f4..000000000 --- a/dmp-frontend/src/app/services/global-variables.service.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Injectable, Inject} from '@angular/core'; -import { Observable } from 'rxjs'; -import {LocalStorageService} from 'ngx-webstorage'; -import 'rxjs/add/operator/map'; -import { DOCUMENT } from '@angular/platform-browser'; - - -@Injectable() -export class GlobalVariables { - - constructor (private storage : LocalStorageService, @Inject(DOCUMENT) private document) { - - } - - - - getFormHasPaging() : boolean{ - return this.storage.retrieve('form-paging-flag'); - } - - setFormHasPaging(formHasPaging : boolean){ - this.storage.store('form-paging-flag',formHasPaging); - } - - - -} - - diff --git a/dmp-frontend/src/app/services/interceptor.ts b/dmp-frontend/src/app/services/interceptor.ts deleted file mode 100644 index 58f0f5b64..000000000 --- a/dmp-frontend/src/app/services/interceptor.ts +++ /dev/null @@ -1,33 +0,0 @@ -import {Injectable} from '@angular/core'; -import {Observable} from 'rxjs/Observable'; -import {HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse, HttpErrorResponse} from '@angular/common/http'; -import { TokenService, TokenProvider } from './login/token.service'; -import {Router} from '@angular/router'; - -@Injectable() -export class GlobalInterceptor implements HttpInterceptor { - - constructor(public tokenService: TokenService, private router : Router) {} - - intercept(req: HttpRequest, next: HttpHandler): Observable> { - - return next.handle(req).do((event: HttpEvent) => { - /* - if (event instanceof HttpResponse) { - console.log("response ok"); - } - */ - }, (err: any) => { - if (err instanceof HttpErrorResponse) { - if (err.status === 401) { - console.log("Received an unauthorized... redirecting to login page"); - this.tokenService.logout(); - this.router.navigate(['/login'], { queryParams: { /*returnUrl: this.state.url*/ }}); - } - } - }); - - - //return next.handle(req); - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/services/invitation/invitation.service.ts b/dmp-frontend/src/app/services/invitation/invitation.service.ts new file mode 100644 index 000000000..321c8d00d --- /dev/null +++ b/dmp-frontend/src/app/services/invitation/invitation.service.ts @@ -0,0 +1,37 @@ +import { Invitation } from '../../models/invitation/Invitation'; +import { UserInvitationCriteria } from '../../models/criteria/invitation/UserInvitationCriteria'; +import { User } from '../../models/invitation/User'; +import { HostConfiguration } from '../../app.constants'; +import { BaseHttpService } from '../../utilities/cite-http-service-module/base-http.service'; +import { Injectable } from "@angular/core"; +import { HttpHeaders } from '@angular/common/http'; +import { Observable } from 'rxjs/Observable'; +import { RequestItem } from '../../models/criteria/RequestItem'; + +@Injectable() +export class InvitationService { + + private actionUrl: string; + private headers: HttpHeaders; + + constructor(private http: BaseHttpService) { + + this.actionUrl = HostConfiguration.Server + 'invite/'; + + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } + + public inviteUsers(invitation: Invitation): Observable { + return this.http.post(this.actionUrl + "users", invitation, { headers: this.headers }); + } + + public getUsers(usersInvitationRequestItem: RequestItem): Observable { + return this.http.post(this.actionUrl + "getUsers", usersInvitationRequestItem, { headers: this.headers }); + } + + public exchange(id:String): Observable { + return this.http.get(this.actionUrl + "exchange/"+id, { headers: this.headers }); + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/services/login/native-login.service.ts b/dmp-frontend/src/app/services/login/native-login.service.ts deleted file mode 100644 index 5330defdd..000000000 --- a/dmp-frontend/src/app/services/login/native-login.service.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Injectable, OnInit } from '@angular/core'; -import { Observable } from 'rxjs'; -import { TokenService, TokenProvider } from '../login/token.service' -import { HttpClient , HttpHeaders, HttpParams} from '@angular/common/http'; -import {RestBase} from '../rest-base'; - -@Injectable() -export class NativeLoginService implements OnInit { - - - constructor(private restBase: RestBase) { - } - - ngOnInit(){ - - } - - - login(username, password){ - var credentials = {"username": username, "password":password}; - return this.restBase.login("nativeLogin", credentials); - } - - - -} - - - - - diff --git a/dmp-frontend/src/app/services/login/token.service.ts b/dmp-frontend/src/app/services/login/token.service.ts deleted file mode 100644 index 279093b0e..000000000 --- a/dmp-frontend/src/app/services/login/token.service.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Injectable, Inject} from '@angular/core'; -import { Observable } from 'rxjs'; -import {LocalStorageService} from 'ngx-webstorage'; -import {Router} from '@angular/router'; -import 'rxjs/add/operator/map'; -import { DOCUMENT } from '@angular/platform-browser'; - - -declare var jQuery : any; - -import '../../../assets/custom.js'; -declare function sign_out_google(): any; - -@Injectable() -export class TokenService { - - constructor (private storage : LocalStorageService, @Inject(DOCUMENT) private document, private router : Router) { - //var csrfToken : string = jQuery(document).find('meta[name="csrf-token"]').attr('content'); - //this.setCSRFToken(csrfToken); - } - - /* - getCSRFToken() : string{ - return this.storage.retrieve('csrf-token'); - } - - setCSRFToken(csrfToken : string){ - this.storage.store('csrf-token',csrfToken); - } -*/ - - getProvider() : TokenProvider { - return this.storage.retrieve('provider'); - } - - setProvider(provider : TokenProvider){ - this.storage.store('provider',provider); - } - - getToken() : string{ - return this.storage.retrieve('token'); - } - - setToken(token : string){ - this.storage.store('token',token); - } - - isLoggedIn(){ - return this.storage.retrieve('loggedIn'); - } - - setLoggedIn(boolStatus){ - this.storage.store('loggedIn',boolStatus); - } - - getEmail(){ - return this.storage.retrieve('email'); - } - - setEmail(email){ - this.storage.store('email',email); - } - - getUsername(){ - return this.storage.retrieve('username'); - } - - setUsername(username){ - this.storage.store('username',username); - } - - - login(token: string, provider: TokenProvider, username: string, email: string){ - - this.setLoggedIn(true); - this.setToken(token); - this.setProvider(provider); - this.setUsername(username); - this.setEmail(email); - - window.location.reload(); - - } - - - logout(){ - //set the log out actions here - this.setLoggedIn(false); - this.setEmail(null); - this.setUsername(null); - this.setToken(null); - - if(this.getProvider() == TokenProvider.google){ - sign_out_google(); - } - - this.setProvider(null); - - this.router.navigate(['/login'], { queryParams: { /*returnUrl: this.state.url*/ }}); - - //window.location.reload(); - } - - -} - -export enum TokenProvider { - native, - google -} diff --git a/dmp-frontend/src/app/services/project/project.service.ts b/dmp-frontend/src/app/services/project/project.service.ts new file mode 100644 index 000000000..b2b053c26 --- /dev/null +++ b/dmp-frontend/src/app/services/project/project.service.ts @@ -0,0 +1,54 @@ +import 'rxjs/add/operator/map'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { HostConfiguration } from './../../app.constants'; +import { BaseHttpService } from '../../utilities/cite-http-service-module/base-http.service'; +import { Observable } from 'rxjs/Observable'; +import { DataTableRequest } from '../../models/data-table/DataTableRequest'; +import { DataTableData } from '../../models/data-table/DataTableData'; +import { ProjectListingModel } from '../../models/projects/ProjectListingModel'; +import { ProjectModel } from '../../models/projects/ProjectModel'; +import { BaseHttpResponseModel } from '../../models/http/BaseHttpResponseModel'; +import { ProjectCriteria } from '../../models/criteria/project/ProjectCriteria'; +import { RequestItem } from '../../models/criteria/RequestItem'; + + +@Injectable() +export class ProjectService { + + private actionUrl: string; + private headers: HttpHeaders; + + constructor(private http: BaseHttpService) { + + this.actionUrl = HostConfiguration.Server + 'projects/'; + + this.headers = new HttpHeaders(); + this.headers = this.headers.set('Content-Type', 'application/json'); + this.headers = this.headers.set('Accept', 'application/json'); + } + + getPaged(dataTableRequest: DataTableRequest): Observable> { + return this.http.post>(this.actionUrl + 'getPaged', dataTableRequest, { headers: this.headers }); + } + + get(requestItem: RequestItem): Observable { + return this.http.post(this.actionUrl + 'get', requestItem, { headers: this.headers }); + } + + getWithExternal(requestItem: RequestItem): Observable { + return this.http.post(this.actionUrl + 'getWithExternal', requestItem, { headers: this.headers }); + } + + getSingle(id: string): Observable { + return this.http.get(this.actionUrl + 'getSingle/' + id, { headers: this.headers }); + } + + createProject(projectModel: ProjectModel): Observable { + return this.http.post(this.actionUrl + 'createOrUpdate', projectModel, { headers: this.headers }); + } + + inactivate(id: String): Observable { + return this.http.delete(this.actionUrl + 'inactivate/' + id, { headers: this.headers }); + } +} diff --git a/dmp-frontend/src/app/services/rest-base.ts b/dmp-frontend/src/app/services/rest-base.ts deleted file mode 100644 index 1d4bef211..000000000 --- a/dmp-frontend/src/app/services/rest-base.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { HttpClient , HttpHeaders, HttpParams } from '@angular/common/http'; -import { TokenService, TokenProvider } from './login/token.service' -import 'rxjs/Rx'; - - -declare var X2JS: any; - -export class RestBase { - - xml2jsonOBJ: any; - - static get parameters() { return [HttpClient, TokenService] } - - constructor(public http : HttpClient, public tokenService : TokenService) { - this.xml2jsonOBJ = new X2JS(); - } - - - - protocol: string = "http"; - hostname: string ="localhost" - port: number = 7070; - webappname: string = "dmp-backend"; - - /* - protocol: string = "http"; - hostname: string ="dl010.madgik.di.uoa.gr" - port: number = 8080; - webappname: string = "dmp-backend"; - */ - - - /* - protocol: string = "http"; - hostname: string = "dionysus.di.uoa.gr" ; - port: number = 8080; - webappname: string = "dmp-backend"; - */ - - - proxyPath : string = this.protocol+"://"+this.hostname+":"+this.port+"/"+this.webappname+"/proxy/"; - loginPath : string = this.protocol+"://"+this.hostname+":"+this.port+"/"+this.webappname+"/login/"; - restPath: string = this.protocol+"://"+this.hostname+":"+this.port+"/"+this.webappname+"/rest/"; - - - - - public proxy_get(path : string, params? : any){ - var options = this.createOptions(params); - return this.http.get(this.proxyPath +"proxy?url="+ path, options); - } - - public proxy_get_wQuery(path : string, query: string, params? : any){ - var options = this.createOptions(params); - var queryPart = (query) ? "?search="+query : ""; - return this.http.get(this.proxyPath +"proxy?url=" + path + queryPart, options); - } - - - public login(path : string, data : any){ - let options = { headers: new HttpHeaders().set('Content-Type', 'application/json') }; - return this.http.post(this.loginPath + path, JSON.stringify(data), options); - } - - public get(path : string, params? : any){ - var options = this.createOptions(params); - return this.http.get(this.restPath + path, options); - } - - - public post(path : string, data : any, params? : any){ - var options = this.createOptions(params); - return this.http.post(this.restPath + path, JSON.stringify(data), options); - } - - private createOptions(parameters : any){ - var token = this.tokenService.getToken(); - var provider: TokenProvider = this.tokenService.getProvider(); - - var params = new HttpParams(); - - if(parameters != null){ - Object.entries(parameters).forEach( entry => { - params = params.set(entry[0], entry[1]); - }); - } - - var headers; - if(provider == TokenProvider.google) - headers = new HttpHeaders().set('Content-Type', 'application/json').set("google-token", token); - if(provider == TokenProvider.native) - headers = new HttpHeaders().set('Content-Type', 'application/json').set("native-token", token); - let options = { params: params, headers: headers }; - return options; - } - - - -} - \ No newline at end of file diff --git a/dmp-frontend/src/app/services/server.service.ts b/dmp-frontend/src/app/services/server.service.ts deleted file mode 100644 index f035a6028..000000000 --- a/dmp-frontend/src/app/services/server.service.ts +++ /dev/null @@ -1,163 +0,0 @@ -import {Injectable, ReflectiveInjector, Injector} from '@angular/core'; -import {FieldBase} from '../../app/form/fields/field-base'; -import {JsonObjest} from '../../app/entities/JsonObject.class'; -import {dataModelBuilder} from '../../app/services/dataModelBuilder.service'; -import { DatasetProfile } from '../entities/datasetprofile'; -import {DataModel} from '../entities/DataModel'; -import {Project} from '../entities/model/project'; -import {RestBase} from './rest-base'; -import 'rxjs/Rx'; - -import './../../assets/xml2json.min.js'; -declare var X2JS: any; - -@Injectable() -export class ServerService { - - xml2jsonOBJ: any; - - constructor(private restBase: RestBase) { - this.xml2jsonOBJ = new X2JS(); - } - - - public listDatasetIDs(){ - return this.restBase.get("dataset"); - } - - public getAllDatasets(){ - return this.restBase.get("getAllDatasets"); - } - - public getAllDatasetIDs(datasetId: string){ - return this.restBase.get("dataset/"+datasetId); - } - - public getDatasetByID(datasetId: string){ - return this.restBase.get("datasets/"+datasetId); - } - - public setDataset(dataset){ - return this.restBase.post("dataset/update", dataset); - - } - - public getAllDmps(){ - return this.restBase.get("dmp/getAll"); - } - - public listDmpsLabelID(){ - return this.restBase.get("dmp/listDMPLabelID"); - } - - public getDmp(dmpid : string, eager? : boolean){ - if(eager) - return this.restBase.get("dmps/"+dmpid, {"eager": true}); - else - return this.restBase.get("dmps/"+dmpid, {"eager": true}); - } - - public listDmpIDs(){ - return this.restBase.get("dmps"); - } - - - public listProjectIDs(){ - return this.restBase.get("projects"); - } - - public getAllProjects(){ - return this.restBase.get("project/getAll"); - } - - public getProject(projectID : string){ - return this.restBase.get("projects/"+projectID); - } - - public listProjectsLabelID(){ - return this.restBase.get("project/listAllLabelIDs"); - } - - public listDmpsUser(){ - return this.restBase.get("dmp/listDMPLabelID"); - } - - public getProjectsOfUser(){ - return this.restBase.get("project/getofuser"); - } - - public createProject(data:any){ - return this.restBase.post("project/createofuser", data); - } - - public updateProject(data:any){ - return this.restBase.post("project/update", data); - } - - public getAllDataSet(){ - return this.restBase.get("dataset/getAll"); - } - - public getDmpOfUser(){ - return this.restBase.get("dmp/getofuser"); - } - - public createDmpForCurrentUser(data:any){ - return this.restBase.post("dmp/createofuser", data); - } - - public updateDmp(data:any){ - return this.restBase.post("dmp/update", data); - } - - public cloneDmp(data: any){ - return this.restBase.post("dmp/cloneforuser", data); - } - - public deleteDmp(dmp: any){ - return this.restBase.post("dmp/softdelete", dmp); - } - - public getDatasetForDmp(data:any){ - return this.restBase.post("dmp/getdatasets", data); -} - -public createDatasetForDmp(data:any){ - return this.restBase.post("dataset/create", data); -} - -public getAllDatsetsProfile(){ - return this.restBase.get("datasetprofile/getAll"); -} - -public getDatasetProfileByID(id){ - return this.restBase.get("datasetprofiles/"+id); -} - -public updateDatsetsProfile(data:any){ - return this.restBase.post("dataset/update", data); -} - -public deleteDataset(dataset: any){ - return this.restBase.post("dataset/softdelete", dataset); -} - -public whoami(){ - return this.restBase.get("user/whoami"); -} - - -/* - logOut() { - this.tokenService.logout(); - } -*/ - - getThroughProxy(url : string, query: string){ - return this.restBase.proxy_get_wQuery(url, query); - } - - - - -} \ No newline at end of file diff --git a/dmp-frontend/src/app/shared/components/autocomplete/AutoCompleteConfiguration.ts b/dmp-frontend/src/app/shared/components/autocomplete/AutoCompleteConfiguration.ts new file mode 100644 index 000000000..7dd457ec4 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/autocomplete/AutoCompleteConfiguration.ts @@ -0,0 +1,11 @@ +import { BaseCriteria } from "../../../models/criteria/BaseCriteria"; +import { RequestItem } from "../../../models/criteria/RequestItem"; + +export class AutoCompleteConfiguration { + public callback: Function; + public requestItem: RequestItem; + constructor(callback: Function, requestItem: RequestItem) { + this.callback = callback; + this.requestItem = requestItem; + } +} diff --git a/dmp-frontend/src/app/shared/components/autocomplete/autocomplete.component.html b/dmp-frontend/src/app/shared/components/autocomplete/autocomplete.component.html new file mode 100644 index 000000000..0db1d20f3 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/autocomplete/autocomplete.component.html @@ -0,0 +1,41 @@ + + + + + {{'GENERAL.VALIDATION.REQUIRED' | translate}} + {{errorString}} + + + + {{item[titleKey]}} + {{item[subtitleKey]}} + + + + \ No newline at end of file diff --git a/dmp-frontend/src/app/shared/components/autocomplete/autocomplete.component.scss b/dmp-frontend/src/app/shared/components/autocomplete/autocomplete.component.scss new file mode 100644 index 000000000..6e7ec5cf9 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/autocomplete/autocomplete.component.scss @@ -0,0 +1,30 @@ +.autocomplete-input { + width: 100%; +} + +.autocomplete-progress { + overflow: initial !important; +} + +.autocomplete { + mat-form-field { + width: 100%; + padding: 3px; + } + + .mat-card { + margin: 16px 0; + } + + .left-button { + float: left; + } +} + +.input-table { + table-layout: fixed; +} + +.full-width { + width: 100%; +} diff --git a/dmp-frontend/src/app/shared/components/autocomplete/autocomplete.component.ts b/dmp-frontend/src/app/shared/components/autocomplete/autocomplete.component.ts new file mode 100644 index 000000000..de25e16af --- /dev/null +++ b/dmp-frontend/src/app/shared/components/autocomplete/autocomplete.component.ts @@ -0,0 +1,171 @@ +import { any } from 'codelyzer/util/function'; +import { FormControl, FormGroupDirective, NgForm, FormGroup, FormBuilder } from '@angular/forms'; +import { Observable } from 'rxjs/Rx'; +import { setTimeout } from 'timers'; +import { Component, EventEmitter, Input, OnInit, Output, ViewChild, ElementRef } from '@angular/core'; +import 'rxjs/add/operator/debounceTime'; +import 'rxjs/add/operator/map'; +import { AutoCompleteConfiguration } from './AutoCompleteConfiguration'; +import { ErrorStateMatcher, MatInput } from '@angular/material'; + +@Component({ + selector: 'auto-complete', + templateUrl: './autocomplete.component.html', + styleUrls: ['./autocomplete.component.scss'] +}) +export class AutocompleteComponent implements OnInit { + @Input() + configuration: AutoCompleteConfiguration; + + @Input() + titleKey: String; + + @Input() + subtitleKey: String; + + @Input() + delay: number = 700; + + @Input() + placeholder: String; + + filteredItems: any[]; + + // @Input() + // validationErrorString: String; + + // public errorStateMatcher: AutoCompleteErrorStateMatcher = new AutoCompleteErrorStateMatcher(); + + @Input() + required: boolean; + + @Input() + disabled: boolean = false; + + // @Input() selectedDropdownItem: AutoCompleteItem; + // @Output() selectedDropdownItemChange = new EventEmitter(); + + // @Output() + // output: EventEmitter = new EventEmitter(); + + @Input() control: FormControl; + + // @Input() createNew = false; + // //term = new FormControl(); + // @Input() + // ClickFunctionCall: Function; + + loading = false; + hasSelectedItem = false; + + + constructor() { + + } + + ngOnInit() { + + const valueChanges = this.control.valueChanges.share(); + valueChanges.subscribe(searchTerm => { + if (this.hasSelectedItem) { + this.resetFormControlValue(); + }else{ + this.loading = true; + } + }); + valueChanges + .debounceTime(this.delay) + .distinctUntilChanged() + .switchMap(val => { + if (this.hasSelectedItem) { + this.loading = false; + return []; + } + + this.configuration.requestItem.criteria.like = this.control.value; + return this.configuration.callback(this.configuration.requestItem).map(result => { + this.filteredItems = (result) + this.loading = false; + }) + }).subscribe() + + // this.filteredItems = this.inputField.nativeElement.valueChanges.startWith(null) + // .debounceTime(this.delay) + // .finally(() => this.loading = false) + // .distinctUntilChanged() + // .switchMap(val => { + // this.configuration.requestItem.criteria.like = val; + // return this.configuration.callback(this.configuration.requestItem) + // }) + // const valueChanges = this.form.controls['text'].valueChanges.share(); + // valueChanges.subscribe(searchTerm => { + // this.loading = true; + // if (this.form.controls['value'].value) { + // this.resetFormGroupValue(); + // } + // }); + + // valueChanges + // .debounceTime(this.typeaheadMS) + // .subscribe(searchTerm => { + // if (typeof searchTerm === 'string') { + // this.inputOnChange(searchTerm) + // } + // }); + } + + resetFormControlValue() { + this.hasSelectedItem = false; + //this.control.setValue(null, { emitEvent: false }); + } + + // // listingItemToDropDown(item: DropdownListingItem): AutoCompleteItem { + // // return (item as DropdownListingItem).toDropdownList(); + // // } + + optionSelected(event: any) { + this.hasSelectedItem = true; + this.control.setValue(event.option.value, { emitEvent: false }); + this.filteredItems = [event.option.value]; + + //this.selectedDropdownItemChange.emit(event.option.value); + //this.form.updateValueAndValidity(); + //this.options = [event.option.value]; + //this.loading = false; + } + + // inputOnChange(term: string) { + // //this.form.patchValue({ value: null, description: '', text: '' }); + // //this.form.updateValueAndValidity(); + // this.configuration.criteria.like = term; + // this.configuration.callback(this.configuration.criteria) + // .map((res: any) => this.mapper(res)) + // .subscribe( + // (res: AutoCompleteItem[]) => { + // this.options = res; + // }, + // null, + // () => { this.loading = false }); + // } + + displayWith(value: any): String { + if (!value) return ''; + return value['' + this.titleKey]; + } + // displayFn(item: AutoCompleteItem): string { + // return item.text ? item.text : ''; + // } + + //fieldHasErrors(control: FormControl, form: FormGroupDirective | NgForm): boolean { + // return this.errorStateMatcher(control, form); + // } +} + +export class AutoCompleteErrorStateMatcher implements ErrorStateMatcher { + isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean { + const isFormSubmitted = form && form.submitted; + const isControlInvalid = control && control.invalid && (control.dirty || control.touched || isFormSubmitted); + const isFormInvalid = form && form.enabled && form.invalid && (form.dirty || form.touched || isFormSubmitted) + return !!(isControlInvalid || isFormInvalid); + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/shared/components/criteria/base/base-criteria.component.ts b/dmp-frontend/src/app/shared/components/criteria/base/base-criteria.component.ts new file mode 100644 index 000000000..b24a03f01 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/criteria/base/base-criteria.component.ts @@ -0,0 +1,41 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { FormControl, FormGroup, NgForm, FormArray, AbstractControl } from '@angular/forms'; +import { BaseCriteriaErrorModel } from '../../../../models/criteria/BaseCriteriaErrorModel'; + +@Component({ + selector: 'base-criteria-component', + template: '', + providers: [ + + ] +}) + +export class BaseCriteriaComponent implements OnInit { + + public refreshCallback: Function = null; + public baseErrorModel: BaseCriteriaErrorModel = new BaseCriteriaErrorModel(); + + constructor(baseErrorModel: BaseCriteriaErrorModel) { + this.baseErrorModel = baseErrorModel; + } + + ngOnInit() { + } + + setRefreshCallback(callback: Function): void { + this.refreshCallback = callback; + } + + public setErrorModel(errorModel: BaseCriteriaErrorModel) { + Object.keys(errorModel).forEach(item => { + (this.baseErrorModel)[item] = (errorModel)[item]; + }) + } + + public clearErrorModel() { + Object.keys(this.baseErrorModel).forEach(item => { + (this.baseErrorModel)[item] = ''; + }) + } + +} diff --git a/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.html b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.html new file mode 100644 index 000000000..924f02e6c --- /dev/null +++ b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.html @@ -0,0 +1,28 @@ +
+ +
+
+ + + {{baseErrorModel['Criteria.like']}} + +
+
+ + +
{{chip.label.substring(0, 1).toUpperCase()}}
+ {{chip.label}} +
+ +
+ {{option.label}} +
+
+ +
+
+
+
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.scss b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.scss new file mode 100644 index 000000000..0b6d2bc32 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.scss @@ -0,0 +1,10 @@ +.dmp-criteria { + mat-form-field { + padding-bottom: 5px; + width: 100%; + } + + mat-card { + padding-bottom: 0px; + } +} diff --git a/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts new file mode 100644 index 000000000..d9eaf4c07 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/criteria/data-management-plan/dmp-criteria.component.ts @@ -0,0 +1,79 @@ +import { TranslateService } from '@ngx-translate/core'; +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { BaseCriteriaComponent } from '../base/base-criteria.component'; +import { ValidationContext, Validation } from '../../../../utilities/validators/ValidationContext'; +import { BackendErrorValidator } from '../../../../utilities/validators/BackendErrorValidator'; +import { DataManagementPlanCriteria } from '../../../../models/criteria/data-management-plan/DataManagementPlanCriteria'; +import { DataManagementPlanCriteriaErrorModel } from '../../../../models/criteria/data-management-plan/DataManagementPlanCriteriaErrorModel'; +import { ProjectModel } from '../../../../models/projects/ProjectModel'; +import { ProjectService } from '../../../../services/project/project.service'; +import { ProjectCriteria } from '../../../../models/criteria/project/ProjectCriteria'; +import { RequestItem } from '../../../../models/criteria/RequestItem'; +import { create } from 'domain'; + +@Component({ + selector: 'app-dmp-criteria-component', + templateUrl: './dmp-criteria.component.html', + styleUrls: ['./dmp-criteria.component.scss'], + providers: [ProjectService] +}) + +export class DataManagementPlanCriteriaComponent extends BaseCriteriaComponent implements OnInit { + + public criteria: DataManagementPlanCriteria = new DataManagementPlanCriteria(); + filteringProjectsAsync: boolean = false; + filteredProjects: ProjectModel[]; + + constructor( + public language: TranslateService, + public projectService: ProjectService, + public formBuilder: FormBuilder + ) { + super(new DataManagementPlanCriteriaErrorModel()); + } + + ngOnInit() { + super.ngOnInit(); + if (this.criteria == null) { this.criteria = new DataManagementPlanCriteria(); } + } + + setCriteria(criteria: DataManagementPlanCriteria): void { + this.criteria = criteria; + } + + onCallbackError(error: any) { + this.setErrorModel(error.error); + } + + controlModified(): void { + this.clearErrorModel(); + if (this.refreshCallback != null && + (this.criteria.like == null || this.criteria.like.length == 0 || this.criteria.like.length > 2) + ) { + this.refreshCallback(); + } + } + + filterProjects(value: string): void { + + this.filteredProjects = undefined; + if (value) { + this.filteringProjectsAsync = true; + + let requestItem: RequestItem = new RequestItem(); + let criteria: ProjectCriteria = new ProjectCriteria(); + criteria.like = value; + requestItem.criteria = criteria; + this.projectService.get(requestItem).subscribe(items => { + this.filteredProjects = items; + this.filteringProjectsAsync = false; + + // this.filteredProjects = items.filter((filteredObj: any) => { + // return this.objectsModel ? this.objectsModel.indexOf(filteredObj) < 0 : true; + // }); + + }); + } + } +} diff --git a/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.html b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.html new file mode 100644 index 000000000..139fa0fce --- /dev/null +++ b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.html @@ -0,0 +1,43 @@ +
+ +
+ +
+ + + {{baseErrorModel['Criteria.like']}} + +
+
+ + + + {{status.viewValue}} + + + {{baseErrorModel['Criteria.status']}} + +
+
+
+
+ + \ No newline at end of file diff --git a/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.scss b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.scss new file mode 100644 index 000000000..4b97c8cfa --- /dev/null +++ b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.scss @@ -0,0 +1,10 @@ +.dataset-criteria { + mat-form-field { + padding-bottom: 5px; + width: 100%; + } + + mat-card { + padding-bottom: 0px; + } +} diff --git a/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.ts b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.ts new file mode 100644 index 000000000..fa15a6b09 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/criteria/datasets/datasets-criteria.component.ts @@ -0,0 +1,57 @@ +import { TranslateService } from '@ngx-translate/core'; +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { BaseCriteriaComponent } from '../base/base-criteria.component'; +import { ValidationContext, Validation } from '../../../../utilities/validators/ValidationContext'; +import { BackendErrorValidator } from '../../../../utilities/validators/BackendErrorValidator'; +import { DatasetCriteriaErrorModel } from '../../../../models/criteria/dataset/DatasetCriteriaErrorModel'; +import { DatasetCriteria } from '../../../../models/criteria/dataset/DatasetCriteria'; + +@Component({ + selector: 'app-datasets-criteria-component', + templateUrl: './datasets-criteria.component.html', + styleUrls: ['./datasets-criteria.component.scss'], + providers: [ + ] +}) + +export class DatasetCriteriaComponent extends BaseCriteriaComponent implements OnInit { + + // public form: ProjectType; + // public formStatus: ProjectStatus; + public criteria: DatasetCriteria= new DatasetCriteria(); + + statuses = [ + {value: '0', viewValue: 'Active'}, + {value: '1', viewValue: 'Inactive'} + ]; + + constructor( + public language: TranslateService, + public formBuilder: FormBuilder + ) { + super(new DatasetCriteriaErrorModel()); + } + + ngOnInit() { + super.ngOnInit(); + if (this.criteria == null) { this.criteria = new DatasetCriteria(); } + } + + setCriteria(criteria: DatasetCriteria): void { + this.criteria = criteria; + } + + onCallbackError(error: any) { + this.setErrorModel(error.error); + } + + controlModified(): void { + this.clearErrorModel(); + if (this.refreshCallback != null && + (this.criteria.like == null || this.criteria.like.length == 0 || this.criteria.like.length > 2) + ) { + this.refreshCallback(); + } + } +} diff --git a/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html new file mode 100644 index 000000000..6ea508acc --- /dev/null +++ b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.html @@ -0,0 +1,32 @@ +
+ +
+
+ + + {{baseErrorModel['criteria.like']}} + +
+
+ + + + + + {{baseErrorModel['criteria.periodStart']}} + +
+
+ + + {{baseErrorModel['criteria.periodEnd']}} + + + +
+
+
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.scss b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.scss new file mode 100644 index 000000000..128b8021f --- /dev/null +++ b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.scss @@ -0,0 +1,10 @@ +.project-criteria { + mat-form-field { + padding-bottom: 5px; + width: 100%; + } + + mat-card { + padding-bottom: 0px; + } +} diff --git a/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.ts b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.ts new file mode 100644 index 000000000..b2f025338 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/criteria/projects/projects-criteria.component.ts @@ -0,0 +1,52 @@ +import { TranslateService } from '@ngx-translate/core'; +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms'; +import { BaseCriteriaComponent } from '../base/base-criteria.component'; +import { ValidationContext, Validation } from '../../../../utilities/validators/ValidationContext'; +import { BackendErrorValidator } from '../../../../utilities/validators/BackendErrorValidator'; +import { ProjectCriteria } from '../../../../models/criteria/project/ProjectCriteria'; +import { ProjectCriteriaErrorModel } from '../../../../models/criteria/project/ProjectCriteriaErrorModel'; + +@Component({ + selector: 'app-projects-criteria-component', + templateUrl: './projects-criteria.component.html', + styleUrls: ['./projects-criteria.component.scss'], + providers: [ + ] +}) + +export class ProjectCriteriaComponent extends BaseCriteriaComponent implements OnInit { + + // public form: ProjectType; + // public formStatus: ProjectStatus; + public criteria: ProjectCriteria = new ProjectCriteria(); + + constructor( + public language: TranslateService, + public formBuilder: FormBuilder + ) { + super(new ProjectCriteriaErrorModel()); + } + + ngOnInit() { + super.ngOnInit(); + if (this.criteria == null) { this.criteria = new ProjectCriteria(); } + } + + setCriteria(criteria: ProjectCriteria): void { + this.criteria = criteria; + } + + onCallbackError(error: any) { + this.setErrorModel(error.error); + } + + controlModified(): void { + this.clearErrorModel(); + if (this.refreshCallback != null && + (this.criteria.like == null || this.criteria.like.length == 0 || this.criteria.like.length > 2) + ) { + this.refreshCallback(); + } + } +} diff --git a/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.css b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.css new file mode 100644 index 000000000..3f58a46b3 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.css @@ -0,0 +1,64 @@ +.figure-card { + display: inline-block; + position: relative; + width: 100%; + margin: 25px 0; +} + +.card-content { + text-align: right; + padding: 15px 20px 13px 20px; +} + +.card-header { + float: left; + text-align: center; + /*background: linear-gradient(60deg, #ffa726, #fb8c00);*/ + /*box-shadow: 0 4px 20px 0 rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(255, 152, 0, 0.4);*/ + margin: -20px 15px 0; + border-radius: 3px; + padding: 15px; + position: relative; +} + +.card-header i { + font-size: 36px; + line-height: 56px; + width: 56px; + height: 56px; + color: #fff; +} + +.category { + color: #999; +} + +.card-footer { + margin: 0 20px 10px; + padding-top: 10px; + border-top: 1px solid #eee; + color: #999; + font-size: 12px; + position: relative; +} + +.card-footer i { + font-size: 16px; + position: relative; + top: 4px; + color: #999; +} + +.card { + padding: 25px 20px 20px 20px; + display: flex; + flex-direction: column; + align-items: center; +} + +.card { + box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.14); + border-radius: 6px; + color: rgba(0, 0, 0, 0.87); + background: #fff; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.html b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.html new file mode 100644 index 000000000..70143615a --- /dev/null +++ b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.html @@ -0,0 +1,13 @@ +
+
+ {{ headerIcon }} +
+
+

{{ category }}

+

{{ title }}

+
+ +
+ \ No newline at end of file diff --git a/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.ts b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.ts new file mode 100644 index 000000000..eeac73093 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/figurecard/figurecard.component.ts @@ -0,0 +1,29 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { Router } from '@angular/router'; + +@Component({ + selector: 'app-figurecard', + templateUrl: './figurecard.component.html', + styleUrls: ['./figurecard.component.css'] +}) +export class FigurecardComponent implements OnInit { + @Input() headerIcon: string; + @Input() category: string; + @Input() title: string; + @Input() footerIcon: string; + @Input() footContent: string; + @Input() linearColor: string; + @Input() boxShadow: string; + @Input() routelLink: string; + + constructor(private router:Router) { } + + ngOnInit() { + } + + navigateToUrl(){ + this.router.navigate([this.routelLink]); + + } + +} diff --git a/dmp-frontend/src/app/shared/components/navigation/navigation.component.css b/dmp-frontend/src/app/shared/components/navigation/navigation.component.css new file mode 100644 index 000000000..b3396c2cc --- /dev/null +++ b/dmp-frontend/src/app/shared/components/navigation/navigation.component.css @@ -0,0 +1,22 @@ +.navbar-icon { + padding: 0 14px; +} + +.navbar-spacer { + flex: 1 1 auto; +} + +.navbar-button { + text-transform: uppercase; +} + +.user-label { + padding: 0 0 0 5px; + font-size: 14px; +} + +.app-title { + color: inherit; + text-decoration: none; + padding-right: 15px; +} diff --git a/dmp-frontend/src/app/shared/components/navigation/navigation.component.html b/dmp-frontend/src/app/shared/components/navigation/navigation.component.html new file mode 100644 index 000000000..ddfe5a96b --- /dev/null +++ b/dmp-frontend/src/app/shared/components/navigation/navigation.component.html @@ -0,0 +1,15 @@ + + {{'NAV-BAR.TITLE' | translate}} +
+ + + +
+ +
+ {{this.getPrincipalName()}} + +
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/shared/components/navigation/navigation.component.ts b/dmp-frontend/src/app/shared/components/navigation/navigation.component.ts new file mode 100644 index 000000000..6c102943e --- /dev/null +++ b/dmp-frontend/src/app/shared/components/navigation/navigation.component.ts @@ -0,0 +1,42 @@ +import { Component } from '@angular/core'; +import { Principal } from '../../../models/login/Principal'; +import { AuthService } from '../../../services/auth/auth.service'; + +@Component({ + selector: 'app-navigation', + templateUrl: 'navigation.component.html', + styleUrls: ['./navigation.component.css'] +}) + +export class NavigationComponent { + invert = false; + + constructor(private authentication: AuthService) { + + } + + public logout(): void { + this.authentication.logout(); + } + + public isAuthenticated(): boolean { + return !(!this.authentication.current()) + } + + public isAdmin(): boolean { + if (!this.authentication.current()) { return false } + const principalRoles = this.authentication.current().appRoles; + for (let i = 0; i < principalRoles.length; i++) { + if (principalRoles[i] === Principal.AppRole.Admin) { + return true; + } + } + return false; + } + + public getPrincipalName(): string { + const principal: Principal = this.authentication.current(); + if (principal) { return principal.name; } + return ''; + } +} diff --git a/dmp-frontend/src/app/shared/components/notificaiton/snack-bar-notification.component.html b/dmp-frontend/src/app/shared/components/notificaiton/snack-bar-notification.component.html new file mode 100644 index 000000000..bd62cd6d1 --- /dev/null +++ b/dmp-frontend/src/app/shared/components/notificaiton/snack-bar-notification.component.html @@ -0,0 +1 @@ +{{message}} \ No newline at end of file diff --git a/dmp-frontend/src/app/shared/components/notificaiton/snack-bar-notification.component.ts b/dmp-frontend/src/app/shared/components/notificaiton/snack-bar-notification.component.ts new file mode 100644 index 000000000..1e3eedbcc --- /dev/null +++ b/dmp-frontend/src/app/shared/components/notificaiton/snack-bar-notification.component.ts @@ -0,0 +1,20 @@ +import { TranslateService } from '@ngx-translate/core'; +import { Component, Inject } from '@angular/core'; +import { MAT_SNACK_BAR_DATA } from '@angular/material'; +@Component({ + selector: 'snack-bar-notification', + templateUrl: 'snack-bar-notification.component.html' +}) + +export class SnackBarNotificationComponent { + message: string; + constructor( @Inject(MAT_SNACK_BAR_DATA) public data: any) { + this.parseMessage(data.message, data.language); + } + + parseMessage(message: any, language: TranslateService): void { + language.get(message).subscribe((value: string) => { + this.message = value; + }); + } +} diff --git a/dmp-frontend/src/app/shared/material/material.module.ts b/dmp-frontend/src/app/shared/material/material.module.ts new file mode 100644 index 000000000..8ad5b2e9b --- /dev/null +++ b/dmp-frontend/src/app/shared/material/material.module.ts @@ -0,0 +1,85 @@ +import { NgModule } from '@angular/core'; +import { + MatToolbarModule, + MatIconModule, + MatSidenavModule, + MatButtonModule, + MatTableModule, + MatPaginatorModule, + MatSortModule, + MatDialogModule, + MatDatepickerModule, + MatNativeDateModule, + MatInputModule, + MatFormFieldModule, + MatSnackBarModule, + MatAutocompleteModule, + MatExpansionModule, + MatSelectModule, + MatOptionModule, + MatCardModule, + MatProgressBarModule, + MatProgressSpinnerModule, + DateAdapter, + MatTooltipModule, + MatCheckboxModule, + MatTabsModule, + MatStepperModule, + MatRadioModule, + MatMenuModule +} from '@angular/material'; +import { CdkTableModule } from '@angular/cdk/table'; +import { SnackBarNotificationComponent } from '../components/notificaiton/snack-bar-notification.component'; +import { CovalentLayoutModule, CovalentChipsModule, CovalentDialogsModule } from '@covalent/core'; + +@NgModule({ + imports: [ + ], + + exports: [ + MatToolbarModule, + MatIconModule, + MatSidenavModule, + MatButtonModule, + MatTableModule, + MatPaginatorModule, + CdkTableModule, + MatSortModule, + MatDialogModule, + MatDatepickerModule, + MatNativeDateModule, + MatInputModule, + MatFormFieldModule, + MatSnackBarModule, + MatAutocompleteModule, + MatExpansionModule, + MatSelectModule, + MatOptionModule, + MatCardModule, + MatProgressBarModule, + MatProgressSpinnerModule, + MatTooltipModule, + MatCheckboxModule, + MatTabsModule, + CovalentLayoutModule, + CovalentChipsModule, + CovalentDialogsModule, + MatStepperModule, + MatRadioModule, + MatMenuModule + ], + + providers: [ + //{ provide: DateAdapter, useClass: LocalizedDateAdapter }, + ], + + entryComponents: [ + SnackBarNotificationComponent + ] +}) + +export class MaterialModule { + // constructor(dateAdapter: DateAdapter) { + // dateAdapter.setLocale('el-GR'); + // } +} diff --git a/dmp-frontend/src/app/shared/shared.module.ts b/dmp-frontend/src/app/shared/shared.module.ts new file mode 100644 index 000000000..9c0afda68 --- /dev/null +++ b/dmp-frontend/src/app/shared/shared.module.ts @@ -0,0 +1,42 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { NavigationComponent } from './components/navigation/navigation.component'; +import { SnackBarNotificationComponent } from './components/notificaiton/snack-bar-notification.component'; +import { MaterialModule } from './material/material.module'; +import { TranslateModule } from '@ngx-translate/core'; +import { ProjectCriteriaComponent } from './components/criteria/projects/projects-criteria.component'; +import { DatasetCriteriaComponent } from './components/criteria/datasets/datasets-criteria.component'; +import { FormsModule } from '@angular/forms'; +import { DataManagementPlanCriteriaComponent } from './components/criteria/data-management-plan/dmp-criteria.component'; + +@NgModule({ + imports: [ + CommonModule, + RouterModule, + MaterialModule, + TranslateModule, + FormsModule + ], + + declarations: [ + NavigationComponent, + SnackBarNotificationComponent, + ProjectCriteriaComponent, + DatasetCriteriaComponent, + DataManagementPlanCriteriaComponent + ], + + exports: [ + MaterialModule, + NavigationComponent, + SnackBarNotificationComponent, + ProjectCriteriaComponent, + DatasetCriteriaComponent, + DataManagementPlanCriteriaComponent + ], + entryComponents: [ + ] +}) + +export class SharedModule { } diff --git a/dmp-frontend/src/app/tabs/tab.module.ts b/dmp-frontend/src/app/tabs/tab.module.ts deleted file mode 100644 index 14bc91ec0..000000000 --- a/dmp-frontend/src/app/tabs/tab.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import {DataTableModule } from 'angular-4-data-table-bootstrap-4'; - -import { TabComponent } from './tabs.component'; - -import { TabRoutingModule } from './tabs-routing.module'; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - TabRoutingModule, - DataTableModule - ], - declarations: [ - TabComponent - ], - providers: [ ] -}) -export class TabModule {} \ No newline at end of file diff --git a/dmp-frontend/src/app/tabs/tabs-routing.module.ts b/dmp-frontend/src/app/tabs/tabs-routing.module.ts deleted file mode 100644 index e7f07ee79..000000000 --- a/dmp-frontend/src/app/tabs/tabs-routing.module.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; - -import { TabComponent } from './tabs.component'; -import { AuthGuard } from '../guards/auth.guard'; -import { ProjectsComponent } from '../projects/projects.component'; -import { DmpComponent } from '../dmps/dmp.component'; - -const tabsRoutes: Routes = [ - { - path: 'tabs', component: TabComponent, canActivate: [AuthGuard], - children: [ - { - path: 'projects', - component: ProjectsComponent - }, - { - path: 'dmps', - component: DmpComponent - } - ] - }, - { path: 'tabs/projects', component: ProjectsComponent }, // canActivate: [AuthGuard] - { path: 'tabs/dmps', component: DmpComponent } -]; - -@NgModule({ - imports: [ - RouterModule.forChild(tabsRoutes) - ], - exports: [ - RouterModule - ] -}) -export class TabRoutingModule { } \ No newline at end of file diff --git a/dmp-frontend/src/app/tabs/tabs.component.ts b/dmp-frontend/src/app/tabs/tabs.component.ts deleted file mode 100644 index 0351f59ee..000000000 --- a/dmp-frontend/src/app/tabs/tabs.component.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'my-app', - template: ` - - - - ` -}) -export class TabComponent { -} - - - - -// \ No newline at end of file diff --git a/dmp-frontend/src/app/unauthorized/unauthorized.component.html b/dmp-frontend/src/app/unauthorized/unauthorized.component.html new file mode 100644 index 000000000..1a1112d35 --- /dev/null +++ b/dmp-frontend/src/app/unauthorized/unauthorized.component.html @@ -0,0 +1 @@ +

{{message}}

\ No newline at end of file diff --git a/dmp-frontend/src/app/unauthorized/unauthorized.component.js b/dmp-frontend/src/app/unauthorized/unauthorized.component.js new file mode 100644 index 000000000..b82d4c451 --- /dev/null +++ b/dmp-frontend/src/app/unauthorized/unauthorized.component.js @@ -0,0 +1,49 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +import { Component, Input } from "@angular/core"; +import { AuthService } from "../core/services/auth.service"; +import { ActivatedRoute, Router } from "@angular/router"; +var UnauthorizedComponent = (function () { + function UnauthorizedComponent(authService, route, router) { + this.authService = authService; + this.route = route; + this.router = router; + } + UnauthorizedComponent.prototype.ngAfterViewInit = function () { + var _this = this; + var returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/'; + var principal = this.authService.current(); + if (!principal) { + this.router.navigate(['/login'], { queryParams: { returnUrl: returnUrl } }); + } + else { + this.authService.me().subscribe(function (principal) { + if (!principal) + _this.router.navigate(['/login'], { queryParams: { returnUrl: returnUrl } }); + }, function (err) { return console.error('An error occurred', err); }); + } + }; + return UnauthorizedComponent; +}()); +__decorate([ + Input(), + __metadata("design:type", String) +], UnauthorizedComponent.prototype, "message", void 0); +UnauthorizedComponent = __decorate([ + Component({ + selector: 'unauthorized-component', + templateUrl: './unauthorized.component.html' + }), + __metadata("design:paramtypes", [AuthService, + ActivatedRoute, + Router]) +], UnauthorizedComponent); +export { UnauthorizedComponent }; +//# sourceMappingURL=unauthorized.component.js.map \ No newline at end of file diff --git a/dmp-frontend/src/app/unauthorized/unauthorized.component.js.map b/dmp-frontend/src/app/unauthorized/unauthorized.component.js.map new file mode 100644 index 000000000..c61b89104 --- /dev/null +++ b/dmp-frontend/src/app/unauthorized/unauthorized.component.js.map @@ -0,0 +1 @@ +{"version":3,"file":"unauthorized.component.js","sourceRoot":"","sources":["unauthorized.component.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAMzD,IAAa,qBAAqB;IAG9B,+BACY,WAAwB,EACxB,KAAqB,EACrB,MAAc;QAFd,gBAAW,GAAX,WAAW,CAAa;QACxB,UAAK,GAAL,KAAK,CAAgB;QACrB,WAAM,GAAN,MAAM,CAAQ;IACtB,CAAC;IAEL,+CAAe,GAAf;QAAA,iBAaC;QAZG,IAAI,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC;QACpE,IAAI,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QAC3C,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;QACD,IAAI,CAAC,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC,SAAS,CAC3B,UAAA,SAAS;gBACL,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;oBAAC,KAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAChG,CAAC,EACD,UAAA,GAAG,IAAI,OAAA,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,EAAvC,CAAuC,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;IACL,4BAAC;AAAD,CAAC,AAvBD,IAuBC;AArBG;IADC,KAAK,EAAE;;sDACe;AAFd,qBAAqB;IAJjC,SAAS,CAAC;QACP,QAAQ,EAAE,wBAAwB;QAClC,WAAW,EAAE,+BAA+B;KAC/C,CAAC;qCAK2B,WAAW;QACjB,cAAc;QACb,MAAM;GANjB,qBAAqB,CAuBjC;SAvBY,qBAAqB"} \ No newline at end of file diff --git a/dmp-frontend/src/app/unauthorized/unauthorized.component.ts b/dmp-frontend/src/app/unauthorized/unauthorized.component.ts new file mode 100644 index 000000000..4e7bb7d09 --- /dev/null +++ b/dmp-frontend/src/app/unauthorized/unauthorized.component.ts @@ -0,0 +1,32 @@ +import { AuthService } from '../services/auth/auth.service'; +import { Component, Input } from "@angular/core"; +import { ActivatedRoute, Router } from "@angular/router"; + +@Component({ + selector: 'unauthorized-component', + templateUrl: './unauthorized.component.html' +}) +export class UnauthorizedComponent { + @Input() + public message: string; + constructor( + private authService: AuthService, + private route: ActivatedRoute, + private router: Router + ) { } + + ngAfterViewInit() { + let returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/'; + let principal = this.authService.current(); + if (!principal) { + this.router.navigate(['/login'], { queryParams: { returnUrl: returnUrl } }); + } + else { + this.authService.me().subscribe( + principal => { + if (!principal) this.router.navigate(['/login'], { queryParams: { returnUrl: returnUrl } }); + }, + err => console.error('An error occurred', err)); + } + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/unauthorized/unauthorized.module.js b/dmp-frontend/src/app/unauthorized/unauthorized.module.js new file mode 100644 index 000000000..423333fa7 --- /dev/null +++ b/dmp-frontend/src/app/unauthorized/unauthorized.module.js @@ -0,0 +1,37 @@ +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +import { CommonModule } from '@angular/common'; +import { HttpClientModule } from '@angular/common/http'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { UnauthorizedComponent } from './unauthorized.component'; +import { UnauthorizedRoutes } from './unauthorized.routes'; +import { SharedModule } from '../shared/shared.module'; +var UnauthorizedModule = (function () { + function UnauthorizedModule() { + } + return UnauthorizedModule; +}()); +UnauthorizedModule = __decorate([ + NgModule({ + imports: [ + CommonModule, + FormsModule, + HttpClientModule, + UnauthorizedRoutes, + SharedModule + ], + declarations: [ + UnauthorizedComponent + ], + exports: [ + UnauthorizedComponent + ] + }) +], UnauthorizedModule); +export { UnauthorizedModule }; +//# sourceMappingURL=unauthorized.module.js.map \ No newline at end of file diff --git a/dmp-frontend/src/app/unauthorized/unauthorized.module.js.map b/dmp-frontend/src/app/unauthorized/unauthorized.module.js.map new file mode 100644 index 000000000..126948b9d --- /dev/null +++ b/dmp-frontend/src/app/unauthorized/unauthorized.module.js.map @@ -0,0 +1 @@ +{"version":3,"file":"unauthorized.module.js","sourceRoot":"","sources":["unauthorized.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAmBtD,IAAa,kBAAkB;IAA/B;IAAkC,CAAC;IAAD,yBAAC;AAAD,CAAC,AAAnC,IAAmC;AAAtB,kBAAkB;IAlB9B,QAAQ,CAAC;QACN,OAAO,EAAE;YACL,YAAY;YACZ,WAAW;YACX,gBAAgB;YAChB,kBAAkB;YAClB,YAAY;SACf;QAED,YAAY,EAAE;YACV,qBAAqB;SACxB;QAED,OAAO,EAAE;YACL,qBAAqB;SACxB;KACJ,CAAC;GAEW,kBAAkB,CAAI;SAAtB,kBAAkB"} \ No newline at end of file diff --git a/dmp-frontend/src/app/unauthorized/unauthorized.module.ts b/dmp-frontend/src/app/unauthorized/unauthorized.module.ts new file mode 100644 index 000000000..80afd4181 --- /dev/null +++ b/dmp-frontend/src/app/unauthorized/unauthorized.module.ts @@ -0,0 +1,27 @@ +import { CommonModule } from '@angular/common'; +import { HttpClientModule } from '@angular/common/http'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; + +import { UnauthorizedComponent } from './unauthorized.component'; +import { UnauthorizedRoutes } from './unauthorized.routes'; +import { SharedModule } from '../shared/shared.module' +@NgModule({ + imports: [ + CommonModule, + FormsModule, + HttpClientModule, + UnauthorizedRoutes, + SharedModule + ], + + declarations: [ + UnauthorizedComponent + ], + + exports: [ + UnauthorizedComponent + ] +}) + +export class UnauthorizedModule { } diff --git a/dmp-frontend/src/app/unauthorized/unauthorized.routes.js b/dmp-frontend/src/app/unauthorized/unauthorized.routes.js new file mode 100644 index 000000000..f9666de09 --- /dev/null +++ b/dmp-frontend/src/app/unauthorized/unauthorized.routes.js @@ -0,0 +1,7 @@ +import { RouterModule } from '@angular/router'; +import { UnauthorizedComponent } from './unauthorized.component'; +var routes = [ + { path: '', component: UnauthorizedComponent } +]; +export var UnauthorizedRoutes = RouterModule.forChild(routes); +//# sourceMappingURL=unauthorized.routes.js.map \ No newline at end of file diff --git a/dmp-frontend/src/app/unauthorized/unauthorized.routes.js.map b/dmp-frontend/src/app/unauthorized/unauthorized.routes.js.map new file mode 100644 index 000000000..8a1dbc929 --- /dev/null +++ b/dmp-frontend/src/app/unauthorized/unauthorized.routes.js.map @@ -0,0 +1 @@ +{"version":3,"file":"unauthorized.routes.js","sourceRoot":"","sources":["unauthorized.routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAU,MAAM,iBAAiB,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,IAAM,MAAM,GAAW;IACnB,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE;CACjD,CAAC;AAEF,MAAM,CAAC,IAAM,kBAAkB,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC"} \ No newline at end of file diff --git a/dmp-frontend/src/app/unauthorized/unauthorized.routes.ts b/dmp-frontend/src/app/unauthorized/unauthorized.routes.ts new file mode 100644 index 000000000..f8e4ebee4 --- /dev/null +++ b/dmp-frontend/src/app/unauthorized/unauthorized.routes.ts @@ -0,0 +1,9 @@ +import { RouterModule, Routes } from '@angular/router'; + +import { UnauthorizedComponent } from './unauthorized.component'; + +const routes: Routes = [ + { path: '', component: UnauthorizedComponent } +]; + +export const UnauthorizedRoutes = RouterModule.forChild(routes); diff --git a/dmp-frontend/src/app/user-management/login.module.ts b/dmp-frontend/src/app/user-management/login.module.ts new file mode 100644 index 000000000..6527007ec --- /dev/null +++ b/dmp-frontend/src/app/user-management/login.module.ts @@ -0,0 +1,40 @@ +import { TwitterLoginComponent } from './login/twitter-login/twitter-login.component'; +import { SnackBarNotificationComponent } from '../shared/components/notificaiton/snack-bar-notification.component'; +import { LinkedInLoginComponent } from './login/linkedin-login/linkedin-login.component'; +import { LoginRoutes } from './login.routes'; +import { MaterialModule } from '../shared/material/material.module'; +import { SharedModule } from '../shared/shared.module'; +import { LoginServiceConfiguration } from './utilties/LoginServiceConfiguration'; +import { LoginService } from './utilties/login-service'; +import { LoginComponent } from './login/login.component'; +import { ModuleWithProviders, NgModule } from "@angular/core"; +import { CommonModule } from '@angular/common'; + +@NgModule({ + imports: [ + SharedModule, + CommonModule, + LoginRoutes + ], + declarations: [ + LoginComponent, + LinkedInLoginComponent, + TwitterLoginComponent + ], + exports: [ + LoginComponent, + LinkedInLoginComponent, + TwitterLoginComponent + ], + providers: [LoginService] +}) +export class LoginModule { + static forRoot(config: LoginServiceConfiguration): ModuleWithProviders { + return { + ngModule: LoginModule, + providers: [ + { provide: LoginServiceConfiguration, useValue: config } + ], + }; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/login.routes.ts b/dmp-frontend/src/app/user-management/login.routes.ts new file mode 100644 index 000000000..67cd0ea80 --- /dev/null +++ b/dmp-frontend/src/app/user-management/login.routes.ts @@ -0,0 +1,12 @@ +import { TwitterLoginComponent } from './login/twitter-login/twitter-login.component'; +import { LinkedInLoginComponent } from './login/linkedin-login/linkedin-login.component'; +import { LoginComponent } from './login/login.component'; +import { RouterModule, Routes } from '@angular/router'; + +const routes: Routes = [ + { path: 'login', component: LoginComponent }, + { path: 'login/linkedin', component: LinkedInLoginComponent }, + { path: 'login/twitter', component: TwitterLoginComponent } +]; + +export const LoginRoutes = RouterModule.forChild(routes); diff --git a/dmp-frontend/src/assets/custom.css b/dmp-frontend/src/app/user-management/login/linkedin-login/linkedin-login.component.html similarity index 100% rename from dmp-frontend/src/assets/custom.css rename to dmp-frontend/src/app/user-management/login/linkedin-login/linkedin-login.component.html diff --git a/dmp-frontend/src/app/user-management/login/linkedin-login/linkedin-login.component.ts b/dmp-frontend/src/app/user-management/login/linkedin-login/linkedin-login.component.ts new file mode 100644 index 000000000..af9ebe386 --- /dev/null +++ b/dmp-frontend/src/app/user-management/login/linkedin-login/linkedin-login.component.ts @@ -0,0 +1,26 @@ +import { LoginService } from '../../utilties/login-service'; +import { Component, OnInit } from '@angular/core' +import { Router, ActivatedRoute, Params } from '@angular/router'; + +@Component({ + selector: 'linkedin-login', + templateUrl: './linkedin-login.component.html', +}) +export class LinkedInLoginComponent implements OnInit { + + constructor( + private router: Router, + private route: ActivatedRoute, + private loginService: LoginService + ) { + + } + + ngOnInit(): void { + this.route.queryParams.subscribe((data: any) => { + if (!data["code"]) this.loginService.linkedinAuthorize() + else this.loginService.linkedInloginUser(data["code"]) + }) + } + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/login/login.component.html b/dmp-frontend/src/app/user-management/login/login.component.html new file mode 100644 index 000000000..13eb83a8b --- /dev/null +++ b/dmp-frontend/src/app/user-management/login/login.component.html @@ -0,0 +1,47 @@ +
+
+
+
+
+
+

Login

+ +
+
+ +
+
+ email + + + +
+
+ lock_outline + + + +
+
+ +
+
+
+
+
+
\ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/login/login.component.scss b/dmp-frontend/src/app/user-management/login/login.component.scss new file mode 100644 index 000000000..e868c5c28 --- /dev/null +++ b/dmp-frontend/src/app/user-management/login/login.component.scss @@ -0,0 +1,138 @@ +.container{ + padding: 15px 30px; +} + +.card{ + box-shadow: 0 1px 4px 0 rgba(0, 0, 0, 0.14); + border-radius: 6px; + color: rgba(0,0,0, 0.87); + background: #fff; +} + +.card-raised{ + box-shadow: 0 10px 30px -12px rgba(0, 0, 0, 0.42), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2); +} + +.page-title{ + margin-top: 40px; +} + +@media (min-width: 1200px) { + .container { + width: 100%; + } +} + +@media (min-width: 992px) { + .container { + width: 100%; + } +} + +@media (min-width: 768px) { + .container { + width: 100%; + } +} + +.container{ + height: 100%; + position: relative; + z-index: 1; +} + +.card{ + position: relative; + padding: 20px; + display: flex; + flex-direction: column; + align-items: center; + margin-top: 90px; + top: -90px; + -webkit-animation-name: card; + -moz-animation-name: card; + -o-animation-name: card; + animation-name: card; + -webkit-animation-duration: 600ms; + -moz-animation-duration: 600ms; + -o-animation-duration: 600ms; + animation-duration: 600ms; + -webkit-animation-fill-mode: forwards; + -moz-animation-fill-mode: forwards; + -o-animation-fill-mode: forwards; + animation-fill-mode: forwards; +} + +@-webkit-keyframes card { + from {top: -40px;} + to {top: 0;} +} + +@keyframes card { + from {top: -40px;} + to {top: 0;} +} + +.card-header{ + position: relative; + overflow: hidden; + top: -40px; + width: 100%; + padding: 25px; + border-radius: 3px; + background: linear-gradient(60deg, #ec407a, #d81b60); + box-shadow: 0 4px 20px 0px rgba(0, 0, 0, 0.14), 0 7px 10px -5px rgba(233, 30, 99, 0.4); + display: flex; + flex-direction: column; + align-items: center; +} + +.card-header h4{ + font-weight: 400; + color: #fff; + margin-bottom: 25px; + margin-top: 5px; +} + +.social-btns i{ + font-size: 21px; + color: #fff; +} + +.social-btns button{ + margin: 0 8px; +} + +.tip{ + margin-top: -20px; +} + +.form-row, .card-form, .mat-input-container{ + width: 100%; +} + +.card-form{ + padding: 5px; +} + +.form-row{ + position: relative; + display: flex; + align-items: center; + margin-top: 13px; +} + +.form-row i{ + position: relative; + top: -5px; + margin-right: 15px; + color: #555; +} + +.card-footer{ + margin: 10px; +} + +.card-footer button{ + color: #e91e63; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/login/login.component.ts b/dmp-frontend/src/app/user-management/login/login.component.ts new file mode 100644 index 000000000..d89df4c6d --- /dev/null +++ b/dmp-frontend/src/app/user-management/login/login.component.ts @@ -0,0 +1,63 @@ +import { LoginOptions } from '../utilties/LoginOptions'; +import { LoginService } from '../utilties/login-service'; +import { HttpClient } from '@angular/common/http'; +import { Component, OnInit, ElementRef, AfterViewInit, VERSION, Injectable, NgZone } from '@angular/core'; +import { Router, ActivatedRoute, Params } from "@angular/router"; +import { MatPaginator, MatSort, MatSnackBar } from "@angular/material"; +import { TranslateService } from "@ngx-translate/core"; + + + +@Component({ + selector: 'login', + templateUrl: './login.component.html', + styleUrls: ['./login.component.scss'] +}) +export class LoginComponent implements OnInit { + + public auth2: any; + + constructor( + private loginService: LoginService + ) { + } + + + + ngOnInit() { + this.loginService.initProviders(); + } + + public facebookLogin() { + this.loginService.facebookLogin(); + } + + public linkedInLogin() { + this.loginService.linkedInInitialiseLogin(); + } + + public twitterLogin() { + this.loginService.twitterInitialiseLogin(); + } + + public hasFacebookOauth(): boolean { + return this.loginService.hasProvider(LoginOptions.facebookOauth); + } + + public hasLinkedInOauth(): boolean { + return this.loginService.hasProvider(LoginOptions.linkedInOauth); + } + + public hasTwitterOauth(): boolean { + return this.loginService.hasProvider(LoginOptions.twitterOauth); + } + + public hasGoogleOauth(): boolean { + return this.loginService.hasProvider(LoginOptions.googleOauth); + } + + public hasNativeLogin(): boolean { + return this.loginService.hasProvider(LoginOptions.nativeLogin); + } + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/login/twitter-login/twitter-login.component.html b/dmp-frontend/src/app/user-management/login/twitter-login/twitter-login.component.html new file mode 100644 index 000000000..e69de29bb diff --git a/dmp-frontend/src/app/user-management/login/twitter-login/twitter-login.component.ts b/dmp-frontend/src/app/user-management/login/twitter-login/twitter-login.component.ts new file mode 100644 index 000000000..6a53bf523 --- /dev/null +++ b/dmp-frontend/src/app/user-management/login/twitter-login/twitter-login.component.ts @@ -0,0 +1,24 @@ +import { LoginService } from '../../utilties/login-service'; +import { ActivatedRoute, Router } from '@angular/router' +import { Component } from '@angular/core' +@Component({ + selector: 'twitter-login', + templateUrl: './twitter-login.component.html', +}) +export class TwitterLoginComponent { + constructor( + private router: Router, + private route: ActivatedRoute, + private loginService: LoginService + ) { + + } + + ngOnInit(): void { + this.route.queryParams.subscribe((data: any) => { + if (!data["oauth_token"] && !data["oauth_verifier"]) this.loginService.twitterAuthorize() + else this.loginService.twitterLogin(data["oauth_token"],data["oauth_verifier"]) + }) + } + +} \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/utilties/LoginOptions.ts b/dmp-frontend/src/app/user-management/utilties/LoginOptions.ts new file mode 100644 index 000000000..51187d8ba --- /dev/null +++ b/dmp-frontend/src/app/user-management/utilties/LoginOptions.ts @@ -0,0 +1,8 @@ +export enum LoginOptions{ + linkedInOauth = 1, + facebookOauth = 2, + twitterOauth = 3, + googleOauth = 4, + nativeLogin = 5, + all = 6 +} \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/utilties/LoginProviderConfiguration.ts b/dmp-frontend/src/app/user-management/utilties/LoginProviderConfiguration.ts new file mode 100644 index 000000000..52b67eeb0 --- /dev/null +++ b/dmp-frontend/src/app/user-management/utilties/LoginProviderConfiguration.ts @@ -0,0 +1,20 @@ +export abstract class LoginProviderConfiguration { + public clientId: string +} + +export class FacebookLoginConfiguration extends LoginProviderConfiguration { +} + +export class GoogleLoginConfiguration extends LoginProviderConfiguration { +} + +export class TwitterLoginConfiguration extends LoginProviderConfiguration { + public oauthUrl: string +} + +export class LinkedInConfiguration extends LoginProviderConfiguration { + public oauthUrl: string + public redirectUri: string + public accessTokenUri: string + public clientSecret: string +} \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/utilties/LoginServiceConfiguration.ts b/dmp-frontend/src/app/user-management/utilties/LoginServiceConfiguration.ts new file mode 100644 index 000000000..bb251a8b3 --- /dev/null +++ b/dmp-frontend/src/app/user-management/utilties/LoginServiceConfiguration.ts @@ -0,0 +1,14 @@ +import { + FacebookLoginConfiguration, + GoogleLoginConfiguration, + LinkedInConfiguration, + TwitterLoginConfiguration, +} from './LoginProviderConfiguration'; +import { LoginOptions } from './LoginOptions'; +export class LoginServiceConfiguration { + public loginProviders: LoginOptions[]; + public facebookConfiguration?: FacebookLoginConfiguration; + public googleConfiguration?: GoogleLoginConfiguration; + public twitterConfiguration?: TwitterLoginConfiguration; + public linkedInConfiguration?: LinkedInConfiguration; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/user-management/utilties/login-service.ts b/dmp-frontend/src/app/user-management/utilties/login-service.ts new file mode 100644 index 000000000..eaf123d60 --- /dev/null +++ b/dmp-frontend/src/app/user-management/utilties/login-service.ts @@ -0,0 +1,195 @@ +import { HostConfiguration } from '../../app.constants'; +import { LoginProviderConfiguration } from './LoginProviderConfiguration'; +import { AuthService } from '../../services/auth/auth.service'; +import { LoginOptions } from './LoginOptions'; +import { LoginServiceConfiguration } from './LoginServiceConfiguration'; +import { LoginProviders } from '../../models/login/LoginInfo'; +import { Optional, NgZone, Injectable } from '@angular/core'; +import { Observable } from 'rxjs/Observable'; +import { MatSnackBar } from '@angular/material'; +import { SnackBarNotificationComponent } from '../../shared/components/notificaiton/snack-bar-notification.component'; +import { Router, ActivatedRoute, Params } from '@angular/router'; +import { TranslateService } from '@ngx-translate/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; + +declare const gapi: any; +declare const FB: any; +declare const IN: any; + +@Injectable() +export class LoginService { + + private providers: LoginOptions[] + private auth2: any; + constructor( + private router: Router, + public authService: AuthService, + public route: ActivatedRoute, + public snackBar: MatSnackBar, + public language: TranslateService, + private zone: NgZone, + private httpClient: HttpClient, + @Optional() private config: LoginServiceConfiguration + ) { + if (config) { + this.providers = config.loginProviders; + } + else this.providers = [LoginOptions.nativeLogin]; + } + + public initProviders() { + if (this.hasProvider(LoginOptions.googleOauth)) this.initialiseGoogleOauth(); + if (this.hasProvider(LoginOptions.facebookOauth)) this.initialiseFacebookOauth(); + } + + public hasProvider(provider: LoginOptions) { + for (let i = 0; i < this.providers.length; i++) { + if (provider === this.providers[i]) return this.isProviderProperlyConfigured(provider) + } + return false; + } + + private isProviderProperlyConfigured(provider: LoginOptions) { + switch (provider) { + case LoginOptions.facebookOauth: return this.hasAllRequiredFieldsConfigured(this.config.facebookConfiguration); + case LoginOptions.googleOauth: return this.hasAllRequiredFieldsConfigured(this.config.googleConfiguration) + case LoginOptions.linkedInOauth: return this.hasAllRequiredFieldsConfigured(this.config.linkedInConfiguration); + case LoginOptions.twitterOauth: return this.hasAllRequiredFieldsConfigured(this.config.twitterConfiguration); + case LoginOptions.nativeLogin: return true; + default: throw new Error("Unsupported Provider Type") + } + } + + private hasAllRequiredFieldsConfigured(configuration: LoginProviderConfiguration) { + if (configuration != null && configuration.clientId != null) return true + return false; + } + + /* + * GOOGLE SIGN IN + */ + + private initialiseGoogleOauth(): void { + gapi.load('auth2', () => { + this.auth2 = gapi.auth2.init({ + client_id: this.config.googleConfiguration.clientId, + cookiepolicy: 'single_host_origin', + scope: 'profile email' + }); + this.attachGoogleSignin(document.getElementById('googleSignInButton')); + }); + } + + public attachGoogleSignin(element) { + if (!element) return + this.auth2.attachClickHandler(element, {}, + (googleUser) => { + var id_token = googleUser.getAuthResponse().id_token; + if (id_token) { + this.authService.login({ ticket: id_token, provider: LoginProviders.Google }).subscribe( + res => this.onLogInSuccess(res), + error => this.onLogInError(error) + ) + } + }, (error) => { + alert(JSON.stringify(error, undefined, 2)); + }); + } + + + + /* + * FACEBOOK SIGN IN + */ + + + private initialiseFacebookOauth(): void { + FB.init({ + appId: this.config.facebookConfiguration.clientId, + cookie: false, + xfbml: true, + version: 'v2.8' + }); + } + + + + + public facebookLogin() { + FB.login((response: any) => { + if (response.status === 'connected' || 'not_authorized') { + this.authService.login({ ticket: response.authResponse.accessToken, provider: LoginProviders.Facebook }).subscribe( + res => this.onLogInSuccess(res), + error => this.onLogInError(error) + ) + } + }, { scope: 'user_friends,email' }); + } + + /* + * LINKEDIN SIGN IN + */ + + public linkedinAuthorize() { + window.location.href = this.config.linkedInConfiguration.oauthUrl + "?response_type=code&client_id=" + this.config.linkedInConfiguration.clientId + "&redirect_uri=" + this.config.linkedInConfiguration.redirectUri + "&state=987654321" + } + + public linkedInInitialiseLogin() { + this.router.navigate(["/login/linkedin"]) + } + + public linkedInloginUser(code: string) { + this.authService.login({ ticket: code, provider: LoginProviders.LinkedIn }).subscribe( + res => this.onLogInSuccess(res), + error => this.onLogInError(error) + ) + } + + /* + * TWITTER SIGN IN + */ + public twitterInitialiseLogin() { + this.router.navigate(["/login/twitter"]) + } + + public twitterAuthorize() { + let headers = new HttpHeaders(); + headers = headers.set('Content-Type', 'application/json'); + headers = headers.set('Accept', 'application/json'); + this.httpClient.get(HostConfiguration.Server + 'auth/twitterRequestToken', { headers: headers }).subscribe((data: any) => { + window.location.href = this.config.twitterConfiguration.oauthUrl + "?oauth_token=" + data.payload.value + }) + } + + public twitterLogin(token: string, verifier: string) { + this.authService.login({ ticket: token, provider: LoginProviders.Twitter, data: verifier }).subscribe( + res => this.onLogInSuccess(res), + error => this.onLogInError(error) + ) + } + + /* + * LOGIN HANDLERS + */ + + + public onLogInSuccess(logoutMessage: any) { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-LOGIN', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-success'] + }); + this.route.queryParams.subscribe((params: Params) => { + let redirectUrl = params['returnUrl'] ? params['returnUrl'] : '/'; + this.zone.run(() => this.router.navigate([redirectUrl])); + }) + } + + public onLogInError(errorMessage: string) { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.SNACK-BAR.UNSUCCESSFUL-LOGIN', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-warning'] + }) + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/utilities/JsonSerializer.ts b/dmp-frontend/src/app/utilities/JsonSerializer.ts new file mode 100644 index 000000000..da284c1ad --- /dev/null +++ b/dmp-frontend/src/app/utilities/JsonSerializer.ts @@ -0,0 +1,17 @@ +import { Serializable } from '../models/interfaces/Serializable'; +export class JsonSerializer{ + + public static fromJSONArray>(items: any[], type: { new(): T; }): T[] { + if(!items)return new Array(); + const objectList: T[] = new Array(); + for (let i = 0; i < items.length; i++) { + objectList.push(new type().fromJSONObject(items[i])) + } + return objectList; + } + + public static fromJSONObject>(item: any, type: { new(): T; }): T { + if(!item)return null; + return new type().fromJSONObject(item); + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/utilities/cite-http-service-module/base-http.service.ts b/dmp-frontend/src/app/utilities/cite-http-service-module/base-http.service.ts new file mode 100644 index 000000000..1c68bf7a1 --- /dev/null +++ b/dmp-frontend/src/app/utilities/cite-http-service-module/base-http.service.ts @@ -0,0 +1,113 @@ +import { Injectable } from '@angular/core'; +import { Http, RequestOptions, Response, Headers } from '@angular/http'; +import { Observable } from 'rxjs/Observable'; +import { Router, ActivatedRoute, RouterStateSnapshot } from '@angular/router'; +import { MatSnackBar } from '@angular/material'; +import { TranslateService } from '@ngx-translate/core'; +import { HttpClient } from '@angular/common/http'; +import { AuthService } from '../../services/auth/auth.service'; +import { SnackBarNotificationComponent } from '../../shared/components/notificaiton/snack-bar-notification.component'; +import { BaseHttpResponseModel } from '../../models/http/BaseHttpResponseModel'; + +@Injectable() +export class BaseHttpService { + constructor( + protected http: HttpClient, + private router: Router, + private authService: AuthService, + public language: TranslateService, + public snackBar: MatSnackBar, + public route: ActivatedRoute + ) { + } + get(url: string, options?: any): Observable { + return this.interceptRepsonse(this.http.get(url, this.buildRequestOptions(options))); + } + post(url: string, body: any, options?: any): Observable { + return this.interceptRepsonse(this.http.post(url, body, this.buildRequestOptions(options))); + } + put(url: string, body: any, options?: any): Observable { + return this.interceptRepsonse(this.http.put(url, body, this.buildRequestOptions(options))); + } + delete(url: string, options?: any): Observable { + return this.interceptRepsonse(this.http.delete(url, this.buildRequestOptions(options))); + } + patch(url: string, body: any, options?: any): Observable { + return this.interceptRepsonse(this.http.patch(url, body, this.buildRequestOptions(options))); + } + head(url: string, options?: any): Observable { + return this.interceptRepsonse(this.http.head(url, this.buildRequestOptions(options))); + } + options(url: string, options?: any): Observable { + return this.interceptRepsonse(this.http.options(url, this.buildRequestOptions(options))); + } + + protected buildRequestOptions(options?: any): Object { + if (options == null) { + options = new RequestOptions(); + } + if (options.headers == null) { + options.headers = new Headers(); + } + if (!options.headers.has('Content-Type')) { + options.headers = options.headers.set('Content-Type', 'application/json'); + } + if (!options.headers.has('Content-Type')) { + options.headers = options.headers.set('Content-Type', 'application/json'); + } + if (!options.headers.has('AuthToken')) { + const principal = this.authService.current(); + if (principal) { + options.headers = options.headers.set('AuthToken', principal.token); + } + } + + return options; + } + + private interceptRepsonse(observable: Observable): Observable { + return observable + .catch((error) => { + if (error.status === 401) { + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.SNACK-BAR.SUCCESSFUL-LOGOUT', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-success'] + }) + let currentPage = this.router.url; + this.router.navigate(['/unauthorized'], { queryParams: { returnUrl: currentPage } }); + //this.notification.httpError(error); + return Observable.of(); + } else { + return Observable.throw(error); + } + }) + .map(response => { + if (response.statusCode < 200 || response.statusCode >= 300) { + //throw new Error('Request failed'); + this.snackBar.openFromComponent(SnackBarNotificationComponent, { + data: { message: 'GENERAL.ERRORS.HTTP-REQUEST-ERROR', language: this.language }, + duration: 3000, + extraClasses: ['snackbar-warning'] + }) + } + else { + return response.payload; + } + }); + } + + // public handleResponse(response: BaseHttpResponseModel) { + // if (response.statusCode < 200 || response.statusCode >= 300) { + // //throw new Error('Request failed'); + // this.snackBar.openFromComponent(SnackBarNotificationComponent, { + // data: { message: 'GENERAL.ERRORS.HTTP-REQUEST-ERROR', language: this.language }, + // duration: 3000, + // extraClasses: ['snackbar-warning'] + // }) + // } + // else { + // return response.payload; + // } + // } +} diff --git a/dmp-frontend/src/app/utilities/cite-http-service-module/cite-http.module.ts b/dmp-frontend/src/app/utilities/cite-http-service-module/cite-http.module.ts new file mode 100644 index 000000000..b37b832b7 --- /dev/null +++ b/dmp-frontend/src/app/utilities/cite-http-service-module/cite-http.module.ts @@ -0,0 +1,21 @@ +import { CommonModule } from '@angular/common'; +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { AuthService } from '../../services/auth/auth.service'; +import { BaseHttpService } from './base-http.service'; + +@NgModule({ + imports: [ + CommonModule + ] +}) +export class BaseHttpModule { + static forRoot(): ModuleWithProviders { + return { + ngModule: BaseHttpModule, + providers: [ + AuthService, + BaseHttpService + ] + }; + } +} diff --git a/dmp-frontend/src/app/utilities/forms/FormGenerator.ts b/dmp-frontend/src/app/utilities/forms/FormGenerator.ts new file mode 100644 index 000000000..a30da24a8 --- /dev/null +++ b/dmp-frontend/src/app/utilities/forms/FormGenerator.ts @@ -0,0 +1,6 @@ +import { ValidationContext } from "../validators/ValidationContext"; +import { FormGroup } from "@angular/forms"; + +export interface FormGenerator { + buildForm(validation: ValidationContext, disabled?: boolean): FormGroup; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/utilities/validators/BackendErrorValidator.ts b/dmp-frontend/src/app/utilities/validators/BackendErrorValidator.ts new file mode 100644 index 000000000..14adbee9a --- /dev/null +++ b/dmp-frontend/src/app/utilities/validators/BackendErrorValidator.ts @@ -0,0 +1,9 @@ +import { ValidatorFn, AbstractControl } from '@angular/forms'; +import { BaseErrorModel } from '../../models/error/BaseErrorModel'; + +export function BackendErrorValidator(errorModel: BaseErrorModel, propertyName: string): ValidatorFn { + return (control: AbstractControl): { [key: string]: any } => { + const error: string = (errorModel)[propertyName]; + return error ? { 'backendError': { value: error } } : null; + }; +} diff --git a/dmp-frontend/src/app/utilities/validators/ValidationContext.ts b/dmp-frontend/src/app/utilities/validators/ValidationContext.ts new file mode 100644 index 000000000..ef3528ff2 --- /dev/null +++ b/dmp-frontend/src/app/utilities/validators/ValidationContext.ts @@ -0,0 +1,20 @@ +import { ValidatorFn } from '@angular/forms'; + +export class ValidationContext { + validation: Validation[] = []; + + getValidation(key: string): Validation { + for (let i = 0; i < this.validation.length; i++) { + if (this.validation[i].key === key) { + return this.validation[i]; + } + } + throw new Error('Key Was Not Found In The Validation Context'); + } +} + +export class Validation { + key: string; + validators?: ValidatorFn[] = new Array(); + descendantValidations?: ValidationContext; +} diff --git a/dmp-frontend/src/app/viewers/dmp-detailed/dmp-detailed.component.html b/dmp-frontend/src/app/viewers/dmp-detailed/dmp-detailed.component.html deleted file mode 100644 index 0ee4a248c..000000000 --- a/dmp-frontend/src/app/viewers/dmp-detailed/dmp-detailed.component.html +++ /dev/null @@ -1,3 +0,0 @@ -

-Under construction -

\ No newline at end of file diff --git a/dmp-frontend/src/app/viewers/dmp-detailed/dmp-detailed.component.ts b/dmp-frontend/src/app/viewers/dmp-detailed/dmp-detailed.component.ts deleted file mode 100644 index dec9c4e81..000000000 --- a/dmp-frontend/src/app/viewers/dmp-detailed/dmp-detailed.component.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router, ActivatedRoute, ParamMap, Params } from '@angular/router'; -import {Location} from '@angular/common'; -import { ServerService } from '../../../app/services/server.service'; -@Component({ - selector: 'dmp-detailed', - templateUrl: './dmp-detailed.component.html', - styleUrls: ['./dmp-detailed.component.css'] -}) -export class DmpDetailedComponent implements OnInit { - - constructor(private serverService: ServerService, private router: Router, private _location: Location, private route: ActivatedRoute) { - - } - - dmp : any; - - - ngOnInit() { - - let sub = this.route.queryParams.subscribe(params => { - - let dmpid = params.dmpid; - let getParams : any = {"eager":true}; - this.serverService.getDmp(dmpid, getParams).subscribe( - response => { - this.dmp = response; - debugger; - }, - error => { - console.log("Could not load dmp"); - } - ) - - }); - - - - - } - -} diff --git a/dmp-frontend/src/app/viewers/project-detailed/project-detailed.component.html b/dmp-frontend/src/app/viewers/project-detailed/project-detailed.component.html deleted file mode 100644 index 1ff4b2e30..000000000 --- a/dmp-frontend/src/app/viewers/project-detailed/project-detailed.component.html +++ /dev/null @@ -1,3 +0,0 @@ -

- Details of project -- Under construction -

diff --git a/dmp-frontend/src/app/viewers/project-detailed/project-detailed.component.ts b/dmp-frontend/src/app/viewers/project-detailed/project-detailed.component.ts deleted file mode 100644 index ddf168bfa..000000000 --- a/dmp-frontend/src/app/viewers/project-detailed/project-detailed.component.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -@Component({ - selector: 'project-detailed', - templateUrl: './project-detailed.component.html', - styleUrls: ['./project-detailed.component.css'] -}) -export class ProjectDetailedComponent implements OnInit { - - constructor() { } - - ngOnInit() { - } - -} diff --git a/dmp-frontend/src/app/visibility-rules/models/VisibilityRule.ts b/dmp-frontend/src/app/visibility-rules/models/VisibilityRule.ts new file mode 100644 index 000000000..81ee45c0f --- /dev/null +++ b/dmp-frontend/src/app/visibility-rules/models/VisibilityRule.ts @@ -0,0 +1,5 @@ +import { VisibilityRuleSource } from './VisibilityRuleSource'; +export class VisibilityRule{ + public targetControlId:string; + public sourceVisibilityRules:Array +} \ No newline at end of file diff --git a/dmp-frontend/src/app/visibility-rules/models/VisibilityRuleSource.ts b/dmp-frontend/src/app/visibility-rules/models/VisibilityRuleSource.ts new file mode 100644 index 000000000..90ac1a6c1 --- /dev/null +++ b/dmp-frontend/src/app/visibility-rules/models/VisibilityRuleSource.ts @@ -0,0 +1,4 @@ +export class VisibilityRuleSource{ + public sourceControlId:string; + public sourceControlValue:string; +} \ No newline at end of file diff --git a/dmp-frontend/src/app/visibility-rules/models/VisibilityRulesContext.ts b/dmp-frontend/src/app/visibility-rules/models/VisibilityRulesContext.ts new file mode 100644 index 000000000..68f8531fa --- /dev/null +++ b/dmp-frontend/src/app/visibility-rules/models/VisibilityRulesContext.ts @@ -0,0 +1,32 @@ +import { VisibilityRuleSource } from './VisibilityRuleSource'; +import { VisibilityRule } from './VisibilityRule'; +import { Rule } from '../../models/Rule' +export class VisibilityRulesContext { + public rules: Array = new Array(); + + public getRulesFromKey(id: string): VisibilityRule { + + for (let i = 0; i < this.rules.length; i++) { + if (id == this.rules[i].targetControlId) return this.rules[i] + } + return null; + } + + public buildVisibilityRuleContext(items: Array) { + items.forEach(item => { + this.addToVisibilityRulesContext(item) + }); + } + + private addToVisibilityRulesContext(item: Rule): void { + for (let i = 0; i < this.rules.length; i++) { + if (this.rules[i].targetControlId == item.targetField) { + this.rules[i].sourceVisibilityRules.push({ sourceControlId: item.sourceField, sourceControlValue: item.requiredValue }); + return; + } + } + let newVisibilityRuleArray = [({ sourceControlId: item.sourceField, sourceControlValue: item.requiredValue })]; + this.rules.push({ targetControlId: item.targetField, sourceVisibilityRules: newVisibilityRuleArray }) + return; + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/visibility-rules/visibility-rules.service.ts b/dmp-frontend/src/app/visibility-rules/visibility-rules.service.ts new file mode 100644 index 000000000..c77a8dc46 --- /dev/null +++ b/dmp-frontend/src/app/visibility-rules/visibility-rules.service.ts @@ -0,0 +1,53 @@ +import { VisibilityRule } from './models/VisibilityRule'; +import { VisibilityRulesContext } from './models/VisibilityRulesContext'; +import { FormGroup } from '@angular/forms'; +import { Injectable } from '@angular/core'; +import { Rule } from '../models/Rule' +@Injectable() +export class VisibilityRulesService { + + public formGroup: FormGroup; + public visibilityRuleContext: VisibilityRulesContext; + public fieldsPathMemory: any = {}; + + public isElementVisible(pathKey: string, id: string) { + if (!this.fieldsPathMemory[id] && pathKey) this.fieldsPathMemory[id] = pathKey; + let visibilityRule = this.visibilityRuleContext.getRulesFromKey(id); + if (!visibilityRule) return true; + if (this.checkElementVisibility(visibilityRule)) { + return true + } else { + this.clearValues(pathKey) + // if (pathKey && this.formGroup.get(pathKey + '.value')) this.formGroup.get(pathKey + '.value').patchValue(null) + return false; + } + } + + public checkElementVisibility(visibilityRule: VisibilityRule): boolean { + let sourceVisibilityRules = visibilityRule.sourceVisibilityRules; + for (let i = 0; i < sourceVisibilityRules.length; i++) { + let sourceVisibilityRule = sourceVisibilityRules[i]; + if (!this.formGroup.get(this.fieldsPathMemory[sourceVisibilityRule.sourceControlId] + '.value')) return false; //TODO + if (sourceVisibilityRule.sourceControlValue != '' + this.formGroup.get(this.fieldsPathMemory[sourceVisibilityRule.sourceControlId] + '.value').value) return false; + } + return true; + } + + public buildVisibilityRules(item: Array) { + this.visibilityRuleContext = new VisibilityRulesContext(); + this.visibilityRuleContext.buildVisibilityRuleContext(item); + } + + private getParentPath(parentId: string): string { + return ''; + } + + private clearValues(pathKey) { + if (pathKey && this.formGroup.get(pathKey + '.value')) this.formGroup.get(pathKey + '.value').patchValue(null) + if (pathKey && this.formGroup.get(pathKey)["controls"].fields){ + for (var i = 0; i < this.formGroup.get(pathKey)["controls"].fields.length; i++) + this.clearValues(pathKey+'.fields.'+i); + } + + } +} \ No newline at end of file diff --git a/dmp-frontend/src/app/widgets/breadcrumb/breadcrumb.component.html b/dmp-frontend/src/app/widgets/breadcrumb/breadcrumb.component.html deleted file mode 100644 index 5c7f1164b..000000000 --- a/dmp-frontend/src/app/widgets/breadcrumb/breadcrumb.component.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/dmp-frontend/src/app/widgets/breadcrumb/breadcrumb.component.spec.ts b/dmp-frontend/src/app/widgets/breadcrumb/breadcrumb.component.spec.ts deleted file mode 100644 index d7beb3313..000000000 --- a/dmp-frontend/src/app/widgets/breadcrumb/breadcrumb.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { BreadcrumbComponent } from './breadcrumb.component'; - -describe('BreadcrumbComponent', () => { - let component: BreadcrumbComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ BreadcrumbComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(BreadcrumbComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/dmp-frontend/src/app/widgets/breadcrumb/breadcrumb.component.ts b/dmp-frontend/src/app/widgets/breadcrumb/breadcrumb.component.ts deleted file mode 100644 index ca05e3d89..000000000 --- a/dmp-frontend/src/app/widgets/breadcrumb/breadcrumb.component.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, ActivatedRoute, NavigationEnd } from '@angular/router'; -import {BreadcrumbModule,MenuItem} from 'primeng/primeng'; - -@Component({ - selector: 'breadcrumb', - templateUrl: './breadcrumb.component.html', - styleUrls: ['./breadcrumb.component.css'] -}) -export class BreadcrumbComponent implements OnInit { - - - breadcrumbHome: MenuItem = {icon: 'fa fa-home', routerLink: "/welcome"}; - breadcrumbData: MenuItem[] = new Array(); - - ngOnInit() { - - } - - constructor(private router: Router, private route: ActivatedRoute) { - router.events.subscribe( - event =>{ - //console.log("Router event captured") - //console.log(event) - if(event instanceof NavigationEnd){ - //console.log(event.urlAfterRedirects); - //console.log(this.route); - this.route.children.forEach( child => { - let guessed = this.guessMenuItemFromActivatedRoute(child, event); - this.adaptBreadcrumbByMenuItem(guessed.menuItem, guessed.isBaseComponent); - }) - - } - }); - - } - - - guessMenuItemFromActivatedRoute(activatedRoute : any, event : NavigationEnd) { //it's important to leave it as "any" - - let menuItem : MenuItem = null; - let isBaseComponent : boolean = false; - - let componentName = activatedRoute.component.name; - - let params = activatedRoute.queryParams.getValue(); - let url = event.urlAfterRedirects.split("?")[0]; - let label = null; - - if(componentName == "ProjectsComponent") { - label = "Projects"; - isBaseComponent = true; - } - if(componentName == "DmpComponent"){ - label = "My Data Management Plans"; - isBaseComponent = true; - } - - if(componentName == "DatasetsComponent"){ - label = "Datasets of DMP '"+params["label"]+"'"; - isBaseComponent = false; - } - - if(componentName == "DynamicFormComponent"){ - label = "Form of dataset '"+params["label"]+"'"; - isBaseComponent = false; - } - - if(componentName == "DmpDetailedComponent"){ - label = "Details of DMP '"+params["label"]+"'"; - isBaseComponent = false; - } - - if(componentName == "ProjectDetailedComponent"){ - label = "Details of Project '"+params["label"]+"'"; - isBaseComponent = false; - } - - - if(label != null) - menuItem = {"label": label, "routerLink": url, "queryParams" : params }; - - console.log("COMPONENT NAME="+componentName); - - return {"menuItem": menuItem, "isBaseComponent": isBaseComponent}; - } - - - adaptBreadcrumbByMenuItem(menuItem : MenuItem, isBaseComponent : boolean){ - - if(menuItem==null){ - this.breadcrumbData.length = 0; - return; - } - if(isBaseComponent){ - this.breadcrumbData.length = 0; - } - - let breadcrumbDataNew: MenuItem[] = new Array(); - for(var i=0; i - \ No newline at end of file diff --git a/dmp-frontend/src/app/widgets/confirmation/confirmation.component.spec.ts b/dmp-frontend/src/app/widgets/confirmation/confirmation.component.spec.ts deleted file mode 100644 index fd4da952c..000000000 --- a/dmp-frontend/src/app/widgets/confirmation/confirmation.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ConfirmationComponent } from './confirmation.component'; - -describe('ConfirmationComponent', () => { - let component: ConfirmationComponent; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ConfirmationComponent ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ConfirmationComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should be created', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/dmp-frontend/src/app/widgets/confirmation/confirmation.component.ts b/dmp-frontend/src/app/widgets/confirmation/confirmation.component.ts deleted file mode 100644 index 2f35931d8..000000000 --- a/dmp-frontend/src/app/widgets/confirmation/confirmation.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Component, OnInit, Input,Output,EventEmitter } from '@angular/core'; - -@Component({ - selector: 'confirmation', - templateUrl: './confirmation.component.html', - styleUrls: ['./confirmation.component.css'] -}) -export class ConfirmationComponent implements OnInit { - - @Input() confirmationID : string; - @Input() confirmationTitle : string; - @Input() confirmationDescr : string; - @Input() subjectObj : any; - - @Output() responseSender: EventEmitter = new EventEmitter(); - - constructor() { - - } - - - ngOnInit() { - - } - - saidNo(){ - this.responseSender.emit(false); - } - - saidYes(){ - this.responseSender.emit(true); - } - - -} diff --git a/dmp-frontend/src/assets/bootstrap-notify.min.js b/dmp-frontend/src/assets/bootstrap-notify.min.js deleted file mode 100644 index 01e7f3091..000000000 --- a/dmp-frontend/src/assets/bootstrap-notify.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t("object"==typeof exports?require("jquery"):jQuery)}(function(t){function s(s){var e=!1;return t('[data-notify="container"]').each(function(i,n){var a=t(n),o=a.find('[data-notify="title"]').text().trim(),r=a.find('[data-notify="message"]').html().trim(),l=o===t("
"+s.settings.content.title+"
").html().trim(),d=r===t("
"+s.settings.content.message+"
").html().trim(),g=a.hasClass("alert-"+s.settings.type);return l&&d&&g&&(e=!0),!e}),e}function e(e,n,a){var o={content:{message:"object"==typeof n?n.message:n,title:n.title?n.title:"",icon:n.icon?n.icon:"",url:n.url?n.url:"#",target:n.target?n.target:"-"}};a=t.extend(!0,{},o,a),this.settings=t.extend(!0,{},i,a),this._defaults=i,"-"===this.settings.content.target&&(this.settings.content.target=this.settings.url_target),this.animations={start:"webkitAnimationStart oanimationstart MSAnimationStart animationstart",end:"webkitAnimationEnd oanimationend MSAnimationEnd animationend"},"number"==typeof this.settings.offset&&(this.settings.offset={x:this.settings.offset,y:this.settings.offset}),(this.settings.allow_duplicates||!this.settings.allow_duplicates&&!s(this))&&this.init()}var i={element:"body",position:null,type:"info",allow_dismiss:!0,allow_duplicates:!0,newest_on_top:!1,showProgressbar:!1,placement:{from:"top",align:"right"},offset:20,spacing:10,z_index:1031,delay:5e3,timer:1e3,url_target:"_blank",mouse_over:null,animate:{enter:"animated fadeInDown",exit:"animated fadeOutUp"},onShow:null,onShown:null,onClose:null,onClosed:null,icon_type:"class",template:''};String.format=function(){for(var t=arguments[0],s=1;s .progress-bar').removeClass("progress-bar-"+t.settings.type),t.settings.type=i[n],this.$ele.addClass("alert-"+i[n]).find('[data-notify="progressbar"] > .progress-bar').addClass("progress-bar-"+i[n]);break;case"icon":var a=this.$ele.find('[data-notify="icon"]');"class"===t.settings.icon_type.toLowerCase()?a.removeClass(t.settings.content.icon).addClass(i[n]):(a.is("img")||a.find("img"),a.attr("src",i[n]));break;case"progress":var o=t.settings.delay-t.settings.delay*(i[n]/100);this.$ele.data("notify-delay",o),this.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i[n]).css("width",i[n]+"%");break;case"url":this.$ele.find('[data-notify="url"]').attr("href",i[n]);break;case"target":this.$ele.find('[data-notify="url"]').attr("target",i[n]);break;default:this.$ele.find('[data-notify="'+n+'"]').html(i[n])}var r=this.$ele.outerHeight()+parseInt(t.settings.spacing)+parseInt(t.settings.offset.y);t.reposition(r)},close:function(){t.close()}}},buildNotify:function(){var s=this.settings.content;this.$ele=t(String.format(this.settings.template,this.settings.type,s.title,s.message,s.url,s.target)),this.$ele.attr("data-notify-position",this.settings.placement.from+"-"+this.settings.placement.align),this.settings.allow_dismiss||this.$ele.find('[data-notify="dismiss"]').css("display","none"),(this.settings.delay<=0&&!this.settings.showProgressbar||!this.settings.showProgressbar)&&this.$ele.find('[data-notify="progressbar"]').remove()},setIcon:function(){"class"===this.settings.icon_type.toLowerCase()?this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon):this.$ele.find('[data-notify="icon"]').is("img")?this.$ele.find('[data-notify="icon"]').attr("src",this.settings.content.icon):this.$ele.find('[data-notify="icon"]').append('Notify Icon')},styleDismiss:function(){this.$ele.find('[data-notify="dismiss"]').css({position:"absolute",right:"10px",top:"5px",zIndex:this.settings.z_index+2})},styleURL:function(){this.$ele.find('[data-notify="url"]').css({backgroundImage:"url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)",height:"100%",left:0,position:"absolute",top:0,width:"100%",zIndex:this.settings.z_index+1})},placement:function(){var s=this,e=this.settings.offset.y,i={display:"inline-block",margin:"0px auto",position:this.settings.position?this.settings.position:"body"===this.settings.element?"fixed":"absolute",transition:"all .5s ease-in-out",zIndex:this.settings.z_index},n=!1,a=this.settings;switch(t('[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])').each(function(){e=Math.max(e,parseInt(t(this).css(a.placement.from))+parseInt(t(this).outerHeight())+parseInt(a.spacing))}),this.settings.newest_on_top===!0&&(e=this.settings.offset.y),i[this.settings.placement.from]=e+"px",this.settings.placement.align){case"left":case"right":i[this.settings.placement.align]=this.settings.offset.x+"px";break;case"center":i.left=0,i.right=0}this.$ele.css(i).addClass(this.settings.animate.enter),t.each(Array("webkit-","moz-","o-","ms-",""),function(t,e){s.$ele[0].style[e+"AnimationIterationCount"]=1}),t(this.settings.element).append(this.$ele),this.settings.newest_on_top===!0&&(e=parseInt(e)+parseInt(this.settings.spacing)+this.$ele.outerHeight(),this.reposition(e)),t.isFunction(s.settings.onShow)&&s.settings.onShow.call(this.$ele),this.$ele.one(this.animations.start,function(){n=!0}).one(this.animations.end,function(){s.$ele.removeClass(s.settings.animate.enter),t.isFunction(s.settings.onShown)&&s.settings.onShown.call(this)}),setTimeout(function(){n||t.isFunction(s.settings.onShown)&&s.settings.onShown.call(this)},600)},bind:function(){var s=this;if(this.$ele.find('[data-notify="dismiss"]').on("click",function(){s.close()}),this.$ele.mouseover(function(){t(this).data("data-hover","true")}).mouseout(function(){t(this).data("data-hover","false")}),this.$ele.data("data-hover","false"),this.settings.delay>0){s.$ele.data("notify-delay",s.settings.delay);var e=setInterval(function(){var t=parseInt(s.$ele.data("notify-delay"))-s.settings.timer;if("false"===s.$ele.data("data-hover")&&"pause"===s.settings.mouse_over||"pause"!=s.settings.mouse_over){var i=(s.settings.delay-t)/s.settings.delay*100;s.$ele.data("notify-delay",t),s.$ele.find('[data-notify="progressbar"] > div').attr("aria-valuenow",i).css("width",i+"%")}t<=-s.settings.timer&&(clearInterval(e),s.close())},s.settings.timer)}},close:function(){var s=this,e=parseInt(this.$ele.css(this.settings.placement.from)),i=!1;this.$ele.attr("data-closing","true").addClass(this.settings.animate.exit),s.reposition(e),t.isFunction(s.settings.onClose)&&s.settings.onClose.call(this.$ele),this.$ele.one(this.animations.start,function(){i=!0}).one(this.animations.end,function(){t(this).remove(),t.isFunction(s.settings.onClosed)&&s.settings.onClosed.call(this)}),setTimeout(function(){i||(s.$ele.remove(),s.settings.onClosed&&s.settings.onClosed(s.$ele))},600)},reposition:function(s){var e=this,i='[data-notify-position="'+this.settings.placement.from+"-"+this.settings.placement.align+'"]:not([data-closing="true"])',n=this.$ele.nextAll(i);this.settings.newest_on_top===!0&&(n=this.$ele.prevAll(i)),n.each(function(){t(this).css(e.settings.placement.from,s),s=parseInt(s)+parseInt(e.settings.spacing)+t(this).outerHeight()})}}),t.notify=function(t,s){var i=new e(this,t,s);return i.notify},t.notifyDefaults=function(s){return i=t.extend(!0,{},i,s)},t.notifyClose=function(s){"warning"===s&&(s="danger"),"undefined"==typeof s||"all"===s?t("[data-notify]").find('[data-notify="dismiss"]').trigger("click"):"success"===s||"info"===s||"warning"===s||"danger"===s?t(".alert-"+s+"[data-notify]").find('[data-notify="dismiss"]').trigger("click"):s?t(s+"[data-notify]").find('[data-notify="dismiss"]').trigger("click"):t('[data-notify-position="'+s+'"]').find('[data-notify="dismiss"]').trigger("click")},t.notifyCloseExcept=function(s){"warning"===s&&(s="danger"),"success"===s||"info"===s||"warning"===s||"danger"===s?t("[data-notify]").not(".alert-"+s).find('[data-notify="dismiss"]').trigger("click"):t("[data-notify]").not(s).find('[data-notify="dismiss"]').trigger("click")}}); \ No newline at end of file diff --git a/dmp-frontend/src/assets/date-picker/bootstrap-datetimepicker.min.css b/dmp-frontend/src/assets/date-picker/bootstrap-datetimepicker.min.css deleted file mode 100644 index 5950ad272..000000000 --- a/dmp-frontend/src/assets/date-picker/bootstrap-datetimepicker.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Datetimepicker for Bootstrap 3 - * version : 4.17.47 - * https://github.com/Eonasdan/bootstrap-datetimepicker/ - */.bootstrap-datetimepicker-widget{list-style:none}.bootstrap-datetimepicker-widget.dropdown-menu{display:block;margin:2px 0;padding:4px;width:19em}@media (min-width:768px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:992px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}@media (min-width:1200px){.bootstrap-datetimepicker-widget.dropdown-menu.timepicker-sbs{width:38em}}.bootstrap-datetimepicker-widget.dropdown-menu:before,.bootstrap-datetimepicker-widget.dropdown-menu:after{content:'';display:inline-block;position:absolute}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:before{border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);top:-7px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.bottom:after{border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid white;top:-6px;left:8px}.bootstrap-datetimepicker-widget.dropdown-menu.top:before{border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #ccc;border-top-color:rgba(0,0,0,0.2);bottom:-7px;left:6px}.bootstrap-datetimepicker-widget.dropdown-menu.top:after{border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid white;bottom:-6px;left:7px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.dropdown-menu.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget .list-unstyled{margin:0}.bootstrap-datetimepicker-widget a[data-action]{padding:6px 0}.bootstrap-datetimepicker-widget a[data-action]:active{box-shadow:none}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:54px;font-weight:bold;font-size:1.2em;margin:0}.bootstrap-datetimepicker-widget button[data-action]{padding:6px}.bootstrap-datetimepicker-widget .btn[data-action="incrementHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Increment Hours"}.bootstrap-datetimepicker-widget .btn[data-action="incrementMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Increment Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="decrementHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Decrement Hours"}.bootstrap-datetimepicker-widget .btn[data-action="decrementMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Decrement Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="showHours"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Show Hours"}.bootstrap-datetimepicker-widget .btn[data-action="showMinutes"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Show Minutes"}.bootstrap-datetimepicker-widget .btn[data-action="togglePeriod"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Toggle AM/PM"}.bootstrap-datetimepicker-widget .btn[data-action="clear"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Clear the picker"}.bootstrap-datetimepicker-widget .btn[data-action="today"]::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Set the date to today"}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget .picker-switch::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Toggle Date and Time Screens"}.bootstrap-datetimepicker-widget .picker-switch td{padding:0;margin:0;height:auto;width:auto;line-height:inherit}.bootstrap-datetimepicker-widget .picker-switch td span{line-height:2.5;height:2.5em;width:100%}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget table td,.bootstrap-datetimepicker-widget table th{text-align:center;border-radius:4px}.bootstrap-datetimepicker-widget table th{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table th.picker-switch{width:145px}.bootstrap-datetimepicker-widget table th.disabled,.bootstrap-datetimepicker-widget table th.disabled:hover{background:none;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget table th.prev::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Previous Month"}.bootstrap-datetimepicker-widget table th.next::after{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0;content:"Next Month"}.bootstrap-datetimepicker-widget table thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget table thead tr:first-child th:hover{background:#eee}.bootstrap-datetimepicker-widget table td{height:54px;line-height:54px;width:54px}.bootstrap-datetimepicker-widget table td.cw{font-size:.8em;height:20px;line-height:20px;color:#777}.bootstrap-datetimepicker-widget table td.day{height:20px;line-height:20px;width:20px}.bootstrap-datetimepicker-widget table td.day:hover,.bootstrap-datetimepicker-widget table td.hour:hover,.bootstrap-datetimepicker-widget table td.minute:hover,.bootstrap-datetimepicker-widget table td.second:hover{background:#eee;cursor:pointer}.bootstrap-datetimepicker-widget table td.old,.bootstrap-datetimepicker-widget table td.new{color:#777}.bootstrap-datetimepicker-widget table td.today{position:relative}.bootstrap-datetimepicker-widget table td.today:before{content:'';display:inline-block;border:solid transparent;border-width:0 0 7px 7px;border-bottom-color:#337ab7;border-top-color:rgba(0,0,0,0.2);position:absolute;bottom:4px;right:4px}.bootstrap-datetimepicker-widget table td.active,.bootstrap-datetimepicker-widget table td.active:hover{background-color:#337ab7;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget table td.active.today:before{border-bottom-color:#fff}.bootstrap-datetimepicker-widget table td.disabled,.bootstrap-datetimepicker-widget table td.disabled:hover{background:none;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget table td span{display:inline-block;width:54px;height:54px;line-height:54px;margin:2px 1.5px;cursor:pointer;border-radius:4px}.bootstrap-datetimepicker-widget table td span:hover{background:#eee}.bootstrap-datetimepicker-widget table td span.active{background-color:#337ab7;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget table td span.old{color:#777}.bootstrap-datetimepicker-widget table td span.disabled,.bootstrap-datetimepicker-widget table td span.disabled:hover{background:none;color:#777;cursor:not-allowed}.bootstrap-datetimepicker-widget.usetwentyfour td.hour{height:27px;line-height:27px}.bootstrap-datetimepicker-widget.wider{width:21em}.bootstrap-datetimepicker-widget .datepicker-decades .decade{line-height:1.8em !important}.input-group.date .input-group-addon{cursor:pointer}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0} \ No newline at end of file diff --git a/dmp-frontend/src/assets/date-picker/bootstrap-datetimepicker.min.js b/dmp-frontend/src/assets/date-picker/bootstrap-datetimepicker.min.js deleted file mode 100644 index 724db7689..000000000 --- a/dmp-frontend/src/assets/date-picker/bootstrap-datetimepicker.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(a){"use strict";if("function"==typeof define&&define.amd)define(["jquery","moment"],a);else if("object"==typeof exports)module.exports=a(require("jquery"),require("moment"));else{if("undefined"==typeof jQuery)throw"bootstrap-datetimepicker requires jQuery to be loaded first";if("undefined"==typeof moment)throw"bootstrap-datetimepicker requires Moment.js to be loaded first";a(jQuery,moment)}}(function(a,b){"use strict";if(!b)throw new Error("bootstrap-datetimepicker requires Moment.js to be loaded first");var c=function(c,d){var e,f,g,h,i,j,k,l={},m=!0,n=!1,o=!1,p=0,q=[{clsName:"days",navFnc:"M",navStep:1},{clsName:"months",navFnc:"y",navStep:1},{clsName:"years",navFnc:"y",navStep:10},{clsName:"decades",navFnc:"y",navStep:100}],r=["days","months","years","decades"],s=["top","bottom","auto"],t=["left","right","auto"],u=["default","top","bottom"],v={up:38,38:"up",down:40,40:"down",left:37,37:"left",right:39,39:"right",tab:9,9:"tab",escape:27,27:"escape",enter:13,13:"enter",pageUp:33,33:"pageUp",pageDown:34,34:"pageDown",shift:16,16:"shift",control:17,17:"control",space:32,32:"space",t:84,84:"t",delete:46,46:"delete"},w={},x=function(){return void 0!==b.tz&&void 0!==d.timeZone&&null!==d.timeZone&&""!==d.timeZone},y=function(a){var c;return c=void 0===a||null===a?b():b.isDate(a)||b.isMoment(a)?b(a):x()?b.tz(a,j,d.useStrict,d.timeZone):b(a,j,d.useStrict),x()&&c.tz(d.timeZone),c},z=function(a){if("string"!=typeof a||a.length>1)throw new TypeError("isEnabled expects a single character string parameter");switch(a){case"y":return i.indexOf("Y")!==-1;case"M":return i.indexOf("M")!==-1;case"d":return i.toLowerCase().indexOf("d")!==-1;case"h":case"H":return i.toLowerCase().indexOf("h")!==-1;case"m":return i.indexOf("m")!==-1;case"s":return i.indexOf("s")!==-1;default:return!1}},A=function(){return z("h")||z("m")||z("s")},B=function(){return z("y")||z("M")||z("d")},C=function(){var b=a("").append(a("").append(a("").addClass("prev").attr("data-action","previous").append(a("").addClass(d.icons.previous))).append(a("").addClass("picker-switch").attr("data-action","pickerSwitch").attr("colspan",d.calendarWeeks?"6":"5")).append(a("").addClass("next").attr("data-action","next").append(a("").addClass(d.icons.next)))),c=a("").append(a("").append(a("").attr("colspan",d.calendarWeeks?"8":"7")));return[a("
").addClass("datepicker-days").append(a("").addClass("table-condensed").append(b).append(a(""))),a("
").addClass("datepicker-months").append(a("
").addClass("table-condensed").append(b.clone()).append(c.clone())),a("
").addClass("datepicker-years").append(a("
").addClass("table-condensed").append(b.clone()).append(c.clone())),a("
").addClass("datepicker-decades").append(a("
").addClass("table-condensed").append(b.clone()).append(c.clone()))]},D=function(){var b=a(""),c=a(""),e=a("");return z("h")&&(b.append(a("
").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementHour}).addClass("btn").attr("data-action","incrementHours").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-hour").attr({"data-time-component":"hours",title:d.tooltips.pickHour}).attr("data-action","showHours"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementHour}).addClass("btn").attr("data-action","decrementHours").append(a("").addClass(d.icons.down))))),z("m")&&(z("h")&&(b.append(a("").addClass("separator")),c.append(a("").addClass("separator").html(":")),e.append(a("").addClass("separator"))),b.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementMinute}).addClass("btn").attr("data-action","incrementMinutes").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-minute").attr({"data-time-component":"minutes",title:d.tooltips.pickMinute}).attr("data-action","showMinutes"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementMinute}).addClass("btn").attr("data-action","decrementMinutes").append(a("").addClass(d.icons.down))))),z("s")&&(z("m")&&(b.append(a("").addClass("separator")),c.append(a("").addClass("separator").html(":")),e.append(a("").addClass("separator"))),b.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.incrementSecond}).addClass("btn").attr("data-action","incrementSeconds").append(a("").addClass(d.icons.up)))),c.append(a("").append(a("").addClass("timepicker-second").attr({"data-time-component":"seconds",title:d.tooltips.pickSecond}).attr("data-action","showSeconds"))),e.append(a("").append(a("").attr({href:"#",tabindex:"-1",title:d.tooltips.decrementSecond}).addClass("btn").attr("data-action","decrementSeconds").append(a("").addClass(d.icons.down))))),h||(b.append(a("").addClass("separator")),c.append(a("").append(a("").addClass("separator"))),a("
").addClass("timepicker-picker").append(a("").addClass("table-condensed").append([b,c,e]))},E=function(){var b=a("
").addClass("timepicker-hours").append(a("
").addClass("table-condensed")),c=a("
").addClass("timepicker-minutes").append(a("
").addClass("table-condensed")),d=a("
").addClass("timepicker-seconds").append(a("
").addClass("table-condensed")),e=[D()];return z("h")&&e.push(b),z("m")&&e.push(c),z("s")&&e.push(d),e},F=function(){var b=[];return d.showTodayButton&&b.push(a("
").append(a("").attr({"data-action":"today",title:d.tooltips.today}).append(a("").addClass(d.icons.today)))),!d.sideBySide&&B()&&A()&&b.push(a("").append(a("").attr({"data-action":"togglePicker",title:d.tooltips.selectTime}).append(a("").addClass(d.icons.time)))),d.showClear&&b.push(a("").append(a("").attr({"data-action":"clear",title:d.tooltips.clear}).append(a("").addClass(d.icons.clear)))),d.showClose&&b.push(a("").append(a("").attr({"data-action":"close",title:d.tooltips.close}).append(a("").addClass(d.icons.close)))),a("").addClass("table-condensed").append(a("").append(a("").append(b)))},G=function(){var b=a("
").addClass("bootstrap-datetimepicker-widget dropdown-menu"),c=a("
").addClass("datepicker").append(C()),e=a("
").addClass("timepicker").append(E()),f=a("
    ").addClass("list-unstyled"),g=a("
  • ").addClass("picker-switch"+(d.collapse?" accordion-toggle":"")).append(F());return d.inline&&b.removeClass("dropdown-menu"),h&&b.addClass("usetwentyfour"),z("s")&&!h&&b.addClass("wider"),d.sideBySide&&B()&&A()?(b.addClass("timepicker-sbs"),"top"===d.toolbarPlacement&&b.append(g),b.append(a("
    ").addClass("row").append(c.addClass("col-md-6")).append(e.addClass("col-md-6"))),"bottom"===d.toolbarPlacement&&b.append(g),b):("top"===d.toolbarPlacement&&f.append(g),B()&&f.append(a("
  • ").addClass(d.collapse&&A()?"collapse in":"").append(c)),"default"===d.toolbarPlacement&&f.append(g),A()&&f.append(a("
  • ").addClass(d.collapse&&B()?"collapse":"").append(e)),"bottom"===d.toolbarPlacement&&f.append(g),b.append(f))},H=function(){var b,e={};return b=c.is("input")||d.inline?c.data():c.find("input").data(),b.dateOptions&&b.dateOptions instanceof Object&&(e=a.extend(!0,e,b.dateOptions)),a.each(d,function(a){var c="date"+a.charAt(0).toUpperCase()+a.slice(1);void 0!==b[c]&&(e[a]=b[c])}),e},I=function(){var b,e=(n||c).position(),f=(n||c).offset(),g=d.widgetPositioning.vertical,h=d.widgetPositioning.horizontal;if(d.widgetParent)b=d.widgetParent.append(o);else if(c.is("input"))b=c.after(o).parent();else{if(d.inline)return void(b=c.append(o));b=c,c.children().first().after(o)}if("auto"===g&&(g=f.top+1.5*o.height()>=a(window).height()+a(window).scrollTop()&&o.height()+c.outerHeight()a(window).width()?"right":"left"),"top"===g?o.addClass("top").removeClass("bottom"):o.addClass("bottom").removeClass("top"),"right"===h?o.addClass("pull-right"):o.removeClass("pull-right"),"static"===b.css("position")&&(b=b.parents().filter(function(){return"static"!==a(this).css("position")}).first()),0===b.length)throw new Error("datetimepicker component should be placed within a non-static positioned container");o.css({top:"top"===g?"auto":e.top+c.outerHeight(),bottom:"top"===g?b.outerHeight()-(b===c?0:e.top):"auto",left:"left"===h?b===c?0:e.left:"auto",right:"left"===h?"auto":b.outerWidth()-c.outerWidth()-(b===c?0:e.left)})},J=function(a){"dp.change"===a.type&&(a.date&&a.date.isSame(a.oldDate)||!a.date&&!a.oldDate)||c.trigger(a)},K=function(a){"y"===a&&(a="YYYY"),J({type:"dp.update",change:a,viewDate:f.clone()})},L=function(a){o&&(a&&(k=Math.max(p,Math.min(3,k+a))),o.find(".datepicker > div").hide().filter(".datepicker-"+q[k].clsName).show())},M=function(){var b=a("
"),c=f.clone().startOf("w").startOf("d");for(d.calendarWeeks===!0&&b.append(a(""),d.calendarWeeks&&c.append('"),j.push(c)),k=["day"],b.isBefore(f,"M")&&k.push("old"),b.isAfter(f,"M")&&k.push("new"),b.isSame(e,"d")&&!m&&k.push("active"),R(b,"d")||k.push("disabled"),b.isSame(y(),"d")&&k.push("today"),0!==b.day()&&6!==b.day()||k.push("weekend"),J({type:"dp.classify",date:b,classNames:k}),c.append('"),b.add(1,"d");h.find("tbody").empty().append(j),T(),U(),V()}},X=function(){var b=o.find(".timepicker-hours table"),c=f.clone().startOf("d"),d=[],e=a("");for(f.hour()>11&&!h&&c.hour(12);c.isSame(f,"d")&&(h||f.hour()<12&&c.hour()<12||f.hour()>11);)c.hour()%4===0&&(e=a(""),d.push(e)),e.append('"),c.add(1,"h");b.empty().append(d)},Y=function(){for(var b=o.find(".timepicker-minutes table"),c=f.clone().startOf("h"),e=[],g=a(""),h=1===d.stepping?5:d.stepping;f.isSame(c,"h");)c.minute()%(4*h)===0&&(g=a(""),e.push(g)),g.append('"),c.add(h,"m");b.empty().append(e)},Z=function(){for(var b=o.find(".timepicker-seconds table"),c=f.clone().startOf("m"),d=[],e=a("");f.isSame(c,"m");)c.second()%20===0&&(e=a(""),d.push(e)),e.append('"),c.add(5,"s");b.empty().append(d)},$=function(){var a,b,c=o.find(".timepicker span[data-time-component]");h||(a=o.find(".timepicker [data-action=togglePeriod]"),b=e.clone().add(e.hours()>=12?-12:12,"h"),a.text(e.format("A")),R(b,"h")?a.removeClass("disabled"):a.addClass("disabled")),c.filter("[data-time-component=hours]").text(e.format(h?"HH":"hh")),c.filter("[data-time-component=minutes]").text(e.format("mm")),c.filter("[data-time-component=seconds]").text(e.format("ss")),X(),Y(),Z()},_=function(){o&&(W(),$())},aa=function(a){var b=m?null:e;if(!a)return m=!0,g.val(""),c.data("date",""),J({type:"dp.change",date:!1,oldDate:b}),void _();if(a=a.clone().locale(d.locale),x()&&a.tz(d.timeZone),1!==d.stepping)for(a.minutes(Math.round(a.minutes()/d.stepping)*d.stepping).seconds(0);d.minDate&&a.isBefore(d.minDate);)a.add(d.stepping,"minutes");R(a)?(e=a,f=e.clone(),g.val(e.format(i)),c.data("date",e.format(i)),m=!1,_(),J({type:"dp.change",date:e.clone(),oldDate:b})):(d.keepInvalid?J({type:"dp.change",date:a,oldDate:b}):g.val(m?"":e.format(i)),J({type:"dp.error",date:a,oldDate:b}))},ba=function(){var b=!1;return o?(o.find(".collapse").each(function(){var c=a(this).data("collapse");return!c||!c.transitioning||(b=!0,!1)}),b?l:(n&&n.hasClass("btn")&&n.toggleClass("active"),o.hide(),a(window).off("resize",I),o.off("click","[data-action]"),o.off("mousedown",!1),o.remove(),o=!1,J({type:"dp.hide",date:e.clone()}),g.blur(),f=e.clone(),l)):l},ca=function(){aa(null)},da=function(a){return void 0===d.parseInputDate?(!b.isMoment(a)||a instanceof Date)&&(a=y(a)):a=d.parseInputDate(a),a},ea={next:function(){var a=q[k].navFnc;f.add(q[k].navStep,a),W(),K(a)},previous:function(){var a=q[k].navFnc;f.subtract(q[k].navStep,a),W(),K(a)},pickerSwitch:function(){L(1)},selectMonth:function(b){var c=a(b.target).closest("tbody").find("span").index(a(b.target));f.month(c),k===p?(aa(e.clone().year(f.year()).month(f.month())),d.inline||ba()):(L(-1),W()),K("M")},selectYear:function(b){var c=parseInt(a(b.target).text(),10)||0;f.year(c),k===p?(aa(e.clone().year(f.year())),d.inline||ba()):(L(-1),W()),K("YYYY")},selectDecade:function(b){var c=parseInt(a(b.target).data("selection"),10)||0;f.year(c),k===p?(aa(e.clone().year(f.year())),d.inline||ba()):(L(-1),W()),K("YYYY")},selectDay:function(b){var c=f.clone();a(b.target).is(".old")&&c.subtract(1,"M"),a(b.target).is(".new")&&c.add(1,"M"),aa(c.date(parseInt(a(b.target).text(),10))),A()||d.keepOpen||d.inline||ba()},incrementHours:function(){var a=e.clone().add(1,"h");R(a,"h")&&aa(a)},incrementMinutes:function(){var a=e.clone().add(d.stepping,"m");R(a,"m")&&aa(a)},incrementSeconds:function(){var a=e.clone().add(1,"s");R(a,"s")&&aa(a)},decrementHours:function(){var a=e.clone().subtract(1,"h");R(a,"h")&&aa(a)},decrementMinutes:function(){var a=e.clone().subtract(d.stepping,"m");R(a,"m")&&aa(a)},decrementSeconds:function(){var a=e.clone().subtract(1,"s");R(a,"s")&&aa(a)},togglePeriod:function(){aa(e.clone().add(e.hours()>=12?-12:12,"h"))},togglePicker:function(b){var c,e=a(b.target),f=e.closest("ul"),g=f.find(".in"),h=f.find(".collapse:not(.in)");if(g&&g.length){if(c=g.data("collapse"),c&&c.transitioning)return;g.collapse?(g.collapse("hide"),h.collapse("show")):(g.removeClass("in"),h.addClass("in")),e.is("span")?e.toggleClass(d.icons.time+" "+d.icons.date):e.find("span").toggleClass(d.icons.time+" "+d.icons.date)}},showPicker:function(){o.find(".timepicker > div:not(.timepicker-picker)").hide(),o.find(".timepicker .timepicker-picker").show()},showHours:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-hours").show()},showMinutes:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-minutes").show()},showSeconds:function(){o.find(".timepicker .timepicker-picker").hide(),o.find(".timepicker .timepicker-seconds").show()},selectHour:function(b){var c=parseInt(a(b.target).text(),10);h||(e.hours()>=12?12!==c&&(c+=12):12===c&&(c=0)),aa(e.clone().hours(c)),ea.showPicker.call(l)},selectMinute:function(b){aa(e.clone().minutes(parseInt(a(b.target).text(),10))),ea.showPicker.call(l)},selectSecond:function(b){aa(e.clone().seconds(parseInt(a(b.target).text(),10))),ea.showPicker.call(l)},clear:ca,today:function(){var a=y();R(a,"d")&&aa(a)},close:ba},fa=function(b){return!a(b.currentTarget).is(".disabled")&&(ea[a(b.currentTarget).data("action")].apply(l,arguments),!1)},ga=function(){var b,c={year:function(a){return a.month(0).date(1).hours(0).seconds(0).minutes(0)},month:function(a){return a.date(1).hours(0).seconds(0).minutes(0)},day:function(a){return a.hours(0).seconds(0).minutes(0)},hour:function(a){return a.seconds(0).minutes(0)},minute:function(a){return a.seconds(0)}};return g.prop("disabled")||!d.ignoreReadonly&&g.prop("readonly")||o?l:(void 0!==g.val()&&0!==g.val().trim().length?aa(da(g.val().trim())):m&&d.useCurrent&&(d.inline||g.is("input")&&0===g.val().trim().length)&&(b=y(),"string"==typeof d.useCurrent&&(b=c[d.useCurrent](b)),aa(b)),o=G(),M(),S(),o.find(".timepicker-hours").hide(),o.find(".timepicker-minutes").hide(),o.find(".timepicker-seconds").hide(),_(),L(),a(window).on("resize",I),o.on("click","[data-action]",fa),o.on("mousedown",!1),n&&n.hasClass("btn")&&n.toggleClass("active"),I(),o.show(),d.focusOnShow&&!g.is(":focus")&&g.focus(),J({type:"dp.show"}),l)},ha=function(){return o?ba():ga()},ia=function(a){var b,c,e,f,g=null,h=[],i={},j=a.which,k="p";w[j]=k;for(b in w)w.hasOwnProperty(b)&&w[b]===k&&(h.push(b),parseInt(b,10)!==j&&(i[b]=!0));for(b in d.keyBinds)if(d.keyBinds.hasOwnProperty(b)&&"function"==typeof d.keyBinds[b]&&(e=b.split(" "),e.length===h.length&&v[j]===e[e.length-1])){for(f=!0,c=e.length-2;c>=0;c--)if(!(v[e[c]]in i)){f=!1;break}if(f){g=d.keyBinds[b];break}}g&&(g.call(l,o),a.stopPropagation(),a.preventDefault())},ja=function(a){w[a.which]="r",a.stopPropagation(),a.preventDefault()},ka=function(b){var c=a(b.target).val().trim(),d=c?da(c):null;return aa(d),b.stopImmediatePropagation(),!1},la=function(){g.on({change:ka,blur:d.debug?"":ba,keydown:ia,keyup:ja,focus:d.allowInputToggle?ga:""}),c.is("input")?g.on({focus:ga}):n&&(n.on("click",ha),n.on("mousedown",!1))},ma=function(){g.off({change:ka,blur:blur,keydown:ia,keyup:ja,focus:d.allowInputToggle?ba:""}),c.is("input")?g.off({focus:ga}):n&&(n.off("click",ha),n.off("mousedown",!1))},na=function(b){var c={};return a.each(b,function(){var a=da(this);a.isValid()&&(c[a.format("YYYY-MM-DD")]=!0)}),!!Object.keys(c).length&&c},oa=function(b){var c={};return a.each(b,function(){c[this]=!0}),!!Object.keys(c).length&&c},pa=function(){var a=d.format||"L LT";i=a.replace(/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,function(a){var b=e.localeData().longDateFormat(a)||a;return b.replace(/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,function(a){return e.localeData().longDateFormat(a)||a})}),j=d.extraFormats?d.extraFormats.slice():[],j.indexOf(a)<0&&j.indexOf(i)<0&&j.push(i),h=i.toLowerCase().indexOf("a")<1&&i.replace(/\[.*?\]/g,"").indexOf("h")<1,z("y")&&(p=2),z("M")&&(p=1),z("d")&&(p=0),k=Math.max(p,k),m||aa(e)};if(l.destroy=function(){ba(),ma(),c.removeData("DateTimePicker"),c.removeData("date")},l.toggle=ha,l.show=ga,l.hide=ba,l.disable=function(){return ba(),n&&n.hasClass("btn")&&n.addClass("disabled"),g.prop("disabled",!0),l},l.enable=function(){return n&&n.hasClass("btn")&&n.removeClass("disabled"),g.prop("disabled",!1),l},l.ignoreReadonly=function(a){if(0===arguments.length)return d.ignoreReadonly;if("boolean"!=typeof a)throw new TypeError("ignoreReadonly () expects a boolean parameter");return d.ignoreReadonly=a,l},l.options=function(b){if(0===arguments.length)return a.extend(!0,{},d);if(!(b instanceof Object))throw new TypeError("options() options parameter should be an object");return a.extend(!0,d,b),a.each(d,function(a,b){if(void 0===l[a])throw new TypeError("option "+a+" is not recognized!");l[a](b)}),l},l.date=function(a){if(0===arguments.length)return m?null:e.clone();if(!(null===a||"string"==typeof a||b.isMoment(a)||a instanceof Date))throw new TypeError("date() parameter must be one of [null, string, moment or Date]");return aa(null===a?null:da(a)),l},l.format=function(a){if(0===arguments.length)return d.format;if("string"!=typeof a&&("boolean"!=typeof a||a!==!1))throw new TypeError("format() expects a string or boolean:false parameter "+a);return d.format=a,i&&pa(),l},l.timeZone=function(a){if(0===arguments.length)return d.timeZone;if("string"!=typeof a)throw new TypeError("newZone() expects a string parameter");return d.timeZone=a,l},l.dayViewHeaderFormat=function(a){if(0===arguments.length)return d.dayViewHeaderFormat;if("string"!=typeof a)throw new TypeError("dayViewHeaderFormat() expects a string parameter");return d.dayViewHeaderFormat=a,l},l.extraFormats=function(a){if(0===arguments.length)return d.extraFormats;if(a!==!1&&!(a instanceof Array))throw new TypeError("extraFormats() expects an array or false parameter");return d.extraFormats=a,j&&pa(),l},l.disabledDates=function(b){if(0===arguments.length)return d.disabledDates?a.extend({},d.disabledDates):d.disabledDates;if(!b)return d.disabledDates=!1,_(),l;if(!(b instanceof Array))throw new TypeError("disabledDates() expects an array parameter");return d.disabledDates=na(b),d.enabledDates=!1,_(),l},l.enabledDates=function(b){if(0===arguments.length)return d.enabledDates?a.extend({},d.enabledDates):d.enabledDates;if(!b)return d.enabledDates=!1,_(),l;if(!(b instanceof Array))throw new TypeError("enabledDates() expects an array parameter");return d.enabledDates=na(b),d.disabledDates=!1,_(),l},l.daysOfWeekDisabled=function(a){if(0===arguments.length)return d.daysOfWeekDisabled.splice(0);if("boolean"==typeof a&&!a)return d.daysOfWeekDisabled=!1,_(),l;if(!(a instanceof Array))throw new TypeError("daysOfWeekDisabled() expects an array parameter");if(d.daysOfWeekDisabled=a.reduce(function(a,b){return b=parseInt(b,10),b>6||b<0||isNaN(b)?a:(a.indexOf(b)===-1&&a.push(b),a)},[]).sort(),d.useCurrent&&!d.keepInvalid){for(var b=0;!R(e,"d");){if(e.add(1,"d"),31===b)throw"Tried 31 times to find a valid date";b++}aa(e)}return _(),l},l.maxDate=function(a){if(0===arguments.length)return d.maxDate?d.maxDate.clone():d.maxDate;if("boolean"==typeof a&&a===!1)return d.maxDate=!1,_(),l;"string"==typeof a&&("now"!==a&&"moment"!==a||(a=y()));var b=da(a);if(!b.isValid())throw new TypeError("maxDate() Could not parse date parameter: "+a);if(d.minDate&&b.isBefore(d.minDate))throw new TypeError("maxDate() date parameter is before options.minDate: "+b.format(i));return d.maxDate=b,d.useCurrent&&!d.keepInvalid&&e.isAfter(a)&&aa(d.maxDate),f.isAfter(b)&&(f=b.clone().subtract(d.stepping,"m")),_(),l},l.minDate=function(a){if(0===arguments.length)return d.minDate?d.minDate.clone():d.minDate;if("boolean"==typeof a&&a===!1)return d.minDate=!1,_(),l;"string"==typeof a&&("now"!==a&&"moment"!==a||(a=y()));var b=da(a);if(!b.isValid())throw new TypeError("minDate() Could not parse date parameter: "+a);if(d.maxDate&&b.isAfter(d.maxDate))throw new TypeError("minDate() date parameter is after options.maxDate: "+b.format(i));return d.minDate=b,d.useCurrent&&!d.keepInvalid&&e.isBefore(a)&&aa(d.minDate),f.isBefore(b)&&(f=b.clone().add(d.stepping,"m")),_(),l},l.defaultDate=function(a){if(0===arguments.length)return d.defaultDate?d.defaultDate.clone():d.defaultDate;if(!a)return d.defaultDate=!1,l;"string"==typeof a&&(a="now"===a||"moment"===a?y():y(a));var b=da(a);if(!b.isValid())throw new TypeError("defaultDate() Could not parse date parameter: "+a);if(!R(b))throw new TypeError("defaultDate() date passed is invalid according to component setup validations");return d.defaultDate=b,(d.defaultDate&&d.inline||""===g.val().trim())&&aa(d.defaultDate),l},l.locale=function(a){if(0===arguments.length)return d.locale;if(!b.localeData(a))throw new TypeError("locale() locale "+a+" is not loaded from moment locales!");return d.locale=a,e.locale(d.locale),f.locale(d.locale),i&&pa(),o&&(ba(),ga()),l},l.stepping=function(a){return 0===arguments.length?d.stepping:(a=parseInt(a,10),(isNaN(a)||a<1)&&(a=1),d.stepping=a,l)},l.useCurrent=function(a){var b=["year","month","day","hour","minute"];if(0===arguments.length)return d.useCurrent;if("boolean"!=typeof a&&"string"!=typeof a)throw new TypeError("useCurrent() expects a boolean or string parameter");if("string"==typeof a&&b.indexOf(a.toLowerCase())===-1)throw new TypeError("useCurrent() expects a string parameter of "+b.join(", "));return d.useCurrent=a,l},l.collapse=function(a){if(0===arguments.length)return d.collapse;if("boolean"!=typeof a)throw new TypeError("collapse() expects a boolean parameter");return d.collapse===a?l:(d.collapse=a,o&&(ba(),ga()),l)},l.icons=function(b){if(0===arguments.length)return a.extend({},d.icons);if(!(b instanceof Object))throw new TypeError("icons() expects parameter to be an Object");return a.extend(d.icons,b),o&&(ba(),ga()),l},l.tooltips=function(b){if(0===arguments.length)return a.extend({},d.tooltips);if(!(b instanceof Object))throw new TypeError("tooltips() expects parameter to be an Object");return a.extend(d.tooltips,b),o&&(ba(),ga()),l},l.useStrict=function(a){if(0===arguments.length)return d.useStrict;if("boolean"!=typeof a)throw new TypeError("useStrict() expects a boolean parameter");return d.useStrict=a,l},l.sideBySide=function(a){if(0===arguments.length)return d.sideBySide;if("boolean"!=typeof a)throw new TypeError("sideBySide() expects a boolean parameter");return d.sideBySide=a,o&&(ba(),ga()),l},l.viewMode=function(a){if(0===arguments.length)return d.viewMode;if("string"!=typeof a)throw new TypeError("viewMode() expects a string parameter");if(r.indexOf(a)===-1)throw new TypeError("viewMode() parameter must be one of ("+r.join(", ")+") value");return d.viewMode=a,k=Math.max(r.indexOf(a),p),L(),l},l.toolbarPlacement=function(a){if(0===arguments.length)return d.toolbarPlacement;if("string"!=typeof a)throw new TypeError("toolbarPlacement() expects a string parameter");if(u.indexOf(a)===-1)throw new TypeError("toolbarPlacement() parameter must be one of ("+u.join(", ")+") value");return d.toolbarPlacement=a,o&&(ba(),ga()),l},l.widgetPositioning=function(b){if(0===arguments.length)return a.extend({},d.widgetPositioning);if("[object Object]"!=={}.toString.call(b))throw new TypeError("widgetPositioning() expects an object variable");if(b.horizontal){if("string"!=typeof b.horizontal)throw new TypeError("widgetPositioning() horizontal variable must be a string");if(b.horizontal=b.horizontal.toLowerCase(),t.indexOf(b.horizontal)===-1)throw new TypeError("widgetPositioning() expects horizontal parameter to be one of ("+t.join(", ")+")");d.widgetPositioning.horizontal=b.horizontal}if(b.vertical){if("string"!=typeof b.vertical)throw new TypeError("widgetPositioning() vertical variable must be a string");if(b.vertical=b.vertical.toLowerCase(),s.indexOf(b.vertical)===-1)throw new TypeError("widgetPositioning() expects vertical parameter to be one of ("+s.join(", ")+")");d.widgetPositioning.vertical=b.vertical}return _(),l},l.calendarWeeks=function(a){if(0===arguments.length)return d.calendarWeeks;if("boolean"!=typeof a)throw new TypeError("calendarWeeks() expects parameter to be a boolean value");return d.calendarWeeks=a,_(),l},l.showTodayButton=function(a){if(0===arguments.length)return d.showTodayButton;if("boolean"!=typeof a)throw new TypeError("showTodayButton() expects a boolean parameter");return d.showTodayButton=a,o&&(ba(),ga()),l},l.showClear=function(a){if(0===arguments.length)return d.showClear;if("boolean"!=typeof a)throw new TypeError("showClear() expects a boolean parameter");return d.showClear=a,o&&(ba(),ga()),l},l.widgetParent=function(b){if(0===arguments.length)return d.widgetParent;if("string"==typeof b&&(b=a(b)),null!==b&&"string"!=typeof b&&!(b instanceof a))throw new TypeError("widgetParent() expects a string or a jQuery object parameter");return d.widgetParent=b,o&&(ba(),ga()),l},l.keepOpen=function(a){if(0===arguments.length)return d.keepOpen;if("boolean"!=typeof a)throw new TypeError("keepOpen() expects a boolean parameter");return d.keepOpen=a,l},l.focusOnShow=function(a){if(0===arguments.length)return d.focusOnShow;if("boolean"!=typeof a)throw new TypeError("focusOnShow() expects a boolean parameter");return d.focusOnShow=a,l},l.inline=function(a){if(0===arguments.length)return d.inline;if("boolean"!=typeof a)throw new TypeError("inline() expects a boolean parameter");return d.inline=a,l},l.clear=function(){return ca(),l},l.keyBinds=function(a){return 0===arguments.length?d.keyBinds:(d.keyBinds=a,l)},l.getMoment=function(a){return y(a)},l.debug=function(a){if("boolean"!=typeof a)throw new TypeError("debug() expects a boolean parameter");return d.debug=a,l},l.allowInputToggle=function(a){if(0===arguments.length)return d.allowInputToggle;if("boolean"!=typeof a)throw new TypeError("allowInputToggle() expects a boolean parameter");return d.allowInputToggle=a,l},l.showClose=function(a){if(0===arguments.length)return d.showClose;if("boolean"!=typeof a)throw new TypeError("showClose() expects a boolean parameter");return d.showClose=a,l},l.keepInvalid=function(a){if(0===arguments.length)return d.keepInvalid;if("boolean"!=typeof a)throw new TypeError("keepInvalid() expects a boolean parameter"); -return d.keepInvalid=a,l},l.datepickerInput=function(a){if(0===arguments.length)return d.datepickerInput;if("string"!=typeof a)throw new TypeError("datepickerInput() expects a string parameter");return d.datepickerInput=a,l},l.parseInputDate=function(a){if(0===arguments.length)return d.parseInputDate;if("function"!=typeof a)throw new TypeError("parseInputDate() sholud be as function");return d.parseInputDate=a,l},l.disabledTimeIntervals=function(b){if(0===arguments.length)return d.disabledTimeIntervals?a.extend({},d.disabledTimeIntervals):d.disabledTimeIntervals;if(!b)return d.disabledTimeIntervals=!1,_(),l;if(!(b instanceof Array))throw new TypeError("disabledTimeIntervals() expects an array parameter");return d.disabledTimeIntervals=b,_(),l},l.disabledHours=function(b){if(0===arguments.length)return d.disabledHours?a.extend({},d.disabledHours):d.disabledHours;if(!b)return d.disabledHours=!1,_(),l;if(!(b instanceof Array))throw new TypeError("disabledHours() expects an array parameter");if(d.disabledHours=oa(b),d.enabledHours=!1,d.useCurrent&&!d.keepInvalid){for(var c=0;!R(e,"h");){if(e.add(1,"h"),24===c)throw"Tried 24 times to find a valid date";c++}aa(e)}return _(),l},l.enabledHours=function(b){if(0===arguments.length)return d.enabledHours?a.extend({},d.enabledHours):d.enabledHours;if(!b)return d.enabledHours=!1,_(),l;if(!(b instanceof Array))throw new TypeError("enabledHours() expects an array parameter");if(d.enabledHours=oa(b),d.disabledHours=!1,d.useCurrent&&!d.keepInvalid){for(var c=0;!R(e,"h");){if(e.add(1,"h"),24===c)throw"Tried 24 times to find a valid date";c++}aa(e)}return _(),l},l.viewDate=function(a){if(0===arguments.length)return f.clone();if(!a)return f=e.clone(),l;if(!("string"==typeof a||b.isMoment(a)||a instanceof Date))throw new TypeError("viewDate() parameter must be one of [string, moment or Date]");return f=da(a),K(),l},c.is("input"))g=c;else if(g=c.find(d.datepickerInput),0===g.length)g=c.find("input");else if(!g.is("input"))throw new Error('CSS class "'+d.datepickerInput+'" cannot be applied to non input element');if(c.hasClass("input-group")&&(n=0===c.find(".datepickerbutton").length?c.find(".input-group-addon"):c.find(".datepickerbutton")),!d.inline&&!g.is("input"))throw new Error("Could not initialize DateTimePicker without an input element");return e=y(),f=e.clone(),a.extend(!0,d,H()),l.options(d),pa(),la(),g.prop("disabled")&&l.disable(),g.is("input")&&0!==g.val().trim().length?aa(da(g.val().trim())):d.defaultDate&&void 0===g.attr("placeholder")&&aa(d.defaultDate),d.inline&&ga(),l};return a.fn.datetimepicker=function(b){b=b||{};var d,e=Array.prototype.slice.call(arguments,1),f=!0,g=["destroy","hide","show","toggle"];if("object"==typeof b)return this.each(function(){var d,e=a(this);e.data("DateTimePicker")||(d=a.extend(!0,{},a.fn.datetimepicker.defaults,b),e.data("DateTimePicker",c(e,d)))});if("string"==typeof b)return this.each(function(){var c=a(this),g=c.data("DateTimePicker");if(!g)throw new Error('bootstrap-datetimepicker("'+b+'") method was called on an element that is not using DateTimePicker');d=g[b].apply(g,e),f=d===g}),f||a.inArray(b,g)>-1?this:d;throw new TypeError("Invalid arguments for DateTimePicker: "+b)},a.fn.datetimepicker.defaults={timeZone:"",format:!1,dayViewHeaderFormat:"MMMM YYYY",extraFormats:!1,stepping:1,minDate:!1,maxDate:!1,useCurrent:!0,collapse:!0,locale:b.locale(),defaultDate:!1,disabledDates:!1,enabledDates:!1,icons:{time:"glyphicon glyphicon-time",date:"glyphicon glyphicon-calendar",up:"glyphicon glyphicon-chevron-up",down:"glyphicon glyphicon-chevron-down",previous:"glyphicon glyphicon-chevron-left",next:"glyphicon glyphicon-chevron-right",today:"glyphicon glyphicon-screenshot",clear:"glyphicon glyphicon-trash",close:"glyphicon glyphicon-remove"},tooltips:{today:"Go to today",clear:"Clear selection",close:"Close the picker",selectMonth:"Select Month",prevMonth:"Previous Month",nextMonth:"Next Month",selectYear:"Select Year",prevYear:"Previous Year",nextYear:"Next Year",selectDecade:"Select Decade",prevDecade:"Previous Decade",nextDecade:"Next Decade",prevCentury:"Previous Century",nextCentury:"Next Century",pickHour:"Pick Hour",incrementHour:"Increment Hour",decrementHour:"Decrement Hour",pickMinute:"Pick Minute",incrementMinute:"Increment Minute",decrementMinute:"Decrement Minute",pickSecond:"Pick Second",incrementSecond:"Increment Second",decrementSecond:"Decrement Second",togglePeriod:"Toggle Period",selectTime:"Select Time"},useStrict:!1,sideBySide:!1,daysOfWeekDisabled:!1,calendarWeeks:!1,viewMode:"days",toolbarPlacement:"default",showTodayButton:!1,showClear:!1,showClose:!1,widgetPositioning:{horizontal:"auto",vertical:"auto"},widgetParent:null,ignoreReadonly:!1,keepOpen:!1,focusOnShow:!0,inline:!1,keepInvalid:!1,datepickerInput:".datepickerinput",keyBinds:{up:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().subtract(7,"d")):this.date(b.clone().add(this.stepping(),"m"))}},down:function(a){if(!a)return void this.show();var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().add(7,"d")):this.date(b.clone().subtract(this.stepping(),"m"))},"control up":function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().subtract(1,"y")):this.date(b.clone().add(1,"h"))}},"control down":function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")?this.date(b.clone().add(1,"y")):this.date(b.clone().subtract(1,"h"))}},left:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().subtract(1,"d"))}},right:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().add(1,"d"))}},pageUp:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().subtract(1,"M"))}},pageDown:function(a){if(a){var b=this.date()||this.getMoment();a.find(".datepicker").is(":visible")&&this.date(b.clone().add(1,"M"))}},enter:function(){this.hide()},escape:function(){this.hide()},"control space":function(a){a&&a.find(".timepicker").is(":visible")&&a.find('.btn[data-action="togglePeriod"]').click()},t:function(){this.date(this.getMoment())},delete:function(){this.clear()}},debug:!1,allowInputToggle:!1,disabledTimeIntervals:!1,disabledHours:!1,enabledHours:!1,viewDate:!1},a.fn.datetimepicker}); \ No newline at end of file diff --git a/dmp-frontend/src/assets/date-picker/moment.min.js b/dmp-frontend/src/assets/date-picker/moment.min.js deleted file mode 100644 index 1332abebf..000000000 --- a/dmp-frontend/src/assets/date-picker/moment.min.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";function e(){return Yt.apply(null,arguments)}function t(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function n(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function s(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(e.hasOwnProperty(t))return!1;return!0}function i(e){return void 0===e}function r(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function a(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function o(e,t){var n,s=[];for(n=0;n0)for(n=0;n=0?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+s}function C(e,t,n,s){var i=s;"string"==typeof s&&(i=function(){return this[s]()}),e&&(Vt[e]=i),t&&(Vt[t[0]]=function(){return R(i.apply(this,arguments),t[1],t[2])}),n&&(Vt[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function F(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function U(e){var t,n,s=e.match(Ht);for(t=0,n=s.length;t=0&&Lt.test(e);)e=e.replace(Lt,function(e){return t.longDateFormat(e)||e}),Lt.lastIndex=0,n-=1;return e}function L(e,t,n){rn[e]=D(t)?t:function(e,s){return e&&n?n:t}}function G(e,t){return u(rn,e)?rn[e](t._strict,t._locale):new RegExp(V(e))}function V(e){return j(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,s,i){return t||n||s||i}))}function j(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function I(e,t){var n,s=t;for("string"==typeof e&&(e=[e]),r(t)&&(s=function(e,n){n[t]=w(e)}),n=0;n=0&&isFinite(o.getFullYear())&&o.setFullYear(e),o}function se(e){var t=new Date(Date.UTC.apply(null,arguments));return e<100&&e>=0&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e),t}function ie(e,t,n){var s=7+t-n;return-((7+se(e,0,s).getUTCDay()-t)%7)+s-1}function re(e,t,n,s,i){var r,a,o=1+7*(t-1)+(7+n-s)%7+ie(e,s,i);return o<=0?a=z(r=e-1)+o:o>z(e)?(r=e+1,a=o-z(e)):(r=e,a=o),{year:r,dayOfYear:a}}function ae(e,t,n){var s,i,r=ie(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+oe(i=e.year()-1,t,n):a>oe(e.year(),t,n)?(s=a-oe(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function oe(e,t,n){var s=ie(e,t,n),i=ie(e+1,t,n);return(z(e)-s+i)/7}function ue(e,t){return"string"!=typeof e?e:isNaN(e)?"number"==typeof(e=t.weekdaysParse(e))?e:null:parseInt(e,10)}function le(e,t){return"string"==typeof e?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function de(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=d([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=yn.call(this._weekdaysParse,a))?i:null:"ddd"===t?-1!==(i=yn.call(this._shortWeekdaysParse,a))?i:null:-1!==(i=yn.call(this._minWeekdaysParse,a))?i:null:"dddd"===t?-1!==(i=yn.call(this._weekdaysParse,a))?i:-1!==(i=yn.call(this._shortWeekdaysParse,a))?i:-1!==(i=yn.call(this._minWeekdaysParse,a))?i:null:"ddd"===t?-1!==(i=yn.call(this._shortWeekdaysParse,a))?i:-1!==(i=yn.call(this._weekdaysParse,a))?i:-1!==(i=yn.call(this._minWeekdaysParse,a))?i:null:-1!==(i=yn.call(this._minWeekdaysParse,a))?i:-1!==(i=yn.call(this._weekdaysParse,a))?i:-1!==(i=yn.call(this._shortWeekdaysParse,a))?i:null}function he(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],l=[];for(t=0;t<7;t++)n=d([2e3,1]).day(t),s=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),r=this.weekdays(n,""),a.push(s),o.push(i),u.push(r),l.push(s),l.push(i),l.push(r);for(a.sort(e),o.sort(e),u.sort(e),l.sort(e),t=0;t<7;t++)o[t]=j(o[t]),u[t]=j(u[t]),l[t]=j(l[t]);this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function ce(){return this.hours()%12||12}function fe(e,t){C(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function me(e,t){return t._meridiemParse}function _e(e){return e?e.toLowerCase().replace("_","-"):e}function ye(e){for(var t,n,s,i,r=0;r0;){if(s=ge(i.slice(0,t).join("-")))return s;if(n&&n.length>=t&&v(i,n,!0)>=t-1)break;t--}r++}return null}function ge(e){var t=null;if(!Fn[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=Pn._abbr,require("./locale/"+e),pe(t)}catch(e){}return Fn[e]}function pe(e,t){var n;return e&&(n=i(t)?ve(e):we(e,t))&&(Pn=n),Pn._abbr}function we(e,t){if(null!==t){var n=Cn;if(t.abbr=e,null!=Fn[e])S("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=Fn[e]._config;else if(null!=t.parentLocale){if(null==Fn[t.parentLocale])return Un[t.parentLocale]||(Un[t.parentLocale]=[]),Un[t.parentLocale].push({name:e,config:t}),null;n=Fn[t.parentLocale]._config}return Fn[e]=new O(Y(n,t)),Un[e]&&Un[e].forEach(function(e){we(e.name,e.config)}),pe(e),Fn[e]}return delete Fn[e],null}function ve(e){var n;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return Pn;if(!t(e)){if(n=ge(e))return n;e=[e]}return ye(e)}function Me(e){var t,n=e._a;return n&&-2===c(e).overflow&&(t=n[un]<0||n[un]>11?un:n[ln]<1||n[ln]>Q(n[on],n[un])?ln:n[dn]<0||n[dn]>24||24===n[dn]&&(0!==n[hn]||0!==n[cn]||0!==n[fn])?dn:n[hn]<0||n[hn]>59?hn:n[cn]<0||n[cn]>59?cn:n[fn]<0||n[fn]>999?fn:-1,c(e)._overflowDayOfYear&&(tln)&&(t=ln),c(e)._overflowWeeks&&-1===t&&(t=mn),c(e)._overflowWeekday&&-1===t&&(t=_n),c(e).overflow=t),e}function ke(e,t,n){return null!=e?e:null!=t?t:n}function Se(t){var n=new Date(e.now());return t._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()]}function De(e){var t,n,s,i,r=[];if(!e._d){for(s=Se(e),e._w&&null==e._a[ln]&&null==e._a[un]&&Ye(e),null!=e._dayOfYear&&(i=ke(e._a[on],s[on]),(e._dayOfYear>z(i)||0===e._dayOfYear)&&(c(e)._overflowDayOfYear=!0),n=se(i,0,e._dayOfYear),e._a[un]=n.getUTCMonth(),e._a[ln]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=r[t]=s[t];for(;t<7;t++)e._a[t]=r[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[dn]&&0===e._a[hn]&&0===e._a[cn]&&0===e._a[fn]&&(e._nextDay=!0,e._a[dn]=0),e._d=(e._useUTC?se:ne).apply(null,r),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[dn]=24),e._w&&void 0!==e._w.d&&e._w.d!==e._d.getDay()&&(c(e).weekdayMismatch=!0)}}function Ye(e){var t,n,s,i,r,a,o,u;if(null!=(t=e._w).GG||null!=t.W||null!=t.E)r=1,a=4,n=ke(t.GG,e._a[on],ae(Ie(),1,4).year),s=ke(t.W,1),((i=ke(t.E,1))<1||i>7)&&(u=!0);else{r=e._locale._week.dow,a=e._locale._week.doy;var l=ae(Ie(),r,a);n=ke(t.gg,e._a[on],l.year),s=ke(t.w,l.week),null!=t.d?((i=t.d)<0||i>6)&&(u=!0):null!=t.e?(i=t.e+r,(t.e<0||t.e>6)&&(u=!0)):i=r}s<1||s>oe(n,r,a)?c(e)._overflowWeeks=!0:null!=u?c(e)._overflowWeekday=!0:(o=re(n,s,i,r,a),e._a[on]=o.year,e._dayOfYear=o.dayOfYear)}function Oe(e){var t,n,s,i,r,a,o=e._i,u=Nn.exec(o)||Hn.exec(o);if(u){for(c(e).iso=!0,t=0,n=Gn.length;t0&&c(t).unusedInput.push(a),o=o.slice(o.indexOf(s)+s.length),l+=s.length),Vt[r]?(s?c(t).empty=!1:c(t).unusedTokens.push(r),A(r,s,t)):t._strict&&!s&&c(t).unusedTokens.push(r);c(t).charsLeftOver=u-l,o.length>0&&c(t).unusedInput.push(o),t._a[dn]<=12&&!0===c(t).bigHour&&t._a[dn]>0&&(c(t).bigHour=void 0),c(t).parsedDateParts=t._a.slice(0),c(t).meridiem=t._meridiem,t._a[dn]=Ue(t._locale,t._a[dn],t._meridiem),De(t),Me(t)}else Re(t);else Oe(t)}function Ue(e,t,n){var s;return null==n?t:null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?((s=e.isPM(n))&&t<12&&(t+=12),s||12!==t||(t=0),t):t}function Ne(e){var t,n,s,i,r;if(0===e._f.length)return c(e).invalidFormat=!0,void(e._d=new Date(NaN));for(i=0;ir&&(t=r),dt.call(this,e,t,n,s,i))}function dt(e,t,n,s,i){var r=re(e,t,n,s,i),a=se(r.year,0,r.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}function ht(e){return e}function ct(e,t,n,s){var i=ve(),r=d().set(s,t);return i[n](r,e)}function ft(e,t,n){if(r(e)&&(t=e,e=void 0),e=e||"",null!=t)return ct(e,t,n,"month");var s,i=[];for(s=0;s<12;s++)i[s]=ct(e,s,n,"month");return i}function mt(e,t,n,s){"boolean"==typeof e?(r(t)&&(n=t,t=void 0),t=t||""):(n=t=e,e=!1,r(t)&&(n=t,t=void 0),t=t||"");var i=ve(),a=e?i._week.dow:0;if(null!=n)return ct(t,(n+a)%7,s,"day");var o,u=[];for(o=0;o<7;o++)u[o]=ct(t,(o+a)%7,s,"day");return u}function _t(e,t,n,s){var i=Ke(t,n);return e._milliseconds+=s*i._milliseconds,e._days+=s*i._days,e._months+=s*i._months,e._bubble()}function yt(e){return e<0?Math.floor(e):Math.ceil(e)}function gt(e){return 4800*e/146097}function pt(e){return 146097*e/4800}function wt(e){return function(){return this.as(e)}}function vt(e){return function(){return this.isValid()?this._data[e]:NaN}}function Mt(e,t,n,s,i){return i.relativeTime(t||1,!!n,e,s)}function kt(e,t,n){var s=Ke(e).abs(),i=ks(s.as("s")),r=ks(s.as("m")),a=ks(s.as("h")),o=ks(s.as("d")),u=ks(s.as("M")),l=ks(s.as("y")),d=i<=Ss.ss&&["s",i]||i0,d[4]=n,Mt.apply(null,d)}function St(e){return(e>0)-(e<0)||+e}function Dt(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n,s=Ds(this._milliseconds)/1e3,i=Ds(this._days),r=Ds(this._months);t=p((e=p(s/60))/60),s%=60,e%=60;var a=n=p(r/12),o=r%=12,u=i,l=t,d=e,h=s?s.toFixed(3).replace(/\.?0+$/,""):"",c=this.asSeconds();if(!c)return"P0D";var f=c<0?"-":"",m=St(this._months)!==St(c)?"-":"",_=St(this._days)!==St(c)?"-":"",y=St(this._milliseconds)!==St(c)?"-":"";return f+"P"+(a?m+a+"Y":"")+(o?m+o+"M":"")+(u?_+u+"D":"")+(l||d||h?"T":"")+(l?y+l+"H":"")+(d?y+d+"M":"")+(h?y+h+"S":"")}var Yt,Ot;Ot=Array.prototype.some?Array.prototype.some:function(e){for(var t=Object(this),n=t.length>>>0,s=0;s68?1900:2e3)};var yn,gn=$("FullYear",!0);yn=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;tthis?this:e:m()}),Zn=["year","quarter","month","week","day","hour","minute","second","millisecond"];qe("Z",":"),qe("ZZ",""),L("Z",tn),L("ZZ",tn),I(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=Je(tn,e)});var $n=/([\+\-]|\d\d)/gi;e.updateOffset=function(){};var qn=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Jn=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Ke.fn=ze.prototype,Ke.invalid=function(){return Ke(NaN)};var Bn=st(1,"add"),Qn=st(-1,"subtract");e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",e.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Xn=k("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});C(0,["gg",2],0,function(){return this.weekYear()%100}),C(0,["GG",2],0,function(){return this.isoWeekYear()%100}),ut("gggg","weekYear"),ut("ggggg","weekYear"),ut("GGGG","isoWeekYear"),ut("GGGGG","isoWeekYear"),x("weekYear","gg"),x("isoWeekYear","GG"),P("weekYear",1),P("isoWeekYear",1),L("G",Kt),L("g",Kt),L("GG",Zt,It),L("gg",Zt,It),L("GGGG",Bt,At),L("gggg",Bt,At),L("GGGGG",Qt,zt),L("ggggg",Qt,zt),E(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,s){t[s.substr(0,2)]=w(e)}),E(["gg","GG"],function(t,n,s,i){n[i]=e.parseTwoDigitYear(t)}),C("Q",0,"Qo","quarter"),x("quarter","Q"),P("quarter",7),L("Q",jt),I("Q",function(e,t){t[un]=3*(w(e)-1)}),C("D",["DD",2],"Do","date"),x("date","D"),P("date",9),L("D",Zt),L("DD",Zt,It),L("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),I(["D","DD"],ln),I("Do",function(e,t){t[ln]=w(e.match(Zt)[0],10)});var Kn=$("Date",!0);C("DDD",["DDDD",3],"DDDo","dayOfYear"),x("dayOfYear","DDD"),P("dayOfYear",4),L("DDD",Jt),L("DDDD",Et),I(["DDD","DDDD"],function(e,t,n){n._dayOfYear=w(e)}),C("m",["mm",2],0,"minute"),x("minute","m"),P("minute",14),L("m",Zt),L("mm",Zt,It),I(["m","mm"],hn);var es=$("Minutes",!1);C("s",["ss",2],0,"second"),x("second","s"),P("second",15),L("s",Zt),L("ss",Zt,It),I(["s","ss"],cn);var ts=$("Seconds",!1);C("S",0,0,function(){return~~(this.millisecond()/100)}),C(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),C(0,["SSS",3],0,"millisecond"),C(0,["SSSS",4],0,function(){return 10*this.millisecond()}),C(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),C(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),C(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),C(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),C(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),x("millisecond","ms"),P("millisecond",16),L("S",Jt,jt),L("SS",Jt,It),L("SSS",Jt,Et);var ns;for(ns="SSSS";ns.length<=9;ns+="S")L(ns,Xt);for(ns="S";ns.length<=9;ns+="S")I(ns,function(e,t){t[fn]=w(1e3*("0."+e))});var ss=$("Milliseconds",!1);C("z",0,0,"zoneAbbr"),C("zz",0,0,"zoneName");var is=y.prototype;is.add=Bn,is.calendar=function(t,n){var s=t||Ie(),i=Be(s,this).startOf("day"),r=e.calendarFormat(this,i)||"sameElse",a=n&&(D(n[r])?n[r].call(this,s):n[r]);return this.format(a||this.localeData().calendar(r,this,Ie(s)))},is.clone=function(){return new y(this)},is.diff=function(e,t,n){var s,i,r;if(!this.isValid())return NaN;if(!(s=Be(e,this)).isValid())return NaN;switch(i=6e4*(s.utcOffset()-this.utcOffset()),t=T(t)){case"year":r=rt(this,s)/12;break;case"month":r=rt(this,s);break;case"quarter":r=rt(this,s)/3;break;case"second":r=(this-s)/1e3;break;case"minute":r=(this-s)/6e4;break;case"hour":r=(this-s)/36e5;break;case"day":r=(this-s-i)/864e5;break;case"week":r=(this-s-i)/6048e5;break;default:r=this-s}return n?r:p(r)},is.endOf=function(e){return void 0===(e=T(e))||"millisecond"===e?this:("date"===e&&(e="day"),this.startOf(e).add(1,"isoWeek"===e?"week":e).subtract(1,"ms"))},is.format=function(t){t||(t=this.isUtc()?e.defaultFormatUtc:e.defaultFormat);var n=N(this,t);return this.localeData().postformat(n)},is.from=function(e,t){return this.isValid()&&(g(e)&&e.isValid()||Ie(e).isValid())?Ke({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},is.fromNow=function(e){return this.from(Ie(),e)},is.to=function(e,t){return this.isValid()&&(g(e)&&e.isValid()||Ie(e).isValid())?Ke({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},is.toNow=function(e){return this.to(Ie(),e)},is.get=function(e){return e=T(e),D(this[e])?this[e]():this},is.invalidAt=function(){return c(this).overflow},is.isAfter=function(e,t){var n=g(e)?e:Ie(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=T(i(t)?"millisecond":t))?this.valueOf()>n.valueOf():n.valueOf()9999?N(e,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):D(Date.prototype.toISOString)?this.toDate().toISOString():N(e,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")},is.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="";this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z");var n="["+e+'("]',s=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i=t+'[")]';return this.format(n+s+"-MM-DD[T]HH:mm:ss.SSS"+i)},is.toJSON=function(){return this.isValid()?this.toISOString():null},is.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},is.unix=function(){return Math.floor(this.valueOf()/1e3)},is.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},is.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},is.year=gn,is.isLeapYear=function(){return Z(this.year())},is.weekYear=function(e){return lt.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},is.isoWeekYear=function(e){return lt.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},is.quarter=is.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},is.month=ee,is.daysInMonth=function(){return Q(this.year(),this.month())},is.week=is.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")},is.isoWeek=is.isoWeeks=function(e){var t=ae(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")},is.weeksInYear=function(){var e=this.localeData()._week;return oe(this.year(),e.dow,e.doy)},is.isoWeeksInYear=function(){return oe(this.year(),1,4)},is.date=Kn,is.day=is.days=function(e){if(!this.isValid())return null!=e?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(e=ue(e,this.localeData()),this.add(e-t,"d")):t},is.weekday=function(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")},is.isoWeekday=function(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){var t=le(e,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7},is.dayOfYear=function(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")},is.hour=is.hours=Rn,is.minute=is.minutes=es,is.second=is.seconds=ts,is.millisecond=is.milliseconds=ss,is.utcOffset=function(t,n,s){var i,r=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=Je(tn,t)))return this}else Math.abs(t)<16&&!s&&(t*=60);return!this._isUTC&&n&&(i=Qe(this)),this._offset=t,this._isUTC=!0,null!=i&&this.add(i,"m"),r!==t&&(!n||this._changeInProgress?it(this,Ke(t-r,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,e.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?r:Qe(this)},is.utc=function(e){return this.utcOffset(0,e)},is.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(Qe(this),"m")),this},is.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var e=Je(en,this._i);null!=e?this.utcOffset(e):this.utcOffset(0,!0)}return this},is.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?Ie(e).utcOffset():0,(this.utcOffset()-e)%60==0)},is.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},is.isLocal=function(){return!!this.isValid()&&!this._isUTC},is.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},is.isUtc=Xe,is.isUTC=Xe,is.zoneAbbr=function(){return this._isUTC?"UTC":""},is.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},is.dates=k("dates accessor is deprecated. Use date instead.",Kn),is.months=k("months accessor is deprecated. Use month instead",ee),is.years=k("years accessor is deprecated. Use year instead",gn),is.zone=k("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),is.isDSTShifted=k("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!i(this._isDSTShifted))return this._isDSTShifted;var e={};if(_(e,this),(e=Ge(e))._a){var t=e._isUTC?d(e._a):Ie(e._a);this._isDSTShifted=this.isValid()&&v(e._a,t.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var rs=O.prototype;rs.calendar=function(e,t,n){var s=this._calendar[e]||this._calendar.sameElse;return D(s)?s.call(t,n):s},rs.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.replace(/MMMM|MM|DD|dddd/g,function(e){return e.slice(1)}),this._longDateFormat[e])},rs.invalidDate=function(){return this._invalidDate},rs.ordinal=function(e){return this._ordinal.replace("%d",e)},rs.preparse=ht,rs.postformat=ht,rs.relativeTime=function(e,t,n,s){var i=this._relativeTime[n];return D(i)?i(e,t,n,s):i.replace(/%d/i,e)},rs.pastFuture=function(e,t){var n=this._relativeTime[e>0?"future":"past"];return D(n)?n(t):n.replace(/%s/i,t)},rs.set=function(e){var t,n;for(n in e)D(t=e[n])?this[n]=t:this["_"+n]=t;this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},rs.months=function(e,n){return e?t(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||pn).test(n)?"format":"standalone"][e.month()]:t(this._months)?this._months:this._months.standalone},rs.monthsShort=function(e,n){return e?t(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[pn.test(n)?"format":"standalone"][e.month()]:t(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},rs.monthsParse=function(e,t,n){var s,i,r;if(this._monthsParseExact)return X.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(i=d([2e3,s]),n&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[s]||(r="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[s]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[s].test(e))return s;if(n&&"MMM"===t&&this._shortMonthsParse[s].test(e))return s;if(!n&&this._monthsParse[s].test(e))return s}},rs.monthsRegex=function(e){return this._monthsParseExact?(u(this,"_monthsRegex")||te.call(this),e?this._monthsStrictRegex:this._monthsRegex):(u(this,"_monthsRegex")||(this._monthsRegex=kn),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},rs.monthsShortRegex=function(e){return this._monthsParseExact?(u(this,"_monthsRegex")||te.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(u(this,"_monthsShortRegex")||(this._monthsShortRegex=Mn),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},rs.week=function(e){return ae(e,this._week.dow,this._week.doy).week},rs.firstDayOfYear=function(){return this._week.doy},rs.firstDayOfWeek=function(){return this._week.dow},rs.weekdays=function(e,n){return e?t(this._weekdays)?this._weekdays[e.day()]:this._weekdays[this._weekdays.isFormat.test(n)?"format":"standalone"][e.day()]:t(this._weekdays)?this._weekdays:this._weekdays.standalone},rs.weekdaysMin=function(e){return e?this._weekdaysMin[e.day()]:this._weekdaysMin},rs.weekdaysShort=function(e){return e?this._weekdaysShort[e.day()]:this._weekdaysShort},rs.weekdaysParse=function(e,t,n){var s,i,r;if(this._weekdaysParseExact)return de.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(i=d([2e3,1]).day(s),n&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp("^"+this.weekdays(i,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[s]=new RegExp("^"+this.weekdaysShort(i,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[s]=new RegExp("^"+this.weekdaysMin(i,"").replace(".",".?")+"$","i")),this._weekdaysParse[s]||(r="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[s]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[s].test(e))return s;if(n&&"ddd"===t&&this._shortWeekdaysParse[s].test(e))return s;if(n&&"dd"===t&&this._minWeekdaysParse[s].test(e))return s;if(!n&&this._weekdaysParse[s].test(e))return s}},rs.weekdaysRegex=function(e){return this._weekdaysParseExact?(u(this,"_weekdaysRegex")||he.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(u(this,"_weekdaysRegex")||(this._weekdaysRegex=xn),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},rs.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(u(this,"_weekdaysRegex")||he.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(u(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Tn),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},rs.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(u(this,"_weekdaysRegex")||he.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(u(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=bn),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},rs.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},rs.meridiem=function(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"},pe("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===w(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),e.lang=k("moment.lang is deprecated. Use moment.locale instead.",pe),e.langData=k("moment.langData is deprecated. Use moment.localeData instead.",ve);var as=Math.abs,os=wt("ms"),us=wt("s"),ls=wt("m"),ds=wt("h"),hs=wt("d"),cs=wt("w"),fs=wt("M"),ms=wt("y"),_s=vt("milliseconds"),ys=vt("seconds"),gs=vt("minutes"),ps=vt("hours"),ws=vt("days"),vs=vt("months"),Ms=vt("years"),ks=Math.round,Ss={ss:44,s:45,m:45,h:22,d:26,M:11},Ds=Math.abs,Ys=ze.prototype;return Ys.isValid=function(){return this._isValid},Ys.abs=function(){var e=this._data;return this._milliseconds=as(this._milliseconds),this._days=as(this._days),this._months=as(this._months),e.milliseconds=as(e.milliseconds),e.seconds=as(e.seconds),e.minutes=as(e.minutes),e.hours=as(e.hours),e.months=as(e.months),e.years=as(e.years),this},Ys.add=function(e,t){return _t(this,e,t,1)},Ys.subtract=function(e,t){return _t(this,e,t,-1)},Ys.as=function(e){if(!this.isValid())return NaN;var t,n,s=this._milliseconds;if("month"===(e=T(e))||"year"===e)return t=this._days+s/864e5,n=this._months+gt(t),"month"===e?n:n/12;switch(t=this._days+Math.round(pt(this._months)),e){case"week":return t/7+s/6048e5;case"day":return t+s/864e5;case"hour":return 24*t+s/36e5;case"minute":return 1440*t+s/6e4;case"second":return 86400*t+s/1e3;case"millisecond":return Math.floor(864e5*t)+s;default:throw new Error("Unknown unit "+e)}},Ys.asMilliseconds=os,Ys.asSeconds=us,Ys.asMinutes=ls,Ys.asHours=ds,Ys.asDays=hs,Ys.asWeeks=cs,Ys.asMonths=fs,Ys.asYears=ms,Ys.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*w(this._months/12):NaN},Ys._bubble=function(){var e,t,n,s,i,r=this._milliseconds,a=this._days,o=this._months,u=this._data;return r>=0&&a>=0&&o>=0||r<=0&&a<=0&&o<=0||(r+=864e5*yt(pt(o)+a),a=0,o=0),u.milliseconds=r%1e3,e=p(r/1e3),u.seconds=e%60,t=p(e/60),u.minutes=t%60,n=p(t/60),u.hours=n%24,a+=p(n/24),i=p(gt(a)),o+=i,a-=yt(pt(i)),s=p(o/12),o%=12,u.days=a,u.months=o,u.years=s,this},Ys.clone=function(){return Ke(this)},Ys.get=function(e){return e=T(e),this.isValid()?this[e+"s"]():NaN},Ys.milliseconds=_s,Ys.seconds=ys,Ys.minutes=gs,Ys.hours=ps,Ys.days=ws,Ys.weeks=function(){return p(this.days()/7)},Ys.months=vs,Ys.years=Ms,Ys.humanize=function(e){if(!this.isValid())return this.localeData().invalidDate();var t=this.localeData(),n=kt(this,!e,t);return e&&(n=t.pastFuture(+this,n)),t.postformat(n)},Ys.toISOString=Dt,Ys.toString=Dt,Ys.toJSON=Dt,Ys.locale=at,Ys.localeData=ot,Ys.toIsoString=k("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Dt),Ys.lang=Xn,C("X",0,0,"unix"),C("x",0,0,"valueOf"),L("x",Kt),L("X",nn),I("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e,10))}),I("x",function(e,t,n){n._d=new Date(w(e))}),e.version="2.19.1",function(e){Yt=e}(Ie),e.fn=is,e.min=function(){return Ee("isBefore",[].slice.call(arguments,0))},e.max=function(){return Ee("isAfter",[].slice.call(arguments,0))},e.now=function(){return Date.now?Date.now():+new Date},e.utc=d,e.unix=function(e){return Ie(1e3*e)},e.months=function(e,t){return ft(e,t,"months")},e.isDate=a,e.locale=pe,e.invalid=m,e.duration=Ke,e.isMoment=g,e.weekdays=function(e,t,n){return mt(e,t,n,"weekdays")},e.parseZone=function(){return Ie.apply(null,arguments).parseZone()},e.localeData=ve,e.isDuration=Ze,e.monthsShort=function(e,t){return ft(e,t,"monthsShort")},e.weekdaysMin=function(e,t,n){return mt(e,t,n,"weekdaysMin")},e.defineLocale=we,e.updateLocale=function(e,t){if(null!=t){var n,s=Cn;null!=Fn[e]&&(s=Fn[e]._config),(n=new O(t=Y(s,t))).parentLocale=Fn[e],Fn[e]=n,pe(e)}else null!=Fn[e]&&(null!=Fn[e].parentLocale?Fn[e]=Fn[e].parentLocale:null!=Fn[e]&&delete Fn[e]);return Fn[e]},e.locales=function(){return Pt(Fn)},e.weekdaysShort=function(e,t,n){return mt(e,t,n,"weekdaysShort")},e.normalizeUnits=T,e.relativeTimeRounding=function(e){return void 0===e?ks:"function"==typeof e&&(ks=e,!0)},e.relativeTimeThreshold=function(e,t){return void 0!==Ss[e]&&(void 0===t?Ss[e]:(Ss[e]=t,"s"===e&&(Ss.ss=t-1),!0))},e.calendarFormat=function(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},e.prototype=is,e}); \ No newline at end of file diff --git a/dmp-frontend/src/assets/icons/google-icon.svg b/dmp-frontend/src/assets/icons/google-icon.svg deleted file mode 100644 index 06dc52f0a..000000000 --- a/dmp-frontend/src/assets/icons/google-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dmp-frontend/src/assets/icons/google-logo.svg b/dmp-frontend/src/assets/icons/google-logo.svg deleted file mode 100644 index 519fe653e..000000000 --- a/dmp-frontend/src/assets/icons/google-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/dmp-frontend/src/assets/icons/google_logo.png b/dmp-frontend/src/assets/icons/google_logo.png deleted file mode 100644 index dd259538d..000000000 Binary files a/dmp-frontend/src/assets/icons/google_logo.png and /dev/null differ diff --git a/dmp-frontend/src/assets/icons/index.dual-gear-loading-icon.svg b/dmp-frontend/src/assets/icons/index.dual-gear-loading-icon.svg deleted file mode 100644 index 22f36a1ef..000000000 --- a/dmp-frontend/src/assets/icons/index.dual-gear-loading-icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/dmp-frontend/src/assets/icons/user-icon.png b/dmp-frontend/src/assets/icons/user-icon.png deleted file mode 100644 index fa881fcdd..000000000 Binary files a/dmp-frontend/src/assets/icons/user-icon.png and /dev/null differ diff --git a/dmp-frontend/src/assets/jquery.json-viewer.css b/dmp-frontend/src/assets/jquery.json-viewer.css deleted file mode 100644 index 2c72ae5fa..000000000 --- a/dmp-frontend/src/assets/jquery.json-viewer.css +++ /dev/null @@ -1,47 +0,0 @@ -/* Syntax highlighting for JSON objects */ -ul.json-dict, ol.json-array { - list-style-type: none; - margin: 0 0 0 1px; - border-left: 1px dotted #ccc; - padding-left: 2em; -} -.json-string { - color: #0B7500; -} -.json-literal { - color: #1A01CC; - font-weight: bold; -} - -/* Toggle button */ -a.json-toggle { - position: relative; - color: inherit; - text-decoration: none; -} -a.json-toggle:focus { - outline: none; -} -a.json-toggle:before { - color: #aaa; - content: "\25BC"; /* down arrow */ - position: absolute; - display: inline-block; - width: 1em; - left: -1em; -} -a.json-toggle.collapsed:before { - transform: rotate(-90deg); /* Use rotated down arrow, prevents right arrow appearing smaller than down arrow in some browsers */ - -ms-transform: rotate(-90deg); - -webkit-transform: rotate(-90deg); -} - -/* Collapsable placeholder links */ -a.json-placeholder { - color: #aaa; - padding: 0 1em; - text-decoration: none; -} -a.json-placeholder:hover { - text-decoration: underline; -} diff --git a/dmp-frontend/src/assets/jquery.json-viewer.js b/dmp-frontend/src/assets/jquery.json-viewer.js deleted file mode 100644 index 3ecbc3f7b..000000000 --- a/dmp-frontend/src/assets/jquery.json-viewer.js +++ /dev/null @@ -1,148 +0,0 @@ -/** - * jQuery json-viewer - * @author: Alexandre Bodelot - */ -(function($){ - - /** - * Check if arg is either an array with at least 1 element, or a dict with at least 1 key - * @return boolean - */ - function isCollapsable(arg) { - return arg instanceof Object && Object.keys(arg).length > 0; - } - - /** - * Check if a string represents a valid url - * @return boolean - */ - function isUrl(string) { - var regexp = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/; - return regexp.test(string); - } - - /** - * Transform a json object into html representation - * @return string - */ - function json2html(json, options) { - var html = ''; - if (typeof json === 'string') { - /* Escape tags */ - json = json.replace(/&/g, '&').replace(//g, '>'); - if (isUrl(json)) - html += '' + json + ''; - else - html += '"' + json + '"'; - } - else if (typeof json === 'number') { - html += '' + json + ''; - } - else if (typeof json === 'boolean') { - html += '' + json + ''; - } - else if (json === null) { - html += 'null'; - } - else if (json instanceof Array) { - if (json.length > 0) { - html += '[
    '; - for (var i = 0; i < json.length; ++i) { - html += '
  1. '; - /* Add toggle button if item is collapsable */ - if (isCollapsable(json[i])) { - html += ''; - } - html += json2html(json[i], options); - /* Add comma if item is not last */ - if (i < json.length - 1) { - html += ','; - } - html += '
  2. '; - } - html += '
]'; - } - else { - html += '[]'; - } - } - else if (typeof json === 'object') { - var key_count = Object.keys(json).length; - if (key_count > 0) { - html += '{
    '; - for (var key in json) { - if (json.hasOwnProperty(key)) { - html += '
  • '; - var keyRepr = options.withQuotes ? - '"' + key + '"' : key; - /* Add toggle button if item is collapsable */ - if (isCollapsable(json[key])) { - html += '' + keyRepr + ''; - } - else { - html += keyRepr; - } - html += ': ' + json2html(json[key], options); - /* Add comma if item is not last */ - if (--key_count > 0) - html += ','; - html += '
  • '; - } - } - html += '
}'; - } - else { - html += '{}'; - } - } - return html; - } - - /** - * jQuery plugin method - * @param json: a javascript object - * @param options: an optional options hash - */ - $.fn.jsonViewer = function(json, options) { - options = options || {}; - - /* jQuery chaining */ - return this.each(function() { - - /* Transform to HTML */ - var html = json2html(json, options); - if (isCollapsable(json)) - html = '' + html; - - /* Insert HTML in target DOM element */ - $(this).html(html); - - /* Bind click on toggle buttons */ - $(this).off('click'); - $(this).on('click', 'a.json-toggle', function() { - var target = $(this).toggleClass('collapsed').siblings('ul.json-dict, ol.json-array'); - target.toggle(); - if (target.is(':visible')) { - target.siblings('.json-placeholder').remove(); - } - else { - var count = target.children('li').length; - var placeholder = count + (count > 1 ? ' items' : ' item'); - target.after('' + placeholder + ''); - } - return false; - }); - - /* Simulate click on toggle button when placeholder is clicked */ - $(this).on('click', 'a.json-placeholder', function() { - $(this).siblings('a.json-toggle').click(); - return false; - }); - - if (options.collapsed == true) { - /* Trigger click to collapse all nodes */ - $(this).find('a.json-toggle').click(); - } - }); - }; -})(jQuery); diff --git a/dmp-frontend/src/assets/jquery.scrollTo.min.js b/dmp-frontend/src/assets/jquery.scrollTo.min.js deleted file mode 100644 index 65a020d92..000000000 --- a/dmp-frontend/src/assets/jquery.scrollTo.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Copyright (c) 2007-2015 Ariel Flesler - afleslergmailcom | http://flesler.blogspot.com - * Licensed under MIT - * @author Ariel Flesler - * @version 2.1.2 - */ -;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1.panel-heading{padding:5px;position:relative;border-top-right-radius:0;border-top-left-radius:0}.lobipanel>.panel-heading>.panel-title{float:left;max-width:calc(100% - 30px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:16px;line-height:30px;padding-left:15px}.lobipanel>.panel-heading>.panel-title h1,.lobipanel>.panel-heading>.panel-title h2,.lobipanel>.panel-heading>.panel-title h3,.lobipanel>.panel-heading>.panel-title h4,.lobipanel>.panel-heading>.panel-title h5,.lobipanel>.panel-heading>.panel-title h6{margin:0;line-height:30px}.lobipanel>.panel-heading>.panel-title input{color:inherit;line-height:30px;border-radius:2px;padding:0 5px;width:100%;background-color:rgba(0,0,0,.2);border:1px solid #337ab7;outline:0}.lobipanel>.panel-heading>.panel-title input:focus{background-color:rgba(0,0,0,.15)}.lobipanel>.panel-heading .dropdown{display:inline-block;float:right;position:relative}.lobipanel>.panel-heading .dropdown .dropdown-menu{left:auto;right:0;min-width:initial;margin-top:0;border-radius:0}.lobipanel>.panel-heading .dropdown .dropdown-menu>li>a .control-title{display:inline-block;margin-left:15px}.lobipanel>.panel-heading .dropdown .dropdown-toggle{border:none;outline:0;background-color:transparent;text-align:center;padding:0;width:30px;font-size:14px;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.lobipanel>.panel-heading .dropdown .dropdown-toggle .panel-control-icon{top:0;line-height:30px}.lobipanel>.panel-heading .dropdown .dropdown-toggle:hover,.lobipanel>.panel-heading .dropdown .dropdown-toggle:hover:focus,.lobipanel>.panel-heading .dropdown.open .dropdown-toggle{text-shadow:2px 2px 5px rgba(0,0,0,.6);background-color:rgba(0,0,0,.15)}.lobipanel>.panel-heading:after,.lobipanel>.panel-heading:before{content:" ";display:table}.lobipanel>.panel-heading:after{clear:both}@media screen and (min-width:768px){.lobipanel .panel-heading .panel-title{max-width:calc(100% - 180px)}.lobipanel .panel-heading .dropdown .dropdown-menu{position:static;display:inline-block;border:none;padding:0;margin:0;min-width:initial;width:auto;-webkit-box-shadow:none;box-shadow:none;background:0 0}.lobipanel .panel-heading .dropdown .dropdown-menu>li{display:inline-block}.lobipanel .panel-heading .dropdown .dropdown-menu>li>a .control-title,.lobipanel .panel-heading .dropdown .dropdown-toggle{display:none}.lobipanel .panel-heading .dropdown .dropdown-menu>li>a{cursor:pointer;color:inherit;padding:0;outline:0;text-align:center;width:30px;font-size:14px;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.lobipanel .panel-heading .dropdown .dropdown-menu>li>a .panel-control-icon{top:0;line-height:30px}.lobipanel .panel-heading .dropdown .dropdown-menu>li>a:focus:hover,.lobipanel .panel-heading .dropdown .dropdown-menu>li>a:hover{text-shadow:2px 2px 5px rgba(0,0,0,.6);background-color:rgba(0,0,0,.15)}.lobipanel .panel-heading .dropdown .dropdown-menu>li>a:focus{text-shadow:none;background-color:transparent}}.lobipanel>.panel-body{overflow:auto;position:relative}.lobipanel .panel-loader{position:absolute;top:0;left:0;width:100%;height:100%;background-color:#fff;opacity:.8}.lobipanel.panel-collapsed>.panel-heading{border-bottom:none}.lobipanel.panel-collapsed>.panel-heading .dropdown .dropdown-menu>li>a[data-func=unpin],.lobipanel.panel-collapsed>.panel-heading .dropdown .dropdown-menu>li>a[data-func=reload],.lobipanel.panel-collapsed>.panel-heading .dropdown .dropdown-menu>li>a[data-func=expand]{display:none}.lobipanel.panel-expanded,.lobipanel.panel-minimized.panel-unpin,.lobipanel.panel-unpin{margin-bottom:0}.lobipanel.panel-unpin{overflow:hidden;position:fixed;z-index:10000;-webkit-box-shadow:2px 2px 15px 5px rgba(10,10,10,.5);box-shadow:2px 2px 15px 5px rgba(10,10,10,.5)}.lobipanel.panel-unpin>.panel-heading{cursor:move}.lobipanel.panel-unpin.panel-minimized{float:left;position:initial;border-radius:0;-webkit-box-shadow:none;box-shadow:none;min-width:170px;margin-right:5px}.lobipanel.panel-unpin.panel-minimized>.panel-heading{padding:0;cursor:pointer;border-bottom:none}.lobipanel.panel-unpin.panel-minimized>.panel-heading .panel-title{max-width:calc(100% - 60px)}.lobipanel.panel-unpin.panel-minimized>.panel-heading .panel-title h1,.lobipanel.panel-unpin.panel-minimized>.panel-heading .panel-title h2,.lobipanel.panel-unpin.panel-minimized>.panel-heading .panel-title h3,.lobipanel.panel-unpin.panel-minimized>.panel-heading .panel-title h4,.lobipanel.panel-unpin.panel-minimized>.panel-heading .panel-title h5,.lobipanel.panel-unpin.panel-minimized>.panel-heading .panel-title h6{overflow:hidden;text-overflow:ellipsis}.lobipanel.panel-unpin.panel-minimized>.panel-heading .dropdown .dropdown-menu{position:static;display:inline-block;border:none;padding:0;margin:0;min-width:initial;width:auto;-webkit-box-shadow:none;box-shadow:none;background:0 0}.lobipanel.panel-unpin.panel-minimized>.panel-heading .dropdown .dropdown-menu>li{display:inline-block}.lobipanel.panel-unpin.panel-minimized>.panel-heading .dropdown .dropdown-menu>li>a,.lobipanel.panel-unpin.panel-minimized>.panel-heading .dropdown .dropdown-menu>li>a .control-title,.lobipanel.panel-unpin.panel-minimized>.panel-heading .dropdown .dropdown-toggle{display:none}.lobipanel.panel-unpin.panel-minimized>.panel-heading .dropdown .dropdown-menu>li>a{cursor:pointer;color:inherit;padding:0;outline:0;text-align:center;width:30px;font-size:14px;-webkit-transition:all .2s;-o-transition:all .2s;transition:all .2s}.lobipanel.panel-unpin.panel-minimized>.panel-heading .dropdown .dropdown-menu>li>a .panel-control-icon{top:0;line-height:30px}.lobipanel.panel-unpin.panel-minimized>.panel-heading .dropdown .dropdown-menu>li>a:focus:hover,.lobipanel.panel-unpin.panel-minimized>.panel-heading .dropdown .dropdown-menu>li>a:hover{text-shadow:2px 2px 5px rgba(0,0,0,.6);background-color:rgba(0,0,0,.15)}.lobipanel.panel-unpin.panel-minimized>.panel-heading .dropdown .dropdown-menu>li>a:focus{text-shadow:none;background-color:transparent}.lobipanel.panel-unpin.panel-minimized>.panel-heading .dropdown .dropdown-menu>li>a[data-func=expand],.lobipanel.panel-unpin.panel-minimized>.panel-heading .dropdown .dropdown-menu>li>a[data-func=close]{display:inline-block}.lobipanel.panel-unpin.panel-minimized>.panel-body,.lobipanel.panel-unpin.panel-minimized>.panel-footer{display:none!important}.lobipanel.panel-expanded>.panel-heading{cursor:initial}.lobipanel.panel-expanded>.panel-heading .dropdown .dropdown-menu>li>a[data-func=unpin],.lobipanel.panel-expanded>.panel-heading .dropdown .dropdown-menu>li>a[data-func=minimize]{display:none}.lobipanel.panel-expanded.panel-unpin>.panel-heading .panel-control[data-func=minimize]{display:block}.lobipanel-minimized-toolbar{position:fixed;height:36px;padding:2px;bottom:0;left:0;right:0;z-index:20000;background:rgba(34,115,182,.51)}.lobipanel-placeholder{background-color:#f9f5d1;border:1px dashed #919191;margin-bottom:15px} \ No newline at end of file diff --git a/dmp-frontend/src/assets/lobipanel/lobipanel.min.js b/dmp-frontend/src/assets/lobipanel/lobipanel.min.js deleted file mode 100644 index dc73eb51a..000000000 --- a/dmp-frontend/src/assets/lobipanel/lobipanel.min.js +++ /dev/null @@ -1 +0,0 @@ -Math.randomString=function(n){for(var text="",possible="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",i=0;n>i;i++)text+=possible.charAt(Math.floor(Math.random()*possible.length));return text},String.prototype.getCss=function(){for(var css={},style=this.valueOf().split(";"),i=0;i=num1)return!0}else if(this.valueOf()num1)return!0;return!1},$.fn.insertAt=function(i,selector){var object=selector;if("string"==typeof selector&&(object=$(selector)),i=Math.min(object.children().length,i),0==i)return object.prepend(this),this;var oldIndex=this.data("index");return this.attr("data-index",i),object.find(">*:nth-child("+i+")").after(this),object.children().each(function(index,el){var $el=$(el);i>oldIndex&&index>oldIndex&&i>=index?$el.attr("data-index",parseInt($el.data("data-index"),10)-1):oldIndex>=i&&index>i&&oldIndex>=index&&$el.attr("data-index",parseInt($el.attr("data-index"),10)+1)}),this},$.fn.disableSelection=function(){return this.attr("unselectable","on").css("user-select","none").on("selectstart",!1)},$.fn.enableSelection=function(){return this.removeAttr("unselectable").css("user-select","initial").off("selectstart")},$(function(){var LobiPanel=function($el,options){this.$el=null,this.$options={},this.hasRandomId=!1,this.storage=null;var $heading,$body,innerId,storagePrefix="lobipanel_",me=this,_processInput=function(options){options||(options={});var opts=_getOptionsFromAttributes();options=$.extend({},$.fn.lobiPanel.DEFAULTS,me.storage,options,opts);for(var objects=["unpin","reload","expand","minimize","close","editTitle"],i=0;ili>a").on("click",function(ev){ev.preventDefault(),ev.stopPropagation()}),dropdown},_generateDropdown=function(){return $('').append('').append('')},_generateEditTitle=function(){var options=me.$options.editTitle,control=$('');return control.append(''),options.tooltip&&"string"==typeof options.tooltip&&(control.append(''+options.tooltip+""),control.attr("data-tooltip",options.tooltip)),_onEditTitleClick(control),$("
  • ").append(control)},_onEditTitleClick=function(control){control.on("mousedown",function(ev){ev.stopPropagation()}),control.on("click",function(ev){ev.stopPropagation(),$heading.find('[data-func="editTitle"]').tooltip("hide"),me.isTitleEditing()?me.finishTitleEditing():me.startTitleEditing()})},_generateUnpin=function(){var options=me.$options.unpin,control=$('');return control.append(''),options.tooltip&&"string"==typeof options.tooltip&&(control.append(''+options.tooltip+""),control.attr("data-tooltip",options.tooltip)),_onUnpinClick(control),$("
  • ").append(control)},_onUnpinClick=function(control){control.on("mousedown",function(ev){ev.stopPropagation()}),control.on("click",function(){me.togglePin()})},_generateReload=function(){var options=me.$options.reload,control=$('');return control.append(''),options.tooltip&&"string"==typeof options.tooltip&&(control.append(''+options.tooltip+""),control.attr("data-tooltip",options.tooltip)),_onReloadClick(control),$("
  • ").append(control)},_onReloadClick=function(control){control.on("mousedown",function(ev){ev.stopPropagation()}),control.on("click",function(){me.load({callback:function(){control.tooltip("hide")}})})},_generateMinimize=function(){var options=me.$options.minimize,control=$('');return control.append(''),options.tooltip&&"string"==typeof options.tooltip&&(control.append(''+options.tooltip+""),control.attr("data-tooltip",options.tooltip)),_onMinimizeClick(control),$("
  • ").append(control)},_onMinimizeClick=function(control){control.on("mousedown",function(ev){ev.stopPropagation()}),control.on("click",function(ev){ev.stopPropagation(),me.toggleMinimize()})},_generateExpand=function(){var options=me.$options.expand,control=$('');return control.append(''),options.tooltip&&"string"==typeof options.tooltip&&(control.append(''+options.tooltip+""),control.attr("data-tooltip",options.tooltip)),_onExpandClick(control),$("
  • ").append(control)},_onExpandClick=function(control){control.on("mousedown",function(ev){ev.stopPropagation()}),control.on("click",function(ev){ev.stopPropagation(),me.toggleSize()})},_generateClose=function(){var options=me.$options.close,control=$('');return control.append(''),options.tooltip&&"string"==typeof options.tooltip&&(control.append(''+options.tooltip+""),control.attr("data-tooltip",options.tooltip)),_onCloseClick(control),$("
  • ").append(control)},_onCloseClick=function(control){control.on("mousedown",function(ev){ev.stopPropagation()}),control.on("click",function(ev){ev.stopPropagation(),control.tooltip("hide"),me.close()})},_getMaxZIndex=function(){var style,max,cur,panels=$(".lobipanel.panel-unpin:not(.panel-minimized.panel-expanded)");if(0===panels.length)return{id:"","z-index":LobiPanel.PRIVATE_OPTIONS.initialZIndex};style=$(panels[0]).attr("style");var id=$(panels[0]).data("inner-id");max=style?style.getCss()["z-index"]:LobiPanel.PRIVATE_OPTIONS.initialZIndex;for(var i=1;imax&&(id=$(panels[i]).data("inner-id"),max=cur);return{id:id,"z-index":parseInt(max,10)}},_onPanelClick=function(){me.$el.on("mousedown.lobiPanel",function(){return me.isPinned()||me.isMinimized()||me.isOnFullScreen()?!1:void me.bringToFront()})},_offPanelClick=function(){me.$el.off("mousedown.lobiPanel")},_changeClassOfControl=function(el){el=$(el);var opts=me.$options[el.attr("data-func")];opts.icon&&el.find("."+LobiPanel.PRIVATE_OPTIONS.iconClass).toggleClass(opts.icon).toggleClass(opts.icon2)},_getFooterForMinimizedPanels=function(){var minimizedCtr=$("."+LobiPanel.PRIVATE_OPTIONS.toolbarClass);return 0===minimizedCtr.length&&(minimizedCtr=$('
    '),$("body").append(minimizedCtr)),minimizedCtr},_expandOnHeaderClick=function(){$heading.on("click.lobiPanel",function(){me.maximize(),me.bringToFront()})},_removeExpandOnHeaderClick=function(){$heading.off("click.lobiPanel")},_getAvailableWidth=function(calcWidth){return me.$options.maxWidth&&(calcWidth=Math.min(calcWidth,me.$options.maxWidth)),me.$options.minWidth&&(calcWidth=Math.max(calcWidth,me.$options.minWidth)),calcWidth},_getAvailableHeight=function(calcHeight){return me.$options.maxHeight&&(calcHeight=Math.min(calcHeight,me.$options.maxHeight)),me.$options.minHeight&&(calcHeight=Math.max(calcHeight,me.$options.minHeight)),calcHeight},_calculateBodyHeight=function(h){return h-$heading.outerHeight()-me.$el.find(".panel-footer").outerHeight()},_calculateBodyWidth=function(w){return w-2},_appendInnerIdToParent=function(parent,innerId){if(void 0===parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr))parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr,innerId);else{if(parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr).indexOf(innerId)>-1)return;var innerIds=parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr);parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr,innerIds+" "+innerId)}me.$el.attr("data-index",me.$el.index())},_insertInParent=function(){var parent=$("["+LobiPanel.PRIVATE_OPTIONS.parentAttr+"~="+innerId+"]");me.$el.insertAt(me.$el.attr("data-index"),parent)},_generateWindow8Spinner=function(){var template=['
    ','
    ','
    ',"
    ","
    ",'
    ','
    ',"
    ","
    ",'
    ','
    ',"
    ","
    ",'
    ','
    ',"
    ","
    ",'
    ','
    ',"
    ","
    ","
    "].join("");return $('
    '+template+"
    ")},_enableSorting=function(){var parent=me.$el.parent();parent.hasClass("ui-sortable")&&parent.sortable("destroy"),me.$options.sortable?(me.$el.addClass("lobipanel-sortable"),parent.addClass("lobipanel-parent-sortable")):me.$el.removeClass("lobipanel-sortable"),parent.sortable({connectWith:".lobipanel-parent-sortable",items:".lobipanel-sortable",handle:".panel-heading",cursor:"move",placeholder:"lobipanel-placeholder",forcePlaceholderSize:!0,opacity:.7,revert:300,update:function(event,ui){var innerId=ui.item.data("inner-id");_removeInnerIdFromParent(innerId),_appendInnerIdToParent(ui.item.parent(),innerId),_updateDataIndices(ui.item),_triggerEvent("dragged")}})},_disableSorting=function(){var parent=me.$el.parent();parent.hasClass("ui-sortable")&&parent.sortable("destroy")},_updateDataIndices=function(panel){var items=panel.parent().find("> *");items.each(function(index,el){$(el).attr("data-index",index)})},_removeInnerIdFromParent=function(innerId){var parent=$("["+LobiPanel.PRIVATE_OPTIONS.parentAttr+"~="+innerId+"]"),innerIds=parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr).replace(innerId,"").trim().replace(/\s{2,}/g," ");parent.attr(LobiPanel.PRIVATE_OPTIONS.parentAttr,innerIds)},_onToggleIconsBtnClick=function(){$heading.find(".toggle-controls").on("click.lobiPanel",function(){me.$el.toggleClass("controls-expanded")})},_adjustForScreenSize=function(){me.disableTooltips(),$(window).width()>768&&me.$options.tooltips&&me.enableTooltips(),me.isOnFullScreen()&&$body.css({width:_calculateBodyWidth(me.$el.width()),height:_calculateBodyHeight(me.$el.height())})},_enableResponsiveness=function(){$(window).on("resize.lobiPanel",function(){_adjustForScreenSize()})},_setBodyHeight=function(){"auto"!==me.$options.bodyHeight&&$body.css({height:me.$options.bodyHeight,overflow:"auto"})},_getOptionsFromAttributes=function(){var $el=me.$el,options={};for(var key in $.fn.lobiPanel.DEFAULTS){var k=key.toDash(),val=$el.data(k);void 0!==val&&(options[key]="object"!=typeof $.fn.lobiPanel.DEFAULTS[key]?val:eval("("+val+")"))}return options},_saveState=function(state){!me.hasRandomId&&me.$options.stateful&&(me.storage.state=state,_saveLocalStorage(me.storage))},_saveLocalStorage=function(storage){localStorage.setItem(storagePrefix+innerId,JSON.stringify(storage))},_applyState=function(state){switch(state){case"unpinned":me.unpin();break;case"minimized":me.unpin(),me.minimize();break;case"collapsed":me.minimize();break;case"fullscreen":me.toFullScreen()}},_applyIndex=function(index){null!==index&&me.$el.insertAt(index,me.$el.parent())},_triggerEvent=function(eventType){var args=Array.prototype.slice.call(arguments,1);args.unshift(me),me.$el.trigger(eventType+".lobiPanel",args)};this.isPanelInit=function(){return me.$el.hasClass("lobipanel")&&me.$el.data("inner-id")},this.isPinned=function(){return!me.$el.hasClass("panel-unpin")},this.pin=function(){return _triggerEvent("beforePin"),$heading.find('[data-func="unpin"]').tooltip("hide"),me.disableResize(),me.disableDrag(),_enableSorting(),_offPanelClick(),me.$el.removeClass("panel-unpin").attr("old-style",me.$el.attr("style")).removeAttr("style").css("position","relative"),$body.css({width:"",height:""}),_setBodyHeight(),_insertInParent(),_saveState("pinned"),_triggerEvent("onPin"),me},this.unpin=function(){if(_triggerEvent("beforeUnpin"),me.$el.hasClass("panel-collapsed"))return me;if(_disableSorting(),$heading.find('[data-func="unpin"]').tooltip("hide"),me.$el.attr("old-style"))me.$el.attr("style",me.$el.attr("old-style"));else{var width=me.$el.width(),height=me.$el.height(),left=Math.max(0,($(window).width()-me.$el.outerWidth())/2),top=Math.max(0,($(window).height()-me.$el.outerHeight())/2);me.$el.css({left:left,top:top,width:width,height:height})}var res=_getMaxZIndex();me.$el.css("z-index",res["z-index"]+1),_onPanelClick(),me.$el.addClass("panel-unpin"),$("body").append(me.$el);var panelWidth=_getAvailableWidth(me.$el.width()),panelHeight=_getAvailableHeight(me.$el.height());me.$el.css({position:"fixed",width:panelWidth,height:panelHeight});var bHeight=_calculateBodyHeight(panelHeight),bWidth=_calculateBodyWidth(panelWidth);return $body.css({width:bWidth,height:bHeight}),me.$options.draggable&&me.enableDrag(),"none"!==me.$options.resize&&me.enableResize(),_saveState("unpinned"),_triggerEvent("onUnpin"),me},this.togglePin=function(){return this.isPinned()?this.unpin():this.pin(),me},this.isMinimized=function(){return me.$el.hasClass("panel-minimized")||me.$el.hasClass("panel-collapsed")},this.minimize=function(){if(_triggerEvent("beforeMinimize"),me.isMinimized())return me;if(me.isPinned())$body.slideUp(),me.$el.find(".panel-footer").slideUp(),me.$el.addClass("panel-collapsed"),_saveState("collapsed"),_changeClassOfControl($heading.find('[data-func="minimize"]'));else{me.disableTooltips(),$heading.find('[data-func="minimize"]').tooltip("hide");var left,top,footer=_getFooterForMinimizedPanels(),children=footer.find(">*");if(top=footer.offset().top,0===children.length)left=footer.offset().left;else{var ch=$(children[children.length-1]);left=ch.offset().left+ch.width()}me.$el.hasClass("panel-expanded")||me.$el.attr("old-style",me.$el.attr("style")),me.$el.animate({left:left,top:top,width:200,height:footer.height()},100,function(){me.$el.hasClass("panel-expanded")&&(me.$el.removeClass("panel-expanded"),me.$el.find(".panel-heading [data-func=expand] ."+LobiPanel.PRIVATE_OPTIONS.iconClass).removeClass(me.$options.expand.icon2).addClass(me.$options.expand.icon)),me.$el.addClass("panel-minimized"),me.$el.removeAttr("style"),me.disableDrag(),me.disableResize(),_expandOnHeaderClick(),footer.append(me.$el),$("body").addClass("lobipanel-minimized");var maxWidth="calc(100% - "+$heading.find(".dropdown-menu li>a:visible").length*$heading.find(".dropdown-menu li>a:visible").first().outerWidth()+"px)";$heading.find(".panel-title").css("max-width",maxWidth),_saveState("minimized"),_triggerEvent("onMinimize")})}return me},this.maximize=function(){if(_triggerEvent("beforeMaximize"),!me.isMinimized())return me;if(me.isPinned())$body.slideDown(),me.$el.find(".panel-footer").slideDown(),me.$el.removeClass("panel-collapsed"),_saveState("pinned"),_changeClassOfControl($heading.find('[data-func="minimize"]'));else{me.enableTooltips();var css=me.$el.attr("old-style").getCss();me.$el.css({position:css.position||"fixed","z-index":css["z-index"],left:me.$el.offset().left,top:me.$el.offset().top,width:me.$el.width(),height:me.$el.height()}),$("body").append(me.$el),delete css.position,delete css["z-index"],me.$el.animate(css,100,function(){me.$el.css("position",""),me.$el.removeClass("panel-minimized"),me.$el.removeAttr("old-style"),me.$options.draggable&&me.enableDrag(),me.enableResize(),_removeExpandOnHeaderClick();var footer=_getFooterForMinimizedPanels();0===footer.children().length&&footer.remove(),$("body").removeClass("lobipanel-minimized").addClass("lobipanel-minimized");var maxWidth="calc(100% - "+$heading.find(".dropdown-menu li").length*$heading.find(".dropdown-menu li").first().outerWidth()+"px)";$heading.find(".panel-title").css("max-width",maxWidth),_saveState("unpinned"),_triggerEvent("onMaximize")})}return me},this.toggleMinimize=function(){return me.isMinimized()?me.maximize():me.minimize(),me},this.isOnFullScreen=function(){return me.$el.hasClass("panel-expanded")},this.toFullScreen=function(){if(_triggerEvent("beforeFullScreen"),me.$el.hasClass("panel-collapsed"))return me;_changeClassOfControl($heading.find('[data-func="expand"]')),$heading.find('[data-func="expand"]').tooltip("hide");var res=_getMaxZIndex();if(me.isPinned()||me.isMinimized()){me.enableTooltips(),me.$el.css({position:"fixed","z-index":res["z-index"]+1,left:me.$el.offset().left,top:me.$el.offset().top-$(window).scrollTop(),width:me.$el.width(),height:me.$el.height()}),$("body").append(me.$el);var footer=_getFooterForMinimizedPanels();0===footer.children().length&&footer.remove()}else $body.css({width:"",height:""}),_setBodyHeight();me.isMinimized()?(me.$el.removeClass("panel-minimized"),_removeExpandOnHeaderClick()):(me.$el.attr("old-style",me.$el.attr("style")),me.disableResize());var toolbar=$("."+LobiPanel.PRIVATE_OPTIONS.toolbarClass),toolbarHeight=toolbar.outerHeight()||0;return me.$el.animate({width:$(window).width(),height:$(window).height()-toolbarHeight,left:0,top:0},me.$options.expandAnimation,function(){me.$el.css({width:"",height:"",right:0,bottom:toolbarHeight}),me.$el.addClass("panel-expanded"),$("body").css("overflow","hidden"),$body.css({width:_calculateBodyWidth(me.$el.width()),height:_calculateBodyHeight(me.$el.height())}),me.disableDrag(),me.isPinned()&&_disableSorting(),_saveState("fullscreen"),_triggerEvent("onFullScreen")}),me},this.toSmallSize=function(){_triggerEvent("beforeSmallSize"),_changeClassOfControl($heading.find('[data-func="expand"]')),$heading.find('[data-func="expand"]').tooltip("hide");var css=me.$el.attr("old-style").getCss();return me.$el.animate({left:css.left,top:css.top,width:css.width,height:css.height,right:css.right,bottom:css.bottom},me.$options.collapseAnimation,function(){me.$el.removeAttr("old-style"),me.$el.hasClass("panel-unpin")?(me.$options.draggable&&me.enableDrag(),me.enableResize()):(me.$el.removeAttr("style"),_insertInParent(),_enableSorting()),me.$el.removeClass("panel-expanded"),$("body").css("overflow","auto");var bWidth="",bHeight="";me.isPinned()?"auto"!==me.$options.bodyHeight&&(bHeight=me.$options.bodyHeight,_saveState("pinned")):(bWidth=_calculateBodyWidth(me.getWidth()),bHeight=_calculateBodyHeight(me.getHeight()),_saveState("unpinned")),$body.css({width:bWidth,height:bHeight}),_triggerEvent("onSmallSize")}),me},this.toggleSize=function(){return me.isOnFullScreen()?me.toSmallSize():me.toFullScreen(),me},this.close=function(){return _triggerEvent("beforeClose"),me.$el.hide(100,function(){me.isOnFullScreen()&&$("body").css("overflow","auto"),me.$el.remove();var footer=_getFooterForMinimizedPanels();0===footer.children().length&&footer.remove(),_triggerEvent("onClose")}),me},this.setPosition=function(left,top){return me.isPinned()?me:(me.$el.animate({left:left,top:top},100),me)},this.setWidth=function(w){if(me.isPinned())return me;var bWidth=_calculateBodyWidth(w);return me.$el.animate({width:w},100),$body.animate({width:bWidth},100),me},this.setHeight=function(h){if(me.isPinned())return me;var bHeight=_calculateBodyHeight(h);return me.$el.animate({height:h},100),$body.animate({height:bHeight},100),me},this.setSize=function(w,h){if(me.isPinned())return me;var bHeight=_calculateBodyHeight(h),bWidth=_calculateBodyWidth(w);return me.$el.animate({height:h,width:w},100),$body.animate({height:bHeight,width:bWidth},100),me},this.getPosition=function(){var offset=me.$el.offset();return{x:offset.left,y:offset.top}},this.getWidth=function(){return me.$el.width()},this.getHeight=function(){return me.$el.height()},this.bringToFront=function(){_triggerEvent("beforeToFront");var res=_getMaxZIndex();return res.id===me.$el.data("inner-id")?me:(me.$el.css("z-index",res["z-index"]+1),_triggerEvent("onToFront"),me)},this.enableDrag=function(){return me.$el.draggable({handle:".panel-heading"}),me},this.disableDrag=function(){return me.$el.hasClass("ui-draggable")&&me.$el.draggable("destroy"),me},this.enableResize=function(){var handles=!1;return"vertical"===me.$options.resize?handles="n, s":"horizontal"===me.$options.resize?handles="e, w":"both"===me.$options.resize&&(handles="all"),handles?(me.$el.resizable({minWidth:me.$options.minWidth,maxWidth:me.$options.maxWidth,minHeight:me.$options.minHeight,maxHeight:me.$options.maxHeight,handles:handles,start:function(){me.$el.disableSelection(),_triggerEvent("resizeStart")},stop:function(){me.$el.enableSelection(),_triggerEvent("resizeStop")},resize:function(){var bHeight=_calculateBodyHeight(me.$el.height()),bWidth=_calculateBodyWidth(me.$el.width());$body.css({width:bWidth,height:bHeight}),_triggerEvent("onResize")}}),me):void 0},this.disableResize=function(){return me.$el.hasClass("ui-resizable")&&me.$el.resizable("destroy"),me},this.startLoading=function(){var spinner=_generateWindow8Spinner();me.$el.append(spinner);var sp=spinner.find(".spinner");return sp.css("margin-top",50),me},this.stopLoading=function(){return me.$el.find(".spinner-wrapper").remove(),me},this.setLoadUrl=function(url){return me.$options.loadUrl=url,me},this.load=function(params){params=params||{},"string"==typeof params&&(params={url:params});var url=params.url||me.$options.loadUrl,data=params.data||{},callback=params.callback||null;return url?(_triggerEvent("beforeLoad"),me.startLoading(),$body.load(url,data,function(result,status,xhr){callback&&"function"==typeof callback&&callback(result,status,xhr),me.stopLoading(),_triggerEvent("loaded",result,status,xhr)}),me):me},this.destroy=function(){return me.disableDrag(),me.disableResize(),me.$options.sortable=!1,_enableSorting(),_removeInnerIdFromParent(innerId),me.$el.removeClass("lobipanel").removeAttr("data-inner-id").removeAttr("data-index").removeData("lobiPanel"),$heading.find(".dropdown").remove(),me.$el},this.startTitleEditing=function(){var title=$heading.find(".panel-title").text().trim(),input=$('');return input.on("keydown",function(ev){13===ev.which?me.finishTitleEditing():27===ev.which&&me.cancelTitleEditing()}),$heading.find(".panel-title").data("old-title",title).html("").append(input),input[0].focus(),input[0].select(),_changeClassOfControl($heading.find('[data-func="editTitle"]')),me},this.isTitleEditing=function(){return $heading.find(".panel-title input").length>0},this.cancelTitleEditing=function(){var title=$heading.find(".panel-title");return title.html(title.data("old-title")).find("input").remove(),_changeClassOfControl($heading.find('[data-func="editTitle"]')),me},this.finishTitleEditing=function(){var input=$heading.find("input");return $heading.find(".panel-title").html(input.val()),input.remove(),_changeClassOfControl($heading.find('[data-func="editTitle"]')),me},this.enableTooltips=function(){if($(window).width()<768)return me;var controls=$heading.find(".dropdown-menu>li>a");return controls.each(function(index,el){var $el=$(el);$el.attr("data-toggle","tooltip").attr("data-title",$el.data("tooltip")).attr("data-placement","bottom")}),controls.each(function(ind,el){$(el).tooltip({container:"body",template:''})}),me},this.disableTooltips=function(){return $heading.find(".dropdown-menu>li>a").tooltip("destroy"),me},this.$el=$el,me.$el.data("inner-id")||(me.hasRandomId=!0,me.$el.attr("data-inner-id",Math.randomString(10))),innerId=me.$el.data("inner-id"),me.hasRandomId||(me.storage=localStorage.getItem(storagePrefix+innerId),me.storage=JSON.parse(me.storage)||{}),this.$options=_processInput(options),$heading=this.$el.find(">.panel-heading"),$body=this.$el.find(">.panel-body"),_init(),_applyState(me.$options.state),_applyIndex(me.$options.initialIndex)};$.fn.lobiPanel=function(option){var args=arguments,ret=null;return this.each(function(){var $this=$(this),data=$this.data("lobiPanel"),options="object"==typeof option&&option;data||$this.data("lobiPanel",data=new LobiPanel($this,options)),"string"==typeof option&&(args=Array.prototype.slice.call(args,1),ret=data[option].apply(data,args))}),ret},LobiPanel.PRIVATE_OPTIONS={parentAttr:"data-lobipanel-child-inner-id",toolbarClass:"lobipanel-minimized-toolbar",initialZIndex:1e4,iconClass:"panel-control-icon"},$.fn.lobiPanel.DEFAULTS={draggable:!0,sortable:!1,connectWith:".ui-sortable",resize:"both",minWidth:200,minHeight:100,maxWidth:1200,maxHeight:700,loadUrl:"",autoload:!0,bodyHeight:"auto",tooltips:!0,toggleIcon:"glyphicon glyphicon-cog",expandAnimation:100,collapseAnimation:100,state:"pinned",initialIndex:null,stateful:!1,unpin:{icon:"glyphicon glyphicon-move",tooltip:"Unpin"},reload:{icon:"glyphicon glyphicon-refresh",tooltip:"Reload"},minimize:{icon:"glyphicon glyphicon-minus",icon2:"glyphicon glyphicon-plus",tooltip:"Minimize"},expand:{icon:"glyphicon glyphicon-resize-full",icon2:"glyphicon glyphicon-resize-small",tooltip:"Fullscreen"},close:{icon:"glyphicon glyphicon-remove",tooltip:"Close"},editTitle:{icon:"glyphicon glyphicon-pencil",icon2:"glyphicon glyphicon-floppy-disk",tooltip:"Edit title"}},$(".lobipanel").lobiPanel()}); \ No newline at end of file diff --git a/dmp-frontend/src/assets/perfect-scrollbar/perfect-scrollbar.css b/dmp-frontend/src/assets/perfect-scrollbar/perfect-scrollbar.css deleted file mode 100644 index a16e20743..000000000 --- a/dmp-frontend/src/assets/perfect-scrollbar/perfect-scrollbar.css +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Container style - */ - .ps { - overflow: hidden !important; - overflow-anchor: none; - -ms-overflow-style: none; - touch-action: auto; - -ms-touch-action: auto; - } - - /* - * Scrollbar rail styles - */ - .ps__rail-x { - display: none; - opacity: 0; - transition: background-color .2s linear, opacity .2s linear; - -webkit-transition: background-color .2s linear, opacity .2s linear; - height: 15px; - /* there must be 'bottom' or 'top' for ps__rail-x */ - bottom: 0px; - /* please don't change 'position' */ - position: absolute; - } - - .ps__rail-y { - display: none; - opacity: 0; - transition: background-color .2s linear, opacity .2s linear; - -webkit-transition: background-color .2s linear, opacity .2s linear; - width: 15px; - /* there must be 'right' or 'left' for ps__rail-y */ - right: 0; - /* please don't change 'position' */ - position: absolute; - } - - .ps--active-x > .ps__rail-x, - .ps--active-y > .ps__rail-y { - display: block; - background-color: transparent; - } - - .ps:hover > .ps__rail-x, - .ps:hover > .ps__rail-y, - .ps--focus > .ps__rail-x, - .ps--focus > .ps__rail-y, - .ps--scrolling-x > .ps__rail-x, - .ps--scrolling-y > .ps__rail-y { - opacity: 0.6; - } - - .ps__rail-x:hover, - .ps__rail-y:hover, - .ps__rail-x:focus, - .ps__rail-y:focus { - background-color: #eee; - opacity: 0.9; - } - - /* - * Scrollbar thumb styles - */ - .ps__thumb-x { - background-color: #aaa; - border-radius: 6px; - transition: background-color .2s linear, height .2s ease-in-out; - -webkit-transition: background-color .2s linear, height .2s ease-in-out; - height: 6px; - /* there must be 'bottom' for ps__thumb-x */ - bottom: 2px; - /* please don't change 'position' */ - position: absolute; - } - - .ps__thumb-y { - background-color: #aaa; - border-radius: 6px; - transition: background-color .2s linear, width .2s ease-in-out; - -webkit-transition: background-color .2s linear, width .2s ease-in-out; - width: 6px; - /* there must be 'right' for ps__thumb-y */ - right: 2px; - /* please don't change 'position' */ - position: absolute; - } - - .ps__rail-x:hover > .ps__thumb-x, - .ps__rail-x:focus > .ps__thumb-x { - background-color: #999; - height: 11px; - } - - .ps__rail-y:hover > .ps__thumb-y, - .ps__rail-y:focus > .ps__thumb-y { - background-color: #999; - width: 11px; - } - - /* MS supports */ - @supports (-ms-overflow-style: none) { - .ps { - overflow: auto !important; - } - } - - @media screen and (-ms-high-contrast: active), (-ms-high-contrast: none) { - .ps { - overflow: auto !important; - } - } \ No newline at end of file diff --git a/dmp-frontend/src/assets/perfect-scrollbar/perfect-scrollbar.js b/dmp-frontend/src/assets/perfect-scrollbar/perfect-scrollbar.js deleted file mode 100644 index d3b2c0f4d..000000000 --- a/dmp-frontend/src/assets/perfect-scrollbar/perfect-scrollbar.js +++ /dev/null @@ -1,1297 +0,0 @@ -/*! - * perfect-scrollbar v1.2.0 - * (c) 2017 Hyunje Jun - * @license MIT - */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global.PerfectScrollbar = factory()); -}(this, (function () { 'use strict'; - -function get(element) { - return getComputedStyle(element); -} - -function set(element, obj) { - for (var key in obj) { - var val = obj[key]; - if (typeof val === 'number') { - val = val + "px"; - } - element.style[key] = val; - } - return element; -} - -function div(className) { - var div = document.createElement('div'); - div.className = className; - return div; -} - -var elMatches = - Element.prototype.matches || - Element.prototype.webkitMatchesSelector || - Element.prototype.msMatchesSelector; - -function matches(element, query) { - if (!elMatches) { - throw new Error('No element matching method supported'); - } - - return elMatches.call(element, query); -} - -function remove(element) { - if (element.remove) { - element.remove(); - } else { - if (element.parentNode) { - element.parentNode.removeChild(element); - } - } -} - -function queryChildren(element, selector) { - return Array.prototype.filter.call(element.children, function (child) { return matches(child, selector); } - ); -} - -var cls = { - main: 'ps', - element: { - thumb: function (x) { return ("ps__thumb-" + x); }, - rail: function (x) { return ("ps__rail-" + x); }, - consuming: 'ps__child--consume', - }, - state: { - focus: 'ps--focus', - active: function (x) { return ("ps--active-" + x); }, - scrolling: function (x) { return ("ps--scrolling-" + x); }, - }, -}; - -/* - * Helper methods - */ -var scrollingClassTimeout = { x: null, y: null }; - -function addScrollingClass(i, x) { - var classList = i.element.classList; - var className = cls.state.scrolling(x); - - if (classList.contains(className)) { - clearTimeout(scrollingClassTimeout[x]); - } else { - classList.add(className); - } -} - -function removeScrollingClass(i, x) { - scrollingClassTimeout[x] = setTimeout( - function () { return i.isAlive && i.element.classList.remove(cls.state.scrolling(x)); }, - i.settings.scrollingThreshold - ); -} - -function setScrollingClassInstantly(i, x) { - addScrollingClass(i, x); - removeScrollingClass(i, x); -} - -var EventElement = function EventElement(element) { - this.element = element; - this.handlers = {}; -}; - -var prototypeAccessors = { isEmpty: { configurable: true } }; - -EventElement.prototype.bind = function bind (eventName, handler) { - if (typeof this.handlers[eventName] === 'undefined') { - this.handlers[eventName] = []; - } - this.handlers[eventName].push(handler); - this.element.addEventListener(eventName, handler, false); -}; - -EventElement.prototype.unbind = function unbind (eventName, target) { - var this$1 = this; - - this.handlers[eventName] = this.handlers[eventName].filter(function (handler) { - if (target && handler !== target) { - return true; - } - this$1.element.removeEventListener(eventName, handler, false); - return false; - }); -}; - -EventElement.prototype.unbindAll = function unbindAll () { - var this$1 = this; - - for (var name in this$1.handlers) { - this$1.unbind(name); - } -}; - -prototypeAccessors.isEmpty.get = function () { - var this$1 = this; - - return Object.keys(this.handlers).every( - function (key) { return this$1.handlers[key].length === 0; } - ); -}; - -Object.defineProperties( EventElement.prototype, prototypeAccessors ); - -var EventManager = function EventManager() { - this.eventElements = []; -}; - -EventManager.prototype.eventElement = function eventElement (element) { - var ee = this.eventElements.filter(function (ee) { return ee.element === element; })[0]; - if (!ee) { - ee = new EventElement(element); - this.eventElements.push(ee); - } - return ee; -}; - -EventManager.prototype.bind = function bind (element, eventName, handler) { - this.eventElement(element).bind(eventName, handler); -}; - -EventManager.prototype.unbind = function unbind (element, eventName, handler) { - var ee = this.eventElement(element); - ee.unbind(eventName, handler); - - if (ee.isEmpty) { - // remove - this.eventElements.splice(this.eventElements.indexOf(ee), 1); - } -}; - -EventManager.prototype.unbindAll = function unbindAll () { - this.eventElements.forEach(function (e) { return e.unbindAll(); }); - this.eventElements = []; -}; - -EventManager.prototype.once = function once (element, eventName, handler) { - var ee = this.eventElement(element); - var onceHandler = function (evt) { - ee.unbind(eventName, onceHandler); - handler(evt); - }; - ee.bind(eventName, onceHandler); -}; - -function createEvent(name) { - if (typeof window.CustomEvent === 'function') { - return new CustomEvent(name); - } else { - var evt = document.createEvent('CustomEvent'); - evt.initCustomEvent(name, false, false, undefined); - return evt; - } -} - -var processScrollDiff = function( - i, - axis, - diff, - useScrollingClass, - forceFireReachEvent -) { - if ( useScrollingClass === void 0 ) useScrollingClass = true; - if ( forceFireReachEvent === void 0 ) forceFireReachEvent = false; - - var fields; - if (axis === 'top') { - fields = [ - 'contentHeight', - 'containerHeight', - 'scrollTop', - 'y', - 'up', - 'down' ]; - } else if (axis === 'left') { - fields = [ - 'contentWidth', - 'containerWidth', - 'scrollLeft', - 'x', - 'left', - 'right' ]; - } else { - throw new Error('A proper axis should be provided'); - } - - processScrollDiff$1(i, diff, fields, useScrollingClass, forceFireReachEvent); -}; - -function processScrollDiff$1( - i, - diff, - ref, - useScrollingClass, - forceFireReachEvent -) { - var contentHeight = ref[0]; - var containerHeight = ref[1]; - var scrollTop = ref[2]; - var y = ref[3]; - var up = ref[4]; - var down = ref[5]; - if ( useScrollingClass === void 0 ) useScrollingClass = true; - if ( forceFireReachEvent === void 0 ) forceFireReachEvent = false; - - var element = i.element; - - // reset reach - i.reach[y] = null; - - // 1 for subpixel rounding - if (element[scrollTop] < 1) { - i.reach[y] = 'start'; - } - - // 1 for subpixel rounding - if (element[scrollTop] > i[contentHeight] - i[containerHeight] - 1) { - i.reach[y] = 'end'; - } - - if (diff) { - element.dispatchEvent(createEvent(("ps-scroll-" + y))); - - if (diff < 0) { - element.dispatchEvent(createEvent(("ps-scroll-" + up))); - } else if (diff > 0) { - element.dispatchEvent(createEvent(("ps-scroll-" + down))); - } - - if (useScrollingClass) { - setScrollingClassInstantly(i, y); - } - } - - if (i.reach[y] && (diff || forceFireReachEvent)) { - element.dispatchEvent(createEvent(("ps-" + y + "-reach-" + (i.reach[y])))); - } -} - -function toInt(x) { - return parseInt(x, 10) || 0; -} - -function isEditable(el) { - return ( - matches(el, 'input,[contenteditable]') || - matches(el, 'select,[contenteditable]') || - matches(el, 'textarea,[contenteditable]') || - matches(el, 'button,[contenteditable]') - ); -} - -function outerWidth(element) { - var styles = get(element); - return ( - toInt(styles.width) + - toInt(styles.paddingLeft) + - toInt(styles.paddingRight) + - toInt(styles.borderLeftWidth) + - toInt(styles.borderRightWidth) - ); -} - -var env = { - isWebKit: document && 'WebkitAppearance' in document.documentElement.style, - supportsTouch: - window && - ('ontouchstart' in window || - (window.DocumentTouch && document instanceof window.DocumentTouch)), - supportsIePointer: navigator && navigator.msMaxTouchPoints, -}; - -var updateGeometry = function(i) { - var element = i.element; - - i.containerWidth = element.clientWidth; - i.containerHeight = element.clientHeight; - i.contentWidth = element.scrollWidth; - i.contentHeight = element.scrollHeight; - - if (!element.contains(i.scrollbarXRail)) { - // clean up and append - queryChildren(element, cls.element.rail('x')).forEach(function (el) { return remove(el); } - ); - element.appendChild(i.scrollbarXRail); - } - if (!element.contains(i.scrollbarYRail)) { - // clean up and append - queryChildren(element, cls.element.rail('y')).forEach(function (el) { return remove(el); } - ); - element.appendChild(i.scrollbarYRail); - } - - if ( - !i.settings.suppressScrollX && - i.containerWidth + i.settings.scrollXMarginOffset < i.contentWidth - ) { - i.scrollbarXActive = true; - i.railXWidth = i.containerWidth - i.railXMarginWidth; - i.railXRatio = i.containerWidth / i.railXWidth; - i.scrollbarXWidth = getThumbSize( - i, - toInt(i.railXWidth * i.containerWidth / i.contentWidth) - ); - i.scrollbarXLeft = toInt( - (i.negativeScrollAdjustment + element.scrollLeft) * - (i.railXWidth - i.scrollbarXWidth) / - (i.contentWidth - i.containerWidth) - ); - } else { - i.scrollbarXActive = false; - } - - if ( - !i.settings.suppressScrollY && - i.containerHeight + i.settings.scrollYMarginOffset < i.contentHeight - ) { - i.scrollbarYActive = true; - i.railYHeight = i.containerHeight - i.railYMarginHeight; - i.railYRatio = i.containerHeight / i.railYHeight; - i.scrollbarYHeight = getThumbSize( - i, - toInt(i.railYHeight * i.containerHeight / i.contentHeight) - ); - i.scrollbarYTop = toInt( - element.scrollTop * - (i.railYHeight - i.scrollbarYHeight) / - (i.contentHeight - i.containerHeight) - ); - } else { - i.scrollbarYActive = false; - } - - if (i.scrollbarXLeft >= i.railXWidth - i.scrollbarXWidth) { - i.scrollbarXLeft = i.railXWidth - i.scrollbarXWidth; - } - if (i.scrollbarYTop >= i.railYHeight - i.scrollbarYHeight) { - i.scrollbarYTop = i.railYHeight - i.scrollbarYHeight; - } - - updateCss(element, i); - - if (i.scrollbarXActive) { - element.classList.add(cls.state.active('x')); - } else { - element.classList.remove(cls.state.active('x')); - i.scrollbarXWidth = 0; - i.scrollbarXLeft = 0; - element.scrollLeft = 0; - } - if (i.scrollbarYActive) { - element.classList.add(cls.state.active('y')); - } else { - element.classList.remove(cls.state.active('y')); - i.scrollbarYHeight = 0; - i.scrollbarYTop = 0; - element.scrollTop = 0; - } -}; - -function getThumbSize(i, thumbSize) { - if (i.settings.minScrollbarLength) { - thumbSize = Math.max(thumbSize, i.settings.minScrollbarLength); - } - if (i.settings.maxScrollbarLength) { - thumbSize = Math.min(thumbSize, i.settings.maxScrollbarLength); - } - return thumbSize; -} - -function updateCss(element, i) { - var xRailOffset = { width: i.railXWidth }; - if (i.isRtl) { - xRailOffset.left = - i.negativeScrollAdjustment + - element.scrollLeft + - i.containerWidth - - i.contentWidth; - } else { - xRailOffset.left = element.scrollLeft; - } - if (i.isScrollbarXUsingBottom) { - xRailOffset.bottom = i.scrollbarXBottom - element.scrollTop; - } else { - xRailOffset.top = i.scrollbarXTop + element.scrollTop; - } - set(i.scrollbarXRail, xRailOffset); - - var yRailOffset = { top: element.scrollTop, height: i.railYHeight }; - if (i.isScrollbarYUsingRight) { - if (i.isRtl) { - yRailOffset.right = - i.contentWidth - - (i.negativeScrollAdjustment + element.scrollLeft) - - i.scrollbarYRight - - i.scrollbarYOuterWidth; - } else { - yRailOffset.right = i.scrollbarYRight - element.scrollLeft; - } - } else { - if (i.isRtl) { - yRailOffset.left = - i.negativeScrollAdjustment + - element.scrollLeft + - i.containerWidth * 2 - - i.contentWidth - - i.scrollbarYLeft - - i.scrollbarYOuterWidth; - } else { - yRailOffset.left = i.scrollbarYLeft + element.scrollLeft; - } - } - set(i.scrollbarYRail, yRailOffset); - - set(i.scrollbarX, { - left: i.scrollbarXLeft, - width: i.scrollbarXWidth - i.railBorderXWidth, - }); - set(i.scrollbarY, { - top: i.scrollbarYTop, - height: i.scrollbarYHeight - i.railBorderYWidth, - }); -} - -var clickRail = function(i) { - i.event.bind(i.scrollbarY, 'mousedown', function (e) { return e.stopPropagation(); }); - i.event.bind(i.scrollbarYRail, 'mousedown', function (e) { - var positionTop = - e.pageY - - window.pageYOffset - - i.scrollbarYRail.getBoundingClientRect().top; - var direction = positionTop > i.scrollbarYTop ? 1 : -1; - - i.element.scrollTop += direction * i.containerHeight; - updateGeometry(i); - - e.stopPropagation(); - }); - - i.event.bind(i.scrollbarX, 'mousedown', function (e) { return e.stopPropagation(); }); - i.event.bind(i.scrollbarXRail, 'mousedown', function (e) { - var positionLeft = - e.pageX - - window.pageXOffset - - i.scrollbarXRail.getBoundingClientRect().left; - var direction = positionLeft > i.scrollbarXLeft ? 1 : -1; - - i.element.scrollLeft += direction * i.containerWidth; - updateGeometry(i); - - e.stopPropagation(); - }); -}; - -var dragThumb = function(i) { - bindMouseScrollHandler(i, [ - 'containerWidth', - 'contentWidth', - 'pageX', - 'railXWidth', - 'scrollbarX', - 'scrollbarXWidth', - 'scrollLeft', - 'x' ]); - bindMouseScrollHandler(i, [ - 'containerHeight', - 'contentHeight', - 'pageY', - 'railYHeight', - 'scrollbarY', - 'scrollbarYHeight', - 'scrollTop', - 'y' ]); -}; - -function bindMouseScrollHandler( - i, - ref -) { - var containerHeight = ref[0]; - var contentHeight = ref[1]; - var pageY = ref[2]; - var railYHeight = ref[3]; - var scrollbarY = ref[4]; - var scrollbarYHeight = ref[5]; - var scrollTop = ref[6]; - var y = ref[7]; - - var element = i.element; - - var startingScrollTop = null; - var startingMousePageY = null; - var scrollBy = null; - - function mouseMoveHandler(e) { - element[scrollTop] = - startingScrollTop + scrollBy * (e[pageY] - startingMousePageY); - addScrollingClass(i, y); - updateGeometry(i); - - e.stopPropagation(); - e.preventDefault(); - } - - function mouseUpHandler() { - removeScrollingClass(i, y); - i.event.unbind(i.ownerDocument, 'mousemove', mouseMoveHandler); - } - - i.event.bind(i[scrollbarY], 'mousedown', function (e) { - startingScrollTop = element[scrollTop]; - startingMousePageY = e[pageY]; - scrollBy = - (i[contentHeight] - i[containerHeight]) / - (i[railYHeight] - i[scrollbarYHeight]); - - i.event.bind(i.ownerDocument, 'mousemove', mouseMoveHandler); - i.event.once(i.ownerDocument, 'mouseup', mouseUpHandler); - - e.stopPropagation(); - e.preventDefault(); - }); -} - -var keyboard = function(i) { - var element = i.element; - - var elementHovered = function () { return matches(element, ':hover'); }; - var scrollbarFocused = function () { return matches(i.scrollbarX, ':focus') || matches(i.scrollbarY, ':focus'); }; - - function shouldPreventDefault(deltaX, deltaY) { - var scrollTop = element.scrollTop; - if (deltaX === 0) { - if (!i.scrollbarYActive) { - return false; - } - if ( - (scrollTop === 0 && deltaY > 0) || - (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0) - ) { - return !i.settings.wheelPropagation; - } - } - - var scrollLeft = element.scrollLeft; - if (deltaY === 0) { - if (!i.scrollbarXActive) { - return false; - } - if ( - (scrollLeft === 0 && deltaX < 0) || - (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0) - ) { - return !i.settings.wheelPropagation; - } - } - return true; - } - - i.event.bind(i.ownerDocument, 'keydown', function (e) { - if ( - (e.isDefaultPrevented && e.isDefaultPrevented()) || - e.defaultPrevented - ) { - return; - } - - if (!elementHovered() && !scrollbarFocused()) { - return; - } - - var activeElement = document.activeElement - ? document.activeElement - : i.ownerDocument.activeElement; - if (activeElement) { - if (activeElement.tagName === 'IFRAME') { - activeElement = activeElement.contentDocument.activeElement; - } else { - // go deeper if element is a webcomponent - while (activeElement.shadowRoot) { - activeElement = activeElement.shadowRoot.activeElement; - } - } - if (isEditable(activeElement)) { - return; - } - } - - var deltaX = 0; - var deltaY = 0; - - switch (e.which) { - case 37: // left - if (e.metaKey) { - deltaX = -i.contentWidth; - } else if (e.altKey) { - deltaX = -i.containerWidth; - } else { - deltaX = -30; - } - break; - case 38: // up - if (e.metaKey) { - deltaY = i.contentHeight; - } else if (e.altKey) { - deltaY = i.containerHeight; - } else { - deltaY = 30; - } - break; - case 39: // right - if (e.metaKey) { - deltaX = i.contentWidth; - } else if (e.altKey) { - deltaX = i.containerWidth; - } else { - deltaX = 30; - } - break; - case 40: // down - if (e.metaKey) { - deltaY = -i.contentHeight; - } else if (e.altKey) { - deltaY = -i.containerHeight; - } else { - deltaY = -30; - } - break; - case 32: // space bar - if (e.shiftKey) { - deltaY = i.containerHeight; - } else { - deltaY = -i.containerHeight; - } - break; - case 33: // page up - deltaY = i.containerHeight; - break; - case 34: // page down - deltaY = -i.containerHeight; - break; - case 36: // home - deltaY = i.contentHeight; - break; - case 35: // end - deltaY = -i.contentHeight; - break; - default: - return; - } - - if (i.settings.suppressScrollX && deltaX !== 0) { - return; - } - if (i.settings.suppressScrollY && deltaY !== 0) { - return; - } - - element.scrollTop -= deltaY; - element.scrollLeft += deltaX; - updateGeometry(i); - - if (shouldPreventDefault(deltaX, deltaY)) { - e.preventDefault(); - } - }); -}; - -var wheel = function(i) { - var element = i.element; - - function shouldPreventDefault(deltaX, deltaY) { - var scrollTop = element.scrollTop; - if (deltaX === 0) { - if (!i.scrollbarYActive) { - return false; - } - if ( - (scrollTop === 0 && deltaY > 0) || - (scrollTop >= i.contentHeight - i.containerHeight && deltaY < 0) - ) { - return !i.settings.wheelPropagation; - } - } - - var scrollLeft = element.scrollLeft; - if (deltaY === 0) { - if (!i.scrollbarXActive) { - return false; - } - if ( - (scrollLeft === 0 && deltaX < 0) || - (scrollLeft >= i.contentWidth - i.containerWidth && deltaX > 0) - ) { - return !i.settings.wheelPropagation; - } - } - return true; - } - - function getDeltaFromEvent(e) { - var deltaX = e.deltaX; - var deltaY = -1 * e.deltaY; - - if (typeof deltaX === 'undefined' || typeof deltaY === 'undefined') { - // OS X Safari - deltaX = -1 * e.wheelDeltaX / 6; - deltaY = e.wheelDeltaY / 6; - } - - if (e.deltaMode && e.deltaMode === 1) { - // Firefox in deltaMode 1: Line scrolling - deltaX *= 10; - deltaY *= 10; - } - - if (deltaX !== deltaX && deltaY !== deltaY /* NaN checks */) { - // IE in some mouse drivers - deltaX = 0; - deltaY = e.wheelDelta; - } - - if (e.shiftKey) { - // reverse axis with shift key - return [-deltaY, -deltaX]; - } - return [deltaX, deltaY]; - } - - function shouldBeConsumedByChild(target, deltaX, deltaY) { - // FIXME: this is a workaround for
    ").addClass("cw").text("#"));c.isBefore(f.clone().endOf("w"));)b.append(a("").addClass("dow").text(c.format("dd"))),c.add(1,"d");o.find(".datepicker-days thead").append(b)},N=function(a){return d.disabledDates[a.format("YYYY-MM-DD")]===!0},O=function(a){return d.enabledDates[a.format("YYYY-MM-DD")]===!0},P=function(a){return d.disabledHours[a.format("H")]===!0},Q=function(a){return d.enabledHours[a.format("H")]===!0},R=function(b,c){if(!b.isValid())return!1;if(d.disabledDates&&"d"===c&&N(b))return!1;if(d.enabledDates&&"d"===c&&!O(b))return!1;if(d.minDate&&b.isBefore(d.minDate,c))return!1;if(d.maxDate&&b.isAfter(d.maxDate,c))return!1;if(d.daysOfWeekDisabled&&"d"===c&&d.daysOfWeekDisabled.indexOf(b.day())!==-1)return!1;if(d.disabledHours&&("h"===c||"m"===c||"s"===c)&&P(b))return!1;if(d.enabledHours&&("h"===c||"m"===c||"s"===c)&&!Q(b))return!1;if(d.disabledTimeIntervals&&("h"===c||"m"===c||"s"===c)){var e=!1;if(a.each(d.disabledTimeIntervals,function(){if(b.isBetween(this[0],this[1]))return e=!0,!1}),e)return!1}return!0},S=function(){for(var b=[],c=f.clone().startOf("y").startOf("d");c.isSame(f,"y");)b.push(a("").attr("data-action","selectMonth").addClass("month").text(c.format("MMM"))),c.add(1,"M");o.find(".datepicker-months td").empty().append(b)},T=function(){var b=o.find(".datepicker-months"),c=b.find("th"),g=b.find("tbody").find("span");c.eq(0).find("span").attr("title",d.tooltips.prevYear),c.eq(1).attr("title",d.tooltips.selectYear),c.eq(2).find("span").attr("title",d.tooltips.nextYear),b.find(".disabled").removeClass("disabled"),R(f.clone().subtract(1,"y"),"y")||c.eq(0).addClass("disabled"),c.eq(1).text(f.year()),R(f.clone().add(1,"y"),"y")||c.eq(2).addClass("disabled"),g.removeClass("active"),e.isSame(f,"y")&&!m&&g.eq(e.month()).addClass("active"),g.each(function(b){R(f.clone().month(b),"M")||a(this).addClass("disabled")})},U=function(){var a=o.find(".datepicker-years"),b=a.find("th"),c=f.clone().subtract(5,"y"),g=f.clone().add(6,"y"),h="";for(b.eq(0).find("span").attr("title",d.tooltips.prevDecade),b.eq(1).attr("title",d.tooltips.selectDecade),b.eq(2).find("span").attr("title",d.tooltips.nextDecade),a.find(".disabled").removeClass("disabled"),d.minDate&&d.minDate.isAfter(c,"y")&&b.eq(0).addClass("disabled"),b.eq(1).text(c.year()+"-"+g.year()),d.maxDate&&d.maxDate.isBefore(g,"y")&&b.eq(2).addClass("disabled");!c.isAfter(g,"y");)h+=''+c.year()+"",c.add(1,"y");a.find("td").html(h)},V=function(){var a,c=o.find(".datepicker-decades"),g=c.find("th"),h=b({y:f.year()-f.year()%100-1}),i=h.clone().add(100,"y"),j=h.clone(),k=!1,l=!1,m="";for(g.eq(0).find("span").attr("title",d.tooltips.prevCentury),g.eq(2).find("span").attr("title",d.tooltips.nextCentury),c.find(".disabled").removeClass("disabled"),(h.isSame(b({y:1900}))||d.minDate&&d.minDate.isAfter(h,"y"))&&g.eq(0).addClass("disabled"),g.eq(1).text(h.year()+"-"+i.year()),(h.isSame(b({y:2e3}))||d.maxDate&&d.maxDate.isBefore(i,"y"))&&g.eq(2).addClass("disabled");!h.isAfter(i,"y");)a=h.year()+12,k=d.minDate&&d.minDate.isAfter(h,"y")&&d.minDate.year()<=a,l=d.maxDate&&d.maxDate.isAfter(h,"y")&&d.maxDate.year()<=a,m+=''+(h.year()+1)+" - "+(h.year()+12)+"",h.add(12,"y");m+="",c.find("td").html(m),g.eq(1).text(j.year()+1+"-"+h.year())},W=function(){var b,c,g,h=o.find(".datepicker-days"),i=h.find("th"),j=[],k=[];if(B()){for(i.eq(0).find("span").attr("title",d.tooltips.prevMonth),i.eq(1).attr("title",d.tooltips.selectMonth),i.eq(2).find("span").attr("title",d.tooltips.nextMonth),h.find(".disabled").removeClass("disabled"),i.eq(1).text(f.format(d.dayViewHeaderFormat)),R(f.clone().subtract(1,"M"),"M")||i.eq(0).addClass("disabled"),R(f.clone().add(1,"M"),"M")||i.eq(2).addClass("disabled"),b=f.clone().startOf("M").startOf("w").startOf("d"),g=0;g<42;g++)0===b.weekday()&&(c=a("
    '+b.week()+"'+b.date()+"
    '+c.format(h?"HH":"hh")+"
    '+c.format("mm")+"
    '+c.format("ss")+"