@progressive-development/pd-forms 0.6.4 → 0.6.7

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.
Files changed (64) hide show
  1. package/dist/generated/locales/be.d.ts +6 -1
  2. package/dist/generated/locales/be.d.ts.map +1 -1
  3. package/dist/generated/locales/de.d.ts +7 -2
  4. package/dist/generated/locales/de.d.ts.map +1 -1
  5. package/dist/generated/locales/en.d.ts +6 -1
  6. package/dist/generated/locales/en.d.ts.map +1 -1
  7. package/dist/index.d.ts +2 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +3 -1
  10. package/dist/locales/be.js +8 -2
  11. package/dist/locales/de.js +9 -3
  12. package/dist/locales/en.js +8 -2
  13. package/dist/pd-base-input-element.d.ts +4 -1
  14. package/dist/pd-base-input-element.d.ts.map +1 -1
  15. package/dist/pd-base-input-element.js +31 -5
  16. package/dist/pd-base-ui-input.d.ts +31 -7
  17. package/dist/pd-base-ui-input.d.ts.map +1 -1
  18. package/dist/pd-base-ui-input.js +226 -50
  19. package/dist/pd-checkbox.d.ts +4 -3
  20. package/dist/pd-checkbox.d.ts.map +1 -1
  21. package/dist/pd-checkbox.js +91 -62
  22. package/dist/pd-form-container.d.ts +12 -8
  23. package/dist/pd-form-container.d.ts.map +1 -1
  24. package/dist/pd-form-container.js +121 -88
  25. package/dist/pd-icon-panel-button.d.ts.map +1 -1
  26. package/dist/pd-icon-panel-button.js +7 -2
  27. package/dist/pd-input-area.d.ts +3 -1
  28. package/dist/pd-input-area.d.ts.map +1 -1
  29. package/dist/pd-input-area.js +28 -1
  30. package/dist/pd-input-file.d.ts +3 -2
  31. package/dist/pd-input-file.d.ts.map +1 -1
  32. package/dist/pd-input-file.js +21 -16
  33. package/dist/pd-input-time.d.ts +2 -1
  34. package/dist/pd-input-time.d.ts.map +1 -1
  35. package/dist/pd-input-time.js +19 -6
  36. package/dist/pd-input.d.ts +3 -1
  37. package/dist/pd-input.d.ts.map +1 -1
  38. package/dist/pd-input.js +32 -5
  39. package/dist/pd-radio-group.d.ts +4 -1
  40. package/dist/pd-radio-group.d.ts.map +1 -1
  41. package/dist/pd-radio-group.js +54 -34
  42. package/dist/pd-range.d.ts +8 -2
  43. package/dist/pd-range.d.ts.map +1 -1
  44. package/dist/pd-range.js +60 -9
  45. package/dist/pd-select.d.ts +6 -2
  46. package/dist/pd-select.d.ts.map +1 -1
  47. package/dist/pd-select.js +27 -3
  48. package/dist/stories/checkbox.stories.d.ts +1 -0
  49. package/dist/stories/checkbox.stories.d.ts.map +1 -1
  50. package/dist/stories/form-container2.stories.d.ts +8 -0
  51. package/dist/stories/form-container2.stories.d.ts.map +1 -0
  52. package/dist/stories/form-container3.stories.d.ts +8 -0
  53. package/dist/stories/form-container3.stories.d.ts.map +1 -0
  54. package/dist/stories/pd-hover-box.stories.d.ts +8 -0
  55. package/dist/stories/pd-hover-box.stories.d.ts.map +1 -0
  56. package/dist/styles/shared-input-field-styles.d.ts.map +1 -1
  57. package/dist/styles/shared-input-field-styles.js +21 -9
  58. package/dist/types.d.ts +15 -0
  59. package/dist/types.d.ts.map +1 -1
  60. package/dist/types.js +4 -0
  61. package/dist/validators.d.ts +10 -0
  62. package/dist/validators.d.ts.map +1 -0
  63. package/dist/validators.js +41 -0
  64. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"pd-form-container.d.ts","sourceRoot":"","sources":["../src/pd-form-container.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAEH,OAAO,EAAa,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAI1E,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,qBACa,eAAgB,SAAQ,QAAQ;IAC3C;;OAEG;IAEH,iBAAiB,UAAS;IAE1B;;OAEG;IAEH,WAAW,SAAM;IAEjB;;OAEG;IAEH,OAAO,CAAC,oBAAoB,CAAQ;IAEpC,OAAgB,MAAM,EAAE,cAAc,CAuCpC;IAEO,iBAAiB,IAAI,IAAI;IAKzB,oBAAoB,IAAI,IAAI;IAQ5B,MAAM,IAAI,cAAc;IAyBjC,OAAO,CAAC,aAAa,CAwFnB;IAEF,OAAO,CAAC,MAAM,CAAC,YAAY;IAI3B,OAAO,CAAC,MAAM,CAAC,WAAW;IAI1B,OAAO,CAAC,MAAM,CAAC,aAAa;CAG7B"}
1
+ {"version":3,"file":"pd-form-container.d.ts","sourceRoot":"","sources":["../src/pd-form-container.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG;AAEH,OAAO,EAAa,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAI1E,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,qBACa,eAAgB,SAAQ,QAAQ;IAC3C;;OAEG;IAEH,iBAAiB,UAAS;IAE1B;;OAEG;IAEH,WAAW,SAAM;IAGjB,OAAO,CAAC,OAAO,CAA+C;IAE9D,OAAgB,MAAM,EAAE,cAAc,CAwCpC;IAEO,iBAAiB,IAAI,IAAI;IAoBzB,oBAAoB,IAAI,IAAI;IAoB5B,MAAM,IAAI,cAAc;IASjC,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,WAAW,CAiBjB;IAEF,OAAO,CAAC,SAAS,CAaf;IAEF,OAAO,CAAC,OAAO,CAOb;IAEF,OAAO,CAAC,QAAQ,CAMd;IAEF,OAAO,CAAC,mBAAmB;IASd,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAQhC,KAAK,IAAI,IAAI;IAMb,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC;CAGrD"}
@@ -2,7 +2,6 @@ import { css, html } from "lit";
2
2
  import { property, state, customElement } from "lit/decorators.js";
3
3
  import { msg } from "@lit/localize";
4
4
  import { PdBaseUI } from "./pd-base-ui.js";
5
- import { INPUT_TYPE_RANGE, INPUT_TYPE_SELECT } from "./pd-base-ui-input.js";
6
5
  var __defProp = Object.defineProperty;
7
6
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
8
7
  var __decorateClass = (decorators, target, key, kind) => {
@@ -18,112 +17,145 @@ let PdFormContainer = class extends PdBaseUI {
18
17
  super(...arguments);
19
18
  this.requiredFieldInfo = false;
20
19
  this.commonError = "";
21
- this._requiredFieldsValid = true;
22
- this._validateForm = (e) => {
23
- const errorMap = e.detail.errorMap;
24
- const singleElement = e.detail.singleElement;
25
- const requiredElements = this.querySelectorAll("[required]");
26
- requiredElements.forEach((el) => {
27
- const isEmpty = !el.value || el.value === "false" || el.value === "" || el._inputType === INPUT_TYPE_RANGE && el.value === "0" || el._inputType === INPUT_TYPE_SELECT && el.value === "UNDEF";
28
- const isTarget = !singleElement || el === singleElement;
29
- if (isEmpty && isTarget) {
30
- const msgText = el.requiredMsg || msg("Eingabe erforderlich", { id: "pd.form.field.required" });
31
- el.errorMsg = msgText;
32
- errorMap.set(el.id, msgText);
33
- } else if (typeof el.validate === "function" && isTarget) {
34
- const err = el.validate(e);
35
- if (err) {
36
- el.errorMsg = err;
37
- errorMap.set(el.id, err);
38
- } else {
39
- el.errorMsg = "";
40
- }
41
- } else if (isTarget) {
42
- el.errorMsg = "";
43
- }
44
- });
45
- const validateByType = (type, validator, errMsg) => {
46
- const targets = (singleElement == null ? void 0 : singleElement.getAttribute("field-type")) === type ? [singleElement] : Array.from(this.querySelectorAll(`[field-type="${type}"]`));
47
- targets.forEach((el) => {
48
- var _a;
49
- if (!errorMap.has(el.id) && ((_a = el.value) == null ? void 0 : _a.length)) {
50
- if (!validator(el.value)) {
51
- el.errorMsg = errMsg;
52
- errorMap.set(el.id, errMsg);
53
- } else {
54
- el.errorMsg = "";
55
- }
56
- }
20
+ this._fields = /* @__PURE__ */ new Map();
21
+ this._onRegister = (e) => {
22
+ const { name, value, state: state2 } = e.detail;
23
+ if (!this._fields.has(name)) {
24
+ this._fields.set(name, {
25
+ name,
26
+ value,
27
+ valid: state2.valid,
28
+ invalid: state2.invalid,
29
+ pristine: state2.pristine,
30
+ dirty: state2.dirty,
31
+ touched: state2.touched,
32
+ focused: state2.focus,
33
+ errors: {},
34
+ element: e.target
57
35
  });
58
- };
59
- validateByType(
60
- "mail",
61
- PdFormContainer._mailIsValid,
62
- msg("Format mail@test.de verwenden", {
63
- id: "pd.form.field.invalid.mail"
64
- })
65
- );
66
- validateByType(
67
- "phone",
68
- PdFormContainer._phoneIsValid,
69
- msg("Format +49123 123456 verwenden", {
70
- id: "pd.form.field.invalid.phone"
71
- })
72
- );
73
- validateByType(
74
- "vat",
75
- PdFormContainer._vatIsValid,
76
- msg("Format DE0123456789 verwenden", { id: "pd.form.field.invalid.vat" })
77
- );
78
- validateByType(
79
- "number",
80
- (val) => !isNaN(parseFloat(val.replaceAll(",", "."))),
81
- msg("Nur Zahlen erlaubt", { id: "pd.form.field.invalid.number" })
82
- );
83
- this._requiredFieldsValid = errorMap.size === 0;
84
- if (singleElement) {
85
- e.stopPropagation();
36
+ this.requestUpdate();
37
+ }
38
+ };
39
+ this._onChange = (e) => {
40
+ const { name, value, state: state2 } = e.detail;
41
+ const field = this._fields.get(name);
42
+ if (field) {
43
+ field.value = value;
44
+ field.pristine = state2.pristine;
45
+ field.dirty = state2.dirty;
46
+ field.touched = state2.touched;
47
+ field.focused = state2.focused;
48
+ field.valid = state2.valid;
49
+ field.invalid = state2.invalid;
50
+ this.requestUpdate();
51
+ }
52
+ };
53
+ this._onBlur = (e) => {
54
+ const { name } = e.detail;
55
+ const field = this._fields.get(name);
56
+ if (field) {
57
+ field.touched = true;
58
+ field.focused = false;
59
+ }
60
+ };
61
+ this._onFocus = (e) => {
62
+ const { name } = e.detail;
63
+ const field = this._fields.get(name);
64
+ if (field) {
65
+ field.focused = true;
86
66
  }
87
67
  };
88
68
  }
89
69
  connectedCallback() {
90
70
  super.connectedCallback();
91
- this.addEventListener("validate-form", this._validateForm);
71
+ this.addEventListener(
72
+ "pd-form-element-register",
73
+ this._onRegister
74
+ );
75
+ this.addEventListener(
76
+ "pd-form-element-change",
77
+ this._onChange
78
+ );
79
+ this.addEventListener(
80
+ "pd-form-element-blur",
81
+ this._onBlur
82
+ );
83
+ this.addEventListener(
84
+ "pd-form-element-focus",
85
+ this._onFocus
86
+ );
92
87
  }
93
88
  disconnectedCallback() {
94
89
  super.disconnectedCallback();
95
90
  this.removeEventListener(
96
- "validate-form",
97
- this._validateForm
91
+ "pd-form-element-register",
92
+ this._onRegister
93
+ );
94
+ this.removeEventListener(
95
+ "pd-form-element-change",
96
+ this._onChange
97
+ );
98
+ this.removeEventListener(
99
+ "pd-form-element-blur",
100
+ this._onBlur
101
+ );
102
+ this.removeEventListener(
103
+ "pd-form-element-focus",
104
+ this._onFocus
98
105
  );
99
106
  }
100
107
  render() {
101
- const showValidState = this._requiredFieldsValid && !this.commonError;
102
108
  return html`
103
109
  <form>
104
110
  <slot></slot>
105
- ${(this.requiredFieldInfo || this.commonError) && html`
106
- <div class="validation-info-container">
107
- <p
108
- class="validation-info ${showValidState ? "filled" : "unfilled"}"
109
- >
110
- ${this.commonError || (this._requiredFieldsValid ? msg("* Pflichtfelder ausgefüllt", {
111
- id: "pd.form.required.valid"
112
- }) : msg("* Pflichtfeld", { id: "pd.form.required.info" }))}
113
- </p>
114
- </div>
115
- `}
111
+ ${this.requiredFieldInfo ? this._renderValidationInfo() : ""}
116
112
  </form>
117
113
  `;
118
114
  }
119
- static _mailIsValid(mail) {
120
- return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(mail);
115
+ _renderValidationInfo() {
116
+ const allValid = this._getOverallValidity();
117
+ return html`
118
+ <p class="${allValid ? "valid" : "invalid"}">
119
+ ${allValid ? msg("* Pflichtfelder ausgefüllt", { id: "pd.form.required.valid" }) : msg("* Pflichtfeld fehlt oder fehlerhaft", {
120
+ id: "pd.form.required.missing"
121
+ })}
122
+ </p>
123
+ `;
124
+ }
125
+ _getOverallValidity() {
126
+ for (const field of this._fields.values()) {
127
+ if (field.invalid) {
128
+ return false;
129
+ }
130
+ }
131
+ return true;
132
+ }
133
+ async triggerValidate() {
134
+ const validations = [];
135
+ this._fields.forEach((field) => {
136
+ var _a;
137
+ const result = (_a = field.element) == null ? void 0 : _a.runValidators();
138
+ if (result instanceof Promise) {
139
+ validations.push(result);
140
+ }
141
+ });
142
+ await Promise.all(validations);
143
+ }
144
+ getValues() {
145
+ const result = {};
146
+ this._fields.forEach((field, key) => {
147
+ result[key] = field.value;
148
+ });
149
+ return result;
121
150
  }
122
- static _vatIsValid(vat) {
123
- return /^[A-Z]{2}[0-9]{8,12}$/.test(vat);
151
+ reset() {
152
+ this._fields.forEach((field) => {
153
+ var _a;
154
+ (_a = field.element) == null ? void 0 : _a.reset();
155
+ });
124
156
  }
125
- static _phoneIsValid(phone) {
126
- return /^\+?[0-9 ]{7,15}$/.test(phone);
157
+ getStatus() {
158
+ return this._fields;
127
159
  }
128
160
  };
129
161
  PdFormContainer.styles = [
@@ -133,9 +165,10 @@ PdFormContainer.styles = [
133
165
  display: flex;
134
166
  flex-direction: column;
135
167
  align-items: flex-start;
136
- gap: 20px;
137
168
  }
138
169
 
170
+ /* Not activated, working state */
171
+
139
172
  .validation-info-container {
140
173
  padding-top: var(--pd-form-row-padding-top, 10px);
141
174
  }
@@ -174,7 +207,7 @@ __decorateClass([
174
207
  ], PdFormContainer.prototype, "commonError", 2);
175
208
  __decorateClass([
176
209
  state()
177
- ], PdFormContainer.prototype, "_requiredFieldsValid", 2);
210
+ ], PdFormContainer.prototype, "_fields", 2);
178
211
  PdFormContainer = __decorateClass([
179
212
  customElement("pd-form-container")
180
213
  ], PdFormContainer);
@@ -1 +1 @@
1
- {"version":3,"file":"pd-icon-panel-button.d.ts","sourceRoot":"","sources":["../src/pd-icon-panel-button.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAa,MAAM,KAAK,CAAC;AAGhD,OAAO,0CAA0C,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,qBACa,iBAAkB,SAAQ,QAAQ;IAE7C,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,UAAU,EAAE,MAAM,CAAQ;IAG1B,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,WAAW,EAAE,OAAO,CAAS;IAG7B,OAAO,CAAC,UAAU,CAAkB;IAEpC,OAAgB,MAAM,EAAE,cAAc,CAoIpC;IAEF,iBAAiB;IAKjB,oBAAoB;IAKpB,OAAO,CAAC,WAAW,CAEjB;IAGF,MAAM;IAgCN,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,YAAY;CAQrB"}
1
+ {"version":3,"file":"pd-icon-panel-button.d.ts","sourceRoot":"","sources":["../src/pd-icon-panel-button.ts"],"names":[],"mappings":"AACA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAa,MAAM,KAAK,CAAC;AAGhD,OAAO,0CAA0C,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,qBACa,iBAAkB,SAAQ,QAAQ;IAE7C,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,UAAU,EAAE,MAAM,CAAQ;IAG1B,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,WAAW,EAAE,OAAO,CAAS;IAG7B,OAAO,CAAC,UAAU,CAAkB;IAEpC,OAAgB,MAAM,EAAE,cAAc,CAuIpC;IAEF,iBAAiB;IAKjB,oBAAoB;IAKpB,OAAO,CAAC,WAAW,CAEjB;IAGF,MAAM;IAgCN,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,YAAY;CAQrB"}
@@ -72,7 +72,9 @@ let PdIconPanelButton = class extends PdBaseUI {
72
72
  } else {
73
73
  this.dispatchEvent(
74
74
  new CustomEvent("button-clicked", {
75
- detail: this.value
75
+ detail: this.value,
76
+ bubbles: true,
77
+ composed: true
76
78
  })
77
79
  );
78
80
  }
@@ -100,7 +102,10 @@ PdIconPanelButton.styles = [
100
102
 
101
103
  .icon-button-style {
102
104
  z-index: 6;
103
- background: #58a linear-gradient(hsla(0, 0%, 100%, 0.2), transparent);
105
+ background: var(
106
+ --pd-icon-button-bg,
107
+ #58a linear-gradient(hsla(0, 0%, 100%, 0.2), transparent)
108
+ );
104
109
  background-color: var(--pd-icon-button-bgcol, #0c6fc5);
105
110
  padding: 0.3em 0.8em;
106
111
  border: 1px solid var(--pd-icon-button-bordercol, rgba(0, 0, 0, 0.5));
@@ -11,8 +11,10 @@ export declare class PdInputArea extends PdBaseInputElement {
11
11
  * Maximum length constraint
12
12
  */
13
13
  maxlength?: number;
14
- constructor();
15
14
  static styles: CSSResultGroup;
15
+ constructor();
16
+ connectedCallback(): void;
17
+ private _setupValidators;
16
18
  render(): import('lit-html').TemplateResult<1>;
17
19
  }
18
20
  //# sourceMappingURL=pd-input-area.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pd-input-area.d.ts","sourceRoot":"","sources":["../src/pd-input-area.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAa,cAAc,EAAE,MAAM,KAAK,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,qBACa,WAAY,SAAQ,kBAAkB;IAEjD,IAAI,SAAK;IAGT,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IAEH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IAEH,SAAS,CAAC,EAAE,MAAM,CAAO;;IAOzB,OAAgB,MAAM,EAAE,cAAc,CAQpC;IAEO,MAAM;CAyBhB"}
1
+ {"version":3,"file":"pd-input-area.d.ts","sourceRoot":"","sources":["../src/pd-input-area.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,EAAa,cAAc,EAAE,MAAM,KAAK,CAAC;AAKhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAIhE,qBACa,WAAY,SAAQ,kBAAkB;IAEjD,IAAI,SAAK;IAGT,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;OAEG;IAEH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IAEH,SAAS,CAAC,EAAE,MAAM,CAAO;IAEzB,OAAgB,MAAM,EAAE,cAAc,CAQpC;;IAOO,iBAAiB,IAAI,IAAI;IAKlC,OAAO,CAAC,gBAAgB;IAsBf,MAAM;CAgChB"}
@@ -1,5 +1,7 @@
1
1
  import { css, html } from "lit";
2
+ import { msg, str } from "@lit/localize";
2
3
  import { property, customElement } from "lit/decorators.js";
4
+ import { classMap } from "lit/directives/class-map.js";
3
5
  import { PdBaseInputElement } from "./pd-base-input-element.js";
4
6
  import { INPUT_TYPE_AREA } from "./pd-base-ui-input.js";
5
7
  var __defProp = Object.defineProperty;
@@ -19,11 +21,35 @@ let PdInputArea = class extends PdBaseInputElement {
19
21
  this.maxlength = 500;
20
22
  this._inputType = INPUT_TYPE_AREA;
21
23
  }
24
+ connectedCallback() {
25
+ this._setupValidators();
26
+ super.connectedCallback();
27
+ }
28
+ _setupValidators() {
29
+ const validators = [];
30
+ if (this.minlength !== void 0) {
31
+ validators.push(
32
+ (value) => value.length < this.minlength ? msg(str`Mindestens ${this.minlength} Zeichen`) : null
33
+ );
34
+ }
35
+ if (this.maxlength !== void 0) {
36
+ validators.push(
37
+ (value) => value.length > this.maxlength ? msg(str`Maximal ${this.maxlength} Zeichen`) : null
38
+ );
39
+ }
40
+ this._validators = validators;
41
+ }
22
42
  render() {
23
43
  const inputAreaId = `${this.id}InputArea`;
24
44
  return html`
25
45
  ${this._renderLabel(inputAreaId)}
26
- <div class="input ${this.errorMsg.length > 0 ? "error" : ""}">
46
+ <div
47
+ class="${classMap(
48
+ this.getClassmap({
49
+ input: true
50
+ })
51
+ )}"
52
+ >
27
53
  <textarea
28
54
  id=${inputAreaId}
29
55
  name=${this.name || this.valueName || this.autoCompleteName}
@@ -39,6 +65,7 @@ let PdInputArea = class extends PdBaseInputElement {
39
65
  .value=${this.value}
40
66
  @keyup=${this._onKeyUp}
41
67
  @blur=${this._onBlur}
68
+ @focus=${this._onFocus}
42
69
  ></textarea>
43
70
  </div>
44
71
  ${this._renderErrorMsg()}
@@ -4,12 +4,13 @@ export declare class PdInputFile extends PdBaseInputElement {
4
4
  icon?: string;
5
5
  accept?: string;
6
6
  maxlength?: number;
7
- constructor();
8
7
  static styles: CSSResultGroup;
8
+ constructor();
9
9
  render(): import('lit-html').TemplateResult<1>;
10
- _onKeyUp(e: KeyboardEvent): void;
11
10
  private _iconClicked;
12
11
  private _onChange;
13
12
  get files(): FileList | null | undefined;
13
+ reset(): void;
14
+ clear(): void;
14
15
  }
15
16
  //# sourceMappingURL=pd-input-file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pd-input-file.d.ts","sourceRoot":"","sources":["../src/pd-input-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAa,cAAc,EAAE,MAAM,KAAK,CAAC;AAGhD,OAAO,0CAA0C,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,qBACa,WAAY,SAAQ,kBAAkB;IAEjD,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,SAAS,CAAC,EAAE,MAAM,CAAC;;IAOnB,OAAgB,MAAM,EAAE,cAAc,CAOpC;IAEO,MAAM;IA6BN,QAAQ,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAIzC,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,SAAS;IAYjB,IAAI,KAAK,IAAI,QAAQ,GAAG,IAAI,GAAG,SAAS,CAIvC;CACF"}
1
+ {"version":3,"file":"pd-input-file.d.ts","sourceRoot":"","sources":["../src/pd-input-file.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAa,cAAc,EAAE,MAAM,KAAK,CAAC;AAIhD,OAAO,0CAA0C,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,qBACa,WAAY,SAAQ,kBAAkB;IAEjD,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,MAAM,CAAC,EAAE,MAAM,CAAC;IAGhB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,OAAgB,MAAM,EAAE,cAAc,CAOpC;;IAOO,MAAM;IAqCf,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,SAAS;IAKjB,IAAI,KAAK,IAAI,QAAQ,GAAG,IAAI,GAAG,SAAS,CAEvC;IAEM,KAAK;IAKL,KAAK,IAAI,IAAI;CAGrB"}
@@ -1,5 +1,6 @@
1
1
  import { css, html } from "lit";
2
2
  import { property, customElement } from "lit/decorators.js";
3
+ import { classMap } from "lit/directives/class-map.js";
3
4
  import "@progressive-development/pd-icon/pd-icon";
4
5
  import { PdBaseInputElement } from "./pd-base-input-element.js";
5
6
  import { INPUT_TYPE_FILE } from "./pd-base-ui-input.js";
@@ -22,11 +23,18 @@ let PdInputFile = class extends PdBaseInputElement {
22
23
  const inputId = `${this.id}Input`;
23
24
  return html`
24
25
  ${this._renderLabel(inputId)}
25
- <div class="input ${this.errorMsg.length > 0 ? "error" : ""}">
26
+ <div
27
+ class="${classMap(
28
+ this.getClassmap({
29
+ input: true
30
+ })
31
+ )}"
32
+ >
26
33
  ${this.icon ? html`<pd-icon
27
34
  icon=${this.icon}
28
35
  activeIcon
29
36
  @click=${this._iconClicked}
37
+ class="infield-icon"
30
38
  ></pd-icon>` : ""}
31
39
  <input
32
40
  id=${inputId}
@@ -38,32 +46,29 @@ let PdInputFile = class extends PdBaseInputElement {
38
46
  ?disabled=${this.disabled}
39
47
  @keyup=${this._onKeyUp}
40
48
  @blur=${this._onBlur}
49
+ @focus=${this._onFocus}
41
50
  @change=${this._onChange}
42
51
  />
43
52
  </div>
44
53
  ${this._renderErrorMsg()}
45
54
  `;
46
55
  }
47
- _onKeyUp(e) {
48
- super._onKeyUp(e);
49
- }
50
56
  _iconClicked() {
51
57
  this.dispatchEvent(new CustomEvent("input-icon-click"));
52
58
  }
53
- _onChange() {
54
- this.dispatchEvent(
55
- new CustomEvent("file-change", {
56
- detail: {
57
- files: this.files
58
- },
59
- bubbles: true,
60
- composed: true
61
- })
62
- );
59
+ _onChange(e) {
60
+ this._handleChangedValue(this._input.value, e, true);
63
61
  }
64
62
  get files() {
65
- var _a, _b;
66
- return (_b = (_a = this.shadowRoot) == null ? void 0 : _a.getElementById(`${this.id}Input`)) == null ? void 0 : _b.files;
63
+ var _a;
64
+ return (_a = this._input) == null ? void 0 : _a.files;
65
+ }
66
+ reset() {
67
+ this._input.value = "";
68
+ super.reset();
69
+ }
70
+ clear() {
71
+ this.reset();
67
72
  }
68
73
  };
69
74
  PdInputFile.styles = [
@@ -2,9 +2,10 @@ import { CSSResultGroup } from 'lit';
2
2
  import { PdBaseInputElement } from './pd-base-input-element.js';
3
3
  export declare class PdInputTime extends PdBaseInputElement {
4
4
  icon?: string;
5
- constructor();
6
5
  static get styles(): CSSResultGroup;
6
+ constructor();
7
7
  render(): import('lit-html').TemplateResult<1>;
8
+ private _onChange;
8
9
  private _iconClicked;
9
10
  }
10
11
  //# sourceMappingURL=pd-input-time.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pd-input-time.d.ts","sourceRoot":"","sources":["../src/pd-input-time.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAa,cAAc,EAAE,MAAM,KAAK,CAAC;AAGhD,OAAO,0CAA0C,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,qBACa,WAAY,SAAQ,kBAAkB;IAEjD,IAAI,CAAC,EAAE,MAAM,CAAC;;IAOd,WAAoB,MAAM,IAAI,cAAc,CAS3C;IAEQ,MAAM;IA4Bf,OAAO,CAAC,YAAY;CAGrB"}
1
+ {"version":3,"file":"pd-input-time.d.ts","sourceRoot":"","sources":["../src/pd-input-time.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAa,cAAc,EAAE,MAAM,KAAK,CAAC;AAIhD,OAAO,0CAA0C,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAGhE,qBACa,WAAY,SAAQ,kBAAkB;IAEjD,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,WAAoB,MAAM,IAAI,cAAc,CAS3C;;IAOQ,MAAM;IAqCf,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,YAAY;CAGrB"}
@@ -1,5 +1,6 @@
1
1
  import { css, html } from "lit";
2
2
  import { property, customElement } from "lit/decorators.js";
3
+ import { classMap } from "lit/directives/class-map.js";
3
4
  import "@progressive-development/pd-icon/pd-icon";
4
5
  import { PdBaseInputElement } from "./pd-base-input-element.js";
5
6
  import { INPUT_TYPE_TIME } from "./pd-base-ui-input.js";
@@ -14,10 +15,6 @@ var __decorateClass = (decorators, target, key, kind) => {
14
15
  return result;
15
16
  };
16
17
  let PdInputTime = class extends PdBaseInputElement {
17
- constructor() {
18
- super();
19
- this._inputType = INPUT_TYPE_TIME;
20
- }
21
18
  static get styles() {
22
19
  return [
23
20
  PdBaseInputElement.styles,
@@ -28,31 +25,47 @@ let PdInputTime = class extends PdBaseInputElement {
28
25
  `
29
26
  ];
30
27
  }
28
+ constructor() {
29
+ super();
30
+ this._inputType = INPUT_TYPE_TIME;
31
+ }
31
32
  render() {
32
33
  const inputId = `${this.id}Input`;
33
34
  return html`
34
35
  ${this._renderLabel(inputId)}
35
- <div class="input ${this.errorMsg.length > 0 ? "error" : ""}">
36
+ <div
37
+ class="${classMap(
38
+ this.getClassmap({
39
+ input: true
40
+ })
41
+ )}"
42
+ >
36
43
  ${this.icon ? html`<pd-icon
37
44
  icon=${this.icon}
38
45
  activeIcon
39
46
  @click=${this._iconClicked}
47
+ class="infield-icon"
40
48
  ></pd-icon>` : ""}
41
49
  <input
42
50
  id=${inputId}
43
51
  name=${this.name || this.valueName || this.autoCompleteName}
44
52
  class="input-style ${this.gradient ? "gradient" : ""}"
45
53
  type="time"
46
- .value=${this.value}
54
+ .value=${this._value}
47
55
  ?readonly=${this.readonly}
48
56
  ?disabled=${this.disabled}
49
57
  @keyup=${this._onKeyUp}
58
+ @change=${this._onChange}
50
59
  @blur=${this._onBlur}
60
+ @focus=${this._onFocus}
51
61
  />
52
62
  </div>
53
63
  ${this._renderErrorMsg()}
54
64
  `;
55
65
  }
66
+ _onChange(e) {
67
+ this._handleChangedValue(this._input.value, e, true);
68
+ }
56
69
  _iconClicked() {
57
70
  this.dispatchEvent(new CustomEvent("input-icon-click"));
58
71
  }
@@ -21,8 +21,10 @@ export declare class PdInput extends PdBaseInputElement {
21
21
  * If true, restricts input to numbers only (legacy, use type="number" langfristig)
22
22
  */
23
23
  onlyNumbers: boolean;
24
- constructor();
25
24
  static styles: CSSResultGroup;
25
+ constructor();
26
+ connectedCallback(): void;
27
+ private _setupValidators;
26
28
  render(): TemplateResult;
27
29
  protected _onKeyUp(e: KeyboardEvent): void;
28
30
  private _iconClicked;
@@ -1 +1 @@
1
- {"version":3,"file":"pd-input.d.ts","sourceRoot":"","sources":["../src/pd-input.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAa,KAAK,cAAc,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAGrE,OAAO,0CAA0C,CAAC;AAGlD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAIhE,qBACa,OAAQ,SAAQ,kBAAkB;IAC7C;;OAEG;IAEH,IAAI,SAAM;IAEV;;OAEG;IAEH,MAAM,UAAS;IAEf;;OAEG;IAEH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IAEH,SAAS,CAAC,EAAE,MAAM,CAAO;IAEzB;;OAEG;IAEH,WAAW,UAAS;;IAOpB,OAAgB,MAAM,EAAE,cAAc,CAOpC;IAEO,MAAM,IAAI,cAAc;cAmCd,QAAQ,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAYnD,OAAO,CAAC,YAAY;CAKrB"}
1
+ {"version":3,"file":"pd-input.d.ts","sourceRoot":"","sources":["../src/pd-input.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAa,KAAK,cAAc,EAAE,cAAc,EAAE,MAAM,KAAK,CAAC;AAKrE,OAAO,0CAA0C,CAAC;AAGlD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAKhE,qBACa,OAAQ,SAAQ,kBAAkB;IAC7C;;OAEG;IAEH,IAAI,SAAM;IAEV;;OAEG;IAEH,MAAM,UAAS;IAEf;;OAEG;IAEH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IAEH,SAAS,CAAC,EAAE,MAAM,CAAO;IAEzB;;OAEG;IAEH,WAAW,UAAS;IAEpB,OAAgB,MAAM,EAAE,cAAc,CAOpC;;IAOO,iBAAiB,IAAI,IAAI;IAMlC,OAAO,CAAC,gBAAgB;IAsBf,MAAM,IAAI,cAAc;cA0Cd,QAAQ,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAWnD,OAAO,CAAC,YAAY;CAKrB"}
package/dist/pd-input.js CHANGED
@@ -1,5 +1,7 @@
1
1
  import { css, html } from "lit";
2
+ import { msg, str } from "@lit/localize";
2
3
  import { property, customElement } from "lit/decorators.js";
4
+ import { classMap } from "lit/directives/class-map.js";
3
5
  import "@progressive-development/pd-icon/pd-icon";
4
6
  import { INPUT_TYPE_TEXT } from "./pd-base-ui-input.js";
5
7
  import { PdBaseInputElement } from "./pd-base-input-element.js";
@@ -13,7 +15,7 @@ var __decorateClass = (decorators, target, key, kind) => {
13
15
  if (kind && result) __defProp(target, key, result);
14
16
  return result;
15
17
  };
16
- const onlyContainsNumbers = (str) => /^\d+$/.test(str);
18
+ const onlyContainsNumbers = (str2) => /^\d+$/.test(str2);
17
19
  let PdInput = class extends PdBaseInputElement {
18
20
  constructor() {
19
21
  super();
@@ -23,16 +25,41 @@ let PdInput = class extends PdBaseInputElement {
23
25
  this.onlyNumbers = false;
24
26
  this._inputType = INPUT_TYPE_TEXT;
25
27
  }
28
+ connectedCallback() {
29
+ this._setupValidators();
30
+ super.connectedCallback();
31
+ }
32
+ _setupValidators() {
33
+ const validators = [];
34
+ if (this.minlength !== void 0) {
35
+ validators.push(
36
+ (value) => value.length < this.minlength ? msg(str`Mindestens ${this.minlength} Zeichen`) : null
37
+ );
38
+ }
39
+ if (this.maxlength !== void 0) {
40
+ validators.push(
41
+ (value) => value.length > this.maxlength ? msg(str`Maximal ${this.maxlength} Zeichen`) : null
42
+ );
43
+ }
44
+ this._validators = validators;
45
+ }
26
46
  render() {
27
47
  const inputId = `${this.id}Input`;
28
48
  return html`
29
49
  ${this._renderLabel(inputId)}
30
- <div class="input ${this.errorMsg.length > 0 ? "error" : ""}">
50
+ <div
51
+ class="${classMap(
52
+ this.getClassmap({
53
+ input: true
54
+ })
55
+ )}"
56
+ >
31
57
  ${this.icon ? html`
32
58
  <pd-icon
33
59
  icon=${this.icon}
34
60
  activeIcon
35
61
  @click=${this._iconClicked}
62
+ class="infield-icon"
36
63
  ></pd-icon>
37
64
  ` : ""}
38
65
  <input
@@ -42,13 +69,14 @@ let PdInput = class extends PdBaseInputElement {
42
69
  class="input-style ${this.gradient ? "gradient" : ""}"
43
70
  type=${this.secret ? "password" : "text"}
44
71
  placeholder=${this.placeHolder}
45
- .value=${this.value}
72
+ .value=${this._value}
46
73
  minlength=${this.minlength ?? ""}
47
74
  maxlength=${this.maxlength ?? ""}
48
75
  ?readonly=${this.readonly}
49
76
  ?disabled=${this.disabled}
50
77
  @keyup=${this._onKeyUp}
51
78
  @blur=${this._onBlur}
79
+ @focus=${this._onFocus}
52
80
  />
53
81
  </div>
54
82
  ${this._renderErrorMsg()}
@@ -58,9 +86,8 @@ let PdInput = class extends PdBaseInputElement {
58
86
  var _a;
59
87
  if (this.onlyNumbers && ((_a = this._input) == null ? void 0 : _a.value) && !onlyContainsNumbers(this._input.value)) {
60
88
  this._input.value = this._input.value.replace(/\D/g, "");
61
- } else {
62
- super._onKeyUp(e);
63
89
  }
90
+ super._onKeyUp(e);
64
91
  }
65
92
  _iconClicked() {
66
93
  this.dispatchEvent(
@@ -4,6 +4,9 @@ export declare class PdRadioGroup extends PdBaseUIInput {
4
4
  static styles: CSSResultGroup;
5
5
  firstUpdated(): void;
6
6
  render(): import('lit-html').TemplateResult<1>;
7
- private _dispatchValidation;
7
+ private _onInternalBlur;
8
+ private _onInternalFocus;
9
+ private _onInternalChange;
10
+ private _onInternalRegister;
8
11
  }
9
12
  //# sourceMappingURL=pd-radio-group.d.ts.map