@qooxdoo/framework 7.8.0 → 7.9.0

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 (40) hide show
  1. package/Manifest.json +2 -2
  2. package/lib/compiler/compile-info.json +100 -98
  3. package/lib/compiler/index.js +2130 -1261
  4. package/lib/resource/qx/tool/website/build/404.html +3 -25
  5. package/lib/resource/qx/tool/website/build/about.html +3 -25
  6. package/lib/resource/qx/tool/website/build/assets/common.js +20 -0
  7. package/lib/resource/qx/tool/website/build/diagnostics/dependson.html +3 -25
  8. package/lib/resource/qx/tool/website/build/diagnostics/requiredby.html +3 -22
  9. package/lib/resource/qx/tool/website/build/index.html +3 -25
  10. package/lib/resource/qx/tool/website/partials/footer.html +3 -21
  11. package/lib/resource/qx/tool/website/partials/head.html +0 -1
  12. package/package.json +1 -1
  13. package/source/class/qx/Bootstrap.js +6 -3
  14. package/source/class/qx/Promise.js +93 -6964
  15. package/source/class/qx/core/Environment.js +1 -0
  16. package/source/class/qx/data/marshal/Json.js +64 -11
  17. package/source/class/qx/lang/Type.js +36 -3
  18. package/source/class/qx/promise/BluebirdImpl.js +6918 -0
  19. package/source/class/qx/promise/NativeWrapper.js +738 -0
  20. package/source/class/qx/test/Promise.js +1145 -22
  21. package/source/class/qx/test/data/controller/List.js +6 -0
  22. package/source/class/qx/test/data/marshal/Json.js +29 -0
  23. package/source/class/qx/test/io/request/Xhr.js +16 -0
  24. package/source/class/qx/test/lang/Type.js +151 -0
  25. package/source/class/qx/theme/indigo/ColorDark.js +1 -1
  26. package/source/class/qx/ui/core/MPlacement.js +18 -7
  27. package/source/class/qx/ui/table/pane/Scroller.js +1 -1
  28. package/source/class/qx/util/ConcurrencyLimiter.js +78 -0
  29. package/source/resource/qx/tool/website/build/404.html +3 -25
  30. package/source/resource/qx/tool/website/build/about.html +3 -25
  31. package/source/resource/qx/tool/website/build/assets/common.js +20 -0
  32. package/source/resource/qx/tool/website/build/diagnostics/dependson.html +3 -25
  33. package/source/resource/qx/tool/website/build/diagnostics/requiredby.html +3 -22
  34. package/source/resource/qx/tool/website/build/index.html +3 -25
  35. package/source/resource/qx/tool/website/partials/footer.html +3 -21
  36. package/source/resource/qx/tool/website/partials/head.html +0 -1
  37. package/lib/resource/qx/tool/website/build/assets/bluebird.min.js +0 -4615
  38. package/lib/resource/qx/tool/website/src/assets/bluebird.min.js +0 -4615
  39. package/source/resource/qx/tool/website/build/assets/bluebird.min.js +0 -4615
  40. package/source/resource/qx/tool/website/src/assets/bluebird.min.js +0 -4615
@@ -25,7 +25,13 @@ qx.Class.define("qx.test.data.controller.List", {
25
25
  include: qx.dev.unit.MMock,
26
26
 
27
27
  members: {
28
+ /**
29
+ * @type {qx.ui.form.List}
30
+ */
28
31
  __list: null,
32
+ /**
33
+ * @type {qx.data.controller.List}
34
+ */
29
35
  __controller: null,
30
36
  __data: null,
31
37
  __model: null,
@@ -1498,6 +1498,35 @@ qx.Class.define("qx.test.data.marshal.Json", {
1498
1498
 
1499
1499
  model.dispose();
1500
1500
  qx.Class.undefine("qx.test.Array");
1501
+ },
1502
+
1503
+ testNonPojoObjects() {
1504
+ function NativeClass() {
1505
+ this.foo = "bar";
1506
+ }
1507
+
1508
+ NativeClass.prototype.myMethod = function () {
1509
+ return "method";
1510
+ };
1511
+
1512
+ let data = {
1513
+ name: "Michael",
1514
+ nonPojo: new NativeClass()
1515
+ };
1516
+
1517
+ this.__marshaler.dispose();
1518
+ this.__marshaler = new qx.data.marshal.Json();
1519
+ this.__marshaler.toClass(data);
1520
+ var model = this.__marshaler.toModel(data);
1521
+
1522
+ this.assertEquals("Michael", model.getName());
1523
+
1524
+ if (qx.core.Environment.get("qx.data.marshal.Json.breakOnNonPojos")) {
1525
+ this.assertEquals("method", model.getNonPojo().myMethod());
1526
+ this.assertEquals("bar", model.getNonPojo().foo);
1527
+ } else {
1528
+ this.assertEquals("bar", model.getNonPojo().getFoo());
1529
+ }
1501
1530
  }
1502
1531
  }
1503
1532
  });
@@ -760,6 +760,12 @@ qx.Class.define("qx.test.io.request.Xhr", {
760
760
  this.skip("Skipping because qx.promise==false");
761
761
  }
762
762
 
763
+ if (qx.core.Environment.get("qx.Promise.useNativePromise")) {
764
+ this.skip(
765
+ "Skipping because qx.Promise.useNativePromise===true, meaning we can't cancel promises."
766
+ );
767
+ }
768
+
763
769
  this.setUpFakeTransport();
764
770
  var req = this.req;
765
771
 
@@ -818,6 +824,11 @@ qx.Class.define("qx.test.io.request.Xhr", {
818
824
  if (!qx.core.Environment.get("qx.promise")) {
819
825
  this.skip("Skipping because qx.promise==false");
820
826
  }
827
+ if (qx.core.Environment.get("qx.Promise.useNativePromise")) {
828
+ this.skip(
829
+ "Skipping because qx.Promise.useNativePromise===true, meaning we can't cancel promises."
830
+ );
831
+ }
821
832
 
822
833
  this.setUpFakeTransport();
823
834
  var req = this.req;
@@ -863,6 +874,11 @@ qx.Class.define("qx.test.io.request.Xhr", {
863
874
  if (!qx.core.Environment.get("qx.promise")) {
864
875
  this.skip("Skipping because qx.promise==false");
865
876
  }
877
+ if (qx.core.Environment.get("qx.Promise.useNativePromise")) {
878
+ this.skip(
879
+ "Skipping because qx.Promise.useNativePromise===true, meaning we can't cancel promises."
880
+ );
881
+ }
866
882
 
867
883
  this.setUpFakeTransport();
868
884
  var req = this.req;
@@ -42,6 +42,156 @@ qx.Class.define("qx.test.lang.Type", {
42
42
  this.assertFalse(Type.isString(document.getElementById("ReturenedNull")));
43
43
  },
44
44
 
45
+ testIsPojo() {
46
+ var isPojo = qx.lang.Type.isPojo;
47
+
48
+ //Class Person extends Object
49
+ function Person() {
50
+ this.name = "Mary";
51
+ this.surname = "Berry";
52
+ }
53
+
54
+ Person.prototype.getFullName = function () {
55
+ return this.name + " " + this.surname;
56
+ };
57
+
58
+ Person.prototype.properties = function () {
59
+ return "Properties";
60
+ };
61
+
62
+ //Class Child extends Person
63
+ function Child() {
64
+ Person.call(this);
65
+ }
66
+
67
+ Child.prototype = Object.create(Person.prototype);
68
+ Child.prototype.constructor = Child;
69
+
70
+ Child.prototype.childMethod = function () {
71
+ return "Child method";
72
+ };
73
+
74
+ // Simple POJO, should return true
75
+ this.assertTrue(isPojo({ foo: 1 }));
76
+
77
+ //Arrays, strings, numbers, and booleans are not POJOs
78
+ this.assertFalse(isPojo([]));
79
+ this.assertFalse(isPojo(null));
80
+ this.assertFalse(isPojo(new qx.data.Array()));
81
+ this.assertFalse(isPojo("hello"));
82
+ this.assertFalse(isPojo(12));
83
+ this.assertFalse(isPojo(true));
84
+
85
+ //Class instance which does not inherit
86
+ var nonInheritance = new Person();
87
+ this.assertFalse(isPojo(nonInheritance));
88
+
89
+ //Class instance with class that inherits
90
+ var withInheritance = new Child();
91
+ this.assertFalse(isPojo(withInheritance));
92
+
93
+ //POJO with class prototype
94
+ var pojoWithClassPrototype = { age: 22 };
95
+ Object.setPrototypeOf(pojoWithClassPrototype, Person.prototype);
96
+ this.assertFalse(isPojo(pojoWithClassPrototype));
97
+
98
+ //POJO with an object prototype
99
+ //Should return true
100
+ var pojoWithObjectPrototype = { extraproperty: "Nuts" };
101
+ var proto = {
102
+ protoMethod() {
103
+ return "protomethod";
104
+ }
105
+ };
106
+ Object.setPrototypeOf(pojoWithObjectPrototype, proto);
107
+ this.assertTrue(isPojo(pojoWithObjectPrototype));
108
+
109
+ //Object which has a POJO prototype, which in turn has a class prototype
110
+ //Should return false
111
+ var prototypeIsObjectThenConstructor = { extraproperty: "Nuts" };
112
+ var proto = {
113
+ protoMethod() {
114
+ return "protomethod";
115
+ }
116
+ };
117
+
118
+ Object.setPrototypeOf(prototypeIsObjectThenConstructor, proto);
119
+ Object.setPrototypeOf(proto, Person.prototype);
120
+ this.assertFalse(isPojo(prototypeIsObjectThenConstructor));
121
+
122
+ //Object which has a POJO prototype, which in turn has a POJO prototype
123
+ //Should return true
124
+ var obj = {
125
+ nuts: 345
126
+ };
127
+
128
+ var proto1 = {
129
+ myMethod() {
130
+ return "proto1.myMethod";
131
+ }
132
+ };
133
+
134
+ Object.setPrototypeOf(obj, proto1);
135
+ var proto2 = {
136
+ myMethod() {
137
+ return "proto2.myMethod";
138
+ },
139
+
140
+ method2() {
141
+ return "proto2.method2";
142
+ }
143
+ };
144
+
145
+ Object.setPrototypeOf(proto1, proto2);
146
+
147
+ this.assertEquals("proto1.myMethod", obj.myMethod());
148
+ this.assertEquals("proto2.method2", obj.method2());
149
+ this.assertTrue(isPojo(obj));
150
+
151
+ //Object which is instance of a class, where the class has a prototype which is not Object.prototype
152
+ //Must return false
153
+ function NonObjectPrototype() {
154
+ this.foo = "foo";
155
+ }
156
+
157
+ var proto = {
158
+ myMethod() {
159
+ return "proto.myMethod";
160
+ }
161
+ };
162
+
163
+ NonObjectPrototype.prototype = proto;
164
+ NonObjectPrototype.prototype.constructor = NonObjectPrototype;
165
+ NonObjectPrototype.prototype.extraMethod = function () {
166
+ return "extraMethod";
167
+ };
168
+
169
+ var obj = new NonObjectPrototype();
170
+
171
+ this.assertEquals("proto.myMethod", obj.myMethod());
172
+ this.assertEquals("extraMethod", obj.extraMethod());
173
+ this.assertEquals("foo", obj.foo);
174
+ this.assertFalse(isPojo(obj));
175
+
176
+ //Qooxdoo objects must not be POJOs
177
+ var obj = new qx.core.Object();
178
+ this.assertFalse(isPojo(obj));
179
+
180
+ //ES6 class must not be a POJO
181
+ class ES6Class {
182
+ constructor() {
183
+ this.foo = "bar";
184
+ }
185
+
186
+ method() {
187
+ return "method: " + this.foo;
188
+ }
189
+ }
190
+
191
+ var obj = new ES6Class();
192
+ this.assertFalse(isPojo(obj));
193
+ },
194
+
45
195
  testIsArray() {
46
196
  var Type = qx.lang.Type;
47
197
 
@@ -64,6 +214,7 @@ qx.Class.define("qx.test.lang.Type", {
64
214
  },
65
215
 
66
216
  testIsObject() {
217
+ //note: old testIsObject
67
218
  var Type = qx.lang.Type;
68
219
 
69
220
  this.assertTrue(Type.isObject({}));
@@ -95,7 +95,7 @@ qx.Theme.define("qx.theme.indigo.ColorDark", {
95
95
  // used in table code
96
96
  "table-header-cell": "#ebeadb",
97
97
  "table-row-background-focused-selected": "#666666",
98
- "table-row-background-focused": "#666666",
98
+ "table-row-background-focused": "#444444",
99
99
  "table-row-background-selected": "#666666",
100
100
  "table-row-background-even": "#333333",
101
101
  "table-row-background-odd": "#333333",
@@ -205,6 +205,7 @@ qx.Mixin.define("qx.ui.core.MPlacement", {
205
205
  __ptwLiveUpdateDisappearListener: null,
206
206
  /**@type {Record<"top" | "right" | "bottom" | "left", number> | null}*/
207
207
  __lastKnownCoords: null,
208
+ __lastKnownSize: null,
208
209
 
209
210
  /**
210
211
  * Returns the location data like {qx.bom.element.Location#get} does,
@@ -378,17 +379,23 @@ qx.Mixin.define("qx.ui.core.MPlacement", {
378
379
 
379
380
  var coords =
380
381
  target.getContentLocation() || this.getLayoutLocation(target);
382
+ var size = this.__getPlacementSize();
381
383
 
382
384
  if (coords != null) {
383
- if (
384
- coords.top === this.__lastKnownCoords?.top &&
385
- coords.right === this.__lastKnownCoords?.right &&
386
- coords.bottom === this.__lastKnownCoords?.bottom &&
387
- coords.left === this.__lastKnownCoords?.left
388
- ) {
385
+
386
+ const boundsAreEqual = (bound1, bound2) => bound1 && bound2 &&
387
+ bound1.top === bound2.top &&
388
+ bound1.right === bound2.right &&
389
+ bound1.bottom === bound2.bottom &&
390
+ bound1.left === bound2.left;
391
+
392
+ if (boundsAreEqual(coords, this.__lastKnownCoords) &&
393
+ boundsAreEqual(size, this.__lastKnownSize)) {
389
394
  return true;
390
395
  }
396
+
391
397
  this.__lastKnownCoords = coords;
398
+ this.__lastKnownSize = size;
392
399
  this._place(coords);
393
400
  return true;
394
401
  } else {
@@ -527,7 +534,7 @@ qx.Mixin.define("qx.ui.core.MPlacement", {
527
534
  * <code>_computePlacementSize</code>, which returns the size.
528
535
  *
529
536
  * @param callback {Function} This function will be called with the size as
530
- * first argument
537
+ * first argument. If it is null, the size is returned directly.
531
538
  */
532
539
  __getPlacementSize(callback) {
533
540
  var size = null;
@@ -538,6 +545,10 @@ qx.Mixin.define("qx.ui.core.MPlacement", {
538
545
  var size = this.getBounds();
539
546
  }
540
547
 
548
+ if (!callback) {
549
+ return {...size};
550
+ }
551
+
541
552
  if (size == null) {
542
553
  this.addListenerOnce("appear", () => {
543
554
  this.__getPlacementSize(callback);
@@ -1975,7 +1975,7 @@ qx.Class.define("qx.ui.table.pane.Scroller", {
1975
1975
  qx.event.Timer.once(function() {
1976
1976
  this._cellEditor.addListenerOnce('blur', this._onBlurCellEditorStopEditing, this);
1977
1977
  this.debug('added BLUR listener to hash: ' + this._cellEditor.$$hash);
1978
- }, this, 0);
1978
+ }, this, 1);
1979
1979
  },
1980
1980
 
1981
1981
  /**
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Utility class to limit the number of concurrent executions of async functions.
3
+ *
4
+ * @typedef {Object} TaskEntry
5
+ * @template T
6
+ * @property {() => Promise<T>} task The function to execute.
7
+ * @property {(value: T) => void} resolve The function to call when the task resolves.
8
+ * @property {(reason: any) => void} reject The function to call when the task rejects.
9
+ */
10
+ qx.Class.define("qx.util.ConcurrencyLimiter", {
11
+ extend: qx.core.Object,
12
+
13
+ /**
14
+ * @param {Number?Infinity} limit The maximum number of concurrent executions. If Infinity, no limit is applied.
15
+ */
16
+ construct(limit = Infinity) {
17
+ super();
18
+ this.__limit = limit;
19
+
20
+ this.__queue = [];
21
+ this.__running = 0;
22
+ },
23
+
24
+ members: {
25
+ /**
26
+ * @type {TaskEntry<*>[]}
27
+ * The tasks that are waiting to be executed
28
+ */
29
+ __queue: null,
30
+
31
+ /**
32
+ * Number of currently running tasks.
33
+ */
34
+ __running: null,
35
+
36
+ /**
37
+ * Queues a function to be executed.
38
+ * If the limit is reached, the function will be put on hold until a slot is available.
39
+ *
40
+ * @template T
41
+ * @param {() => Promise<T>} task The function to execute.
42
+ * @returns {Promise<T>} The promise that will be resolved when the function is executed.
43
+ * If the function rejects, the promise will also reject.
44
+ */
45
+ add(task) {
46
+ return new Promise((resolve, reject) => {
47
+ this.__queue.push({ task, resolve, reject });
48
+ this.__checkQueue();
49
+ });
50
+ },
51
+
52
+ /**
53
+ * Checks the queue to see if anything can be executed,
54
+ * and executes the next item in the queue if the limit is not reached.
55
+ * Once the item has finished executing, it will check the queue again.
56
+ */
57
+ __checkQueue() {
58
+ if (this.__running == this.__limit) {
59
+ return;
60
+ }
61
+
62
+ let next = this.__queue.shift();
63
+ if (!next) {
64
+ return;
65
+ }
66
+
67
+ let { task, resolve, reject } = next;
68
+
69
+ this.__running++;
70
+ task()
71
+ .then(resolve, reject)
72
+ .finally(() => {
73
+ this.__running--;
74
+ this.__checkQueue();
75
+ });
76
+ }
77
+ }
78
+ });
@@ -18,7 +18,6 @@
18
18
  <title>Qooxdoo Application Server</title>
19
19
  <meta name="description" content="">
20
20
  <link rel="stylesheet" type="text/css" href="/qooxdoo.css">
21
- <script type="text/javascript" src="/assets/bluebird.min.js"></script>
22
21
  <script type="text/javascript" src="/assets/jquery.js"></script>
23
22
  <script type="text/javascript" src="/scripts/serve.js"></script>
24
23
  </head>
@@ -201,11 +200,11 @@
201
200
  </div>
202
201
  <div class="container text-center d-none d-sm-block p-4">
203
202
  <img class="img p-4" src="/assets/qx-white.svg">
204
- <span class="text-light">&copy; 2005-2018 Qooxdoo Contributors</span>
203
+ <span class="text-light">&copy; 2005-<span class="current-year"></span> Qooxdoo Contributors</span>
205
204
  </div>
206
205
  <div class="container text-center d-block d-sm-none p-4">
207
206
  <img class="img-fluid p-4" src="/assets/qx-white.svg">
208
- <p>&copy; 2005-2017 Qooxdoo Contributors</p>
207
+ <p>&copy; 2005-<span class="current-year"></span> Qooxdoo Contributors</p>
209
208
  </div>
210
209
  </div>
211
210
 
@@ -213,28 +212,7 @@
213
212
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
214
213
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
215
214
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/js/bootstrap.min.js" integrity="sha384-a5N7Y/aK3qNeh15eJKGWxsqtnX/wWdSZSKp+81YjTmS15nvnvxKHuzaWwXHDli+4" crossorigin="anonymous"></script>
216
- <script type="text/javascript">
217
- $(function () {
218
- $('[data-toggle="tooltip"]').tooltip()
219
- })
220
- var scroll = (function (event) {
221
- var scroll = $(window).scrollTop();
222
- if (scroll < 250) {
223
- $(navigatopnBar).css('background-color', 'transparent');
224
- $(navigationLogo).css('width', '0');
225
- $(navigationLogo).addClass('invisible');
226
- } else {
227
- $(navigatopnBar).css('background-color', 'rgba(0, 40, 56, 0.9)');
228
- $(navigationLogo).css('width', '');
229
- $(navigationLogo).removeClass('invisible');
230
- }
231
- });
232
- $(window).scroll(scroll);
233
- scroll();
234
- </script>
235
-
236
-
237
-
215
+ <script src="/assets/common.js" type="text/javascript"></script>
238
216
  </body>
239
217
 
240
218
  </html>
@@ -18,7 +18,6 @@
18
18
  <title>About</title>
19
19
  <meta name="description" content="">
20
20
  <link rel="stylesheet" type="text/css" href="/qooxdoo.css">
21
- <script type="text/javascript" src="/assets/bluebird.min.js"></script>
22
21
  <script type="text/javascript" src="/assets/jquery.js"></script>
23
22
  <script type="text/javascript" src="/scripts/serve.js"></script>
24
23
  </head>
@@ -184,11 +183,11 @@
184
183
  </div>
185
184
  <div class="container text-center d-none d-sm-block p-4">
186
185
  <img class="img p-4" src="/assets/qx-white.svg">
187
- <span class="text-light">&copy; 2005-2018 Qooxdoo Contributors</span>
186
+ <span class="text-light">&copy; 2005-<span class="current-year"></span> Qooxdoo Contributors</span>
188
187
  </div>
189
188
  <div class="container text-center d-block d-sm-none p-4">
190
189
  <img class="img-fluid p-4" src="/assets/qx-white.svg">
191
- <p>&copy; 2005-2017 Qooxdoo Contributors</p>
190
+ <p>&copy; 2005-<span class="current-year"></span> Qooxdoo Contributors</p>
192
191
  </div>
193
192
  </div>
194
193
 
@@ -196,28 +195,7 @@
196
195
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
197
196
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
198
197
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/js/bootstrap.min.js" integrity="sha384-a5N7Y/aK3qNeh15eJKGWxsqtnX/wWdSZSKp+81YjTmS15nvnvxKHuzaWwXHDli+4" crossorigin="anonymous"></script>
199
- <script type="text/javascript">
200
- $(function () {
201
- $('[data-toggle="tooltip"]').tooltip()
202
- })
203
- var scroll = (function (event) {
204
- var scroll = $(window).scrollTop();
205
- if (scroll < 250) {
206
- $(navigatopnBar).css('background-color', 'transparent');
207
- $(navigationLogo).css('width', '0');
208
- $(navigationLogo).addClass('invisible');
209
- } else {
210
- $(navigatopnBar).css('background-color', 'rgba(0, 40, 56, 0.9)');
211
- $(navigationLogo).css('width', '');
212
- $(navigationLogo).removeClass('invisible');
213
- }
214
- });
215
- $(window).scroll(scroll);
216
- scroll();
217
- </script>
218
-
219
-
220
-
198
+ <script src="/assets/common.js" type="text/javascript"></script>
221
199
  </body>
222
200
 
223
201
  </html>
@@ -0,0 +1,20 @@
1
+ var currentYear = new Date().getFullYear();
2
+ $(".current-year").text(currentYear);
3
+
4
+ $(function () {
5
+ $('[data-toggle="tooltip"]').tooltip();
6
+ })
7
+ var scroll = (function (event) {
8
+ var scroll = $(window).scrollTop();
9
+ if (scroll < 250) {
10
+ $(navigatopnBar).css('background-color', 'transparent');
11
+ $(navigationLogo).css('width', '0');
12
+ $(navigationLogo).addClass('invisible');
13
+ } else {
14
+ $(navigatopnBar).css('background-color', 'rgba(0, 40, 56, 0.9)');
15
+ $(navigationLogo).css('width', '');
16
+ $(navigationLogo).removeClass('invisible');
17
+ }
18
+ });
19
+ $(window).scroll(scroll);
20
+ scroll();
@@ -18,7 +18,6 @@
18
18
  <title>Qooxdoo Application Server</title>
19
19
  <meta name="description" content="">
20
20
  <link rel="stylesheet" type="text/css" href="/qooxdoo.css">
21
- <script type="text/javascript" src="/assets/bluebird.min.js"></script>
22
21
  <script type="text/javascript" src="/assets/jquery.js"></script>
23
22
  <script type="text/javascript" src="/scripts/serve.js"></script>
24
23
  </head>
@@ -196,11 +195,11 @@
196
195
  </div>
197
196
  <div class="container text-center d-none d-sm-block p-4">
198
197
  <img class="img p-4" src="/assets/qx-white.svg">
199
- <span class="text-light">&copy; 2005-2018 Qooxdoo Contributors</span>
198
+ <span class="text-light">&copy; 2005-<span class="current-year"></span> Qooxdoo Contributors</span>
200
199
  </div>
201
200
  <div class="container text-center d-block d-sm-none p-4">
202
201
  <img class="img-fluid p-4" src="/assets/qx-white.svg">
203
- <p>&copy; 2005-2017 Qooxdoo Contributors</p>
202
+ <p>&copy; 2005-<span class="current-year"></span> Qooxdoo Contributors</p>
204
203
  </div>
205
204
  </div>
206
205
 
@@ -208,28 +207,7 @@
208
207
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
209
208
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
210
209
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/js/bootstrap.min.js" integrity="sha384-a5N7Y/aK3qNeh15eJKGWxsqtnX/wWdSZSKp+81YjTmS15nvnvxKHuzaWwXHDli+4" crossorigin="anonymous"></script>
211
- <script type="text/javascript">
212
- $(function () {
213
- $('[data-toggle="tooltip"]').tooltip()
214
- })
215
- var scroll = (function (event) {
216
- var scroll = $(window).scrollTop();
217
- if (scroll < 250) {
218
- $(navigatopnBar).css('background-color', 'transparent');
219
- $(navigationLogo).css('width', '0');
220
- $(navigationLogo).addClass('invisible');
221
- } else {
222
- $(navigatopnBar).css('background-color', 'rgba(0, 40, 56, 0.9)');
223
- $(navigationLogo).css('width', '');
224
- $(navigationLogo).removeClass('invisible');
225
- }
226
- });
227
- $(window).scroll(scroll);
228
- scroll();
229
- </script>
230
-
231
-
232
-
210
+ <script src="/assets/common.js" type="text/javascript"></script>
233
211
  </body>
234
212
 
235
213
  </html>
@@ -18,7 +18,6 @@
18
18
  <title>Qooxdoo Application Server</title>
19
19
  <meta name="description" content="">
20
20
  <link rel="stylesheet" type="text/css" href="/qooxdoo.css">
21
- <script type="text/javascript" src="/assets/bluebird.min.js"></script>
22
21
  <script type="text/javascript" src="/assets/jquery.js"></script>
23
22
  <script type="text/javascript" src="/scripts/serve.js"></script>
24
23
  </head>
@@ -198,11 +197,11 @@
198
197
  </div>
199
198
  <div class="container text-center d-none d-sm-block p-4">
200
199
  <img class="img p-4" src="/assets/qx-white.svg">
201
- <span class="text-light">&copy; 2005-2018 Qooxdoo Contributors</span>
200
+ <span class="text-light">&copy; 2005-<span class="current-year"></span> Qooxdoo Contributors</span>
202
201
  </div>
203
202
  <div class="container text-center d-block d-sm-none p-4">
204
203
  <img class="img-fluid p-4" src="/assets/qx-white.svg">
205
- <p>&copy; 2005-2017 Qooxdoo Contributors</p>
204
+ <p>&copy; 2005-<span class="current-year"></span> Qooxdoo Contributors</p>
206
205
  </div>
207
206
  </div>
208
207
 
@@ -210,25 +209,7 @@
210
209
  <!-- jQuery first, then Popper.js, then Bootstrap JS -->
211
210
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
212
211
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.3/js/bootstrap.min.js" integrity="sha384-a5N7Y/aK3qNeh15eJKGWxsqtnX/wWdSZSKp+81YjTmS15nvnvxKHuzaWwXHDli+4" crossorigin="anonymous"></script>
213
- <script type="text/javascript">
214
- $(function () {
215
- $('[data-toggle="tooltip"]').tooltip()
216
- })
217
- var scroll = (function (event) {
218
- var scroll = $(window).scrollTop();
219
- if (scroll < 250) {
220
- $(navigatopnBar).css('background-color', 'transparent');
221
- $(navigationLogo).css('width', '0');
222
- $(navigationLogo).addClass('invisible');
223
- } else {
224
- $(navigatopnBar).css('background-color', 'rgba(0, 40, 56, 0.9)');
225
- $(navigationLogo).css('width', '');
226
- $(navigationLogo).removeClass('invisible');
227
- }
228
- });
229
- $(window).scroll(scroll);
230
- scroll();
231
- </script>
212
+ <script src="/assets/common.js" type="text/javascript"></script>
232
213
 
233
214
 
234
215