@qooxdoo/framework 7.0.0-beta.2 → 7.0.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/Manifest.json +2 -3
- package/README.md +7 -3
- package/bin/deploy/qx +0 -0
- package/lib/compiler/compile-info.json +44 -45
- package/lib/compiler/index.js +1971 -8371
- package/lib/resource/qx/tool/cli/templates/loader/loader-node.tmpl.js +3 -1
- package/lib/resource/qx/tool/cli/templates/skeleton/mobile/source/theme/custom/css/custom.css +1 -1
- package/lib/resource/qx/tool/cli/templates/skeleton/mobile/source/theme/custom/css/custom.css.map +1 -1
- package/lib/resource/qx/tool/cli/templates/template_vars.js +1 -1
- package/lib/resource/qx/tool/loadsass.js +6 -12
- package/lib/resource/qx/tool/schema/Manifest-1-0-0.json +1 -2
- package/lib/resource/qx/tool/schema/Manifest-2-0-0.json +1 -2
- package/lib/resource/qx/tool/schema/compile-1-0-0.json +3 -7
- package/package.json +25 -12
- package/source/class/qx/io/__init__.js +5 -3
- package/source/class/qx/io/exception/Cancel.js +34 -0
- package/source/class/qx/io/exception/Exception.js +38 -0
- package/source/class/qx/{tool/compiler/Version.js → io/exception/Protocol.js} +13 -7
- package/source/class/qx/io/exception/Transport.js +39 -0
- package/source/class/qx/io/exception/__init__.js +4 -0
- package/source/class/qx/io/graphql/Client.js +112 -0
- package/source/class/qx/io/graphql/__init__.js +9 -0
- package/source/class/qx/io/graphql/protocol/Message.js +65 -0
- package/source/class/qx/io/graphql/protocol/Request.js +95 -0
- package/source/class/qx/io/graphql/protocol/Response.js +61 -0
- package/source/class/qx/io/graphql/protocol/__init__.js +6 -0
- package/source/class/qx/io/jsonrpc/Client.js +323 -0
- package/source/class/qx/io/jsonrpc/__init__.js +15 -0
- package/source/class/qx/io/jsonrpc/protocol/Batch.js +97 -0
- package/source/class/qx/io/jsonrpc/protocol/Error.js +63 -0
- package/source/class/qx/io/jsonrpc/protocol/Message.js +48 -0
- package/source/class/qx/io/jsonrpc/protocol/Notification.js +45 -0
- package/source/class/qx/io/jsonrpc/protocol/Parser.js +81 -0
- package/source/class/qx/io/jsonrpc/protocol/Request.js +93 -0
- package/source/class/qx/io/jsonrpc/protocol/Result.js +48 -0
- package/source/class/qx/io/jsonrpc/protocol/__init__.js +5 -0
- package/source/class/qx/io/request/authentication/Bearer.js +52 -0
- package/source/class/qx/io/transport/AbstractClient.js +100 -0
- package/source/class/qx/io/transport/AbstractTransport.js +41 -0
- package/source/class/qx/io/transport/Fetch.js +95 -0
- package/source/class/qx/io/transport/ITransport.js +40 -0
- package/source/class/qx/io/transport/PostMessage.js +55 -0
- package/source/class/qx/io/transport/Websocket.js +97 -0
- package/source/class/qx/io/transport/Xhr.js +139 -0
- package/source/class/qx/io/transport/__init__.js +18 -0
- package/source/class/qx/test/io/MAssert.js +46 -0
- package/source/class/qx/test/io/graphql/Client.js +169 -0
- package/source/class/qx/test/io/graphql/ClientFetch.js +34 -0
- package/source/class/qx/test/io/graphql/Request.js +42 -0
- package/source/class/qx/test/io/jsonrpc/Client.js +267 -0
- package/source/class/qx/test/io/jsonrpc/Protocol.js +80 -0
- package/source/class/qx/test/io/transport/PostMessage.js +56 -0
- package/source/class/qx/test/io/transport/Websocket.js +63 -0
- package/source/class/qx/test/ui/embed/Iframe.js +1 -0
- package/source/class/qx/test/ui/form/ComboBox.js +0 -42
- package/source/class/qx/test/util/DateFormat.js +45 -6
- package/source/class/qx/theme/manager/Decoration.js +0 -0
- package/source/class/qx/theme/tangible/ColorDark.js +0 -0
- package/source/class/qx/tool/cli/Cli.js +5 -3
- package/source/class/qx/tool/cli/api/CompilerApi.js +15 -5
- package/source/class/qx/tool/cli/commands/Command.js +7 -0
- package/source/class/qx/tool/cli/commands/Compile.js +4 -4
- package/source/class/qx/tool/cli/commands/Lint.js +30 -11
- package/source/class/qx/tool/cli/commands/Package.js +1 -2
- package/source/class/qx/tool/cli/commands/package/Publish.js +33 -10
- package/source/class/qx/tool/compiler/Analyser.js +21 -22
- package/source/class/qx/tool/compiler/app/WebFont.js +1 -1
- package/source/class/qx/tool/compiler/makers/AppMaker.js +15 -14
- package/source/class/qx/tool/compiler/targets/Target.js +2 -1
- package/source/class/qx/tool/compiler/targets/TypeScriptWriter.js +1 -2
- package/source/class/qx/tool/compiler/targets/meta/PolyfillJs.js +17 -9
- package/source/class/qx/tool/config/Abstract.js +3 -3
- package/source/class/qx/tool/config/Utils.js +10 -1
- package/source/class/qx/tool/utils/Json.js +1 -1
- package/source/class/qx/ui/container/SlideBar.js +3 -0
- package/source/class/qx/ui/core/Widget.js +70 -0
- package/source/class/qx/ui/core/scroll/NativeScrollBar.js +3 -0
- package/source/class/qx/ui/core/scroll/ScrollBar.js +3 -0
- package/source/class/qx/ui/form/AbstractSelectBox.js +38 -6
- package/source/class/qx/ui/form/Button.js +3 -0
- package/source/class/qx/ui/form/CheckBox.js +25 -1
- package/source/class/qx/ui/form/ComboBox.js +41 -27
- package/source/class/qx/ui/form/DateField.js +16 -1
- package/source/class/qx/ui/form/List.js +3 -0
- package/source/class/qx/ui/form/MenuButton.js +28 -2
- package/source/class/qx/ui/form/RadioButton.js +7 -0
- package/source/class/qx/ui/form/RadioButtonGroup.js +3 -0
- package/source/class/qx/ui/form/RadioGroup.js +19 -0
- package/source/class/qx/ui/form/SelectBox.js +28 -1
- package/source/class/qx/ui/form/Slider.js +15 -0
- package/source/class/qx/ui/form/SplitButton.js +3 -0
- package/source/class/qx/ui/form/ToggleButton.js +8 -0
- package/source/class/qx/ui/menu/AbstractButton.js +28 -0
- package/source/class/qx/ui/menu/Button.js +3 -0
- package/source/class/qx/ui/menu/CheckBox.js +8 -0
- package/source/class/qx/ui/menu/Manager.js +2 -0
- package/source/class/qx/ui/menu/Menu.js +74 -2
- package/source/class/qx/ui/menu/RadioButton.js +10 -1
- package/source/class/qx/ui/menubar/Button.js +0 -27
- package/source/class/qx/ui/menubar/MenuBar.js +12 -0
- package/source/class/qx/ui/splitpane/Blocker.js +3 -0
- package/source/class/qx/ui/splitpane/Pane.js +3 -0
- package/source/class/qx/ui/table/Table.js +24 -2
- package/source/class/qx/ui/table/cellrenderer/Abstract.js +3 -1
- package/source/class/qx/ui/table/cellrenderer/AbstractImage.js +7 -3
- package/source/class/qx/ui/table/headerrenderer/HeaderCell.js +3 -0
- package/source/class/qx/ui/table/pane/Header.js +3 -0
- package/source/class/qx/ui/table/pane/Model.js +10 -4
- package/source/class/qx/ui/table/pane/Scroller.js +3 -7
- package/source/class/qx/ui/table/rowrenderer/Default.js +1 -1
- package/source/class/qx/ui/tabview/Page.js +26 -0
- package/source/class/qx/ui/tabview/TabView.js +3 -0
- package/source/class/qx/ui/toolbar/Button.js +2 -27
- package/source/class/qx/ui/toolbar/CheckBox.js +0 -27
- package/source/class/qx/ui/toolbar/RadioButton.js +21 -0
- package/source/class/qx/ui/toolbar/SplitButton.js +0 -28
- package/source/class/qx/ui/toolbar/ToolBar.js +3 -0
- package/source/class/qx/ui/window/Window.js +8 -0
- package/source/class/qx/util/format/DateFormat.js +44 -17
- package/source/class/qxWeb.js +2 -0
- package/source/resource/qx/decoration/Indigo/font/JosefinSlab-SemiBold.ttf +0 -0
- package/source/resource/qx/decoration/Indigo/font/SIL Open Font License 1.1.txt +0 -0
- package/source/resource/qx/iconfont/MaterialIcons/fetch-fonts.sh +0 -0
- package/source/resource/qx/tool/bin/build-devtools +0 -0
- package/source/resource/qx/tool/bin/build-website +0 -0
- package/source/resource/qx/tool/bin/download-assets +0 -0
- package/source/resource/qx/tool/cli/templates/loader/loader-node.tmpl.js +3 -1
- package/source/resource/qx/tool/cli/templates/template_vars.js +1 -1
- package/source/resource/qx/tool/loadsass.js +6 -12
- package/source/resource/qx/tool/schema/Manifest-1-0-0.json +1 -2
- package/source/resource/qx/tool/schema/Manifest-2-0-0.json +1 -2
- package/source/resource/qx/tool/schema/compile-1-0-0.json +3 -7
- package/source/translation/hr.po +297 -0
- package/lib/resource/qx/tool/website/.gitignore +0 -2
- package/source/class/qx/io/request/auth/.gitignore +0 -0
- package/source/class/qx/test/bom/client/.gitignore +0 -0
- package/source/class/qx/test/ui/control/.gitignore +0 -0
- package/source/resource/qx/decoration/Modern/treevirtual/.gitignore +0 -0
- package/source/resource/qx/mobile/css/.gitignore +0 -3
- package/source/resource/qx/tool/website/.gitignore +0 -2
- package/source/resource/qx/website/.gitignore +0 -1
- package/source/resource/qx/website/scss/.gitignore +0 -1
|
@@ -335,6 +335,7 @@ qx.Class.define("qx.ui.menu.AbstractButton",
|
|
|
335
335
|
{
|
|
336
336
|
if (old)
|
|
337
337
|
{
|
|
338
|
+
old.removeListener("changeVisibility", this._onMenuChange, this);
|
|
338
339
|
old.resetOpener();
|
|
339
340
|
old.removeState("submenu");
|
|
340
341
|
}
|
|
@@ -343,6 +344,7 @@ qx.Class.define("qx.ui.menu.AbstractButton",
|
|
|
343
344
|
{
|
|
344
345
|
this._showChildControl("arrow");
|
|
345
346
|
|
|
347
|
+
value.addListener("changeVisibility", this._onMenuChange, this);
|
|
346
348
|
value.setOpener(this);
|
|
347
349
|
value.addState("submenu");
|
|
348
350
|
}
|
|
@@ -350,6 +352,32 @@ qx.Class.define("qx.ui.menu.AbstractButton",
|
|
|
350
352
|
{
|
|
351
353
|
this._excludeChildControl("arrow");
|
|
352
354
|
}
|
|
355
|
+
|
|
356
|
+
// ARIA attrs
|
|
357
|
+
const contentEl = this.getContentElement();
|
|
358
|
+
if (!contentEl) {
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
if (value) {
|
|
362
|
+
contentEl.setAttribute("aria-haspopup", "menu");
|
|
363
|
+
contentEl.setAttribute("aria-expanded", value.isVisible());
|
|
364
|
+
contentEl.setAttribute("aria-controls", value.getContentElement().getAttribute("id"));
|
|
365
|
+
} else {
|
|
366
|
+
contentEl.removeAttribute("aria-haspopup");
|
|
367
|
+
contentEl.removeAttribute("aria-expanded");
|
|
368
|
+
contentEl.removeAttribute("aria-controls");
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
|
|
372
|
+
/**
|
|
373
|
+
* Listener for visibility property changes of the attached menu
|
|
374
|
+
*
|
|
375
|
+
* @param e {qx.event.type.Data} Property change event
|
|
376
|
+
*/
|
|
377
|
+
_onMenuChange : function(e)
|
|
378
|
+
{
|
|
379
|
+
// ARIA attrs
|
|
380
|
+
this.getContentElement().setAttribute("aria-expanded", this.getMenu().isVisible());
|
|
353
381
|
},
|
|
354
382
|
|
|
355
383
|
// property apply
|
|
@@ -44,6 +44,11 @@ qx.Class.define("qx.ui.menu.CheckBox",
|
|
|
44
44
|
{
|
|
45
45
|
this.base(arguments);
|
|
46
46
|
|
|
47
|
+
// ARIA attrs
|
|
48
|
+
const contenEl = this.getContentElement();
|
|
49
|
+
contenEl.setAttribute("role", "checkbox");
|
|
50
|
+
contenEl.setAttribute("aria-checked", false);
|
|
51
|
+
|
|
47
52
|
// Initialize with incoming arguments
|
|
48
53
|
if (label != null) {
|
|
49
54
|
// try to translate every time you create a checkbox [BUG #2699]
|
|
@@ -120,6 +125,9 @@ qx.Class.define("qx.ui.menu.CheckBox",
|
|
|
120
125
|
value ?
|
|
121
126
|
this.addState("checked") :
|
|
122
127
|
this.removeState("checked");
|
|
128
|
+
|
|
129
|
+
// ARIA attrs
|
|
130
|
+
this.getContentElement().setAttribute("aria-checked", Boolean(value));
|
|
123
131
|
},
|
|
124
132
|
|
|
125
133
|
|
|
@@ -528,6 +528,7 @@ qx.Class.define("qx.ui.menu.Manager",
|
|
|
528
528
|
*/
|
|
529
529
|
__navigationKeys :
|
|
530
530
|
{
|
|
531
|
+
"Tab" : 1,
|
|
531
532
|
"Escape" : 1,
|
|
532
533
|
"Up" : 1,
|
|
533
534
|
"Down" : 1,
|
|
@@ -597,6 +598,7 @@ qx.Class.define("qx.ui.menu.Manager",
|
|
|
597
598
|
this._onKeyPressRight(menu);
|
|
598
599
|
break;
|
|
599
600
|
|
|
601
|
+
case "Tab":
|
|
600
602
|
case "Escape":
|
|
601
603
|
this.hideAll();
|
|
602
604
|
break;
|
|
@@ -48,6 +48,11 @@ qx.Class.define("qx.ui.menu.Menu",
|
|
|
48
48
|
var root = this.getApplicationRoot();
|
|
49
49
|
root.add(this);
|
|
50
50
|
|
|
51
|
+
// ARIA attrs
|
|
52
|
+
const contentEl = this.getContentElement();
|
|
53
|
+
contentEl.setAttribute("role", "menu");
|
|
54
|
+
contentEl.setAttribute("id", "menu-" + this.toHashCode());
|
|
55
|
+
|
|
51
56
|
// Register pointer listeners
|
|
52
57
|
this.addListener("pointerover", this._onPointerOver);
|
|
53
58
|
this.addListener("pointerout", this._onPointerOut);
|
|
@@ -212,7 +217,8 @@ qx.Class.define("qx.ui.menu.Menu",
|
|
|
212
217
|
opener :
|
|
213
218
|
{
|
|
214
219
|
check : "qx.ui.core.Widget",
|
|
215
|
-
nullable
|
|
220
|
+
nullable: true,
|
|
221
|
+
apply : "_applyOpener"
|
|
216
222
|
},
|
|
217
223
|
|
|
218
224
|
|
|
@@ -487,10 +493,22 @@ qx.Class.define("qx.ui.menu.Menu",
|
|
|
487
493
|
if (old) {
|
|
488
494
|
old.removeState("selected");
|
|
489
495
|
}
|
|
490
|
-
|
|
491
496
|
if (value) {
|
|
492
497
|
value.addState("selected");
|
|
493
498
|
}
|
|
499
|
+
|
|
500
|
+
// ARIA attrs
|
|
501
|
+
const opener = this.__getRootOpener();
|
|
502
|
+
const contentEl = opener ? opener.getContentElement() : this.getContentElement();
|
|
503
|
+
if (!contentEl) {
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
const valueContentEl = value ? value.getContentElement() : null;
|
|
507
|
+
if (valueContentEl) {
|
|
508
|
+
contentEl.setAttribute("aria-activedescendant", valueContentEl.getAttribute("id"));
|
|
509
|
+
} else {
|
|
510
|
+
contentEl.removeAttribute("aria-activedescendant");
|
|
511
|
+
}
|
|
494
512
|
},
|
|
495
513
|
|
|
496
514
|
|
|
@@ -506,6 +524,22 @@ qx.Class.define("qx.ui.menu.Menu",
|
|
|
506
524
|
}
|
|
507
525
|
},
|
|
508
526
|
|
|
527
|
+
// property apply
|
|
528
|
+
_applyOpener : function(value, old)
|
|
529
|
+
{
|
|
530
|
+
// ARIA attrs
|
|
531
|
+
const contentEl = this.getContentElement();
|
|
532
|
+
if (!contentEl) {
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
if (value && value.getContentElement()) {
|
|
536
|
+
contentEl.setAttribute("aria-labelledby", "");
|
|
537
|
+
this.addAriaLabelledBy(value);
|
|
538
|
+
} else {
|
|
539
|
+
contentEl.removeAttribute("aria-labelledby");
|
|
540
|
+
}
|
|
541
|
+
},
|
|
542
|
+
|
|
509
543
|
|
|
510
544
|
// property apply
|
|
511
545
|
_applyBlockerColor : function(value, old) {
|
|
@@ -681,6 +715,19 @@ qx.Class.define("qx.ui.menu.Menu",
|
|
|
681
715
|
EVENT HANDLING
|
|
682
716
|
---------------------------------------------------------------------------
|
|
683
717
|
*/
|
|
718
|
+
|
|
719
|
+
/**
|
|
720
|
+
* Gets called when a child is added. Sets ARIA attrs
|
|
721
|
+
* @param {*} child
|
|
722
|
+
*/
|
|
723
|
+
_afterAddChild: function (child) {
|
|
724
|
+
// Some childs, e.g. Seperators, are no meaningful menu items
|
|
725
|
+
if (child instanceof qx.ui.menu.AbstractButton) {
|
|
726
|
+
const contentEl = child.getContentElement();
|
|
727
|
+
contentEl.setAttribute("id", "menu-item-" + child.toHashCode());
|
|
728
|
+
contentEl.setAttribute("role", "menuitem");
|
|
729
|
+
}
|
|
730
|
+
},
|
|
684
731
|
|
|
685
732
|
/**
|
|
686
733
|
* Update position if the menu or the root is resized
|
|
@@ -790,6 +837,31 @@ qx.Class.define("qx.ui.menu.Menu",
|
|
|
790
837
|
mgr.cancelOpen(this.__scheduledOpen);
|
|
791
838
|
}
|
|
792
839
|
}
|
|
840
|
+
},
|
|
841
|
+
|
|
842
|
+
/*
|
|
843
|
+
---------------------------------------------------------------------------
|
|
844
|
+
HELPER FUNCTIONS
|
|
845
|
+
---------------------------------------------------------------------------
|
|
846
|
+
*/
|
|
847
|
+
|
|
848
|
+
/**
|
|
849
|
+
* Get the opener of the root/the first parent menu.
|
|
850
|
+
* parent menu.
|
|
851
|
+
*
|
|
852
|
+
* @return {qx.ui.core.Widget|null} The opener.
|
|
853
|
+
*/
|
|
854
|
+
__getRootOpener: function () {
|
|
855
|
+
let parentMenu = this.getParentMenu();
|
|
856
|
+
if (!parentMenu) {
|
|
857
|
+
return this.getOpener();
|
|
858
|
+
}
|
|
859
|
+
let opener;
|
|
860
|
+
while (parentMenu) {
|
|
861
|
+
opener = parentMenu.getOpener();
|
|
862
|
+
parentMenu = parentMenu.getParentMenu();
|
|
863
|
+
}
|
|
864
|
+
return opener;
|
|
793
865
|
}
|
|
794
866
|
},
|
|
795
867
|
|
|
@@ -44,6 +44,12 @@ qx.Class.define("qx.ui.menu.RadioButton",
|
|
|
44
44
|
{
|
|
45
45
|
this.base(arguments);
|
|
46
46
|
|
|
47
|
+
// ARIA attrs
|
|
48
|
+
// Important: (Grouped) radio btns should be children of a div with role 'radiogroup'
|
|
49
|
+
const contentEl = this.getContentElement();
|
|
50
|
+
contentEl.setAttribute("role", "radio");
|
|
51
|
+
contentEl.setAttribute("aria-checked", false);
|
|
52
|
+
|
|
47
53
|
// Initialize with incoming arguments
|
|
48
54
|
if (label != null) {
|
|
49
55
|
this.setLabel(label);
|
|
@@ -120,8 +126,11 @@ qx.Class.define("qx.ui.menu.RadioButton",
|
|
|
120
126
|
|
|
121
127
|
|
|
122
128
|
// property apply
|
|
123
|
-
_applyValue
|
|
129
|
+
_applyValue: function (value, old) {
|
|
124
130
|
value ? this.addState("checked") : this.removeState("checked");
|
|
131
|
+
|
|
132
|
+
// ARIA attrs
|
|
133
|
+
this.getContentElement().setAttribute("aria-checked", Boolean(value));
|
|
125
134
|
},
|
|
126
135
|
|
|
127
136
|
|
|
@@ -24,25 +24,6 @@ qx.Class.define("qx.ui.menubar.Button",
|
|
|
24
24
|
{
|
|
25
25
|
extend : qx.ui.form.MenuButton,
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
/*
|
|
30
|
-
*****************************************************************************
|
|
31
|
-
CONSTRUCTOR
|
|
32
|
-
*****************************************************************************
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
construct : function(label, icon, menu)
|
|
36
|
-
{
|
|
37
|
-
this.base(arguments, label, icon, menu);
|
|
38
|
-
|
|
39
|
-
this.removeListener("keydown", this._onKeyDown);
|
|
40
|
-
this.removeListener("keyup", this._onKeyUp);
|
|
41
|
-
},
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
27
|
/*
|
|
47
28
|
*****************************************************************************
|
|
48
29
|
PROPERTIES
|
|
@@ -62,17 +43,9 @@ qx.Class.define("qx.ui.menubar.Button",
|
|
|
62
43
|
refine : true,
|
|
63
44
|
init : "inherit"
|
|
64
45
|
},
|
|
65
|
-
|
|
66
|
-
focusable :
|
|
67
|
-
{
|
|
68
|
-
refine : true,
|
|
69
|
-
init : false
|
|
70
|
-
}
|
|
71
46
|
},
|
|
72
47
|
|
|
73
48
|
|
|
74
|
-
|
|
75
|
-
|
|
76
49
|
/*
|
|
77
50
|
*****************************************************************************
|
|
78
51
|
MEMBERS
|
|
@@ -22,8 +22,20 @@
|
|
|
22
22
|
qx.Class.define("qx.ui.menubar.MenuBar",
|
|
23
23
|
{
|
|
24
24
|
extend : qx.ui.toolbar.ToolBar,
|
|
25
|
+
|
|
26
|
+
/*
|
|
27
|
+
*****************************************************************************
|
|
28
|
+
CONSTRUCTOR
|
|
29
|
+
*****************************************************************************
|
|
30
|
+
*/
|
|
25
31
|
|
|
32
|
+
construct : function()
|
|
33
|
+
{
|
|
34
|
+
this.base(arguments);
|
|
26
35
|
|
|
36
|
+
// ARIA attrs
|
|
37
|
+
this.getContentElement().setAttribute("role", "menubar");
|
|
38
|
+
},
|
|
27
39
|
|
|
28
40
|
/*
|
|
29
41
|
*****************************************************************************
|
|
@@ -78,6 +78,9 @@ qx.Class.define("qx.ui.splitpane.Blocker",
|
|
|
78
78
|
|
|
79
79
|
// property apply
|
|
80
80
|
_applyOrientation : function(value, old) {
|
|
81
|
+
// ARIA attrs
|
|
82
|
+
this.setAttribute("aria-orientation", value);
|
|
83
|
+
|
|
81
84
|
if (value == "horizontal") {
|
|
82
85
|
this.setStyle("height", "100%");
|
|
83
86
|
this.setStyle("cursor", "col-resize");
|
|
@@ -226,6 +226,9 @@ qx.Class.define("qx.ui.splitpane.Pane",
|
|
|
226
226
|
*/
|
|
227
227
|
_applyOrientation : function(value, old)
|
|
228
228
|
{
|
|
229
|
+
// ARIA attrs
|
|
230
|
+
this.getContentElement().setAttribute("aria-orientation", value);
|
|
231
|
+
|
|
229
232
|
var slider = this.getChildControl("slider");
|
|
230
233
|
var splitter = this.getChildControl("splitter");
|
|
231
234
|
|
|
@@ -218,6 +218,9 @@ qx.Class.define("qx.ui.table.Table",
|
|
|
218
218
|
// properties.
|
|
219
219
|
tableModel.init(this);
|
|
220
220
|
}
|
|
221
|
+
|
|
222
|
+
// ARIA attrs
|
|
223
|
+
this.getContentElement().setAttribute("role", "grid");
|
|
221
224
|
},
|
|
222
225
|
|
|
223
226
|
|
|
@@ -753,6 +756,7 @@ qx.Class.define("qx.ui.table.Table",
|
|
|
753
756
|
|
|
754
757
|
__additionalStatusBarText : null,
|
|
755
758
|
__lastRowCount : null,
|
|
759
|
+
__lastColCount : null,
|
|
756
760
|
__internalChange : null,
|
|
757
761
|
|
|
758
762
|
__columnMenuButtons : null,
|
|
@@ -1399,6 +1403,19 @@ qx.Class.define("qx.ui.table.Table",
|
|
|
1399
1403
|
|
|
1400
1404
|
this._updateScrollBarVisibility();
|
|
1401
1405
|
this._updateStatusBar();
|
|
1406
|
+
|
|
1407
|
+
// ARIA attrs
|
|
1408
|
+
this.getContentElement().setAttribute("aria-rowcount", rowCount);
|
|
1409
|
+
}
|
|
1410
|
+
|
|
1411
|
+
const colCount = this.getTableModel().getColumnCount();
|
|
1412
|
+
|
|
1413
|
+
if (colCount != this.__lastColCount)
|
|
1414
|
+
{
|
|
1415
|
+
this.__lastColCount = colCount;
|
|
1416
|
+
|
|
1417
|
+
// ARIA attrs
|
|
1418
|
+
this.getContentElement().setAttribute("aria-colcount", colCount);
|
|
1402
1419
|
}
|
|
1403
1420
|
},
|
|
1404
1421
|
|
|
@@ -1703,6 +1720,10 @@ qx.Class.define("qx.ui.table.Table",
|
|
|
1703
1720
|
if (col != null && scrollVisible) {
|
|
1704
1721
|
this.scrollCellVisible(col, row);
|
|
1705
1722
|
}
|
|
1723
|
+
|
|
1724
|
+
// ARIA attrs
|
|
1725
|
+
const cellId = "qooxdoo-table-cell-" + this.toHashCode() + "-" + row + "-" + col;
|
|
1726
|
+
this.getContentElement().setAttribute("aria-activedescendant", cellId);
|
|
1706
1727
|
}
|
|
1707
1728
|
},
|
|
1708
1729
|
|
|
@@ -1805,8 +1826,9 @@ qx.Class.define("qx.ui.table.Table",
|
|
|
1805
1826
|
var col = this.__focusedCol;
|
|
1806
1827
|
var row = this.__focusedRow;
|
|
1807
1828
|
|
|
1808
|
-
// could also be undefined [BUG #4676]
|
|
1809
|
-
if (col
|
|
1829
|
+
// could also be undefined [BUG #4676]. In that case default to first cell focus
|
|
1830
|
+
if (col === null || col === undefined || row === null || row === undefined) {
|
|
1831
|
+
this.setFocusedCell(0, 0, true);
|
|
1810
1832
|
return;
|
|
1811
1833
|
}
|
|
1812
1834
|
|
|
@@ -168,7 +168,9 @@ qx.Class.define("qx.ui.table.cellrenderer.Abstract",
|
|
|
168
168
|
*/
|
|
169
169
|
_getCellAttributes : function(cellInfo)
|
|
170
170
|
{
|
|
171
|
-
|
|
171
|
+
const cellId = "qooxdoo-table-cell-" + cellInfo.table.toHashCode() + "-" + cellInfo.row + "-" + cellInfo.col;
|
|
172
|
+
const readOnly = cellInfo.editable !== null && cellInfo.editable !== undefined ? !cellInfo.editable : true;
|
|
173
|
+
return "id=" + cellId + " role=gridcell aria-readonly=" + readOnly;
|
|
172
174
|
},
|
|
173
175
|
|
|
174
176
|
|
|
@@ -255,12 +255,16 @@ qx.Class.define("qx.ui.table.cellrenderer.AbstractImage",
|
|
|
255
255
|
// overridden
|
|
256
256
|
_getCellAttributes : function(cellInfo)
|
|
257
257
|
{
|
|
258
|
-
|
|
258
|
+
let baseAttrs = this.base(arguments, cellInfo);
|
|
259
|
+
if (!baseAttrs) {
|
|
260
|
+
baseAttrs = "";
|
|
261
|
+
}
|
|
259
262
|
|
|
263
|
+
var tooltip = this.__imageData.tooltip;
|
|
260
264
|
if (tooltip) {
|
|
261
|
-
return "title='" + tooltip + "'";
|
|
265
|
+
return baseAttrs + " title='" + tooltip + "'";
|
|
262
266
|
} else {
|
|
263
|
-
return
|
|
267
|
+
return baseAttrs;
|
|
264
268
|
}
|
|
265
269
|
}
|
|
266
270
|
},
|
|
@@ -44,6 +44,10 @@ qx.Class.define("qx.ui.table.pane.Model",
|
|
|
44
44
|
this.base(arguments);
|
|
45
45
|
|
|
46
46
|
this.setTableColumnModel(tableColumnModel);
|
|
47
|
+
|
|
48
|
+
this.__defferedEventDispatcher = new qx.util.DeferredCall(function() {
|
|
49
|
+
this.fireEvent(qx.ui.table.pane.Model.EVENT_TYPE_MODEL_CHANGED);
|
|
50
|
+
}, this);
|
|
47
51
|
},
|
|
48
52
|
|
|
49
53
|
|
|
@@ -122,20 +126,21 @@ qx.Class.define("qx.ui.table.pane.Model",
|
|
|
122
126
|
{
|
|
123
127
|
__columnCount : null,
|
|
124
128
|
__tableColumnModel : null,
|
|
129
|
+
__defferedEventDispatcher : null,
|
|
125
130
|
|
|
126
131
|
|
|
127
132
|
// property modifier
|
|
128
133
|
_applyFirstColumnX : function(value, old)
|
|
129
134
|
{
|
|
130
135
|
this.__columnCount = null;
|
|
131
|
-
this.
|
|
136
|
+
this.__defferedEventDispatcher.schedule();
|
|
132
137
|
},
|
|
133
138
|
|
|
134
139
|
// property modifier
|
|
135
140
|
_applyMaxColumnCount : function(value, old)
|
|
136
141
|
{
|
|
137
142
|
this.__columnCount = null;
|
|
138
|
-
this.
|
|
143
|
+
this.__defferedEventDispatcher.schedule();
|
|
139
144
|
},
|
|
140
145
|
|
|
141
146
|
|
|
@@ -166,7 +171,7 @@ qx.Class.define("qx.ui.table.pane.Model",
|
|
|
166
171
|
{
|
|
167
172
|
this.__columnCount = null;
|
|
168
173
|
|
|
169
|
-
this.
|
|
174
|
+
this.__defferedEventDispatcher.schedule();
|
|
170
175
|
},
|
|
171
176
|
|
|
172
177
|
|
|
@@ -177,7 +182,7 @@ qx.Class.define("qx.ui.table.pane.Model",
|
|
|
177
182
|
*/
|
|
178
183
|
_onHeaderCellRendererChanged : function(evt)
|
|
179
184
|
{
|
|
180
|
-
this.
|
|
185
|
+
this.__defferedEventDispatcher.schedule();
|
|
181
186
|
},
|
|
182
187
|
|
|
183
188
|
|
|
@@ -305,5 +310,6 @@ qx.Class.define("qx.ui.table.pane.Model",
|
|
|
305
310
|
this.__tableColumnModel.removeListener("headerCellRendererChanged", this._onHeaderCellRendererChanged, this);
|
|
306
311
|
}
|
|
307
312
|
this.__tableColumnModel = null;
|
|
313
|
+
this._disposeObjects("__defferedEventDispatcher");
|
|
308
314
|
}
|
|
309
315
|
});
|
|
@@ -697,17 +697,13 @@ qx.Class.define("qx.ui.table.pane.Scroller",
|
|
|
697
697
|
{
|
|
698
698
|
this.__tablePane.onTableModelDataChanged(firstRow, lastRow, firstColumn, lastColumn);
|
|
699
699
|
var rowCount = this.getTable().getTableModel().getRowCount();
|
|
700
|
-
var colCount = this.__table.getTableColumnModel().getOverallColumnCount();
|
|
701
700
|
|
|
702
701
|
if (rowCount != this.__lastRowCount)
|
|
703
702
|
{
|
|
704
703
|
this.updateVerScrollBarMaximum();
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
this.setFocusedCell(this.getFocusedColumn()||0, 0);
|
|
709
|
-
}
|
|
710
|
-
else if (this.getFocusedRow() >= rowCount)
|
|
704
|
+
|
|
705
|
+
const focusedRow = this.getFocusedRow();
|
|
706
|
+
if (focusedRow !== null && focusedRow >= rowCount)
|
|
711
707
|
{
|
|
712
708
|
if (rowCount == 0) {
|
|
713
709
|
this.setFocusedCell(null, null);
|
|
@@ -54,6 +54,22 @@ qx.Class.define("qx.ui.tabview.Page",
|
|
|
54
54
|
this.setIcon(icon);
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
+
// ARIA attrs
|
|
58
|
+
const btn = this.getButton();
|
|
59
|
+
const pageId = "page-" + this.toHashCode();
|
|
60
|
+
const btnId = "btn-" + pageId + btn.toHashCode();
|
|
61
|
+
const contentEl = this.getContentElement();
|
|
62
|
+
contentEl.setAttribute("id", pageId);
|
|
63
|
+
contentEl.setAttribute("role", "tabpanel");
|
|
64
|
+
contentEl.setAttribute("aria-labelledBy", btnId);
|
|
65
|
+
contentEl.setAttribute("aria-expanded", false);
|
|
66
|
+
|
|
67
|
+
const btnContentEl = btn.getContentElement();
|
|
68
|
+
btnContentEl.setAttribute("id", btnId);
|
|
69
|
+
btnContentEl.setAttribute("role", "tab");
|
|
70
|
+
btnContentEl.setAttribute("aria-selected", false);
|
|
71
|
+
btnContentEl.setAttribute("aria-controls", pageId);
|
|
72
|
+
btn.addListener("changeValue", this._onBtnChangeValue, this);
|
|
57
73
|
},
|
|
58
74
|
|
|
59
75
|
|
|
@@ -224,6 +240,16 @@ qx.Class.define("qx.ui.tabview.Page",
|
|
|
224
240
|
return control || this.base(arguments, id);
|
|
225
241
|
},
|
|
226
242
|
|
|
243
|
+
/**
|
|
244
|
+
* Tab Change Listener
|
|
245
|
+
* @param {*} e
|
|
246
|
+
*/
|
|
247
|
+
_onBtnChangeValue: function (e) {
|
|
248
|
+
const val = e.getData();
|
|
249
|
+
this.getContentElement().setAttribute("aria-expanded", val, true); // Set third argument to true -> direct Update
|
|
250
|
+
this.getButton().getContentElement().setAttribute("aria-selected", val);
|
|
251
|
+
},
|
|
252
|
+
|
|
227
253
|
/*
|
|
228
254
|
---------------------------------------------------------------------------
|
|
229
255
|
PROPERTY APPLY
|
|
@@ -19,32 +19,12 @@
|
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* The normal toolbar button. Like a normal {@link qx.ui.form.Button}
|
|
22
|
-
* but with a style matching the toolbar
|
|
22
|
+
* but with a style matching the toolbar.
|
|
23
23
|
*/
|
|
24
24
|
qx.Class.define("qx.ui.toolbar.Button",
|
|
25
25
|
{
|
|
26
26
|
extend : qx.ui.form.Button,
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
/*
|
|
31
|
-
*****************************************************************************
|
|
32
|
-
CONSTRUCTOR
|
|
33
|
-
*****************************************************************************
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
construct : function(label, icon, command)
|
|
37
|
-
{
|
|
38
|
-
this.base(arguments, label, icon, command);
|
|
39
|
-
|
|
40
|
-
// Toolbar buttons should not support the keyboard events
|
|
41
|
-
this.removeListener("keydown", this._onKeyDown);
|
|
42
|
-
this.removeListener("keyup", this._onKeyUp);
|
|
43
|
-
},
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
28
|
/*
|
|
49
29
|
*****************************************************************************
|
|
50
30
|
PROPERTIES
|
|
@@ -64,12 +44,6 @@ qx.Class.define("qx.ui.toolbar.Button",
|
|
|
64
44
|
refine : true,
|
|
65
45
|
init : "inherit"
|
|
66
46
|
},
|
|
67
|
-
|
|
68
|
-
focusable :
|
|
69
|
-
{
|
|
70
|
-
refine : true,
|
|
71
|
-
init : false
|
|
72
|
-
}
|
|
73
47
|
},
|
|
74
48
|
|
|
75
49
|
members : {
|
|
@@ -84,3 +58,4 @@ qx.Class.define("qx.ui.toolbar.Button",
|
|
|
84
58
|
}
|
|
85
59
|
}
|
|
86
60
|
});
|
|
61
|
+
|
|
@@ -24,27 +24,6 @@ qx.Class.define("qx.ui.toolbar.CheckBox",
|
|
|
24
24
|
{
|
|
25
25
|
extend : qx.ui.form.ToggleButton,
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
/*
|
|
31
|
-
*****************************************************************************
|
|
32
|
-
CONSTRUCTOR
|
|
33
|
-
*****************************************************************************
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
construct : function(label, icon)
|
|
37
|
-
{
|
|
38
|
-
this.base(arguments, label, icon);
|
|
39
|
-
|
|
40
|
-
// Toolbar buttons should not support the keyboard events
|
|
41
|
-
this.removeListener("keydown", this._onKeyDown);
|
|
42
|
-
this.removeListener("keyup", this._onKeyUp);
|
|
43
|
-
},
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
27
|
/*
|
|
49
28
|
*****************************************************************************
|
|
50
29
|
PROPERTIES
|
|
@@ -64,12 +43,6 @@ qx.Class.define("qx.ui.toolbar.CheckBox",
|
|
|
64
43
|
refine : true,
|
|
65
44
|
init : "inherit"
|
|
66
45
|
},
|
|
67
|
-
|
|
68
|
-
focusable :
|
|
69
|
-
{
|
|
70
|
-
refine : true,
|
|
71
|
-
init : false
|
|
72
|
-
}
|
|
73
46
|
},
|
|
74
47
|
|
|
75
48
|
members : {
|