UNPKG

moh-common-lib

Version:

A library of Angular components, services, and styles for B.C. Government Ministry of Health (MoH).

873 lines 80.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ElementRef, EventEmitter, Input, NgZone, Output, ViewChild, forwardRef, ViewEncapsulation, } from '@angular/core'; import { NgForm, ControlContainer, } from '@angular/forms'; import { CommonImage, CommonImageError, } from '../../models/images.model'; import { Base } from '../../models/base'; import * as PDFJS_ from 'pdfjs-dist/legacy/build/pdf'; import { pdfJsWorker } from 'pdfjs-dist/legacy/build/pdf.worker.entry'; /** @type {?} */ var PDFJS = ((/** @type {?} */ (PDFJS_))); PDFJS.workerSrc = pdfJsWorker; /** * @record */ export function FileUploaderMsg() { } if (false) { /** @type {?} */ FileUploaderMsg.prototype.required; } /** * @record */ function Size() { } if (false) { /** @type {?} */ Size.prototype.width; /** @type {?} */ Size.prototype.height; } /** @type {?} */ var MAX_IMAGE_SIZE_BYTES = 1048576; /** @type {?} */ var MAX_IMAGE_COUNT = 50; /** @type {?} */ var MAX_IMAGE_WIDTH = 3300; /** @type {?} */ var MAX_IMAGE_HEIGHT = 3300; /** @type {?} */ var MIN_IMAGE_WIDTH = 200; /** @type {?} */ var MIN_IMAGE_HEIGHT = 200; /** @type {?} */ var MIN_IMAGE_SIZE_BYTES = 20000; /** @type {?} */ var JPEG_COMPRESSION = 0.5; /** @type {?} */ var IMAGE_CONTENT_TYPE = 'image/jpeg'; /** @type {?} */ var IMAGE_REDUCTION_SCALE_FACTOR = 0.8; var FileUploaderComponent = /** @class */ (function (_super) { tslib_1.__extends(FileUploaderComponent, _super); function FileUploaderComponent(zone, controlContainer) { var _this = _super.call(this) || this; _this.zone = zone; _this.controlContainer = controlContainer; _this.images = new Array(0); _this.required = false; _this.instructionText = 'Please upload required ID documents.'; _this.errorMessages = { required: 'File is required.' }; _this.imagesChange = new EventEmitter(); _this.errorDocument = new EventEmitter(); return _this; } /** Opens the file upload dialog from the browser. */ /** * Opens the file upload dialog from the browser. * @return {?} */ FileUploaderComponent.prototype.openFileDialog = /** * Opens the file upload dialog from the browser. * @return {?} */ function () { this.browseFileRef.nativeElement.click(); }; /** * @param {?} event * @return {?} */ FileUploaderComponent.prototype.handleDragOver = /** * @param {?} event * @return {?} */ function (event) { event.preventDefault(); }; /** * @param {?} event * @return {?} */ FileUploaderComponent.prototype.handleDrop = /** * @param {?} event * @return {?} */ function (event) { event.preventDefault(); /** @type {?} */ var files = event.dataTransfer.files; // Don't proceed if no file(s) were selected. if (!files || files.length === 0) { return; } // Clear previous error message. //this.errorMessage = null; // Process each file dropped. for (var i = 0; i < files.length; i++) { this.processFile(files[i]); } }; /** * @param {?} event * @return {?} */ FileUploaderComponent.prototype.handleChangeFile = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var files = event.target.files; // Don't proceed if no file(s) were selected. if (!files || files.length === 0) { return; } // Clear previous error message. //this.errorMessage = null; // Process each file selected. for (var i = 0; i < files.length; i++) { this.processFile(files[i]); } // Clear selected files. event.target.value = ''; }; /** * @private * @param {?} file * @return {?} */ FileUploaderComponent.prototype.processFile = /** * @private * @param {?} file * @return {?} */ function (file) { return tslib_1.__awaiter(this, void 0, void 0, function () { var _a, images, error_1, image, error_2; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: _a = file.type; switch (_a) { case 'application/pdf': return [3 /*break*/, 1]; } return [3 /*break*/, 6]; case 1: _b.trys.push([1, 4, , 5]); return [4 /*yield*/, this.processPDFFile(file)]; case 2: images = _b.sent(); return [4 /*yield*/, this.addFileImages(file.name, images)]; case 3: _b.sent(); return [3 /*break*/, 5]; case 4: error_1 = _b.sent(); this.handleError(error_1); return [3 /*break*/, 5]; case 5: return [3 /*break*/, 11]; case 6: _b.trys.push([6, 9, , 10]); return [4 /*yield*/, this.processImageFile(file)]; case 7: image = _b.sent(); return [4 /*yield*/, this.addFileImages(file.name, [image])]; case 8: _b.sent(); return [3 /*break*/, 10]; case 9: error_2 = _b.sent(); this.handleError(error_2); return [3 /*break*/, 10]; case 10: return [3 /*break*/, 11]; case 11: return [2 /*return*/]; } }); }); }; /** * @private * @param {?} file * @return {?} */ FileUploaderComponent.prototype.processPDFFile = /** * @private * @param {?} file * @return {?} */ function (file) { var _this = this; /** @type {?} */ var reader = new FileReader(); /** @type {?} */ var images = []; return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { reader.onload = (/** * @return {?} */ function () { /** @type {?} */ var docInitParams = { data: reader.result }; PDFJS.getDocument(docInitParams).promise.then((/** * @param {?} pdfDoc * @return {?} */ function (pdfDoc) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var pageNumber, image, scaledImage, error_3, message; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (pdfDoc.numPages + this.images.length > MAX_IMAGE_COUNT) { reject(CommonImageError.TooBig); return [2 /*return*/]; } pageNumber = 1; _a.label = 1; case 1: if (!(pageNumber <= pdfDoc.numPages)) return [3 /*break*/, 9]; _a.label = 2; case 2: _a.trys.push([2, 7, , 8]); return [4 /*yield*/, this.getPageImage(pdfDoc, pageNumber)]; case 3: image = _a.sent(); if (!(image.size <= MAX_IMAGE_SIZE_BYTES)) return [3 /*break*/, 4]; images.push(image); return [3 /*break*/, 6]; case 4: return [4 /*yield*/, this.scaleImage(image)]; case 5: scaledImage = _a.sent(); images.push(scaledImage); _a.label = 6; case 6: return [3 /*break*/, 8]; case 7: error_3 = _a.sent(); message = "Error reading page " + pageNumber + " of the PDF."; console.log(message, error_3); reject(CommonImageError.CannotOpenPDF); return [2 /*return*/]; case 8: pageNumber++; return [3 /*break*/, 1]; case 9: resolve(images); return [2 /*return*/]; } }); }); }), (/** * @return {?} */ function () { reject(CommonImageError.CannotOpenPDF); })); }); reader.readAsArrayBuffer(file); })); }; /** * @private * @param {?} pdfDoc * @param {?} pageNumber * @return {?} */ FileUploaderComponent.prototype.getPageImage = /** * @private * @param {?} pdfDoc * @param {?} pageNumber * @return {?} */ function (pdfDoc, pageNumber) { var _this = this; /** @type {?} */ var canvas = document.createElement('canvas'); /** @type {?} */ var ctx = canvas.getContext('2d'); return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { pdfDoc.getPage(pageNumber).then((/** * @param {?} page * @return {?} */ function (page) { /** @type {?} */ var viewport = page.getViewport({ scale: 2.0 }); // Sometimes width and height can be NaN, so use viewBox instead. if (viewport.width && viewport.height) { canvas.width = viewport.width; canvas.height = viewport.height; } else { canvas.width = viewport.viewBox[2]; canvas.height = viewport.viewBox[3]; } /** @type {?} */ var renderContext = { canvasContext: ctx, viewport: viewport }; page.render(renderContext).promise.then((/** * @return {?} */ function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var dataURL, image; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: dataURL = canvas.toDataURL('image/jpeg', JPEG_COMPRESSION); return [4 /*yield*/, this.createImage(dataURL)]; case 1: image = _a.sent(); resolve(image); return [2 /*return*/]; } }); }); }), (/** * @param {?} error * @return {?} */ function (error) { console.log('PDFJS render error:', error); reject(CommonImageError.CannotOpenPDF); })); })).catch((/** * @param {?} error * @return {?} */ function (error) { console.log('PDFJS getPage() error:', error); reject(CommonImageError.CannotOpenPDF); })); })); }; /** * @private * @param {?} file * @return {?} */ FileUploaderComponent.prototype.processImageFile = /** * @private * @param {?} file * @return {?} */ function (file) { var _this = this; /** @type {?} */ var reader = new FileReader(); if (this.images.length >= MAX_IMAGE_COUNT) { return Promise.reject(CommonImageError.TooBig); } return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { reader.onload = (/** * @return {?} */ function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { var image, _1; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 4, , 5]); return [4 /*yield*/, this.createImage(reader.result)]; case 1: image = _a.sent(); if (!(image.size > MAX_IMAGE_SIZE_BYTES)) return [3 /*break*/, 3]; return [4 /*yield*/, this.scaleImage(image)]; case 2: image = _a.sent(); _a.label = 3; case 3: resolve(image); return [3 /*break*/, 5]; case 4: _1 = _a.sent(); reject(CommonImageError.CannotOpen); return [3 /*break*/, 5]; case 5: return [2 /*return*/]; } }); }); }); reader.onerror = (/** * @return {?} */ function () { reject(CommonImageError.CannotOpen); }); reader.readAsDataURL(file); })); }; /** * @private * @param {?} image * @return {?} */ FileUploaderComponent.prototype.scaleImage = /** * @private * @param {?} image * @return {?} */ function (image) { return tslib_1.__awaiter(this, void 0, void 0, function () { var _this = this; return tslib_1.__generator(this, function (_a) { return [2 /*return*/, new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { // We create an image to receive the Data URI /** @type {?} */ var img = document.createElement('img'); // When the event "onload" is triggered we can resize the image. img.onload = (/** * @return {?} */ function () { // We create a canvas and get its context. /** @type {?} */ var canvas = document.createElement('canvas'); /** @type {?} */ var ctx = canvas.getContext('2d'); /** @type {?} */ var targetWidth = Math.floor(img.width * IMAGE_REDUCTION_SCALE_FACTOR); /** @type {?} */ var targetHeight = Math.floor(img.height * IMAGE_REDUCTION_SCALE_FACTOR); // We set the dimensions at the wanted size. canvas.width = targetWidth; canvas.height = targetHeight; // We resize the image with the canvas method drawImage(); ctx.drawImage(img, 0, 0, targetWidth, targetHeight); canvas.toBlob((/** * @param {?} blob * @return {?} */ function (blob) { /** @type {?} */ var reader = new FileReader(); reader.onload = (/** * @param {?} event * @return {?} */ function (event) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var scaledImage, _a; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: scaledImage = image.clone(); scaledImage.fileContent = event.target.result; scaledImage.size = blob.size; scaledImage.naturalWidth = targetWidth; scaledImage.naturalHeight = targetHeight; scaledImage.calculateSize(); if (!(scaledImage.size > MAX_IMAGE_SIZE_BYTES)) return [3 /*break*/, 2]; _a = resolve; return [4 /*yield*/, this.scaleImage(scaledImage)]; case 1: _a.apply(void 0, [_b.sent()]); return [3 /*break*/, 3]; case 2: resolve(scaledImage); _b.label = 3; case 3: return [2 /*return*/]; } }); }); }); reader.onerror = (/** * @return {?} */ function () { reject(CommonImageError.CannotOpen); }); reader.readAsDataURL(blob); }), IMAGE_CONTENT_TYPE, JPEG_COMPRESSION); }); img.onerror = (/** * @return {?} */ function () { reject(CommonImageError.CannotOpen); }); // We put the Data URI in the image's src attribute img.src = image.fileContent; }))]; }); }); }; /** * @private * @param {?} imageDataURL * @return {?} */ FileUploaderComponent.prototype.createImage = /** * @private * @param {?} imageDataURL * @return {?} */ function (imageDataURL) { var _this = this; /** @type {?} */ var image = new CommonImage(imageDataURL); return new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { // We create an image to receive the Data URI /** @type {?} */ var img = document.createElement('img'); // When the event "onload" is triggered we can resize the image. img.onload = (/** * @return {?} */ function () { // We create a canvas and get its context. /** @type {?} */ var canvas = document.createElement('canvas'); /** @type {?} */ var ctx = canvas.getContext('2d'); /** @type {?} */ var size = _this.getConstrainedSize(img.width, img.height); if (size.width < MIN_IMAGE_WIDTH || size.height < MIN_IMAGE_HEIGHT) { reject(CommonImageError.TooSmall); } /** @type {?} */ var width = size.width; /** @type {?} */ var height = size.height; // We set the dimensions at the wanted size. canvas.width = width; canvas.height = height; // We resize the image with the canvas method drawImage(); ctx.drawImage(img, 0, 0, width, height); canvas.toBlob((/** * @param {?} blob * @return {?} */ function (blob) { return tslib_1.__awaiter(_this, void 0, void 0, function () { var reader; return tslib_1.__generator(this, function (_a) { reader = new FileReader(); if (blob.size < MIN_IMAGE_SIZE_BYTES) { reject(CommonImageError.TooSmall); } reader.onload = (/** * @param {?} event * @return {?} */ function (event) { image.fileContent = event.target.result; image.size = blob.size; image.naturalWidth = width; image.naturalHeight = height; image.calculateSize(); resolve(image); }); reader.onerror = (/** * @return {?} */ function () { reject(CommonImageError.CannotOpen); }); reader.readAsDataURL(blob); return [2 /*return*/]; }); }); }), IMAGE_CONTENT_TYPE, JPEG_COMPRESSION); }); img.onerror = (/** * @return {?} */ function () { reject(CommonImageError.CannotOpen); }); // We put the Data URI in the image's src attribute img.src = image.fileContent; })); }; /** * @private * @param {?} fileName * @param {?} images * @return {?} */ FileUploaderComponent.prototype.addFileImages = /** * @private * @param {?} fileName * @param {?} images * @return {?} */ function (fileName, images) { return tslib_1.__awaiter(this, void 0, void 0, function () { var i, fullFileName, image; var _this = this; return tslib_1.__generator(this, function (_a) { // Create image objects. for (i = 0; i < images.length; i++) { fullFileName = "" + fileName + (images.length > 1 ? '.page-' + (i + 1) : ''); image = images[i]; image.name = fullFileName; // image.name has been deprecated. image.id = fullFileName; image.contentType = IMAGE_CONTENT_TYPE; } return [2 /*return*/, new Promise((/** * @param {?} resolve * @param {?} reject * @return {?} */ function (resolve, reject) { // Merge new images with existing images. /** @type {?} */ var imagesToAdd = new Array(); images.forEach((/** * @param {?} image * @return {?} */ function (image) { /** @type {?} */ var existingIndex = _this.images.findIndex((/** * @param {?} existingImage * @return {?} */ function (existingImage) { return existingImage.fileContent === image.fileContent; })); // If image doesn't already exist, if (existingIndex === -1) { imagesToAdd.push(image); } })); if (imagesToAdd.length === 0) { reject(CommonImageError.AlreadyExists); return; } _this.images = tslib_1.__spread(_this.images, imagesToAdd); _this.imagesChange.emit(_this.images); resolve(); }))]; }); }); }; /** * @param {?} image * @return {?} */ FileUploaderComponent.prototype.deleteImage = /** * @param {?} image * @return {?} */ function (image) { this.resetFileInput(); this.images = this.images.filter((/** * @param {?} x * @return {?} */ function (x) { return x.uuid !== image.uuid; })); this.imagesChange.emit(this.images); // If there are no images yet, we have to reset the input so it triggers 'required'. if (this.required && this.images.length <= 0) { this.fileControl.setErrors({ required: true }); } }; /** * @private * @return {?} */ FileUploaderComponent.prototype.resetFileInput = /** * @private * @return {?} */ function () { this.browseFileRef.nativeElement.value = ''; }; Object.defineProperty(FileUploaderComponent.prototype, "fileControl", { /** * This is created as a workaround to access the form control that binds to * the input[type='file']. We can't access it via the template name bindings * as that isn't working, so instead we access the parent form and then find * the input by name. */ get: /** * This is created as a workaround to access the form control that binds to * the input[type='file']. We can't access it via the template name bindings * as that isn't working, so instead we access the parent form and then find * the input by name. * @return {?} */ function () { /** @type {?} */ var INPUT_NAME = "fileUploadBrowse-" + this.id; // note - should be "this.controlContainer as NgForm" here, which works, // but fails on compiliation due to secondary entries return ((/** @type {?} */ (this.controlContainer))).controls[INPUT_NAME]; }, enumerable: true, configurable: true }); /** * @private * @param {?} error * @param {?=} image * @return {?} */ FileUploaderComponent.prototype.handleError = /** * @private * @param {?} error * @param {?=} image * @return {?} */ function (error, image) { if (!image) { image = new CommonImage(); } // just add the error to mspImage image.error = error; this.errorDocument.emit(image); }; /** * @private * @param {?} width * @param {?} height * @return {?} */ FileUploaderComponent.prototype.getConstrainedSize = /** * @private * @param {?} width * @param {?} height * @return {?} */ function (width, height) { /** @type {?} */ var targetWidth = width; /** @type {?} */ var targetHeight = height; if (width >= height) { if (width > MAX_IMAGE_WIDTH) { targetWidth = MAX_IMAGE_WIDTH; targetHeight = height * MAX_IMAGE_WIDTH / width; } } else { if (height > MAX_IMAGE_HEIGHT) { targetWidth = width * MAX_IMAGE_HEIGHT / height; targetHeight = MAX_IMAGE_HEIGHT; } } return { width: Math.floor(targetWidth), height: Math.floor(targetHeight) }; }; /** * A special method to force the rendering of this component. This is a workaround * because for some unknown reason, AngularJS2 change detector does not detect the * change of the images Array. */ /** * A special method to force the rendering of this component. This is a workaround * because for some unknown reason, AngularJS2 change detector does not detect the * change of the images Array. * @return {?} */ FileUploaderComponent.prototype.forceRender = /** * A special method to force the rendering of this component. This is a workaround * because for some unknown reason, AngularJS2 change detector does not detect the * change of the images Array. * @return {?} */ function () { this.zone.run((/** * @return {?} */ function () { })); }; /** * @param {?} event * @return {?} */ FileUploaderComponent.prototype.handleKeyDownFileBrowse = /** * @param {?} event * @return {?} */ function (event) { if (event.key === 'Enter') { this.openFileDialog(); } }; FileUploaderComponent.decorators = [ { type: Component, args: [{ selector: 'common-file-uploader', template: "<div class=\"dropzone\"\r\n (dragover)=\"handleDragOver($event)\"\r\n (drop)=\"handleDrop($event)\"\r\n [ngClass]='{\"has-error\": fileControl?.touched && fileControl?.errors?.required}'>\r\n\r\n <div class=\"instruction-zone d-flex align-items-center flex-wrap flex-sm-nowrap flex-column flex-sm-row\">\r\n <i class=\"fa fa-cloud-upload fa-4x d-inline-block upload-icon\"\r\n aria-hidden=\"true\" (click)='openFileDialog()'></i>\r\n\r\n <input type=\"file\"\r\n id=\"fileUploadBrowse-{{id}}\"\r\n #browseFileRef\r\n ngModel\r\n accept=\"image/*,application/pdf\"\r\n style=\"display:none;\"\r\n tabindex=\"0\"\r\n multiple\r\n name='fileUploadBrowse-{{id}}'\r\n [required]='required && images && images.length === 0'\r\n (change)=\"handleChangeFile($event)\"\r\n autocomplete=\"off\"/>\r\n <label for=\"fileUploadBrowse-{{id}}\"\r\n class=\"file-upload-label d-inline-block ml-3\"\r\n tabindex=\"0\"\r\n (keydown)=\"handleKeyDownFileBrowse($event)\">\r\n <span class='h2 color-body'>Select a file</span>\r\n <span class='d-block description'>{{ instructionText }}</span>\r\n </label>\r\n </div>\r\n\r\n <div *ngIf=\"fileControl?.touched\"\r\n role=\"alert\"\r\n class='error-container'\r\n aria-live=\"assertive\">\r\n <common-error-container [displayError]=\"fileControl?.errors?.required\">\r\n {{errorMessages.required}}\r\n </common-error-container>\r\n </div>\r\n\r\n <div class=\"preview-zone\">\r\n <div *ngFor=\"let mspImage of images\"\r\n class=\"preview-item\">\r\n <common-thumbnail [imageObject]=\"mspImage\"\r\n (deleteImage)=\"deleteImage($event)\">\r\n </common-thumbnail>\r\n </div>\r\n\r\n <div class=\"common-thumbnail\">\r\n <div class=\"thumbnail-container\">\r\n <div class=\"image-thumbnail demo-thumbnail\"\r\n (click)='openFileDialog()'>\r\n <i class=\"fa fa-plus fa-3x\"></i>\r\n </div>\r\n <div class=\"action-strip text-primary\">\r\n <a href=\"javascript:void(0)\"\r\n title=\"Add\"\r\n (click)=\"openFileDialog()\">Add</a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n</div>\r\n", encapsulation: ViewEncapsulation.None, viewProviders: [{ provide: ControlContainer, useExisting: forwardRef((/** * @return {?} */ function () { return NgForm; })) }], styles: ["common-file-uploader .color-body{color:#494949}common-file-uploader .description{font-weight:400}common-file-uploader .dropzone{border:2px dashed #d3d3d3;margin-bottom:10px;border-radius:8px;padding:2em 4em}common-file-uploader .dropzone.has-error{border-color:#a94442}common-file-uploader .dropzone .instruction-zone{margin:10px 5px 5px;text-align:left}common-file-uploader .dropzone .instruction-zone input{display:none}common-file-uploader .dropzone .instruction-zone .file-upload-label{color:#494949}common-file-uploader .dropzone .instruction-zone .file-upload-label:hover{text-decoration:none;cursor:pointer}common-file-uploader .dropzone .preview-zone{display:flex;flex-wrap:wrap;justify-content:left;align-items:left}common-file-uploader .dropzone .preview-zone .preview-item{position:relative;height:120px;text-align:left;margin-left:6rem;margin-bottom:1.5rem}common-file-uploader .dropzone .preview-zone .preview-item .icon-upload{opacity:.3;margin:0 auto 15px}common-file-uploader .dropzone .preview-zone .preview-item .icon-upload:hover{cursor:pointer;opacity:.6}common-file-uploader .dropzone .preview-zone .preview-item .text-upload:hover{cursor:pointer}common-file-uploader .dropzone .preview-zone .error-style{color:red;font-weight:700}common-file-uploader .dropzone .mobileShow{display:none}@media only screen and (min-device-width:320px) and (max-device-width:480px){common-file-uploader .dropzone .mobileShow{display:inline}}.common-thumbnail .thumbnail-container,common-thumbnail .thumbnail-container{transition:.3s;-webkit-transform:translateY(0);transform:translateY(0)}.common-thumbnail .thumbnail-container .image-thumbnail,.common-thumbnail .thumbnail-container .image-thumbnail-width-priority,common-thumbnail .thumbnail-container .image-thumbnail,common-thumbnail .thumbnail-container .image-thumbnail-width-priority{padding:2px 2px 0;border-radius:5px 5px 0 0}.common-thumbnail .thumbnail-container .image-thumbnail-width-priority:hover,.common-thumbnail .thumbnail-container .image-thumbnail:hover,common-thumbnail .thumbnail-container .image-thumbnail-width-priority:hover,common-thumbnail .thumbnail-container .image-thumbnail:hover{cursor:zoom-in}.common-thumbnail .thumbnail-container .demo-thumbnail,common-thumbnail .thumbnail-container .demo-thumbnail{height:100px!important;width:100px;background-color:#dee2e6;display:flex;justify-content:center;align-items:center}.common-thumbnail .thumbnail-container .demo-thumbnail:hover,common-thumbnail .thumbnail-container .demo-thumbnail:hover{cursor:pointer!important}.common-thumbnail .thumbnail-container .image-thumbnail,common-thumbnail .thumbnail-container .image-thumbnail{max-height:100px;height:auto;max-width:100%}.common-thumbnail .thumbnail-container .image-thumbnail-width-priority,common-thumbnail .thumbnail-container .image-thumbnail-width-priority{max-width:270px;width:auto;max-height:100%}.common-thumbnail .thumbnail-container:hover,common-thumbnail .thumbnail-container:hover{box-shadow:0 15px 10px -10px rgba(0,0,0,.1);-webkit-transform:translateY(-5px);transform:translateY(-5px)}.common-thumbnail .thumbnail-container:hover .action-strip,common-thumbnail .thumbnail-container:hover .action-strip{background:#ececec}.common-thumbnail .thumbnail-container .action-strip,common-thumbnail .thumbnail-container .action-strip{height:2em;border-radius:0 0 5px 5px;text-align:right;font-size:small;margin:0 2px;color:#a94442;padding:.3em;transition:.3s}.common-thumbnail .thumbnail-container .action-strip a,common-thumbnail .thumbnail-container .action-strip a{text-decoration:none}"] }] } ]; /** @nocollapse */ FileUploaderComponent.ctorParameters = function () { return [ { type: NgZone }, { type: ControlContainer } ]; }; FileUploaderComponent.propDecorators = { browseFileRef: [{ type: ViewChild, args: ['browseFileRef',] }], images: [{ type: Input }], id: [{ type: Input }], showError: [{ type: Input }], required: [{ type: Input }], instructionText: [{ type: Input }], errorMessages: [{ type: Input }], imagesChange: [{ type: Output }], errorDocument: [{ type: Output }] }; return FileUploaderComponent; }(Base)); export { FileUploaderComponent }; if (false) { /** @type {?} */ FileUploaderComponent.prototype.browseFileRef; /** @type {?} */ FileUploaderComponent.prototype.images; /** @type {?} */ FileUploaderComponent.prototype.id; /** @type {?} */ FileUploaderComponent.prototype.showError; /** @type {?} */ FileUploaderComponent.prototype.required; /** @type {?} */ FileUploaderComponent.prototype.instructionText; /** @type {?} */ FileUploaderComponent.prototype.errorMessages; /** @type {?} */ FileUploaderComponent.prototype.imagesChange; /** @type {?} */ FileUploaderComponent.prototype.errorDocument; /** * @type {?} * @private */ FileUploaderComponent.prototype.zone; /** * @type {?} * @private */ FileUploaderComponent.prototype.controlContainer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tb2gtY29tbW9uLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2ZpbGUtdXBsb2FkZXIvZmlsZS11cGxvYWRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFVBQVUsRUFDVixpQkFBaUIsR0FFcEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILE1BQU0sRUFDTixnQkFBZ0IsR0FDbkIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0gsV0FBVyxFQUNYLGdCQUFnQixHQUNuQixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN6QyxPQUFPLEtBQUssTUFBTSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7SUFFakUsS0FBSyxHQUFHLENBQUMsbUJBQUEsTUFBTSxFQUFPLENBQUM7QUFDN0IsS0FBSyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUM7Ozs7QUFFOUIscUNBRUM7OztJQURHLG1DQUFpQjs7Ozs7QUFHckIsbUJBR0M7OztJQUZHLHFCQUFjOztJQUNkLHNCQUFlOzs7SUFHYixvQkFBb0IsR0FBVyxPQUFPOztJQUN0QyxlQUFlLEdBQVcsRUFBRTs7SUFDNUIsZUFBZSxHQUFXLElBQUk7O0lBQzlCLGdCQUFnQixHQUFXLElBQUk7O0lBQy9CLGVBQWUsR0FBVyxHQUFHOztJQUM3QixnQkFBZ0IsR0FBVyxHQUFHOztJQUM5QixvQkFBb0IsR0FBVyxLQUFLOztJQUNwQyxnQkFBZ0IsR0FBVyxHQUFHOztJQUM5QixrQkFBa0IsR0FBRyxZQUFZ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