@projectcaluma/ember-form 11.0.0-beta.8 → 11.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. package/CHANGELOG.md +162 -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/table.hbs +3 -2
  16. package/addon/components/cf-field/input/table.js +1 -11
  17. package/addon/components/cf-field/input.hbs +8 -21
  18. package/addon/components/cf-field/input.js +32 -14
  19. package/addon/components/cf-field/label.hbs +4 -2
  20. package/addon/components/cf-field-value.hbs +24 -7
  21. package/addon/components/cf-field-value.js +12 -36
  22. package/addon/components/cf-field.hbs +35 -6
  23. package/addon/components/cf-field.js +25 -20
  24. package/addon/components/cf-form-wrapper.hbs +4 -1
  25. package/addon/components/cf-form.hbs +6 -1
  26. package/addon/gql/fragments/field.graphql +14 -7
  27. package/addon/gql/mutations/save-document-files-answer.graphql +9 -0
  28. package/addon/gql/queries/document-forms.graphql +1 -1
  29. package/addon/gql/queries/dynamic-options.graphql +4 -4
  30. package/addon/gql/queries/{fileanswer-info.graphql → filesanswer-info.graphql} +4 -4
  31. package/addon/helpers/format-graphql-error.js +21 -0
  32. package/addon/helpers/get-widget.js +16 -2
  33. package/addon/instance-initializers/form-widget-overrides.js +52 -0
  34. package/addon/lib/document.js +9 -1
  35. package/addon/lib/field.js +49 -46
  36. package/addon/lib/navigation.js +3 -1
  37. package/addon/lib/question.js +18 -5
  38. package/addon/modifiers/autoresize.js +14 -0
  39. package/addon/services/caluma-store.js +2 -0
  40. package/app/components/cf-field/{input/file.js → hint.js} +1 -1
  41. package/app/components/cf-field/input/files.js +1 -0
  42. package/app/helpers/format-graphql-error.js +1 -0
  43. package/app/helpers/get-widget.js +1 -4
  44. package/app/instance-initializers/form-widget-overrides.js +4 -0
  45. package/app/modifiers/autoresize.js +1 -0
  46. package/app/styles/@projectcaluma/ember-form.scss +5 -15
  47. package/app/styles/_flatpickr.scss +47 -0
  48. package/blueprints/@projectcaluma/ember-form/index.js +1 -1
  49. package/index.js +12 -0
  50. package/package.json +49 -40
  51. package/translations/de.yaml +6 -6
  52. package/translations/en.yaml +6 -6
  53. package/translations/fr.yaml +6 -6
  54. package/addon/components/cf-field/input/file.hbs +0 -32
  55. package/addon/components/cf-field/input/file.js +0 -89
  56. package/addon/components/cf-field/label.js +0 -11
  57. package/addon/gql/mutations/remove-answer.graphql +0 -7
  58. package/addon/gql/mutations/save-document-file-answer.graphql +0 -9
  59. package/addon/instance-initializers/setup-pikaday-i18n.js +0 -35
  60. package/config/environment.js +0 -5
@@ -1,8 +1,3 @@
1
- # We can not symlink this file so an exact copy exists in another package:
2
- # packages/form-builder/addon/gql/fragments/field.graphql
3
- #
4
- # When changing this file the other must also receive the same changes.
5
-
6
1
  fragment SimpleQuestion on Question {
7
2
  id
8
3
  slug
@@ -28,6 +23,7 @@ fragment SimpleQuestion on Question {
28
23
  }
29
24
  }
30
25
  }
26
+ hintText
31
27
  }
32
28
  ... on TextareaQuestion {
33
29
  textareaMinLength: minLength
@@ -46,6 +42,7 @@ fragment SimpleQuestion on Question {
46
42
  }
47
43
  }
48
44
  }
45
+ hintText
49
46
  }
50
47
  ... on IntegerQuestion {
51
48
  integerMinValue: minValue
@@ -55,6 +52,7 @@ fragment SimpleQuestion on Question {
55
52
  value
56
53
  }
57
54
  placeholder
55
+ hintText
58
56
  }
59
57
  ... on FloatQuestion {
60
58
  floatMinValue: minValue
@@ -64,6 +62,7 @@ fragment SimpleQuestion on Question {
64
62
  value
65
63
  }
66
64
  placeholder
65
+ hintText
67
66
  }
68
67
  ... on ChoiceQuestion {
69
68
  choiceOptions: options {
@@ -80,6 +79,7 @@ fragment SimpleQuestion on Question {
80
79
  id
81
80
  value
82
81
  }
82
+ hintText
83
83
  }
84
84
  ... on MultipleChoiceQuestion {
85
85
  multipleChoiceOptions: options {
@@ -96,18 +96,24 @@ fragment SimpleQuestion on Question {
96
96
  id
97
97
  value
98
98
  }
99
+ hintText
99
100
  }
100
101
  ... on DateQuestion {
101
102
  dateDefaultAnswer: defaultAnswer {
102
103
  id
103
104
  value
104
105
  }
106
+ hintText
105
107
  }
106
108
  ... on StaticQuestion {
107
109
  staticContent
108
110
  }
109
111
  ... on CalculatedFloatQuestion {
110
112
  calcExpression
113
+ hintText
114
+ }
115
+ ... on FilesQuestion {
116
+ hintText
111
117
  }
112
118
  ... on ActionButtonQuestion {
113
119
  action
@@ -130,6 +136,7 @@ fragment FieldTableQuestion on Question {
130
136
  }
131
137
  }
132
138
  }
139
+ hintText
133
140
  tableDefaultAnswer: defaultAnswer {
134
141
  id
135
142
  value {
@@ -222,8 +229,8 @@ fragment SimpleAnswer on Answer {
222
229
  ... on ListAnswer {
223
230
  listValue: value
224
231
  }
225
- ... on FileAnswer {
226
- fileValue: value {
232
+ ... on FilesAnswer {
233
+ filesValue: value {
227
234
  id
228
235
  uploadUrl
229
236
  downloadUrl
@@ -0,0 +1,9 @@
1
+ #import * from '../fragments/field.graphql'
2
+
3
+ mutation SaveDocumentFilesAnswer($input: SaveDocumentFilesAnswerInput!) {
4
+ saveDocumentFilesAnswer(input: $input) {
5
+ answer {
6
+ ...FieldAnswer
7
+ }
8
+ }
9
+ }
@@ -1,7 +1,7 @@
1
1
  #import FieldQuestion, FieldTableQuestion, SimpleQuestion from '../fragments/field.graphql'
2
2
 
3
3
  query DocumentForms($slug: String!) {
4
- allForms(filter: [{ slug: $slug }]) {
4
+ allForms(filter: [{ slugs: [$slug] }]) {
5
5
  edges {
6
6
  node {
7
7
  id
@@ -1,11 +1,11 @@
1
- query DynamicOptions($question: String!) {
2
- allQuestions(filter: [{ slug: $question }], first: 1) {
1
+ query DynamicOptions($question: String!, $context: JSONString) {
2
+ allQuestions(filter: [{ slugs: [$question] }], first: 1) {
3
3
  edges {
4
4
  node {
5
5
  id
6
6
  slug
7
7
  ... on DynamicChoiceQuestion {
8
- dynamicChoiceOptions: options {
8
+ dynamicChoiceOptions: options(context: $context) {
9
9
  edges {
10
10
  node {
11
11
  slug
@@ -15,7 +15,7 @@ query DynamicOptions($question: String!) {
15
15
  }
16
16
  }
17
17
  ... on DynamicMultipleChoiceQuestion {
18
- dynamicMultipleChoiceOptions: options {
18
+ dynamicMultipleChoiceOptions: options(context: $context) {
19
19
  edges {
20
20
  node {
21
21
  slug
@@ -1,8 +1,8 @@
1
- query FileAnswerInfo($id: ID!) {
1
+ query FilesAnswerInfo($id: ID!) {
2
2
  node(id: $id) {
3
- id
4
- ... on FileAnswer {
5
- fileValue: value {
3
+ ... on FilesAnswer {
4
+ id
5
+ value {
6
6
  id
7
7
  uploadUrl
8
8
  downloadUrl
@@ -0,0 +1,21 @@
1
+ import { helper } from "@ember/component/helper";
2
+
3
+ export function formatGraphqlErrorObject(error) {
4
+ try {
5
+ const path = error.path.join(".");
6
+ const { line, column } = error.locations[error.locations.length - 1];
7
+
8
+ return `${path}:${line}:${column}: ${error.message}`;
9
+ } catch (e) {
10
+ return null;
11
+ }
12
+ }
13
+
14
+ export function formatGraphqlError(error) {
15
+ return (
16
+ error?.errors?.map(formatGraphqlErrorObject).filter(Boolean).join("\n") ??
17
+ ""
18
+ );
19
+ }
20
+
21
+ export default helper(([error]) => formatGraphqlError(error));
@@ -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) return widget;
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
+ };
@@ -18,7 +18,7 @@ const sum = (nums) => nums.reduce((num, base) => base + num, 0);
18
18
  * @class Document
19
19
  */
20
20
  export default class Document extends Base {
21
- constructor({ raw, parentDocument, ...args }) {
21
+ constructor({ raw, parentDocument, dataSourceContext, ...args }) {
22
22
  assert(
23
23
  "A graphql document `raw` must be passed",
24
24
  raw?.__typename === "Document"
@@ -27,6 +27,7 @@ export default class Document extends Base {
27
27
  super({ raw, ...args });
28
28
 
29
29
  this.parentDocument = parentDocument;
30
+ this.dataSourceContext = dataSourceContext;
30
31
 
31
32
  this.pushIntoStore();
32
33
 
@@ -83,6 +84,13 @@ export default class Document extends Base {
83
84
  */
84
85
  fieldsets = [];
85
86
 
87
+ /**
88
+ * Context object for data sources
89
+ *
90
+ * @property {Object} dataSourceContext
91
+ */
92
+ dataSourceContext = null;
93
+
86
94
  /**
87
95
  * The primary key of the document.
88
96
  *
@@ -13,7 +13,7 @@ import { cached } from "tracked-toolbox";
13
13
 
14
14
  import { decodeId } from "@projectcaluma/ember-core/helpers/decode-id";
15
15
  import saveDocumentDateAnswerMutation from "@projectcaluma/ember-form/gql/mutations/save-document-date-answer.graphql";
16
- 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";
17
17
  import saveDocumentFloatAnswerMutation from "@projectcaluma/ember-form/gql/mutations/save-document-float-answer.graphql";
18
18
  import saveDocumentIntegerAnswerMutation from "@projectcaluma/ember-form/gql/mutations/save-document-integer-answer.graphql";
19
19
  import saveDocumentListAnswerMutation from "@projectcaluma/ember-form/gql/mutations/save-document-list-answer.graphql";
@@ -34,7 +34,7 @@ export const TYPE_MAP = {
34
34
  DynamicChoiceQuestion: "StringAnswer",
35
35
  TableQuestion: "TableAnswer",
36
36
  FormQuestion: null,
37
- FileQuestion: "FileAnswer",
37
+ FilesQuestion: "FilesAnswer",
38
38
  StaticQuestion: null,
39
39
  DateQuestion: "DateAnswer",
40
40
  };
@@ -44,7 +44,7 @@ const MUTATION_MAP = {
44
44
  IntegerAnswer: saveDocumentIntegerAnswerMutation,
45
45
  StringAnswer: saveDocumentStringAnswerMutation,
46
46
  ListAnswer: saveDocumentListAnswerMutation,
47
- FileAnswer: saveDocumentFileAnswerMutation,
47
+ FilesAnswer: saveDocumentFilesAnswerMutation,
48
48
  DateAnswer: saveDocumentDateAnswerMutation,
49
49
  TableAnswer: saveDocumentTableAnswerMutation,
50
50
  };
@@ -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() {
@@ -551,18 +547,24 @@ export default class Field extends Base {
551
547
 
552
548
  const type = this.answer.raw.__typename;
553
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
+
554
564
  const response = yield this.apollo.mutate(
555
565
  {
556
566
  mutation: MUTATION_MAP[type],
557
- variables: {
558
- input: {
559
- question: this.question.slug,
560
- document: this.document.uuid,
561
- ...(this.answer.serializedValue !== null
562
- ? { value: this.answer.serializedValue }
563
- : {}),
564
- },
565
- },
567
+ variables: { input },
566
568
  },
567
569
  `saveDocument${type}.answer`
568
570
  );
@@ -588,10 +590,10 @@ export default class Field extends Base {
588
590
  @cached
589
591
  get errors() {
590
592
  return this._errors.map(({ type, context, value }) => {
591
- return this.intl.t(
592
- `caluma.form.validation.${type}`,
593
- Object.assign({}, context, { value })
594
- );
593
+ return this.intl.t(`caluma.form.validation.${type}`, {
594
+ ...context,
595
+ value,
596
+ });
595
597
  });
596
598
  }
597
599
 
@@ -748,10 +750,7 @@ export default class Field extends Base {
748
750
  * @private
749
751
  */
750
752
  _validateChoiceQuestion() {
751
- return validate("inclusion", this.answer.value, {
752
- allowBlank: true,
753
- in: (this.options || []).map(({ slug }) => slug),
754
- });
753
+ return this._validateOption(this.answer.value, true);
755
754
  }
756
755
 
757
756
  /**
@@ -763,15 +762,9 @@ export default class Field extends Base {
763
762
  * @private
764
763
  */
765
764
  _validateMultipleChoiceQuestion() {
766
- const value = this.answer.value;
767
- if (!value) {
768
- return true;
769
- }
770
- return value.map((value) =>
771
- validate("inclusion", value, {
772
- in: (this.options || []).map(({ slug }) => slug),
773
- })
774
- );
765
+ return this.answer.value
766
+ ? this.answer.value.map((value) => this._validateOption(value))
767
+ : true;
775
768
  }
776
769
 
777
770
  /**
@@ -783,11 +776,9 @@ export default class Field extends Base {
783
776
  * @private
784
777
  */
785
778
  async _validateDynamicChoiceQuestion() {
786
- await this.question.loadDynamicOptions.perform();
779
+ await this.question.dynamicOptions;
787
780
 
788
- return validate("inclusion", this.answer.value, {
789
- in: (this.options || []).map(({ slug }) => slug),
790
- });
781
+ return this._validateOption(this.answer.value, true);
791
782
  }
792
783
 
793
784
  /**
@@ -805,23 +796,35 @@ export default class Field extends Base {
805
796
  return true;
806
797
  }
807
798
 
808
- await this.question.loadDynamicOptions.perform();
799
+ await this.question.dynamicOptions;
809
800
 
810
- return value.map((value) => {
811
- return validate("inclusion", value, {
812
- in: (this.options || []).map(({ slug }) => slug),
813
- });
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,
814
817
  });
815
818
  }
816
819
 
817
820
  /**
818
821
  * Dummy method for the validation of file uploads.
819
822
  *
820
- * @method _validateFileQuestion
823
+ * @method _validateFilesQuestion
821
824
  * @return {Boolean} Always returns true
822
825
  * @private
823
826
  */
824
- _validateFileQuestion() {
827
+ _validateFilesQuestion() {
825
828
  return true;
826
829
  }
827
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
  };