@projectcaluma/ember-form 9.1.1 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/addon/components/cf-field/input/action-button.hbs +19 -0
  3. package/addon/components/cf-field/input/action-button.js +75 -0
  4. package/addon/components/cf-field/input/file.hbs +24 -13
  5. package/addon/components/cf-field/input/file.js +19 -9
  6. package/addon/components/cf-field/input/table.hbs +94 -95
  7. package/addon/components/cf-field/input/table.js +97 -80
  8. package/addon/components/cf-field/input.hbs +1 -0
  9. package/addon/components/cf-field/input.js +2 -1
  10. package/addon/components/cf-field-value.hbs +2 -2
  11. package/addon/components/cf-field.hbs +14 -12
  12. package/addon/components/cf-field.js +9 -1
  13. package/addon/components/document-validity.js +11 -5
  14. package/addon/gql/fragments/{field-question.graphql → field.graphql} +61 -0
  15. package/addon/gql/mutations/remove-answer.graphql +7 -0
  16. package/addon/gql/mutations/save-document-date-answer.graphql +2 -2
  17. package/addon/gql/mutations/save-document-file-answer.graphql +2 -2
  18. package/addon/gql/mutations/save-document-float-answer.graphql +2 -2
  19. package/addon/gql/mutations/save-document-integer-answer.graphql +2 -2
  20. package/addon/gql/mutations/save-document-list-answer.graphql +2 -2
  21. package/addon/gql/mutations/save-document-string-answer.graphql +2 -2
  22. package/addon/gql/mutations/save-document-table-answer.graphql +2 -2
  23. package/addon/gql/mutations/save-document.graphql +2 -2
  24. package/addon/gql/queries/get-document-answers.graphql +18 -2
  25. package/addon/gql/queries/get-document-forms.graphql +2 -2
  26. package/addon/gql/queries/get-dynamic-options.graphql +1 -1
  27. package/addon/gql/queries/get-fileanswer-info.graphql +1 -1
  28. package/addon/lib/document.js +17 -1
  29. package/addon/lib/field.js +17 -2
  30. package/app/components/cf-field/input/action-button.js +1 -0
  31. package/package.json +18 -17
  32. package/translations/de.yaml +3 -15
  33. package/translations/en.yaml +3 -15
  34. package/translations/fr.yaml +3 -16
  35. package/addon/gql/fragments/field-answer.graphql +0 -57
@@ -1,3 +1,4 @@
1
+ import { dasherize } from "@ember/string";
1
2
  import Component from "@glimmer/component";
2
3
 
3
4
  const mapping = {
@@ -25,7 +26,7 @@ export default class CfFieldInputComponent extends Component {
25
26
 
26
27
  return (
27
28
  typename &&
28
- (mapping[typename] || typename.replace(/Question$/, "").toLowerCase())
29
+ (mapping[typename] || dasherize(typename.replace(/Question$/, "")))
29
30
  );
30
31
  }
31
32
  }
@@ -2,8 +2,8 @@
2
2
  <UkButton
3
3
  @color="link"
4
4
  @label={{this.value.label}}
5
- @on-click={{fn this.download value.fileAnswerId}}
5
+ @on-click={{fn this.download this.value.fileAnswerId}}
6
6
  />
7
7
  {{else}}
8
- {{value.label}}
8
+ {{this.value.label}}
9
9
  {{/if}}
@@ -16,21 +16,23 @@
16
16
  {{/let}}
17
17
  </div>
18
18
 
19
- {{#if @field.question.infoText}}
19
+ {{#if (and @field.question.infoText this.infoTextVisible)}}
20
20
  <CfField::info @text={{@field.question.infoText}} />
21
21
  {{/if}}
22
22
 
23
- <div
24
- class="cf-field__icon uk-padding-remove-vertical uk-flex uk-flex-middle uk-flex-center"
25
- >
26
- {{#if @field.save.isRunning}}
27
- <UkSpinner class="uk-animation-fade" />
28
- {{else if (or field.save.last.isError field.isInvalid)}}
29
- <UkIcon @icon="warning" class="uk-animation-fade uk-text-danger" />
30
- {{else if @field.save.last.isSuccessful}}
31
- <UkIcon @icon="check" class="uk-animation-fade uk-text-success" />
32
- {{/if}}
33
- </div>
23
+ {{#if this.saveIndicatorVisible}}
24
+ <div
25
+ class="cf-field__icon uk-padding-remove-vertical uk-flex uk-flex-middle uk-flex-center"
26
+ >
27
+ {{#if @field.save.isRunning}}
28
+ <UkSpinner class="uk-animation-fade" />
29
+ {{else if (or @field.save.last.isError @field.isInvalid)}}
30
+ <UkIcon @icon="warning" class="uk-animation-fade uk-text-danger" />
31
+ {{else if @field.save.last.isSuccessful}}
32
+ <UkIcon @icon="check" class="uk-animation-fade uk-text-success" />
33
+ {{/if}}
34
+ </div>
35
+ {{/if}}
34
36
  </div>
35
37
 
36
38
  {{#if @field.errors.length}}
@@ -29,10 +29,18 @@ export default class CfFieldComponent extends Component {
29
29
  get labelVisible() {
30
30
  return (
31
31
  !this.args.field?.question.meta.hideLabel &&
32
- !hasQuestionType(this.args.field?.question, "static")
32
+ !hasQuestionType(this.args.field?.question, "static", "action-button")
33
33
  );
34
34
  }
35
35
 
36
+ get infoTextVisible() {
37
+ return !hasQuestionType(this.args.field?.question, "action-button");
38
+ }
39
+
40
+ get saveIndicatorVisible() {
41
+ return !hasQuestionType(this.args.field?.question, "action-button");
42
+ }
43
+
36
44
  /**
37
45
  * Task to save a field. This will set the passed value to the answer and
38
46
  * save the field to the API after a timeout off 500 milliseconds.
@@ -1,5 +1,6 @@
1
1
  import { action } from "@ember/object";
2
2
  import Component from "@glimmer/component";
3
+ import { restartableTask } from "ember-concurrency-decorators";
3
4
 
4
5
  /**
5
6
  * Component to check the validity of a document
@@ -34,11 +35,11 @@ export default class DocumentValidity extends Component {
34
35
  return this.args.document.fields.every((f) => f.isValid);
35
36
  }
36
37
 
37
- @action
38
- async validate() {
39
- await Promise.all(
40
- this.args.document.fields.map((field) => field.validate.perform())
41
- );
38
+ @restartableTask
39
+ *_validate() {
40
+ for (const field of this.args.document.fields) {
41
+ yield field.validate.linked().perform();
42
+ }
42
43
 
43
44
  if (this.isValid) {
44
45
  this.args.onValid?.();
@@ -48,4 +49,9 @@ export default class DocumentValidity extends Component {
48
49
 
49
50
  return this.isValid;
50
51
  }
52
+
53
+ @action
54
+ validate() {
55
+ return this._validate.perform();
56
+ }
51
57
  }
@@ -76,6 +76,11 @@ fragment SimpleQuestion on Question {
76
76
  ... on CalculatedFloatQuestion {
77
77
  calcExpression
78
78
  }
79
+ ... on ActionButtonQuestion {
80
+ action
81
+ color
82
+ validateOnEnter
83
+ }
79
84
  }
80
85
 
81
86
  fragment FieldTableQuestion on Question {
@@ -157,3 +162,59 @@ fragment FieldQuestion on Question {
157
162
  }
158
163
  }
159
164
  }
165
+
166
+ fragment SimpleAnswer on Answer {
167
+ id
168
+ question {
169
+ slug
170
+ }
171
+ ... on StringAnswer {
172
+ stringValue: value
173
+ }
174
+ ... on IntegerAnswer {
175
+ integerValue: value
176
+ }
177
+ ... on FloatAnswer {
178
+ floatValue: value
179
+ }
180
+ ... on ListAnswer {
181
+ listValue: value
182
+ }
183
+ ... on FileAnswer {
184
+ fileValue: value {
185
+ uploadUrl
186
+ downloadUrl
187
+ metadata
188
+ name
189
+ }
190
+ }
191
+ ... on DateAnswer {
192
+ dateValue: value
193
+ }
194
+ }
195
+
196
+ fragment FieldAnswer on Answer {
197
+ ...SimpleAnswer
198
+ ... on TableAnswer {
199
+ tableValue: value {
200
+ id
201
+ form {
202
+ slug
203
+ questions {
204
+ edges {
205
+ node {
206
+ ...FieldQuestion
207
+ }
208
+ }
209
+ }
210
+ }
211
+ answers {
212
+ edges {
213
+ node {
214
+ ...SimpleAnswer
215
+ }
216
+ }
217
+ }
218
+ }
219
+ }
220
+ }
@@ -0,0 +1,7 @@
1
+ mutation RemoveAnswer($input: RemoveAnswerInput!) {
2
+ removeAnswer(input: $input) {
3
+ answer {
4
+ id
5
+ }
6
+ }
7
+ }
@@ -1,6 +1,6 @@
1
- # import * from '@projectcaluma/ember-form/gql/fragments/field-answer.graphql'
1
+ #import * from '../fragments/field.graphql'
2
2
 
3
- mutation ($input: SaveDocumentDateAnswerInput!) {
3
+ mutation SaveDocumentDateAnswer($input: SaveDocumentDateAnswerInput!) {
4
4
  saveDocumentDateAnswer(input: $input) {
5
5
  answer {
6
6
  ...FieldAnswer
@@ -1,6 +1,6 @@
1
- # import * from '@projectcaluma/ember-form/gql/fragments/field-answer.graphql'
1
+ #import * from '../fragments/field.graphql'
2
2
 
3
- mutation ($input: SaveDocumentFileAnswerInput!) {
3
+ mutation SaveDocumentFileAnswer($input: SaveDocumentFileAnswerInput!) {
4
4
  saveDocumentFileAnswer(input: $input) {
5
5
  answer {
6
6
  ...FieldAnswer
@@ -1,6 +1,6 @@
1
- # import * from '@projectcaluma/ember-form/gql/fragments/field-answer.graphql'
1
+ #import * from '../fragments/field.graphql'
2
2
 
3
- mutation ($input: SaveDocumentFloatAnswerInput!) {
3
+ mutation SaveDocumentFloatAnswer($input: SaveDocumentFloatAnswerInput!) {
4
4
  saveDocumentFloatAnswer(input: $input) {
5
5
  answer {
6
6
  ...FieldAnswer
@@ -1,6 +1,6 @@
1
- # import * from '@projectcaluma/ember-form/gql/fragments/field-answer.graphql'
1
+ #import * from '../fragments/field.graphql'
2
2
 
3
- mutation ($input: SaveDocumentIntegerAnswerInput!) {
3
+ mutation SaveDocumentIntegerAnswer($input: SaveDocumentIntegerAnswerInput!) {
4
4
  saveDocumentIntegerAnswer(input: $input) {
5
5
  answer {
6
6
  ...FieldAnswer
@@ -1,6 +1,6 @@
1
- # import * from '@projectcaluma/ember-form/gql/fragments/field-answer.graphql'
1
+ #import * from '../fragments/field.graphql'
2
2
 
3
- mutation ($input: SaveDocumentListAnswerInput!) {
3
+ mutation SaveDocumentListAnswer($input: SaveDocumentListAnswerInput!) {
4
4
  saveDocumentListAnswer(input: $input) {
5
5
  answer {
6
6
  ...FieldAnswer
@@ -1,6 +1,6 @@
1
- # import * from '@projectcaluma/ember-form/gql/fragments/field-answer.graphql'
1
+ #import * from '../fragments/field.graphql'
2
2
 
3
- mutation ($input: SaveDocumentStringAnswerInput!) {
3
+ mutation SaveDocumentStringAnswer($input: SaveDocumentStringAnswerInput!) {
4
4
  saveDocumentStringAnswer(input: $input) {
5
5
  answer {
6
6
  ...FieldAnswer
@@ -1,6 +1,6 @@
1
- # import * from '@projectcaluma/ember-form/gql/fragments/field-answer.graphql'
1
+ #import * from '../fragments/field.graphql'
2
2
 
3
- mutation ($input: SaveDocumentTableAnswerInput!) {
3
+ mutation saveDocumentTableAnswer($input: SaveDocumentTableAnswerInput!) {
4
4
  saveDocumentTableAnswer(input: $input) {
5
5
  answer {
6
6
  ...FieldAnswer
@@ -1,6 +1,6 @@
1
- # import * from '@projectcaluma/ember-form/gql/fragments/field-answer.graphql'
1
+ #import * from '../fragments/field.graphql'
2
2
 
3
- mutation ($input: SaveDocumentInput!) {
3
+ mutation SaveDocument($input: SaveDocumentInput!) {
4
4
  saveDocument(input: $input) {
5
5
  document {
6
6
  id
@@ -1,6 +1,6 @@
1
- # import * from '@projectcaluma/ember-form/gql/fragments/field-answer.graphql'
1
+ #import * from '../fragments/field.graphql'
2
2
 
3
- query ($id: ID!) {
3
+ query GetDocumentAnswers($id: ID!) {
4
4
  allDocuments(filter: [{ id: $id }]) {
5
5
  edges {
6
6
  node {
@@ -8,6 +8,22 @@ query ($id: ID!) {
8
8
  form {
9
9
  slug
10
10
  }
11
+ workItem {
12
+ id
13
+ }
14
+ case {
15
+ id
16
+ workItems {
17
+ edges {
18
+ node {
19
+ id
20
+ task {
21
+ id
22
+ }
23
+ }
24
+ }
25
+ }
26
+ }
11
27
  answers {
12
28
  edges {
13
29
  node {
@@ -1,6 +1,6 @@
1
- # import * from '@projectcaluma/ember-form/gql/fragments/field-question.graphql'
1
+ #import FieldQuestion, FieldTableQuestion, SimpleQuestion from '../fragments/field.graphql'
2
2
 
3
- query ($slug: String!) {
3
+ query GetDocumentForms($slug: String!) {
4
4
  allForms(filter: [{ slug: $slug }]) {
5
5
  edges {
6
6
  node {
@@ -1,4 +1,4 @@
1
- query ($question: String!) {
1
+ query GetDynamicOptions($question: String!) {
2
2
  allQuestions(filter: [{ slug: $question }], first: 1) {
3
3
  edges {
4
4
  node {
@@ -1,4 +1,4 @@
1
- query getFileAnswerInfo($id: ID!) {
1
+ query GetFileAnswerInfo($id: ID!) {
2
2
  node(id: $id) {
3
3
  id
4
4
  ... on FileAnswer {
@@ -83,6 +83,22 @@ export default Base.extend({
83
83
  return decodeId(this.raw.id);
84
84
  }),
85
85
 
86
+ workItemUuid: computed(
87
+ "raw.{workItem.id,case.workItems.edges.[]}",
88
+ function () {
89
+ // The document is either directly attached to a work item (via
90
+ // CompleteTaskFormTask) or it's the case document and therefore
91
+ // indirectly attached to a work item (via CompleteWorkflowFormTask)
92
+ const rawId =
93
+ this.raw.workItem?.id ||
94
+ this.raw.case?.workItems.edges.find(
95
+ (edge) => edge.node.task.__typename === "CompleteWorkflowFormTask"
96
+ )?.node.id;
97
+
98
+ return rawId ? decodeId(rawId) : null;
99
+ }
100
+ ),
101
+
86
102
  /**
87
103
  * The root form of this document
88
104
  *
@@ -230,7 +246,7 @@ export default Base.extend({
230
246
  }
231
247
 
232
248
  if (field.hidden || [undefined, null].includes(field.value)) {
233
- return field.question.isMultipleChoice ? [] : null;
249
+ return defaultValue ?? field.question.isMultipleChoice ? [] : null;
234
250
  }
235
251
 
236
252
  if (field.question.__typename === "TableQuestion") {
@@ -553,8 +553,9 @@ export default Base.extend({
553
553
  *
554
554
  * The field is optional if:
555
555
  * - The form question field of the fieldset is hidden
556
- * - All depending field (used in the expression) are hidden
556
+ * - All depending fields (used in the expression) are hidden
557
557
  * - The evaluated `question.isRequired` expression returns `false`
558
+ * - The question type is FormQuestion or CalculatedFloatQuestion
558
559
  *
559
560
  * @property {Boolean} optional
560
561
  */
@@ -563,11 +564,14 @@ export default Base.extend({
563
564
  "fieldset.field.hidden",
564
565
  "jexlContext",
565
566
  "optionalDependencies.@each.{hidden,value}",
566
- "question.isRequired",
567
+ "question.{__typename,isRequired}",
567
568
  "pk",
568
569
  function () {
569
570
  if (
570
571
  this.fieldset.field?.hidden ||
572
+ ["FormQuestion", "CalculatedFloatQuestion"].includes(
573
+ this.question.__typename
574
+ ) ||
571
575
  (this.optionalDependencies.length &&
572
576
  this.optionalDependencies.every(fieldIsHidden))
573
577
  ) {
@@ -932,4 +936,15 @@ export default Base.extend({
932
936
  _validateCalculatedFloatQuestion() {
933
937
  return resolve(true);
934
938
  },
939
+
940
+ /**
941
+ * Dummy method for the validation of work item button fields
942
+ *
943
+ * @method _validateActionButtonQuestion
944
+ * @return {RSVP.Promise}
945
+ * @private
946
+ */
947
+ _validateActionButtonQuestion() {
948
+ return resolve(true);
949
+ },
935
950
  });
@@ -0,0 +1 @@
1
+ export { default } from "@projectcaluma/ember-form/components/cf-field/input/action-button";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@projectcaluma/ember-form",
3
- "version": "9.1.1",
3
+ "version": "10.0.0",
4
4
  "description": "Ember addon for rendering Caluma forms.",
5
5
  "keywords": [
6
6
  "ember-addon"
@@ -16,21 +16,21 @@
16
16
  "dependencies": {
17
17
  "@glimmer/component": "^1.0.4",
18
18
  "@glimmer/tracking": "^1.0.4",
19
- "@projectcaluma/ember-core": "9.0.3",
19
+ "@projectcaluma/ember-core": "^10.0.0",
20
20
  "ember-apollo-client": "^3.2.0",
21
- "ember-auto-import": "^2.2.0",
21
+ "ember-auto-import": "^2.2.3",
22
22
  "ember-cli-babel": "^7.26.6",
23
- "ember-cli-htmlbars": "^5.7.1",
23
+ "ember-cli-htmlbars": "^6.0.0",
24
24
  "ember-cli-showdown": "^6.0.0",
25
25
  "ember-composable-helpers": "^4.5.0",
26
26
  "ember-fetch": "^8.0.4",
27
- "ember-in-viewport": "^3.10.2",
27
+ "ember-in-viewport": "^3.10.3",
28
28
  "ember-intl": "^5.7.0",
29
- "ember-math-helpers": "^2.17.3",
29
+ "ember-math-helpers": "^2.18.0",
30
30
  "ember-pikaday": "^3.0.0",
31
- "ember-power-select": "^4.1.6",
31
+ "ember-power-select": "^4.1.7",
32
32
  "ember-uikit": "^4.0.0",
33
- "graphql": "^15.6.0",
33
+ "graphql": "^15.6.1",
34
34
  "jexl": "^2.3.0",
35
35
  "lodash.clonedeep": "^4.5.0",
36
36
  "lodash.isequal": "^4.5.0",
@@ -38,11 +38,12 @@
38
38
  },
39
39
  "devDependencies": {
40
40
  "@ember/optional-features": "2.0.0",
41
- "@ember/test-helpers": "2.5.0",
42
- "@embroider/test-setup": "0.45.0",
43
- "@projectcaluma/ember-testing": "9.0.0",
41
+ "@ember/test-helpers": "2.6.0",
42
+ "@embroider/test-setup": "0.47.2",
43
+ "@projectcaluma/ember-testing": "9.1.0",
44
+ "@projectcaluma/ember-workflow": "9.0.3",
44
45
  "broccoli-asset-rev": "3.0.0",
45
- "ember-cli": "3.28.1",
46
+ "ember-cli": "3.28.4",
46
47
  "ember-cli-code-coverage": "1.0.3",
47
48
  "ember-cli-dependency-checker": "3.2.0",
48
49
  "ember-cli-inject-live-reload": "2.1.0",
@@ -53,21 +54,21 @@
53
54
  "ember-export-application-global": "2.0.1",
54
55
  "ember-load-initializers": "2.1.2",
55
56
  "ember-maybe-import-regenerator": "1.0.0",
56
- "ember-qunit": "5.1.4",
57
+ "ember-qunit": "5.1.5",
57
58
  "ember-resolver": "8.0.3",
58
- "ember-source": "3.28.1",
59
+ "ember-source": "3.28.6",
59
60
  "ember-source-channel-url": "3.0.0",
60
- "ember-try": "1.4.0",
61
+ "ember-try": "2.0.0",
61
62
  "faker": "5.5.3",
62
63
  "loader.js": "4.7.0",
63
64
  "npm-run-all": "4.1.5",
64
65
  "qunit": "2.17.2",
65
66
  "qunit-dom": "2.0.0",
66
67
  "uuid": "8.3.2",
67
- "webpack": "5.58.0"
68
+ "webpack": "5.64.1"
68
69
  },
69
70
  "engines": {
70
- "node": "10.* || >= 12"
71
+ "node": "12.* || 14.* || >= 16"
71
72
  },
72
73
  "ember": {
73
74
  "edition": "octane"
@@ -1,24 +1,12 @@
1
1
  caluma:
2
- caluma-query:
3
- work-item:
4
- status:
5
- READY: "Offen"
6
- COMPLETED: "Erledigt"
7
- CANCELED: "Abgebrochen"
8
- SKIPPED: "Übersprungen"
9
-
10
- case:
11
- status:
12
- RUNNING: "In Bearbeitung"
13
- COMPLETED: "Abgeschlossen"
14
- CANCELED: "Abgebrochen"
15
2
  form:
16
3
  optional: "Optional"
17
4
  save: "Speichern"
18
5
  delete: "Löschen"
19
6
  edit: "Bearbeiten"
20
- selectFile: "Klicken um Datei hochzuladen"
21
- changeFile: "Klicken um andere Datei hochzuladen"
7
+ cancel: "Abbrechen"
8
+ close: "Schliessen"
9
+ selectFile: "Durchsuchen..."
22
10
  deleteRow: "Möchten Sie diese Zeile wirklich löschen?"
23
11
  addRow: "Zeile hinzufügen"
24
12
  optionNotAvailable: "Diese Option ist nicht mehr verfügbar"
@@ -1,24 +1,12 @@
1
1
  caluma:
2
- caluma-query:
3
- work-item:
4
- status:
5
- READY: "Pending"
6
- COMPLETED: "Completed"
7
- CANCELED: "Canceled"
8
- SKIPPED: "Skipped"
9
- case:
10
- status:
11
- RUNNING: "Pending"
12
- COMPLETED: "Completed"
13
- CANCELED: "Canceled"
14
-
15
2
  form:
16
3
  optional: "Optional"
17
4
  save: "Save"
18
5
  delete: "Delete"
19
6
  edit: "Edit"
20
- selectFile: "Click to upload a file"
21
- changeFile: "Click to upload a different file"
7
+ cancel: "Cancel"
8
+ close: "Close"
9
+ selectFile: "Browse..."
22
10
  deleteRow: "Do you really want to delete this row?"
23
11
  addRow: "Add row"
24
12
  optionNotAvailable: "This option is not available anymore"
@@ -1,25 +1,12 @@
1
1
  caluma:
2
- caluma-query:
3
- work-item:
4
- status:
5
- READY: "En attente"
6
- COMPLETED: "Terminé"
7
- CANCELED: "Annulé"
8
- SKIPPED: "Sauté"
9
-
10
- case:
11
- status:
12
- RUNNING: "En cours"
13
- COMPLETED: "Terminé"
14
- CANCELED: "Annulé"
15
-
16
2
  form:
17
3
  optional: "optional"
18
4
  save: "sauvegarder"
19
5
  delete: "supprimer"
20
6
  edit: "modifier"
21
- selectFile: "cliquez pour télécharger le ficher"
22
- changeFile: "cliquez pour télécharger un autre fichier"
7
+ cancel: "annuler"
8
+ close: "fermer"
9
+ selectFile: "Sélectionner..."
23
10
  deleteRow: "Voulez-vous supprimer cette ligne?"
24
11
  addRow: "Ajouter une ligne"
25
12
  optionNotAvailable: "Cette option n'est plus disponible"
@@ -1,57 +0,0 @@
1
- # import * from '@projectcaluma/ember-form/gql/fragments/field-question.graphql'
2
-
3
- fragment SimpleAnswer on Answer {
4
- id
5
- question {
6
- slug
7
- }
8
- ... on StringAnswer {
9
- stringValue: value
10
- }
11
- ... on IntegerAnswer {
12
- integerValue: value
13
- }
14
- ... on FloatAnswer {
15
- floatValue: value
16
- }
17
- ... on ListAnswer {
18
- listValue: value
19
- }
20
- ... on FileAnswer {
21
- fileValue: value {
22
- uploadUrl
23
- downloadUrl
24
- metadata
25
- name
26
- }
27
- }
28
- ... on DateAnswer {
29
- dateValue: value
30
- }
31
- }
32
-
33
- fragment FieldAnswer on Answer {
34
- ...SimpleAnswer
35
- ... on TableAnswer {
36
- tableValue: value {
37
- id
38
- form {
39
- slug
40
- questions {
41
- edges {
42
- node {
43
- ...FieldQuestion
44
- }
45
- }
46
- }
47
- }
48
- answers {
49
- edges {
50
- node {
51
- ...SimpleAnswer
52
- }
53
- }
54
- }
55
- }
56
- }
57
- }