@projectcaluma/ember-form 11.0.0-beta.2 → 11.0.0-beta.20

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 (48) hide show
  1. package/CHANGELOG.md +190 -0
  2. package/addon/components/cf-content.hbs +37 -37
  3. package/addon/components/cf-content.js +2 -2
  4. package/addon/components/cf-field/hint.hbs +5 -0
  5. package/addon/components/cf-field/info.hbs +2 -2
  6. package/addon/components/cf-field/info.js +0 -15
  7. package/addon/components/cf-field/input/action-button.hbs +8 -4
  8. package/addon/components/cf-field/input/action-button.js +60 -59
  9. package/addon/components/cf-field/input/checkbox.hbs +3 -4
  10. package/addon/components/cf-field/input/date.hbs +10 -5
  11. package/addon/components/cf-field/input/date.js +40 -10
  12. package/addon/components/cf-field/input/file.hbs +2 -2
  13. package/addon/components/cf-field/input/file.js +2 -2
  14. package/addon/components/cf-field/input/powerselect.hbs +27 -29
  15. package/addon/components/cf-field/input/powerselect.js +8 -2
  16. package/addon/components/cf-field/input/radio.hbs +2 -2
  17. package/addon/components/cf-field/input/static.hbs +1 -1
  18. package/addon/components/cf-field/input/table.hbs +25 -24
  19. package/addon/components/cf-field/input/table.js +1 -11
  20. package/addon/components/cf-field/input.hbs +8 -21
  21. package/addon/components/cf-field/input.js +32 -14
  22. package/addon/components/cf-field/label.hbs +4 -2
  23. package/addon/components/cf-field-value.hbs +22 -7
  24. package/addon/components/cf-field-value.js +8 -33
  25. package/addon/components/cf-field.hbs +39 -6
  26. package/addon/components/cf-field.js +37 -17
  27. package/addon/components/cf-form-wrapper.hbs +3 -1
  28. package/addon/components/document-validity.js +16 -1
  29. package/addon/gql/fragments/field.graphql +30 -0
  30. package/addon/helpers/format-graphql-error.js +21 -0
  31. package/addon/helpers/get-widget.js +16 -2
  32. package/addon/instance-initializers/form-widget-overrides.js +52 -0
  33. package/addon/lib/field.js +73 -46
  34. package/addon/lib/navigation.js +3 -1
  35. package/addon/lib/question.js +12 -4
  36. package/addon/modifiers/autoresize.js +16 -0
  37. package/app/components/cf-field/hint.js +1 -0
  38. package/app/helpers/format-graphql-error.js +1 -0
  39. package/app/helpers/get-widget.js +1 -4
  40. package/app/instance-initializers/form-widget-overrides.js +4 -0
  41. package/app/modifiers/autoresize.js +1 -0
  42. package/app/styles/@projectcaluma/ember-form.scss +3 -15
  43. package/package.json +37 -25
  44. package/translations/de.yaml +6 -2
  45. package/translations/en.yaml +6 -2
  46. package/translations/fr.yaml +6 -2
  47. package/addon/components/cf-field/label.js +0 -11
  48. package/addon/instance-initializers/setup-pikaday-i18n.js +0 -35
@@ -19,6 +19,16 @@ fragment SimpleQuestion on Question {
19
19
  value
20
20
  }
21
21
  placeholder
22
+ formatValidators {
23
+ edges {
24
+ node {
25
+ slug
26
+ regex
27
+ errorMsg
28
+ }
29
+ }
30
+ }
31
+ hintText
22
32
  }
23
33
  ... on TextareaQuestion {
24
34
  textareaMinLength: minLength
@@ -28,6 +38,16 @@ fragment SimpleQuestion on Question {
28
38
  value
29
39
  }
30
40
  placeholder
41
+ formatValidators {
42
+ edges {
43
+ node {
44
+ slug
45
+ regex
46
+ errorMsg
47
+ }
48
+ }
49
+ }
50
+ hintText
31
51
  }
32
52
  ... on IntegerQuestion {
33
53
  integerMinValue: minValue
@@ -37,6 +57,7 @@ fragment SimpleQuestion on Question {
37
57
  value
38
58
  }
39
59
  placeholder
60
+ hintText
40
61
  }
41
62
  ... on FloatQuestion {
42
63
  floatMinValue: minValue
@@ -46,6 +67,7 @@ fragment SimpleQuestion on Question {
46
67
  value
47
68
  }
48
69
  placeholder
70
+ hintText
49
71
  }
50
72
  ... on ChoiceQuestion {
51
73
  choiceOptions: options {
@@ -62,6 +84,7 @@ fragment SimpleQuestion on Question {
62
84
  id
63
85
  value
64
86
  }
87
+ hintText
65
88
  }
66
89
  ... on MultipleChoiceQuestion {
67
90
  multipleChoiceOptions: options {
@@ -78,18 +101,24 @@ fragment SimpleQuestion on Question {
78
101
  id
79
102
  value
80
103
  }
104
+ hintText
81
105
  }
82
106
  ... on DateQuestion {
83
107
  dateDefaultAnswer: defaultAnswer {
84
108
  id
85
109
  value
86
110
  }
111
+ hintText
87
112
  }
88
113
  ... on StaticQuestion {
89
114
  staticContent
90
115
  }
91
116
  ... on CalculatedFloatQuestion {
92
117
  calcExpression
118
+ hintText
119
+ }
120
+ ... on FileQuestion {
121
+ hintText
93
122
  }
94
123
  ... on ActionButtonQuestion {
95
124
  action
@@ -112,6 +141,7 @@ fragment FieldTableQuestion on Question {
112
141
  }
113
142
  }
114
143
  }
144
+ hintText
115
145
  tableDefaultAnswer: defaultAnswer {
116
146
  id
117
147
  value {
@@ -0,0 +1,21 @@
1
+ import { helper } from "@ember/component/helper";
2
+
3
+ export function formatGraphqlErrorObject(error) {
4
+ try {
5
+ const path = error.path.join(".");
6
+ const { line, column } = error.locations[error.locations.length - 1];
7
+
8
+ return `${path}:${line}:${column}: ${error.message}`;
9
+ } catch (e) {
10
+ return null;
11
+ }
12
+ }
13
+
14
+ export function formatGraphqlError(error) {
15
+ return (
16
+ error?.errors?.map(formatGraphqlErrorObject).filter(Boolean).join("\n") ??
17
+ ""
18
+ );
19
+ }
20
+
21
+ export default helper(([error]) => formatGraphqlError(error));
@@ -1,6 +1,15 @@
1
1
  import Helper from "@ember/component/helper";
2
2
  import { warn } from "@ember/debug";
3
3
  import { inject as service } from "@ember/service";
4
+ import { ensureSafeComponent } from "@embroider/util";
5
+
6
+ import InputComponent from "@projectcaluma/ember-form/components/cf-field/input";
7
+ import FormComponent from "@projectcaluma/ember-form/components/cf-form";
8
+
9
+ const DEFAULT_WIDGETS = {
10
+ "cf-field/input": InputComponent,
11
+ "cf-form": FormComponent,
12
+ };
4
13
 
5
14
  /**
6
15
  * Helper for getting the right widget.
@@ -42,9 +51,14 @@ export default class GetWidgetHelper extends Helper {
42
51
  { id: "ember-caluma.unregistered-override" }
43
52
  );
44
53
 
45
- if (override) return widget;
54
+ if (override) {
55
+ return ensureSafeComponent(
56
+ override.componentClass ?? override.component,
57
+ this
58
+ );
59
+ }
46
60
  }
47
61
 
48
- return defaultWidget;
62
+ return ensureSafeComponent(DEFAULT_WIDGETS[defaultWidget], this);
49
63
  }
50
64
  }
@@ -0,0 +1,52 @@
1
+ import { setOwner } from "@ember/application";
2
+ import { inject as service } from "@ember/service";
3
+
4
+ import HiddenComponent from "@projectcaluma/ember-form/components/cf-field/input/hidden";
5
+ import PowerSelectComponent from "@projectcaluma/ember-form/components/cf-field/input/powerselect";
6
+
7
+ class HiddenOverride {
8
+ @service intl;
9
+
10
+ get label() {
11
+ return this.intl.t("caluma.form-builder.question.widgetOverrides.hidden");
12
+ }
13
+
14
+ component = "cf-field/input/hidden";
15
+ componentClass = HiddenComponent;
16
+ }
17
+
18
+ class PowerSelectOverride {
19
+ @service intl;
20
+
21
+ get label() {
22
+ return this.intl.t(
23
+ "caluma.form-builder.question.widgetOverrides.powerselect"
24
+ );
25
+ }
26
+
27
+ component = "cf-field/input/powerselect";
28
+ componentClass = PowerSelectComponent;
29
+ types = [
30
+ "ChoiceQuestion",
31
+ "MultipleChoiceQuestion",
32
+ "DynamicChoiceQuestion",
33
+ "DynamicMultipleChoiceQuestion",
34
+ ];
35
+ }
36
+
37
+ export function initialize(appInstance) {
38
+ const options = appInstance.lookup("service:caluma-options");
39
+
40
+ const hiddenOverride = new HiddenOverride();
41
+ const powerSelectOverride = new PowerSelectOverride();
42
+
43
+ setOwner(hiddenOverride, appInstance);
44
+ setOwner(powerSelectOverride, appInstance);
45
+
46
+ options.registerComponentOverride(hiddenOverride);
47
+ options.registerComponentOverride(powerSelectOverride);
48
+ }
49
+
50
+ export default {
51
+ initialize,
52
+ };
@@ -3,6 +3,7 @@ import { assert } from "@ember/debug";
3
3
  import { associateDestroyableChild } from "@ember/destroyable";
4
4
  import { inject as service } from "@ember/service";
5
5
  import { camelize } from "@ember/string";
6
+ import { isEmpty } from "@ember/utils";
6
7
  import { tracked } from "@glimmer/tracking";
7
8
  import { queryManager } from "ember-apollo-client";
8
9
  import { restartableTask, lastValue, dropTask } from "ember-concurrency";
@@ -63,7 +64,6 @@ const fieldIsHiddenOrEmpty = (field) => {
63
64
  */
64
65
  export default class Field extends Base {
65
66
  @service intl;
66
- @service validator;
67
67
 
68
68
  @queryManager apollo;
69
69
 
@@ -83,18 +83,12 @@ export default class Field extends Base {
83
83
  _createQuestion() {
84
84
  const owner = getOwner(this);
85
85
 
86
- const question =
86
+ this.question =
87
87
  this.calumaStore.find(`Question:${this.raw.question.slug}`) ||
88
88
  new (owner.factoryFor("caluma-model:question").class)({
89
89
  raw: this.raw.question,
90
90
  owner,
91
91
  });
92
-
93
- if (question.isDynamic) {
94
- question.loadDynamicOptions.perform();
95
- }
96
-
97
- this.question = question;
98
92
  }
99
93
 
100
94
  _createAnswer() {
@@ -113,6 +107,7 @@ export default class Field extends Base {
113
107
 
114
108
  answer = new Answer({
115
109
  raw: {
110
+ id: null,
116
111
  __typename: answerType,
117
112
  question: { slug: this.raw.question.slug },
118
113
  [camelize(answerType.replace(/Answer$/, "Value"))]: null,
@@ -152,6 +147,16 @@ export default class Field extends Base {
152
147
  */
153
148
  @tracked _errors = [];
154
149
 
150
+ /**
151
+ * Currently rendered field components that use this field. This is used in
152
+ * the document validity component to await all current save tasks before
153
+ * validating.
154
+ *
155
+ * @property {Set} _components
156
+ * @private
157
+ */
158
+ _components = new Set();
159
+
155
160
  /**
156
161
  * The primary key of the field. Consists of the document and question primary
157
162
  * keys.
@@ -577,10 +582,10 @@ export default class Field extends Base {
577
582
  @cached
578
583
  get errors() {
579
584
  return this._errors.map(({ type, context, value }) => {
580
- return this.intl.t(
581
- `caluma.form.validation.${type}`,
582
- Object.assign({}, context, { value })
583
- );
585
+ return this.intl.t(`caluma.form.validation.${type}`, {
586
+ ...context,
587
+ value,
588
+ });
584
589
  });
585
590
  }
586
591
 
@@ -618,6 +623,35 @@ export default class Field extends Base {
618
623
  this._errors = errors;
619
624
  }
620
625
 
626
+ /**
627
+ * Validate the value against the regexes of the given format validators.
628
+ *
629
+ * @method _validateFormatValidators
630
+ * @return {Array<Boolean|Object>} An array of error objects or `true`
631
+ * @private
632
+ */
633
+ _validateFormatValidators() {
634
+ const validators =
635
+ this.question.raw.formatValidators?.edges.map((edge) => edge.node) ?? [];
636
+ const value = this.answer.value;
637
+
638
+ if (isEmpty(value)) {
639
+ // empty values should not be validated since they are handled by the
640
+ // requiredness validation
641
+ return validators.map(() => true);
642
+ }
643
+
644
+ return validators.map((validator) => {
645
+ return (
646
+ new RegExp(validator.regex).test(value) || {
647
+ type: "format",
648
+ context: { errorMsg: validator.errorMsg },
649
+ value,
650
+ }
651
+ );
652
+ });
653
+ }
654
+
621
655
  /**
622
656
  * Method to validate if a question is required or not.
623
657
  *
@@ -637,15 +671,12 @@ export default class Field extends Base {
637
671
  * predefined by the question.
638
672
  *
639
673
  * @method _validateTextQuestion
640
- * @return {Promise<Boolean|Object>} A promise which resolves into an object if invalid or true if valid
674
+ * @return {Array<Boolean|Object>} An array of error objects or `true`
641
675
  * @private
642
676
  */
643
- async _validateTextQuestion() {
677
+ _validateTextQuestion() {
644
678
  return [
645
- ...(await this.validator.validate(
646
- this.answer.value,
647
- this.question.raw.meta.formatValidators ?? []
648
- )),
679
+ ...this._validateFormatValidators(),
649
680
  validate("length", this.answer.value, {
650
681
  min: this.question.raw.textMinLength || 0,
651
682
  max: this.question.raw.textMaxLength || Number.POSITIVE_INFINITY,
@@ -658,15 +689,12 @@ export default class Field extends Base {
658
689
  * than predefined by the question.
659
690
  *
660
691
  * @method _validateTextareaQuestion
661
- * @return {Promise<Boolean|Object>} A promise which resolves into an object if invalid or true if valid
692
+ * @return {Array<Boolean|Object>} An array of error objects or `true`
662
693
  * @private
663
694
  */
664
- async _validateTextareaQuestion() {
695
+ _validateTextareaQuestion() {
665
696
  return [
666
- ...(await this.validator.validate(
667
- this.answer.value,
668
- this.question.raw.meta.formatValidators ?? []
669
- )),
697
+ ...this._validateFormatValidators(),
670
698
  validate("length", this.answer.value, {
671
699
  min: this.question.raw.textareaMinLength || 0,
672
700
  max: this.question.raw.textareaMaxLength || Number.POSITIVE_INFINITY,
@@ -714,10 +742,7 @@ export default class Field extends Base {
714
742
  * @private
715
743
  */
716
744
  _validateChoiceQuestion() {
717
- return validate("inclusion", this.answer.value, {
718
- allowBlank: true,
719
- in: (this.options || []).map(({ slug }) => slug),
720
- });
745
+ return this._validateOption(this.answer.value, true);
721
746
  }
722
747
 
723
748
  /**
@@ -729,15 +754,9 @@ export default class Field extends Base {
729
754
  * @private
730
755
  */
731
756
  _validateMultipleChoiceQuestion() {
732
- const value = this.answer.value;
733
- if (!value) {
734
- return true;
735
- }
736
- return value.map((value) =>
737
- validate("inclusion", value, {
738
- in: (this.options || []).map(({ slug }) => slug),
739
- })
740
- );
757
+ return this.answer.value
758
+ ? this.answer.value.map((value) => this._validateOption(value))
759
+ : true;
741
760
  }
742
761
 
743
762
  /**
@@ -749,11 +768,9 @@ export default class Field extends Base {
749
768
  * @private
750
769
  */
751
770
  async _validateDynamicChoiceQuestion() {
752
- await this.question.loadDynamicOptions.perform();
771
+ await this.question.dynamicOptions;
753
772
 
754
- return validate("inclusion", this.answer.value, {
755
- in: (this.options || []).map(({ slug }) => slug),
756
- });
773
+ return this._validateOption(this.answer.value);
757
774
  }
758
775
 
759
776
  /**
@@ -771,12 +788,22 @@ export default class Field extends Base {
771
788
  return true;
772
789
  }
773
790
 
774
- await this.question.loadDynamicOptions.perform();
791
+ await this.question.dynamicOptions;
775
792
 
776
- return value.map((value) => {
777
- return validate("inclusion", value, {
778
- in: (this.options || []).map(({ slug }) => slug),
779
- });
793
+ return value.map((value) => this._validateOption(value));
794
+ }
795
+
796
+ _validateOption(value, allowBlank = false) {
797
+ const label = Array.isArray(this.selected)
798
+ ? this.selected.find((selected) => selected.slug === value)?.label
799
+ : this.selected?.label;
800
+
801
+ return validate("inclusion", value, {
802
+ in: (this.options || [])
803
+ .filter((option) => !option.disabled)
804
+ .map(({ slug }) => slug),
805
+ allowBlank,
806
+ label: label ?? value,
780
807
  });
781
808
  }
782
809
 
@@ -232,7 +232,9 @@ export class NavigationItem extends Base {
232
232
  @cached
233
233
  get visibleFields() {
234
234
  return this.fieldset.fields.filter(
235
- (f) => f.questionType !== "FormQuestion" && !f.hidden
235
+ (f) =>
236
+ !["FormQuestion", "StaticQuestion"].includes(f.questionType) &&
237
+ !f.hidden
236
238
  );
237
239
  }
238
240
 
@@ -1,7 +1,8 @@
1
1
  import { assert } from "@ember/debug";
2
2
  import { camelize } from "@ember/string";
3
3
  import { queryManager } from "ember-apollo-client";
4
- import { dropTask, lastValue } from "ember-concurrency";
4
+ import { dropTask } from "ember-concurrency";
5
+ import { trackedTask } from "ember-resources/util/ember-concurrency";
5
6
  import { cached } from "tracked-toolbox";
6
7
 
7
8
  import getDynamicOptions from "@projectcaluma/ember-form/gql/queries/dynamic-options.graphql";
@@ -71,13 +72,20 @@ export default class Question extends Base {
71
72
  );
72
73
 
73
74
  return (
74
- question.node.dynamicChoiceOptions ||
75
+ question.node.dynamicChoiceOptions ??
75
76
  question.node.dynamicMultipleChoiceOptions
76
77
  );
77
78
  }
78
79
 
79
- @lastValue("loadDynamicOptions") dynamicChoiceOptions;
80
- @lastValue("loadDynamicOptions") dynamicMultipleChoiceOptions;
80
+ dynamicOptions = trackedTask(this, this.loadDynamicOptions, () => []);
81
+
82
+ get dynamicChoiceOptions() {
83
+ return this.dynamicOptions.value ?? [];
84
+ }
85
+
86
+ get dynamicMultipleChoiceOptions() {
87
+ return this.dynamicOptions.value ?? [];
88
+ }
81
89
 
82
90
  /**
83
91
  * Whether the question is a single choice question
@@ -0,0 +1,16 @@
1
+ import { inject as service } from "@ember/service";
2
+ import AutoresizeModifier from "ember-autoresize-modifier/modifiers/autoresize";
3
+
4
+ export default class CustomAutoresizeModifier extends AutoresizeModifier {
5
+ @service inViewport;
6
+
7
+ didInstall() {
8
+ super.didInstall();
9
+
10
+ this.inViewport.watchElement(this.element).onEnter(this.resize);
11
+ }
12
+
13
+ willRemove() {
14
+ this.inViewport.stopWatching(this.element);
15
+ }
16
+ }
@@ -0,0 +1 @@
1
+ export { default } from "@projectcaluma/ember-form/components/cf-field/hint";
@@ -0,0 +1 @@
1
+ export { default } from "@projectcaluma/ember-form/helpers/format-graphql-error";
@@ -1,4 +1 @@
1
- export {
2
- default,
3
- getWidget,
4
- } from "@projectcaluma/ember-form/helpers/get-widget";
1
+ export { default } from "@projectcaluma/ember-form/helpers/get-widget";
@@ -0,0 +1,4 @@
1
+ export {
2
+ default,
3
+ initialize,
4
+ } from "@projectcaluma/ember-form/instance-initializers/form-widget-overrides";
@@ -0,0 +1 @@
1
+ export { default } from "@projectcaluma/ember-form/modifiers/autoresize";
@@ -5,19 +5,7 @@
5
5
 
6
6
  @import "../uikit-overwrites";
7
7
 
8
- .cf-checkbox_label {
9
- display: block;
10
- position: relative;
11
- padding-left: 26px;
12
-
13
- .uk-checkbox {
14
- position: absolute;
15
- top: 0.25em;
16
- left: 0;
17
- margin: 0;
18
- }
19
-
20
- & + br {
21
- display: none;
22
- }
8
+ .table-controls > .uk-icon {
9
+ min-height: 20px;
10
+ min-width: 20px;
23
11
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@projectcaluma/ember-form",
3
- "version": "11.0.0-beta.2",
3
+ "version": "11.0.0-beta.20",
4
4
  "description": "Ember addon for rendering Caluma forms.",
5
5
  "keywords": [
6
6
  "ember-addon"
@@ -14,44 +14,48 @@
14
14
  "test:ember-compatibility": "ember try:each"
15
15
  },
16
16
  "dependencies": {
17
- "@glimmer/component": "^1.0.4",
18
- "@glimmer/tracking": "^1.0.4",
19
- "@projectcaluma/ember-core": "^11.0.0-beta.2",
20
- "ember-apollo-client": "^3.2.0",
21
- "ember-auto-import": "^2.3.0",
17
+ "@ember/string": "^3.0.0",
18
+ "@embroider/macros": "^1.7.1",
19
+ "@embroider/util": "^1.7.1",
20
+ "@glimmer/component": "^1.1.2",
21
+ "@glimmer/tracking": "^1.1.2",
22
+ "@projectcaluma/ember-core": "^11.0.0-beta.7",
23
+ "ember-apollo-client": "^4.0.2",
24
+ "ember-auto-import": "^2.4.2",
22
25
  "ember-autoresize-modifier": "^0.5.0",
23
26
  "ember-cli-babel": "^7.26.11",
24
27
  "ember-cli-htmlbars": "^6.0.1",
25
28
  "ember-cli-showdown": "^6.0.1",
26
29
  "ember-composable-helpers": "^5.0.0",
30
+ "ember-concurrency": "^2.2.1",
27
31
  "ember-fetch": "^8.1.1",
28
- "ember-in-viewport": "^4.0.0",
32
+ "ember-in-viewport": "^4.0.2",
29
33
  "ember-intl": "^5.7.2",
30
- "ember-math-helpers": "^2.18.0",
31
- "ember-pikaday": "^3.0.0",
32
- "ember-power-select": "^5.0.3",
33
- "ember-resources": "^4.1.3",
34
- "ember-uikit": "^4.0.0",
35
- "ember-validators": "^4.0.1",
34
+ "ember-math-helpers": "^2.18.2",
35
+ "ember-pikaday": "^4.0.0",
36
+ "ember-power-select": "^5.0.4",
37
+ "ember-resources": "^4.8.2",
38
+ "ember-uikit": "^5.1.3",
39
+ "ember-validators": "^4.1.2",
36
40
  "graphql": "^15.8.0",
37
41
  "jexl": "^2.3.0",
38
42
  "lodash.isequal": "^4.5.0",
39
- "moment": "^2.29.1",
43
+ "luxon": "^2.4.0",
40
44
  "tracked-toolbox": "^1.2.3"
41
45
  },
42
46
  "devDependencies": {
43
47
  "@ember/optional-features": "2.0.0",
44
- "@ember/test-helpers": "2.6.0",
45
- "@embroider/test-setup": "0.50.2",
46
- "@faker-js/faker": "6.0.0-alpha.3",
47
- "@projectcaluma/ember-testing": "10.2.0-beta.1",
48
- "@projectcaluma/ember-workflow": "11.0.0-beta.1",
48
+ "@ember/test-helpers": "2.8.1",
49
+ "@embroider/test-setup": "1.7.1",
50
+ "@faker-js/faker": "7.2.0",
51
+ "@projectcaluma/ember-testing": "11.0.0-beta.8",
52
+ "@projectcaluma/ember-workflow": "^11.0.0-beta.7",
49
53
  "broccoli-asset-rev": "3.0.0",
50
54
  "ember-cli": "3.28.5",
51
55
  "ember-cli-code-coverage": "1.0.3",
52
- "ember-cli-dependency-checker": "3.2.0",
56
+ "ember-cli-dependency-checker": "3.3.1",
53
57
  "ember-cli-inject-live-reload": "2.1.0",
54
- "ember-cli-mirage": "2.3.1",
58
+ "ember-cli-mirage": "3.0.0-alpha.3",
55
59
  "ember-cli-sri": "2.1.1",
56
60
  "ember-cli-terser": "4.0.2",
57
61
  "ember-disable-prototype-extensions": "1.1.3",
@@ -60,16 +64,24 @@
60
64
  "ember-maybe-import-regenerator": "1.0.0",
61
65
  "ember-qunit": "5.1.5",
62
66
  "ember-resolver": "8.0.3",
63
- "ember-source": "3.28.8",
67
+ "ember-source": "3.28.9",
64
68
  "ember-source-channel-url": "3.0.0",
65
69
  "ember-try": "2.0.0",
66
70
  "loader.js": "4.7.0",
67
- "miragejs": "0.1.43",
71
+ "miragejs": "0.1.45",
68
72
  "npm-run-all": "4.1.5",
69
- "qunit": "2.17.2",
73
+ "qunit": "2.19.1",
70
74
  "qunit-dom": "2.0.0",
71
75
  "uuid": "8.3.2",
72
- "webpack": "5.66.0"
76
+ "webpack": "5.73.0"
77
+ },
78
+ "peerDependencies": {
79
+ "@projectcaluma/ember-workflow": "^11.0.0-beta.7"
80
+ },
81
+ "peerDependenciesMeta": {
82
+ "@projectcaluma/ember-workflow": {
83
+ "optional": true
84
+ }
73
85
  },
74
86
  "engines": {
75
87
  "node": "12.* || 14.* || >= 16"
@@ -12,6 +12,10 @@ caluma:
12
12
  optionNotAvailable: "Diese Option ist nicht mehr verfügbar"
13
13
  info: "Mehr Informationen"
14
14
 
15
+ error:
16
+ intro: "Oh nein, auf unserer Seite ist etwas schief gelaufen. Ihre Antwort konnte nicht gespeichert werden."
17
+ details: "Technische Details:"
18
+
15
19
  navigation:
16
20
  next: "Weiter"
17
21
  previous: "Zurück"
@@ -34,7 +38,6 @@ caluma:
34
38
  options-empty: "Keine Optionen vorhanden"
35
39
  search-placeholder: "Hier tippen um zu suchen"
36
40
  search-empty: "Keine Optionen gefunden"
37
- null: "Keine Auswahl"
38
41
 
39
42
  validation:
40
43
  blank: "Dieses Feld darf nicht leer gelassen werden"
@@ -43,7 +46,8 @@ caluma:
43
46
  greaterThanOrEqualTo: "Die Eingabe in diesem Feld darf nicht kleiner als {gte} sein"
44
47
  lessThanOrEqualTo: "Die Eingabe in diesem Feld darf nicht grösser als {lte} sein"
45
48
  notAnInteger: "Bitte geben Sie eine ganze Zahl ein"
46
- inclusion: "'{value}' ist kein gültiger Wert für dieses Feld"
49
+ inclusion: '"{label}" ist kein gültiger Wert für dieses Feld'
50
+ deleteFailed: "Beim Löschen ist ein Fehler aufgetreten."
47
51
  uploadFailed: "Beim Hochladen ist ein Fehler aufgetreten."
48
52
  format: "{errorMsg}"
49
53
  table: "Mindestens eine Zeile der Tabelle wurde nicht korrekt ausgefüllt"