@projectcaluma/ember-form 11.0.0-beta.4 → 11.0.0-beta.40

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 (62) hide show
  1. package/CHANGELOG.md +202 -0
  2. package/addon/components/cf-content.hbs +38 -37
  3. package/addon/components/cf-content.js +7 -3
  4. package/addon/components/cf-field/hint.hbs +5 -0
  5. package/addon/components/cf-field/input/action-button.hbs +8 -4
  6. package/addon/components/cf-field/input/action-button.js +60 -59
  7. package/addon/components/cf-field/input/checkbox.hbs +2 -3
  8. package/addon/components/cf-field/input/date.hbs +12 -25
  9. package/addon/components/cf-field/input/date.js +19 -11
  10. package/addon/components/cf-field/input/files.hbs +38 -0
  11. package/addon/components/cf-field/input/files.js +113 -0
  12. package/addon/components/cf-field/input/powerselect.hbs +27 -29
  13. package/addon/components/cf-field/input/powerselect.js +8 -2
  14. package/addon/components/cf-field/input/radio.hbs +2 -2
  15. package/addon/components/cf-field/input/static.hbs +1 -1
  16. package/addon/components/cf-field/input/table.hbs +20 -18
  17. package/addon/components/cf-field/input/table.js +1 -11
  18. package/addon/components/cf-field/input.hbs +8 -21
  19. package/addon/components/cf-field/input.js +32 -14
  20. package/addon/components/cf-field/label.hbs +4 -2
  21. package/addon/components/cf-field-value.hbs +22 -7
  22. package/addon/components/cf-field-value.js +12 -36
  23. package/addon/components/cf-field.hbs +42 -9
  24. package/addon/components/cf-field.js +41 -17
  25. package/addon/components/cf-form-wrapper.hbs +4 -1
  26. package/addon/components/cf-form.hbs +6 -1
  27. package/addon/components/document-validity.js +16 -1
  28. package/addon/gql/fragments/field.graphql +32 -7
  29. package/addon/gql/mutations/save-document-files-answer.graphql +9 -0
  30. package/addon/gql/queries/document-forms.graphql +1 -1
  31. package/addon/gql/queries/dynamic-options.graphql +4 -4
  32. package/addon/gql/queries/{fileanswer-info.graphql → filesanswer-info.graphql} +4 -4
  33. package/addon/helpers/format-graphql-error.js +21 -0
  34. package/addon/helpers/get-widget.js +16 -2
  35. package/addon/instance-initializers/form-widget-overrides.js +52 -0
  36. package/addon/lib/document.js +9 -1
  37. package/addon/lib/field.js +96 -59
  38. package/addon/lib/navigation.js +3 -1
  39. package/addon/lib/question.js +18 -5
  40. package/addon/modifiers/autoresize.js +14 -0
  41. package/addon/services/caluma-store.js +2 -0
  42. package/app/components/cf-field/{input/file.js → hint.js} +1 -1
  43. package/app/components/cf-field/input/files.js +1 -0
  44. package/app/helpers/format-graphql-error.js +1 -0
  45. package/app/helpers/get-widget.js +1 -4
  46. package/app/instance-initializers/form-widget-overrides.js +4 -0
  47. package/app/modifiers/autoresize.js +1 -0
  48. package/app/styles/@projectcaluma/ember-form.scss +5 -15
  49. package/app/styles/_flatpickr.scss +47 -0
  50. package/blueprints/@projectcaluma/ember-form/index.js +1 -1
  51. package/index.js +12 -0
  52. package/package.json +47 -37
  53. package/translations/de.yaml +6 -6
  54. package/translations/en.yaml +6 -6
  55. package/translations/fr.yaml +6 -6
  56. package/addon/components/cf-field/input/file.hbs +0 -32
  57. package/addon/components/cf-field/input/file.js +0 -89
  58. package/addon/components/cf-field/label.js +0 -11
  59. package/addon/gql/mutations/remove-answer.graphql +0 -7
  60. package/addon/gql/mutations/save-document-file-answer.graphql +0 -9
  61. package/addon/instance-initializers/setup-pikaday-i18n.js +0 -35
  62. package/config/environment.js +0 -5
@@ -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";
@@ -12,7 +13,7 @@ import { cached } from "tracked-toolbox";
12
13
 
13
14
  import { decodeId } from "@projectcaluma/ember-core/helpers/decode-id";
14
15
  import saveDocumentDateAnswerMutation from "@projectcaluma/ember-form/gql/mutations/save-document-date-answer.graphql";
15
- import saveDocumentFileAnswerMutation from "@projectcaluma/ember-form/gql/mutations/save-document-file-answer.graphql";
16
+ import saveDocumentFilesAnswerMutation from "@projectcaluma/ember-form/gql/mutations/save-document-files-answer.graphql";
16
17
  import saveDocumentFloatAnswerMutation from "@projectcaluma/ember-form/gql/mutations/save-document-float-answer.graphql";
17
18
  import saveDocumentIntegerAnswerMutation from "@projectcaluma/ember-form/gql/mutations/save-document-integer-answer.graphql";
18
19
  import saveDocumentListAnswerMutation from "@projectcaluma/ember-form/gql/mutations/save-document-list-answer.graphql";
@@ -33,7 +34,7 @@ export const TYPE_MAP = {
33
34
  DynamicChoiceQuestion: "StringAnswer",
34
35
  TableQuestion: "TableAnswer",
35
36
  FormQuestion: null,
36
- FileQuestion: "FileAnswer",
37
+ FilesQuestion: "FilesAnswer",
37
38
  StaticQuestion: null,
38
39
  DateQuestion: "DateAnswer",
39
40
  };
@@ -43,7 +44,7 @@ const MUTATION_MAP = {
43
44
  IntegerAnswer: saveDocumentIntegerAnswerMutation,
44
45
  StringAnswer: saveDocumentStringAnswerMutation,
45
46
  ListAnswer: saveDocumentListAnswerMutation,
46
- FileAnswer: saveDocumentFileAnswerMutation,
47
+ FilesAnswer: saveDocumentFilesAnswerMutation,
47
48
  DateAnswer: saveDocumentDateAnswerMutation,
48
49
  TableAnswer: saveDocumentTableAnswerMutation,
49
50
  };
@@ -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,14 @@ 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
92
 
93
- if (question.isDynamic) {
94
- question.loadDynamicOptions.perform();
95
- }
96
-
97
- this.question = question;
93
+ this.question.dataSourceContext = this.document.dataSourceContext;
98
94
  }
99
95
 
100
96
  _createAnswer() {
@@ -113,6 +109,7 @@ export default class Field extends Base {
113
109
 
114
110
  answer = new Answer({
115
111
  raw: {
112
+ id: null,
116
113
  __typename: answerType,
117
114
  question: { slug: this.raw.question.slug },
118
115
  [camelize(answerType.replace(/Answer$/, "Value"))]: null,
@@ -152,6 +149,16 @@ export default class Field extends Base {
152
149
  */
153
150
  @tracked _errors = [];
154
151
 
152
+ /**
153
+ * Currently rendered field components that use this field. This is used in
154
+ * the document validity component to await all current save tasks before
155
+ * validating.
156
+ *
157
+ * @property {Set} _components
158
+ * @private
159
+ */
160
+ _components = new Set();
161
+
155
162
  /**
156
163
  * The primary key of the field. Consists of the document and question primary
157
164
  * keys.
@@ -540,18 +547,24 @@ export default class Field extends Base {
540
547
 
541
548
  const type = this.answer.raw.__typename;
542
549
 
550
+ const value = this.answer.serializedValue;
551
+ const input = {
552
+ question: this.question.slug,
553
+ document: this.document.uuid,
554
+ };
555
+
556
+ if (value !== null) {
557
+ input.value = value;
558
+ }
559
+
560
+ if (this.document.dataSourceContext) {
561
+ input.dataSourceContext = JSON.stringify(this.document.dataSourceContext);
562
+ }
563
+
543
564
  const response = yield this.apollo.mutate(
544
565
  {
545
566
  mutation: MUTATION_MAP[type],
546
- variables: {
547
- input: {
548
- question: this.question.slug,
549
- document: this.document.uuid,
550
- ...(this.answer.serializedValue !== null
551
- ? { value: this.answer.serializedValue }
552
- : {}),
553
- },
554
- },
567
+ variables: { input },
555
568
  },
556
569
  `saveDocument${type}.answer`
557
570
  );
@@ -577,10 +590,10 @@ export default class Field extends Base {
577
590
  @cached
578
591
  get errors() {
579
592
  return this._errors.map(({ type, context, value }) => {
580
- return this.intl.t(
581
- `caluma.form.validation.${type}`,
582
- Object.assign({}, context, { value })
583
- );
593
+ return this.intl.t(`caluma.form.validation.${type}`, {
594
+ ...context,
595
+ value,
596
+ });
584
597
  });
585
598
  }
586
599
 
@@ -618,6 +631,35 @@ export default class Field extends Base {
618
631
  this._errors = errors;
619
632
  }
620
633
 
634
+ /**
635
+ * Validate the value against the regexes of the given format validators.
636
+ *
637
+ * @method _validateFormatValidators
638
+ * @return {Array<Boolean|Object>} An array of error objects or `true`
639
+ * @private
640
+ */
641
+ _validateFormatValidators() {
642
+ const validators =
643
+ this.question.raw.formatValidators?.edges.map((edge) => edge.node) ?? [];
644
+ const value = this.answer.value;
645
+
646
+ if (isEmpty(value)) {
647
+ // empty values should not be validated since they are handled by the
648
+ // requiredness validation
649
+ return validators.map(() => true);
650
+ }
651
+
652
+ return validators.map((validator) => {
653
+ return (
654
+ new RegExp(validator.regex).test(value) || {
655
+ type: "format",
656
+ context: { errorMsg: validator.errorMsg },
657
+ value,
658
+ }
659
+ );
660
+ });
661
+ }
662
+
621
663
  /**
622
664
  * Method to validate if a question is required or not.
623
665
  *
@@ -637,15 +679,12 @@ export default class Field extends Base {
637
679
  * predefined by the question.
638
680
  *
639
681
  * @method _validateTextQuestion
640
- * @return {Promise<Boolean|Object>} A promise which resolves into an object if invalid or true if valid
682
+ * @return {Array<Boolean|Object>} An array of error objects or `true`
641
683
  * @private
642
684
  */
643
- async _validateTextQuestion() {
685
+ _validateTextQuestion() {
644
686
  return [
645
- ...(await this.validator.validate(
646
- this.answer.value,
647
- this.question.raw.meta.formatValidators ?? []
648
- )),
687
+ ...this._validateFormatValidators(),
649
688
  validate("length", this.answer.value, {
650
689
  min: this.question.raw.textMinLength || 0,
651
690
  max: this.question.raw.textMaxLength || Number.POSITIVE_INFINITY,
@@ -658,15 +697,12 @@ export default class Field extends Base {
658
697
  * than predefined by the question.
659
698
  *
660
699
  * @method _validateTextareaQuestion
661
- * @return {Promise<Boolean|Object>} A promise which resolves into an object if invalid or true if valid
700
+ * @return {Array<Boolean|Object>} An array of error objects or `true`
662
701
  * @private
663
702
  */
664
- async _validateTextareaQuestion() {
703
+ _validateTextareaQuestion() {
665
704
  return [
666
- ...(await this.validator.validate(
667
- this.answer.value,
668
- this.question.raw.meta.formatValidators ?? []
669
- )),
705
+ ...this._validateFormatValidators(),
670
706
  validate("length", this.answer.value, {
671
707
  min: this.question.raw.textareaMinLength || 0,
672
708
  max: this.question.raw.textareaMaxLength || Number.POSITIVE_INFINITY,
@@ -714,10 +750,7 @@ export default class Field extends Base {
714
750
  * @private
715
751
  */
716
752
  _validateChoiceQuestion() {
717
- return validate("inclusion", this.answer.value, {
718
- allowBlank: true,
719
- in: (this.options || []).map(({ slug }) => slug),
720
- });
753
+ return this._validateOption(this.answer.value, true);
721
754
  }
722
755
 
723
756
  /**
@@ -729,15 +762,9 @@ export default class Field extends Base {
729
762
  * @private
730
763
  */
731
764
  _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
- );
765
+ return this.answer.value
766
+ ? this.answer.value.map((value) => this._validateOption(value))
767
+ : true;
741
768
  }
742
769
 
743
770
  /**
@@ -749,11 +776,9 @@ export default class Field extends Base {
749
776
  * @private
750
777
  */
751
778
  async _validateDynamicChoiceQuestion() {
752
- await this.question.loadDynamicOptions.perform();
779
+ await this.question.dynamicOptions;
753
780
 
754
- return validate("inclusion", this.answer.value, {
755
- in: (this.options || []).map(({ slug }) => slug),
756
- });
781
+ return this._validateOption(this.answer.value, true);
757
782
  }
758
783
 
759
784
  /**
@@ -771,23 +796,35 @@ export default class Field extends Base {
771
796
  return true;
772
797
  }
773
798
 
774
- await this.question.loadDynamicOptions.perform();
799
+ await this.question.dynamicOptions;
775
800
 
776
- return value.map((value) => {
777
- return validate("inclusion", value, {
778
- in: (this.options || []).map(({ slug }) => slug),
779
- });
801
+ return this.answer.value
802
+ ? value.map((value) => this._validateOption(value))
803
+ : true;
804
+ }
805
+
806
+ _validateOption(value, allowBlank = false) {
807
+ const label = Array.isArray(this.selected)
808
+ ? this.selected.find((selected) => selected.slug === value)?.label
809
+ : this.selected?.label;
810
+
811
+ return validate("inclusion", value, {
812
+ in: (this.options || [])
813
+ .filter((option) => !option.disabled)
814
+ .map(({ slug }) => slug),
815
+ allowBlank,
816
+ label: label ?? value,
780
817
  });
781
818
  }
782
819
 
783
820
  /**
784
821
  * Dummy method for the validation of file uploads.
785
822
  *
786
- * @method _validateFileQuestion
823
+ * @method _validateFilesQuestion
787
824
  * @return {Boolean} Always returns true
788
825
  * @private
789
826
  */
790
- _validateFileQuestion() {
827
+ _validateFilesQuestion() {
791
828
  return true;
792
829
  }
793
830
 
@@ -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";
@@ -65,19 +66,31 @@ export default class Question extends Base {
65
66
  {
66
67
  query: getDynamicOptions,
67
68
  fetchPolicy: "network-only",
68
- variables: { question: this.slug },
69
+ variables: {
70
+ question: this.slug,
71
+ context: this.dataSourceContext
72
+ ? JSON.stringify(this.dataSourceContext)
73
+ : null,
74
+ },
69
75
  },
70
76
  "allQuestions.edges"
71
77
  );
72
78
 
73
79
  return (
74
- question.node.dynamicChoiceOptions ||
80
+ question.node.dynamicChoiceOptions ??
75
81
  question.node.dynamicMultipleChoiceOptions
76
82
  );
77
83
  }
78
84
 
79
- @lastValue("loadDynamicOptions") dynamicChoiceOptions;
80
- @lastValue("loadDynamicOptions") dynamicMultipleChoiceOptions;
85
+ dynamicOptions = trackedTask(this, this.loadDynamicOptions, () => []);
86
+
87
+ get dynamicChoiceOptions() {
88
+ return this.dynamicOptions.value ?? [];
89
+ }
90
+
91
+ get dynamicMultipleChoiceOptions() {
92
+ return this.dynamicOptions.value ?? [];
93
+ }
81
94
 
82
95
  /**
83
96
  * Whether the question is a single choice question
@@ -0,0 +1,14 @@
1
+ import { registerDestructor } from "@ember/destroyable";
2
+ import { inject as service } from "@ember/service";
3
+ import AutoresizeModifier from "ember-autoresize-modifier/modifiers/autoresize";
4
+
5
+ export default class CustomAutoresizeModifier extends AutoresizeModifier {
6
+ @service inViewport;
7
+
8
+ modify(...args) {
9
+ super.modify(...args);
10
+
11
+ this.inViewport.watchElement(this.el).onEnter(this.resize);
12
+ registerDestructor(this, () => this.inViewport.stopWatching(this.el));
13
+ }
14
+ }
@@ -43,6 +43,8 @@ export default class CalumaStoreService extends Service {
43
43
  clear() {
44
44
  this._store.forEach((obj) => obj.destroy());
45
45
 
46
+ // `this._store` is not an ember array but a native map
47
+ // eslint-disable-next-line ember/no-array-prototype-extensions
46
48
  this._store.clear();
47
49
  }
48
50
  }
@@ -1 +1 @@
1
- export { default } from "@projectcaluma/ember-form/components/cf-field/input/file";
1
+ export { default } from "@projectcaluma/ember-form/components/cf-field/hint";
@@ -0,0 +1 @@
1
+ export { default } from "@projectcaluma/ember-form/components/cf-field/input/files";
@@ -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";
@@ -3,21 +3,11 @@
3
3
  @import "../cf-field";
4
4
  @import "../cf-navigation";
5
5
 
6
- @import "../uikit-overwrites";
7
-
8
- .cf-checkbox_label {
9
- display: block;
10
- position: relative;
11
- padding-left: 26px;
6
+ @import "../flatpickr";
12
7
 
13
- .uk-checkbox {
14
- position: absolute;
15
- top: 0.25em;
16
- left: 0;
17
- margin: 0;
18
- }
8
+ @import "../uikit-overwrites";
19
9
 
20
- & + br {
21
- display: none;
22
- }
10
+ .table-controls > .uk-icon {
11
+ min-height: 20px;
12
+ min-width: 20px;
23
13
  }
@@ -0,0 +1,47 @@
1
+ $flatpickr-today-color: $global-warning-background;
2
+ $flatpickr-selected-color: $global-primary-background;
3
+
4
+ span.flatpickr-day {
5
+ font-weight: $base-body-font-weight;
6
+
7
+ &.today:not(.selected) {
8
+ border-bottom-color: $flatpickr-today-color;
9
+
10
+ &:hover {
11
+ background: $flatpickr-today-color;
12
+ border-color: $flatpickr-today-color;
13
+ }
14
+ }
15
+
16
+ &.selected {
17
+ background: $flatpickr-selected-color;
18
+ border-color: $flatpickr-selected-color;
19
+ font-weight: 700;
20
+
21
+ &:hover {
22
+ background: darken($flatpickr-selected-color, 10%);
23
+ border-color: darken($flatpickr-selected-color, 10%);
24
+ }
25
+ }
26
+ }
27
+
28
+ .flatpickr-months {
29
+ .flatpickr-prev-month:hover,
30
+ .flatpickr-next-month:hover {
31
+ color: $flatpickr-today-color;
32
+ }
33
+ }
34
+
35
+ span.flatpickr-weekday {
36
+ font-size: $global-small-font-size;
37
+ font-weight: $base-body-font-weight;
38
+ }
39
+
40
+ .flatpickr-current-month {
41
+ font-size: $global-font-size;
42
+ font-weight: $base-body-font-weight;
43
+
44
+ .flatpickr-monthDropdown-months {
45
+ font-weight: $base-body-font-weight;
46
+ }
47
+ }
@@ -10,7 +10,7 @@ module.exports = {
10
10
  { name: "ember-cli-showdown" },
11
11
  { name: "ember-composable-helpers" },
12
12
  { name: "ember-math-helpers" },
13
- { name: "ember-pikaday" },
13
+ { name: "ember-flatpickr" },
14
14
  { name: "ember-power-select" },
15
15
  { name: "ember-autoresize-modifier" },
16
16
  ],
package/index.js CHANGED
@@ -2,4 +2,16 @@
2
2
 
3
3
  module.exports = {
4
4
  name: require("./package").name,
5
+
6
+ included(...args) {
7
+ const app = this._findHost(this);
8
+
9
+ app.options.flatpickr = {
10
+ locales: ["de", "fr"],
11
+ theme: "airbnb",
12
+ ...(app.options.flatpickr ?? {}),
13
+ };
14
+
15
+ this._super.included.apply(this, args);
16
+ },
5
17
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@projectcaluma/ember-form",
3
- "version": "11.0.0-beta.4",
3
+ "version": "11.0.0-beta.40",
4
4
  "description": "Ember addon for rendering Caluma forms.",
5
5
  "keywords": [
6
6
  "ember-addon"
@@ -9,70 +9,80 @@
9
9
  "homepage": "https://docs.caluma.io/ember-caluma",
10
10
  "repository": "github:projectcaluma/ember-caluma",
11
11
  "scripts": {
12
- "test": "npm-run-all test:*",
12
+ "test": "concurrently \"npm:lint\" \"npm:test:*\" --names \"lint,test:\"",
13
13
  "test:ember": "ember test",
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.4.0",
22
- "ember-autoresize-modifier": "^0.5.0",
17
+ "@ember/string": "^3.0.0",
18
+ "@embroider/macros": "^1.10.0",
19
+ "@embroider/util": "^1.9.0",
20
+ "@glimmer/component": "^1.1.2",
21
+ "@glimmer/tracking": "^1.1.2",
22
+ "@projectcaluma/ember-core": "^11.0.0-beta.40",
23
+ "ember-apollo-client": "~4.0.2",
24
+ "ember-auto-import": "^2.5.0",
25
+ "ember-autoresize-modifier": "^0.6.0",
23
26
  "ember-cli-babel": "^7.26.11",
24
- "ember-cli-htmlbars": "^6.0.1",
27
+ "ember-cli-htmlbars": "^6.1.1",
25
28
  "ember-cli-showdown": "^6.0.1",
26
29
  "ember-composable-helpers": "^5.0.0",
27
- "ember-fetch": "^8.1.1",
28
- "ember-in-viewport": "^4.0.0",
30
+ "ember-concurrency": "^2.3.7",
31
+ "ember-fetch": "^8.1.2",
32
+ "ember-flatpickr": "^3.2.3",
33
+ "ember-in-viewport": "^4.1.0",
29
34
  "ember-intl": "^5.7.2",
30
- "ember-math-helpers": "^2.18.1",
31
- "ember-pikaday": "^3.0.0",
32
- "ember-power-select": "^5.0.3",
33
- "ember-resources": "^4.2.0",
34
- "ember-uikit": "^5.0.0-beta.9",
35
- "ember-validators": "^4.1.0",
35
+ "ember-math-helpers": "^3.0.0",
36
+ "ember-power-select": "^6.0.1",
37
+ "ember-resources": "^5.6.0",
38
+ "ember-uikit": "^6.1.1",
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": "^3.1.1",
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": "1.0.0",
46
- "@faker-js/faker": "6.0.0-alpha.5",
47
- "@projectcaluma/ember-testing": "10.2.0-beta.2",
48
- "@projectcaluma/ember-workflow": "11.0.0-beta.2",
48
+ "@ember/test-helpers": "2.7.0",
49
+ "@embroider/test-setup": "2.0.2",
50
+ "@faker-js/faker": "7.6.0",
51
+ "@projectcaluma/ember-testing": "11.0.0-beta.40",
52
+ "@projectcaluma/ember-workflow": "^11.0.0-beta.40",
49
53
  "broccoli-asset-rev": "3.0.0",
50
- "ember-cli": "3.28.5",
54
+ "concurrently": "7.6.0",
55
+ "ember-cli": "4.9.2",
51
56
  "ember-cli-code-coverage": "1.0.3",
52
- "ember-cli-dependency-checker": "3.2.0",
57
+ "ember-cli-dependency-checker": "3.3.1",
53
58
  "ember-cli-inject-live-reload": "2.1.0",
54
- "ember-cli-mirage": "2.4.0",
59
+ "ember-cli-mirage": "3.0.0-alpha.3",
55
60
  "ember-cli-sri": "2.1.1",
56
61
  "ember-cli-terser": "4.0.2",
57
- "ember-disable-prototype-extensions": "1.1.3",
58
- "ember-export-application-global": "2.0.1",
59
62
  "ember-load-initializers": "2.1.2",
60
- "ember-maybe-import-regenerator": "1.0.0",
61
- "ember-qunit": "5.1.5",
63
+ "ember-qunit": "6.1.1",
62
64
  "ember-resolver": "8.0.3",
63
- "ember-source": "3.28.8",
65
+ "ember-source": "4.9.3",
64
66
  "ember-source-channel-url": "3.0.0",
65
67
  "ember-try": "2.0.0",
66
68
  "loader.js": "4.7.0",
67
- "miragejs": "0.1.43",
68
- "npm-run-all": "4.1.5",
69
- "qunit": "2.17.2",
69
+ "miragejs": "0.1.46",
70
+ "qunit": "2.19.3",
70
71
  "qunit-dom": "2.0.0",
71
- "uuid": "8.3.2",
72
- "webpack": "5.68.0"
72
+ "uuid": "9.0.0",
73
+ "webpack": "5.75.0"
74
+ },
75
+ "peerDependencies": {
76
+ "@projectcaluma/ember-workflow": "^11.0.0-beta.40",
77
+ "ember-source": "^3.28.0 || ^4.0.0"
78
+ },
79
+ "peerDependenciesMeta": {
80
+ "@projectcaluma/ember-workflow": {
81
+ "optional": true
82
+ }
73
83
  },
74
84
  "engines": {
75
- "node": "12.* || 14.* || >= 16"
85
+ "node": "14.* || 16.* || >= 18"
76
86
  },
77
87
  "ember": {
78
88
  "edition": "octane"
@@ -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,11 +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"
50
-
51
- pikaday:
52
- month-previous: "Vorheriger Monat"
53
- month-next: "Nächster Monat"