@projectcaluma/ember-form 10.0.3 → 11.0.0-beta.1
Sign up to get free protection for your applications and to get access to all the features.
- package/addon/components/cf-content.hbs +36 -39
- package/addon/components/cf-content.js +45 -18
- package/addon/components/cf-field/input/action-button.hbs +1 -1
- package/addon/components/cf-field/input/action-button.js +9 -7
- package/addon/components/cf-field/input/checkbox.hbs +1 -1
- package/addon/components/cf-field/input/checkbox.js +9 -29
- package/addon/components/cf-field/input/file.js +7 -8
- package/addon/components/cf-field/input/float.hbs +2 -2
- package/addon/components/cf-field/input/integer.hbs +3 -3
- package/addon/components/cf-field/input/table.js +12 -10
- package/addon/components/cf-field/input/text.hbs +3 -3
- package/addon/components/cf-field/input/textarea.hbs +3 -3
- package/addon/components/cf-field/input.js +1 -1
- package/addon/components/cf-field/label.hbs +1 -1
- package/addon/components/cf-field-value.js +7 -12
- package/addon/components/cf-field.hbs +2 -2
- package/addon/components/cf-field.js +2 -3
- package/addon/components/document-validity.js +1 -1
- package/addon/helpers/get-widget.js +50 -0
- package/addon/lib/answer.js +108 -72
- package/addon/lib/base.js +32 -23
- package/addon/lib/dependencies.js +36 -71
- package/addon/lib/document.js +92 -96
- package/addon/lib/field.js +333 -400
- package/addon/lib/fieldset.js +46 -47
- package/addon/lib/form.js +27 -15
- package/addon/lib/navigation.js +187 -181
- package/addon/lib/question.js +102 -93
- package/addon/services/caluma-store.js +10 -6
- package/app/helpers/get-widget.js +4 -0
- package/package.json +14 -13
@@ -1,44 +1,41 @@
|
|
1
1
|
{{#if @documentId}}
|
2
|
-
|
3
|
-
{{
|
4
|
-
|
5
|
-
{{
|
6
|
-
|
7
|
-
|
2
|
+
{{#if this.loading}}
|
3
|
+
<div class="uk-text-center"><UkSpinner @ratio={{2}} /></div>
|
4
|
+
{{else if this.document}}
|
5
|
+
{{#let
|
6
|
+
(hash
|
7
|
+
document=this.document
|
8
|
+
navigation=(component
|
9
|
+
"cf-navigation"
|
10
|
+
navigation=this.navigation
|
11
|
+
useAsHeading=(or @useAsHeading false)
|
12
|
+
headingBaseLevel=(or @headingBaseLevel 1)
|
13
|
+
)
|
14
|
+
pagination=(component "cf-pagination" navigation=this.navigation)
|
15
|
+
form=(component
|
16
|
+
"cf-form-wrapper"
|
8
17
|
document=this.document
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
useAsHeading=(or @useAsHeading false)
|
13
|
-
headingBaseLevel=(or @headingBaseLevel 1)
|
14
|
-
)
|
15
|
-
pagination=(component "cf-pagination" navigation=this.navigation)
|
16
|
-
form=(component
|
17
|
-
"cf-form-wrapper"
|
18
|
-
document=this.document
|
19
|
-
fieldset=this.fieldset
|
20
|
-
context=@context
|
21
|
-
disabled=@disabled
|
22
|
-
)
|
18
|
+
fieldset=this.fieldset
|
19
|
+
context=@context
|
20
|
+
disabled=@disabled
|
23
21
|
)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
{{
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
</div>
|
22
|
+
)
|
23
|
+
as |content|
|
24
|
+
}}
|
25
|
+
{{#if (has-block)}}
|
26
|
+
{{yield content}}
|
27
|
+
{{else if (gt this.document.fieldsets.length 1)}}
|
28
|
+
<div uk-grid>
|
29
|
+
<div class="uk-width-1-1 uk-width-1-3@m"><content.navigation /></div>
|
30
|
+
<div class="uk-width-1-1 uk-width-2-3@m">
|
31
|
+
<content.form />
|
32
|
+
<hr />
|
33
|
+
<content.pagination />
|
37
34
|
</div>
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
{{/
|
42
|
-
{{/
|
43
|
-
|
35
|
+
</div>
|
36
|
+
{{else}}
|
37
|
+
<content.form />
|
38
|
+
{{/if}}
|
39
|
+
{{/let}}
|
40
|
+
{{/if}}
|
44
41
|
{{/if}}
|
@@ -1,9 +1,10 @@
|
|
1
1
|
import { getOwner } from "@ember/application";
|
2
|
-
import {
|
2
|
+
import { destroy, registerDestructor } from "@ember/destroyable";
|
3
3
|
import { inject as service } from "@ember/service";
|
4
4
|
import Component from "@glimmer/component";
|
5
5
|
import { queryManager } from "ember-apollo-client";
|
6
|
-
import { dropTask } from "ember-concurrency
|
6
|
+
import { dropTask } from "ember-concurrency";
|
7
|
+
import { useTask } from "ember-resources";
|
7
8
|
|
8
9
|
import getDocumentAnswersQuery from "@projectcaluma/ember-form/gql/queries/document-answers.graphql";
|
9
10
|
import getDocumentFormsQuery from "@projectcaluma/ember-form/gql/queries/document-forms.graphql";
|
@@ -62,7 +63,7 @@ export default class CfContentComponent extends Component {
|
|
62
63
|
* Can be used to pass "context" information from the outside through
|
63
64
|
* to custom overrides.
|
64
65
|
*
|
65
|
-
* @argument {
|
66
|
+
* @argument {Object} context
|
66
67
|
*/
|
67
68
|
|
68
69
|
/**
|
@@ -71,17 +72,40 @@ export default class CfContentComponent extends Component {
|
|
71
72
|
* @argument {Boolean} disabled
|
72
73
|
*/
|
73
74
|
|
75
|
+
/**
|
76
|
+
* Whether the form should be displayed as loading, this can be used to
|
77
|
+
* indicate a loading state if the application calling this component is
|
78
|
+
* loading additional data.
|
79
|
+
*
|
80
|
+
* @argument {Boolean} loading
|
81
|
+
*/
|
82
|
+
|
74
83
|
/**
|
75
84
|
* The document to display
|
76
85
|
*
|
77
86
|
* @property {Document} document
|
78
87
|
*/
|
79
88
|
get document() {
|
80
|
-
return this.
|
89
|
+
return this.data.value?.document;
|
81
90
|
}
|
82
91
|
|
92
|
+
/**
|
93
|
+
* The navigation to display
|
94
|
+
*
|
95
|
+
* @property {Document} document
|
96
|
+
*/
|
83
97
|
get navigation() {
|
84
|
-
return this.
|
98
|
+
return this.data.value?.navigation;
|
99
|
+
}
|
100
|
+
|
101
|
+
/**
|
102
|
+
* Whether the component is in a loading state. This can be overwritten by
|
103
|
+
* passing `loading` as an argument
|
104
|
+
*
|
105
|
+
* @property {Boolean} loading
|
106
|
+
*/
|
107
|
+
get loading() {
|
108
|
+
return this.args.loading || this.data.isRunning;
|
85
109
|
}
|
86
110
|
|
87
111
|
/**
|
@@ -109,9 +133,12 @@ export default class CfContentComponent extends Component {
|
|
109
133
|
return fieldset;
|
110
134
|
}
|
111
135
|
|
136
|
+
data = useTask(this, this.fetchData, () => [this.args.documentId]);
|
137
|
+
|
112
138
|
@dropTask
|
113
139
|
*fetchData() {
|
114
|
-
this.
|
140
|
+
if (this.document) destroy(this.document);
|
141
|
+
if (this.navigation) destroy(this.navigation);
|
115
142
|
|
116
143
|
if (!this.args.documentId) return;
|
117
144
|
|
@@ -133,20 +160,20 @@ export default class CfContentComponent extends Component {
|
|
133
160
|
"allForms.edges"
|
134
161
|
)).map(({ node }) => node);
|
135
162
|
|
136
|
-
const
|
137
|
-
|
138
|
-
|
163
|
+
const owner = getOwner(this);
|
164
|
+
const Document = owner.factoryFor("caluma-model:document").class;
|
165
|
+
const Navigation = owner.factoryFor("caluma-model:navigation").class;
|
139
166
|
|
140
|
-
const
|
141
|
-
.factoryFor("caluma-model:navigation")
|
142
|
-
.create({ document });
|
167
|
+
const raw = parseDocument({ ...answerDocument, form });
|
143
168
|
|
144
|
-
|
145
|
-
|
169
|
+
const document = new Document({ raw, owner });
|
170
|
+
const navigation = new Navigation({ document, owner });
|
146
171
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
172
|
+
registerDestructor(this, () => {
|
173
|
+
destroy(document);
|
174
|
+
destroy(navigation);
|
175
|
+
});
|
176
|
+
|
177
|
+
return { document, navigation };
|
151
178
|
}
|
152
179
|
}
|
@@ -7,7 +7,7 @@
|
|
7
7
|
<WorkItemButton
|
8
8
|
@workItemId={{this.workItem}}
|
9
9
|
@mutation={{this.action}}
|
10
|
-
@label={{@field.question.label}}
|
10
|
+
@label={{@field.question.raw.label}}
|
11
11
|
@disabled={{and (not-eq isValid null) (not isValid)}}
|
12
12
|
@color={{this.color}}
|
13
13
|
@beforeMutate={{fn this.beforeMutate validate}}
|
@@ -31,34 +31,36 @@ export default class CfFieldInputActionButtonComponent extends Component {
|
|
31
31
|
}
|
32
32
|
|
33
33
|
get action() {
|
34
|
-
return this.args.field.question.action.toLowerCase();
|
34
|
+
return this.args.field.question.raw.action.toLowerCase();
|
35
35
|
}
|
36
36
|
|
37
37
|
get color() {
|
38
|
-
return this.args.field.question.color.toLowerCase();
|
38
|
+
return this.args.field.question.raw.color.toLowerCase();
|
39
39
|
}
|
40
40
|
|
41
41
|
get type() {
|
42
|
-
return this.args.field.question.action === "COMPLETE"
|
42
|
+
return this.args.field.question.raw.action === "COMPLETE"
|
43
|
+
? "submit"
|
44
|
+
: "button";
|
43
45
|
}
|
44
46
|
|
45
47
|
get validateOnEnter() {
|
46
48
|
return (
|
47
|
-
this.args.field.question.action === "COMPLETE" &&
|
48
|
-
this.args.field.question.validateOnEnter
|
49
|
+
this.args.field.question.raw.action === "COMPLETE" &&
|
50
|
+
this.args.field.question.raw.validateOnEnter
|
49
51
|
);
|
50
52
|
}
|
51
53
|
|
52
54
|
@action
|
53
55
|
async beforeMutate(validateFn) {
|
54
56
|
if (
|
55
|
-
this.args.field.question.action === "COMPLETE" &&
|
57
|
+
this.args.field.question.raw.action === "COMPLETE" &&
|
56
58
|
!(await validateFn())
|
57
59
|
) {
|
58
60
|
return false;
|
59
61
|
}
|
60
62
|
|
61
|
-
const confirmText = this.args.field.question.infoText;
|
63
|
+
const confirmText = this.args.field.question.raw.infoText;
|
62
64
|
|
63
65
|
return !confirmText || confirm(confirmText);
|
64
66
|
}
|
@@ -1,28 +1,6 @@
|
|
1
1
|
import { action } from "@ember/object";
|
2
2
|
import Component from "@glimmer/component";
|
3
3
|
|
4
|
-
/**
|
5
|
-
* Function to extract the option slug out of an input element. This is needed
|
6
|
-
* since IE11 does not properly set the `value` attribute but sets the value to
|
7
|
-
* `on` if checked and `off` if not. So for all sane browsers we use the
|
8
|
-
* `value` attribute but for IE11 we use the appended option slug to the field
|
9
|
-
* id as the input elements `name` property.
|
10
|
-
*
|
11
|
-
* E.g: An element with
|
12
|
-
* `name="Document:xxx-xxx:Question:some-question:Option:some-option"` will
|
13
|
-
* return `some-option`.
|
14
|
-
*
|
15
|
-
* For further information about this bug see
|
16
|
-
* https://github.com/emberjs/ember.js/issues/15203
|
17
|
-
*
|
18
|
-
* @function getSlug
|
19
|
-
* @param {Element} element The html input element
|
20
|
-
* @return {String} The option slug
|
21
|
-
*/
|
22
|
-
const getSlug = ({ value, name }) => {
|
23
|
-
return ["on", "off"].includes(value) ? name.split(":").pop() : value;
|
24
|
-
};
|
25
|
-
|
26
4
|
/**
|
27
5
|
* Input component for the checkbox question type
|
28
6
|
*
|
@@ -37,13 +15,15 @@ export default class CfFieldInputCheckboxComponent extends Component {
|
|
37
15
|
* @method update
|
38
16
|
*/
|
39
17
|
@action
|
40
|
-
update({ target }) {
|
41
|
-
const
|
42
|
-
|
43
|
-
|
44
|
-
)
|
45
|
-
|
18
|
+
update({ target: { value, checked } }) {
|
19
|
+
const valueSet = new Set(this.args.field.value);
|
20
|
+
|
21
|
+
if (checked) {
|
22
|
+
valueSet.add(value);
|
23
|
+
} else {
|
24
|
+
valueSet.delete(value);
|
25
|
+
}
|
46
26
|
|
47
|
-
this.args.onSave([...
|
27
|
+
this.args.onSave([...valueSet]);
|
48
28
|
}
|
49
29
|
}
|
@@ -1,7 +1,8 @@
|
|
1
|
-
import { action
|
1
|
+
import { action } from "@ember/object";
|
2
2
|
import { inject as service } from "@ember/service";
|
3
3
|
import Component from "@glimmer/component";
|
4
4
|
import { queryManager } from "ember-apollo-client";
|
5
|
+
import fetch from "fetch";
|
5
6
|
|
6
7
|
import removeAnswerMutation from "@projectcaluma/ember-form/gql/mutations/remove-answer.graphql";
|
7
8
|
import getFileAnswerInfoQuery from "@projectcaluma/ember-form/gql/queries/fileanswer-info.graphql";
|
@@ -24,7 +25,7 @@ export default class CfFieldInputFileComponent extends Component {
|
|
24
25
|
const { downloadUrl } = await this.apollo.watchQuery(
|
25
26
|
{
|
26
27
|
query: getFileAnswerInfoQuery,
|
27
|
-
variables: { id: this.args.field.answer.id },
|
28
|
+
variables: { id: this.args.field.answer.raw.id },
|
28
29
|
fetchPolicy: "cache-and-network",
|
29
30
|
},
|
30
31
|
"node.fileValue"
|
@@ -55,15 +56,13 @@ export default class CfFieldInputFileComponent extends Component {
|
|
55
56
|
throw new Error();
|
56
57
|
}
|
57
58
|
|
58
|
-
|
59
|
-
set(this.args.field.answer, "value", {
|
59
|
+
this.args.field.answer.value = {
|
60
60
|
name: file.name,
|
61
61
|
downloadUrl: fileValue.downloadUrl,
|
62
|
-
}
|
62
|
+
};
|
63
63
|
} catch (error) {
|
64
64
|
await this.args.onSave(null);
|
65
|
-
|
66
|
-
set(this.args.field, "_errors", [{ type: "uploadFailed" }]);
|
65
|
+
this.args.field._errors = [{ type: "uploadFailed" }];
|
67
66
|
} finally {
|
68
67
|
// eslint-disable-next-line require-atomic-updates
|
69
68
|
target.value = "";
|
@@ -84,7 +83,7 @@ export default class CfFieldInputFileComponent extends Component {
|
|
84
83
|
|
85
84
|
await this.args.onSave(null);
|
86
85
|
} catch (error) {
|
87
|
-
|
86
|
+
this.args.field._errors = [{ type: "deleteFailed" }];
|
88
87
|
}
|
89
88
|
}
|
90
89
|
}
|
@@ -8,7 +8,7 @@
|
|
8
8
|
name={{@field.pk}}
|
9
9
|
id={{@field.pk}}
|
10
10
|
value={{@field.value}}
|
11
|
-
min={{@field.question.floatMinValue}}
|
12
|
-
max={{@field.question.floatMaxValue}}
|
11
|
+
min={{@field.question.raw.floatMinValue}}
|
12
|
+
max={{@field.question.raw.floatMaxValue}}
|
13
13
|
{{on "input" this.input}}
|
14
14
|
/>
|
@@ -7,9 +7,9 @@
|
|
7
7
|
name={{@field.pk}}
|
8
8
|
id={{@field.pk}}
|
9
9
|
value={{@field.answer.value}}
|
10
|
-
min={{@field.question.integerMinValue}}
|
11
|
-
max={{@field.question.integerMaxValue}}
|
12
|
-
placeholder={{@field.question.placeholder}}
|
10
|
+
min={{@field.question.raw.integerMinValue}}
|
11
|
+
max={{@field.question.raw.integerMaxValue}}
|
12
|
+
placeholder={{@field.question.raw.placeholder}}
|
13
13
|
readonly={{@disabled}}
|
14
14
|
{{on "input" this.input}}
|
15
15
|
/>
|
@@ -4,7 +4,7 @@ import { inject as service } from "@ember/service";
|
|
4
4
|
import Component from "@glimmer/component";
|
5
5
|
import { tracked } from "@glimmer/tracking";
|
6
6
|
import { queryManager } from "ember-apollo-client";
|
7
|
-
import { dropTask } from "ember-concurrency
|
7
|
+
import { dropTask } from "ember-concurrency";
|
8
8
|
import UIkit from "uikit";
|
9
9
|
|
10
10
|
import removeDocumentMutation from "@projectcaluma/ember-form/gql/mutations/remove-document.graphql";
|
@@ -37,13 +37,13 @@ export default class CfFieldInputTableComponent extends Component {
|
|
37
37
|
}
|
38
38
|
|
39
39
|
get questions() {
|
40
|
-
return this.args.field.question.rowForm.questions.edges.map(
|
40
|
+
return this.args.field.question.raw.rowForm.questions.edges.map(
|
41
41
|
(edge) => edge.node
|
42
42
|
);
|
43
43
|
}
|
44
44
|
|
45
45
|
get columns() {
|
46
|
-
const config = this.args.field.question.meta.columnsToDisplay;
|
46
|
+
const config = this.args.field.question.raw.meta.columnsToDisplay;
|
47
47
|
|
48
48
|
if (config?.length) {
|
49
49
|
return this.questions.filter((question) =>
|
@@ -59,17 +59,19 @@ export default class CfFieldInputTableComponent extends Component {
|
|
59
59
|
const raw = yield this.apollo.mutate(
|
60
60
|
{
|
61
61
|
mutation: saveDocumentMutation,
|
62
|
-
variables: {
|
62
|
+
variables: {
|
63
|
+
input: { form: this.args.field.question.raw.rowForm.slug },
|
64
|
+
},
|
63
65
|
},
|
64
66
|
"saveDocument.document"
|
65
67
|
);
|
66
68
|
|
67
|
-
const
|
68
|
-
|
69
|
-
.
|
70
|
-
|
71
|
-
|
72
|
-
|
69
|
+
const owner = getOwner(this);
|
70
|
+
const newDocument = new (owner.factoryFor("caluma-model:document").class)({
|
71
|
+
raw: this.parseDocument(raw),
|
72
|
+
parentDocument: this.args.field.document,
|
73
|
+
owner,
|
74
|
+
});
|
73
75
|
|
74
76
|
this.documentToEditIsNew = true;
|
75
77
|
this.documentToEdit = newDocument;
|
@@ -6,9 +6,9 @@
|
|
6
6
|
name={{@field.pk}}
|
7
7
|
id={{@field.pk}}
|
8
8
|
value={{@field.answer.value}}
|
9
|
-
placeholder={{@field.question.placeholder}}
|
9
|
+
placeholder={{@field.question.raw.placeholder}}
|
10
10
|
readonly={{@disabled}}
|
11
|
-
minlength={{@field.question.textMinLength}}
|
12
|
-
maxlength={{@field.question.textMaxLength}}
|
11
|
+
minlength={{@field.question.raw.textMinLength}}
|
12
|
+
maxlength={{@field.question.raw.textMaxLength}}
|
13
13
|
{{on "input" this.input}}
|
14
14
|
/>
|
@@ -4,9 +4,9 @@
|
|
4
4
|
{{if @disabled 'uk-disabled'}}"
|
5
5
|
name={{@field.pk}}
|
6
6
|
id={{@field.pk}}
|
7
|
-
placeholder={{@field.question.placeholder}}
|
8
|
-
minlength={{@field.question.textareaMinLength}}
|
9
|
-
maxlength={{@field.question.textareaMaxLength}}
|
7
|
+
placeholder={{@field.question.raw.placeholder}}
|
8
|
+
minlength={{@field.question.raw.textareaMinLength}}
|
9
|
+
maxlength={{@field.question.raw.textareaMaxLength}}
|
10
10
|
readonly={{@disabled}}
|
11
11
|
{{on "input" this.input}}
|
12
12
|
>{{@field.answer.value}}</textarea>
|
@@ -11,7 +11,7 @@ export default class CfFieldValueComponent extends Component {
|
|
11
11
|
get value() {
|
12
12
|
const field = this.args.field;
|
13
13
|
|
14
|
-
switch (field.
|
14
|
+
switch (field.questionType) {
|
15
15
|
case "ChoiceQuestion":
|
16
16
|
case "DynamicChoiceQuestion": {
|
17
17
|
return field.selected;
|
@@ -23,8 +23,8 @@ export default class CfFieldValueComponent extends Component {
|
|
23
23
|
case "FileQuestion": {
|
24
24
|
const answerValue = field.answer.value;
|
25
25
|
return {
|
26
|
-
fileAnswerId: answerValue && field.answer.id,
|
27
|
-
label: answerValue
|
26
|
+
fileAnswerId: answerValue && field.answer.raw.id,
|
27
|
+
label: answerValue?.name,
|
28
28
|
};
|
29
29
|
}
|
30
30
|
case "DateQuestion": {
|
@@ -34,22 +34,17 @@ export default class CfFieldValueComponent extends Component {
|
|
34
34
|
}
|
35
35
|
|
36
36
|
default:
|
37
|
-
return {
|
38
|
-
label: field.answer.value,
|
39
|
-
};
|
37
|
+
return { label: field.answer.value };
|
40
38
|
}
|
41
39
|
}
|
42
40
|
|
43
41
|
@action
|
44
|
-
async download(
|
42
|
+
async download(id) {
|
45
43
|
const { downloadUrl } = await this.apollo.query(
|
46
|
-
{
|
47
|
-
query: getFileAnswerInfoQuery,
|
48
|
-
variables: { id: fileAnswerId },
|
49
|
-
fetchPolicy: "cache-and-network",
|
50
|
-
},
|
44
|
+
{ query: getFileAnswerInfoQuery, variables: { id } },
|
51
45
|
"node.fileValue"
|
52
46
|
);
|
47
|
+
|
53
48
|
window.open(downloadUrl, "_blank");
|
54
49
|
}
|
55
50
|
}
|
@@ -16,8 +16,8 @@
|
|
16
16
|
{{/let}}
|
17
17
|
</div>
|
18
18
|
|
19
|
-
{{#if (and @field.question.infoText this.infoTextVisible)}}
|
20
|
-
<CfField::info @text={{@field.question.infoText}} />
|
19
|
+
{{#if (and @field.question.raw.infoText this.infoTextVisible)}}
|
20
|
+
<CfField::info @text={{@field.question.raw.infoText}} />
|
21
21
|
{{/if}}
|
22
22
|
|
23
23
|
{{#if this.saveIndicatorVisible}}
|
@@ -1,8 +1,7 @@
|
|
1
1
|
import { getOwner } from "@ember/application";
|
2
2
|
import { set } from "@ember/object";
|
3
3
|
import Component from "@glimmer/component";
|
4
|
-
import { timeout } from "ember-concurrency";
|
5
|
-
import { restartableTask } from "ember-concurrency-decorators";
|
4
|
+
import { timeout, restartableTask } from "ember-concurrency";
|
6
5
|
|
7
6
|
import { hasQuestionType } from "@projectcaluma/ember-core/helpers/has-question-type";
|
8
7
|
|
@@ -28,7 +27,7 @@ export default class CfFieldComponent extends Component {
|
|
28
27
|
|
29
28
|
get labelVisible() {
|
30
29
|
return (
|
31
|
-
!this.args.field?.question.meta.hideLabel &&
|
30
|
+
!this.args.field?.question.raw.meta.hideLabel &&
|
32
31
|
!hasQuestionType(this.args.field?.question, "static", "action-button")
|
33
32
|
);
|
34
33
|
}
|
@@ -0,0 +1,50 @@
|
|
1
|
+
import Helper from "@ember/component/helper";
|
2
|
+
import { warn } from "@ember/debug";
|
3
|
+
import { inject as service } from "@ember/service";
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Helper for getting the right widget.
|
7
|
+
*
|
8
|
+
* This helper expects n objects as positional parameters. It checks if the
|
9
|
+
* object has a widget override in it's metadata. If one exists it checks if
|
10
|
+
* said widget was registered in the caluma options service and then returns
|
11
|
+
* the widget name. If it doesn't have a valid widget, the next object will be
|
12
|
+
* checked. If no object returns a valid widget, the passed default widget will
|
13
|
+
* be used.
|
14
|
+
*
|
15
|
+
* ```hbs
|
16
|
+
* {{component (get-widget field.question someobject default="cf-form") foo=bar}}
|
17
|
+
* ```
|
18
|
+
*
|
19
|
+
* @function getWidget
|
20
|
+
* @param {Array} params
|
21
|
+
* @param {Object} [options]
|
22
|
+
* @param {String} [options.default]
|
23
|
+
*/
|
24
|
+
export default class GetWidgetHelper extends Helper {
|
25
|
+
@service calumaOptions;
|
26
|
+
|
27
|
+
compute(params, { default: defaultWidget = "cf-field/input" }) {
|
28
|
+
for (const obj of params) {
|
29
|
+
const widget = obj?.raw?.meta?.widgetOverride;
|
30
|
+
if (!widget) {
|
31
|
+
continue;
|
32
|
+
}
|
33
|
+
const override =
|
34
|
+
widget &&
|
35
|
+
this.calumaOptions
|
36
|
+
.getComponentOverrides()
|
37
|
+
.find(({ component }) => component === widget);
|
38
|
+
|
39
|
+
warn(
|
40
|
+
`Widget override "${widget}" is not registered. Please register it by calling \`calumaOptions.registerComponentOverride\``,
|
41
|
+
override,
|
42
|
+
{ id: "ember-caluma.unregistered-override" }
|
43
|
+
);
|
44
|
+
|
45
|
+
if (override) return widget;
|
46
|
+
}
|
47
|
+
|
48
|
+
return defaultWidget;
|
49
|
+
}
|
50
|
+
}
|