@qooxdoo/framework 7.9.2 → 7.9.3

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 (27) hide show
  1. package/Manifest.json +1 -1
  2. package/lib/compiler/compile-info.json +48 -48
  3. package/lib/compiler/index.js +247 -214
  4. package/lib/resource/qx/tool/cli/templates/skeleton/mobile/source/theme/custom/css/custom.css.map +1 -1
  5. package/package.json +2 -2
  6. package/source/class/qx/locale/Manager.js +13 -0
  7. package/source/class/qx/test/compiler/ClassFile.js +13 -0
  8. package/source/class/qx/test/ui/basic/Label.js +106 -0
  9. package/source/class/qx/test/ui/core/Blocker.js +121 -0
  10. package/source/class/qx/test/ui/tree/virtual/Tree.js +36 -0
  11. package/source/class/qx/test/util/DateFormat.js +1 -1
  12. package/source/class/qx/theme/classic/Appearance.js +21 -0
  13. package/source/class/qx/theme/indigo/ColorDark.js +2 -0
  14. package/source/class/qx/theme/modern/Appearance.js +21 -0
  15. package/source/class/qx/theme/simple/Appearance.js +27 -5
  16. package/source/class/qx/theme/tangible/Appearance.js +2 -0
  17. package/source/class/qx/tool/compiler/ClassFile.js +18 -6
  18. package/source/class/qx/tool/compiler/resources/Asset.js +1 -1
  19. package/source/class/qx/tool/compiler/targets/meta/PackageJavascript.js +6 -2
  20. package/source/class/qx/ui/core/Blocker.js +16 -3
  21. package/source/class/qx/ui/form/validation/Manager.js +1 -1
  22. package/source/class/qx/ui/mobile/dialog/Popup.js +13 -1
  23. package/source/class/qx/ui/table/Table.js +5 -4
  24. package/source/class/qx/ui/tree/VirtualTree.js +4 -1
  25. package/source/class/qx/util/format/DateFormat.js +3 -2
  26. package/source/resource/qx/decoration/Modern/table/boolean-false.png +0 -0
  27. package/source/resource/qx/decoration/Modern/table/boolean-true.png +0 -0
@@ -167,7 +167,7 @@ qx.Class.define("qx.tool.compiler.resources.Asset", {
167
167
 
168
168
  async load() {
169
169
  if (this.__loaders) {
170
- this.__loaders.forEach(loader => loader.load(this));
170
+ await Promise.all(this.__loaders.map(loader => loader.load(this)));
171
171
  }
172
172
  },
173
173
 
@@ -85,12 +85,16 @@ qx.Class.define("qx.tool.compiler.targets.meta.PackageJavascript", {
85
85
 
86
86
  if (pkg.isEmbedAllJavascript()) {
87
87
  this.__sourceMapOffsets = [];
88
+ let packageWs = new qx.tool.utils.Utils.LineCountingTransform();
88
89
  let strip = new qx.tool.utils.Utils.StripSourceMapTransform();
89
- strip.pipe(ws);
90
+ strip.pipe(packageWs);
91
+ packageWs.pipe(ws, {
92
+ end: false
93
+ });
90
94
  await new Promise(async resolve => {
91
95
  for (let i = 0; i < pkg.getJavascriptMetas().length; i++) {
92
96
  let js = pkg.getJavascriptMetas()[i];
93
- this.__sourceMapOffsets.push(ws.getLineNumber());
97
+ this.__sourceMapOffsets.push(packageWs.getLineNumber());
94
98
  await js.unwrap().writeSourceCodeToStream(strip);
95
99
  strip.write("\n");
96
100
  }
@@ -132,6 +132,7 @@ qx.Class.define("qx.ui.core.Blocker", {
132
132
  members: {
133
133
  __blocker: null,
134
134
  __blockerCount: 0,
135
+ __blockingContent: false,
135
136
 
136
137
  __activeElements: null,
137
138
  __focusElements: null,
@@ -186,11 +187,17 @@ qx.Class.define("qx.ui.core.Blocker", {
186
187
  * @param bounds {Map} Map with the new width, height, left and top values
187
188
  */
188
189
  _updateBlockerBounds(bounds) {
190
+ // When blocking content, the blocker is a child of the widget itself,
191
+ // so it should be positioned at 0,0 relative to the widget.
192
+ // Otherwise, it's positioned relative to the layout parent.
193
+ var left = this.__blockingContent ? 0 : bounds.left;
194
+ var top = this.__blockingContent ? 0 : bounds.top;
195
+
189
196
  this.getBlockerElement().setStyles({
190
197
  width: bounds.width + "px",
191
198
  height: bounds.height + "px",
192
- left: bounds.left + "px",
193
- top: bounds.top + "px"
199
+ left: left + "px",
200
+ top: top + "px"
194
201
  });
195
202
  },
196
203
 
@@ -338,7 +345,7 @@ qx.Class.define("qx.ui.core.Blocker", {
338
345
  if (!this.__appearListener) {
339
346
  this.__appearListener = this._widget.addListenerOnce(
340
347
  "appear",
341
- this._block.bind(this, zIndex)
348
+ this._block.bind(this, zIndex, blockContent)
342
349
  );
343
350
  }
344
351
  return;
@@ -358,6 +365,9 @@ qx.Class.define("qx.ui.core.Blocker", {
358
365
 
359
366
  this.__blockerCount++;
360
367
  if (this.__blockerCount < 2) {
368
+ // Track if we're blocking content (blocker is child of widget)
369
+ this.__blockingContent = blockContent === true;
370
+
361
371
  this._backupActiveWidget();
362
372
 
363
373
  var bounds = this._widget.getBounds();
@@ -442,6 +452,9 @@ qx.Class.define("qx.ui.core.Blocker", {
442
452
  blocker.removeListener("keyup", this.__stopTabEvent, this);
443
453
  blocker.exclude();
444
454
 
455
+ // Reset blocking content state
456
+ this.__blockingContent = false;
457
+
445
458
  this.fireEvent("unblocked", qx.event.type.Event);
446
459
  },
447
460
 
@@ -484,7 +484,7 @@ qx.Class.define("qx.ui.form.validation.Manager", {
484
484
 
485
485
  let msg = item.getInvalidMessage();
486
486
  if (
487
- msg &&
487
+ !msg &&
488
488
  qx.core.Environment.get(
489
489
  "qx.ui.form.validation.Manager.allowDefaultInvalidMessage"
490
490
  )
@@ -140,11 +140,16 @@ qx.Class.define("qx.ui.mobile.dialog.Popup", {
140
140
  __widget: null,
141
141
  __titleWidget: null,
142
142
  __lastPopupDimension: null,
143
+ /**
144
+ * Flag which ignores event domupdated caused by this widget and stopps infinite recursive `_updatePosition` calls
145
+ */
146
+ __updatePositionStarted: false,
143
147
 
144
148
  /**
145
149
  * Event handler. Called whenever the position of the popup should be updated.
146
150
  */
147
151
  _updatePosition() {
152
+ this.__updatePositionStarted = true;
148
153
  // Traverse single anchor classes for removal, for preventing 'domupdated' event if no CSS classes changed.
149
154
  var anchorClasses = ["top", "bottom", "left", "right", "anchor"];
150
155
  for (var i = 0; i < anchorClasses.length; i++) {
@@ -446,7 +451,14 @@ qx.Class.define("qx.ui.mobile.dialog.Popup", {
446
451
  flex: 1
447
452
  });
448
453
 
449
- widget.addListener("domupdated", this._updatePosition, this);
454
+ widget.addListener("domupdated", () => {
455
+ if (!this.__updatePositionStarted){
456
+ this._updatePosition();
457
+ }
458
+ else {
459
+ this.__updatePositionStarted = false;
460
+ }
461
+ }, this);
450
462
 
451
463
  this.__widget = widget;
452
464
  },
@@ -1570,10 +1570,11 @@ qx.Class.define("qx.ui.table.Table", {
1570
1570
  * visible.
1571
1571
  */
1572
1572
  setFocusedCell(col, row, scrollVisible) {
1573
- if (
1574
- !this.isEditing() &&
1575
- (col != this.__focusedCol || row != this.__focusedRow)
1576
- ) {
1573
+ let cellChanged = col != this.__focusedCol || row != this.__focusedRow;
1574
+ if (this.isEditing() && cellChanged) {
1575
+ this.stopEditing();
1576
+ }
1577
+ if (!this.isEditing() && cellChanged) {
1577
1578
  if (col === null) {
1578
1579
  col = 0;
1579
1580
  }
@@ -761,7 +761,10 @@ qx.Class.define("qx.ui.tree.VirtualTree", {
761
761
  }
762
762
  }
763
763
 
764
- if (this.__lookupTable.indexOf(item) != -1) {
764
+ // Issue #9390: When hideRoot is true, the root is not in the lookup table,
765
+ // but we still need to update when its children change
766
+ var isRootAndHidden = this.isHideRoot() && item === this.getModel();
767
+ if (this.__lookupTable.indexOf(item) != -1 || isRootAndHidden) {
765
768
  this.__applyModelChanges();
766
769
  }
767
770
  }
@@ -476,8 +476,9 @@ qx.Class.define("qx.util.format.DateFormat", {
476
476
 
477
477
  var timezoneOffset = date.getTimezoneOffset();
478
478
  var timezoneSign = timezoneOffset > 0 ? 1 : -1;
479
- var timezoneHours = Math.floor(Math.abs(timezoneOffset) / 60);
480
- var timezoneMinutes = Math.abs(timezoneOffset) % 60;
479
+ var absTimezoneOffset = Math.abs(timezoneOffset);
480
+ var timezoneHours = Math.floor(absTimezoneOffset / 60);
481
+ var timezoneMinutes = Math.trunc(absTimezoneOffset) % 60;
481
482
 
482
483
  // Create the output
483
484
  this.__initFormatTree();