@projectcaluma/ember-form 9.1.1 → 10.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
package/CHANGELOG.md ADDED
@@ -0,0 +1,21 @@
1
+ # [@projectcaluma/ember-form-v10.0.0](https://github.com/projectcaluma/ember-caluma/compare/@projectcaluma/ember-form-v9.3.0...@projectcaluma/ember-form-v10.0.0) (2021-11-25)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **form:** return default value for answer transform if empty ([ed703bc](https://github.com/projectcaluma/ember-caluma/commit/ed703bc2505e0ec59ec5b5ed6df4e0bb4f93db12))
7
+
8
+
9
+ ### chore
10
+
11
+ * **deps:** update dependencies and drop support for node 10 ([51d6dee](https://github.com/projectcaluma/ember-caluma/commit/51d6deeda9811518622ba0cefd8d3876651dab4f))
12
+
13
+
14
+ ### Features
15
+
16
+ * **action-button:** improve detection of work item for action button ([f00b7b0](https://github.com/projectcaluma/ember-caluma/commit/f00b7b06ac114c5bee2267132518c13ee1502ad0))
17
+
18
+
19
+ ### BREAKING CHANGES
20
+
21
+ * **deps:** Remove support for node v10
@@ -0,0 +1,19 @@
1
+ {{#unless @disabled}}
2
+ <DocumentValidity
3
+ @document={{@field.document}}
4
+ @validateOnEnter={{this.validateOnEnter}}
5
+ as |isValid validate|
6
+ >
7
+ <WorkItemButton
8
+ @workItemId={{this.workItem}}
9
+ @mutation={{this.action}}
10
+ @label={{@field.question.label}}
11
+ @disabled={{and (not-eq isValid null) (not isValid)}}
12
+ @color={{this.color}}
13
+ @beforeMutate={{fn this.beforeMutate validate}}
14
+ @onSuccess={{this.onSuccess}}
15
+ @onError={{this.onError}}
16
+ @type={{this.type}}
17
+ />
18
+ </DocumentValidity>
19
+ {{/unless}}
@@ -0,0 +1,75 @@
1
+ import { assert } from "@ember/debug";
2
+ import { action } from "@ember/object";
3
+ import Component from "@glimmer/component";
4
+ import UIkit from "uikit";
5
+
6
+ async function confirm(text) {
7
+ try {
8
+ await UIkit.modal.confirm(text);
9
+
10
+ return true;
11
+ } catch (error) {
12
+ return false;
13
+ }
14
+ }
15
+
16
+ export default class CfFieldInputActionButtonComponent extends Component {
17
+ constructor(...args) {
18
+ super(...args);
19
+
20
+ assert(
21
+ "The document must have a `workItemUuid` for `<CfField::Input::ActionButton />` to work.",
22
+ this.args.field.document.workItemUuid
23
+ );
24
+ }
25
+
26
+ get workItem() {
27
+ return (
28
+ this.args.context?.actionButtonWorkItemId ||
29
+ this.args.field.document.workItemUuid
30
+ );
31
+ }
32
+
33
+ get action() {
34
+ return this.args.field.question.action.toLowerCase();
35
+ }
36
+
37
+ get color() {
38
+ return this.args.field.question.color.toLowerCase();
39
+ }
40
+
41
+ get type() {
42
+ return this.args.field.question.action === "COMPLETE" ? "submit" : "button";
43
+ }
44
+
45
+ get validateOnEnter() {
46
+ return (
47
+ this.args.field.question.action === "COMPLETE" &&
48
+ this.args.field.question.validateOnEnter
49
+ );
50
+ }
51
+
52
+ @action
53
+ async beforeMutate(validateFn) {
54
+ if (
55
+ this.args.field.question.action === "COMPLETE" &&
56
+ !(await validateFn())
57
+ ) {
58
+ return false;
59
+ }
60
+
61
+ const confirmText = this.args.field.question.infoText;
62
+
63
+ return !confirmText || confirm(confirmText);
64
+ }
65
+
66
+ @action
67
+ onSuccess() {
68
+ return this.args.context?.actionButtonOnSuccess?.();
69
+ }
70
+
71
+ @action
72
+ onError(error) {
73
+ return this.args.context?.actionButtonOnError?.(error);
74
+ }
75
+ }
@@ -1,21 +1,32 @@
1
- {{#unless @disabled}}
2
- <div class="uk-width-1-1" uk-form-custom="target: true">
1
+ <div class="uk-flex-middle uk-grid-divider uk-grid-column-small" uk-grid>
2
+ <div uk-form-custom="target: true">
3
3
 
4
4
  <input
5
5
  type="file"
6
6
  name={{@field.pk}}
7
7
  id={{@field.pk}}
8
+ disabled={{@disabled}}
8
9
  {{on "change" this.save}}
9
10
  />
10
-
11
- {{! label is in another component }}
12
- {{! template-lint-disable require-input-label }}
13
- <input class="uk-input" type="text" placeholder={{@placeholder}} readonly />
11
+ <UkButton @color="primary" @disabled={{@disabled}}>
12
+ {{t "caluma.form.selectFile"}}
13
+ </UkButton>
14
14
  </div>
15
- {{/unless}}
16
-
17
- {{#if (and this.downloadUrl this.downloadName)}}
18
- <UkButton @color="link" @on-click={{this.download}}>
19
- {{this.downloadName}}
20
- </UkButton>
21
- {{/if}}
15
+ {{#if (and this.downloadUrl this.downloadName)}}
16
+ <div>
17
+ <UkButton
18
+ data-test-download-link
19
+ @color="link"
20
+ @on-click={{this.download}}
21
+ >
22
+ {{this.downloadName}}
23
+ </UkButton>
24
+ <UkIcon
25
+ class="uk-icon-button uk-margin-small-left"
26
+ role="button"
27
+ @icon="trash"
28
+ {{on "click" this.delete}}
29
+ />
30
+ </div>
31
+ {{/if}}
32
+ </div>
@@ -3,6 +3,7 @@ import { inject as service } from "@ember/service";
3
3
  import Component from "@glimmer/component";
4
4
  import { queryManager } from "ember-apollo-client";
5
5
 
6
+ import removeAnswerMutation from "@projectcaluma/ember-form/gql/mutations/remove-answer.graphql";
6
7
  import getFileAnswerInfoQuery from "@projectcaluma/ember-form/gql/queries/get-fileanswer-info.graphql";
7
8
 
8
9
  export default class CfFieldInputFileComponent extends Component {
@@ -18,14 +19,6 @@ export default class CfFieldInputFileComponent extends Component {
18
19
  return this.args.field?.answer?.value?.name;
19
20
  }
20
21
 
21
- get placeholder() {
22
- return this.intl.t(
23
- this.args.field?.answer.value
24
- ? "caluma.form.changeFile"
25
- : "caluma.form.selectFile"
26
- );
27
- }
28
-
29
22
  @action
30
23
  async download() {
31
24
  const { downloadUrl } = await this.apollo.watchQuery(
@@ -74,7 +67,24 @@ export default class CfFieldInputFileComponent extends Component {
74
67
  } finally {
75
68
  // eslint-disable-next-line require-atomic-updates
76
69
  target.value = "";
77
- target.parentNode.querySelector("[type=text]").value = "";
70
+ }
71
+ }
72
+
73
+ @action
74
+ async delete() {
75
+ try {
76
+ await this.apollo.mutate({
77
+ mutation: removeAnswerMutation,
78
+ variables: {
79
+ input: {
80
+ answer: this.args.field.answer.uuid,
81
+ },
82
+ },
83
+ });
84
+
85
+ await this.args.onSave(null);
86
+ } catch (error) {
87
+ set(this.args.field, "_errors", [{ type: "deleteFailed" }]);
78
88
  }
79
89
  }
80
90
  }
@@ -1,125 +1,124 @@
1
- {{#with field.question.rowForm.questions.edges as |questions|}}
2
- <table class="uk-table">
3
- <thead>
1
+ <table class="uk-table uk-table-divider">
2
+ <thead>
3
+ <tr>
4
+ {{#each this.columns as |column|}}
5
+ <th>{{column.label}}</th>
6
+ {{/each}}
7
+ <th></th>
8
+ </tr>
9
+ </thead>
10
+ <tbody>
11
+ {{#each @field.answer.value as |document|}}
4
12
  <tr>
5
- {{#each columnHeaders as |edge|}}
6
- <th>{{edge.node.label}}</th>
13
+ {{#each this.columns as |column|}}
14
+ <td>
15
+ <CfFieldValue
16
+ @field={{find-by "question.slug" column.slug document.fields}}
17
+ />
18
+ </td>
7
19
  {{/each}}
8
- <th></th>
9
- </tr>
10
- </thead>
11
- <tbody>
12
- {{#each field.answer.value as |document|}}
13
- <tr>
14
- {{#if field.question.meta.columnsToDisplay.length}}
15
- {{#each document.fields as |answerField|}}
16
- {{#if
17
- (includes
18
- answerField.answer.question.slug
19
- field.question.meta.columnsToDisplay
20
- )
21
- }}
22
- <td>{{cf-field-value field=answerField}}</td>
23
- {{/if}}
24
- {{/each}}
25
- {{else}}
26
- {{#each (take 4 document.fields) as |field|}}
27
- <td>{{cf-field-value field=field}}</td>
28
- {{/each}}
29
- {{/if}}
30
- <td class="uk-text-right">
20
+ <td class="uk-table-middle">
21
+ <div class="uk-flex uk-flex-middle uk-flex-right">
22
+ {{#if (includes false (map-by "isValid" document.fields))}}
23
+ <UkIcon
24
+ @icon="warning"
25
+ class="uk-animation-fade uk-text-danger"
26
+ />
27
+ {{/if}}
31
28
  <button
32
29
  data-test-edit-row
33
30
  type="button"
34
- class="uk-icon-button"
35
- uk-icon="pencil"
31
+ class="uk-button-link uk-flex-inline uk-margin-small-left"
36
32
  title={{t "caluma.form.edit"}}
37
- {{action "editRow" document}}
33
+ {{on "click" (fn this.edit document)}}
38
34
  >
35
+ <UkIcon @icon="pencil" />
39
36
  <span class="uk-hidden">{{t "caluma.form.edit"}}</span>
40
37
  </button>
41
- {{#unless disabled}}
38
+ {{#unless @disabled}}
42
39
  <button
43
40
  data-test-delete-row
44
41
  type="button"
45
- class="uk-icon-button"
46
- uk-icon="trash"
42
+ class="uk-button-link uk-flex-inline uk-margin-small-left"
47
43
  title={{t "caluma.form.delete"}}
48
- {{action "deleteRow" document}}
44
+ {{on "click" (fn (perform this.delete) document)}}
49
45
  >
46
+ <UkIcon @icon="trash" />
50
47
  <span class="uk-hidden">{{t "caluma.form.delete"}}</span>
51
48
  </button>
52
49
  {{/unless}}
53
- </td>
54
- </tr>
55
- {{/each}}
56
- </tbody>
50
+ </div>
51
+ </td>
52
+ </tr>
53
+ {{/each}}
54
+ </tbody>
55
+ {{#unless @disabled}}
57
56
  <tfoot>
58
- {{#unless disabled}}
59
- <tr>
60
- <td colspan={{add (count-keys questions) 1}} class="uk-text-center">
61
- <button
62
- type="button"
63
- class="uk-button uk-button-default uk-button-small"
64
- title={{t "caluma.form.addRow"}}
65
- {{on "click" (perform addRow)}}
66
- >
67
- <UkIcon @icon="plus" />
68
- <span class="uk-hidden">{{t "caluma.form.addRow"}}</span>
69
- </button>
70
- </td>
71
- </tr>
72
- {{/unless}}
57
+ <tr>
58
+ <td colspan={{add this.columns.length 1}} class="uk-text-center">
59
+ <UkButton
60
+ @size="small"
61
+ @color="default"
62
+ @on-click={{perform this.add}}
63
+ data-test-add-row
64
+ >
65
+ <UkIcon @icon="plus" />
66
+ <span class="uk-hidden">{{t "caluma.form.addRow"}}</span>
67
+ </UkButton>
68
+ </td>
69
+ </tr>
73
70
  </tfoot>
74
- </table>
75
-
76
- <UkModal
77
- @visible={{and showAddModal documentToEdit}}
78
- @on-hide={{action "closeModal" "showAddModal"}}
79
- @btnClose={{true}}
80
- @bgClose={{false}}
81
- as |modal|
82
- >
83
- <modal.body>
84
- {{#if documentToEdit}}
85
- {{cf-form-wrapper
86
- document=documentToEdit
87
- fieldset=(object-at 0 documentToEdit.fieldsets)
88
- disabled=disabled
89
- }}
90
- {{/if}}
91
- </modal.body>
92
-
93
- {{#unless disabled}}
94
- <modal.footer @class="uk-text-right">
95
- {{uk-button
96
- label=(t "caluma.form.save")
97
- disabled=save.isRunning
98
- loading=save.isRunning
99
- on-click=(perform save)
100
- }}
101
- </modal.footer>
102
- {{/unless}}
103
- </UkModal>
71
+ {{/unless}}
72
+ </table>
104
73
 
74
+ {{#if this.documentToEdit}}
105
75
  <UkModal
106
- @visible={{and showDeleteModal documentToDelete}}
107
- @on-hide={{action "closeModal" "showDeleteModal"}}
108
- @btnClose={{true}}
76
+ @visible={{this.showAddModal}}
77
+ @on-hide={{perform this.closeModal}}
109
78
  @bgClose={{false}}
110
79
  as |modal|
111
80
  >
112
81
  <modal.body>
113
- {{t "caluma.form.deleteRow"}}
82
+ <CfFormWrapper
83
+ @document={{this.documentToEdit}}
84
+ @fieldset={{object-at 0 this.documentToEdit.fieldsets}}
85
+ @disabled={{@disabled}}
86
+ />
114
87
  </modal.body>
115
88
 
116
89
  <modal.footer @class="uk-text-right">
117
- {{uk-button
118
- label=(t "caluma.form.delete")
119
- disabled=deleteRow.isRunning
120
- loading=deleteRow.isRunning
121
- on-click=(perform deleteRow documentToDelete)
122
- }}
90
+ {{#if @disabled}}
91
+ <UkButton
92
+ @label={{t "caluma.form.close"}}
93
+ @color="primary"
94
+ @on-click={{perform this.close}}
95
+ @disabled={{this.close.isRunning}}
96
+ @loading={{this.close.isRunning}}
97
+ data-test-close
98
+ />
99
+ {{else}}
100
+ <UkButton
101
+ @label={{t "caluma.form.cancel"}}
102
+ @on-click={{perform this.close}}
103
+ @disabled={{this.close.isRunning}}
104
+ @loading={{this.close.isRunning}}
105
+ data-test-cancel
106
+ />
107
+ <DocumentValidity
108
+ @document={{this.documentToEdit}}
109
+ as |isValid validate|
110
+ >
111
+ <UkButton
112
+ @label={{t "caluma.form.save"}}
113
+ @color="primary"
114
+ @type="submit"
115
+ @disabled={{or this.save.isRunning (not isValid)}}
116
+ @loading={{this.save.isRunning}}
117
+ @on-click={{fn (perform this.save) validate}}
118
+ data-test-save
119
+ />
120
+ </DocumentValidity>
121
+ {{/if}}
123
122
  </modal.footer>
124
123
  </UkModal>
125
- {{/with}}
124
+ {{/if}}
@@ -1,49 +1,65 @@
1
1
  import { getOwner } from "@ember/application";
2
- import Component from "@ember/component";
3
- import { computed } from "@ember/object";
2
+ import { action } from "@ember/object";
4
3
  import { inject as service } from "@ember/service";
4
+ import Component from "@glimmer/component";
5
+ import { tracked } from "@glimmer/tracking";
5
6
  import { queryManager } from "ember-apollo-client";
6
- import { task, all } from "ember-concurrency";
7
+ import { dropTask } from "ember-concurrency-decorators";
8
+ import UIkit from "uikit";
7
9
 
8
10
  import removeDocumentMutation from "@projectcaluma/ember-form/gql/mutations/remove-document.graphql";
9
11
  import saveDocumentMutation from "@projectcaluma/ember-form/gql/mutations/save-document.graphql";
10
12
  import { parseDocument } from "@projectcaluma/ember-form/lib/parsers";
11
13
 
12
- export default Component.extend({
13
- notification: service(),
14
- intl: service(),
15
- calumaStore: service(),
14
+ async function confirm(text) {
15
+ try {
16
+ await UIkit.modal.confirm(text);
16
17
 
17
- apollo: queryManager(),
18
+ return true;
19
+ } catch (error) {
20
+ return false;
21
+ }
22
+ }
18
23
 
19
- showAddModal: false,
20
- showDeleteModal: false,
21
- documentToEdit: null,
22
- documentToDelete: null,
24
+ export default class CfFieldInputTableComponent extends Component {
25
+ @service notification;
26
+ @service intl;
27
+ @service calumaStore;
28
+
29
+ @queryManager apollo;
30
+
31
+ @tracked showAddModal = false;
32
+ @tracked documentToEdit = null;
33
+ @tracked documentToEditIsNew = false;
23
34
 
24
35
  parseDocument(raw) {
25
36
  return parseDocument(raw);
26
- },
27
-
28
- columnHeaders: computed(
29
- "field.question.{rowForm.questions.edges.@each,meta.columnsToDisplay.[]}",
30
- function () {
31
- if (this.get("field.question.meta.columnsToDisplay.length")) {
32
- return this.get("field.question.rowForm.questions.edges").filter((n) =>
33
- this.get("field.question.meta.columnsToDisplay").includes(n.node.slug)
34
- );
35
- }
36
- return this.get("field.question.rowForm.questions.edges").slice(0, 4);
37
+ }
38
+
39
+ get questions() {
40
+ return this.args.field.question.rowForm.questions.edges.map(
41
+ (edge) => edge.node
42
+ );
43
+ }
44
+
45
+ get columns() {
46
+ const config = this.args.field.question.meta.columnsToDisplay;
47
+
48
+ if (config?.length) {
49
+ return this.questions.filter((question) =>
50
+ config.includes(question.slug)
51
+ );
37
52
  }
38
- ),
39
53
 
40
- addRow: task(function* () {
54
+ return this.questions.slice(0, 4);
55
+ }
56
+
57
+ @dropTask
58
+ *add() {
41
59
  const raw = yield this.apollo.mutate(
42
60
  {
43
61
  mutation: saveDocumentMutation,
44
- variables: {
45
- input: { form: this.get("field.question.rowForm.slug") },
46
- },
62
+ variables: { input: { form: this.args.field.question.rowForm.slug } },
47
63
  },
48
64
  "saveDocument.document"
49
65
  );
@@ -52,89 +68,90 @@ export default Component.extend({
52
68
  .factoryFor("caluma-model:document")
53
69
  .create({
54
70
  raw: this.parseDocument(raw),
55
- parentDocument: this.field.document,
71
+ parentDocument: this.args.field.document,
56
72
  });
57
73
 
58
- this.setProperties({
59
- documentToEdit: newDocument,
60
- showAddModal: true,
61
- });
62
- }).drop(),
74
+ this.documentToEditIsNew = true;
75
+ this.documentToEdit = newDocument;
76
+ this.showAddModal = true;
77
+ }
63
78
 
64
- deleteRow: task(function* (document) {
65
- if (!this.field.answer.value) return;
79
+ @dropTask
80
+ *delete(document) {
81
+ if (!(yield confirm(this.intl.t("caluma.form.deleteRow")))) {
82
+ return;
83
+ }
66
84
 
67
- const remainingDocuments = this.field.answer.value.filter(
85
+ const remainingDocuments = this.args.field.answer.value.filter(
68
86
  (doc) => doc.pk !== document.pk
69
87
  );
70
88
 
71
- yield this.onSave(remainingDocuments);
72
-
73
- // Remove orphaned document from database.
74
- yield this.apollo.mutate({
75
- mutation: removeDocumentMutation,
76
- variables: { input: { document: document.uuid } },
77
- });
78
-
79
- // Remove orphand document from Caluma store.
80
- this.calumaStore.delete(document.pk);
89
+ yield this.args.onSave(remainingDocuments);
90
+ yield this.removeOrphan(document);
91
+ }
81
92
 
82
- this.closeModal("showDeleteModal");
83
- }),
84
-
85
- save: task(function* () {
93
+ @dropTask
94
+ *save(validate) {
86
95
  try {
96
+ if (!(yield validate())) {
97
+ return;
98
+ }
99
+
87
100
  const newDocument = this.documentToEdit;
88
- yield all(newDocument.fields.map((f) => f.validate.perform()));
101
+
102
+ yield Promise.all(newDocument.fields.map((f) => f.validate.perform()));
89
103
 
90
104
  if (newDocument.fields.some((field) => field.isInvalid)) {
91
105
  return;
92
106
  }
93
107
 
94
- const rows = this.get("field.answer.value") || [];
108
+ const rows = this.args.field.answer.value ?? [];
95
109
 
96
110
  if (!rows.find((doc) => doc.pk === newDocument.pk)) {
97
111
  // add document to table
98
- yield this.onSave([...rows, newDocument]);
112
+ yield this.args.onSave([...rows, newDocument]);
99
113
 
100
114
  this.notification.success(
101
115
  this.intl.t("caluma.form.notification.table.add.success")
102
116
  );
103
117
  }
104
118
 
105
- this.closeModal("showAddModal");
119
+ this.documentToEditIsNew = false;
120
+
121
+ yield this.close.perform();
106
122
  } catch (e) {
107
- // eslint-disable-next-line no-console
108
- console.error(e);
109
123
  this.notification.danger(
110
124
  this.intl.t("caluma.form.notification.table.add.error")
111
125
  );
112
126
  }
113
- }),
127
+ }
114
128
 
115
- closeModal(propertyName) {
116
- this.set(propertyName, false);
129
+ @dropTask
130
+ *close() {
131
+ if (this.documentToEditIsNew) {
132
+ yield this.removeOrphan(this.documentToEdit);
117
133
 
118
- this.field.validate.perform();
119
- },
134
+ this.documentToEditIsNew = false;
135
+ }
120
136
 
121
- actions: {
122
- closeModal(propertyName) {
123
- this.closeModal(propertyName);
124
- },
137
+ this.showAddModal = false;
138
+ this.documentToEdit = null;
139
+ }
125
140
 
126
- editRow(document) {
127
- this.setProperties({
128
- documentToEdit: document,
129
- showAddModal: true,
130
- });
131
- },
141
+ async removeOrphan(calumaDocument) {
142
+ // Remove orphaned document from database.
143
+ await this.apollo.mutate({
144
+ mutation: removeDocumentMutation,
145
+ variables: { input: { document: calumaDocument.uuid } },
146
+ });
132
147
 
133
- deleteRow(document) {
134
- this.setProperties({
135
- documentToDelete: document,
136
- showDeleteModal: true,
137
- });
138
- },
139
- },
140
- });
148
+ // Remove orphaned document from Caluma store.
149
+ this.calumaStore.delete(calumaDocument.pk);
150
+ }
151
+
152
+ @action
153
+ edit(document) {
154
+ this.documentToEdit = document;
155
+ this.showAddModal = true;
156
+ }
157
+ }
@@ -5,6 +5,7 @@
5
5
  @field={{@field}}
6
6
  @disabled={{@disabled}}
7
7
  @onSave={{@onSave}}
8
+ @context={{@context}}
8
9
  />
9
10
  </div>
10
11
  {{/let}}