cx 25.5.2 → 25.6.1

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 (116) hide show
  1. package/dist/charts.js +40 -21
  2. package/dist/manifest.js +686 -686
  3. package/dist/widgets.js +30 -24
  4. package/package.json +2 -2
  5. package/src/charts/Legend.d.ts +45 -45
  6. package/src/charts/LegendEntry.js +128 -128
  7. package/src/charts/LegendEntry.scss +27 -27
  8. package/src/charts/LineGraph.js +1 -1
  9. package/src/charts/PieChart.d.ts +92 -92
  10. package/src/charts/RangeMarker.js +159 -159
  11. package/src/charts/axis/Axis.d.ts +113 -113
  12. package/src/charts/axis/Axis.js +280 -280
  13. package/src/charts/axis/CategoryAxis.d.ts +30 -30
  14. package/src/charts/axis/CategoryAxis.js +241 -241
  15. package/src/charts/axis/NumericAxis.d.ts +46 -46
  16. package/src/charts/axis/NumericAxis.js +351 -351
  17. package/src/charts/axis/Stack.js +55 -55
  18. package/src/charts/axis/TimeAxis.js +611 -611
  19. package/src/charts/helpers/PointReducer.d.ts +9 -0
  20. package/src/charts/helpers/PointReducer.js +36 -22
  21. package/src/charts/helpers/SnapPointFinder.js +69 -69
  22. package/src/data/Binding.spec.js +69 -69
  23. package/src/data/Expression.js +229 -229
  24. package/src/data/Expression.spec.js +229 -229
  25. package/src/data/Ref.d.ts +24 -24
  26. package/src/data/Ref.spec.js +79 -79
  27. package/src/data/StoreRef.spec.js +24 -24
  28. package/src/data/StringTemplate.js +92 -92
  29. package/src/data/StringTemplate.spec.js +132 -132
  30. package/src/data/StructuredDataAccessor.d.ts +7 -7
  31. package/src/data/StructuredSelector.js +132 -132
  32. package/src/data/SubscribableView.js +54 -54
  33. package/src/data/getAccessor.spec.js +11 -11
  34. package/src/data/getSelector.js +49 -49
  35. package/src/hooks/createLocalStorageRef.d.ts +3 -3
  36. package/src/hooks/createLocalStorageRef.js +20 -20
  37. package/src/index.scss +6 -6
  38. package/src/ui/Culture.d.ts +57 -57
  39. package/src/ui/Culture.js +139 -139
  40. package/src/ui/FocusManager.js +171 -171
  41. package/src/ui/Format.js +108 -108
  42. package/src/ui/HoverSync.js +147 -147
  43. package/src/ui/Repeater.d.ts +61 -61
  44. package/src/ui/createFunctionalComponent.d.ts +1 -1
  45. package/src/ui/layout/ContentPlaceholder.d.ts +19 -19
  46. package/src/ui/layout/ContentPlaceholder.js +105 -105
  47. package/src/ui/layout/ContentPlaceholder.spec.js +579 -579
  48. package/src/ui/layout/LabelsTopLayout.js +134 -134
  49. package/src/util/Format.js +270 -270
  50. package/src/util/date/encodeDate.d.ts +1 -1
  51. package/src/util/date/encodeDate.js +8 -8
  52. package/src/util/date/encodeDateWithTimezoneOffset.d.ts +1 -1
  53. package/src/util/date/index.d.ts +11 -11
  54. package/src/util/date/index.js +11 -11
  55. package/src/util/date/parseDateInvariant.d.ts +3 -3
  56. package/src/util/date/parseDateInvariant.js +20 -20
  57. package/src/util/debounce.js +18 -18
  58. package/src/util/getSearchQueryPredicate.js +59 -59
  59. package/src/util/index.d.ts +51 -51
  60. package/src/util/index.js +54 -54
  61. package/src/util/isValidIdentifierName.d.ts +1 -1
  62. package/src/util/isValidIdentifierName.js +5 -5
  63. package/src/util/isValidIdentifierName.spec.js +33 -33
  64. package/src/util/scss/add-rules.scss +38 -38
  65. package/src/util/validatedDebounce.js +19 -19
  66. package/src/widgets/Button.js +118 -118
  67. package/src/widgets/CxCredit.scss +37 -37
  68. package/src/widgets/HighlightedSearchText.js +36 -36
  69. package/src/widgets/HighlightedSearchText.scss +18 -18
  70. package/src/widgets/List.scss +91 -91
  71. package/src/widgets/drag-drop/DropZone.js +214 -214
  72. package/src/widgets/form/Calendar.d.ts +86 -86
  73. package/src/widgets/form/Calendar.js +618 -618
  74. package/src/widgets/form/Calendar.scss +196 -196
  75. package/src/widgets/form/Checkbox.js +203 -203
  76. package/src/widgets/form/Checkbox.scss +127 -127
  77. package/src/widgets/form/ColorField.js +397 -397
  78. package/src/widgets/form/ColorField.scss +96 -96
  79. package/src/widgets/form/ColorPicker.scss +283 -283
  80. package/src/widgets/form/DateTimeField.js +576 -576
  81. package/src/widgets/form/DateTimePicker.js +392 -392
  82. package/src/widgets/form/LookupField.d.ts +179 -179
  83. package/src/widgets/form/LookupField.scss +219 -219
  84. package/src/widgets/form/MonthField.d.ts +5 -0
  85. package/src/widgets/form/MonthField.js +1 -0
  86. package/src/widgets/form/MonthPicker.d.ts +13 -0
  87. package/src/widgets/form/MonthPicker.js +25 -21
  88. package/src/widgets/form/MonthPicker.scss +118 -118
  89. package/src/widgets/form/NumberField.js +459 -459
  90. package/src/widgets/form/NumberField.scss +61 -61
  91. package/src/widgets/form/Radio.scss +121 -121
  92. package/src/widgets/form/Select.scss +99 -99
  93. package/src/widgets/form/Slider.scss +118 -118
  94. package/src/widgets/form/Switch.scss +140 -140
  95. package/src/widgets/form/TextArea.scss +43 -43
  96. package/src/widgets/form/TextField.js +290 -290
  97. package/src/widgets/form/TextField.scss +55 -55
  98. package/src/widgets/form/UploadButton.d.ts +34 -34
  99. package/src/widgets/form/variables.scss +353 -353
  100. package/src/widgets/grid/Grid.d.ts +442 -442
  101. package/src/widgets/grid/GridRow.js +228 -228
  102. package/src/widgets/grid/TreeNode.d.ts +23 -23
  103. package/src/widgets/grid/TreeNode.scss +88 -88
  104. package/src/widgets/grid/variables.scss +133 -133
  105. package/src/widgets/nav/LinkButton.js +128 -128
  106. package/src/widgets/nav/Menu.scss +74 -74
  107. package/src/widgets/overlay/Dropdown.js +612 -612
  108. package/src/widgets/overlay/FlyweightTooltipTracker.js +39 -39
  109. package/src/widgets/overlay/Overlay.d.ts +73 -73
  110. package/src/widgets/overlay/Window.js +202 -202
  111. package/src/widgets/overlay/captureMouse.js +124 -124
  112. package/src/widgets/overlay/createHotPromiseWindowFactory.d.ts +18 -18
  113. package/src/widgets/overlay/createHotPromiseWindowFactory.js +56 -56
  114. package/src/widgets/overlay/index.d.ts +11 -11
  115. package/src/widgets/overlay/index.js +11 -11
  116. package/src/widgets/variables.scss +144 -144
@@ -1,219 +1,219 @@
1
- @mixin cx-lookupfield(
2
- $name: "lookupfield",
3
- $state-style-map: $cx-std-field-state-style-map,
4
- $placeholder: $cx-input-placeholder,
5
- $empty-text: $cx-empty-text,
6
- $left-icon-state-style-map: $cx-input-left-icon-state-style-map,
7
- $clear-state-style-map: $cx-clear-state-style-map,
8
- $tool-state-style-map: $cx-input-right-icon-state-style-map,
9
- $icon-size: $cx-default-input-icon-size,
10
- $width: $cx-default-input-width,
11
- $tag-state-style-map: $cx-input-tag-state-style-map,
12
- $tag-clear-state-style-map: $cx-input-tag-clear-state-style-map,
13
- $besm: $cx-besm
14
- ) {
15
- $block: map-get($besm, block);
16
- $element: map-get($besm, element);
17
- $state: map-get($besm, state);
18
-
19
- $padding: cx-get-state-rule($state-style-map, default, padding);
20
- $border-radius-offset: round(cx-get-state-rule($tag-state-style-map, default, border-radius) * 0.25);
21
-
22
- .#{$block}#{$name} {
23
- cursor: pointer;
24
- width: $width;
25
- font: cx-get-state-rule($state-style-map, default, "font");
26
- font-size: cx-get-state-rule($state-style-map, default, "font-size");
27
-
28
- @include cxb-field($besm, $state-style-map, $input: false);
29
-
30
- &.#{$state}multiple {
31
- min-width: $cx-default-input-width;
32
- width: auto;
33
- }
34
-
35
- &.#{$state}readonly {
36
- pointer-events: none;
37
-
38
- & > .#{$element}#{$name}-input {
39
- padding-right: cx-right($padding);
40
- }
41
- }
42
- }
43
-
44
- .#{$element}#{$name}-input {
45
- @include cxe-field-input(
46
- $besm,
47
- $state-style-map,
48
- $placeholder: $placeholder,
49
- $input: false,
50
- $overrides: (
51
- default: (
52
- height: 100%,
53
- text-overflow: null,
54
- padding: cx-top($padding)
55
- cx-calc(cx-right($padding), $cx-default-clear-size, $cx-default-input-tag-spacing) cx-bottom($padding)
56
- cx-left($padding),
57
- )
58
- )
59
- );
60
-
61
- .#{$state}multiple > & {
62
- padding: 0 cx-calc(cx-right($padding), $cx-default-clear-size, $cx-default-input-tag-spacing)
63
- $cx-default-input-tag-spacing 0;
64
- align-items: center;
65
- flex-wrap: wrap;
66
- display: flex;
67
- }
68
-
69
- .#{$state}single > & {
70
- overflow: hidden;
71
- text-overflow: ellipsis;
72
- white-space: nowrap;
73
- display: block;
74
- flex-basis: 0%;
75
- flex-grow: 1;
76
- }
77
-
78
- .#{$state}icon > & {
79
- padding-left: cx-calc(2 * cx-left($padding), $icon-size);
80
- }
81
- }
82
-
83
- .#{$element}#{$name}-tag {
84
- display: inline-block;
85
- position: relative;
86
- box-sizing: border-box;
87
-
88
- @include cx-add-state-rules($tag-state-style-map, default);
89
-
90
- &:hover {
91
- @include cx-add-state-rules($tag-state-style-map, hover);
92
- }
93
-
94
- &.#{$state}readonly {
95
- padding-right: cx-right($padding);
96
- pointer-events: none;
97
- }
98
- }
99
-
100
- .#{$element}#{$name}-placeholder {
101
- color: $cx-default-input-placeholder-color;
102
-
103
- .#{$block}#{$name}.#{$state}multiple & {
104
- display: inline-block;
105
- margin: $cx-default-input-tag-spacing 0 0 $cx-default-input-tag-spacing;
106
- box-sizing: border-box;
107
- padding: cx-calc(cx-top($cx-default-input-padding), -$cx-default-input-tag-spacing)
108
- cx-calc(cx-right($cx-default-input-padding), -$cx-default-input-tag-spacing)
109
- cx-calc(cx-bottom($cx-default-input-padding), -$cx-default-input-tag-spacing)
110
- cx-calc(cx-left($cx-default-input-padding), -$cx-default-input-tag-spacing);
111
- }
112
- }
113
-
114
- .#{$element}#{$name}-tag-value {
115
- padding: 0 cx-calc($cx-default-input-tag-spacing, $border-radius-offset);
116
- display: inline-block;
117
- }
118
-
119
- .#{$element}#{$name}-tag-clear {
120
- @include cxe-field-button($besm, $tag-clear-state-style-map);
121
- }
122
-
123
- .#{$element}#{$name}-lookup-options {
124
- padding: 0;
125
- margin: 0;
126
- min-width: 100%;
127
- width: 100%;
128
- }
129
-
130
- .#{$element}#{$name}-query {
131
- @include cxe-field-input(
132
- $besm,
133
- $state-style-map,
134
- $placeholder: $placeholder,
135
- $width: calc(100% - 10px),
136
- $overrides: (
137
- default: (
138
- margin: 5px,
139
- flex: 0 0 auto,
140
- height: auto,
141
- )
142
- )
143
- );
144
- //put query field down when placed up
145
- .#{$state}place-up-right &,
146
- .#{$state}place-up &,
147
- .#{$state}place-up-left & {
148
- order: 1;
149
- }
150
- }
151
-
152
- .#{$element}#{$name}-dropdown {
153
- display: flex;
154
- flex-direction: column;
155
- height: 100%;
156
-
157
- &:focus {
158
- outline: none;
159
- }
160
- }
161
-
162
- .#{$element}#{$name}-message {
163
- font-size: smaller;
164
- padding: 10px;
165
- color: gray;
166
- font-style: italic;
167
-
168
- &.#{$state}error {
169
- color: #9e2f2d;
170
- }
171
- }
172
-
173
- .#{$element}#{$name}-scroll-container {
174
- overflow: auto;
175
- flex: 1 1 auto;
176
- }
177
-
178
- .#{$element}#{$name}-clear {
179
- @include cxe-field-button($besm, $clear-state-style-map);
180
-
181
- .#{$state}focus > & {
182
- @include cx-add-state-rules($clear-state-style-map, focus);
183
- }
184
- .#{$state}error > & {
185
- @include cx-add-state-rules($clear-state-style-map, error);
186
- }
187
- }
188
-
189
- .#{$element}#{$name}-tool {
190
- @include cxe-field-button($besm, $tool-state-style-map);
191
-
192
- .#{$state}disabled > & {
193
- border-width: 0;
194
- @include cx-add-state-rules($state-style-map, disabled);
195
- }
196
- .#{$state}focus > & {
197
- @include cx-add-state-rules($tool-state-style-map, focus);
198
- }
199
- .#{$state}error > & {
200
- @include cx-add-state-rules($tool-state-style-map, error);
201
- }
202
- }
203
-
204
- .#{$element}#{$name}-left-icon {
205
- @include cxe-field-button($besm, $left-icon-state-style-map);
206
- }
207
-
208
- .#{$element}#{$name}-icon {
209
- @include cxe-field-button-icon($besm, $icon-size);
210
- }
211
-
212
- .#{$element}#{$name}-empty-text {
213
- @include cxe-field-empty-text($empty-text);
214
- }
215
- }
216
-
217
- @if (cx-should-include("cx/widgets/LookupField")) {
218
- @include cx-lookupfield();
219
- }
1
+ @mixin cx-lookupfield(
2
+ $name: "lookupfield",
3
+ $state-style-map: $cx-std-field-state-style-map,
4
+ $placeholder: $cx-input-placeholder,
5
+ $empty-text: $cx-empty-text,
6
+ $left-icon-state-style-map: $cx-input-left-icon-state-style-map,
7
+ $clear-state-style-map: $cx-clear-state-style-map,
8
+ $tool-state-style-map: $cx-input-right-icon-state-style-map,
9
+ $icon-size: $cx-default-input-icon-size,
10
+ $width: $cx-default-input-width,
11
+ $tag-state-style-map: $cx-input-tag-state-style-map,
12
+ $tag-clear-state-style-map: $cx-input-tag-clear-state-style-map,
13
+ $besm: $cx-besm
14
+ ) {
15
+ $block: map-get($besm, block);
16
+ $element: map-get($besm, element);
17
+ $state: map-get($besm, state);
18
+
19
+ $padding: cx-get-state-rule($state-style-map, default, padding);
20
+ $border-radius-offset: round(cx-get-state-rule($tag-state-style-map, default, border-radius) * 0.25);
21
+
22
+ .#{$block}#{$name} {
23
+ cursor: pointer;
24
+ width: $width;
25
+ font: cx-get-state-rule($state-style-map, default, "font");
26
+ font-size: cx-get-state-rule($state-style-map, default, "font-size");
27
+
28
+ @include cxb-field($besm, $state-style-map, $input: false);
29
+
30
+ &.#{$state}multiple {
31
+ min-width: $cx-default-input-width;
32
+ width: auto;
33
+ }
34
+
35
+ &.#{$state}readonly {
36
+ pointer-events: none;
37
+
38
+ & > .#{$element}#{$name}-input {
39
+ padding-right: cx-right($padding);
40
+ }
41
+ }
42
+ }
43
+
44
+ .#{$element}#{$name}-input {
45
+ @include cxe-field-input(
46
+ $besm,
47
+ $state-style-map,
48
+ $placeholder: $placeholder,
49
+ $input: false,
50
+ $overrides: (
51
+ default: (
52
+ height: 100%,
53
+ text-overflow: null,
54
+ padding: cx-top($padding)
55
+ cx-calc(cx-right($padding), $cx-default-clear-size, $cx-default-input-tag-spacing) cx-bottom($padding)
56
+ cx-left($padding),
57
+ )
58
+ )
59
+ );
60
+
61
+ .#{$state}multiple > & {
62
+ padding: 0 cx-calc(cx-right($padding), $cx-default-clear-size, $cx-default-input-tag-spacing)
63
+ $cx-default-input-tag-spacing 0;
64
+ align-items: center;
65
+ flex-wrap: wrap;
66
+ display: flex;
67
+ }
68
+
69
+ .#{$state}single > & {
70
+ overflow: hidden;
71
+ text-overflow: ellipsis;
72
+ white-space: nowrap;
73
+ display: block;
74
+ flex-basis: 0%;
75
+ flex-grow: 1;
76
+ }
77
+
78
+ .#{$state}icon > & {
79
+ padding-left: cx-calc(2 * cx-left($padding), $icon-size);
80
+ }
81
+ }
82
+
83
+ .#{$element}#{$name}-tag {
84
+ display: inline-block;
85
+ position: relative;
86
+ box-sizing: border-box;
87
+
88
+ @include cx-add-state-rules($tag-state-style-map, default);
89
+
90
+ &:hover {
91
+ @include cx-add-state-rules($tag-state-style-map, hover);
92
+ }
93
+
94
+ &.#{$state}readonly {
95
+ padding-right: cx-right($padding);
96
+ pointer-events: none;
97
+ }
98
+ }
99
+
100
+ .#{$element}#{$name}-placeholder {
101
+ color: $cx-default-input-placeholder-color;
102
+
103
+ .#{$block}#{$name}.#{$state}multiple & {
104
+ display: inline-block;
105
+ margin: $cx-default-input-tag-spacing 0 0 $cx-default-input-tag-spacing;
106
+ box-sizing: border-box;
107
+ padding: cx-calc(cx-top($cx-default-input-padding), -$cx-default-input-tag-spacing)
108
+ cx-calc(cx-right($cx-default-input-padding), -$cx-default-input-tag-spacing)
109
+ cx-calc(cx-bottom($cx-default-input-padding), -$cx-default-input-tag-spacing)
110
+ cx-calc(cx-left($cx-default-input-padding), -$cx-default-input-tag-spacing);
111
+ }
112
+ }
113
+
114
+ .#{$element}#{$name}-tag-value {
115
+ padding: 0 cx-calc($cx-default-input-tag-spacing, $border-radius-offset);
116
+ display: inline-block;
117
+ }
118
+
119
+ .#{$element}#{$name}-tag-clear {
120
+ @include cxe-field-button($besm, $tag-clear-state-style-map);
121
+ }
122
+
123
+ .#{$element}#{$name}-lookup-options {
124
+ padding: 0;
125
+ margin: 0;
126
+ min-width: 100%;
127
+ width: 100%;
128
+ }
129
+
130
+ .#{$element}#{$name}-query {
131
+ @include cxe-field-input(
132
+ $besm,
133
+ $state-style-map,
134
+ $placeholder: $placeholder,
135
+ $width: calc(100% - 10px),
136
+ $overrides: (
137
+ default: (
138
+ margin: 5px,
139
+ flex: 0 0 auto,
140
+ height: auto,
141
+ )
142
+ )
143
+ );
144
+ //put query field down when placed up
145
+ .#{$state}place-up-right &,
146
+ .#{$state}place-up &,
147
+ .#{$state}place-up-left & {
148
+ order: 1;
149
+ }
150
+ }
151
+
152
+ .#{$element}#{$name}-dropdown {
153
+ display: flex;
154
+ flex-direction: column;
155
+ height: 100%;
156
+
157
+ &:focus {
158
+ outline: none;
159
+ }
160
+ }
161
+
162
+ .#{$element}#{$name}-message {
163
+ font-size: smaller;
164
+ padding: 10px;
165
+ color: gray;
166
+ font-style: italic;
167
+
168
+ &.#{$state}error {
169
+ color: #9e2f2d;
170
+ }
171
+ }
172
+
173
+ .#{$element}#{$name}-scroll-container {
174
+ overflow: auto;
175
+ flex: 1 1 auto;
176
+ }
177
+
178
+ .#{$element}#{$name}-clear {
179
+ @include cxe-field-button($besm, $clear-state-style-map);
180
+
181
+ .#{$state}focus > & {
182
+ @include cx-add-state-rules($clear-state-style-map, focus);
183
+ }
184
+ .#{$state}error > & {
185
+ @include cx-add-state-rules($clear-state-style-map, error);
186
+ }
187
+ }
188
+
189
+ .#{$element}#{$name}-tool {
190
+ @include cxe-field-button($besm, $tool-state-style-map);
191
+
192
+ .#{$state}disabled > & {
193
+ border-width: 0;
194
+ @include cx-add-state-rules($state-style-map, disabled);
195
+ }
196
+ .#{$state}focus > & {
197
+ @include cx-add-state-rules($tool-state-style-map, focus);
198
+ }
199
+ .#{$state}error > & {
200
+ @include cx-add-state-rules($tool-state-style-map, error);
201
+ }
202
+ }
203
+
204
+ .#{$element}#{$name}-left-icon {
205
+ @include cxe-field-button($besm, $left-icon-state-style-map);
206
+ }
207
+
208
+ .#{$element}#{$name}-icon {
209
+ @include cxe-field-button-icon($besm, $icon-size);
210
+ }
211
+
212
+ .#{$element}#{$name}-empty-text {
213
+ @include cxe-field-empty-text($empty-text);
214
+ }
215
+ }
216
+
217
+ @if (cx-should-include("cx/widgets/LookupField")) {
218
+ @include cx-lookupfield();
219
+ }
@@ -94,6 +94,11 @@ interface MonthFieldProps extends FieldProps {
94
94
  /** A boolean flag that determines whether the `to` date is included in the range.
95
95
  * When set to true the value stored in the to field would be the last day of the month, i.e. `2024-12-31`. */
96
96
  inclusiveTo?: boolean;
97
+
98
+ /** Optional configuration options for the MonthPicker component rendered within the dropdown.
99
+ * You can pass any valid additional MonthPicker props here, such as `startYear`, `endYear`, etc.
100
+ * Refer to the MonthPicker component documentation for a full list of supported options. */
101
+ monthPickerOptions?: Cx.Config;
97
102
  }
98
103
 
99
104
  export class MonthField extends Cx.Widget<MonthFieldProps> {}
@@ -149,6 +149,7 @@ export class MonthField extends Field {
149
149
  data={instance.data}
150
150
  instance={instance}
151
151
  monthPicker={{
152
+ ...this.monthPickerOptions,
152
153
  value: this.value,
153
154
  from: this.from,
154
155
  to: this.to,
@@ -1,4 +1,5 @@
1
1
  import * as Cx from "../../core";
2
+ import { Instance } from "../../ui";
2
3
  import { FieldProps } from "./Field";
3
4
 
4
5
  interface MonthPickerProps extends FieldProps {
@@ -71,6 +72,18 @@ interface MonthPickerProps extends FieldProps {
71
72
  /** A boolean flag that determines whether the `to` date is included in the range.
72
73
  * When set to true the value stored in the to field would be the last day of the month, i.e. `2024-12-31`. */
73
74
  inclusiveTo?: boolean;
75
+
76
+ /** Callback function that is called before writing data to the store. Return false to short-circuit updating the state. */
77
+ onBeforeSelect: (e: Event, instance: Instance, dateFrom?: Date, dateTo?: Date) => boolean;
78
+
79
+ /** Callback function that is called after value or date range has changed */
80
+ onSelect: (instance: Instance, dateFrom?: Date, dateTo?: Date) => void;
81
+
82
+ /**
83
+ * Optional parameter to hide the quarters period section on the picker.
84
+ * When true, the quarters section will not render.
85
+ */
86
+ hideQuarters?: boolean;
74
87
  }
75
88
 
76
89
  export class MonthPicker extends Cx.Widget<MonthPickerProps> {}
@@ -154,6 +154,7 @@ MonthPicker.prototype.range = false;
154
154
  MonthPicker.prototype.startYear = 1980;
155
155
  MonthPicker.prototype.endYear = 2030;
156
156
  MonthPicker.prototype.bufferSize = 15;
157
+ MonthPicker.prototype.hideQuarters = false;
157
158
 
158
159
  // Localization
159
160
  MonthPicker.prototype.maxValueErrorText = "Select {0:d} or before.";
@@ -193,7 +194,7 @@ export class MonthPickerComponent extends VDOM.Component {
193
194
  cursorQuarter: cursor.getMonth() / 3,
194
195
  column: "M",
195
196
  start: widget.startYear,
196
- end: widget.startYear + widget.bufferSize,
197
+ end: Math.min(widget.startYear + widget.bufferSize, widget.endYear),
197
198
  };
198
199
 
199
200
  this.handleMouseDown = this.handleMouseDown.bind(this);
@@ -427,8 +428,9 @@ export class MonthPickerComponent extends VDOM.Component {
427
428
  }
428
429
 
429
430
  render() {
430
- let { data, widget } = this.props.instance;
431
- let { CSS, baseClass, startYear, endYear } = widget;
431
+ let { instance } = this.props;
432
+ let { data, widget } = instance;
433
+ let { CSS, baseClass, startYear, endYear, hideQuarters } = widget;
432
434
 
433
435
  let years = [];
434
436
 
@@ -512,24 +514,26 @@ export class MonthPickerComponent extends VDOM.Component {
512
514
  </td>,
513
515
  );
514
516
  }
515
- row.push(
516
- <th
517
- key={`q${q}`}
518
- className={CSS.state({
519
- cursor:
520
- showCursor &&
521
- this.state.column == "Q" &&
522
- y == this.state.cursorYear &&
523
- q == this.state.cursorQuarter,
524
- })}
525
- data-point={`Y-${y}-Q-${q}`}
526
- onMouseEnter={this.handleMouseEnter}
527
- onMouseDown={this.handleMouseDown}
528
- onMouseUp={this.handleMouseUp}
529
- >
530
- {`Q${q + 1}`}
531
- </th>,
532
- );
517
+
518
+ if (!hideQuarters)
519
+ row.push(
520
+ <th
521
+ key={`q${q}`}
522
+ className={CSS.state({
523
+ cursor:
524
+ showCursor &&
525
+ this.state.column == "Q" &&
526
+ y == this.state.cursorYear &&
527
+ q == this.state.cursorQuarter,
528
+ })}
529
+ data-point={`Y-${y}-Q-${q}`}
530
+ onMouseEnter={this.handleMouseEnter}
531
+ onMouseDown={this.handleMouseDown}
532
+ onMouseUp={this.handleMouseUp}
533
+ >
534
+ {`Q${q + 1}`}
535
+ </th>,
536
+ );
533
537
  rows.push(row);
534
538
  }
535
539
  years.push(rows);