@tehw0lf/contact-form 0.14.3 → 0.17.1
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/README.md +45 -46
- package/esm2022/index.mjs +2 -0
- package/esm2022/lib/contact-form/contact-form.component.mjs +115 -0
- package/fesm2022/tehw0lf-contact-form.mjs +122 -0
- package/fesm2022/tehw0lf-contact-form.mjs.map +1 -0
- package/index.d.ts +0 -1
- package/lib/contact-form/contact-form.component.d.ts +28 -20
- package/package.json +14 -25
- package/esm2020/index.mjs +0 -3
- package/esm2020/lib/contact-form/contact-form.component.mjs +0 -97
- package/esm2020/lib/contact-form.module.mjs +0 -42
- package/esm2020/lib/email-api.service.mjs +0 -32
- package/fesm2015/tehw0lf-contact-form.mjs +0 -166
- package/fesm2015/tehw0lf-contact-form.mjs.map +0 -1
- package/fesm2020/tehw0lf-contact-form.mjs +0 -166
- package/fesm2020/tehw0lf-contact-form.mjs.map +0 -1
- package/lib/contact-form.module.d.ts +0 -13
- package/lib/email-api.service.d.ts +0 -13
- package/schematics/collection.json +0 -16
- package/schematics/ng-add/index.d.ts +0 -3
- package/schematics/ng-add/index.js +0 -46
- package/schematics/ng-add/index.js.map +0 -1
- package/schematics/ng-add/index.spec.d.ts +0 -1
- package/schematics/ng-add/index.spec.js +0 -102
- package/schematics/ng-add/index.spec.js.map +0 -1
- package/schematics/ng-add/package-config.d.ts +0 -12
- package/schematics/ng-add/package-config.js +0 -48
- package/schematics/ng-add/package-config.js.map +0 -1
- package/schematics/ng-add/schema.d.ts +0 -3
- package/schematics/ng-add/schema.js +0 -3
- package/schematics/ng-add/schema.js.map +0 -1
- package/schematics/ng-add/schema.json +0 -16
- package/schematics/ng-add/setup.d.ts +0 -3
- package/schematics/ng-add/setup.js +0 -50
- package/schematics/ng-add/setup.js.map +0 -1
- package/schematics/testing/file-content.d.ts +0 -10
- package/schematics/testing/file-content.js +0 -13
- package/schematics/testing/file-content.js.map +0 -1
- package/schematics/testing/test-app.d.ts +0 -12
- package/schematics/testing/test-app.js +0 -44
- package/schematics/testing/test-app.js.map +0 -1
- package/schematics/testing/test-library.d.ts +0 -11
- package/schematics/testing/test-library.js +0 -21
- package/schematics/testing/test-library.js.map +0 -1
- package/schematics/testing/test-project.d.ts +0 -11
- package/schematics/testing/test-project.js +0 -29
- package/schematics/testing/test-project.js.map +0 -1
- /package/{esm2020 → esm2022}/tehw0lf-contact-form.mjs +0 -0
package/README.md
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
# contact-form
|
|
2
2
|
|
|
3
3
|
This provides a simple way to let your users contact you.
|
|
4
|
-
The component takes as input an API-URL.
|
|
5
|
-
|
|
6
|
-
Default is 'https://forwardmethis.com/tehwolf@pm.me' - please change it, as you will need to confirm the API access for the first email you will receive.
|
|
7
4
|
|
|
8
5
|
## Installation
|
|
9
6
|
|
|
@@ -13,12 +10,11 @@ The following dependencies are needed:
|
|
|
13
10
|
|
|
14
11
|
```bash
|
|
15
12
|
@angular/animations
|
|
16
|
-
@angular/cdk
|
|
17
13
|
@angular/common
|
|
18
14
|
@angular/core
|
|
19
|
-
@angular/flex-layout
|
|
20
15
|
@angular/forms
|
|
21
|
-
@
|
|
16
|
+
@ngx-formly/core
|
|
17
|
+
@ngx-formly/material
|
|
22
18
|
```
|
|
23
19
|
|
|
24
20
|
### Module
|
|
@@ -28,37 +24,64 @@ Run `ng add @tehw0lf/contact-form` in the workspace root of your angular applica
|
|
|
28
24
|
|
|
29
25
|
## Usage
|
|
30
26
|
|
|
31
|
-
The contact form component takes an
|
|
27
|
+
The contact form component takes an apiCallback returning a boolean Observable as mandatory input. By default, this is set to a dummy function that returns true if the form's value contains a name and false if not. A more verbose error message can be provided by updating sendErrorMessage with the error message dynamically from the callback.
|
|
28
|
+
|
|
29
|
+
A form can be generated from an arbitrary model. By default, the form contains name, email and message fields.
|
|
32
30
|
|
|
33
31
|
```html
|
|
34
|
-
<contact-form
|
|
35
|
-
[apiURL]="emailBackendURL"
|
|
36
|
-
[email]="yourEmailAddress"
|
|
37
|
-
></contact-form>
|
|
32
|
+
<contact-form [apiCallback]="apiCallback"></contact-form>
|
|
38
33
|
```
|
|
39
34
|
|
|
40
|
-
In your component, set the `
|
|
35
|
+
In your component, set the `apiCallback` property. The naming of these variables is arbitrary:
|
|
41
36
|
|
|
42
37
|
```ts
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
39
|
+
apiCallback = (formValue: any) => {
|
|
40
|
+
// run logic and send to api, return true on success and false on failure
|
|
41
|
+
// update sendErrorText input with error text for more verbose error message
|
|
42
|
+
if (formValue.name) {
|
|
43
|
+
return of(true);
|
|
44
|
+
} else {
|
|
45
|
+
return of(false);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
45
48
|
```
|
|
46
49
|
|
|
47
|
-
|
|
50
|
+
On submitting the form, your API callback will be executed. The status will be reflected by a message that can be overridden by setting `sendErrorText` and `sendSuccessfulText`.
|
|
51
|
+
|
|
52
|
+
## Form Generation
|
|
53
|
+
|
|
54
|
+
In order to generate the form, a config array can be provided. By default, the config array contains name, email and message fields without default values.
|
|
48
55
|
|
|
49
|
-
```
|
|
50
|
-
{
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
56
|
+
```ts
|
|
57
|
+
interface FormConfigEntry {
|
|
58
|
+
field: string;
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
|
+
value?: any;
|
|
61
|
+
required?: boolean;
|
|
62
|
+
type?: string;
|
|
54
63
|
}
|
|
64
|
+
|
|
65
|
+
formConfig: FormConfigEntry[] = [
|
|
66
|
+
{ field: 'name', required: true },
|
|
67
|
+
{ field: 'email', required: true },
|
|
68
|
+
{ field: 'message', required: true, type: 'textarea' }
|
|
69
|
+
];
|
|
55
70
|
```
|
|
56
71
|
|
|
57
|
-
|
|
72
|
+
## Text
|
|
73
|
+
|
|
74
|
+
The message texts can optionally be specified.
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
sendSuccessfulText; //'E-Mail successfully sent';
|
|
78
|
+
|
|
79
|
+
sendErrorText; //'Send error';
|
|
80
|
+
```
|
|
58
81
|
|
|
59
82
|
## Theming
|
|
60
83
|
|
|
61
|
-
The styles of form background, button
|
|
84
|
+
The styles of form background, button and text can be customized with optional input parameters:
|
|
62
85
|
|
|
63
86
|
```ts
|
|
64
87
|
buttonStyle; /* {
|
|
@@ -74,33 +97,9 @@ formStyle; /* {
|
|
|
74
97
|
'box-shadow': '0 2px 10px rgba(0, 0, 0, 0.075)'
|
|
75
98
|
}*/
|
|
76
99
|
|
|
77
|
-
inputStyle; /* {
|
|
78
|
-
border: 'none',
|
|
79
|
-
color: '#282b2e',
|
|
80
|
-
'background-color': '#fff'
|
|
81
|
-
}*/
|
|
82
|
-
|
|
83
100
|
textStyle; //{ color: '#cc7832' };
|
|
84
101
|
```
|
|
85
102
|
|
|
86
|
-
## Text
|
|
87
|
-
|
|
88
|
-
You can specify your own texts for the fields and labels, or leave the default English version
|
|
89
|
-
|
|
90
|
-
```ts
|
|
91
|
-
nameLabel; //'Your Name';
|
|
92
|
-
|
|
93
|
-
emailAddressLabel; //'Your E-Mail Address';
|
|
94
|
-
|
|
95
|
-
messageLabel; //'Your Message';
|
|
96
|
-
|
|
97
|
-
sendText; //'Send';
|
|
98
|
-
|
|
99
|
-
sendSuccessfulText; //'E-Mail successfully sent';
|
|
100
|
-
|
|
101
|
-
sendErrorText; //'Send error';
|
|
102
|
-
```
|
|
103
|
-
|
|
104
103
|
## Development
|
|
105
104
|
|
|
106
105
|
### Serve
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from './lib/contact-form/contact-form.component';
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2NvbnRhY3QtZm9ybS9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQ0FBMkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2NvbnRhY3QtZm9ybS9jb250YWN0LWZvcm0uY29tcG9uZW50JztcbiJdfQ==
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { LayoutModule } from '@angular/cdk/layout';
|
|
2
|
+
import { AsyncPipe, NgStyle } from '@angular/common';
|
|
3
|
+
import { Component, Input, ViewEncapsulation } from '@angular/core';
|
|
4
|
+
import { FormGroup, ReactiveFormsModule } from '@angular/forms';
|
|
5
|
+
import { FormlyModule } from '@ngx-formly/core';
|
|
6
|
+
import { FormlyMaterialModule } from '@ngx-formly/material';
|
|
7
|
+
import { Subject } from 'rxjs';
|
|
8
|
+
import { takeUntil, tap } from 'rxjs/operators';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/forms";
|
|
11
|
+
import * as i2 from "@ngx-formly/core";
|
|
12
|
+
export class ContactFormComponent {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.buttonStyle = {
|
|
15
|
+
'background-color': '#333333',
|
|
16
|
+
border: 'none',
|
|
17
|
+
color: '#cc7832'
|
|
18
|
+
};
|
|
19
|
+
this.formStyle = {
|
|
20
|
+
color: '#437da8',
|
|
21
|
+
'background-color': 'rgba(34, 34, 34, 0.75)',
|
|
22
|
+
'backdrop-filter': 'blur(50px)',
|
|
23
|
+
'box-shadow': '0 2px 10px rgba(0, 0, 0, 0.075)'
|
|
24
|
+
};
|
|
25
|
+
this.textStyle = { color: '#cc7832' };
|
|
26
|
+
this.sendText = 'Send';
|
|
27
|
+
this.sendSuccessfulText = 'E-Mail successfully sent';
|
|
28
|
+
this.sendErrorText = 'Send error';
|
|
29
|
+
this.formConfig = [
|
|
30
|
+
{ field: 'name', required: true },
|
|
31
|
+
{ field: 'email', required: true },
|
|
32
|
+
{ field: 'message', required: true, type: 'textarea' }
|
|
33
|
+
];
|
|
34
|
+
this.form = new FormGroup({});
|
|
35
|
+
this.fields = [];
|
|
36
|
+
this.model = {};
|
|
37
|
+
this.emailSent = new Subject();
|
|
38
|
+
this.emailSent$ = this.emailSent.asObservable();
|
|
39
|
+
this.unsubscribe$ = new Subject();
|
|
40
|
+
this.emailSent.next(null);
|
|
41
|
+
}
|
|
42
|
+
ngOnInit() {
|
|
43
|
+
this.buildConfig();
|
|
44
|
+
}
|
|
45
|
+
ngOnDestroy() {
|
|
46
|
+
this.unsubscribe$.next();
|
|
47
|
+
this.unsubscribe$.complete();
|
|
48
|
+
}
|
|
49
|
+
submitFormData(formData) {
|
|
50
|
+
this.apiCallback(formData)
|
|
51
|
+
.pipe(tap((success) => this.emailSent.next(success)), takeUntil(this.unsubscribe$))
|
|
52
|
+
.subscribe();
|
|
53
|
+
}
|
|
54
|
+
buildConfig() {
|
|
55
|
+
this.formConfig.forEach((entry) => {
|
|
56
|
+
if (entry.value) {
|
|
57
|
+
this.model[entry.field] = entry.value;
|
|
58
|
+
}
|
|
59
|
+
this.fields.push({
|
|
60
|
+
key: entry.field,
|
|
61
|
+
type: entry.type ? entry.type : 'input',
|
|
62
|
+
props: {
|
|
63
|
+
label: entry.field.toLocaleUpperCase(),
|
|
64
|
+
placeholder: 'Enter ' + entry.field,
|
|
65
|
+
required: true,
|
|
66
|
+
attributes: { style: this.flattenStyle(this.textStyle) }
|
|
67
|
+
},
|
|
68
|
+
templateOptions: entry.type === 'textarea'
|
|
69
|
+
? {
|
|
70
|
+
autosize: true,
|
|
71
|
+
minRows: 5,
|
|
72
|
+
maxRows: 10
|
|
73
|
+
}
|
|
74
|
+
: {}
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
flattenStyle(styleObject) {
|
|
79
|
+
return Object.entries(styleObject)
|
|
80
|
+
.flatMap((entry) => {
|
|
81
|
+
return `${entry[0]}: ${entry[1]};`;
|
|
82
|
+
})
|
|
83
|
+
.join('');
|
|
84
|
+
}
|
|
85
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ContactFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
86
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: ContactFormComponent, isStandalone: true, selector: "contact-form", inputs: { buttonStyle: "buttonStyle", formStyle: "formStyle", textStyle: "textStyle", sendText: "sendText", sendSuccessfulText: "sendSuccessfulText", sendErrorText: "sendErrorText", formConfig: "formConfig", apiCallback: "apiCallback" }, ngImport: i0, template: "<form\n [ngStyle]=\"formStyle\"\n class=\"contact-form flex-column flex-fxflex\"\n [formGroup]=\"form\"\n (ngSubmit)=\"submitFormData(model)\"\n>\n <formly-form [form]=\"form\" [fields]=\"fields\" [model]=\"model\"></formly-form>\n <button\n [ngStyle]=\"buttonStyle\"\n class=\"form-button\"\n type=\"submit\"\n [disabled]=\"!form.valid\"\n >\n {{ sendText }}\n </button>\n <div [ngStyle]=\"textStyle\" class=\"form-status\">\n @if ((emailSent$ | async) === true) {\n {{ sendSuccessfulText }}\n } @else if ((emailSent$ | async) === false) {\n {{ sendErrorText }}\n }\n </div>\n</form>\n", styles: [".contact-form{max-width:500px;margin:auto;padding:40px 40px 30px;box-sizing:border-box}.form-button{margin-top:.33rem;display:block;border-radius:.25rem;height:36px;width:100%;padding:.375rem .75rem}.form-status{height:19px;margin-top:1rem}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}\n"], dependencies: [{ kind: "ngmodule", type: LayoutModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i2.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "ngmodule", type: FormlyMaterialModule }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
87
|
+
}
|
|
88
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ContactFormComponent, decorators: [{
|
|
89
|
+
type: Component,
|
|
90
|
+
args: [{ selector: 'contact-form', encapsulation: ViewEncapsulation.None, standalone: true, imports: [
|
|
91
|
+
LayoutModule,
|
|
92
|
+
ReactiveFormsModule,
|
|
93
|
+
FormlyModule,
|
|
94
|
+
FormlyMaterialModule,
|
|
95
|
+
NgStyle,
|
|
96
|
+
AsyncPipe
|
|
97
|
+
], template: "<form\n [ngStyle]=\"formStyle\"\n class=\"contact-form flex-column flex-fxflex\"\n [formGroup]=\"form\"\n (ngSubmit)=\"submitFormData(model)\"\n>\n <formly-form [form]=\"form\" [fields]=\"fields\" [model]=\"model\"></formly-form>\n <button\n [ngStyle]=\"buttonStyle\"\n class=\"form-button\"\n type=\"submit\"\n [disabled]=\"!form.valid\"\n >\n {{ sendText }}\n </button>\n <div [ngStyle]=\"textStyle\" class=\"form-status\">\n @if ((emailSent$ | async) === true) {\n {{ sendSuccessfulText }}\n } @else if ((emailSent$ | async) === false) {\n {{ sendErrorText }}\n }\n </div>\n</form>\n", styles: [".contact-form{max-width:500px;margin:auto;padding:40px 40px 30px;box-sizing:border-box}.form-button{margin-top:.33rem;display:block;border-radius:.25rem;height:36px;width:100%;padding:.375rem .75rem}.form-status{height:19px;margin-top:1rem}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}\n"] }]
|
|
98
|
+
}], ctorParameters: () => [], propDecorators: { buttonStyle: [{
|
|
99
|
+
type: Input
|
|
100
|
+
}], formStyle: [{
|
|
101
|
+
type: Input
|
|
102
|
+
}], textStyle: [{
|
|
103
|
+
type: Input
|
|
104
|
+
}], sendText: [{
|
|
105
|
+
type: Input
|
|
106
|
+
}], sendSuccessfulText: [{
|
|
107
|
+
type: Input
|
|
108
|
+
}], sendErrorText: [{
|
|
109
|
+
type: Input
|
|
110
|
+
}], formConfig: [{
|
|
111
|
+
type: Input
|
|
112
|
+
}], apiCallback: [{
|
|
113
|
+
type: Input
|
|
114
|
+
}] } });
|
|
115
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29udGFjdC1mb3JtL3NyYy9saWIvY29udGFjdC1mb3JtL2NvbnRhY3QtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbnRhY3QtZm9ybS9zcmMvbGliL2NvbnRhY3QtZm9ybS9jb250YWN0LWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBR0wsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQXFCLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQTBCaEQsTUFBTSxPQUFPLG9CQUFvQjtJQXdDL0I7UUF2Q1MsZ0JBQVcsR0FBRztZQUNyQixrQkFBa0IsRUFBRSxTQUFTO1lBQzdCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsS0FBSyxFQUFFLFNBQVM7U0FDakIsQ0FBQztRQUVPLGNBQVMsR0FBRztZQUNuQixLQUFLLEVBQUUsU0FBUztZQUNoQixrQkFBa0IsRUFBRSx3QkFBd0I7WUFDNUMsaUJBQWlCLEVBQUUsWUFBWTtZQUMvQixZQUFZLEVBQUUsaUNBQWlD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QUFXLENBQUM7YUFDL0IsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDakIsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNyQyxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDZCxDQUFDOzhHQS9GVSxvQkFBb0I7a0dBQXBCLG9CQUFvQixzVEN2Q2pDLHduQkF1QkEsMFlEUUksWUFBWSw4QkFDWixtQkFBbUIsb2JBQ25CLFlBQVksNktBQ1osb0JBQW9CLCtCQUNwQixPQUFPLHNFQUNQLFNBQVM7OzJGQUdBLG9CQUFvQjtrQkFoQmhDLFNBQVM7K0JBRUUsY0FBYyxpQkFFVCxpQkFBaUIsQ0FBQyxJQUFJLGNBRXpCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsWUFBWTt3QkFDWixvQkFBb0I7d0JBQ3BCLE9BQU87d0JBQ1AsU0FBUztxQkFDVjt3REFHUSxXQUFXO3NCQUFuQixLQUFLO2dCQU1HLFNBQVM7c0JBQWpCLEtBQUs7Z0JBT0csU0FBUztzQkFBakIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBT0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExheW91dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ1N0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEZvcm1seUZpZWxkQ29uZmlnLCBGb3JtbHlNb2R1bGUgfSBmcm9tICdAbmd4LWZvcm1seS9jb3JlJztcbmltcG9ydCB7IEZvcm1seU1hdGVyaWFsTW9kdWxlIH0gZnJvbSAnQG5neC1mb3JtbHkvbWF0ZXJpYWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmludGVyZmFjZSBGb3JtQ29uZmlnRW50cnkge1xuICBmaWVsZDogc3RyaW5nO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICB2YWx1ZT86IGFueTtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICB0eXBlPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdjb250YWN0LWZvcm0nLFxuICB0ZW1wbGF0ZVVybDogJy4vY29udGFjdC1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3R5bGVVcmxzOiBbJy4vY29udGFjdC1mb3JtLmNvbXBvbmVudC5zY3NzJ10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBMYXlvdXRNb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBGb3JtbHlNb2R1bGUsXG4gICAgRm9ybWx5TWF0ZXJpYWxNb2R1bGUsXG4gICAgTmdTdHlsZSxcbiAgICBBc3luY1BpcGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDb250YWN0Rm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgYnV0dG9uU3R5bGUgPSB7XG4gICAgJ2JhY2tncm91bmQtY29sb3InOiAnIzMzMzMzMycsXG4gICAgYm9yZGVyOiAnbm9uZScsXG4gICAgY29sb3I6ICcjY2M3ODMyJ1xuICB9O1xuXG4gIEBJbnB1dCgpIGZvcm1TdHlsZSA9IHtcbiAgICBjb2xvcjogJyM0MzdkYTgnLFxuICAgICdiYWNrZ3JvdW5kLWNvbG9yJzogJ3JnYmEoMzQsIDM0LCAzNCwgMC43NSknLFxuICAgICdiYWNrZHJvcC1maWx0ZXInOiAnYmx1cig1MHB4KScsXG4gICAgJ2JveC1zaGFkb3cnOiAnMCAycHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMDc1KSdcbiAgfTtcblxuICBASW5wdXQoKSB0ZXh0U3R5bGUgPSB7IGNvbG9yOiAnI2NjNzgzMicgfTtcblxuICBASW5wdXQoKSBzZW5kVGV4dCA9ICdTZW5kJztcblxuICBASW5wdXQoKSBzZW5kU3VjY2Vzc2Z1bFRleHQgPSAnRS1NYWlsIHN1Y2Nlc3NmdWxseSBzZW50JztcblxuICBASW5wdXQoKSBzZW5kRXJyb3JUZXh0ID0gJ1NlbmQgZXJyb3InO1xuXG4gIEBJbnB1dCgpIGZvcm1Db25maWc6IEZvcm1Db25maWdFbnRyeVtdID0gW1xuICAgIHsgZmllbGQ6ICduYW1lJywgcmVxdWlyZWQ6IHRydWUgfSxcbiAgICB7IGZpZWxkOiAnZW1haWwnLCByZXF1aXJlZDogdHJ1ZSB9LFxuICAgIHsgZmllbGQ6ICdtZXNzYWdlJywgcmVxdWlyZWQ6IHRydWUsIHR5cGU6ICd0ZXh0YXJlYScgfVxuICBdO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIEBJbnB1dCgpIGFwaUNhbGxiYWNrITogKGZvcm1WYWx1ZTogYW55KSA9PiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHt9KTtcbiAgZmllbGRzOiBGb3JtbHlGaWVsZENvbmZpZ1tdID0gW107XG4gIG1vZGVsOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG5cbiAgZW1haWxTZW50OiBTdWJqZWN0PGJvb2xlYW4gfCBudWxsPiA9IG5ldyBTdWJqZWN0KCk7XG4gIGVtYWlsU2VudCQgPSB0aGlzLmVtYWlsU2VudC5hc09ic2VydmFibGUoKTtcblxuICBwcml2YXRlIHVuc3Vic2NyaWJlJDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5lbWFpbFNlbnQubmV4dChudWxsKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYnVpbGRDb25maWcoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgc3VibWl0Rm9ybURhdGEoZm9ybURhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICB0aGlzLmFwaUNhbGxiYWNrKGZvcm1EYXRhKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoc3VjY2VzczogYm9vbGVhbikgPT4gdGhpcy5lbWFpbFNlbnQubmV4dChzdWNjZXNzKSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDb25maWcoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtQ29uZmlnLmZvckVhY2goKGVudHJ5OiBGb3JtQ29uZmlnRW50cnkpID0+IHtcbiAgICAgIGlmIChlbnRyeS52YWx1ZSkge1xuICAgICAgICB0aGlzLm1vZGVsW2VudHJ5LmZpZWxkXSA9IGVudHJ5LnZhbHVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZpZWxkcy5wdXNoKHtcbiAgICAgICAga2V5OiBlbnRyeS5maWVsZCxcbiAgICAgICAgdHlwZTogZW50cnkudHlwZSA/IGVudHJ5LnR5cGUgOiAnaW5wdXQnLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgIGxhYmVsOiBlbnRyeS5maWVsZC50b0xvY2FsZVVwcGVyQ2FzZSgpLFxuICAgICAgICAgIHBsYWNlaG9sZGVyOiAnRW50ZXIgJyArIGVudHJ5LmZpZWxkLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHsgc3R5bGU6IHRoaXMuZmxhdHRlblN0eWxlKHRoaXMudGV4dFN0eWxlKSB9XG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlT3B0aW9uczpcbiAgICAgICAgICBlbnRyeS50eXBlID09PSAndGV4dGFyZWEnXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBhdXRvc2l6ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtaW5Sb3dzOiA1LFxuICAgICAgICAgICAgICAgIG1heFJvd3M6IDEwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge31cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGF0dGVuU3R5bGUoc3R5bGVPYmplY3Q6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pOiBzdHJpbmcge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhzdHlsZU9iamVjdClcbiAgICAgIC5mbGF0TWFwKChlbnRyeSkgPT4ge1xuICAgICAgICByZXR1cm4gYCR7ZW50cnlbMF19OiAke2VudHJ5WzFdfTtgO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCcnKTtcbiAgfVxufVxuIiwiPGZvcm1cbiAgW25nU3R5bGVdPVwiZm9ybVN0eWxlXCJcbiAgY2xhc3M9XCJjb250YWN0LWZvcm0gZmxleC1jb2x1bW4gZmxleC1meGZsZXhcIlxuICBbZm9ybUdyb3VwXT1cImZvcm1cIlxuICAobmdTdWJtaXQpPVwic3VibWl0Rm9ybURhdGEobW9kZWwpXCJcbj5cbiAgPGZvcm1seS1mb3JtIFtmb3JtXT1cImZvcm1cIiBbZmllbGRzXT1cImZpZWxkc1wiIFttb2RlbF09XCJtb2RlbFwiPjwvZm9ybWx5LWZvcm0+XG4gIDxidXR0b25cbiAgICBbbmdTdHlsZV09XCJidXR0b25TdHlsZVwiXG4gICAgY2xhc3M9XCJmb3JtLWJ1dHRvblwiXG4gICAgdHlwZT1cInN1Ym1pdFwiXG4gICAgW2Rpc2FibGVkXT1cIiFmb3JtLnZhbGlkXCJcbiAgPlxuICAgIHt7IHNlbmRUZXh0IH19XG4gIDwvYnV0dG9uPlxuICA8ZGl2IFtuZ1N0eWxlXT1cInRleHRTdHlsZVwiIGNsYXNzPVwiZm9ybS1zdGF0dXNcIj5cbiAgICBAaWYgKChlbWFpbFNlbnQkIHwgYXN5bmMpID09PSB0cnVlKSB7XG4gICAgICB7eyBzZW5kU3VjY2Vzc2Z1bFRleHQgfX1cbiAgICB9IEBlbHNlIGlmICgoZW1haWxTZW50JCB8IGFzeW5jKSA9PT0gZmFsc2UpIHtcbiAgICAgIHt7IHNlbmRFcnJvclRleHQgfX1cbiAgICB9XG4gIDwvZGl2PlxuPC9mb3JtPlxuIl19
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { LayoutModule } from '@angular/cdk/layout';
|
|
2
|
+
import { NgStyle, AsyncPipe } from '@angular/common';
|
|
3
|
+
import * as i0 from '@angular/core';
|
|
4
|
+
import { Component, ViewEncapsulation, Input } from '@angular/core';
|
|
5
|
+
import * as i1 from '@angular/forms';
|
|
6
|
+
import { FormGroup, ReactiveFormsModule } from '@angular/forms';
|
|
7
|
+
import * as i2 from '@ngx-formly/core';
|
|
8
|
+
import { FormlyModule } from '@ngx-formly/core';
|
|
9
|
+
import { FormlyMaterialModule } from '@ngx-formly/material';
|
|
10
|
+
import { Subject } from 'rxjs';
|
|
11
|
+
import { tap, takeUntil } from 'rxjs/operators';
|
|
12
|
+
|
|
13
|
+
class ContactFormComponent {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.buttonStyle = {
|
|
16
|
+
'background-color': '#333333',
|
|
17
|
+
border: 'none',
|
|
18
|
+
color: '#cc7832'
|
|
19
|
+
};
|
|
20
|
+
this.formStyle = {
|
|
21
|
+
color: '#437da8',
|
|
22
|
+
'background-color': 'rgba(34, 34, 34, 0.75)',
|
|
23
|
+
'backdrop-filter': 'blur(50px)',
|
|
24
|
+
'box-shadow': '0 2px 10px rgba(0, 0, 0, 0.075)'
|
|
25
|
+
};
|
|
26
|
+
this.textStyle = { color: '#cc7832' };
|
|
27
|
+
this.sendText = 'Send';
|
|
28
|
+
this.sendSuccessfulText = 'E-Mail successfully sent';
|
|
29
|
+
this.sendErrorText = 'Send error';
|
|
30
|
+
this.formConfig = [
|
|
31
|
+
{ field: 'name', required: true },
|
|
32
|
+
{ field: 'email', required: true },
|
|
33
|
+
{ field: 'message', required: true, type: 'textarea' }
|
|
34
|
+
];
|
|
35
|
+
this.form = new FormGroup({});
|
|
36
|
+
this.fields = [];
|
|
37
|
+
this.model = {};
|
|
38
|
+
this.emailSent = new Subject();
|
|
39
|
+
this.emailSent$ = this.emailSent.asObservable();
|
|
40
|
+
this.unsubscribe$ = new Subject();
|
|
41
|
+
this.emailSent.next(null);
|
|
42
|
+
}
|
|
43
|
+
ngOnInit() {
|
|
44
|
+
this.buildConfig();
|
|
45
|
+
}
|
|
46
|
+
ngOnDestroy() {
|
|
47
|
+
this.unsubscribe$.next();
|
|
48
|
+
this.unsubscribe$.complete();
|
|
49
|
+
}
|
|
50
|
+
submitFormData(formData) {
|
|
51
|
+
this.apiCallback(formData)
|
|
52
|
+
.pipe(tap((success) => this.emailSent.next(success)), takeUntil(this.unsubscribe$))
|
|
53
|
+
.subscribe();
|
|
54
|
+
}
|
|
55
|
+
buildConfig() {
|
|
56
|
+
this.formConfig.forEach((entry) => {
|
|
57
|
+
if (entry.value) {
|
|
58
|
+
this.model[entry.field] = entry.value;
|
|
59
|
+
}
|
|
60
|
+
this.fields.push({
|
|
61
|
+
key: entry.field,
|
|
62
|
+
type: entry.type ? entry.type : 'input',
|
|
63
|
+
props: {
|
|
64
|
+
label: entry.field.toLocaleUpperCase(),
|
|
65
|
+
placeholder: 'Enter ' + entry.field,
|
|
66
|
+
required: true,
|
|
67
|
+
attributes: { style: this.flattenStyle(this.textStyle) }
|
|
68
|
+
},
|
|
69
|
+
templateOptions: entry.type === 'textarea'
|
|
70
|
+
? {
|
|
71
|
+
autosize: true,
|
|
72
|
+
minRows: 5,
|
|
73
|
+
maxRows: 10
|
|
74
|
+
}
|
|
75
|
+
: {}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
flattenStyle(styleObject) {
|
|
80
|
+
return Object.entries(styleObject)
|
|
81
|
+
.flatMap((entry) => {
|
|
82
|
+
return `${entry[0]}: ${entry[1]};`;
|
|
83
|
+
})
|
|
84
|
+
.join('');
|
|
85
|
+
}
|
|
86
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ContactFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
87
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: ContactFormComponent, isStandalone: true, selector: "contact-form", inputs: { buttonStyle: "buttonStyle", formStyle: "formStyle", textStyle: "textStyle", sendText: "sendText", sendSuccessfulText: "sendSuccessfulText", sendErrorText: "sendErrorText", formConfig: "formConfig", apiCallback: "apiCallback" }, ngImport: i0, template: "<form\n [ngStyle]=\"formStyle\"\n class=\"contact-form flex-column flex-fxflex\"\n [formGroup]=\"form\"\n (ngSubmit)=\"submitFormData(model)\"\n>\n <formly-form [form]=\"form\" [fields]=\"fields\" [model]=\"model\"></formly-form>\n <button\n [ngStyle]=\"buttonStyle\"\n class=\"form-button\"\n type=\"submit\"\n [disabled]=\"!form.valid\"\n >\n {{ sendText }}\n </button>\n <div [ngStyle]=\"textStyle\" class=\"form-status\">\n @if ((emailSent$ | async) === true) {\n {{ sendSuccessfulText }}\n } @else if ((emailSent$ | async) === false) {\n {{ sendErrorText }}\n }\n </div>\n</form>\n", styles: [".contact-form{max-width:500px;margin:auto;padding:40px 40px 30px;box-sizing:border-box}.form-button{margin-top:.33rem;display:block;border-radius:.25rem;height:36px;width:100%;padding:.375rem .75rem}.form-status{height:19px;margin-top:1rem}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}\n"], dependencies: [{ kind: "ngmodule", type: LayoutModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i2.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "ngmodule", type: FormlyMaterialModule }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
88
|
+
}
|
|
89
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.3", ngImport: i0, type: ContactFormComponent, decorators: [{
|
|
90
|
+
type: Component,
|
|
91
|
+
args: [{ selector: 'contact-form', encapsulation: ViewEncapsulation.None, standalone: true, imports: [
|
|
92
|
+
LayoutModule,
|
|
93
|
+
ReactiveFormsModule,
|
|
94
|
+
FormlyModule,
|
|
95
|
+
FormlyMaterialModule,
|
|
96
|
+
NgStyle,
|
|
97
|
+
AsyncPipe
|
|
98
|
+
], template: "<form\n [ngStyle]=\"formStyle\"\n class=\"contact-form flex-column flex-fxflex\"\n [formGroup]=\"form\"\n (ngSubmit)=\"submitFormData(model)\"\n>\n <formly-form [form]=\"form\" [fields]=\"fields\" [model]=\"model\"></formly-form>\n <button\n [ngStyle]=\"buttonStyle\"\n class=\"form-button\"\n type=\"submit\"\n [disabled]=\"!form.valid\"\n >\n {{ sendText }}\n </button>\n <div [ngStyle]=\"textStyle\" class=\"form-status\">\n @if ((emailSent$ | async) === true) {\n {{ sendSuccessfulText }}\n } @else if ((emailSent$ | async) === false) {\n {{ sendErrorText }}\n }\n </div>\n</form>\n", styles: [".contact-form{max-width:500px;margin:auto;padding:40px 40px 30px;box-sizing:border-box}.form-button{margin-top:.33rem;display:block;border-radius:.25rem;height:36px;width:100%;padding:.375rem .75rem}.form-status{height:19px;margin-top:1rem}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}\n"] }]
|
|
99
|
+
}], ctorParameters: () => [], propDecorators: { buttonStyle: [{
|
|
100
|
+
type: Input
|
|
101
|
+
}], formStyle: [{
|
|
102
|
+
type: Input
|
|
103
|
+
}], textStyle: [{
|
|
104
|
+
type: Input
|
|
105
|
+
}], sendText: [{
|
|
106
|
+
type: Input
|
|
107
|
+
}], sendSuccessfulText: [{
|
|
108
|
+
type: Input
|
|
109
|
+
}], sendErrorText: [{
|
|
110
|
+
type: Input
|
|
111
|
+
}], formConfig: [{
|
|
112
|
+
type: Input
|
|
113
|
+
}], apiCallback: [{
|
|
114
|
+
type: Input
|
|
115
|
+
}] } });
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Generated bundle index. Do not edit.
|
|
119
|
+
*/
|
|
120
|
+
|
|
121
|
+
export { ContactFormComponent };
|
|
122
|
+
//# sourceMappingURL=tehw0lf-contact-form.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tehw0lf-contact-form.mjs","sources":["../../../../libs/contact-form/src/lib/contact-form/contact-form.component.ts","../../../../libs/contact-form/src/lib/contact-form/contact-form.component.html","../../../../libs/contact-form/src/tehw0lf-contact-form.ts"],"sourcesContent":["import { LayoutModule } from '@angular/cdk/layout';\nimport { AsyncPipe, NgStyle } from '@angular/common';\nimport {\n Component,\n Input,\n OnDestroy,\n OnInit,\n ViewEncapsulation\n} from '@angular/core';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { FormlyFieldConfig, FormlyModule } from '@ngx-formly/core';\nimport { FormlyMaterialModule } from '@ngx-formly/material';\nimport { Observable, Subject } from 'rxjs';\nimport { takeUntil, tap } from 'rxjs/operators';\n\ninterface FormConfigEntry {\n field: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value?: any;\n required?: boolean;\n type?: string;\n}\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'contact-form',\n templateUrl: './contact-form.component.html',\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['./contact-form.component.scss'],\n standalone: true,\n imports: [\n LayoutModule,\n ReactiveFormsModule,\n FormlyModule,\n FormlyMaterialModule,\n NgStyle,\n AsyncPipe\n ]\n})\nexport class ContactFormComponent implements OnInit, OnDestroy {\n @Input() buttonStyle = {\n 'background-color': '#333333',\n border: 'none',\n color: '#cc7832'\n };\n\n @Input() formStyle = {\n color: '#437da8',\n 'background-color': 'rgba(34, 34, 34, 0.75)',\n 'backdrop-filter': 'blur(50px)',\n 'box-shadow': '0 2px 10px rgba(0, 0, 0, 0.075)'\n };\n\n @Input() textStyle = { color: '#cc7832' };\n\n @Input() sendText = 'Send';\n\n @Input() sendSuccessfulText = 'E-Mail successfully sent';\n\n @Input() sendErrorText = 'Send error';\n\n @Input() formConfig: FormConfigEntry[] = [\n { field: 'name', required: true },\n { field: 'email', required: true },\n { field: 'message', required: true, type: 'textarea' }\n ];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n @Input() apiCallback!: (formValue: any) => Observable<boolean>;\n\n form = new FormGroup({});\n fields: FormlyFieldConfig[] = [];\n model: { [key: string]: string } = {};\n\n emailSent: Subject<boolean | null> = new Subject();\n emailSent$ = this.emailSent.asObservable();\n\n private unsubscribe$: Subject<void> = new Subject();\n\n constructor() {\n this.emailSent.next(null);\n }\n\n ngOnInit(): void {\n this.buildConfig();\n }\n\n ngOnDestroy(): void {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n\n submitFormData(formData: { [key: string]: string }) {\n this.apiCallback(formData)\n .pipe(\n tap((success: boolean) => this.emailSent.next(success)),\n takeUntil(this.unsubscribe$)\n )\n .subscribe();\n }\n\n private buildConfig(): void {\n this.formConfig.forEach((entry: FormConfigEntry) => {\n if (entry.value) {\n this.model[entry.field] = entry.value;\n }\n\n this.fields.push({\n key: entry.field,\n type: entry.type ? entry.type : 'input',\n props: {\n label: entry.field.toLocaleUpperCase(),\n placeholder: 'Enter ' + entry.field,\n required: true,\n attributes: { style: this.flattenStyle(this.textStyle) }\n },\n templateOptions:\n entry.type === 'textarea'\n ? {\n autosize: true,\n minRows: 5,\n maxRows: 10\n }\n : {}\n });\n });\n }\n\n private flattenStyle(styleObject: { [key: string]: string }): string {\n return Object.entries(styleObject)\n .flatMap((entry) => {\n return `${entry[0]}: ${entry[1]};`;\n })\n .join('');\n }\n}\n","<form\n [ngStyle]=\"formStyle\"\n class=\"contact-form flex-column flex-fxflex\"\n [formGroup]=\"form\"\n (ngSubmit)=\"submitFormData(model)\"\n>\n <formly-form [form]=\"form\" [fields]=\"fields\" [model]=\"model\"></formly-form>\n <button\n [ngStyle]=\"buttonStyle\"\n class=\"form-button\"\n type=\"submit\"\n [disabled]=\"!form.valid\"\n >\n {{ sendText }}\n </button>\n <div [ngStyle]=\"textStyle\" class=\"form-status\">\n @if ((emailSent$ | async) === true) {\n {{ sendSuccessfulText }}\n } @else if ((emailSent$ | async) === false) {\n {{ sendErrorText }}\n }\n </div>\n</form>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import { OnDestroy } from '@angular/core';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { OnDestroy, OnInit } from '@angular/core';
|
|
2
|
+
import { FormGroup } from '@angular/forms';
|
|
3
|
+
import { FormlyFieldConfig } from '@ngx-formly/core';
|
|
4
|
+
import { Observable, Subject } from 'rxjs';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
interface FormConfigEntry {
|
|
7
|
+
field: string;
|
|
8
|
+
value?: any;
|
|
9
|
+
required?: boolean;
|
|
10
|
+
type?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class ContactFormComponent implements OnInit, OnDestroy {
|
|
9
13
|
buttonStyle: {
|
|
10
14
|
'background-color': string;
|
|
11
15
|
border: string;
|
|
@@ -17,27 +21,31 @@ export declare class ContactFormComponent implements OnDestroy {
|
|
|
17
21
|
'backdrop-filter': string;
|
|
18
22
|
'box-shadow': string;
|
|
19
23
|
};
|
|
20
|
-
inputStyle: {
|
|
21
|
-
color: string;
|
|
22
|
-
};
|
|
23
24
|
textStyle: {
|
|
24
25
|
color: string;
|
|
25
26
|
};
|
|
26
|
-
nameLabel: string;
|
|
27
|
-
emailAddressLabel: string;
|
|
28
|
-
messageLabel: string;
|
|
29
27
|
sendText: string;
|
|
30
28
|
sendSuccessfulText: string;
|
|
31
29
|
sendErrorText: string;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
30
|
+
formConfig: FormConfigEntry[];
|
|
31
|
+
apiCallback: (formValue: any) => Observable<boolean>;
|
|
32
|
+
form: FormGroup<{}>;
|
|
33
|
+
fields: FormlyFieldConfig[];
|
|
34
|
+
model: {
|
|
35
|
+
[key: string]: string;
|
|
36
|
+
};
|
|
35
37
|
emailSent: Subject<boolean | null>;
|
|
36
|
-
emailSent$:
|
|
38
|
+
emailSent$: Observable<boolean | null>;
|
|
37
39
|
private unsubscribe$;
|
|
38
|
-
constructor(
|
|
40
|
+
constructor();
|
|
41
|
+
ngOnInit(): void;
|
|
39
42
|
ngOnDestroy(): void;
|
|
40
|
-
submitFormData(formData:
|
|
43
|
+
submitFormData(formData: {
|
|
44
|
+
[key: string]: string;
|
|
45
|
+
}): void;
|
|
46
|
+
private buildConfig;
|
|
47
|
+
private flattenStyle;
|
|
41
48
|
static ɵfac: i0.ɵɵFactoryDeclaration<ContactFormComponent, never>;
|
|
42
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ContactFormComponent, "contact-form", never, { "buttonStyle": "buttonStyle"; "
|
|
49
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ContactFormComponent, "contact-form", never, { "buttonStyle": { "alias": "buttonStyle"; "required": false; }; "formStyle": { "alias": "formStyle"; "required": false; }; "textStyle": { "alias": "textStyle"; "required": false; }; "sendText": { "alias": "sendText"; "required": false; }; "sendSuccessfulText": { "alias": "sendSuccessfulText"; "required": false; }; "sendErrorText": { "alias": "sendErrorText"; "required": false; }; "formConfig": { "alias": "formConfig"; "required": false; }; "apiCallback": { "alias": "apiCallback"; "required": false; }; }, {}, never, never, true, never>;
|
|
43
50
|
}
|
|
51
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,33 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tehw0lf/contact-form",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.1",
|
|
4
4
|
"license": "MIT",
|
|
5
|
-
"homepage": "https://github.com/tehw0lf/
|
|
5
|
+
"homepage": "https://github.com/tehw0lf/tehwolf.de.git",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "https://github.com/tehw0lf/
|
|
8
|
+
"url": "https://github.com/tehw0lf/tehwolf.de.git"
|
|
9
9
|
},
|
|
10
10
|
"peerDependencies": {
|
|
11
|
-
"@angular/animations": "
|
|
12
|
-
"@angular/
|
|
13
|
-
"@angular/
|
|
14
|
-
"@angular/
|
|
15
|
-
"@
|
|
16
|
-
"@
|
|
17
|
-
"@angular/material": "^14.1.3",
|
|
18
|
-
"@angular/platform-browser": "14.1.3",
|
|
19
|
-
"rxjs": "7.5.6",
|
|
20
|
-
"@angular/platform-browser-dynamic": "14.1.3"
|
|
11
|
+
"@angular/animations": "17.3.3",
|
|
12
|
+
"@angular/common": "17.3.3",
|
|
13
|
+
"@angular/core": "17.3.3",
|
|
14
|
+
"@angular/forms": "17.3.3",
|
|
15
|
+
"@ngx-formly/core": "^6.3.0",
|
|
16
|
+
"@ngx-formly/material": "^6.3.0"
|
|
21
17
|
},
|
|
22
18
|
"dependencies": {
|
|
23
19
|
"tslib": "^2.2.0"
|
|
24
20
|
},
|
|
25
|
-
"
|
|
26
|
-
"module": "fesm2015/tehw0lf-contact-form.mjs",
|
|
27
|
-
"es2020": "fesm2020/tehw0lf-contact-form.mjs",
|
|
28
|
-
"esm2020": "esm2020/tehw0lf-contact-form.mjs",
|
|
29
|
-
"fesm2020": "fesm2020/tehw0lf-contact-form.mjs",
|
|
30
|
-
"fesm2015": "fesm2015/tehw0lf-contact-form.mjs",
|
|
21
|
+
"module": "fesm2022/tehw0lf-contact-form.mjs",
|
|
31
22
|
"typings": "index.d.ts",
|
|
32
23
|
"exports": {
|
|
33
24
|
"./package.json": {
|
|
@@ -35,12 +26,10 @@
|
|
|
35
26
|
},
|
|
36
27
|
".": {
|
|
37
28
|
"types": "./index.d.ts",
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"node": "./fesm2015/tehw0lf-contact-form.mjs",
|
|
42
|
-
"default": "./fesm2020/tehw0lf-contact-form.mjs"
|
|
29
|
+
"esm2022": "./esm2022/tehw0lf-contact-form.mjs",
|
|
30
|
+
"esm": "./esm2022/tehw0lf-contact-form.mjs",
|
|
31
|
+
"default": "./fesm2022/tehw0lf-contact-form.mjs"
|
|
43
32
|
}
|
|
44
33
|
},
|
|
45
34
|
"sideEffects": false
|
|
46
|
-
}
|
|
35
|
+
}
|
package/esm2020/index.mjs
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
export * from './lib/contact-form.module';
|
|
2
|
-
export * from './lib/contact-form/contact-form.component';
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL2NvbnRhY3QtZm9ybS9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLDJDQUEyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvY29udGFjdC1mb3JtLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250YWN0LWZvcm0vY29udGFjdC1mb3JtLmNvbXBvbmVudCc7XG4iXX0=
|