@eclipse-scout/core 22.0.0 → 22.0.10

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 (166) hide show
  1. package/dist/eclipse-scout-core-e5e8740e3649f5b9f279.min.js +2 -0
  2. package/dist/eclipse-scout-core-e5e8740e3649f5b9f279.min.js.map +1 -0
  3. package/dist/eclipse-scout-core-theme-74b63e0d57bed407a729.min.css +1 -0
  4. package/dist/eclipse-scout-core-theme-dark-b82aea152f416e38ce7f.min.css +1 -0
  5. package/dist/eclipse-scout-core-theme-dark.css +597 -422
  6. package/dist/eclipse-scout-core-theme-dark.css.map +1 -1
  7. package/dist/eclipse-scout-core-theme.css +333 -158
  8. package/dist/eclipse-scout-core-theme.css.map +1 -1
  9. package/dist/eclipse-scout-core.js +1196 -811
  10. package/dist/eclipse-scout-core.js.map +1 -1
  11. package/dist/file-list +7 -0
  12. package/dist/locales.json +47126 -0
  13. package/dist/texts.json +1153 -0
  14. package/package.json +2 -2
  15. package/src/App.js +1 -1
  16. package/src/ErrorHandler.js +66 -28
  17. package/src/{table/TableHeaderMenuButtonKeyStroke.js → action/ActionExecKeyStroke.js} +4 -5
  18. package/src/action/Button.less +1 -0
  19. package/src/box/Box.less +12 -8
  20. package/src/breadcrumbbar/BreadcrumbBarLayout.js +2 -2
  21. package/src/breadcrumbbar/BreadcrumbItem.less +3 -6
  22. package/src/calendar/Calendar.js +40 -58
  23. package/src/calendar/Calendar.less +10 -10
  24. package/src/calendar/CalendarLayout.js +3 -1
  25. package/src/checkbox/CheckBox.less +3 -1
  26. package/src/datepicker/DatePicker.less +1 -0
  27. package/src/datepicker/DatePickerTouchPopup.js +8 -0
  28. package/src/desktop/DisableBrowserF5ReloadKeyStroke.js +1 -0
  29. package/src/desktop/bench/DesktopTabSelectKeyStroke.js +2 -1
  30. package/src/desktop/desktoptab/DesktopTab.less +5 -2
  31. package/src/desktop/desktoptab/DesktopTabArea.less +7 -3
  32. package/src/desktop/desktoptab/DesktopTabAreaLayout.js +1 -1
  33. package/src/desktop/desktoptab/DisableBrowserTabSwitchingKeyStroke.js +1 -0
  34. package/src/desktop/navigation/DesktopNavigation.less +4 -0
  35. package/src/desktop/navigation/EnlargeNavigationKeyStroke.js +1 -0
  36. package/src/desktop/navigation/ShrinkNavigationKeyStroke.js +1 -0
  37. package/src/desktop/notification/DesktopNotification.js +11 -4
  38. package/src/desktop/notification/DesktopNotification.less +5 -3
  39. package/src/desktop/outline/Outline.less +4 -4
  40. package/src/desktop/viewbutton/ViewButton.less +18 -9
  41. package/src/desktop/viewbutton/ViewMenuPopupEnterKeyStroke.js +2 -1
  42. package/src/desktop/viewbutton/ViewMenuTab.less +3 -2
  43. package/src/filechooser/FileChooser.js +1 -1
  44. package/src/filechooser/FileChooser.less +16 -11
  45. package/src/focus/FocusContext.js +11 -8
  46. package/src/focus/FocusManager.js +24 -5
  47. package/src/form/Form.less +1 -0
  48. package/src/form/fields/LookupBox.js +5 -2
  49. package/src/form/fields/LookupBox.less +28 -2
  50. package/src/form/fields/TextFieldIcon.less +2 -2
  51. package/src/form/fields/ValueField.js +11 -2
  52. package/src/form/fields/breadcrumbbarfield/BreadcrumbBarField.less +20 -0
  53. package/src/form/fields/button/ButtonKeyStroke.js +0 -3
  54. package/src/form/fields/datefield/DateField.js +31 -47
  55. package/src/form/fields/filechooserfield/FileChooserFieldBrowseKeyStroke.js +1 -3
  56. package/src/form/fields/filechooserfield/FileChooserFieldDeleteKeyStroke.js +1 -3
  57. package/src/form/fields/groupbox/GroupBox.js +14 -9
  58. package/src/form/fields/groupbox/GroupBox.less +1 -0
  59. package/src/form/fields/htmlfield/HtmlField.less +0 -1
  60. package/src/form/fields/listbox/ListBox.js +13 -7
  61. package/src/form/fields/lookupfield/lookupField.js +6 -5
  62. package/src/form/fields/smartfield/ProposalField.js +2 -1
  63. package/src/form/fields/smartfield/ProposalTreeNode.js +4 -8
  64. package/src/form/fields/smartfield/SmartField.js +4 -20
  65. package/src/form/fields/smartfield/SmartField.less +24 -11
  66. package/src/form/fields/splitbox/SplitBoxCollapseKeyStroke.js +1 -0
  67. package/src/form/fields/splitbox/SplitBoxFirstCollapseKeyStroke.js +1 -0
  68. package/src/form/fields/splitbox/SplitBoxSecondCollapseKeyStroke.js +1 -0
  69. package/src/form/fields/tabbox/TabAreaLayout.js +63 -66
  70. package/src/form/fields/tabbox/TabAreaLeftKeyStroke.js +2 -0
  71. package/src/form/fields/tabbox/TabAreaRightKeyStroke.js +2 -0
  72. package/src/form/fields/tabbox/TabBox.js +8 -7
  73. package/src/form/fields/tabbox/TabBox.less +2 -1
  74. package/src/form/fields/tabbox/TabBoxHeader.js +4 -0
  75. package/src/form/fields/tabbox/TabBoxHeaderLayout.js +5 -5
  76. package/src/form/fields/tabbox/TabItem.js +4 -0
  77. package/src/form/fields/treebox/TreeBox.js +6 -5
  78. package/src/glasspane/GlassPane.js +3 -3
  79. package/src/group/Group.less +1 -1
  80. package/src/index.js +1 -1
  81. package/src/index.less +1 -0
  82. package/src/jquery/jquery-scout.js +17 -4
  83. package/src/keystroke/CloseKeyStroke.js +1 -0
  84. package/src/keystroke/ContextMenuKeyStroke.js +1 -0
  85. package/src/keystroke/FocusFilterFieldKeyStroke.js +1 -0
  86. package/src/keystroke/KeyStroke.js +11 -3
  87. package/src/keystroke/TabItemKeyStroke.js +8 -5
  88. package/src/logging/logging.js +16 -8
  89. package/src/login/LoginBox.js +3 -2
  90. package/src/login/LoginBox.less +27 -8
  91. package/src/menu/ContextMenuPopup.less +9 -2
  92. package/src/menu/Menu.less +1 -0
  93. package/src/menu/MenuExecKeyStroke.js +3 -17
  94. package/src/menu/MenuNavigationKeyStroke.js +1 -0
  95. package/src/menu/menubar/MenuBarLeftKeyStroke.js +2 -0
  96. package/src/menu/menubar/MenuBarRightKeyStroke.js +2 -0
  97. package/src/messagebox/MessageBox.less +20 -20
  98. package/src/modeselector/Mode.less +15 -37
  99. package/src/modeselector/ModeSelector.js +1 -1
  100. package/src/modeselector/ModeSelector.less +2 -1
  101. package/src/planner/Planner.js +2 -0
  102. package/src/planner/PlannerHeader.less +2 -1
  103. package/src/popup/Popup.js +24 -8
  104. package/src/popup/PopupLayout.js +2 -8
  105. package/src/scrollbar/Scrollbar.less +8 -1
  106. package/src/scrollbar/scrollbars.js +26 -4
  107. package/src/session/Session.js +8 -5
  108. package/src/style/colors-dark.less +25 -11
  109. package/src/style/colors.less +17 -3
  110. package/src/style/fonts.less +10 -1
  111. package/src/style/mixins.less +21 -14
  112. package/src/style/sizes-dark.less +4 -1
  113. package/src/style/sizes.less +17 -9
  114. package/src/table/Table.js +63 -49
  115. package/src/table/Table.less +50 -20
  116. package/src/table/TableAdapter.js +9 -12
  117. package/src/table/TableHeader.js +10 -8
  118. package/src/table/TableHeader.less +1 -0
  119. package/src/table/TableHeaderMenu.js +3 -1
  120. package/src/table/TableHeaderMenu.less +7 -2
  121. package/src/table/TableHeaderMenuButton.js +2 -2
  122. package/src/table/TableLayout.js +6 -0
  123. package/src/table/columns/BooleanColumn.js +2 -2
  124. package/src/table/columns/Column.js +10 -7
  125. package/src/table/columns/ColumnOptimalWidthMeasurer.js +1 -1
  126. package/src/table/editor/CellEditorPopup.js +29 -15
  127. package/src/table/keystrokes/AbstractTableNavigationKeyStroke.js +1 -0
  128. package/src/table/keystrokes/TableCopyKeyStroke.js +1 -0
  129. package/src/table/keystrokes/TableNavigationCollapseKeyStroke.js +2 -2
  130. package/src/table/keystrokes/TableNavigationEndKeyStroke.js +2 -2
  131. package/src/table/keystrokes/TableNavigationExpandKeyStroke.js +2 -2
  132. package/src/table/keystrokes/TableNavigationHomeKeyStroke.js +2 -2
  133. package/src/table/keystrokes/TableNavigationPageDownKeyStroke.js +2 -2
  134. package/src/table/keystrokes/TableNavigationPageUpKeyStroke.js +2 -2
  135. package/src/table/keystrokes/TableNavigationUpKeyStroke.js +2 -2
  136. package/src/table/keystrokes/TableRefreshKeyStroke.js +2 -2
  137. package/src/table/keystrokes/TableSelectAllKeyStroke.js +3 -2
  138. package/src/table/keystrokes/TableStartCellEditKeyStroke.js +2 -2
  139. package/src/tagbar/TagBarOverflowPopupLayout.js +1 -1
  140. package/src/testing/index.js +1 -0
  141. package/src/testing/lookup/AbortableMicrotaskStaticLookupCall.js +50 -0
  142. package/src/tile/TileGrid.js +10 -12
  143. package/src/tile/TileGridLayout.js +2 -2
  144. package/src/tile/accordion/TileAccordion.js +16 -1
  145. package/src/tile/fields/FormFieldTile.less +18 -11
  146. package/src/tile/fields/button/ButtonTile.js +1 -1
  147. package/src/tile/fields/tablefield/TileTableField.less +19 -2
  148. package/src/tile/keystrokes/TileGridSelectKeyStroke.js +3 -2
  149. package/src/timepicker/TimePickerTouchPopup.js +8 -0
  150. package/src/tree/CompactTree.less +1 -1
  151. package/src/tree/LazyNodeFilter.js +4 -2
  152. package/src/tree/Tree.js +7 -5
  153. package/src/tree/Tree.less +13 -5
  154. package/src/tree/keystrokes/AbstractTreeNavigationKeyStroke.js +1 -0
  155. package/src/tree/keystrokes/TreeCollapseAllKeyStroke.js +2 -2
  156. package/src/tree/keystrokes/TreeExpandOrDrillDownKeyStroke.js +2 -2
  157. package/src/tree/keystrokes/TreeNavigationDownKeyStroke.js +2 -2
  158. package/src/tree/keystrokes/TreeNavigationEndKeyStroke.js +2 -2
  159. package/src/tree/keystrokes/TreeNavigationUpKeyStroke.js +2 -2
  160. package/src/util/Device.js +4 -4
  161. package/src/util/arrays.js +44 -2
  162. package/src/util/dragAndDrop.js +5 -4
  163. package/src/util/events.js +1 -1
  164. package/src/util/objects.js +4 -1
  165. package/src/widget/FilterSupport.js +1 -1
  166. package/src/widget/Widget.js +17 -7
@@ -19,13 +19,13 @@
19
19
  @palette-gray-3: #BFC2C3;
20
20
  @palette-gray-4: #A7ACAD;
21
21
  @palette-gray-5: #7E8588;
22
- @palette-gray-5-1: #445155;
23
- @palette-gray-6: #344146;
24
- @palette-gray-6-1: #283438;
25
- @palette-gray-7: #252e31;
26
- @palette-gray-8: #1F272B;
27
- @palette-gray-9: #181C1F;
28
- @palette-gray-10: #0C1013;
22
+ @palette-gray-5-1: #4B595E;
23
+ @palette-gray-6: #3B494F;
24
+ @palette-gray-6-1: #2E3C41;
25
+ @palette-gray-7: #2C363A;
26
+ @palette-gray-8: #252F34;
27
+ @palette-gray-9: #1F2428;
28
+ @palette-gray-10: #0E1316;
29
29
 
30
30
  @fade-white-0: fade(@palette-white, 25%);
31
31
  @fade-white-1: fade(@palette-white, 18%);
@@ -75,8 +75,14 @@
75
75
  @warning-color: @palette-orange-2;
76
76
  @ok-color: @palette-green-2;
77
77
  @error-background-color: @background-color;
78
+ @error-default-button-background-hover-color: lighten(@error-color, 6%);
79
+ @error-default-button-background-active-color: lighten(@error-color, 10%);
78
80
  @error-focus-box-shadow-color: mix(@error-color, @palette-black, 50%);
81
+ @warning-default-button-background-hover-color: lighten(@warning-color, 8%);
82
+ @warning-default-button-background-active-color: lighten(@warning-color, 12%);
79
83
  @warning-focus-box-shadow-color: mix(@warning-color, @palette-black, 50%);
84
+ @ok-default-button-background-hover-color: lighten(@ok-color, 8%);
85
+ @ok-default-button-background-active-color: lighten(@ok-color, 14%);
80
86
  @ok-focus-box-shadow-color: mix(@ok-color, @palette-black, 50%);
81
87
  @focus-border-color: @focus-color;
82
88
  @focus-box-shadow-color: darken(@focus-color, 30%);
@@ -102,7 +108,8 @@
102
108
  @popup-2-background-color: @palette-gray-6;
103
109
  @popup-2-backdrop-background-color: fade(@popup-2-background-color, 80%);
104
110
  @popup-2-backdrop-filter: blur(15px);
105
- @selected-hover-background-color: darken(@selected-background-color, 10%);
111
+ @selected-hover-background-color: lighten(@selected-background-color, 8%);
112
+ @selected-active-background-color: lighten(@selected-background-color, 12%);
106
113
  @selected-disabled-background-color: @palette-gray-5;
107
114
  @text-color: @palette-gray-2;
108
115
  @text-color-1: @palette-gray-3;
@@ -129,9 +136,11 @@
129
136
  @carousel-current-item-color: @palette-gray-1;
130
137
  @check-box-border-color: @palette-gray-5;
131
138
  @mode-color: @text-color;
132
- @mode-alternative-background-color: @palette-gray-10;
139
+ @mode-alternative-background-color: fade(@palette-black, 60%);
133
140
  @mode-alternative-selected-background-color: @palette-gray-7;
134
141
  @mode-alternative-selected-background-disabled-color: @palette-gray-8;
142
+ @mode-alternative-hover-background-color: @palette-gray-9;
143
+ @mode-alternative-active-background-color: @palette-gray-6;
135
144
  @closer-action-color: @text-color;
136
145
  @closer-color: @palette-gray-3;
137
146
  @closer-hover-color: @text-color;
@@ -150,13 +159,15 @@
150
159
  @date-picker-separator-color: @palette-gray-4;
151
160
  @date-picker-day-preselected-background-color: fade(@palette-white, 8%);
152
161
  @dashboard-tile-border-color: @border-color;
153
- @dashboard-tile-alternative-selected-border-color: @dashboard-tile-selected-border-color;
154
- @dashboard-tile-default-selected-border-color: @dashboard-tile-selected-border-color;
162
+ @dashboard-tile-default-inverted-selected-border-color: @item-selection-border-color;
163
+ @dashboard-tile-alternative-selected-border-color: @dashboard-tile-default-selected-border-color;
164
+ @dashboard-tile-alternative-inverted-selected-border-color: @item-selection-border-color;
155
165
  @desktop-bench-drop-shadow-color: fade(@palette-black, 35%);
156
166
  @desktop-header-background-color: @palette-gray-10;
157
167
  @desktop-header-border-color: @palette-gray-8;
158
168
  @desktop-header-color: @title-color;
159
169
  @desktop-logo-background-color: transparent;
170
+ @desktop-tab-border-color: @border-color;
160
171
  @desktop-tab-closer-hover-background-color: @hover-background-color;
161
172
  @desktop-tab-closer-active-background-color: @active-background-color;
162
173
  @desktop-tab-status-color: @save-needer-color;
@@ -179,6 +190,7 @@
179
190
  @planner-large-scale-item-line-color: fade(@palette-white, 20%);
180
191
  @planner-resource-title-color: @text-color;
181
192
  @planner-small-scale-item-line-color: fade(@palette-white, 7%);
193
+ @scroll-shadow-alpha: 0;
182
194
  @scrollbar-thumb-main-color: @palette-white;
183
195
  @scrollbar-thumb-color: fade(@scrollbar-thumb-main-color, 20%);
184
196
  @scrollbar-thumb-hover-color: fade(@scrollbar-thumb-main-color, 30%);
@@ -235,6 +247,8 @@
235
247
  @tile-default-inverted-link-hover-color: @link-hover-color;
236
248
  @tile-default-inverted-status-hover-background-color: @hover-background-color;
237
249
  @tile-default-inverted-status-active-background-color: @active-background-color;
250
+ @tile-default-inverted-error-status-color: @status-error-color;
251
+ @tile-default-inverted-error-status-hover-color: @status-error-hover-color;
238
252
  @tile-default-label-color: @text-color-1;
239
253
  @tile-default-link-active-color: @link-active-color;
240
254
  @tile-table-default-inverted-selection-background-color: @item-selection-background-color;
@@ -101,8 +101,14 @@
101
101
  @ok-color: @palette-green-5;
102
102
  @error-background-color: @palette-red-0;
103
103
  @error-border-color: @error-color;
104
+ @error-default-button-background-hover-color: darken(@error-color, 6%);
105
+ @error-default-button-background-active-color: darken(@error-color, 13%);
104
106
  @error-focus-box-shadow-color: fade(@error-color, 40%);
107
+ @warning-default-button-background-hover-color: darken(@warning-color, 6%);
108
+ @warning-default-button-background-active-color: darken(@warning-color, 13%);
105
109
  @warning-focus-box-shadow-color: fade(@warning-color, 40%);
110
+ @ok-default-button-background-hover-color: darken(@ok-color, 6%);
111
+ @ok-default-button-background-active-color: darken(@ok-color, 13%);
106
112
  @ok-focus-box-shadow-color: fade(@ok-color, 40%);
107
113
  @focus-border-color: @accent-color-3;
108
114
  @focus-box-shadow-color: darken(@accent-color-1, 10%);
@@ -221,9 +227,12 @@
221
227
  @context-menu-item-color: @text-color;
222
228
  @context-menu-item-icon-color: @link-color;
223
229
  @dashboard-tile-border-color: darken(@palette-gray-3, 5%);
224
- @dashboard-tile-selected-border-color: @item-selection-border-color;
230
+ @dashboard-tile-default-inverted-background-color: mix(@tile-default-inverted-background-color, @tile-default-inverted-selection-background-color, 65%);
231
+ @dashboard-tile-alternative-inverted-background-color: mix(@tile-alternative-inverted-background-color, @tile-alternative-inverted-selection-background-color, 65%);
232
+ @dashboard-tile-default-selected-border-color: @item-selection-border-color;
233
+ @dashboard-tile-default-inverted-selected-border-color: @dashboard-tile-default-inverted-background-color;
225
234
  @dashboard-tile-alternative-selected-border-color: @tile-alternative-inverted-background-color;
226
- @dashboard-tile-default-selected-border-color: @tile-default-inverted-background-color;
235
+ @dashboard-tile-alternative-inverted-selected-border-color: @dashboard-tile-alternative-inverted-background-color;
227
236
  @date-picker-day-hover-background-color: @hover-background-color;
228
237
  @date-picker-day-selected-color: @selected-color;
229
238
  @date-picker-day-selected-background-color: @selected-background-color;
@@ -260,6 +269,7 @@
260
269
  @desktop-header-background-color: @accent-color-3;
261
270
  @desktop-header-border-color: @border-color;
262
271
  @desktop-tab-background-color: fade(@palette-black, 10%);
272
+ @desktop-tab-border-color: transparent;
263
273
  @desktop-tab-flash-background-color: fade(@palette-black, 40%);
264
274
  @desktop-tab-closer-hover-background-color: fade(@palette-black, 14%);
265
275
  @desktop-tab-closer-active-background-color: fade(@palette-black, 20%);
@@ -292,6 +302,8 @@
292
302
  @mode-alternative-selected-background-color: @palette-white;
293
303
  @mode-alternative-selected-background-disabled-color: @palette-gray-4;
294
304
  @mode-alternative-background-color: rgba(0, 0, 0, 0.08);
305
+ @mode-alternative-hover-background-color: rgba(0, 0, 0, 0.05);
306
+ @mode-alternative-active-background-color: rgba(0, 0, 0, 0.1);
295
307
  @navigate-up-button-border-color: @button-border-color;
296
308
  @navigate-up-button-color: @button-color;
297
309
  @desktop-navigation-background-color: @desktop-header-background-color;
@@ -474,6 +486,8 @@
474
486
  @tile-default-inverted-link-active-color: fade(@tile-default-inverted-color, 75%);
475
487
  @tile-default-inverted-status-hover-background-color: fade(@palette-black, 15%);
476
488
  @tile-default-inverted-status-active-background-color: fade(@palette-black, 20%);
489
+ @tile-default-inverted-error-status-color: @palette-red-3;
490
+ @tile-default-inverted-error-status-hover-color: @tile-default-inverted-error-status-color;
477
491
  @tile-placeholder-background-color: @palette-gray-3;
478
492
  @tile-scrollbar-thumb-inverted-main-color: @palette-gray-4;
479
493
  @tile-scrollbar-thumb-inverted-color: fade(@tile-scrollbar-thumb-inverted-main-color, 30%);
@@ -509,7 +523,7 @@
509
523
  @top-label-disabled-color: @label-disabled-color;
510
524
  @tree-node-active-background-color: @item-active-background-color;
511
525
  @tree-node-control-color: inherit;
512
- @view-tab-selected-color: @active-color;
526
+ @view-tab-selected-color: @outline-title-color;
513
527
  @view-tab-selected-background-color: @desktop-navigation-body-background-color;
514
528
  @view-tab-in-background-selected-background-color: @desktop-navigation-body-in-background-background-color;
515
529
  @view-tab-hover-background-color: fade(@palette-black, 20%);
@@ -33,13 +33,22 @@ Try these to switch between fonts:
33
33
  @font-size-large: 16px;
34
34
  @font-size-extra-large: 32px;
35
35
 
36
+ @font-size-icon-small: 14px;
36
37
  @font-size-icon: 16px;
37
38
  @font-size-icon-large: 24px;
38
39
 
39
40
  @letter-spacing: 0.2px;
40
41
 
41
- @icon-font-weight-light: 300;
42
+ // Arial font is hard to vertically align, especially with icons
43
+ // This variable can be used to fix the alignment for specific widgets that can have an icon
44
+ // or are often placed to the side of widgets with icons
45
+ @text-margin-top: 1px;
46
+
47
+ // Icons aligned with line-height may use this variable.
48
+ // It should have the same size as regular text (not the font-size, the actual size)
49
+ @font-icon-line-height: 15px;
42
50
 
51
+ @icon-font-weight-light: 300;
43
52
  @tooltip-font-weight: @font-weight-normal;
44
53
 
45
54
  @font-face {
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2010-2021 BSI Business Systems Integration AG.
2
+ * Copyright (c) 2010-2022 BSI Business Systems Integration AG.
3
3
  * All rights reserved. This program and the accompanying materials
4
4
  * are made available under the terms of the Eclipse Public License v1.0
5
5
  * which accompanies this distribution, and is available at
@@ -70,26 +70,30 @@
70
70
  padding-bottom: 0;
71
71
  }
72
72
 
73
- .inverted-bottom-round-edge(@border-radius: 12px, @width: 24px, @color: #ffffff) {
73
+ .inverted-bottom-round-edge(@border-radius: 12px, @color: #ffffff) {
74
+ @border-width: 5px;
75
+
74
76
  --color: @color; // Allows to change color only
75
77
  position: absolute;
76
78
  pointer-events: none;
77
79
  background-color: transparent;
78
- bottom: 0;
79
- height: 2 * @width;
80
- width: @width;
81
- box-shadow: 0 @width 0 0 var(--color);
82
- // Cut the leftover on the bottom to only get the edge. Use 110%/-10% because with 100%/0% there are drawing issues, at least with Chrome (a very thin line won't be colored)
83
- clip-path: polygon(-10% 0, 110% 0, 110% 100%, -10% 100%);
80
+ bottom: -@border-width;
81
+ height: @border-radius;
82
+ width: @border-radius;
83
+ box-sizing: content-box;
84
+ border: @border-width solid var(--color);
85
+ border-top: none;
84
86
 
85
87
  &.left {
86
- left: -@width;
87
- border-bottom-right-radius: @border-radius;
88
+ left: -@border-radius;
89
+ border-bottom-right-radius: @border-radius+@border-width;
90
+ border-left: none;
88
91
  }
89
92
 
90
93
  &.right {
91
- right: -@width;
92
- border-bottom-left-radius: @border-radius;
94
+ right: -@border-radius;
95
+ border-bottom-left-radius: @border-radius+@border-width;
96
+ border-right: none;
93
97
  }
94
98
  }
95
99
 
@@ -213,8 +217,7 @@
213
217
  }
214
218
  }
215
219
 
216
- .tooltip-status,
217
- .info-status {
220
+ .tooltip-status {
218
221
  visibility: visible;
219
222
  cursor: pointer;
220
223
 
@@ -236,6 +239,10 @@
236
239
  }
237
240
  }
238
241
 
242
+ .info-status {
243
+ #scout.tooltip-status();
244
+ }
245
+
239
246
  .ok-status {
240
247
  visibility: visible;
241
248
  cursor: pointer;
@@ -8,5 +8,8 @@
8
8
  * Contributors:
9
9
  * BSI Business Systems Integration AG - initial API and implementation
10
10
  */
11
+ @desktop-tab-border-width: 1px;
11
12
  @popup-border-width: 1px;
12
- @tooltip-border-width: 1px;
13
+ @tooltip-border-width: 1px;
14
+ @scroll-shadow-size-large: 14px;
15
+ @scroll-shadow-size: @scroll-shadow-size-large;
@@ -3,7 +3,7 @@
3
3
  * All rights reserved. This program and the accompanying materials
4
4
  * are made available under the terms of the Eclipse Public License v1.0
5
5
  * which accompanies this distribution, and is available at
6
- * http://www.eclipse.org/legal/epl-v10.html
6
+ * https://www.eclipse.org/legal/epl-v10.html
7
7
  *
8
8
  * Contributors:
9
9
  * BSI Business Systems Integration AG - initial API and implementation
@@ -17,6 +17,8 @@
17
17
  @border-radius-medium: 8px;
18
18
  @border-radius-large: 12px;
19
19
  @borderless-field-padding-y: @text-field-padding-y + 1px;
20
+ @breadcrumb-bar-field-padding-bottom: 0;
21
+ @breadcrumb-bar-field-padding-bottom-dense: 4px;
20
22
  @collapse-handle-border-radius: @border-radius-medium;
21
23
  @control-border-radius: @border-radius;
22
24
  @control-alternative-border-radius: @control-border-radius;
@@ -55,7 +57,7 @@
55
57
  @focus-box-shadow-size: 3px;
56
58
  @text-field-padding-x: 10px;
57
59
  @text-field-padding-y: 7px;
58
- @text-field-padding-top-compensation: 1px;
60
+ @text-field-padding-top-compensation: 1px + @text-margin-top;
59
61
  @text-field-alternative-padding-left: 0;
60
62
  @text-field-alternative-padding-right: 0;
61
63
  @text-field-icon-size: 24px;
@@ -162,6 +164,7 @@
162
164
  @desktop-navigation-width: 290px;
163
165
  @desktop-notification-no-icon-padding-y: 16px;
164
166
  @desktop-tab-border-radius: @view-tab-border-radius;
167
+ @desktop-tab-border-width: 0;
165
168
  @desktop-tab-key-box-bottom: @view-tab-key-box-bottom;
166
169
  @desktop-tab-margin-top: @view-tab-margin-top;
167
170
  @desktop-tab-margin-right: 3px;
@@ -172,7 +175,7 @@
172
175
  @desktop-tab-border-radius: @view-tab-selected-border-radius;
173
176
  @desktop-tab-margin-top: @view-tab-selected-margin-top;
174
177
  @desktop-tool-box-item-border-radius: @view-tab-border-radius;
175
- @desktop-tool-box-item-font-size: 14px;
178
+ @desktop-tool-box-item-font-size: @font-size-icon-small;
176
179
  @desktop-tool-box-item-margin: 3px;
177
180
  @desktop-tool-box-item-margin-top: @view-tab-margin-top;
178
181
  @detail-table-border-radius: 4px;
@@ -223,21 +226,19 @@
223
226
  @mobile-popup-title-margin-top: 10px;
224
227
  @mode-padding-x: 12px;
225
228
  @mode-padding-y: 6px;
226
- @mode-padding-dense: @mode-padding-dense-y @mode-padding-dense-x;
227
229
  @mode-padding-dense-x: 5px;
228
230
  @mode-padding-dense-y: 3px;
229
231
  @mode-border-width: 1px;
230
- @mode-alternative-border-width: 3px;
232
+ @mode-selector-alternative-border-width: 3px;
231
233
  @notification-no-icon-padding-y: 13px;
232
234
  @outline-breadcrumb-node-padding-x: @outline-title-padding-left;
233
235
  @outline-breadcrumb-node-padding-y: 12px;
234
236
  @outline-data-padding-top: 16px;
235
237
  @outline-font-size: @font-size-normal;
236
- @outline-node-control-size: 18px;
237
238
  @outline-node-control-padding-left: @outline-title-padding-left;
238
239
  @outline-node-control-padding-y: @outline-node-padding-y;
239
240
  @outline-node-control-line-height: @tree-node-control-line-height;
240
- @outline-node-font-icon-line-height: 14px;
241
+ @outline-node-font-icon-line-height: @tree-node-font-icon-line-height;
241
242
  @outline-node-font-icon-size: 16px;
242
243
  @outline-node-padding-left: 37px;
243
244
  @outline-node-padding-right: 8px;
@@ -292,9 +293,15 @@
292
293
  @tab-item-title-padding-bottom: @group-box-title-padding-bottom;
293
294
  @tab-item-title-padding-top: @group-box-title-padding-top;
294
295
  @tab-item-title-margin-top: @group-box-header-margin-top;
296
+ @table-aggregate-cell-font-icon-line-height: 14px;
297
+ @table-aggregate-sum-avg-font-icon-size: 13px;
298
+ @table-aggregate-min-max-font-icon-size: 15px;
299
+ @table-aggregate-row-font-size: @font-size-smaller;
295
300
  @table-cell-padding-left: 10px;
296
301
  @table-cell-padding-right: @table-cell-padding-left;
297
302
  @table-cell-padding-right-last: @scrollbar-size;
303
+ @table-cell-font-icon-size: @tree-node-font-icon-size;
304
+ @table-cell-font-icon-line-height: @tree-node-font-icon-line-height;
298
305
  @table-control-content-padding: 10px;
299
306
  @table-control-container-height: 364px;
300
307
  @table-control-container-height-dense: 320px;
@@ -350,9 +357,10 @@
350
357
  @tree-node-checkbox-margin-top: -2px;
351
358
  @tree-node-control-checkbox-size: 20px + @tree-node-control-size;
352
359
  @tree-node-control-size: 16px;
353
- @tree-node-control-line-height: 14px;
360
+ @tree-node-control-line-height: @font-icon-line-height;
354
361
  @tree-node-control-padding-left: 13px;
355
- @tree-node-font-icon-line-height: 15px;
362
+ @tree-node-font-icon-line-height: @font-icon-line-height;
363
+ @tree-node-font-icon-size: @font-size-icon-small;
356
364
  @tree-node-padding-left: 28px;
357
365
  @tree-node-padding-right: 7px;
358
366
  @tree-node-padding-y: 7px;
@@ -23,6 +23,7 @@ export default class Table extends Widget {
23
23
  this.contextColumn = null;
24
24
  this.checkable = false;
25
25
  this.checkableStyle = Table.CheckableStyle.CHECKBOX;
26
+ this.cellEditorPopup = null;
26
27
  this.compact = false;
27
28
  this.compactHandler = scout.create('TableCompactHandler', {table: this});
28
29
  this.compactColumn = null;
@@ -100,6 +101,7 @@ export default class Table extends Widget {
100
101
  this._popupOpenHandler = this._onDesktopPopupOpen.bind(this);
101
102
  this._rerenderViewPortAfterAttach = false;
102
103
  this._renderViewPortAfterAttach = false;
104
+ this._postAttachActions = [];
103
105
  this._desktopPropertyChangeHandler = this._onDesktopPropertyChange.bind(this);
104
106
  this._addWidgetProperties(['tableControls', 'menus', 'keyStrokes', 'staticMenus', 'tileTableHeader', 'tableTileGridMediator']);
105
107
 
@@ -475,7 +477,6 @@ export default class Table extends Widget {
475
477
  }
476
478
 
477
479
  _removeData() {
478
- this._destroyCellEditorPopup();
479
480
  this._removeAggregateRows();
480
481
  this._uninstallImageListeners();
481
482
  this._uninstallCellTooltipSupport();
@@ -554,7 +555,7 @@ export default class Table extends Widget {
554
555
  return; // row was removed while loading the image
555
556
  }
556
557
  let oldRowHeight = row.height;
557
- row.height = $row.outerHeight(true);
558
+ row.height = this._measureRowHeight($row);
558
559
  if (oldRowHeight !== row.height) {
559
560
  this.invalidateLayoutTree();
560
561
  }
@@ -633,11 +634,11 @@ export default class Table extends Widget {
633
634
  // Don't start cell editor or trigger click if row control was clicked (expansion itself is handled by the mouse down handler)
634
635
  return;
635
636
  }
637
+ let row = $row.data('row'); // read row before the $row potentially could be replaced by the column specific logic on mouse up
636
638
  if (mouseButton === 1) {
637
639
  column.onMouseUp(event, $row);
638
640
  $appLink = this._find$AppLink(event);
639
641
  }
640
- let row = $row.data('row');
641
642
  if ($appLink) {
642
643
  this._triggerAppLinkAction(column, row, $appLink.data('ref'), $appLink);
643
644
  } else {
@@ -848,7 +849,7 @@ export default class Table extends Widget {
848
849
  _isAggregatedTooltip($cell) {
849
850
  let $row = $cell.parent();
850
851
  return $row.data('aggregateRow') /* row in the table */
851
- || $row.hasClass('table-aggregate') /* aggregate table control */;
852
+ || $row.hasClass('table-aggregate'); /* aggregate table control */
852
853
  }
853
854
 
854
855
  reload(reloadReason) {
@@ -1527,12 +1528,12 @@ export default class Table extends Widget {
1527
1528
 
1528
1529
  _updateRowHeight() {
1529
1530
  let $emptyRow = this.$data.appendDiv('table-row');
1530
- let $emptyAggrRow = this.$data.appendDiv('table-aggregate-row');
1531
+ let $emptyAggrRow = this._build$AggregateRow().appendTo(this.$data);
1531
1532
 
1532
1533
  $emptyRow.appendDiv('table-cell').html(' ');
1533
- $emptyAggrRow.appendDiv('table-cell').html(' ');
1534
- this.rowHeight = $emptyRow.outerHeight(true);
1535
- this.aggregateRowHeight = $emptyAggrRow.outerHeight(true);
1534
+ $emptyAggrRow.appendDiv('table-cell table-aggregate-cell').appendSpan('text').html(' ');
1535
+ this.rowHeight = this._measureRowHeight($emptyRow);
1536
+ this.aggregateRowHeight = this._measureRowHeight($emptyAggrRow);
1536
1537
  $emptyRow.remove();
1537
1538
  $emptyAggrRow.remove();
1538
1539
  }
@@ -1545,14 +1546,14 @@ export default class Table extends Widget {
1545
1546
  if (!row.$row) {
1546
1547
  row.height = null;
1547
1548
  } else {
1548
- row.height = row.$row.outerHeight(true);
1549
+ row.height = this._measureRowHeight(row.$row);
1549
1550
  }
1550
1551
  });
1551
1552
  this._aggregateRows.forEach(aggregateRow => {
1552
1553
  if (!aggregateRow.$row) {
1553
1554
  aggregateRow.height = null;
1554
1555
  } else {
1555
- aggregateRow.height = aggregateRow.$row.outerHeight(true);
1556
+ aggregateRow.height = this._measureRowHeight(aggregateRow.$row);
1556
1557
  }
1557
1558
  });
1558
1559
  }
@@ -1866,7 +1867,7 @@ export default class Table extends Widget {
1866
1867
  }
1867
1868
 
1868
1869
  this._destroyTooltipsForRow(row);
1869
- this._removeCellEditorForRow(row);
1870
+ this._destroyCellEditorForRow(row);
1870
1871
 
1871
1872
  // Do not remove rows which are removed using an animation
1872
1873
  if (!$row.hasClass('hiding')) {
@@ -1936,7 +1937,7 @@ export default class Table extends Widget {
1936
1937
  * is expected to be linked with the corresponding '$row' (row.$row and $row.data('row')).
1937
1938
  */
1938
1939
  _installRow(row) {
1939
- row.height = row.$row.outerHeight(true);
1940
+ row.height = this._measureRowHeight(row.$row);
1940
1941
 
1941
1942
  if (row.hasError) {
1942
1943
  this._showCellErrorForRow(row);
@@ -2068,8 +2069,24 @@ export default class Table extends Widget {
2068
2069
  }
2069
2070
 
2070
2071
  /**
2071
- * This functions starts the cell editor for the given row and column. Prepare must wait until
2072
- * a pending completeCellEdit operation is resolved.
2072
+ * Starts cell editing for the cell at the given column and row, but only if editing is allowed.
2073
+ * @see prepareCellEdit
2074
+ */
2075
+ focusCell(column, row) {
2076
+ let cell = this.cell(column, row);
2077
+ if (this.enabledComputed && row.enabled && cell.editable) {
2078
+ this.prepareCellEdit(column, row);
2079
+ }
2080
+ }
2081
+
2082
+ /**
2083
+ * Creates a cell editor for the cell at the given column and row, ensures the row is selected and passes the editor
2084
+ * to {@link #startCellEdit} which starts the editing by rendering the editor in a {@link CellEditorPopup}.<br>
2085
+ * If the completion of a previous cell edit is still in progress, the preparation is delayed until the completion is finished.
2086
+ *
2087
+ * @param {boolean} [openFieldPopupOnCellEdit] true to instruct the editor to open its control popup when the editor is rendered.
2088
+ * This only has an effect if the editor has a popup (e.g. SmartField or DateField).
2089
+ * @returns Promise the promise will be resolved when the preparation has been finished.
2073
2090
  */
2074
2091
  prepareCellEdit(column, row, openFieldPopupOnCellEdit) {
2075
2092
  let promise = $.resolvedPromise();
@@ -2080,10 +2097,10 @@ export default class Table extends Widget {
2080
2097
  }
2081
2098
 
2082
2099
  /**
2083
- * @param openFieldPopupOnCellEdit when this parameter is set to true, the CellEditorPopup sets an
2100
+ * @param {boolean} [openFieldPopupOnCellEdit] when this parameter is set to true, the CellEditorPopup sets an
2084
2101
  * additional property 'cellEditor' on the editor-field. The field instance may use this property
2085
2102
  * to decide whether or not it should open a popup immediately after it is rendered. This is used
2086
- * for Smart- and DateFields.
2103
+ * for Smart- and DateFields. Default is false.
2087
2104
  */
2088
2105
  prepareCellEditInternal(column, row, openFieldPopupOnCellEdit) {
2089
2106
  let event = new Event({
@@ -2380,14 +2397,14 @@ export default class Table extends Widget {
2380
2397
  return;
2381
2398
  }
2382
2399
 
2383
- let $aggregateRow = this._buildAggregateRowDiv(aggregateRow);
2400
+ let $aggregateRow = this._build$AggregateRow(aggregateRow);
2384
2401
  $aggregateRow[insertFunc](refRow.$row).width(this.rowWidth);
2385
2402
 
2386
2403
  this.visibleColumns()
2387
2404
  .map(column => $(column.buildCellForAggregateRow(aggregateRow)).appendTo($aggregateRow))
2388
2405
  .forEach($c => this._resizeAggregateCell($c));
2389
2406
 
2390
- aggregateRow.height = $aggregateRow.outerHeight(true);
2407
+ aggregateRow.height = this._measureRowHeight($aggregateRow);
2391
2408
  aggregateRow.$row = $aggregateRow;
2392
2409
  if (animate) {
2393
2410
  this._showRow(aggregateRow);
@@ -2395,7 +2412,7 @@ export default class Table extends Widget {
2395
2412
  }, this);
2396
2413
  }
2397
2414
 
2398
- _buildAggregateRowDiv(aggregateRow) {
2415
+ _build$AggregateRow(aggregateRow) {
2399
2416
  let onTop = this.groupingStyle === Table.GroupingStyle.TOP;
2400
2417
  let $aggregateRow = this.$container
2401
2418
  .makeDiv('table-aggregate-row')
@@ -2966,7 +2983,7 @@ export default class Table extends Widget {
2966
2983
  oldRow.$row.replaceWith($updatedRow);
2967
2984
  Table.linkRowToDiv(row, $updatedRow);
2968
2985
  this._destroyTooltipsForRow(row);
2969
- this._removeCellEditorForRow(row);
2986
+ this._destroyCellEditorForRow(row);
2970
2987
  this._installRow(row);
2971
2988
  if (oldRow.$row.hasClass('showing') && oldRow.$row.outerHeight() < row.$row.outerHeight() / 3) {
2972
2989
  // If the row was being shown by an animation, start the animation again for the new row, otherwise row would immediately appear without animation.
@@ -3036,17 +3053,25 @@ export default class Table extends Widget {
3036
3053
  }
3037
3054
  }
3038
3055
 
3039
- _removeCellEditorForRow(row) {
3056
+ _destroyCellEditorForRow(row) {
3040
3057
  if (this.cellEditorPopup && this.cellEditorPopup.rendered && this.cellEditorPopup.row.id === row.id) {
3041
- this.cellEditorPopup.remove();
3058
+ this.cellEditorPopup.destroy();
3042
3059
  }
3043
3060
  }
3044
3061
 
3045
3062
  startCellEdit(column, row, field) {
3046
- if (!this._isDataRendered() || !this.isAttachedAndRendered()) {
3063
+ if (field.destroyed) {
3064
+ // May happen if the action was postponed and the field destroyed in the meantime using endCellEdit.
3065
+ return;
3066
+ }
3067
+ if (!this._isDataRendered()) {
3047
3068
  this._postRenderActions.push(this.startCellEdit.bind(this, column, row, field));
3048
3069
  return;
3049
3070
  }
3071
+ if (!this.$container.isAttached()) {
3072
+ this._postAttachActions.push(this.startCellEdit.bind(this, column, row, field));
3073
+ return;
3074
+ }
3050
3075
 
3051
3076
  this.trigger('startCellEdit', {
3052
3077
  column: column,
@@ -3066,11 +3091,6 @@ export default class Table extends Widget {
3066
3091
  * value is updated by an updateRow event instead.
3067
3092
  */
3068
3093
  endCellEdit(field, saveEditorValue) {
3069
- if (!this._isDataRendered() || !this.isAttachedAndRendered()) {
3070
- this._postRenderActions.push(this.endCellEdit.bind(this, field, saveEditorValue));
3071
- return;
3072
- }
3073
-
3074
3094
  if (!this.cellEditorPopup) {
3075
3095
  // the cellEditorPopup could already be removed by scrolling (out of view range) or be removed by update rows
3076
3096
  field.destroy();
@@ -4656,7 +4676,9 @@ export default class Table extends Widget {
4656
4676
  this.$container.toggleClass('checkable', scout.isOneOf(this.checkableStyle, Table.CheckableStyle.TABLE_ROW, Table.CheckableStyle.CHECKBOX_TABLE_ROW));
4657
4677
  this.$container.toggleClass('table-row-check', this.checkableStyle === Table.CheckableStyle.TABLE_ROW);
4658
4678
  if (this._isDataRendered()) {
4679
+ this._updateRowWidth();
4659
4680
  this._redraw();
4681
+ this.invalidateLayoutTree();
4660
4682
  }
4661
4683
  }
4662
4684
 
@@ -4831,7 +4853,7 @@ export default class Table extends Widget {
4831
4853
  this.$data.setEnabled(enabled);
4832
4854
  }
4833
4855
 
4834
- this.$container.setTabbable(enabled);
4856
+ this.$container.setTabbableOrFocusable(enabled);
4835
4857
  }
4836
4858
 
4837
4859
  /**
@@ -4974,8 +4996,11 @@ export default class Table extends Widget {
4974
4996
  }
4975
4997
 
4976
4998
  _heightForRow(row) {
4977
- let height = 0,
4999
+ let height = 0;
5000
+ let aggregateRow = row.aggregateRowBefore;
5001
+ if (this.groupingStyle === Table.GroupingStyle.BOTTOM) {
4978
5002
  aggregateRow = row.aggregateRowAfter;
5003
+ }
4979
5004
 
4980
5005
  if (row.height) {
4981
5006
  height = row.height;
@@ -4995,6 +5020,10 @@ export default class Table extends Widget {
4995
5020
  return height;
4996
5021
  }
4997
5022
 
5023
+ _measureRowHeight($row) {
5024
+ return graphics.size($row, {includeMargin: true, exact: true}).height;
5025
+ }
5026
+
4998
5027
  /**
4999
5028
  * Returns a range of size this.viewRangeSize. Start of range is rowIndex - viewRangeSize / 4.
5000
5029
  * -> 1/4 of the rows are before the viewport 2/4 in the viewport 1/4 after the viewport,
@@ -5302,18 +5331,6 @@ export default class Table extends Widget {
5302
5331
  }
5303
5332
  }
5304
5333
 
5305
- focusCell(column, row) {
5306
- if (!this._isDataRendered() || !this.isAttachedAndRendered()) {
5307
- this._postRenderActions.push(this.focusCell.bind(this, column, row));
5308
- return;
5309
- }
5310
-
5311
- let cell = this.cell(column, row);
5312
- if (this.enabledComputed && row.enabled && cell.editable) {
5313
- this.prepareCellEdit(column, row, false);
5314
- }
5315
- }
5316
-
5317
5334
  _attach() {
5318
5335
  this.$parent.append(this.$container);
5319
5336
  super._attach();
@@ -5337,6 +5354,9 @@ export default class Table extends Widget {
5337
5354
  super._renderOnAttach();
5338
5355
  this._rerenderViewportAfterAttach();
5339
5356
  this._renderViewportAfterAttach();
5357
+ let actions = this._postAttachActions;
5358
+ this._postAttachActions = [];
5359
+ actions.forEach(action => action());
5340
5360
  }
5341
5361
 
5342
5362
  _rerenderViewportAfterAttach() {
@@ -5365,11 +5385,6 @@ export default class Table extends Widget {
5365
5385
  super._detach();
5366
5386
  }
5367
5387
 
5368
- _onDetach() {
5369
- super._onDetach();
5370
- this._destroyCellEditorPopup();
5371
- }
5372
-
5373
5388
  /**
5374
5389
  * @param {function} [callback] function to be called right after the popup is destroyed
5375
5390
  */
@@ -5396,7 +5411,6 @@ export default class Table extends Widget {
5396
5411
  if (promise.state() === 'resolved') {
5397
5412
  // Do it immediately if promise has already been resolved.
5398
5413
  // This makes sure updateRow does not immediately reopen the editor after closing.
5399
- // At least for Scout JS, for Scout Classic it prevents flickering (endCellEdit comes after updateRows, but updateRows does not know whether the editor is closing so it will reopen it)
5400
5414
  destroyEditor();
5401
5415
  } else {
5402
5416
  promise.then(destroyEditor);
@@ -5435,7 +5449,7 @@ export default class Table extends Widget {
5435
5449
  // same as on Tree.prototype._onDesktopPopupOpen
5436
5450
  _onDesktopPopupOpen(event) {
5437
5451
  let popup = event.popup;
5438
- if (!this.enabledComputed) {
5452
+ if (!this.isFocusable(false)) {
5439
5453
  return;
5440
5454
  }
5441
5455
  // Set table style to focused if a context menu or a menu bar popup opens, so that it looks as it still has the focus