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
JavaScript
/**
* @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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