@projectcaluma/ember-form 11.0.0-beta.10 → 11.0.0-beta.13
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.
- package/CHANGELOG.md +35 -0
- package/addon/components/cf-content.hbs +2 -0
- package/addon/components/cf-field/input/action-button.hbs +0 -1
- package/addon/components/cf-field/input/action-button.js +0 -6
- package/addon/components/cf-field/input/date.hbs +2 -0
- package/addon/components/cf-field/input/date.js +14 -2
- package/addon/components/cf-field.hbs +4 -1
- package/addon/components/cf-field.js +4 -5
- package/addon/components/cf-form-wrapper.hbs +3 -1
- package/addon/helpers/get-widget.js +16 -2
- package/addon/instance-initializers/form-widget-overrides.js +52 -0
- package/addon/lib/field.js +1 -11
- package/addon/lib/navigation.js +3 -1
- package/addon/lib/question.js +12 -4
- package/addon/modifiers/autoresize.js +16 -0
- package/app/instance-initializers/form-widget-overrides.js +4 -0
- package/app/modifiers/autoresize.js +1 -0
- package/package.json +12 -11
- package/translations/de.yaml +1 -1
- package/translations/en.yaml +1 -1
- package/translations/fr.yaml +1 -1
package/CHANGELOG.md
CHANGED
@@ -1,3 +1,38 @@
|
|
1
|
+
# [@projectcaluma/ember-form-v11.0.0-beta.13](https://github.com/projectcaluma/ember-caluma/compare/@projectcaluma/ember-form-v11.0.0-beta.12...@projectcaluma/ember-form-v11.0.0-beta.13) (2022-03-11)
|
2
|
+
|
3
|
+
|
4
|
+
### Bug Fixes
|
5
|
+
|
6
|
+
* **form:** don't refetch dynamic options on validation ([27061c6](https://github.com/projectcaluma/ember-caluma/commit/27061c67f0562508f558305247cb51d615fa36b0))
|
7
|
+
* **form:** fix input in date fields ([cf54bf5](https://github.com/projectcaluma/ember-caluma/commit/cf54bf5542e35fd7dbe293a9e22288afae6a517a))
|
8
|
+
* **navigation:** exclude static questions from visible fields ([6ebd085](https://github.com/projectcaluma/ember-caluma/commit/6ebd085098df71fab693dec5282ea4b81d5b9836))
|
9
|
+
* **workflow:** return case status on complete / skip work-item mutation ([524453c](https://github.com/projectcaluma/ember-caluma/commit/524453c1189b4375ca792fca7d35056b916696f8))
|
10
|
+
|
11
|
+
|
12
|
+
### Features
|
13
|
+
|
14
|
+
* **form:** support passing component override classes ([9409c7c](https://github.com/projectcaluma/ember-caluma/commit/9409c7cb5901dcdffec1c0294046da64b74b9922))
|
15
|
+
|
16
|
+
# [@projectcaluma/ember-form-v11.0.0-beta.12](https://github.com/projectcaluma/ember-caluma/compare/@projectcaluma/ember-form-v11.0.0-beta.11...@projectcaluma/ember-form-v11.0.0-beta.12) (2022-02-23)
|
17
|
+
|
18
|
+
|
19
|
+
### Bug Fixes
|
20
|
+
|
21
|
+
* **form:** fix textarea size in tables ([efba737](https://github.com/projectcaluma/ember-caluma/commit/efba737f0a6314225a851ee0c57c2c506403bc06))
|
22
|
+
|
23
|
+
# [@projectcaluma/ember-form-v11.0.0-beta.11](https://github.com/projectcaluma/ember-caluma/compare/@projectcaluma/ember-form-v11.0.0-beta.10...@projectcaluma/ember-form-v11.0.0-beta.11) (2022-02-16)
|
24
|
+
|
25
|
+
|
26
|
+
### Bug Fixes
|
27
|
+
|
28
|
+
* **form:** always use monday as first day of the week in datepicker ([7008a90](https://github.com/projectcaluma/ember-caluma/commit/7008a90d737d2dca714f4799f846f4c4086ecd4d))
|
29
|
+
* **form:** use action button type "button" ([3e9795f](https://github.com/projectcaluma/ember-caluma/commit/3e9795f28b73dcf376ec9ecabcd4c1b6a8085beb))
|
30
|
+
|
31
|
+
|
32
|
+
### Features
|
33
|
+
|
34
|
+
* **form:** add notfound named block in cf-content if no document found ([f1861c1](https://github.com/projectcaluma/ember-caluma/commit/f1861c1f3b2da9843771aa1b12956190c98799a6))
|
35
|
+
|
1
36
|
# [@projectcaluma/ember-form-v11.0.0-beta.10](https://github.com/projectcaluma/ember-caluma/compare/@projectcaluma/ember-form-v11.0.0-beta.9...@projectcaluma/ember-form-v11.0.0-beta.10) (2022-02-09)
|
2
37
|
|
3
38
|
|
@@ -38,12 +38,6 @@ export default class CfFieldInputActionButtonComponent extends Component {
|
|
38
38
|
return this.args.field.question.raw.color.toLowerCase();
|
39
39
|
}
|
40
40
|
|
41
|
-
get type() {
|
42
|
-
return this.args.field.question.raw.action === "COMPLETE"
|
43
|
-
? "submit"
|
44
|
-
: "button";
|
45
|
-
}
|
46
|
-
|
47
41
|
get validateOnEnter() {
|
48
42
|
return (
|
49
43
|
this.args.field.question.raw.action === "COMPLETE" &&
|
@@ -4,6 +4,9 @@ import Component from "@glimmer/component";
|
|
4
4
|
import { DateTime, Info } from "luxon";
|
5
5
|
import { cached } from "tracked-toolbox";
|
6
6
|
|
7
|
+
// put the last element to the front of the array
|
8
|
+
const shift = (array) => [...array.slice(-1), ...array.slice(0, -1)];
|
9
|
+
|
7
10
|
export default class CfFieldInputDateComponent extends Component {
|
8
11
|
@service intl;
|
9
12
|
|
@@ -13,6 +16,15 @@ export default class CfFieldInputDateComponent extends Component {
|
|
13
16
|
this.args.onSave(date ? DateTime.fromJSDate(date).toISODate() : null);
|
14
17
|
}
|
15
18
|
|
19
|
+
@action
|
20
|
+
parseDate(value) {
|
21
|
+
const date = DateTime.fromFormat(value, "D", {
|
22
|
+
locale: this.intl.primaryLocale,
|
23
|
+
});
|
24
|
+
|
25
|
+
return date.isValid ? date.toJSDate() : null;
|
26
|
+
}
|
27
|
+
|
16
28
|
@action
|
17
29
|
formatDate(date) {
|
18
30
|
return this.intl.formatDate(date, {
|
@@ -30,8 +42,8 @@ export default class CfFieldInputDateComponent extends Component {
|
|
30
42
|
previousMonth: this.intl.t("caluma.form.pikaday.month-previous"),
|
31
43
|
nextMonth: this.intl.t("caluma.form.pikaday.month-next"),
|
32
44
|
months: Info.months("long", { locale }),
|
33
|
-
weekdays: Info.weekdays("long", { locale }),
|
34
|
-
weekdaysShort: Info.weekdays("short", { locale }),
|
45
|
+
weekdays: shift(Info.weekdays("long", { locale })),
|
46
|
+
weekdaysShort: shift(Info.weekdays("short", { locale })),
|
35
47
|
};
|
36
48
|
}
|
37
49
|
}
|
@@ -14,7 +14,10 @@
|
|
14
14
|
|
15
15
|
<div class="uk-flex">
|
16
16
|
<div class="uk-width-expand">
|
17
|
-
{{#let
|
17
|
+
{{#let
|
18
|
+
(component (ensure-safe-component (get-widget @field.question)))
|
19
|
+
as |FieldComponent|
|
20
|
+
}}
|
18
21
|
<FieldComponent
|
19
22
|
@field={{@field}}
|
20
23
|
@disabled={{@disabled}}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import { getOwner } from "@ember/application";
|
2
1
|
import { action } from "@ember/object";
|
2
|
+
import { macroCondition, isTesting } from "@embroider/macros";
|
3
3
|
import Component from "@glimmer/component";
|
4
4
|
import { timeout, restartableTask } from "ember-concurrency";
|
5
5
|
|
@@ -60,11 +60,10 @@ export default class CfFieldComponent extends Component {
|
|
60
60
|
*/
|
61
61
|
@restartableTask
|
62
62
|
*save(value) {
|
63
|
-
const { environment } =
|
64
|
-
getOwner(this).resolveRegistration("config:environment");
|
65
|
-
|
66
63
|
/* istanbul ignore next */
|
67
|
-
if (
|
64
|
+
if (macroCondition(isTesting())) {
|
65
|
+
// no timeout
|
66
|
+
} else {
|
68
67
|
yield timeout(500);
|
69
68
|
}
|
70
69
|
|
@@ -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)
|
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
|
+
};
|
package/addon/lib/field.js
CHANGED
@@ -83,18 +83,12 @@ export default class Field extends Base {
|
|
83
83
|
_createQuestion() {
|
84
84
|
const owner = getOwner(this);
|
85
85
|
|
86
|
-
|
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() {
|
@@ -783,8 +777,6 @@ export default class Field extends Base {
|
|
783
777
|
* @private
|
784
778
|
*/
|
785
779
|
async _validateDynamicChoiceQuestion() {
|
786
|
-
await this.question.loadDynamicOptions.perform();
|
787
|
-
|
788
780
|
return validate("inclusion", this.answer.value, {
|
789
781
|
in: (this.options || []).map(({ slug }) => slug),
|
790
782
|
});
|
@@ -805,8 +797,6 @@ export default class Field extends Base {
|
|
805
797
|
return true;
|
806
798
|
}
|
807
799
|
|
808
|
-
await this.question.loadDynamicOptions.perform();
|
809
|
-
|
810
800
|
return value.map((value) => {
|
811
801
|
return validate("inclusion", value, {
|
812
802
|
in: (this.options || []).map(({ slug }) => slug),
|
package/addon/lib/navigation.js
CHANGED
@@ -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) =>
|
235
|
+
(f) =>
|
236
|
+
!["FormQuestion", "StaticQuestion"].includes(f.questionType) &&
|
237
|
+
!f.hidden
|
236
238
|
);
|
237
239
|
}
|
238
240
|
|
package/addon/lib/question.js
CHANGED
@@ -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
|
4
|
+
import { dropTask } from "ember-concurrency";
|
5
|
+
import { useTask } from "ember-resources";
|
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
|
-
|
80
|
-
|
80
|
+
dynamicOptions = useTask(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/modifiers/autoresize";
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@projectcaluma/ember-form",
|
3
|
-
"version": "11.0.0-beta.
|
3
|
+
"version": "11.0.0-beta.13",
|
4
4
|
"description": "Ember addon for rendering Caluma forms.",
|
5
5
|
"keywords": [
|
6
6
|
"ember-addon"
|
@@ -14,9 +14,10 @@
|
|
14
14
|
"test:ember-compatibility": "ember try:each"
|
15
15
|
},
|
16
16
|
"dependencies": {
|
17
|
+
"@embroider/macros": "^1.5.0",
|
17
18
|
"@glimmer/component": "^1.0.4",
|
18
19
|
"@glimmer/tracking": "^1.0.4",
|
19
|
-
"@projectcaluma/ember-core": "^11.0.0-beta.
|
20
|
+
"@projectcaluma/ember-core": "^11.0.0-beta.5",
|
20
21
|
"ember-apollo-client": "^3.2.0",
|
21
22
|
"ember-auto-import": "^2.4.0",
|
22
23
|
"ember-autoresize-modifier": "^0.5.0",
|
@@ -30,29 +31,29 @@
|
|
30
31
|
"ember-intl": "^5.7.2",
|
31
32
|
"ember-math-helpers": "^2.18.1",
|
32
33
|
"ember-pikaday": "^4.0.0",
|
33
|
-
"ember-power-select": "^5.0.
|
34
|
-
"ember-resources": "^4.
|
34
|
+
"ember-power-select": "^5.0.4",
|
35
|
+
"ember-resources": "^4.4.0",
|
35
36
|
"ember-uikit": "^5.0.0",
|
36
37
|
"ember-validators": "^4.1.2",
|
37
38
|
"graphql": "^15.8.0",
|
38
39
|
"jexl": "^2.3.0",
|
39
40
|
"lodash.isequal": "^4.5.0",
|
40
|
-
"luxon": "^2.3.
|
41
|
+
"luxon": "^2.3.1",
|
41
42
|
"tracked-toolbox": "^1.2.3"
|
42
43
|
},
|
43
44
|
"devDependencies": {
|
44
45
|
"@ember/optional-features": "2.0.0",
|
45
46
|
"@ember/test-helpers": "2.6.0",
|
46
|
-
"@embroider/test-setup": "1.
|
47
|
-
"@faker-js/faker": "6.0.0-
|
48
|
-
"@projectcaluma/ember-testing": "11.0.0-beta.
|
47
|
+
"@embroider/test-setup": "1.5.0",
|
48
|
+
"@faker-js/faker": "6.0.0-beta.0",
|
49
|
+
"@projectcaluma/ember-testing": "11.0.0-beta.4",
|
49
50
|
"@projectcaluma/ember-workflow": "11.0.0-beta.4",
|
50
51
|
"broccoli-asset-rev": "3.0.0",
|
51
52
|
"ember-cli": "3.28.5",
|
52
53
|
"ember-cli-code-coverage": "1.0.3",
|
53
54
|
"ember-cli-dependency-checker": "3.2.0",
|
54
55
|
"ember-cli-inject-live-reload": "2.1.0",
|
55
|
-
"ember-cli-mirage": "
|
56
|
+
"ember-cli-mirage": "3.0.0-alpha.2",
|
56
57
|
"ember-cli-sri": "2.1.1",
|
57
58
|
"ember-cli-terser": "4.0.2",
|
58
59
|
"ember-disable-prototype-extensions": "1.1.3",
|
@@ -67,10 +68,10 @@
|
|
67
68
|
"loader.js": "4.7.0",
|
68
69
|
"miragejs": "0.1.43",
|
69
70
|
"npm-run-all": "4.1.5",
|
70
|
-
"qunit": "2.
|
71
|
+
"qunit": "2.18.0",
|
71
72
|
"qunit-dom": "2.0.0",
|
72
73
|
"uuid": "8.3.2",
|
73
|
-
"webpack": "5.
|
74
|
+
"webpack": "5.70.0"
|
74
75
|
},
|
75
76
|
"engines": {
|
76
77
|
"node": "12.* || 14.* || >= 16"
|
package/translations/de.yaml
CHANGED
@@ -34,7 +34,6 @@ caluma:
|
|
34
34
|
options-empty: "Keine Optionen vorhanden"
|
35
35
|
search-placeholder: "Hier tippen um zu suchen"
|
36
36
|
search-empty: "Keine Optionen gefunden"
|
37
|
-
null: "Keine Auswahl"
|
38
37
|
|
39
38
|
validation:
|
40
39
|
blank: "Dieses Feld darf nicht leer gelassen werden"
|
@@ -44,6 +43,7 @@ caluma:
|
|
44
43
|
lessThanOrEqualTo: "Die Eingabe in diesem Feld darf nicht grösser als {lte} sein"
|
45
44
|
notAnInteger: "Bitte geben Sie eine ganze Zahl ein"
|
46
45
|
inclusion: "'{value}' ist kein gültiger Wert für dieses Feld"
|
46
|
+
deleteFailed: "Beim Löschen ist ein Fehler aufgetreten."
|
47
47
|
uploadFailed: "Beim Hochladen ist ein Fehler aufgetreten."
|
48
48
|
format: "{errorMsg}"
|
49
49
|
table: "Mindestens eine Zeile der Tabelle wurde nicht korrekt ausgefüllt"
|
package/translations/en.yaml
CHANGED
@@ -34,7 +34,6 @@ caluma:
|
|
34
34
|
options-empty: "No options available"
|
35
35
|
search-placeholder: "Type here to search options"
|
36
36
|
search-empty: "Search didn't match any options"
|
37
|
-
null: "No selection"
|
38
37
|
|
39
38
|
validation:
|
40
39
|
blank: "This field can't be blank"
|
@@ -44,6 +43,7 @@ caluma:
|
|
44
43
|
lessThanOrEqualTo: "The value of this field must be less than or equal to {lte}"
|
45
44
|
notAnInteger: "The value of this field must be an integer"
|
46
45
|
inclusion: "'{value}' is not a valid value for this field"
|
46
|
+
deleteFailed: "An error occured during deletion."
|
47
47
|
uploadFailed: "An error occured during upload."
|
48
48
|
format: "{errorMsg}"
|
49
49
|
table: "At least one row of the table was not filled in correctly"
|
package/translations/fr.yaml
CHANGED
@@ -34,7 +34,6 @@ caluma:
|
|
34
34
|
options-empty: "Pas d'options disponibles"
|
35
35
|
search-placeholder: "Tapez ici pour rechercher"
|
36
36
|
search-empty: "Pas d'options trouvées"
|
37
|
-
null: "Aucune sélection"
|
38
37
|
|
39
38
|
validation:
|
40
39
|
blank: "Ce champ ne doit pas être laissé vide"
|
@@ -44,6 +43,7 @@ caluma:
|
|
44
43
|
lessThanOrEqualTo: "L'entrée dans ce champ ne doit pas être supérieure à {lte} "
|
45
44
|
notAnInteger: "Veuillez entrer un nombre entier"
|
46
45
|
inclusion: "'{value}' n'est pas une valeur valide pour ce champ"
|
46
|
+
deleteFailed: "Une erreur est survenue lors de la suppression."
|
47
47
|
uploadFailed: "Une erreur s'est produite pendant le téléchargement."
|
48
48
|
format: "{errorMsg}"
|
49
49
|
table: "Au moins une ligne du tableau n'a pas été remplie correctement"
|