mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	chore: replace karma with jest
This commit is contained in:
		| @@ -2,160 +2,179 @@ | |||||||
| 	"$schema": "./node_modules/@angular/cli/lib/config/schema.json", | 	"$schema": "./node_modules/@angular/cli/lib/config/schema.json", | ||||||
| 	"version": 1, | 	"version": 1, | ||||||
| 	"newProjectRoot": "projects", | 	"newProjectRoot": "projects", | ||||||
| 	"projects": { |   "projects": { | ||||||
| 		"paperless-ui": { |     "paperless-ui": { | ||||||
| 			"projectType": "application", |       "projectType": "application", | ||||||
| 			"schematics": { |       "schematics": { | ||||||
| 				"@schematics/angular:component": { |         "@schematics/angular:component": { | ||||||
| 					"style": "scss" |           "style": "scss" | ||||||
| 				} |  | ||||||
| 			}, |  | ||||||
| 			"root": "", |  | ||||||
| 			"sourceRoot": "src", |  | ||||||
| 			"prefix": "app", |  | ||||||
| 			"i18n": { |  | ||||||
| 				"sourceLocale": "en-US", |  | ||||||
| 				"locales": { |  | ||||||
| 					"cs-CZ": "src/locale/messages.cs_CZ.xlf", |  | ||||||
| 					"da-DK": "src/locale/messages.da_DK.xlf", |  | ||||||
| 					"de-DE": "src/locale/messages.de_DE.xlf", |  | ||||||
| 					"en-GB": "src/locale/messages.en_GB.xlf", |  | ||||||
| 					"es-ES": "src/locale/messages.es_ES.xlf", |  | ||||||
| 					"fr-FR": "src/locale/messages.fr_FR.xlf", |  | ||||||
| 					"it-IT": "src/locale/messages.it_IT.xlf", |  | ||||||
| 					"lb-LU": "src/locale/messages.lb_LU.xlf", |  | ||||||
| 					"nl-NL": "src/locale/messages.nl_NL.xlf", |  | ||||||
| 					"pl-PL": "src/locale/messages.pl_PL.xlf", |  | ||||||
| 					"pt-BR": "src/locale/messages.pt_BR.xlf", |  | ||||||
| 					"pt-PT": "src/locale/messages.pt_PT.xlf", |  | ||||||
| 					"ro-RO": "src/locale/messages.ro_RO.xlf", |  | ||||||
| 					"ru-RU": "src/locale/messages.ru_RU.xlf", |  | ||||||
| 					"sl-SI": "src/locale/messages.sl_SI.xlf", |  | ||||||
| 					"sr-CS": "src/locale/messages.sr_CS.xlf", |  | ||||||
| 					"sv-SE": "src/locale/messages.sv_SE.xlf", |  | ||||||
| 					"zh-CN": "src/locale/messages.zh_CN.xlf" |  | ||||||
|         } |         } | ||||||
| 			}, |       }, | ||||||
| 			"architect": { |       "root": "", | ||||||
| 				"build": { |       "sourceRoot": "src", | ||||||
| 					"builder": "@angular-devkit/build-angular:browser", |       "prefix": "app", | ||||||
| 					"options": { |       "i18n": { | ||||||
| 						"outputPath": "dist/paperless-ui", |         "sourceLocale": "en-US", | ||||||
| 						"outputHashing": "none", |         "locales": { | ||||||
| 						"index": "src/index.html", |           "cs-CZ": "src/locale/messages.cs_CZ.xlf", | ||||||
| 						"main": "src/main.ts", |           "da-DK": "src/locale/messages.da_DK.xlf", | ||||||
| 						"polyfills": "src/polyfills.ts", |           "de-DE": "src/locale/messages.de_DE.xlf", | ||||||
| 						"tsConfig": "tsconfig.app.json", |           "en-GB": "src/locale/messages.en_GB.xlf", | ||||||
| 						"localize": true, |           "es-ES": "src/locale/messages.es_ES.xlf", | ||||||
| 						"assets": [ |           "fr-FR": "src/locale/messages.fr_FR.xlf", | ||||||
| 							"src/favicon.ico", |           "it-IT": "src/locale/messages.it_IT.xlf", | ||||||
| 							"src/apple-touch-icon.png", |           "lb-LU": "src/locale/messages.lb_LU.xlf", | ||||||
| 							"src/assets", |           "nl-NL": "src/locale/messages.nl_NL.xlf", | ||||||
| 							"src/manifest.webmanifest", { |           "pl-PL": "src/locale/messages.pl_PL.xlf", | ||||||
| 								"glob": "pdf.worker.min.js", |           "pt-BR": "src/locale/messages.pt_BR.xlf", | ||||||
| 								"input": "node_modules/pdfjs-dist/build/", |           "pt-PT": "src/locale/messages.pt_PT.xlf", | ||||||
| 								"output": "/assets/js/" |           "ro-RO": "src/locale/messages.ro_RO.xlf", | ||||||
| 							} |           "ru-RU": "src/locale/messages.ru_RU.xlf", | ||||||
| 						], |           "sl-SI": "src/locale/messages.sl_SI.xlf", | ||||||
| 						"styles": [ |           "sr-CS": "src/locale/messages.sr_CS.xlf", | ||||||
| 							"src/styles.scss" |           "sv-SE": "src/locale/messages.sv_SE.xlf", | ||||||
| 						], |           "zh-CN": "src/locale/messages.zh_CN.xlf" | ||||||
| 						"scripts": [], |         } | ||||||
| 						"allowedCommonJsDependencies": [ |       }, | ||||||
| 							"ng2-pdf-viewer" |       "architect": { | ||||||
| 						], |         "build": { | ||||||
| 						"vendorChunk": true, |           "builder": "@angular-devkit/build-angular:browser", | ||||||
| 						"extractLicenses": false, |           "options": { | ||||||
| 						"buildOptimizer": false, |             "outputPath": "dist/paperless-ui", | ||||||
| 						"sourceMap": true, |             "outputHashing": "none", | ||||||
| 						"optimization": false, |             "index": "src/index.html", | ||||||
| 						"namedChunks": true |             "main": "src/main.ts", | ||||||
| 					}, |             "polyfills": "src/polyfills.ts", | ||||||
| 					"configurations": { |             "tsConfig": "tsconfig.app.json", | ||||||
| 						"production": { |             "localize": true, | ||||||
| 							"fileReplacements": [ |             "assets": [ | ||||||
| 								{ |               "src/favicon.ico", | ||||||
| 									"replace": "src/environments/environment.ts", |               "src/apple-touch-icon.png", | ||||||
| 									"with": "src/environments/environment.prod.ts" |               "src/assets", | ||||||
| 								} |               "src/manifest.webmanifest", | ||||||
| 							], |               { | ||||||
| 							"outputPath": "../src/documents/static/frontend/", |                 "glob": "pdf.worker.min.js", | ||||||
| 							"optimization": true, |                 "input": "node_modules/pdfjs-dist/build/", | ||||||
| 							"outputHashing": "none", |                 "output": "/assets/js/" | ||||||
| 							"sourceMap": false, |               } | ||||||
| 							"namedChunks": false, |             ], | ||||||
| 							"extractLicenses": true, |             "styles": [ | ||||||
| 							"vendorChunk": false, |               "src/styles.scss" | ||||||
| 							"buildOptimizer": true, |             ], | ||||||
| 							"budgets": [ |             "scripts": [], | ||||||
| 								{ |             "allowedCommonJsDependencies": [ | ||||||
| 									"type": "initial", |               "ng2-pdf-viewer" | ||||||
| 									"maximumWarning": "2mb", |             ], | ||||||
| 									"maximumError": "5mb" |             "vendorChunk": true, | ||||||
| 								}, |             "extractLicenses": false, | ||||||
| 								{ |             "buildOptimizer": false, | ||||||
| 									"type": "anyComponentStyle", |             "sourceMap": true, | ||||||
| 									"maximumWarning": "6kb", |             "optimization": false, | ||||||
| 									"maximumError": "10kb" |             "namedChunks": true | ||||||
| 								} |           }, | ||||||
| 							] |           "configurations": { | ||||||
| 						}, |             "production": { | ||||||
| 						"en-US": { |               "fileReplacements": [ | ||||||
| 							"localize": ["en-US"] |                 { | ||||||
| 						} |                   "replace": "src/environments/environment.ts", | ||||||
| 					}, |                   "with": "src/environments/environment.prod.ts" | ||||||
| 					"defaultConfiguration": "" |                 } | ||||||
| 				}, |               ], | ||||||
| 				"serve": { |               "outputPath": "../src/documents/static/frontend/", | ||||||
| 					"builder": "@angular-devkit/build-angular:dev-server", |               "optimization": true, | ||||||
| 					"options": { |               "outputHashing": "none", | ||||||
| 						"browserTarget": "paperless-ui:build:en-US" |               "sourceMap": false, | ||||||
| 					}, |               "namedChunks": false, | ||||||
| 					"configurations": { |               "extractLicenses": true, | ||||||
| 						"production": { |               "vendorChunk": false, | ||||||
| 							"browserTarget": "paperless-ui:build:production" |               "buildOptimizer": true, | ||||||
| 						} |               "budgets": [ | ||||||
| 					} |                 { | ||||||
| 				}, |                   "type": "initial", | ||||||
| 				"extract-i18n": { |                   "maximumWarning": "2mb", | ||||||
| 					"builder": "@angular-devkit/build-angular:extract-i18n", |                   "maximumError": "5mb" | ||||||
| 					"options": { |                 }, | ||||||
| 						"browserTarget": "paperless-ui:build" |                 { | ||||||
| 					} |                   "type": "anyComponentStyle", | ||||||
| 				}, |                   "maximumWarning": "6kb", | ||||||
| 				"test": { |                   "maximumError": "10kb" | ||||||
| 					"builder": "@angular-devkit/build-angular:karma", |                 } | ||||||
| 					"options": { |               ] | ||||||
| 						"main": "src/test.ts", |             }, | ||||||
| 						"polyfills": "src/polyfills.ts", |             "en-US": { | ||||||
| 						"tsConfig": "tsconfig.spec.json", |               "localize": [ | ||||||
| 						"karmaConfig": "karma.conf.js", |                 "en-US" | ||||||
| 						"assets": [ |               ] | ||||||
| 							"src/favicon.ico", |             } | ||||||
| 							"src/apple-touch-icon.png", |           }, | ||||||
| 							"src/assets", |           "defaultConfiguration": "" | ||||||
| 							"src/manifest.webmanifest" |         }, | ||||||
| 						], |         "serve": { | ||||||
| 						"styles": [ |           "builder": "@angular-devkit/build-angular:dev-server", | ||||||
| 							"src/styles.scss" |           "options": { | ||||||
| 						], |             "browserTarget": "paperless-ui:build:en-US" | ||||||
| 						"scripts": [] |           }, | ||||||
| 					} |           "configurations": { | ||||||
| 				}, |             "production": { | ||||||
| 				"e2e": { |               "browserTarget": "paperless-ui:build:production" | ||||||
| 					"builder": "@angular-devkit/build-angular:protractor", |             } | ||||||
| 					"options": { |           } | ||||||
| 						"protractorConfig": "e2e/protractor.conf.js", |         }, | ||||||
| 						"devServerTarget": "paperless-ui:serve" |         "extract-i18n": { | ||||||
| 					}, |           "builder": "@angular-devkit/build-angular:extract-i18n", | ||||||
| 					"configurations": { |           "options": { | ||||||
| 						"production": { |             "browserTarget": "paperless-ui:build" | ||||||
| 							"devServerTarget": "paperless-ui:serve:production" |           } | ||||||
| 						} |         }, | ||||||
| 					} |         "test": { | ||||||
| 				} |           "builder": "@angular-builders/jest:run", | ||||||
| 			} |           "options": { | ||||||
| 		} |             "tsConfig": "tsconfig.spec.json", | ||||||
| 	}, |             "assets": [ | ||||||
| 	"defaultProject": "paperless-ui" |               "src/favicon.ico", | ||||||
|  |               "src/apple-touch-icon.png", | ||||||
|  |               "src/assets", | ||||||
|  |               "src/manifest.webmanifest" | ||||||
|  |             ], | ||||||
|  |             "styles": [ | ||||||
|  |               "src/styles.scss" | ||||||
|  |             ], | ||||||
|  |             "scripts": [] | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "e2e": { | ||||||
|  |           "builder": "@cypress/schematic:cypress", | ||||||
|  |           "options": { | ||||||
|  |             "devServerTarget": "paperless-ui:serve", | ||||||
|  |             "watch": true, | ||||||
|  |             "headless": false | ||||||
|  |           }, | ||||||
|  |           "configurations": { | ||||||
|  |             "production": { | ||||||
|  |               "devServerTarget": "paperless-ui:serve:production" | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "cypress-run": { | ||||||
|  |           "builder": "@cypress/schematic:cypress", | ||||||
|  |           "options": { | ||||||
|  |             "devServerTarget": "paperless-ui:serve" | ||||||
|  |           }, | ||||||
|  |           "configurations": { | ||||||
|  |             "production": { | ||||||
|  |               "devServerTarget": "paperless-ui:serve:production" | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "cypress-open": { | ||||||
|  |           "builder": "@cypress/schematic:cypress", | ||||||
|  |           "options": { | ||||||
|  |             "watch": true, | ||||||
|  |             "headless": false | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   "defaultProject": "paperless-ui" | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								src-ui/jest.config.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src-ui/jest.config.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | module.exports = { | ||||||
|  |   moduleNameMapper: { | ||||||
|  |     "@core/(.*)": "<rootDir>/src/app/core/$1", | ||||||
|  |   }, | ||||||
|  |   preset: "jest-preset-angular", | ||||||
|  |   setupFilesAfterEnv: ["<rootDir>/setup-jest.ts"], | ||||||
|  |   testPathIgnorePatterns: ["/node_modules/", "/cypress/"], | ||||||
|  | }; | ||||||
| @@ -1,32 +0,0 @@ | |||||||
| // Karma configuration file, see link for more information |  | ||||||
| // https://karma-runner.github.io/1.0/config/configuration-file.html |  | ||||||
|  |  | ||||||
| module.exports = function (config) { |  | ||||||
|   config.set({ |  | ||||||
|     basePath: '', |  | ||||||
|     frameworks: ['jasmine', '@angular-devkit/build-angular'], |  | ||||||
|     plugins: [ |  | ||||||
|       require('karma-jasmine'), |  | ||||||
|       require('karma-chrome-launcher'), |  | ||||||
|       require('karma-jasmine-html-reporter'), |  | ||||||
|       require('karma-coverage-istanbul-reporter'), |  | ||||||
|       require('@angular-devkit/build-angular/plugins/karma'), |  | ||||||
|     ], |  | ||||||
|     client: { |  | ||||||
|       clearContext: false, // leave Jasmine Spec Runner output visible in browser |  | ||||||
|     }, |  | ||||||
|     coverageIstanbulReporter: { |  | ||||||
|       dir: require('path').join(__dirname, './coverage/paperless-ui'), |  | ||||||
|       reports: ['html', 'lcovonly', 'text-summary'], |  | ||||||
|       fixWebpackSourcePaths: true, |  | ||||||
|     }, |  | ||||||
|     reporters: ['progress', 'kjhtml'], |  | ||||||
|     port: 9876, |  | ||||||
|     colors: true, |  | ||||||
|     logLevel: config.LOG_INFO, |  | ||||||
|     autoWatch: true, |  | ||||||
|     browsers: ['Chrome'], |  | ||||||
|     singleRun: false, |  | ||||||
|     restartOnFileChange: true, |  | ||||||
|   }) |  | ||||||
| } |  | ||||||
							
								
								
									
										4573
									
								
								src-ui/package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4573
									
								
								src-ui/package-lock.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -7,7 +7,9 @@ | |||||||
|     "build": "ng build", |     "build": "ng build", | ||||||
|     "test": "ng test", |     "test": "ng test", | ||||||
|     "lint": "ng lint", |     "lint": "ng lint", | ||||||
|     "e2e": "ng e2e" |     "e2e": "ng e2e", | ||||||
|  |     "cypress:open": "cypress open", | ||||||
|  |     "cypress:run": "cypress run" | ||||||
|   }, |   }, | ||||||
|   "private": true, |   "private": true, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
| @@ -37,21 +39,15 @@ | |||||||
|     "zone.js": "~0.11.4" |     "zone.js": "~0.11.4" | ||||||
|   }, |   }, | ||||||
|   "devDependencies": { |   "devDependencies": { | ||||||
|     "@angular-devkit/build-angular": "~13.3.0", |     "@angular-builders/jest": "latest", | ||||||
|     "@angular/cli": "~13.3.0", |     "@angular-devkit/build-angular": "~13.2.5", | ||||||
|  |     "@angular/cli": "~13.2.5", | ||||||
|     "@angular/compiler-cli": "~13.2.4", |     "@angular/compiler-cli": "~13.2.4", | ||||||
|     "@types/jasmine": "~4.0.0", |     "@types/jest": "latest", | ||||||
|     "@types/jasminewd2": "~2.0.10", |     "@types/node": "^17.0.21", | ||||||
|     "@types/node": "^17.0.22", |  | ||||||
|     "codelyzer": "^6.0.2", |     "codelyzer": "^6.0.2", | ||||||
|     "jasmine-core": "~4.0.1", |     "cypress": "~9.5.2", | ||||||
|     "jasmine-spec-reporter": "~7.0.0", |     "jest": "latest", | ||||||
|     "karma": "~6.3.16", |  | ||||||
|     "karma-chrome-launcher": "~3.1.1", |  | ||||||
|     "karma-coverage-istanbul-reporter": "~3.0.3", |  | ||||||
|     "karma-jasmine": "~4.0.1", |  | ||||||
|     "karma-jasmine-html-reporter": "^1.7.0", |  | ||||||
|     "protractor": "~7.0.0", |  | ||||||
|     "ts-node": "~10.7.0", |     "ts-node": "~10.7.0", | ||||||
|     "tslint": "~6.1.3", |     "tslint": "~6.1.3", | ||||||
|     "typescript": "~4.5.5" |     "typescript": "~4.5.5" | ||||||
|   | |||||||
							
								
								
									
										30
									
								
								src-ui/setup-jest.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src-ui/setup-jest.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | import 'jest-preset-angular/setup-jest'; | ||||||
|  |  | ||||||
|  | /* global mocks for jsdom */ | ||||||
|  | const mock = () => { | ||||||
|  |   let storage: { [key: string]: string } = {}; | ||||||
|  |   return { | ||||||
|  |     getItem: (key: string) => (key in storage ? storage[key] : null), | ||||||
|  |     setItem: (key: string, value: string) => (storage[key] = value || ''), | ||||||
|  |     removeItem: (key: string) => delete storage[key], | ||||||
|  |     clear: () => (storage = {}), | ||||||
|  |   }; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | Object.defineProperty(window, 'localStorage', { value: mock() }); | ||||||
|  | Object.defineProperty(window, 'sessionStorage', { value: mock() }); | ||||||
|  | Object.defineProperty(window, 'getComputedStyle', { | ||||||
|  |   value: () => ['-webkit-appearance'], | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | Object.defineProperty(document.body.style, 'transform', { | ||||||
|  |   value: () => { | ||||||
|  |     return { | ||||||
|  |       enumerable: true, | ||||||
|  |       configurable: true, | ||||||
|  |     }; | ||||||
|  |   }, | ||||||
|  | }); | ||||||
|  |  | ||||||
|  | /* output shorter and more meaningful Zone error stack traces */ | ||||||
|  | // Error.stackTraceLimit = 2; | ||||||
| @@ -1,32 +0,0 @@ | |||||||
| // This file is required by karma.conf.js and loads recursively all the .spec and framework files |  | ||||||
|  |  | ||||||
| import 'zone.js/testing' |  | ||||||
| import { getTestBed } from '@angular/core/testing' |  | ||||||
| import { |  | ||||||
|   BrowserDynamicTestingModule, |  | ||||||
|   platformBrowserDynamicTesting, |  | ||||||
| } from '@angular/platform-browser-dynamic/testing' |  | ||||||
|  |  | ||||||
| declare const require: { |  | ||||||
|   context( |  | ||||||
|     path: string, |  | ||||||
|     deep?: boolean, |  | ||||||
|     filter?: RegExp |  | ||||||
|   ): { |  | ||||||
|     keys(): string[] |  | ||||||
|     <T>(id: string): T |  | ||||||
|   } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // First, initialize the Angular testing environment. |  | ||||||
| getTestBed().initTestEnvironment( |  | ||||||
|   BrowserDynamicTestingModule, |  | ||||||
|   platformBrowserDynamicTesting(), |  | ||||||
|   { |  | ||||||
|     teardown: { destroyAfterEach: false }, |  | ||||||
|   } |  | ||||||
| ) |  | ||||||
| // Then we find all the tests. |  | ||||||
| const context = require.context('./', true, /\.spec\.ts$/) |  | ||||||
| // And load the modules. |  | ||||||
| context.keys().map(context) |  | ||||||
							
								
								
									
										21
									
								
								src-ui/test-config.helper.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src-ui/test-config.helper.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | import { TestBed } from '@angular/core/testing'; | ||||||
|  |  | ||||||
|  | type CompilerOptions = Partial<{ | ||||||
|  |   providers: any[]; | ||||||
|  |   useJit: boolean; | ||||||
|  |   preserveWhitespaces: boolean; | ||||||
|  | }>; | ||||||
|  | export type ConfigureFn = (testBed: typeof TestBed) => void; | ||||||
|  |  | ||||||
|  | export const configureTests = (configure: ConfigureFn, compilerOptions: CompilerOptions = {}) => { | ||||||
|  |   const compilerConfig: CompilerOptions = { | ||||||
|  |     preserveWhitespaces: false, | ||||||
|  |     ...compilerOptions, | ||||||
|  |   }; | ||||||
|  |  | ||||||
|  |   const configuredTestBed = TestBed.configureCompiler(compilerConfig); | ||||||
|  |  | ||||||
|  |   configure(configuredTestBed); | ||||||
|  |  | ||||||
|  |   return configuredTestBed.compileComponents().then(() => configuredTestBed); | ||||||
|  | }; | ||||||
| @@ -1,14 +1,15 @@ | |||||||
| /* To learn more about this file see: https://angular.io/config/tsconfig. */ |  | ||||||
| { | { | ||||||
|   "extends": "./tsconfig.json", |   "extends": "./tsconfig.json", | ||||||
|   "compilerOptions": { |   "compilerOptions": { | ||||||
|     "outDir": "./out-tsc/spec", |     "outDir": "./out-tsc/spec", | ||||||
|     "types": [ |     "types": [ | ||||||
|       "jasmine" |       "jest" | ||||||
|     ] |     ], | ||||||
|  |     "module": "commonjs", | ||||||
|  |     "emitDecoratorMetadata": true, | ||||||
|  |     "allowJs": true | ||||||
|   }, |   }, | ||||||
|   "files": [ |   "files": [ | ||||||
|     "src/test.ts", |  | ||||||
|     "src/polyfills.ts" |     "src/polyfills.ts" | ||||||
|   ], |   ], | ||||||
|   "include": [ |   "include": [ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Frank Strieter
					Frank Strieter