Update to Angular 8.0.6
Updates to angular 8 and updates all used components - removed wrapper class for ngx/pwa LocalStorrace - removed database lock service due to bugs - tried to work around a cycle of dependancies - changed some structure to be more close to default angular - removed legacy angular packages - removed date-picker since it was not currently used and is not compatible anymore - upgrade tinyMCE
This commit is contained in:
parent
8a8684b27a
commit
bc0fea3310
20
.travis.yml
20
.travis.yml
@ -60,12 +60,12 @@ matrix:
|
||||
- language: node_js
|
||||
name: "Client: Linting"
|
||||
node_js:
|
||||
- "10.5"
|
||||
- "10.9"
|
||||
cache:
|
||||
directories:
|
||||
- node_modules
|
||||
before_install:
|
||||
- npm install -g @angular/cli@~7.3.8
|
||||
- npm install -g @angular/cli@~8.0.6
|
||||
- ng --version
|
||||
- cd client
|
||||
install:
|
||||
@ -76,12 +76,12 @@ matrix:
|
||||
- language: node_js
|
||||
name: "Client: Code Formatting Check"
|
||||
node_js:
|
||||
- "10.5"
|
||||
- "10.9"
|
||||
cache:
|
||||
directories:
|
||||
- node_modules
|
||||
before_install:
|
||||
- npm install -g @angular/cli@~7.3.8
|
||||
- npm install -g @angular/cli@~8.0.6
|
||||
- ng --version
|
||||
- cd client
|
||||
install:
|
||||
@ -93,7 +93,7 @@ matrix:
|
||||
- language: node_js
|
||||
name: "Client: Testing"
|
||||
node_js:
|
||||
- "10.5"
|
||||
- "10.9"
|
||||
apt:
|
||||
sources:
|
||||
- google-chrome
|
||||
@ -107,7 +107,7 @@ matrix:
|
||||
before_install:
|
||||
- export CHROME_BIN=/usr/bin/google-chrome
|
||||
- export DISPLAY=:99.0
|
||||
- npm install -g @angular/cli@~7.3.8
|
||||
- npm install -g @angular/cli@~8.0.6
|
||||
- ng --version
|
||||
- cd client
|
||||
install:
|
||||
@ -118,12 +118,12 @@ matrix:
|
||||
- language: node_js
|
||||
name: "Client: Build"
|
||||
node_js:
|
||||
- "10.5"
|
||||
- "10.9"
|
||||
cache:
|
||||
directories:
|
||||
- node_modules
|
||||
before_install:
|
||||
- npm install -g @angular/cli@~7.3.8
|
||||
- npm install -g @angular/cli@~8.0.6
|
||||
- ng --version
|
||||
- cd client
|
||||
install:
|
||||
@ -134,12 +134,12 @@ matrix:
|
||||
- language: node_js
|
||||
name: "Client: Production Build"
|
||||
node_js:
|
||||
- "10.5"
|
||||
- "10.9"
|
||||
cache:
|
||||
directories:
|
||||
- node_modules
|
||||
before_install:
|
||||
- npm install -g @angular/cli@~7.3.8
|
||||
- npm install -g @angular/cli@~8.0.6
|
||||
- ng --version
|
||||
- cd client
|
||||
install:
|
||||
|
@ -59,62 +59,63 @@ Language files can be found in `/src/assets/i18n`.
|
||||
|
||||
OpenSlides uses the following software or parts of them:
|
||||
|
||||
- [@angular/animations@7.2.14](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/cdk-experimental@7.3.7](https://github.com/angular/material2), License: MIT
|
||||
- [@angular/cdk@7.3.7](https://github.com/angular/material2), License: MIT
|
||||
- [@angular/common@7.2.14](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/compiler@7.2.14](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/core@7.2.14](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/forms@7.2.14](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/http@7.2.14](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/material@7.3.7](https://github.com/angular/material2), License: MIT
|
||||
- [@angular/platform-browser-dynamic@7.2.14](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/platform-browser@7.2.14](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/pwa@0.13.8](https://github.com/angular/angular-cli), License: MIT
|
||||
- [@angular/router@7.2.14](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/service-worker@7.2.14](https://github.com/angular/angular), License: MIT
|
||||
- [@ngx-pwa/local-storage@7.4.2](https://github.com/cyrilletuzi/angular-async-local-storage), License: MIT
|
||||
- [@angular/animations@8.0.3](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/cdk-experimental@8.0.1](https://github.com/angular/components), License: MIT
|
||||
- [@angular/cdk@8.0.1](https://github.com/angular/components), License: MIT
|
||||
- [@angular/common@8.0.3](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/compiler@8.0.3](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/core@8.0.3](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/forms@8.0.3](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/material@8.0.1](https://github.com/angular/components), License: MIT
|
||||
- [@angular/platform-browser-dynamic@8.0.3](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/platform-browser@8.0.3](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/pwa@0.800.6](https://github.com/angular/angular-cli), License: MIT
|
||||
- [@angular/router@8.0.3](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/service-worker@8.0.3](https://github.com/angular/angular), License: MIT
|
||||
- [@ngx-pwa/local-storage@8.0.2](https://github.com/cyrilletuzi/angular-async-local-storage), License: MIT
|
||||
- [@ngx-translate/core@11.0.1](https://github.com/ngx-translate/core), License: MIT
|
||||
- [@ngx-translate/http-loader@4.0.0](https://github.com/ngx-translate/http-loader), License: MIT
|
||||
- [@pebula/ngrid-material@1.0.0-alpha.20](https://github.com/shlomiassaf/ngrid), License: MIT
|
||||
- [@pebula/ngrid@1.0.0-alpha.20](https://github.com/shlomiassaf/ngrid), License: MIT
|
||||
- [@pebula/ngrid-material@1.0.0-alpha.26](https://github.com/shlomiassaf/ngrid), License: MIT
|
||||
- [@pebula/ngrid@1.0.0-alpha.26](https://github.com/shlomiassaf/ngrid), License: MIT
|
||||
- [@pebula/utils@1.0.0-alpha.3](https://github.com/shlomiassaf/ngrid), License: MIT
|
||||
- [@tinymce/tinymce-angular@3.0.0](https://github.com/tinymce/tinymce-angular), License: Apache-2.0
|
||||
- [core-js@3.0.1](https://github.com/zloirock/core-js), License: MIT
|
||||
- [css-element-queries@1.1.1](https://github.com/marcj/css-element-queries), License: MIT
|
||||
- [exceljs@1.9.1](https://github.com/exceljs/exceljs), License: MIT
|
||||
- [file-saver@2.0.1](https://github.com/eligrey/FileSaver.js), License: MIT
|
||||
- [@tinymce/tinymce-angular@3.2.0](https://github.com/tinymce/tinymce-angular), License: Apache-2.0
|
||||
- [acorn@6.1.1](https://github.com/acornjs/acorn), License: MIT
|
||||
- [core-js@3.1.4](https://github.com/zloirock/core-js), License: MIT
|
||||
- [css-element-queries@1.2.0](https://github.com/marcj/css-element-queries), License: MIT
|
||||
- [exceljs@1.13.0](https://github.com/exceljs/exceljs), License: MIT
|
||||
- [file-saver@2.0.2](https://github.com/eligrey/FileSaver.js), License: MIT
|
||||
- [hammerjs@2.0.8](https://github.com/hammerjs/hammer.js), License: MIT
|
||||
- [lz4js@0.2.0](https://github.com/Benzinga/lz4js), License: ISC
|
||||
- [material-icon-font@0.1.0](https://github.com//petergng/svgFontCreator), License: ISC
|
||||
- [ng-pick-datetime@7.0.0](https://github.com/DanielYKPan/date-time-picker), License: MIT
|
||||
- [ng2-pdf-viewer@5.3.2](git+https://vadimdez@github.com/VadimDez/ng2-pdf-viewer), License: MIT
|
||||
- [ngx-file-drop@6.0.0](https://github.com/georgipeltekov/ngx-file-drop), License: MIT
|
||||
- [ngx-mat-select-search@1.7.2](https://github.com/bithost-gmbh/ngx-mat-select-search), License: MIT
|
||||
- [ngx-papaparse@3.0.2](https://github.com/alberthaff/ngx-papaparse), License: MIT
|
||||
- [pdfmake@0.1.54](https://github.com/bpampuch/pdfmake), License: MIT
|
||||
- [ngx-file-drop@8.0.3](https://github.com/georgipeltekov/ngx-file-drop), License: MIT
|
||||
- [ngx-mat-select-search@1.7.6](https://github.com/bithost-gmbh/ngx-mat-select-search), License: MIT
|
||||
- [ngx-papaparse@3.0.3](https://github.com/alberthaff/ngx-papaparse), License: MIT
|
||||
- [pdfmake@0.1.57](https://github.com/bpampuch/pdfmake), License: MIT
|
||||
- [po2json@1.0.0-alpha](https://github.com/mikeedwards/po2json), License: GNU Library General Public License
|
||||
- [rxjs@6.5.1](https://github.com/reactivex/rxjs), License: Apache-2.0
|
||||
- [tinymce@4.9.4](https://github.com/tinymce/tinymce-dist), License: LGPL-2.1
|
||||
- [rxjs@6.5.2](https://github.com/reactivex/rxjs), License: Apache-2.0
|
||||
- [text-encoding@0.7.0](https://github.com/inexorabletash/text-encoding), License: (Unlicense OR Apache-2.0)
|
||||
- [tinymce@5.0.9](https://github.com/tinymce/tinymce-dist), License: LGPL-2.1
|
||||
- [tslib@1.10.0](https://github.com/Microsoft/tslib), License: Apache-2.0
|
||||
- [uuid@3.3.2](https://github.com/kelektiv/node-uuid), License: MIT
|
||||
- [zone.js@0.8.29](https://github.com/angular/zone.js), License: MIT
|
||||
- [@angular-devkit/build-angular@0.13.8](https://github.com/angular/angular-cli), License: MIT
|
||||
- [@angular/cli@7.3.8](https://github.com/angular/angular-cli), License: MIT
|
||||
- [@angular/compiler-cli@7.2.14](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/language-service@7.2.14](https://github.com/angular/angular), License: MIT
|
||||
- [zone.js@0.9.1](https://github.com/angular/zone.js), License: MIT
|
||||
- [@angular-devkit/build-angular@0.800.6](https://github.com/angular/angular-cli), License: MIT
|
||||
- [@angular/cli@8.0.6](https://github.com/angular/angular-cli), License: MIT
|
||||
- [@angular/compiler-cli@8.0.3](https://github.com/angular/angular), License: MIT
|
||||
- [@angular/language-service@8.0.3](https://github.com/angular/angular), License: MIT
|
||||
- [@biesbjerg/ngx-translate-extract@2.3.4](https://github.com/biesbjerg/ngx-translate-extract), License: MIT
|
||||
- [@compodoc/compodoc@1.1.9](https://github.com/compodoc/compodoc), License: MIT
|
||||
- [@types/jasmine@3.3.12](https://github.com/DefinitelyTyped/DefinitelyTyped), License: MIT
|
||||
- [@types/jasmine@3.3.13](https://github.com/DefinitelyTyped/DefinitelyTyped), License: MIT
|
||||
- [@types/jasminewd2@2.0.6](https://github.com/DefinitelyTyped/DefinitelyTyped), License: MIT
|
||||
- [@types/node@11.13.7](https://github.com/DefinitelyTyped/DefinitelyTyped), License: MIT
|
||||
- [@types/node@8.9.5](https://github.com/DefinitelyTyped/DefinitelyTyped), License: MIT
|
||||
- [@types/yargs@13.0.0](https://github.com/DefinitelyTyped/DefinitelyTyped), License: MIT
|
||||
- [codelyzer@5.0.1](https://github.com/mgechev/codelyzer), License: MIT
|
||||
- [husky@1.3.1](https://github.com/typicode/husky), License: MIT
|
||||
- [codelyzer@5.1.0](https://github.com/mgechev/codelyzer), License: MIT
|
||||
- [husky@2.7.0](https://github.com/typicode/husky), License: MIT
|
||||
- [jasmine-core@3.4.0](https://github.com/jasmine/jasmine), License: MIT
|
||||
- [jasmine-spec-reporter@4.2.1](https://github.com/bcaudan/jasmine-spec-reporter), License: Apache-2.0
|
||||
- [karma-chrome-launcher@2.2.0](https://github.com/karma-runner/karma-chrome-launcher), License: MIT
|
||||
- [karma-coverage-istanbul-reporter@2.0.5](https://github.com/mattlewis92/karma-coverage-istanbul-reporter), License: MIT
|
||||
- [karma-jasmine-html-reporter@1.4.0](https://github.com/dfederm/karma-jasmine-html-reporter), License: MIT
|
||||
- [karma-jasmine-html-reporter@1.4.2](https://github.com/dfederm/karma-jasmine-html-reporter), License: MIT
|
||||
- [karma-jasmine@2.0.1](https://github.com/karma-runner/karma-jasmine), License: MIT
|
||||
- [karma@4.1.0](https://github.com/karma-runner/karma), License: MIT
|
||||
- [npm-license-crawler@0.2.1](https://github.com/mwittig/npm-license-crawler), License: BSD-3-Clause
|
||||
@ -122,8 +123,9 @@ OpenSlides uses the following software or parts of them:
|
||||
- [prettier@1.18.2](https://github.com/prettier/prettier), License: MIT
|
||||
- [protractor@5.4.2](https://github.com/angular/protractor), License: MIT
|
||||
- [resize-observer-polyfill@1.5.1](https://github.com/que-etc/resize-observer-polyfill), License: MIT
|
||||
- [source-map-explorer@1.8.0](https://github.com/danvk/source-map-explorer), License: Apache-2.0
|
||||
- [ts-node@8.1.0](https://github.com/TypeStrong/ts-node), License: MIT
|
||||
- [tslint@5.16.0](https://github.com/palantir/tslint), License: Apache-2.0
|
||||
- [tsutils@3.10.0](https://github.com/ajafff/tsutils), License: MIT
|
||||
- [source-map-explorer@2.0.1](https://github.com/danvk/source-map-explorer), License: Apache-2.0
|
||||
- [ts-node@7.0.1](https://github.com/TypeStrong/ts-node), License: MIT
|
||||
- [tslint@5.15.0](https://github.com/palantir/tslint), License: Apache-2.0
|
||||
- [tsutils@3.14.0](https://github.com/ajafff/tsutils), License: MIT
|
||||
- [typescript@3.4.5](https://github.com/Microsoft/TypeScript), License: Apache-2.0
|
||||
- [webpack-bundle-analyzer@3.3.2](https://github.com/webpack-contrib/webpack-bundle-analyzer), License: MIT
|
||||
|
@ -4,15 +4,15 @@
|
||||
"newProjectRoot": "projects",
|
||||
"projects": {
|
||||
"client": {
|
||||
"root": "",
|
||||
"sourceRoot": "src",
|
||||
"projectType": "application",
|
||||
"prefix": "os",
|
||||
"schematics": {
|
||||
"@schematics/angular:component": {
|
||||
"styleext": "scss"
|
||||
}
|
||||
},
|
||||
"root": "",
|
||||
"sourceRoot": "src",
|
||||
"prefix": "os",
|
||||
"architect": {
|
||||
"build": {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
@ -21,26 +21,17 @@
|
||||
"index": "src/index.html",
|
||||
"main": "src/main.ts",
|
||||
"polyfills": "src/polyfills.ts",
|
||||
"tsConfig": "src/tsconfig.app.json",
|
||||
"assets": ["src/assets", "src/manifest.json"],
|
||||
"tsConfig": "tsconfig.app.json",
|
||||
"aot": false,
|
||||
"assets": [
|
||||
"src/assets",
|
||||
"src/manifest.json",
|
||||
{ "glob": "**/*", "input": "node_modules/tinymce/skins", "output": "/tinymce/skins/" },
|
||||
{ "glob": "**/*", "input": "node_modules/tinymce/themes", "output": "/tinymce/themes/" },
|
||||
{ "glob": "**/*", "input": "node_modules/tinymce/plugins", "output": "/tinymce/plugins/" }
|
||||
],
|
||||
"styles": ["src/styles.scss"],
|
||||
"scripts": [
|
||||
"node_modules/tinymce/tinymce.min.js",
|
||||
"node_modules/tinymce/themes/modern/theme.js",
|
||||
"node_modules/tinymce/plugins/autolink/plugin.js",
|
||||
"node_modules/tinymce/plugins/charmap/plugin.js",
|
||||
"node_modules/tinymce/plugins/code/plugin.js",
|
||||
"node_modules/tinymce/plugins/colorpicker/plugin.js",
|
||||
"node_modules/tinymce/plugins/fullscreen/plugin.js",
|
||||
"node_modules/tinymce/plugins/image/plugin.js",
|
||||
"node_modules/tinymce/plugins/imagetools/plugin.js",
|
||||
"node_modules/tinymce/plugins/lists/plugin.js",
|
||||
"node_modules/tinymce/plugins/link/plugin.js",
|
||||
"node_modules/tinymce/plugins/paste/plugin.js",
|
||||
"node_modules/tinymce/plugins/preview/plugin.js",
|
||||
"node_modules/tinymce/plugins/searchreplace/plugin.js",
|
||||
"node_modules/tinymce/plugins/textcolor/plugin.js"
|
||||
]
|
||||
"scripts": ["node_modules/tinymce/tinymce.min.js"]
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
@ -59,7 +50,14 @@
|
||||
"extractLicenses": true,
|
||||
"vendorChunk": false,
|
||||
"buildOptimizer": true,
|
||||
"serviceWorker": true
|
||||
"serviceWorker": true,
|
||||
"budgets": [
|
||||
{
|
||||
"type": "initial",
|
||||
"maximumWarning": "2mb",
|
||||
"maximumError": "5mb"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -85,27 +83,27 @@
|
||||
"options": {
|
||||
"main": "src/test.ts",
|
||||
"polyfills": "src/polyfills.ts",
|
||||
"tsConfig": "src/tsconfig.spec.json",
|
||||
"karmaConfig": "src/karma.conf.js",
|
||||
"tsConfig": "tsconfig.spec.json",
|
||||
"karmaConfig": "karma.conf.js",
|
||||
"styles": ["src/styles.scss"],
|
||||
"scripts": ["node_modules/tinymce/tinymce.min.js"],
|
||||
"assets": ["src/assets", "src/manifest.json"]
|
||||
"assets": [
|
||||
"src/assets",
|
||||
"src/manifest.json",
|
||||
{ "glob": "**/*", "input": "node_modules/tinymce/skins", "output": "/tinymce/skins/" },
|
||||
{ "glob": "**/*", "input": "node_modules/tinymce/themes", "output": "/tinymce/themes/" },
|
||||
{ "glob": "**/*", "input": "node_modules/tinymce/plugins", "output": "/tinymce/plugins/" }
|
||||
]
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"builder": "@angular-devkit/build-angular:tslint",
|
||||
"options": {
|
||||
"tsConfig": "src/tsconfig.spec.json",
|
||||
"tsConfig": "tsconfig.spec.json",
|
||||
"format": "stylish",
|
||||
"exclude": ["**/node_modules/**"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"client-e2e": {
|
||||
"root": "e2e/",
|
||||
"projectType": "application",
|
||||
"architect": {
|
||||
},
|
||||
"e2e": {
|
||||
"builder": "@angular-devkit/build-angular:protractor",
|
||||
"options": {
|
||||
@ -117,13 +115,6 @@
|
||||
"devServerTarget": "client:serve:production"
|
||||
}
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"builder": "@angular-devkit/build-angular:tslint",
|
||||
"options": {
|
||||
"tsConfig": "e2e/tsconfig.e2e.json",
|
||||
"exclude": ["**/node_modules/**"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,4 +6,4 @@
|
||||
last 2 versions
|
||||
Firefox ESR
|
||||
not dead
|
||||
# IE 9-11
|
||||
IE 9-11
|
@ -25,60 +25,60 @@
|
||||
"prettify-write": "prettier --config ./.prettierrc --write \"src/{app,environments}/**/*{.ts,.js,.json,.css,.scss}\""
|
||||
},
|
||||
"dependencies": {
|
||||
"@angular/animations": "^7.2.14",
|
||||
"@angular/cdk": "^7.3.7",
|
||||
"@angular/cdk-experimental": "^7.3.7",
|
||||
"@angular/common": "^7.2.14",
|
||||
"@angular/compiler": "^7.2.14",
|
||||
"@angular/core": "^7.2.14",
|
||||
"@angular/forms": "^7.2.14",
|
||||
"@angular/http": "^7.2.14",
|
||||
"@angular/material": "^7.3.7",
|
||||
"@angular/platform-browser": "^7.2.14",
|
||||
"@angular/platform-browser-dynamic": "^7.2.14",
|
||||
"@angular/pwa": "^0.13.8",
|
||||
"@angular/router": "^7.2.14",
|
||||
"@angular/service-worker": "^7.2.14",
|
||||
"@ngx-pwa/local-storage": "^7.4.1",
|
||||
"@angular/animations": "^8.0.3",
|
||||
"@angular/cdk": "^8.0.1",
|
||||
"@angular/cdk-experimental": "^8.0.1",
|
||||
"@angular/common": "^8.0.3",
|
||||
"@angular/compiler": "^8.0.3",
|
||||
"@angular/core": "^8.0.3",
|
||||
"@angular/forms": "^8.0.3",
|
||||
"@angular/material": "^8.0.1",
|
||||
"@angular/platform-browser": "^8.0.3",
|
||||
"@angular/platform-browser-dynamic": "^8.0.3",
|
||||
"@angular/pwa": "^0.800.6",
|
||||
"@angular/router": "^8.0.3",
|
||||
"@angular/service-worker": "^8.0.3",
|
||||
"@ngx-pwa/local-storage": "^8.0.2",
|
||||
"@ngx-translate/core": "^11.0.1",
|
||||
"@ngx-translate/http-loader": "^4.0.0",
|
||||
"@pebula/ngrid": "1.0.0-alpha.20",
|
||||
"@pebula/ngrid-material": "1.0.0-alpha.20",
|
||||
"@pebula/utils": "1.0.0-alpha.3",
|
||||
"@tinymce/tinymce-angular": "^3.0.0",
|
||||
"@pebula/ngrid": "^1.0.0-alpha.26",
|
||||
"@pebula/ngrid-material": "^1.0.0-alpha.26",
|
||||
"@pebula/utils": "^1.0.0-alpha.3",
|
||||
"@tinymce/tinymce-angular": "^3.2.0",
|
||||
"acorn": "^6.1.1",
|
||||
"core-js": "^3.0.1",
|
||||
"css-element-queries": "^1.1.1",
|
||||
"exceljs": "1.9.1",
|
||||
"exceljs": "1.13.0",
|
||||
"file-saver": "^2.0.1",
|
||||
"hammerjs": "^2.0.8",
|
||||
"lz4js": "^0.2.0",
|
||||
"material-icon-font": "git+https://github.com/petergng/materialIconFont.git",
|
||||
"ng-pick-datetime": "^7.0.0",
|
||||
"ng2-pdf-viewer": "^5.2.3",
|
||||
"ngx-file-drop": "^6.0.0",
|
||||
"ngx-file-drop": "^8.0.3",
|
||||
"ngx-mat-select-search": "^1.7.2",
|
||||
"ngx-papaparse": "^3.0.2",
|
||||
"pdfmake": "^0.1.53",
|
||||
"po2json": "^1.0.0-alpha",
|
||||
"rxjs": "^6.5.1",
|
||||
"rxjs": "^6.5.2",
|
||||
"text-encoding": "^0.7.0",
|
||||
"tinymce": "^4.9.2",
|
||||
"tinymce": "^5.0.9",
|
||||
"tslib": "^1.9.0",
|
||||
"uuid": "^3.3.2",
|
||||
"zone.js": "~0.8.26"
|
||||
"zone.js": "~0.9.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "^0.13.8",
|
||||
"@angular/cli": "^7.3.8",
|
||||
"@angular/compiler-cli": "^7.2.14",
|
||||
"@angular/language-service": "^7.2.14",
|
||||
"@angular-devkit/build-angular": "~0.800.6",
|
||||
"@angular/cli": "^8.0.6",
|
||||
"@angular/compiler-cli": "^8.0.3",
|
||||
"@angular/language-service": "^8.0.3",
|
||||
"@biesbjerg/ngx-translate-extract": "^2.3.4",
|
||||
"@compodoc/compodoc": "^1.1.8",
|
||||
"@types/jasmine": "^3.3.9",
|
||||
"@types/jasminewd2": "^2.0.6",
|
||||
"@types/node": "^11.13.7",
|
||||
"@types/node": "~8.9.4",
|
||||
"@types/yargs": "^13.0.0",
|
||||
"codelyzer": "~5.0.0",
|
||||
"husky": "^1.3.1",
|
||||
"codelyzer": "^5.0.1",
|
||||
"husky": "^2.7.0",
|
||||
"jasmine-core": "~3.4.0",
|
||||
"jasmine-spec-reporter": "~4.2.1",
|
||||
"karma": "^4.1.0",
|
||||
@ -91,11 +91,11 @@
|
||||
"prettier": "^1.18.0",
|
||||
"protractor": "^5.4.2",
|
||||
"resize-observer-polyfill": "^1.5.1",
|
||||
"source-map-explorer": "^1.7.0",
|
||||
"ts-node": "~8.1.0",
|
||||
"tslint": "~5.16.0",
|
||||
"tsutils": "3.10.0",
|
||||
"typescript": "~3.2.0",
|
||||
"source-map-explorer": "^2.0.1",
|
||||
"ts-node": "~7.0.0",
|
||||
"tslint": "~5.15.0",
|
||||
"tsutils": "3.14.0",
|
||||
"typescript": "~3.4.3",
|
||||
"webpack-bundle-analyzer": "^3.3.2"
|
||||
}
|
||||
}
|
||||
|
@ -25,10 +25,11 @@ const routes: Routes = [
|
||||
},
|
||||
{
|
||||
path: 'projector',
|
||||
loadChildren: './fullscreen-projector/fullscreen-projector.module#FullscreenProjectorModule',
|
||||
loadChildren: () =>
|
||||
import('./fullscreen-projector/fullscreen-projector.module').then(m => m.FullscreenProjectorModule),
|
||||
data: { noInterruption: true }
|
||||
},
|
||||
{ path: '', loadChildren: './site/site.module#SiteModule' },
|
||||
{ path: '', loadChildren: () => import('./site/site.module').then(m => m.SiteModule) },
|
||||
{ path: '**', redirectTo: '' }
|
||||
];
|
||||
|
||||
|
@ -31,9 +31,11 @@ export abstract class BaseComponent {
|
||||
* Settings for the TinyMCE editor selector
|
||||
*/
|
||||
public tinyMceSettings = {
|
||||
base_url: '/tinymce', // Root for resources
|
||||
suffix: '.min', // Suffix to use when loading resources
|
||||
theme: 'silver',
|
||||
language: null,
|
||||
language_url: null,
|
||||
skin_url: '/assets/tinymce/skins/lightgray',
|
||||
inline: false,
|
||||
statusbar: false,
|
||||
browser_spellcheck: true,
|
||||
@ -41,13 +43,17 @@ export abstract class BaseComponent {
|
||||
image_description: false,
|
||||
link_title: false,
|
||||
height: 320,
|
||||
// TODO: image_list: images,
|
||||
plugins: `autolink charmap code colorpicker fullscreen image imagetools
|
||||
lists link paste searchreplace textcolor`,
|
||||
menubar: '',
|
||||
plugins: `autolink charmap code fullscreen image imagetools
|
||||
lists link paste searchreplace`,
|
||||
menubar: false,
|
||||
contextmenu: false,
|
||||
toolbar: `styleselect | bold italic underline strikethrough |
|
||||
forecolor backcolor removeformat | bullist numlist |
|
||||
link image charmap | code fullscreen`
|
||||
link image charmap | code fullscreen`,
|
||||
mobile: {
|
||||
theme: 'mobile',
|
||||
plugins: ['autosave', 'lists', 'autolink']
|
||||
}
|
||||
};
|
||||
|
||||
public constructor(protected titleService: Title, protected translate: TranslateService) {
|
||||
|
@ -2,9 +2,8 @@ import { Injectable } from '@angular/core';
|
||||
|
||||
import { WebsocketService, WEBSOCKET_ERROR_CODES } from './websocket.service';
|
||||
import { CollectionStringMapperService } from './collection-string-mapper.service';
|
||||
import { DataStoreService } from './data-store.service';
|
||||
import { DataStoreService, DataStoreUpdateManagerService } from './data-store.service';
|
||||
import { BaseModel } from '../../shared/models/base/base-model';
|
||||
import { DataStoreUpdateManagerService } from './data-store-update-manager.service';
|
||||
|
||||
interface AutoupdateFormat {
|
||||
/**
|
||||
|
@ -1,17 +0,0 @@
|
||||
import { TestBed, inject } from '@angular/core/testing';
|
||||
|
||||
import { E2EImportsModule } from '../../../e2e-imports.module';
|
||||
import { DataStoreUpdateManagerService } from './data-store-update-manager.service';
|
||||
|
||||
describe('DataStoreUpdateManagerService', () => {
|
||||
beforeEach(() => {
|
||||
TestBed.configureTestingModule({
|
||||
imports: [E2EImportsModule],
|
||||
providers: [DataStoreUpdateManagerService]
|
||||
});
|
||||
});
|
||||
|
||||
it('should be created', inject([DataStoreUpdateManagerService], (service: DataStoreUpdateManagerService) => {
|
||||
expect(service).toBeTruthy();
|
||||
}));
|
||||
});
|
@ -1,182 +0,0 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { Deferred } from '../deferred';
|
||||
import { DataStoreService } from './data-store.service';
|
||||
import { CollectionStringMapperService } from './collection-string-mapper.service';
|
||||
|
||||
export interface CollectionIds {
|
||||
[collection: string]: number[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper class for collecting data during the update phase of the DataStore.
|
||||
*/
|
||||
export class UpdateSlot {
|
||||
/**
|
||||
* Count instnaces of this class to easily compare them.
|
||||
*/
|
||||
private static ID_COUTNER = 1;
|
||||
|
||||
/**
|
||||
* Mapping of changed model ids to their collection.
|
||||
*/
|
||||
private changedModels: CollectionIds = {};
|
||||
|
||||
/**
|
||||
* Mapping of deleted models to their collection.
|
||||
*/
|
||||
private deletedModels: CollectionIds = {};
|
||||
|
||||
/**
|
||||
* The object's id.
|
||||
*/
|
||||
private _id: number;
|
||||
|
||||
/**
|
||||
* @param DS Carries the DataStore: TODO (see below `DataStoreUpdateManagerService.getNewUpdateSlot`)
|
||||
*/
|
||||
public constructor(public readonly DS: DataStoreService) {
|
||||
this._id = UpdateSlot.ID_COUTNER++;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds changed model information
|
||||
*
|
||||
* @param collection The collection
|
||||
* @param id The id
|
||||
*/
|
||||
public addChangedModel(collection: string, id: number): void {
|
||||
if (!this.changedModels[collection]) {
|
||||
this.changedModels[collection] = [];
|
||||
}
|
||||
this.changedModels[collection].push(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds deleted model information
|
||||
*
|
||||
* @param collection The collection
|
||||
* @param id The id
|
||||
*/
|
||||
public addDeletedModel(collection: string, id: number): void {
|
||||
if (!this.deletedModels[collection]) {
|
||||
this.deletedModels[collection] = [];
|
||||
}
|
||||
this.deletedModels[collection].push(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param collection The collection
|
||||
* @returns the list of changed model ids for the collection
|
||||
*/
|
||||
public getChangedModelIdsForCollection(collection: string): number[] {
|
||||
return this.changedModels[collection] || [];
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns the mapping of all changed models
|
||||
*/
|
||||
public getChangedModels(): CollectionIds {
|
||||
return this.changedModels;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param collection The collection
|
||||
* @returns the list of deleted model ids for the collection
|
||||
*/
|
||||
public getDeletedModelIdsForCollection(collection: string): number[] {
|
||||
return this.deletedModels[collection] || [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares this object to another update slot.
|
||||
*/
|
||||
public equal(other: UpdateSlot): boolean {
|
||||
return this._id === other._id;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Manages updates in the DS. Collects all ids for changed and deleted models and bulk-update
|
||||
* affected repositories.
|
||||
*/
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class DataStoreUpdateManagerService {
|
||||
/**
|
||||
* The current update slot
|
||||
*/
|
||||
private currentUpdateSlot: UpdateSlot | null = null;
|
||||
|
||||
/**
|
||||
* Requests for getting an update slot.
|
||||
*/
|
||||
private updateSlotRequests: Deferred[] = [];
|
||||
|
||||
/**
|
||||
* @param mapperService
|
||||
*/
|
||||
public constructor(private mapperService: CollectionStringMapperService) {}
|
||||
|
||||
/**
|
||||
* Retrieve the current update slot.
|
||||
*/
|
||||
public getCurrentUpdateSlot(): UpdateSlot | null {
|
||||
return this.currentUpdateSlot;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a new update slot. Returns a promise that must be awaited, if there is another
|
||||
* update in progress.
|
||||
*
|
||||
* @param DS The DataStore. This is a hack, becuase we cannot use the DataStore
|
||||
* here, because these are cyclic dependencies... --> TODO
|
||||
*/
|
||||
public async getNewUpdateSlot(DS: DataStoreService): Promise<UpdateSlot> {
|
||||
if (this.currentUpdateSlot) {
|
||||
const request = new Deferred();
|
||||
this.updateSlotRequests.push(request);
|
||||
await request;
|
||||
}
|
||||
this.currentUpdateSlot = new UpdateSlot(DS);
|
||||
return this.currentUpdateSlot;
|
||||
}
|
||||
|
||||
/**
|
||||
* Commits the given update slot. THis slot must be the current one. If there are requests
|
||||
* for update slots queued, the next one will be served.
|
||||
*
|
||||
* Note: I added this param to make sure, that only the user of the slot
|
||||
* can commit the update and no one else.
|
||||
*
|
||||
* @param slot The slot to commit
|
||||
*/
|
||||
public commit(slot: UpdateSlot): void {
|
||||
if (!this.currentUpdateSlot || !this.currentUpdateSlot.equal(slot)) {
|
||||
throw new Error('No or wrong update slot to be finished!');
|
||||
}
|
||||
this.currentUpdateSlot = null;
|
||||
|
||||
// notify repositories in two phases
|
||||
const repositories = this.mapperService.getAllRepositories();
|
||||
|
||||
// Phase 1: deleting and creating of view models (in this order)
|
||||
repositories.forEach(repo => {
|
||||
repo.deleteModels(slot.getDeletedModelIdsForCollection(repo.collectionString));
|
||||
repo.changedModels(slot.getChangedModelIdsForCollection(repo.collectionString));
|
||||
});
|
||||
|
||||
// Phase 2: updating dependencies
|
||||
repositories.forEach(repo => {
|
||||
repo.updateDependencies(slot.getChangedModels());
|
||||
});
|
||||
|
||||
slot.DS.triggerModifiedObservable();
|
||||
|
||||
// serve next slot request
|
||||
if (this.updateSlotRequests.length > 0) {
|
||||
const request = this.updateSlotRequests.pop();
|
||||
request.resolve();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,11 +1,10 @@
|
||||
import { Injectable, EventEmitter } from '@angular/core';
|
||||
|
||||
import { Observable, Subject } from 'rxjs';
|
||||
|
||||
import { BaseModel, ModelConstructor } from '../../shared/models/base/base-model';
|
||||
import { StorageService } from './storage.service';
|
||||
import { CollectionStringMapperService } from './collection-string-mapper.service';
|
||||
import { DataStoreUpdateManagerService } from './data-store-update-manager.service';
|
||||
import { Deferred } from '../deferred';
|
||||
import { StorageService } from './storage.service';
|
||||
|
||||
/**
|
||||
* Represents information about a deleted model.
|
||||
@ -17,6 +16,98 @@ export interface DeletedInformation {
|
||||
id: number;
|
||||
}
|
||||
|
||||
export interface CollectionIds {
|
||||
[collection: string]: number[];
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper class for collecting data during the update phase of the DataStore.
|
||||
*/
|
||||
export class UpdateSlot {
|
||||
/**
|
||||
* Count instnaces of this class to easily compare them.
|
||||
*/
|
||||
private static ID_COUTNER = 1;
|
||||
|
||||
/**
|
||||
* Mapping of changed model ids to their collection.
|
||||
*/
|
||||
private changedModels: CollectionIds = {};
|
||||
|
||||
/**
|
||||
* Mapping of deleted models to their collection.
|
||||
*/
|
||||
private deletedModels: CollectionIds = {};
|
||||
|
||||
/**
|
||||
* The object's id.
|
||||
*/
|
||||
private _id: number;
|
||||
|
||||
/**
|
||||
* @param DS Carries the DataStore: TODO (see below `DataStoreUpdateManagerService.getNewUpdateSlot`)
|
||||
*/
|
||||
public constructor(public readonly DS: DataStoreService) {
|
||||
this._id = UpdateSlot.ID_COUTNER++;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds changed model information
|
||||
*
|
||||
* @param collection The collection
|
||||
* @param id The id
|
||||
*/
|
||||
public addChangedModel(collection: string, id: number): void {
|
||||
if (!this.changedModels[collection]) {
|
||||
this.changedModels[collection] = [];
|
||||
}
|
||||
this.changedModels[collection].push(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds deleted model information
|
||||
*
|
||||
* @param collection The collection
|
||||
* @param id The id
|
||||
*/
|
||||
public addDeletedModel(collection: string, id: number): void {
|
||||
if (!this.deletedModels[collection]) {
|
||||
this.deletedModels[collection] = [];
|
||||
}
|
||||
this.deletedModels[collection].push(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param collection The collection
|
||||
* @returns the list of changed model ids for the collection
|
||||
*/
|
||||
public getChangedModelIdsForCollection(collection: string): number[] {
|
||||
return this.changedModels[collection] || [];
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns the mapping of all changed models
|
||||
*/
|
||||
public getChangedModels(): CollectionIds {
|
||||
return this.changedModels;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param collection The collection
|
||||
* @returns the list of deleted model ids for the collection
|
||||
*/
|
||||
public getDeletedModelIdsForCollection(collection: string): number[] {
|
||||
return this.deletedModels[collection] || [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Compares this object to another update slot.
|
||||
*/
|
||||
public equal(other: UpdateSlot): boolean {
|
||||
return this._id === other._id;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* represents a collection on the Django server, uses an ID to access a {@link BaseModel}.
|
||||
*
|
||||
@ -49,6 +140,91 @@ interface JsonStorage {
|
||||
[collectionString: string]: JsonCollection;
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: Avoid circular dependencies between `DataStoreUpdateManagerService` and `DataStoreService` and split them into two files
|
||||
*/
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class DataStoreUpdateManagerService {
|
||||
/**
|
||||
* The current update slot
|
||||
*/
|
||||
private currentUpdateSlot: UpdateSlot | null = null;
|
||||
|
||||
/**
|
||||
* Requests for getting an update slot.
|
||||
*/
|
||||
private updateSlotRequests: Deferred[] = [];
|
||||
|
||||
/**
|
||||
* @param mapperService
|
||||
*/
|
||||
public constructor(private mapperService: CollectionStringMapperService) {}
|
||||
|
||||
/**
|
||||
* Retrieve the current update slot.
|
||||
*/
|
||||
public getCurrentUpdateSlot(): UpdateSlot | null {
|
||||
return this.currentUpdateSlot;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a new update slot. Returns a promise that must be awaited, if there is another
|
||||
* update in progress.
|
||||
*
|
||||
* @param DS The DataStore. This is a hack, becuase we cannot use the DataStore
|
||||
* here, because these are cyclic dependencies... --> TODO
|
||||
*/
|
||||
public async getNewUpdateSlot(DS: DataStoreService): Promise<UpdateSlot> {
|
||||
if (this.currentUpdateSlot) {
|
||||
const request = new Deferred();
|
||||
this.updateSlotRequests.push(request);
|
||||
await request;
|
||||
}
|
||||
this.currentUpdateSlot = new UpdateSlot(DS);
|
||||
return this.currentUpdateSlot;
|
||||
}
|
||||
|
||||
/**
|
||||
* Commits the given update slot. THis slot must be the current one. If there are requests
|
||||
* for update slots queued, the next one will be served.
|
||||
*
|
||||
* Note: I added this param to make sure, that only the user of the slot
|
||||
* can commit the update and no one else.
|
||||
*
|
||||
* @param slot The slot to commit
|
||||
*/
|
||||
public commit(slot: UpdateSlot): void {
|
||||
if (!this.currentUpdateSlot || !this.currentUpdateSlot.equal(slot)) {
|
||||
throw new Error('No or wrong update slot to be finished!');
|
||||
}
|
||||
this.currentUpdateSlot = null;
|
||||
|
||||
// notify repositories in two phases
|
||||
const repositories = this.mapperService.getAllRepositories();
|
||||
|
||||
// Phase 1: deleting and creating of view models (in this order)
|
||||
repositories.forEach(repo => {
|
||||
repo.deleteModels(slot.getDeletedModelIdsForCollection(repo.collectionString));
|
||||
repo.changedModels(slot.getChangedModelIdsForCollection(repo.collectionString));
|
||||
});
|
||||
|
||||
// Phase 2: updating dependencies
|
||||
repositories.forEach(repo => {
|
||||
repo.updateDependencies(slot.getChangedModels());
|
||||
});
|
||||
|
||||
slot.DS.triggerModifiedObservable();
|
||||
|
||||
// serve next slot request
|
||||
if (this.updateSlotRequests.length > 0) {
|
||||
const request = this.updateSlotRequests.pop();
|
||||
request.resolve();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* All mighty DataStore that comes with all OpenSlides components.
|
||||
* Use this.DS in an OpenSlides Component to Access the store.
|
||||
|
@ -4,7 +4,6 @@ import { LocalStorage } from '@ngx-pwa/local-storage';
|
||||
import { Observable } from 'rxjs';
|
||||
|
||||
import { OpenSlidesStatusService } from './openslides-status.service';
|
||||
import { StoragelockService } from '../local-storage/storagelock.service';
|
||||
|
||||
/**
|
||||
* Provides an async API to an key-value store using ngx-pwa which is internally
|
||||
@ -18,11 +17,7 @@ export class StorageService {
|
||||
* Constructor to create the StorageService. Needs the localStorage service.
|
||||
* @param localStorage
|
||||
*/
|
||||
public constructor(
|
||||
private localStorage: LocalStorage,
|
||||
private OSStatus: OpenSlidesStatusService,
|
||||
private lock: StoragelockService
|
||||
) {}
|
||||
public constructor(private localStorage: LocalStorage, private OSStatus: OpenSlidesStatusService) {}
|
||||
|
||||
/**
|
||||
* Sets the item into the store asynchronously.
|
||||
@ -30,8 +25,6 @@ export class StorageService {
|
||||
* @param item
|
||||
*/
|
||||
public async set(key: string, item: any): Promise<void> {
|
||||
await this.lock.promise;
|
||||
|
||||
this.assertNotHistoryMode();
|
||||
if (item === null || item === undefined) {
|
||||
await this.remove(key); // You cannot do a setItem with null or undefined...
|
||||
@ -49,8 +42,6 @@ export class StorageService {
|
||||
* @returns The requested value to the key
|
||||
*/
|
||||
public async get<T>(key: string): Promise<T> {
|
||||
await this.lock.promise;
|
||||
|
||||
return ((await this.localStorage.getItem<T>(key)) as Observable<T>).toPromise();
|
||||
}
|
||||
|
||||
@ -59,8 +50,6 @@ export class StorageService {
|
||||
* @param key The key to remove the value from
|
||||
*/
|
||||
public async remove(key: string): Promise<void> {
|
||||
await this.lock.promise;
|
||||
|
||||
this.assertNotHistoryMode();
|
||||
if (!(await this.localStorage.removeItem(key).toPromise())) {
|
||||
throw new Error('Could not delete the item.');
|
||||
@ -71,8 +60,6 @@ export class StorageService {
|
||||
* Clear the whole cache
|
||||
*/
|
||||
public async clear(): Promise<void> {
|
||||
await this.lock.promise;
|
||||
|
||||
this.assertNotHistoryMode();
|
||||
if (!(await this.localStorage.clear().toPromise())) {
|
||||
throw new Error('Could not clear the storage.');
|
||||
|
@ -3,13 +3,12 @@ import { Injectable } from '@angular/core';
|
||||
import { environment } from 'environments/environment';
|
||||
import { CollectionStringMapperService } from './collection-string-mapper.service';
|
||||
import { History } from 'app/shared/models/core/history';
|
||||
import { DataStoreService } from './data-store.service';
|
||||
import { DataStoreService, DataStoreUpdateManagerService } from './data-store.service';
|
||||
import { WebsocketService } from './websocket.service';
|
||||
import { BaseModel } from 'app/shared/models/base/base-model';
|
||||
import { OpenSlidesStatusService } from './openslides-status.service';
|
||||
import { OpenSlidesService } from './openslides.service';
|
||||
import { HttpService } from './http.service';
|
||||
import { DataStoreUpdateManagerService } from './data-store-update-manager.service';
|
||||
|
||||
/**
|
||||
* Interface for full history data objects.
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Injectable, NgZone, EventEmitter } from '@angular/core';
|
||||
import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material';
|
||||
import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material/snack-bar';
|
||||
import { Router } from '@angular/router';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
@ -1,9 +1,7 @@
|
||||
import { NgModule, Optional, SkipSelf, Type, PLATFORM_ID } from '@angular/core';
|
||||
import { NgModule, Optional, SkipSelf, Type } from '@angular/core';
|
||||
import { CommonModule } from '@angular/common';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
import { LocalDatabase, LOCAL_STORAGE_PREFIX } from '@ngx-pwa/local-storage';
|
||||
|
||||
// Shared Components
|
||||
import { PromptDialogComponent } from '../shared/components/prompt-dialog/prompt-dialog.component';
|
||||
import { ChoiceDialogComponent } from '../shared/components/choice-dialog/choice-dialog.component';
|
||||
@ -11,8 +9,6 @@ import { ProjectionDialogComponent } from 'app/shared/components/projection-dial
|
||||
|
||||
import { OperatorService } from './core-services/operator.service';
|
||||
import { OnAfterAppsLoaded } from './onAfterAppsLoaded';
|
||||
import { StoragelockService } from './local-storage/storagelock.service';
|
||||
import { customLocalDatabaseFactory } from './local-storage/custom-indexeddb-database';
|
||||
|
||||
export const ServicesToLoadOnAppsLoaded: Type<OnAfterAppsLoaded>[] = [OperatorService];
|
||||
|
||||
@ -21,15 +17,7 @@ export const ServicesToLoadOnAppsLoaded: Type<OnAfterAppsLoaded>[] = [OperatorSe
|
||||
*/
|
||||
@NgModule({
|
||||
imports: [CommonModule],
|
||||
providers: [
|
||||
Title,
|
||||
// Use our own localStorage wrapper.
|
||||
{
|
||||
provide: LocalDatabase,
|
||||
useFactory: customLocalDatabaseFactory,
|
||||
deps: [PLATFORM_ID, StoragelockService, [new Optional(), LOCAL_STORAGE_PREFIX]]
|
||||
}
|
||||
],
|
||||
providers: [Title],
|
||||
entryComponents: [PromptDialogComponent, ChoiceDialogComponent, ProjectionDialogComponent]
|
||||
})
|
||||
export class CoreModule {
|
||||
|
@ -1,108 +0,0 @@
|
||||
import { Optional, Inject, Injectable } from '@angular/core';
|
||||
import { isPlatformBrowser } from '@angular/common';
|
||||
|
||||
import {
|
||||
IndexedDBDatabase,
|
||||
LOCAL_STORAGE_PREFIX,
|
||||
LocalStorageDatabase,
|
||||
MockLocalDatabase,
|
||||
LocalDatabase
|
||||
} from '@ngx-pwa/local-storage';
|
||||
import { fromEvent, race, Observable } from 'rxjs';
|
||||
import { first } from 'rxjs/operators';
|
||||
|
||||
import { StoragelockService } from './storagelock.service';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class CustomIndexedDBDatabase extends IndexedDBDatabase {
|
||||
public constructor(
|
||||
private storageLock: StoragelockService,
|
||||
@Optional() @Inject(LOCAL_STORAGE_PREFIX) protected prefix: string | null = null
|
||||
) {
|
||||
super(prefix);
|
||||
}
|
||||
|
||||
/**
|
||||
* Connects to IndexedDB and creates the object store on first time
|
||||
*/
|
||||
protected connect(prefix: string | null = null): void {
|
||||
let request: IDBOpenDBRequest;
|
||||
|
||||
// Connecting to IndexedDB
|
||||
try {
|
||||
request = indexedDB.open(this.dbName);
|
||||
} catch (error) {
|
||||
// Fallback storage if IndexedDb connection is failing
|
||||
this.setFallback(prefix);
|
||||
return;
|
||||
}
|
||||
|
||||
// Listening the event fired on first connection, creating the object store for local storage
|
||||
(fromEvent(request, 'upgradeneeded') as Observable<Event>).pipe(first()).subscribe(event => {
|
||||
// Getting the database connection
|
||||
const database = (event.target as IDBRequest).result as IDBDatabase;
|
||||
|
||||
// Checking if the object store already exists, to avoid error
|
||||
if (!database.objectStoreNames.contains(this.objectStoreName)) {
|
||||
// Creating the object store for local storage
|
||||
database.createObjectStore(this.objectStoreName);
|
||||
}
|
||||
});
|
||||
|
||||
// Listening the success event and converting to an RxJS Observable
|
||||
const success = fromEvent(request, 'success') as Observable<Event>;
|
||||
|
||||
// Merging success and errors events
|
||||
(race(success, this.toErrorObservable(request, `connection`)) as Observable<Event>).pipe(first()).subscribe(
|
||||
event => {
|
||||
const db = (event.target as IDBRequest).result as IDBDatabase;
|
||||
|
||||
// CUSTOM: If the indexedDB initialization fails, because 'upgradeneeded' didn't fired
|
||||
// the fallback will be used.
|
||||
if (!db.objectStoreNames.contains(this.objectStoreName)) {
|
||||
this.setFallback(prefix);
|
||||
} else {
|
||||
// Storing the database connection for further access
|
||||
this.database.next(db);
|
||||
this.storageLock.OK(true);
|
||||
}
|
||||
},
|
||||
() => {
|
||||
// Fallback storage if IndexedDb connection is failing
|
||||
this.setFallback(prefix);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
// CUSTOM: If the fallback is used, unlock the storage service
|
||||
public setFallback(prefix: string): void {
|
||||
console.log('uses localStorage as IndexedDB fallback!');
|
||||
super.setFallback(prefix);
|
||||
this.storageLock.OK(false);
|
||||
}
|
||||
}
|
||||
|
||||
export function customLocalDatabaseFactory(
|
||||
platformId: Object,
|
||||
storagelock: StoragelockService,
|
||||
prefix: string | null
|
||||
): LocalDatabase {
|
||||
if (isPlatformBrowser(platformId) && 'indexedDB' in window && indexedDB !== undefined && indexedDB !== null) {
|
||||
// Try with IndexedDB in modern browsers
|
||||
// CUSTOM: Use our own IndexedDB implementation
|
||||
return new CustomIndexedDBDatabase(storagelock, prefix);
|
||||
} else if (
|
||||
isPlatformBrowser(platformId) &&
|
||||
'localStorage' in window &&
|
||||
localStorage !== undefined &&
|
||||
localStorage !== null
|
||||
) {
|
||||
// Try with localStorage in old browsers (IE9)
|
||||
return new LocalStorageDatabase(prefix);
|
||||
} else {
|
||||
// Fake database for server-side rendering (Universal)
|
||||
return new MockLocalDatabase();
|
||||
}
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
|
||||
/**
|
||||
* Provides a storage lock for waiting to database to be initialized.
|
||||
*/
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class StoragelockService {
|
||||
private lock: Promise<void>;
|
||||
private resolve: () => void;
|
||||
private _indexedDBUsed = false;
|
||||
|
||||
public get promise(): Promise<void> {
|
||||
return this.lock;
|
||||
}
|
||||
|
||||
public get indexedDBUsed(): boolean {
|
||||
return this._indexedDBUsed;
|
||||
}
|
||||
|
||||
public constructor() {
|
||||
this.lock = new Promise<void>(resolve => (this.resolve = resolve));
|
||||
}
|
||||
|
||||
public OK(indexedDBUsed: boolean): void {
|
||||
this._indexedDBUsed = indexedDBUsed;
|
||||
this.resolve();
|
||||
}
|
||||
}
|
@ -6,12 +6,11 @@ import { BaseViewModel, TitleInformation } from '../../site/base/base-view-model
|
||||
import { BaseModel, ModelConstructor } from '../../shared/models/base/base-model';
|
||||
import { CollectionStringMapperService } from '../core-services/collection-string-mapper.service';
|
||||
import { DataSendService } from '../core-services/data-send.service';
|
||||
import { DataStoreService } from '../core-services/data-store.service';
|
||||
import { DataStoreService, CollectionIds } from '../core-services/data-store.service';
|
||||
import { Identifiable } from '../../shared/models/base/identifiable';
|
||||
import { ViewModelStoreService } from '../core-services/view-model-store.service';
|
||||
import { OnAfterAppsLoaded } from '../onAfterAppsLoaded';
|
||||
import { Collection } from 'app/shared/models/base/collection';
|
||||
import { CollectionIds } from '../core-services/data-store-update-manager.service';
|
||||
|
||||
export abstract class BaseRepository<V extends BaseViewModel & T, M extends BaseModel, T extends TitleInformation>
|
||||
implements OnAfterAppsLoaded, Collection {
|
||||
|
@ -10,7 +10,7 @@ import { ChangeRecoMode, ViewMotion, MotionTitleInformation } from 'app/site/mot
|
||||
import { CollectionStringMapperService } from '../../core-services/collection-string-mapper.service';
|
||||
import { ConfigService } from 'app/core/ui-services/config.service';
|
||||
import { DataSendService } from '../../core-services/data-send.service';
|
||||
import { DataStoreService } from '../../core-services/data-store.service';
|
||||
import { DataStoreService, CollectionIds } from '../../core-services/data-store.service';
|
||||
import { DiffLinesInParagraph, DiffService, LineRange, ModificationType } from '../../ui-services/diff.service';
|
||||
import { HttpService } from 'app/core/core-services/http.service';
|
||||
import { LinenumberingService, LineNumberRange } from '../../ui-services/linenumbering.service';
|
||||
@ -38,7 +38,6 @@ import { ViewMediafile } from 'app/site/mediafiles/models/view-mediafile';
|
||||
import { ViewTag } from 'app/site/tags/models/view-tag';
|
||||
import { ViewPersonalNote } from 'app/site/users/models/view-personal-note';
|
||||
import { OperatorService } from 'app/core/core-services/operator.service';
|
||||
import { CollectionIds } from 'app/core/core-services/data-store-update-manager.service';
|
||||
import { PersonalNote, PersonalNoteContent } from 'app/shared/models/users/personal-note';
|
||||
import { ViewListOfSpeakers } from 'app/site/agenda/models/view-list-of-speakers';
|
||||
import { BaseIsAgendaItemAndListOfSpeakersContentObjectRepository } from '../base-is-agenda-item-and-list-of-speakers-content-object-repository';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
import { Injectable, EventEmitter } from '@angular/core';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Papa, PapaParseConfig } from 'ngx-papaparse';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { MatDialog } from '@angular/material';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
|
||||
import {
|
||||
ChoiceDialogComponent,
|
||||
|
@ -4,7 +4,6 @@ import { Observable, Subject } from 'rxjs';
|
||||
|
||||
import { NotifyService } from '../core-services/notify.service';
|
||||
import { OperatorService } from '../core-services/operator.service';
|
||||
import { StoragelockService } from '../local-storage/storagelock.service';
|
||||
|
||||
interface CountUserRequest {
|
||||
token: string;
|
||||
@ -41,11 +40,7 @@ export class CountUsersService {
|
||||
* @param notifyService
|
||||
* @param operator
|
||||
*/
|
||||
public constructor(
|
||||
private notifyService: NotifyService,
|
||||
operator: OperatorService,
|
||||
storageLockService: StoragelockService
|
||||
) {
|
||||
public constructor(private notifyService: NotifyService, operator: OperatorService) {
|
||||
// Listen for requests to send an answer.
|
||||
this.notifyService.getMessageObservable<CountUserRequest>(REQUEST_NAME).subscribe(request => {
|
||||
if (request.content.token) {
|
||||
@ -55,7 +50,7 @@ export class CountUsersService {
|
||||
token: request.content.token,
|
||||
data: {
|
||||
userId: this.currentUserId,
|
||||
usesIndexedDB: storageLockService.indexedDBUsed
|
||||
usesIndexedDB: true
|
||||
}
|
||||
},
|
||||
request.senderChannelName
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { MatDialog } from '@angular/material';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
|
||||
import { Projectable, ProjectorElementBuildDeskriptor, isProjectable } from 'app/site/base/projectable';
|
||||
import {
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { PromptDialogComponent } from '../../shared/components/prompt-dialog/prompt-dialog.component';
|
||||
import { MatDialog } from '@angular/material';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
|
||||
/**
|
||||
* A general service for prompting 'yes' or 'cancel' thinks from the user.
|
||||
|
@ -56,7 +56,7 @@ export class FullscreenProjectorComponent implements OnInit {
|
||||
/**
|
||||
* The container to get the window size.
|
||||
*/
|
||||
@ViewChild('container')
|
||||
@ViewChild('container', { static: true })
|
||||
private containerElement: ElementRef;
|
||||
|
||||
/**
|
||||
|
@ -48,19 +48,19 @@ export class BlockTileComponent extends TileComponent {
|
||||
/**
|
||||
* Reference to the content of the content part.
|
||||
*/
|
||||
@ContentChild(TemplateRef)
|
||||
@ContentChild(TemplateRef, { static: true })
|
||||
public contentNode: TemplateRef<any>;
|
||||
|
||||
/**
|
||||
* Reference to the block part, if it is a node.
|
||||
*/
|
||||
@ContentChild(TemplateRef)
|
||||
@ContentChild(TemplateRef, { static: true })
|
||||
public blockNode: TemplateRef<any>;
|
||||
|
||||
/**
|
||||
* Reference to the action buttons in the content part, if used.
|
||||
*/
|
||||
@ContentChild(TemplateRef)
|
||||
@ContentChild(TemplateRef, { static: true })
|
||||
public actionNode: TemplateRef<any>;
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Component, Inject, ViewEncapsulation } from '@angular/core';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||
|
||||
import { Displayable } from 'app/site/base/displayable';
|
||||
import { Identifiable } from 'app/shared/models/base/identifiable';
|
||||
|
@ -3,7 +3,7 @@
|
||||
*/
|
||||
|
||||
import { Component, OnInit, OnDestroy } from '@angular/core';
|
||||
import { MatDialogRef, MatDialog } from '@angular/material';
|
||||
import { MatDialogRef, MatDialog } from '@angular/material/dialog';
|
||||
import { OperatorService } from 'app/core/core-services/operator.service';
|
||||
import { NotifyService, NotifyResponse } from 'app/core/core-services/notify.service';
|
||||
import { Subscription } from 'rxjs';
|
||||
|
@ -83,7 +83,7 @@ export class ListViewTableComponent<V extends BaseViewModel, M extends BaseModel
|
||||
/**
|
||||
* Declare the table
|
||||
*/
|
||||
@ViewChild(PblNgridComponent)
|
||||
@ViewChild(PblNgridComponent, { static: false })
|
||||
private ngrid: PblNgridComponent;
|
||||
|
||||
/**
|
||||
|
@ -2,14 +2,14 @@
|
||||
<input hidden type="file" #fileInput (change)="onSelectFile($event)" multiple />
|
||||
|
||||
<div class="selection-area">
|
||||
<file-drop
|
||||
<ngx-file-drop
|
||||
(onFileDrop)="onDropFile($event)"
|
||||
(click)="fileInput.click()"
|
||||
dropZoneLabel="{{ 'Drop files into this area OR click here to select files' | translate }}"
|
||||
contentClassName="file-drop-content-style"
|
||||
dropZoneClassName="file-drop-zone-style"
|
||||
>
|
||||
</file-drop>
|
||||
</ngx-file-drop>
|
||||
</div>
|
||||
|
||||
<div class="table-container" *ngIf="uploadList.data.length > 0">
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Component, OnInit, ViewChild, Input, Output, EventEmitter } from '@angular/core';
|
||||
import { MatTableDataSource, MatTable } from '@angular/material';
|
||||
import { MatTableDataSource, MatTable } from '@angular/material/table';
|
||||
|
||||
import { UploadEvent, FileSystemFileEntry } from 'ngx-file-drop';
|
||||
import { FileSystemFileEntry, NgxFileDropEntry } from 'ngx-file-drop';
|
||||
|
||||
import { OperatorService } from 'app/core/core-services/operator.service';
|
||||
import { MediafileRepositoryService } from 'app/core/repositories/mediafiles/mediafile-repository.service';
|
||||
@ -58,7 +58,7 @@ export class MediaUploadContentComponent implements OnInit {
|
||||
/**
|
||||
* Hold the mat table to manually render new rows
|
||||
*/
|
||||
@ViewChild(MatTable)
|
||||
@ViewChild(MatTable, { static: false })
|
||||
public table: MatTable<any>;
|
||||
|
||||
/**
|
||||
@ -186,8 +186,8 @@ export class MediaUploadContentComponent implements OnInit {
|
||||
*
|
||||
* @param event holds the file. Triggered by dropping in the area
|
||||
*/
|
||||
public onDropFile(event: UploadEvent): void {
|
||||
for (const droppedFile of event.files) {
|
||||
public onDropFile(event: NgxFileDropEntry[]): void {
|
||||
for (const droppedFile of event) {
|
||||
// Check if the dropped element is a file. "Else" would be a dir.
|
||||
if (droppedFile.fileEntry.isFile) {
|
||||
const fileEntry = droppedFile.fileEntry as FileSystemFileEntry;
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Component, Inject } from '@angular/core';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||
|
||||
import { ProjectorElementBuildDeskriptor } from 'app/site/base/projectable';
|
||||
import { DataStoreService } from 'app/core/core-services/data-store.service';
|
||||
|
@ -81,7 +81,7 @@ export class ProjectorComponent extends BaseComponent implements OnDestroy {
|
||||
* The container element. THis is neede to get the size of the element,
|
||||
* in which the projector must fit and be scaled to.
|
||||
*/
|
||||
@ViewChild('container')
|
||||
@ViewChild('container', { static: true })
|
||||
private containerElement: ElementRef;
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Component, Inject } from '@angular/core';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||
|
||||
interface PromptDialogData {
|
||||
title: string;
|
||||
|
@ -14,7 +14,7 @@ describe('SearchValueSelectorComponent', () => {
|
||||
template: '<os-search-value-selector></os-search-value-selector>'
|
||||
})
|
||||
class TestHostComponent {
|
||||
@ViewChild(SearchValueSelectorComponent)
|
||||
@ViewChild(SearchValueSelectorComponent, { static: true })
|
||||
public searchValueSelectorComponent: SearchValueSelectorComponent;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Component, OnInit, Input, ViewChild, OnDestroy } from '@angular/core';
|
||||
import { FormControl, FormGroup } from '@angular/forms';
|
||||
import { MatSelect } from '@angular/material';
|
||||
import { MatSelect } from '@angular/material/select';
|
||||
|
||||
import { Subject, ReplaySubject, BehaviorSubject, Subscription } from 'rxjs';
|
||||
import { takeUntil } from 'rxjs/operators';
|
||||
@ -122,7 +122,7 @@ export class SearchValueSelectorComponent implements OnInit, OnDestroy {
|
||||
/**
|
||||
* The MultiSelect Component
|
||||
*/
|
||||
@ViewChild('thisSelector')
|
||||
@ViewChild('thisSelector', { static: true })
|
||||
public thisSelector: MatSelect;
|
||||
|
||||
/**
|
||||
|
@ -25,7 +25,7 @@ function hasError(obj: object): obj is { error: string } {
|
||||
export class SlideContainerComponent extends BaseComponent {
|
||||
private previousSlideName: string;
|
||||
|
||||
@ViewChild('slide', { read: ViewContainerRef })
|
||||
@ViewChild('slide', { read: ViewContainerRef, static: true })
|
||||
private slide: ViewContainerRef;
|
||||
private slideRef: ComponentRef<BaseSlideComponent<object>>;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Inject, Component, OnInit } from '@angular/core';
|
||||
import { MatBottomSheetRef, MAT_BOTTOM_SHEET_DATA } from '@angular/material';
|
||||
import { MatBottomSheetRef, MAT_BOTTOM_SHEET_DATA } from '@angular/material/bottom-sheet';
|
||||
|
||||
import { BaseSortListService } from 'app/core/ui-services/base-sort-list.service';
|
||||
import { BaseViewModel } from 'app/site/base/base-view-model';
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Input, Output, Component, ViewChild, EventEmitter, ViewEncapsulation } from '@angular/core';
|
||||
import { MatBottomSheet } from '@angular/material';
|
||||
import { MatBottomSheet } from '@angular/material/bottom-sheet';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
@ -69,13 +69,13 @@ export class SortFilterBarComponent<V extends BaseViewModel> {
|
||||
/**
|
||||
* The filter side drawer
|
||||
*/
|
||||
@ViewChild('filterMenu')
|
||||
@ViewChild('filterMenu', { static: true })
|
||||
public filterMenu: FilterMenuComponent;
|
||||
|
||||
/**
|
||||
* The bottom sheet used to alter sorting in mobile view
|
||||
*/
|
||||
@ViewChild('sortBottomSheet')
|
||||
@ViewChild('sortBottomSheet', { static: false })
|
||||
public sortBottomSheet: SortBottomSheetComponent<V>;
|
||||
|
||||
/**
|
||||
|
@ -11,7 +11,7 @@ describe('SortingListComponent', () => {
|
||||
template: '<os-sorting-list><os-sorting-list>'
|
||||
})
|
||||
class TestHostComponent {
|
||||
@ViewChild(SortingListComponent)
|
||||
@ViewChild(SortingListComponent, { static: true })
|
||||
public sortingListCompononent: SortingListComponent;
|
||||
}
|
||||
|
||||
|
@ -45,7 +45,7 @@ export class SortingListComponent implements OnInit, OnDestroy {
|
||||
/**
|
||||
* Declare the templateRef to coexist between parent in child
|
||||
*/
|
||||
@ContentChild(TemplateRef)
|
||||
@ContentChild(TemplateRef, { static: true })
|
||||
public templateRef: TemplateRef<Selectable>;
|
||||
|
||||
/**
|
||||
|
@ -28,7 +28,7 @@ describe('SortingTreeComponent', () => {
|
||||
template: '<os-sorting-tree><os-sorting-tree>'
|
||||
})
|
||||
class TestHostComponent {
|
||||
@ViewChild(SortingTreeComponent)
|
||||
@ViewChild(SortingTreeComponent, { static: true })
|
||||
public sortingTreeCompononent: SortingTreeComponent<TestModel>;
|
||||
}
|
||||
|
||||
|
@ -56,7 +56,7 @@ export class SortingTreeComponent<T extends Identifiable & Displayable> implemen
|
||||
/**
|
||||
* Declare the templateRef to coexist between parent in child
|
||||
*/
|
||||
@ContentChild(TemplateRef)
|
||||
@ContentChild(TemplateRef, { static: true })
|
||||
public templateRef: TemplateRef<T>;
|
||||
|
||||
/**
|
||||
@ -190,7 +190,7 @@ export class SortingTreeComponent<T extends Identifiable & Displayable> implemen
|
||||
/**
|
||||
* Reference to the template content.
|
||||
*/
|
||||
@ContentChild(TemplateRef)
|
||||
@ContentChild(TemplateRef, { static: true })
|
||||
public innerNode: TemplateRef<any>;
|
||||
|
||||
/**
|
||||
|
@ -49,7 +49,7 @@ export class TileComponent implements OnInit {
|
||||
/**
|
||||
* Reference to the dynamic content.
|
||||
*/
|
||||
@ContentChild(TemplateRef)
|
||||
@ContentChild(TemplateRef, { static: true })
|
||||
public tileContext: TemplateRef<any>;
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { NativeDateAdapter } from '@angular/material';
|
||||
import { NativeDateAdapter } from '@angular/material/core';
|
||||
|
||||
/**
|
||||
* A custom DateAdapter for the datetimepicker in the config. This is still not fully working and needs to be done later.
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { ErrorStateMatcher } from '@angular/material';
|
||||
import { ErrorStateMatcher } from '@angular/material/core';
|
||||
import { FormControl, FormGroupDirective, NgForm } from '@angular/forms';
|
||||
|
||||
/**
|
||||
|
@ -2,38 +2,34 @@ import { NgModule } from '@angular/core';
|
||||
import { RouterModule } from '@angular/router';
|
||||
import { CommonModule, DecimalPipe } from '@angular/common';
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
|
||||
import { OwlDateTimeModule, OwlNativeDateTimeModule } from 'ng-pick-datetime';
|
||||
|
||||
// MaterialUI modules
|
||||
import {
|
||||
MatButtonModule,
|
||||
MatCheckboxModule,
|
||||
MatToolbarModule,
|
||||
MatCardModule,
|
||||
MatInputModule,
|
||||
MatProgressBarModule,
|
||||
MatProgressSpinnerModule,
|
||||
MatSidenavModule,
|
||||
MatSnackBarModule,
|
||||
MatTableModule,
|
||||
MatPaginatorModule,
|
||||
MatSortModule,
|
||||
MatTooltipModule,
|
||||
MatDatepickerModule,
|
||||
MatNativeDateModule,
|
||||
DateAdapter,
|
||||
MatIconModule,
|
||||
MatButtonToggleModule,
|
||||
MatBadgeModule,
|
||||
MatStepperModule,
|
||||
MatTabsModule,
|
||||
MatBottomSheetModule,
|
||||
MatSliderModule,
|
||||
MatDividerModule
|
||||
} from '@angular/material';
|
||||
import { MatBadgeModule } from '@angular/material/badge';
|
||||
import { MatBottomSheetModule } from '@angular/material/bottom-sheet';
|
||||
import { MatButtonModule } from '@angular/material/button';
|
||||
import { MatButtonToggleModule } from '@angular/material/button-toggle';
|
||||
import { MatCardModule } from '@angular/material/card';
|
||||
import { MatCheckboxModule } from '@angular/material/checkbox';
|
||||
import { MatNativeDateModule, DateAdapter } from '@angular/material/core';
|
||||
import { MatDatepickerModule } from '@angular/material/datepicker';
|
||||
import { MatDividerModule } from '@angular/material/divider';
|
||||
import { MatIconModule } from '@angular/material/icon';
|
||||
import { MatInputModule } from '@angular/material/input';
|
||||
import { MatPaginatorModule } from '@angular/material/paginator';
|
||||
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
||||
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
||||
import { MatSidenavModule } from '@angular/material/sidenav';
|
||||
import { MatSliderModule } from '@angular/material/slider';
|
||||
import { MatSnackBarModule } from '@angular/material/snack-bar';
|
||||
import { MatSortModule } from '@angular/material/sort';
|
||||
import { MatStepperModule } from '@angular/material/stepper';
|
||||
import { MatTableModule } from '@angular/material/table';
|
||||
import { MatTabsModule } from '@angular/material/tabs';
|
||||
import { MatToolbarModule } from '@angular/material/toolbar';
|
||||
import { MatTooltipModule } from '@angular/material/tooltip';
|
||||
import { MatAutocompleteModule } from '@angular/material/autocomplete';
|
||||
import { MatChipsModule } from '@angular/material';
|
||||
import { MatRadioModule } from '@angular/material';
|
||||
import { MatChipsModule } from '@angular/material/chips';
|
||||
import { MatRadioModule } from '@angular/material/radio';
|
||||
import { NgxMatSelectSearchModule } from 'ngx-mat-select-search';
|
||||
import { MatDialogModule } from '@angular/material/dialog';
|
||||
import { MatListModule } from '@angular/material/list';
|
||||
@ -49,7 +45,7 @@ import { ScrollingModule } from '@angular/cdk/scrolling';
|
||||
import { TranslateModule } from '@ngx-translate/core';
|
||||
|
||||
// ngx-file-drop
|
||||
import { FileDropModule } from 'ngx-file-drop';
|
||||
import { NgxFileDropModule } from 'ngx-file-drop';
|
||||
|
||||
// TinyMCE
|
||||
import { EditorModule } from '@tinymce/tinymce-angular';
|
||||
@ -145,13 +141,11 @@ import { AgendaContentObjectFormComponent } from './components/agenda-content-ob
|
||||
MatTabsModule,
|
||||
MatSliderModule,
|
||||
MatDividerModule,
|
||||
OwlDateTimeModule,
|
||||
OwlNativeDateTimeModule,
|
||||
DragDropModule,
|
||||
OpenSlidesTranslateModule.forChild(),
|
||||
RouterModule,
|
||||
NgxMatSelectSearchModule,
|
||||
FileDropModule,
|
||||
NgxFileDropModule,
|
||||
EditorModule,
|
||||
CdkTreeModule,
|
||||
ScrollingModule,
|
||||
@ -193,7 +187,7 @@ import { AgendaContentObjectFormComponent } from './components/agenda-content-ob
|
||||
MatDividerModule,
|
||||
DragDropModule,
|
||||
NgxMatSelectSearchModule,
|
||||
FileDropModule,
|
||||
NgxFileDropModule,
|
||||
TranslateModule,
|
||||
OpenSlidesTranslateModule,
|
||||
PermsDirective,
|
||||
@ -217,8 +211,6 @@ import { AgendaContentObjectFormComponent } from './components/agenda-content-ob
|
||||
MetaTextBlockComponent,
|
||||
ProjectorComponent,
|
||||
SlideContainerComponent,
|
||||
OwlDateTimeModule,
|
||||
OwlNativeDateTimeModule,
|
||||
CountdownTimeComponent,
|
||||
MediaUploadContentComponent,
|
||||
PrecisionPipe,
|
||||
@ -278,6 +270,12 @@ import { AgendaContentObjectFormComponent } from './components/agenda-content-ob
|
||||
SortBottomSheetComponent,
|
||||
DecimalPipe
|
||||
],
|
||||
entryComponents: [SortBottomSheetComponent, C4DialogComponent]
|
||||
entryComponents: [
|
||||
SortBottomSheetComponent,
|
||||
C4DialogComponent,
|
||||
PromptDialogComponent,
|
||||
ChoiceDialogComponent,
|
||||
ProjectionDialogComponent
|
||||
]
|
||||
})
|
||||
export class SharedModule {}
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { FormGroup, FormBuilder } from '@angular/forms';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { MatSnackBar, MatDialog } from '@angular/material';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Router } from '@angular/router';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Component, Inject } from '@angular/core';
|
||||
import { FormBuilder, FormGroup } from '@angular/forms';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||
|
||||
import { ViewItem } from '../../models/view-item';
|
||||
import { ItemVisibilityChoices } from 'app/shared/models/agenda/item';
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { FormGroup, FormControl } from '@angular/forms';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
@ -17,6 +17,9 @@ export interface ListOfSpeakersTitleInformation {
|
||||
title_information: object;
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO: Resolve potential circular dependencies with {@link BaseViewModelWithListOfSpeakers}.
|
||||
*/
|
||||
export class ViewListOfSpeakers extends BaseViewModelWithContentObject<ListOfSpeakers, BaseViewModelWithListOfSpeakers>
|
||||
implements ListOfSpeakersTitleInformation, Projectable {
|
||||
public static COLLECTIONSTRING = ListOfSpeakers.COLLECTIONSTRING;
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
import { Papa } from 'ngx-papaparse';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { FormBuilder, FormGroup } from '@angular/forms';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Router, ActivatedRoute } from '@angular/router';
|
||||
import { Title, DomSanitizer, SafeHtml } from '@angular/platform-browser';
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Router, ActivatedRoute } from '@angular/router';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { Component, Inject } from '@angular/core';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA, MatSnackBar } from '@angular/material';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
import { AssignmentPollOption } from 'app/shared/models/assignments/assignment-poll-option';
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { Component, OnInit, Input } from '@angular/core';
|
||||
import { FormGroup, FormBuilder } from '@angular/forms';
|
||||
import { MatDialog, MatSnackBar } from '@angular/material';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
@ -1,4 +1,6 @@
|
||||
import { MatTableDataSource, MatTable, MatSnackBar, MatSelectChange } from '@angular/material';
|
||||
import { MatSelectChange } from '@angular/material/select';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { MatTableDataSource, MatTable } from '@angular/material/table';
|
||||
import { ViewChild, OnInit } from '@angular/core';
|
||||
|
||||
import { BaseViewComponent } from './base-view';
|
||||
@ -44,7 +46,7 @@ export abstract class BaseImportListComponent<V extends BaseViewModel> extends B
|
||||
/**
|
||||
* The table itself
|
||||
*/
|
||||
@ViewChild(MatTable)
|
||||
@ViewChild(MatTable, { static: false })
|
||||
protected table: MatTable<NewEntry<V>>;
|
||||
|
||||
/**
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { OnDestroy } from '@angular/core';
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { BaseProjectableViewModel } from './base-projectable-view-model';
|
||||
import { SearchRepresentation } from 'app/core/ui-services/search.service';
|
||||
import { ViewItem } from '../agenda/models/view-item';
|
||||
import { isDetailNavigable, DetailNavigable } from 'app/shared/models/base/detail-navigable';
|
||||
import { isSearchable, Searchable } from './searchable';
|
||||
import { BaseModelWithAgendaItem } from 'app/shared/models/base/base-model-with-agenda-item';
|
||||
@ -32,7 +31,7 @@ export interface IBaseViewModelWithAgendaItem<M extends BaseModelWithAgendaItem
|
||||
extends BaseProjectableViewModel<M>,
|
||||
DetailNavigable,
|
||||
Searchable {
|
||||
agendaItem: ViewItem | null;
|
||||
agendaItem: any | null;
|
||||
|
||||
agenda_item_id: number;
|
||||
|
||||
@ -57,13 +56,15 @@ export interface IBaseViewModelWithAgendaItem<M extends BaseModelWithAgendaItem
|
||||
|
||||
/**
|
||||
* Base view model class for view models with an agenda item.
|
||||
*
|
||||
* TODO: Resolve circular dependencies with `ViewItem` to avoid `any`.
|
||||
*/
|
||||
export abstract class BaseViewModelWithAgendaItem<M extends BaseModelWithAgendaItem = any>
|
||||
extends BaseProjectableViewModel<M>
|
||||
implements IBaseViewModelWithAgendaItem<M> {
|
||||
protected _item?: ViewItem;
|
||||
protected _item?: any;
|
||||
|
||||
public get agendaItem(): ViewItem | null {
|
||||
public get agendaItem(): any | null {
|
||||
return this._item;
|
||||
}
|
||||
|
||||
@ -85,7 +86,7 @@ export abstract class BaseViewModelWithAgendaItem<M extends BaseModelWithAgendaI
|
||||
*/
|
||||
public getAgendaListTitle: () => string;
|
||||
|
||||
public constructor(collecitonString: string, model: M, item?: ViewItem) {
|
||||
public constructor(collecitonString: string, model: M, item?: any) {
|
||||
super(collecitonString, model);
|
||||
this._item = item || null; // Explicit set to null instead of undefined, if not given
|
||||
}
|
||||
@ -108,7 +109,7 @@ export abstract class BaseViewModelWithAgendaItem<M extends BaseModelWithAgendaI
|
||||
public updateDependencies(update: BaseViewModel): void {
|
||||
// We cannot check with instanceof, because this gives circular dependency issues...
|
||||
if (update.collectionString === Item.COLLECTIONSTRING && update.id === this.agenda_item_id) {
|
||||
this._item = update as ViewItem;
|
||||
this._item = update;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { BaseProjectableViewModel } from './base-projectable-view-model';
|
||||
import { isDetailNavigable, DetailNavigable } from 'app/shared/models/base/detail-navigable';
|
||||
import { ViewListOfSpeakers } from '../agenda/models/view-list-of-speakers';
|
||||
import { BaseModelWithListOfSpeakers } from 'app/shared/models/base/base-model-with-list-of-speakers';
|
||||
import { BaseViewModel } from './base-view-model';
|
||||
import { ListOfSpeakers } from 'app/shared/models/agenda/list-of-speakers';
|
||||
@ -22,7 +21,7 @@ export function isBaseViewModelWithListOfSpeakers(obj: any): obj is BaseViewMode
|
||||
export interface IBaseViewModelWithListOfSpeakers<M extends BaseModelWithListOfSpeakers = any>
|
||||
extends BaseProjectableViewModel<M>,
|
||||
DetailNavigable {
|
||||
listOfSpeakers: ViewListOfSpeakers | null;
|
||||
listOfSpeakers: any | null;
|
||||
|
||||
list_of_speakers_id: number;
|
||||
|
||||
@ -33,13 +32,15 @@ export interface IBaseViewModelWithListOfSpeakers<M extends BaseModelWithListOfS
|
||||
|
||||
/**
|
||||
* Base view model class for models with a list of speakers.
|
||||
*
|
||||
* TODO: Resolve circular dependencies with `ViewListOfSpeakers` to avoid `any`.
|
||||
*/
|
||||
export abstract class BaseViewModelWithListOfSpeakers<M extends BaseModelWithListOfSpeakers = any>
|
||||
extends BaseProjectableViewModel<M>
|
||||
implements IBaseViewModelWithListOfSpeakers<M> {
|
||||
protected _listOfSpeakers?: ViewListOfSpeakers;
|
||||
protected _listOfSpeakers?: any;
|
||||
|
||||
public get listOfSpeakers(): ViewListOfSpeakers | null {
|
||||
public get listOfSpeakers(): any | null {
|
||||
return this._listOfSpeakers;
|
||||
}
|
||||
|
||||
@ -50,7 +51,7 @@ export abstract class BaseViewModelWithListOfSpeakers<M extends BaseModelWithLis
|
||||
public getListOfSpeakersTitle: () => string;
|
||||
public getListOfSpeakersSlideTitle: () => string;
|
||||
|
||||
public constructor(collectionString: string, model: M, listOfSpeakers?: ViewListOfSpeakers) {
|
||||
public constructor(collectionString: string, model: M, listOfSpeakers?: any) {
|
||||
super(collectionString, model);
|
||||
this._listOfSpeakers = listOfSpeakers || null; // Explicit set to null instead of undefined, if not given
|
||||
}
|
||||
@ -60,7 +61,7 @@ export abstract class BaseViewModelWithListOfSpeakers<M extends BaseModelWithLis
|
||||
public updateDependencies(update: BaseViewModel): void {
|
||||
// We cannot check with instanceof, becuase this givec circular dependency issues...
|
||||
if (update.collectionString === ListOfSpeakers.COLLECTIONSTRING && update.id === this.list_of_speakers_id) {
|
||||
this._listOfSpeakers = update as ViewListOfSpeakers;
|
||||
this._listOfSpeakers = update;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { OnDestroy } from '@angular/core';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material';
|
||||
import { MatSnackBar, MatSnackBarRef, SimpleSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { ViewChild, EventEmitter } from '@angular/core';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
@ -25,7 +25,7 @@ export abstract class SortTreeViewComponent<V extends BaseViewModel> extends Bas
|
||||
/**
|
||||
* Reference to the view child
|
||||
*/
|
||||
@ViewChild('osSortedTree')
|
||||
@ViewChild('osSortedTree', { static: true })
|
||||
public osSortTree: SortingTreeComponent<V>;
|
||||
|
||||
/**
|
||||
|
@ -2,7 +2,7 @@ import { Component, OnInit } from '@angular/core';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { FormGroup, FormControl } from '@angular/forms';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
import { Subject } from 'rxjs';
|
||||
import { auditTime, debounceTime } from 'rxjs/operators';
|
||||
|
@ -74,12 +74,10 @@
|
||||
<!-- datetimepicker -->
|
||||
<div *ngIf="configItem.inputType === 'datetimepicker'">
|
||||
<input
|
||||
[owlDateTime]="dt1"
|
||||
[owlDateTimeTrigger]="dt1"
|
||||
(dateTimeChange)="updateTime($event)"
|
||||
matInput
|
||||
[value]="dateValue"
|
||||
/>
|
||||
<owl-date-time #dt1></owl-date-time>
|
||||
|
||||
<mat-label>{{ configItem.label | translate }}</mat-label>
|
||||
<mat-hint *ngIf="configItem.helpText">{{ configItem.helpText | translate }}</mat-hint>
|
||||
<span matSuffix>
|
||||
|
@ -3,7 +3,6 @@ import { FormGroup, FormBuilder } from '@angular/forms';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
import { distinctUntilChanged } from 'rxjs/operators';
|
||||
import { DateTimeAdapter } from 'ng-pick-datetime';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
import { BaseComponent } from 'app/base.component';
|
||||
@ -107,11 +106,9 @@ export class ConfigFieldComponent extends BaseComponent implements OnInit {
|
||||
protected translate: TranslateService,
|
||||
private formBuilder: FormBuilder,
|
||||
private cdRef: ChangeDetectorRef,
|
||||
public repo: ConfigRepositoryService,
|
||||
dateTimeAdapter: DateTimeAdapter<any>
|
||||
public repo: ConfigRepositoryService
|
||||
) {
|
||||
super(titleService, translate);
|
||||
dateTimeAdapter.setLocale(this.translate.currentLang);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { MatSnackBar, MatTableDataSource } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { MatTableDataSource } from '@angular/material/table';
|
||||
import { Router, ActivatedRoute } from '@angular/router';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
|
@ -2,7 +2,7 @@ import { async, ComponentFixture, TestBed, tick, fakeAsync, flush, flushMicrotas
|
||||
|
||||
import { ResetPasswordConfirmComponent } from './reset-password-confirm.component';
|
||||
import { E2EImportsModule } from 'e2e-imports.module';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
let matSnackBarSpy: jasmine.SpyObj<MatSnackBar>;
|
||||
|
||||
|
@ -2,7 +2,7 @@ import { Component, OnInit } from '@angular/core';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Router } from '@angular/router';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { Component, OnInit, ViewChild, TemplateRef } from '@angular/core';
|
||||
import { FormGroup, Validators, FormBuilder } from '@angular/forms';
|
||||
import { MatSnackBar, MatDialog } from '@angular/material';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Router, ActivatedRoute } from '@angular/router';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
@ -65,13 +66,13 @@ export class MediafileListComponent extends BaseListViewComponent<ViewMediafile>
|
||||
/**
|
||||
* The form to edit Files
|
||||
*/
|
||||
@ViewChild('fileEditForm')
|
||||
@ViewChild('fileEditForm', { static: true })
|
||||
public fileEditForm: FormGroup;
|
||||
|
||||
/**
|
||||
* Reference to the template
|
||||
*/
|
||||
@ViewChild('fileEditDialog')
|
||||
@ViewChild('fileEditDialog', { static: true })
|
||||
public fileEditDialog: TemplateRef<string>;
|
||||
|
||||
/**
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
import { Observable, BehaviorSubject } from 'rxjs';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Component, ViewChild } from '@angular/core';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { Observable } from 'rxjs';
|
||||
@ -24,7 +24,7 @@ export class CategoriesSortComponent extends BaseViewComponent implements CanCom
|
||||
/**
|
||||
* Reference to the sorting tree.
|
||||
*/
|
||||
@ViewChild('osSortedTree')
|
||||
@ViewChild('osSortedTree', { static: true })
|
||||
private osSortTree: SortingTreeComponent<ViewCategory>;
|
||||
|
||||
/**
|
||||
|
@ -1,7 +1,9 @@
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { Component, OnInit, ViewChild, TemplateRef } from '@angular/core';
|
||||
import { FormGroup, Validators, FormBuilder } from '@angular/forms';
|
||||
import { MatSnackBar, MatDialog, MatTableDataSource } from '@angular/material';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { MatTableDataSource } from '@angular/material/table';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
@ -41,13 +43,13 @@ export class CategoryDetailComponent extends BaseViewComponent implements OnInit
|
||||
/**
|
||||
* The form to edit the selected category
|
||||
*/
|
||||
@ViewChild('editForm')
|
||||
@ViewChild('editForm', { static: true })
|
||||
public editForm: FormGroup;
|
||||
|
||||
/**
|
||||
* Reference to the template for edit-dialog
|
||||
*/
|
||||
@ViewChild('editDialog')
|
||||
@ViewChild('editDialog', { static: true })
|
||||
private editDialog: TemplateRef<string>;
|
||||
|
||||
/**
|
||||
|
@ -1,7 +1,8 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { MatSnackBar, MatTableDataSource } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { MatTableDataSource } from '@angular/material/table';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
|
@ -8,7 +8,7 @@ import { BaseViewComponent } from 'app/site/base/base-view';
|
||||
import { CategoryRepositoryService } from 'app/core/repositories/motions/category-repository.service';
|
||||
import { CanComponentDeactivate } from 'app/shared/utils/watch-sorting-tree.guard';
|
||||
import { ChoiceService } from 'app/core/ui-services/choice.service';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { MotionRepositoryService } from 'app/core/repositories/motions/motion-repository.service';
|
||||
import { PromptService } from 'app/core/ui-services/prompt.service';
|
||||
import { SortingListComponent } from 'app/shared/components/sorting-list/sorting-list.component';
|
||||
@ -71,7 +71,7 @@ export class CategoryMotionsSortComponent extends BaseViewComponent implements O
|
||||
/**
|
||||
* The Sort Component
|
||||
*/
|
||||
@ViewChild('sorter')
|
||||
@ViewChild('sorter', { static: true })
|
||||
public sortSelector: SortingListComponent;
|
||||
|
||||
/**
|
||||
|
@ -1,7 +1,8 @@
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { Component, OnInit, ViewChild, TemplateRef } from '@angular/core';
|
||||
import { FormGroup, Validators, FormBuilder } from '@angular/forms';
|
||||
import { MatSnackBar, MatDialog } from '@angular/material';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
@ -74,13 +75,13 @@ export class MotionBlockDetailComponent extends BaseViewComponent implements OnI
|
||||
/**
|
||||
* The form to edit blocks
|
||||
*/
|
||||
@ViewChild('blockEditForm')
|
||||
@ViewChild('blockEditForm', { static: true })
|
||||
public blockEditForm: FormGroup;
|
||||
|
||||
/**
|
||||
* Reference to the template for edit-dialog
|
||||
*/
|
||||
@ViewChild('editDialog')
|
||||
@ViewChild('editDialog', { static: true })
|
||||
private editDialog: TemplateRef<string>;
|
||||
|
||||
/**
|
||||
|
@ -1,7 +1,7 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { BehaviorSubject } from 'rxjs';
|
||||
|
@ -2,7 +2,7 @@ import { Component } from '@angular/core';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
|
@ -13,7 +13,7 @@ describe('ManageSubmittersComponent', () => {
|
||||
template: '<os-manage-submitters></os-manage-submitters>'
|
||||
})
|
||||
class TestHostComponent {
|
||||
@ViewChild(ManageSubmittersComponent)
|
||||
@ViewChild(ManageSubmittersComponent, { static: true })
|
||||
public manageSubmitterComponent: ManageSubmittersComponent;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { Component, Input } from '@angular/core';
|
||||
import { FormGroup, FormControl } from '@angular/forms';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { BehaviorSubject, Observable } from 'rxjs';
|
||||
|
||||
|
@ -1,9 +1,10 @@
|
||||
<h2 mat-dialog-title translate>New change recommendation</h2>
|
||||
<mat-dialog-content>
|
||||
<form class="motion-content" [formGroup]='contentForm' (ngSubmit)='saveChangeRecommendation()'>
|
||||
|
||||
<h1 mat-dialog-title translate>New change recommendation</h1>
|
||||
<div mat-dialog-content>
|
||||
<form class="motion-content" [formGroup]="contentForm" (ngSubmit)="saveChangeRecommendation()">
|
||||
<mat-radio-group #rGroup formControlName="diffType">
|
||||
<mat-radio-button *ngFor="let radio of replacementTypes" [value]="radio.value">{{ radio.title }}</mat-radio-button>
|
||||
<mat-radio-button *ngFor="let radio of replacementTypes" [value]="radio.value">{{
|
||||
radio.title
|
||||
}}</mat-radio-button>
|
||||
</mat-radio-group>
|
||||
|
||||
<!-- The HTML Editor -->
|
||||
@ -11,17 +12,17 @@
|
||||
<span translate>Changed version in line</span> {{ lineRange.from }}:
|
||||
</h4>
|
||||
<h4 *ngIf="lineRange.to != lineRange.from + 1">
|
||||
<span translate>Changed version in line</span> {{ lineRange.from }} <span translate>to</span> {{ lineRange.to - 1 }}:
|
||||
<span translate>Changed version in line</span> {{ lineRange.from }} <span translate>to</span>
|
||||
{{ lineRange.to - 1 }}:
|
||||
</h4>
|
||||
<editor
|
||||
formControlName='text'
|
||||
[init]="tinyMceSettings"
|
||||
></editor>
|
||||
<div>
|
||||
<editor formControlName="text" [init]="tinyMceSettings"></editor>
|
||||
</div>
|
||||
|
||||
<mat-checkbox formControlName="public">{{ 'Public' | translate }}</mat-checkbox>
|
||||
</form>
|
||||
</mat-dialog-content>
|
||||
<mat-dialog-actions>
|
||||
</div>
|
||||
<div mat-dialog-actions>
|
||||
<!-- The mat-dialog-close directive optionally accepts a value as a result for the dialog. -->
|
||||
<button mat-button (click)="saveChangeRecommendation()">
|
||||
<span translate>Save</span>
|
||||
@ -29,4 +30,4 @@
|
||||
<button mat-button mat-dialog-close>
|
||||
<span translate>Cancel</span>
|
||||
</button>
|
||||
</mat-dialog-actions>
|
||||
</div>
|
||||
|
@ -1,17 +0,0 @@
|
||||
::ng-deep h3 {
|
||||
margin-top: 0.3em;
|
||||
margin-bottom: 0.3em;
|
||||
font-size: 1em;
|
||||
}
|
||||
::ng-deep .mat-dialog-content {
|
||||
overflow: visible;
|
||||
}
|
||||
.wide-form {
|
||||
textarea {
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
::ng-deep {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
@ -6,7 +6,7 @@ import {
|
||||
} from './motion-change-recommendation.component';
|
||||
|
||||
import { E2EImportsModule } from 'e2e-imports.module';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||
import { ModificationType } from 'app/core/ui-services/diff.service';
|
||||
import { ViewMotionChangeRecommendation } from 'app/site/motions/models/view-motion-change-recommendation';
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { Component, Inject } from '@angular/core';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef, MatSnackBar } from '@angular/material';
|
||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
@ -105,7 +106,6 @@ export class MotionChangeRecommendationComponent extends BaseViewComponent {
|
||||
this.changeReco = data.changeRecommendation;
|
||||
this.lineRange = data.lineRange;
|
||||
|
||||
this.tinyMceSettings.height = 50;
|
||||
this.tinyMceSettings.toolbar = `undo redo | bold italic underline strikethrough
|
||||
| removeformat | bullist numlist | outdent indent | link charmap code`;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Component, Input } from '@angular/core';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Title, DomSanitizer, SafeHtml } from '@angular/platform-browser';
|
||||
import { FormGroup, FormBuilder } from '@angular/forms';
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { AfterViewInit, Component, ElementRef, EventEmitter, Input, Output } from '@angular/core';
|
||||
import { MatDialog, MatSnackBar } from '@angular/material';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { DomSanitizer, SafeHtml, Title } from '@angular/platform-browser';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
@ -295,8 +296,10 @@ export class MotionDetailDiffComponent extends BaseViewComponent implements Afte
|
||||
changeRecommendation: reco
|
||||
};
|
||||
this.dialogService.open(MotionChangeRecommendationComponent, {
|
||||
height: '400px',
|
||||
width: '600px',
|
||||
height: '600px',
|
||||
width: '800px',
|
||||
maxHeight: '90vh',
|
||||
maxWidth: '90vw',
|
||||
data: data,
|
||||
disableClose: true
|
||||
});
|
||||
|
@ -609,6 +609,7 @@
|
||||
<mat-form-field *ngIf="editMotion">
|
||||
<input
|
||||
matInput
|
||||
autofocus
|
||||
placeholder="{{ 'Identifier' | translate }}"
|
||||
formControlName="identifier"
|
||||
[value]="motionCopy.identifier || ''"
|
||||
@ -621,7 +622,6 @@
|
||||
<mat-form-field *ngIf="editMotion">
|
||||
<input
|
||||
matInput
|
||||
osAutofocus
|
||||
placeholder="{{ 'Title' | translate }}"
|
||||
formControlName="title"
|
||||
[value]="motionCopy.title"
|
||||
|
@ -2,7 +2,10 @@ import { ActivatedRoute, Router, NavigationEnd } from '@angular/router';
|
||||
import { Component, OnInit, OnDestroy, ElementRef, HostListener, TemplateRef } from '@angular/core';
|
||||
import { DomSanitizer, SafeHtml, Title } from '@angular/platform-browser';
|
||||
import { FormBuilder, FormGroup, Validators, FormControl } from '@angular/forms';
|
||||
import { MatDialog, MatSnackBar, MatCheckboxChange, ErrorStateMatcher } from '@angular/material';
|
||||
import { MatCheckboxChange } from '@angular/material/checkbox';
|
||||
import { ErrorStateMatcher } from '@angular/material/core';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
import { BehaviorSubject, Subscription } from 'rxjs';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
@ -1029,8 +1032,10 @@ export class MotionDetailComponent extends BaseViewComponent implements OnInit,
|
||||
)
|
||||
};
|
||||
this.dialogService.open(MotionChangeRecommendationComponent, {
|
||||
height: '400px',
|
||||
width: '600px',
|
||||
height: '600px',
|
||||
width: '800px',
|
||||
maxHeight: '90vh',
|
||||
maxWidth: '90vw',
|
||||
data: data,
|
||||
disableClose: true
|
||||
});
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { Component, Inject } from '@angular/core';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA, MatSnackBar } from '@angular/material';
|
||||
import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
import { MotionPoll } from 'app/shared/models/motions/motion-poll';
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Component, OnInit, Input } from '@angular/core';
|
||||
import { MatDialog } from '@angular/material';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { MatSnackBar } from '@angular/material';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
|
@ -2,7 +2,7 @@ import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { MotionExportDialogComponent } from './motion-export-dialog.component';
|
||||
import { E2EImportsModule } from 'e2e-imports.module';
|
||||
import { MatDialogRef } from '@angular/material';
|
||||
import { MatDialogRef } from '@angular/material/dialog';
|
||||
|
||||
describe('MotionExportDialogComponent', () => {
|
||||
let component: MotionExportDialogComponent;
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { Component, OnInit, ViewChild } from '@angular/core';
|
||||
import { FormGroup, FormBuilder } from '@angular/forms';
|
||||
import { MatDialogRef, MatButtonToggle } from '@angular/material';
|
||||
import { MatButtonToggle } from '@angular/material/button-toggle';
|
||||
import { MatDialogRef } from '@angular/material/dialog';
|
||||
|
||||
import { ConfigService } from 'app/core/ui-services/config.service';
|
||||
import { MotionCommentSectionRepositoryService } from 'app/core/repositories/motions/motion-comment-section-repository.service';
|
||||
@ -82,13 +83,13 @@ export class MotionExportDialogComponent implements OnInit {
|
||||
/**
|
||||
* To deactivate the export-as-diff button
|
||||
*/
|
||||
@ViewChild('diffVersionButton')
|
||||
@ViewChild('diffVersionButton', { static: true })
|
||||
public diffVersionButton: MatButtonToggle;
|
||||
|
||||
/**
|
||||
* To deactivate the export-as-diff button
|
||||
*/
|
||||
@ViewChild('votingResultButton')
|
||||
@ViewChild('votingResultButton', { static: true })
|
||||
public votingResultButton: MatButtonToggle;
|
||||
|
||||
/**
|
||||
|
@ -1,7 +1,8 @@
|
||||
import { Component, OnInit, ViewChild, TemplateRef } from '@angular/core';
|
||||
import { Router, ActivatedRoute } from '@angular/router';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
import { MatSnackBar, MatDialog } from '@angular/material';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { PblColumnDefinition } from '@pebula/ngrid';
|
||||
@ -76,7 +77,7 @@ export class MotionListComponent extends BaseListViewComponent<ViewMotion> imple
|
||||
/**
|
||||
* Reference to the dialog for quick editing meta information.
|
||||
*/
|
||||
@ViewChild('motionInfoDialog')
|
||||
@ViewChild('motionInfoDialog', { static: true })
|
||||
private motionInfoDialog: TemplateRef<string>;
|
||||
|
||||
/**
|
||||
|
@ -1,6 +1,9 @@
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core';
|
||||
import { MatDialog, MatSnackBar, MatTableDataSource, MatCheckboxChange } from '@angular/material';
|
||||
import { MatCheckboxChange } from '@angular/material/checkbox';
|
||||
import { MatDialog } from '@angular/material/dialog';
|
||||
import { MatSnackBar } from '@angular/material/snack-bar';
|
||||
import { MatTableDataSource } from '@angular/material/table';
|
||||
import { Observable } from 'rxjs';
|
||||
import { Title } from '@angular/platform-browser';
|
||||
|
||||
@ -68,7 +71,7 @@ export class WorkflowDetailComponent extends BaseViewComponent implements OnInit
|
||||
/**
|
||||
* Reference to the workflow dialog
|
||||
*/
|
||||
@ViewChild('workflowDialog')
|
||||
@ViewChild('workflowDialog', { static: true })
|
||||
private workflowDialog: TemplateRef<string>;
|
||||
|
||||
/**
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user