@klippa/ngx-enhancy-forms 9.4.1 → 9.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/klippa-ngx-enhancy-forms.umd.js +24 -5
- package/bundles/klippa-ngx-enhancy-forms.umd.js.map +1 -1
- package/bundles/klippa-ngx-enhancy-forms.umd.min.js +2 -2
- package/bundles/klippa-ngx-enhancy-forms.umd.min.js.map +1 -1
- package/esm2015/lib/elements/file-input/file-input.component.js +18 -5
- package/esm2015/lib/form/form-element/form-element.component.js +7 -3
- package/esm2015/lib/form/form.component.js +3 -1
- package/fesm2015/klippa-ngx-enhancy-forms.js +24 -5
- package/fesm2015/klippa-ngx-enhancy-forms.js.map +1 -1
- package/klippa-ngx-enhancy-forms.metadata.json +1 -1
- package/lib/elements/file-input/file-input.component.d.ts +5 -0
- package/lib/form/form-element/form-element.component.d.ts +1 -0
- package/lib/form/form.component.d.ts +1 -0
- package/package.json +1 -1
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
this.parent = parent;
|
|
48
48
|
this.subFormPlaceholder = subFormPlaceholder;
|
|
49
49
|
this.showErrorMessages = true;
|
|
50
|
+
this.errorMessageLocation = 'belowCaption';
|
|
50
51
|
// we keep track of what form controls are actually rendered. Only those count when looking at form validation
|
|
51
52
|
this.activeControls = [];
|
|
52
53
|
}
|
|
@@ -199,6 +200,7 @@
|
|
|
199
200
|
]; };
|
|
200
201
|
FormComponent.propDecorators = {
|
|
201
202
|
showErrorMessages: [{ type: core.Input }],
|
|
203
|
+
errorMessageLocation: [{ type: core.Input }],
|
|
202
204
|
formGroup: [{ type: core.Input }],
|
|
203
205
|
patchValueInterceptor: [{ type: core.Input }]
|
|
204
206
|
};
|
|
@@ -294,13 +296,17 @@
|
|
|
294
296
|
var _a, _b, _c;
|
|
295
297
|
return (_c = (_b = (_a = this.customMessages) === null || _a === void 0 ? void 0 : _a[key]) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : this.errorMessages[key];
|
|
296
298
|
};
|
|
299
|
+
FormElementComponent.prototype.getErrorLocation = function () {
|
|
300
|
+
var _a, _b;
|
|
301
|
+
return (_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a.errorMessageLocation) !== null && _b !== void 0 ? _b : 'belowCaption';
|
|
302
|
+
};
|
|
297
303
|
return FormElementComponent;
|
|
298
304
|
}());
|
|
299
305
|
FormElementComponent.decorators = [
|
|
300
306
|
{ type: core.Component, args: [{
|
|
301
307
|
selector: 'klp-form-element',
|
|
302
|
-
template: "<ng-template #errorRef>\n\t<div *ngIf=\"shouldShowErrorMessages() && getErrorToShow()\" class=\"errorContainer\" [ngClass]=\"{hasCaption: caption || captionRef, 'd30-70': spaceDistribution === '30-70'}\">\n\t\t<div *ngIf=\"showDefaultError('min')\">{{substituteParameters(getErrorMessage(\"min\"), {min: attachedControl.errors.min.min})}}</div>\n\t\t<div *ngIf=\"showDefaultError('max')\">{{substituteParameters(getErrorMessage(\"max\"), {max: attachedControl.errors.max.max})}}</div>\n\t\t<div *ngIf=\"showDefaultError('required')\">{{getErrorMessage(\"required\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('email')\">{{getErrorMessage(\"email\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('minlength')\">{{substituteParameters(getErrorMessage(\"minLength\"), {minLength: attachedControl.errors.minlength.requiredLength})}}</div>\n\t\t<div *ngIf=\"showDefaultError('maxlength')\">{{substituteParameters(getErrorMessage(\"maxLength\"), {maxLength: attachedControl.errors.maxlength.requiredLength})}}</div>\n\t\t<div *ngIf=\"showDefaultError('pattern')\">{{getErrorMessage(\"pattern\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('MatchPassword')\">{{getErrorMessage(\"matchPassword\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('date')\">{{getErrorMessage(\"date\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('message')\">{{attachedControl.errors.message.value}}</div>\n\t\t<div [ngTemplateOutlet]=\"getCustomErrorHandler(getErrorToShow())?.templateRef\"></div>\n\t</div>\n</ng-template>\n\n<ng-container *ngIf=\"direction === 'horizontal'\" [ngTemplateOutlet]=\"errorRef\"></ng-container>\n\n<div class=\"componentContainer\" [ngClass]=\"{hasCaption: caption || captionRef, vertical: direction === 'vertical', reverseOrder: swapInputAndCaption}\" #internalComponentRef>\n\t<div class=\"caption\" *ngIf=\"caption || captionRef\"
|
|
303
|
-
styles: [":host{display:block}.componentContainer{align-items:center;display:flex;min-height:42px}.componentContainer:not(.hasCaption){display:block}.componentContainer:not(.hasCaption) .inputContainer{margin-top:0}.componentContainer.reverseOrder{flex-direction:row-reverse;justify-content:flex-end}.componentContainer.vertical{display:block}.componentContainer.vertical .inputContainer{margin-top:.3125rem}.componentContainer.vertical .errorContainer{margin-left:0}.componentContainer.vertical .caption{padding-right:0}.captionRefContainer{display:flex}.caption{color:#515365;flex:0 0 auto;font-weight:700;padding-right:1.25rem}.caption.percentageSpacing{flex:0 0 40%}.caption.percentageSpacing.d30-70{flex-basis:30%}.caption.hasErrors{color:#ff8000}.inputContainer{flex:1}.inputContainer.percentageSpacing{flex:0 0 60%}.inputContainer.percentageSpacing.d30-70{flex-basis:70%}.errorContainer{color:#ff8000}.errorContainer.hasCaption{margin-left:40%}.errorContainer.hasCaption.d30-70{margin-left:30%}"]
|
|
308
|
+
template: "<ng-template #errorRef>\n\t<div *ngIf=\"shouldShowErrorMessages() && getErrorToShow()\" class=\"errorContainer\" [ngClass]=\"{hasCaption: caption || captionRef, 'd30-70': spaceDistribution === '30-70'}\">\n\t\t<div *ngIf=\"showDefaultError('min')\">{{substituteParameters(getErrorMessage(\"min\"), {min: attachedControl.errors.min.min})}}</div>\n\t\t<div *ngIf=\"showDefaultError('max')\">{{substituteParameters(getErrorMessage(\"max\"), {max: attachedControl.errors.max.max})}}</div>\n\t\t<div *ngIf=\"showDefaultError('required')\">{{getErrorMessage(\"required\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('email')\">{{getErrorMessage(\"email\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('minlength')\">{{substituteParameters(getErrorMessage(\"minLength\"), {minLength: attachedControl.errors.minlength.requiredLength})}}</div>\n\t\t<div *ngIf=\"showDefaultError('maxlength')\">{{substituteParameters(getErrorMessage(\"maxLength\"), {maxLength: attachedControl.errors.maxlength.requiredLength})}}</div>\n\t\t<div *ngIf=\"showDefaultError('pattern')\">{{getErrorMessage(\"pattern\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('MatchPassword')\">{{getErrorMessage(\"matchPassword\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('date')\">{{getErrorMessage(\"date\")}}</div>\n\t\t<div *ngIf=\"showDefaultError('message')\">{{attachedControl.errors.message.value}}</div>\n\t\t<div [ngTemplateOutlet]=\"getCustomErrorHandler(getErrorToShow())?.templateRef\"></div>\n\t</div>\n</ng-template>\n\n<ng-container *ngIf=\"direction === 'horizontal'\" [ngTemplateOutlet]=\"errorRef\"></ng-container>\n\n<div class=\"componentContainer\" [ngClass]=\"{hasCaption: caption || captionRef, vertical: direction === 'vertical', reverseOrder: swapInputAndCaption}\" #internalComponentRef>\n\t<div class=\"caption\" *ngIf=\"caption || captionRef\"\n\t\t[ngClass]=\"{\n\t\t\thasErrors: getErrorToShow() && attachedControl.touched,\n\t\t\tpercentageSpacing: captionSpacing === 'percentages', 'd30-70': spaceDistribution === '30-70',\n\t\t\twithErrorRightOfCaption: getErrorLocation() === 'rightOfCaption'\n\t\t}\"\n\t>\n\t\t<div *ngIf=\"captionRef\" class=\"captionRefContainer\">\n\t\t\t<ng-container [ngTemplateOutlet]=\"captionRef\"></ng-container>\n\t\t\t<div *ngIf=\"isRequired()\"> *</div>\n\t\t</div>\n\t\t<div *ngIf=\"!captionRef\">{{caption}}<span *ngIf=\"isRequired()\"> *</span></div>\n\t\t<div class=\"rightOfCaptionError\">\n\t\t\t<ng-container *ngIf=\"direction === 'vertical' && getErrorLocation() === 'rightOfCaption'\" [ngTemplateOutlet]=\"errorRef\"></ng-container>\n\t\t</div>\n\t</div>\n\t<ng-container *ngIf=\"direction === 'vertical' && getErrorLocation() === 'belowCaption'\" [ngTemplateOutlet]=\"errorRef\"></ng-container>\n\t<div class=\"inputContainer\" [ngClass]=\"{ percentageSpacing: captionSpacing === 'percentages', 'd30-70': spaceDistribution === '30-70' }\">\n\t\t<ng-content></ng-content>\n\t</div>\n</div>\n",
|
|
309
|
+
styles: [":host{display:block}.componentContainer{align-items:center;display:flex;min-height:42px}.componentContainer:not(.hasCaption){display:block}.componentContainer:not(.hasCaption) .inputContainer{margin-top:0}.componentContainer.reverseOrder{flex-direction:row-reverse;justify-content:flex-end}.componentContainer.vertical{display:block}.componentContainer.vertical .inputContainer{margin-top:.3125rem}.componentContainer.vertical .errorContainer{margin-left:0}.componentContainer.vertical .caption{padding-right:0}.captionRefContainer{display:flex}.caption{color:#515365;flex:0 0 auto;font-weight:700;padding-right:1.25rem}.caption.percentageSpacing{flex:0 0 40%}.caption.percentageSpacing.d30-70{flex-basis:30%}.caption.hasErrors{color:#ff8000}.caption.withErrorRightOfCaption{display:flex;gap:2.5rem;justify-content:space-between}.caption.withErrorRightOfCaption .rightOfCaptionError{font-weight:400;overflow:hidden}.caption.withErrorRightOfCaption .rightOfCaptionError *{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.inputContainer{flex:1}.inputContainer.percentageSpacing{flex:0 0 60%}.inputContainer.percentageSpacing.d30-70{flex-basis:70%}.errorContainer{color:#ff8000}.errorContainer.hasCaption{margin-left:40%}.errorContainer.hasCaption.d30-70{margin-left:30%}"]
|
|
304
310
|
},] }
|
|
305
311
|
];
|
|
306
312
|
FormElementComponent.ctorParameters = function () { return [
|
|
@@ -1832,6 +1838,8 @@
|
|
|
1832
1838
|
var _this = _super.apply(this, __spread(arguments)) || this;
|
|
1833
1839
|
_this.isLoading = false;
|
|
1834
1840
|
_this.clearable = false;
|
|
1841
|
+
_this.onlyShowUploadButton = false;
|
|
1842
|
+
_this.useFullParentSize = false;
|
|
1835
1843
|
return _this;
|
|
1836
1844
|
}
|
|
1837
1845
|
FileInputComponent.prototype.onChange = function (files) {
|
|
@@ -1840,6 +1848,8 @@
|
|
|
1840
1848
|
result.push(files.item(i));
|
|
1841
1849
|
}
|
|
1842
1850
|
this.setInnerValueAndNotify(result);
|
|
1851
|
+
// to make sure we can select the same file again
|
|
1852
|
+
this.fileInputEl.nativeElement.value = null;
|
|
1843
1853
|
};
|
|
1844
1854
|
FileInputComponent.prototype.getFileNames = function () {
|
|
1845
1855
|
if (Array.isArray(this.innerValue)) {
|
|
@@ -1851,6 +1861,9 @@
|
|
|
1851
1861
|
return null;
|
|
1852
1862
|
};
|
|
1853
1863
|
FileInputComponent.prototype.shouldShowClearButton = function () {
|
|
1864
|
+
if (this.onlyShowUploadButton) {
|
|
1865
|
+
return false;
|
|
1866
|
+
}
|
|
1854
1867
|
if (this.multiple) {
|
|
1855
1868
|
if (arrayIsSetAndFilled(this.innerValue)) {
|
|
1856
1869
|
return true;
|
|
@@ -1862,19 +1875,25 @@
|
|
|
1862
1875
|
}
|
|
1863
1876
|
return false;
|
|
1864
1877
|
};
|
|
1878
|
+
FileInputComponent.prototype.uploadFileClicked = function () {
|
|
1879
|
+
this.fileInputEl.nativeElement.click();
|
|
1880
|
+
};
|
|
1865
1881
|
return FileInputComponent;
|
|
1866
1882
|
}(MultipleValueAccessorBase));
|
|
1867
1883
|
FileInputComponent.decorators = [
|
|
1868
1884
|
{ type: core.Component, args: [{
|
|
1869
1885
|
selector: 'klp-form-file-input',
|
|
1870
|
-
template: "<div class=\"componentContainer\">\n\t<klp-form-button class=\"uploadButton\" [isLoading]=\"isLoading\">\n\t\tUpload a file\n\t\t<input\n\t\t\ttype=\"file\"\n\t\t\t(change)=\"onChange($event.target.files)\"\n\t\t\t[multiple]=\"multiple\"\n\t\t\t[disabled]=\"disabled\"\n\t\t>\n\t</
|
|
1886
|
+
template: "<div class=\"componentContainer\" [ngClass]=\"{fullParentSize: useFullParentSize}\">\n\t<div class=\"buttonContainer\">\n\t\t<klp-form-button class=\"uploadButton\" [isLoading]=\"isLoading\" (click)=\"uploadFileClicked()\">\n\t\t\tUpload a file\n\t\t</klp-form-button>\n\t\t<input\n\t\t\ttype=\"file\"\n\t\t\t#fileInput\n\t\t\t(change)=\"onChange($event.target.files)\"\n\t\t\t[multiple]=\"multiple\"\n\t\t\t[disabled]=\"disabled\"\n\t\t>\n\t</div>\n\t<div class=\"fileName\" *ngIf=\"!onlyShowUploadButton\">\n\t\t{{getFileNames()}}\n\t</div>\n\t<klp-form-button class=\"clearButton\" variant=\"white\" *ngIf=\"shouldShowClearButton()\" (click)=\"resetToNull()\">X</klp-form-button>\n</div>\n",
|
|
1871
1887
|
providers: [{ provide: forms.NG_VALUE_ACCESSOR, useExisting: FileInputComponent, multi: true }],
|
|
1872
|
-
styles: [":host{display:block}:host input:disabled{cursor:not-allowed}.componentContainer{align-items:center;display:flex}.
|
|
1888
|
+
styles: [":host{display:block}:host input:disabled{cursor:not-allowed}.componentContainer{align-items:center;display:flex}.componentContainer.fullParentSize{height:100%;justify-content:center;position:relative}.componentContainer:not(.fullParentSize) .buttonContainer{position:relative}.componentContainer .buttonContainer{flex:0 0 auto}input{bottom:0;cursor:pointer;left:0;opacity:0;position:absolute;right:0;top:0}.fileName{color:#515365;flex:1 1 0px;margin-left:.625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.clearButton{flex:0 0 auto}"]
|
|
1873
1889
|
},] }
|
|
1874
1890
|
];
|
|
1875
1891
|
FileInputComponent.propDecorators = {
|
|
1876
1892
|
isLoading: [{ type: core.Input }],
|
|
1877
|
-
clearable: [{ type: core.Input }]
|
|
1893
|
+
clearable: [{ type: core.Input }],
|
|
1894
|
+
onlyShowUploadButton: [{ type: core.Input }],
|
|
1895
|
+
useFullParentSize: [{ type: core.Input }],
|
|
1896
|
+
fileInputEl: [{ type: core.ViewChild, args: ['fileInput',] }]
|
|
1878
1897
|
};
|
|
1879
1898
|
|
|
1880
1899
|
var SortableGroupedItemsComponent = /** @class */ (function (_super) {
|