@netgrif/components-core
Version:
Netgrif Application engine frontend core Angular library
120 lines • 16.2 kB
JavaScript
import { DataField } from '../../models/abstract-data-field';
import { Subject } from 'rxjs';
import { ComponentPrefixes } from '../../models/component';
import { distinctUntilChanged } from 'rxjs/operators';
/**
* Supported types of files a user can select through a file picker.
*/
export var FileUploadMIMEType;
(function (FileUploadMIMEType) {
FileUploadMIMEType["IMAGE"] = "image/*";
FileUploadMIMEType["VIDEO"] = "video/*";
FileUploadMIMEType["AUDIO"] = "audio/*";
FileUploadMIMEType["PDF"] = ".pdf";
FileUploadMIMEType["JPG_JPEG"] = ".jpg,.jpeg";
FileUploadMIMEType["XML"] = ".xml";
FileUploadMIMEType["DOC_DOCX"] = ".doc,.docx";
FileUploadMIMEType["XLS_XLSX"] = ".xls,.xlsx";
})(FileUploadMIMEType || (FileUploadMIMEType = {}));
/**
* Supported types for file preview
*/
export var FilePreviewType;
(function (FilePreviewType) {
FilePreviewType[FilePreviewType["pdf"] = 0] = "pdf";
FilePreviewType[FilePreviewType["jpg"] = 1] = "jpg";
FilePreviewType[FilePreviewType["jpeg"] = 2] = "jpeg";
FilePreviewType[FilePreviewType["png"] = 3] = "png";
})(FilePreviewType || (FilePreviewType = {}));
/**
* Holds information represent file field implements in Petri Net
*/
export class FileField extends DataField {
_maxUploadSizeInBytes;
_allowTypes;
/**
* Specifies the size of all uploaded files in bytes.
*
* It is an indicator for checking the oversized size in the Petri Net.
*/
filesSize = 0;
/**
* Used to forward the result of the upload file backend call to the task content
*/
_changedFields$;
downloaded;
set value(value) {
if (!this.valueEquality(this._value.getValue(), value) && !this.reverting) {
this.changed = true;
this.waitingForResponse = true;
this.resolvePrevValue(value ?? {});
}
this._value.next(value ?? {});
this.reverting = false;
}
get value() {
return this._value.getValue();
}
get updated() {
return this._update.asObservable();
}
getTypedComponentType() {
return ComponentPrefixes.FILE + this.getComponentType();
}
valueWithoutChange(value) {
this.changed = false;
this._value.next(value ?? {});
}
/**
* Create new instance for file field with all his properties.
*
* Placeholder is a substitute for the value name if not set value.
*/
constructor(stringId, title, behavior, value, placeholder, description, layout, _maxUploadSizeInBytes, _allowTypes, validations, component, parentTaskId) {
super(stringId, title, value, behavior, placeholder, description, layout, validations, component, parentTaskId);
this._maxUploadSizeInBytes = _maxUploadSizeInBytes;
this._allowTypes = _allowTypes;
this._changedFields$ = new Subject();
}
get maxUploadSizeInBytes() {
return this._maxUploadSizeInBytes;
}
get allowTypes() {
return this._allowTypes instanceof Array ? this._allowTypes.toString() : this._allowTypes;
}
get changedFields$() {
return this._changedFields$.asObservable();
}
emitChangedFields(change) {
this._changedFields$.next(change);
}
valueEquality(a, b) {
let file = JSON.stringify(a) === JSON.stringify(b);
if (a && a.file && b && b.file) {
file = a.file.name === b.file.name;
}
return (!a && !b) || (!!a && !!b && a.name === b.name && file);
}
registerFormControl(formControl) {
if (this.initialized) {
throw new Error('Data field can be initialized only once!'
+ ' Disconnect the previous form control before initializing the data field again!');
}
this.formControlRef = formControl;
formControl.setValidators(this.resolveFormControlValidators());
this._myValueSubscription = this._value.pipe(distinctUntilChanged(this.valueEquality)).subscribe(newValue => {
this.valid = this._determineFormControlValidity(formControl);
formControl.setValue(newValue?.name ?? '');
this.update();
});
this.updateFormControlState(formControl);
this._initialized$.next(true);
this.changed = false;
this.waitingForResponse = false;
}
updateFormControlState(formControl) {
this.subscribeToInnerSubjects(formControl);
this.update();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1maWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25ldGdyaWYtY29tcG9uZW50cy1jb3JlL3NyYy9saWIvZGF0YS1maWVsZHMvZmlsZS1maWVsZC9tb2RlbHMvZmlsZS1maWVsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFJM0QsT0FBTyxFQUFhLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQVksaUJBQWlCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUlwRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVwRDs7R0FFRztBQUNILE1BQU0sQ0FBTixJQUFZLGtCQVNYO0FBVEQsV0FBWSxrQkFBa0I7SUFDMUIsdUNBQWlCLENBQUE7SUFDakIsdUNBQWlCLENBQUE7SUFDakIsdUNBQWlCLENBQUE7SUFDakIsa0NBQVksQ0FBQTtJQUNaLDZDQUF1QixDQUFBO0lBQ3ZCLGtDQUFZLENBQUE7SUFDWiw2Q0FBdUIsQ0FBQTtJQUN2Qiw2Q0FBdUIsQ0FBQTtBQUMzQixDQUFDLEVBVFcsa0JBQWtCLEtBQWxCLGtCQUFrQixRQVM3QjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksZUFLWDtBQUxELFdBQVksZUFBZTtJQUN2QixtREFBRyxDQUFBO0lBQ0gsbURBQUcsQ0FBQTtJQUNILHFEQUFJLENBQUE7SUFDSixtREFBRyxDQUFBO0FBQ1AsQ0FBQyxFQUxXLGVBQWUsS0FBZixlQUFlLFFBSzFCO0FBV0Q7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBVSxTQUFRLFNBQXlCO0lBZ0RmO0lBQ2pCO0lBaERwQjs7OztPQUlHO0lBQ0ksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUVyQjs7T0FFRztJQUNLLGVBQWUsQ0FBNEI7SUFFNUMsVUFBVSxDQUFVO0lBRTNC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QztJQUNsQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RhdGFGaWVsZH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Fic3RyYWN0LWRhdGEtZmllbGQnO1xuaW1wb3J0IHtCZWhhdmlvcn0gZnJvbSAnLi4vLi4vbW9kZWxzL2JlaGF2aW9yJztcbmltcG9ydCB7TGF5b3V0fSBmcm9tICcuLi8uLi9tb2RlbHMvbGF5b3V0JztcbmltcG9ydCB7RmlsZUZpZWxkVmFsdWV9IGZyb20gJy4vZmlsZS1maWVsZC12YWx1ZSc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtDb21wb25lbnQsIENvbXBvbmVudFByZWZpeGVzfSBmcm9tICcuLi8uLi9tb2RlbHMvY29tcG9uZW50JztcbmltcG9ydCB7Rm9ybUNvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7VmFsaWRhdGlvbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3ZhbGlkYXRpb24nO1xuaW1wb3J0IHtDaGFuZ2VkRmllbGRzTWFwfSBmcm9tICcuLi8uLi8uLi9ldmVudC9zZXJ2aWNlcy9pbnRlcmZhY2VzL2NoYW5nZWQtZmllbGRzLW1hcCc7XG5pbXBvcnQge2Rpc3RpbmN0VW50aWxDaGFuZ2VkfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8qKlxuICogU3VwcG9ydGVkIHR5cGVzIG9mIGZpbGVzIGEgdXNlciBjYW4gc2VsZWN0IHRocm91Z2ggYSBmaWxlIHBpY2tlci5cbiAqL1xuZXhwb3J0IGVudW0gRmlsZVVwbG9hZE1JTUVUeXBlIHtcbiAgICBJTUFHRSA9ICdpbWFnZS8qJyxcbiAgICBWSURFTyA9ICd2aWRlby8qJyxcbiAgICBBVURJTyA9ICdhdWRpby8qJyxcbiAgICBQREYgPSAnLnBkZicsXG4gICAgSlBHX0pQRUcgPSAnLmpwZywuanBlZycsXG4gICAgWE1MID0gJy54bWwnLFxuICAgIERPQ19ET0NYID0gJy5kb2MsLmRvY3gnLFxuICAgIFhMU19YTFNYID0gJy54bHMsLnhsc3gnXG59XG5cbi8qKlxuICogU3VwcG9ydGVkIHR5cGVzIGZvciBmaWxlIHByZXZpZXdcbiAqL1xuZXhwb3J0IGVudW0gRmlsZVByZXZpZXdUeXBlIHtcbiAgICBwZGYsXG4gICAganBnLFxuICAgIGpwZWcsXG4gICAgcG5nXG59XG5cbi8qKlxuICogRXh0ZW5kZWQgc3RydWN0dXJlIGZvciBmaWxlIGJ5IG5hbWUgYW5kIGV4dGVuc2lvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlVXBsb2FkRGF0YU1vZGVsIHtcbiAgICBmaWxlOiBGaWxlO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBleHRlbnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBIb2xkcyBpbmZvcm1hdGlvbiByZXByZXNlbnQgZmlsZSBmaWVsZCBpbXBsZW1lbnRzIGluIFBldHJpIE5ldFxuICovXG5leHBvcnQgY2xhc3MgRmlsZUZpZWxkIGV4dGVuZHMgRGF0YUZpZWxkPEZpbGVGaWVsZFZhbHVlPiB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBzaXplIG9mIGFsbCB1cGxvYWRlZCBmaWxlcyBpbiBieXRlcy5cbiAgICAgKlxuICAgICAqIEl0IGlzIGFuIGluZGljYXRvciBmb3IgY2hlY2tpbmcgdGhlIG92ZXJzaXplZCBzaXplIGluIHRoZSBQZXRyaSBOZXQuXG4gICAgICovXG4gICAgcHVibGljIGZpbGVzU2l6ZSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIGZvcndhcmQgdGhlIHJlc3VsdCBvZiB0aGUgdXBsb2FkIGZpbGUgYmFja2VuZCBjYWxsIHRvIHRoZSB0YXNrIGNvbnRlbnRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jaGFuZ2VkRmllbGRzJDogU3ViamVjdDxDaGFuZ2VkRmllbGRzTWFwPjtcblxuICAgIHB1YmxpYyBkb3dubG9hZGVkOiBib29sZWFuO1xuXG4gICAgc2V0IHZhbHVlKHZhbHVlOiBGaWxlRmllbGRWYWx1ZSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsdWVFcXVhbGl0eSh0aGlzLl92YWx1ZS5nZXRWYWx1ZSgpLCB2YWx1ZSkgJiYgIXRoaXMucmV2ZXJ0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy53YWl0aW5nRm9yUmVzcG9uc2UgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5yZXNvbHZlUHJldlZhbHVlKHZhbHVlID8/IHt9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl92YWx1ZS5uZXh0KHZhbHVlID8/IHt9KTtcbiAgICAgICAgdGhpcy5yZXZlcnRpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXQgdmFsdWUoKTogRmlsZUZpZWxkVmFsdWUge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBnZXQgdXBkYXRlZCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZS5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHlwZWRDb21wb25lbnRUeXBlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBDb21wb25lbnRQcmVmaXhlcy5GSUxFICsgdGhpcy5nZXRDb21wb25lbnRUeXBlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHZhbHVlV2l0aG91dENoYW5nZSh2YWx1ZTogRmlsZUZpZWxkVmFsdWUpIHtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3ZhbHVlLm5leHQodmFsdWUgPz8ge30pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBuZXcgaW5zdGFuY2UgZm9yIGZpbGUgZmllbGQgd2l0aCBhbGwgaGlzIHByb3BlcnRpZXMuXG4gICAgICpcbiAgICAgKiBQbGFjZWhvbGRlciBpcyBhIHN1YnN0aXR1dGUgZm9yIHRoZSB2YWx1ZSBuYW1lIGlmIG5vdCBzZXQgdmFsdWUuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc3RyaW5nSWQ6IHN0cmluZywgdGl0bGU6IHN0cmluZywgYmVoYXZpb3I6IEJlaGF2aW9yLCB2YWx1ZT86IEZpbGVGaWVsZFZhbHVlLCBwbGFjZWhvbGRlcj86IHN0cmluZywgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgbGF5b3V0PzogTGF5b3V0LCBwcml2YXRlIF9tYXhVcGxvYWRTaXplSW5CeXRlcz86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwcml2YXRlIF9hbGxvd1R5cGVzPzogc3RyaW5nIHwgRmlsZVVwbG9hZE1JTUVUeXBlIHwgQXJyYXk8RmlsZVVwbG9hZE1JTUVUeXBlPixcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW9ucz86IEFycmF5PFZhbGlkYXRpb24+LCBjb21wb25lbnQ/OiBDb21wb25lbnQsIHBhcmVudFRhc2tJZD86IHN0cmluZykge1xuICAgICAgICBzdXBlcihzdHJpbmdJZCwgdGl0bGUsIHZhbHVlLCBiZWhhdmlvciwgcGxhY2Vob2xkZXIsIGRlc2NyaXB0aW9uLCBsYXlvdXQsIHZhbGlkYXRpb25zLCBjb21wb25lbnQsIHBhcmVudFRhc2tJZCk7XG4gICAgICAgIHRoaXMuX2NoYW5nZWRGaWVsZHMkID0gbmV3IFN1YmplY3Q8Q2hhbmdlZEZpZWxkc01hcD4oKTtcbiAgICB9XG5cbiAgICBnZXQgbWF4VXBsb2FkU2l6ZUluQnl0ZXMoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21heFVwbG9hZFNpemVJbkJ5dGVzO1xuICAgIH1cblxuICAgIGdldCBhbGxvd1R5cGVzKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbGxvd1R5cGVzIGluc3RhbmNlb2YgQXJyYXkgPyB0aGlzLl9hbGxvd1R5cGVzLnRvU3RyaW5nKCkgOiB0aGlzLl9hbGxvd1R5cGVzO1xuICAgIH1cblxuICAgIGdldCBjaGFuZ2VkRmllbGRzJCgpOiBPYnNlcnZhYmxlPENoYW5nZWRGaWVsZHNNYXA+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoYW5nZWRGaWVsZHMkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBlbWl0Q2hhbmdlZEZpZWxkcyhjaGFuZ2U6IENoYW5nZWRGaWVsZHNNYXApOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2hhbmdlZEZpZWxkcyQubmV4dChjaGFuZ2UpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB2YWx1ZUVxdWFsaXR5KGE6IEZpbGVGaWVsZFZhbHVlLCBiOiBGaWxlRmllbGRWYWx1ZSk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgZmlsZSA9IEpTT04uc3RyaW5naWZ5KGEpID09PSBKU09OLnN0cmluZ2lmeShiKTtcbiAgICAgICAgaWYgKGEgJiYgYS5maWxlICYmIGIgJiYgYi5maWxlKSB7XG4gICAgICAgICAgICBmaWxlID0gYS5maWxlLm5hbWUgPT09IGIuZmlsZS5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoIWEgJiYgIWIpIHx8ICghIWEgJiYgISFiICYmIGEubmFtZSA9PT0gYi5uYW1lICYmIGZpbGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3RlckZvcm1Db250cm9sKGZvcm1Db250cm9sOiBGb3JtQ29udHJvbCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIGZpZWxkIGNhbiBiZSBpbml0aWFsaXplZCBvbmx5IG9uY2UhJ1xuICAgICAgICAgICAgICAgICsgJyBEaXNjb25uZWN0IHRoZSBwcmV2aW91cyBmb3JtIGNvbnRyb2wgYmVmb3JlIGluaXRpYWxpemluZyB0aGUgZGF0YSBmaWVsZCBhZ2FpbiEnKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvcm1Db250cm9sUmVmID0gZm9ybUNvbnRyb2w7XG4gICAgICAgIGZvcm1Db250cm9sLnNldFZhbGlkYXRvcnModGhpcy5yZXNvbHZlRm9ybUNvbnRyb2xWYWxpZGF0b3JzKCkpO1xuXG4gICAgICAgIHRoaXMuX215VmFsdWVTdWJzY3JpcHRpb24gPSB0aGlzLl92YWx1ZS5waXBlKFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQodGhpcy52YWx1ZUVxdWFsaXR5KVxuICAgICAgICApLnN1YnNjcmliZShuZXdWYWx1ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkID0gdGhpcy5fZGV0ZXJtaW5lRm9ybUNvbnRyb2xWYWxpZGl0eShmb3JtQ29udHJvbCk7XG4gICAgICAgICAgICBmb3JtQ29udHJvbC5zZXRWYWx1ZShuZXdWYWx1ZT8ubmFtZSA/PyAnJyk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUZvcm1Db250cm9sU3RhdGUoZm9ybUNvbnRyb2wpO1xuICAgICAgICB0aGlzLl9pbml0aWFsaXplZCQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMud2FpdGluZ0ZvclJlc3BvbnNlID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUZvcm1Db250cm9sU3RhdGUoZm9ybUNvbnRyb2w6IEZvcm1Db250cm9sKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaWJlVG9Jbm5lclN1YmplY3RzKGZvcm1Db250cm9sKTtcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG59XG4iXX0=