mediawiki/extensions/VisualData (main)

sourcepatches
From 9a966cb1dbb931ea1d92eb9c0f9b8d78aa575119 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Sat, 27 Apr 2024 13:31:04 +0000
Subject: [PATCH] build: Updating dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

composer:
* php-parallel-lint/php-parallel-lint: 1.3.2 → 1.4.0

npm:
* eslint-config-wikimedia: 0.26.0 → 0.27.0

Change-Id: I4cf36e90ad86ad74f16b4bb9892d831a88eec1b9
---
 composer.json                        |   2 +-
 package-lock.json                    | 671 +++++++++++++--------------
 package.json                         |   2 +-
 resources/VisualDataForms.js         |   2 -
 resources/VisualDataProcessModel.js  |   1 -
 resources/VisualDataWindowManager.js |   1 -
 6 files changed, 330 insertions(+), 349 deletions(-)

diff --git a/composer.json b/composer.json
index 65986e5..4efdbba 100644
--- a/composer.json
+++ b/composer.json
@@ -3,7 +3,7 @@
 		"mediawiki/mediawiki-codesniffer": "43.0.0",
 		"mediawiki/minus-x": "1.1.1",
 		"php-parallel-lint/php-console-highlighter": "1.0.0",
-		"php-parallel-lint/php-parallel-lint": "1.3.2"
+		"php-parallel-lint/php-parallel-lint": "1.4.0"
 	},
 	"scripts": {
 		"test": [
diff --git a/package-lock.json b/package-lock.json
index 7fffced..1a12473 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,7 +6,7 @@
 		"": {
 			"name": "VisualData",
 			"devDependencies": {
-				"eslint-config-wikimedia": "0.26.0",
+				"eslint-config-wikimedia": "0.27.0",
 				"grunt": "1.6.1",
 				"grunt-banana-checker": "0.11.1",
 				"grunt-eslint": "24.3.0",
@@ -288,17 +288,17 @@
 			}
 		},
 		"node_modules/@es-joy/jsdoccomment": {
-			"version": "0.37.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz",
-			"integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==",
+			"version": "0.42.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz",
+			"integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==",
 			"dev": true,
 			"dependencies": {
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"esquery": "^1.5.0",
 				"jsdoc-type-pratt-parser": "~4.0.0"
 			},
 			"engines": {
-				"node": "^14 || ^16 || ^17 || ^18 || ^19 || ^20"
+				"node": ">=16"
 			}
 		},
 		"node_modules/@eslint-community/eslint-utils": {
@@ -349,22 +349,22 @@
 			}
 		},
 		"node_modules/@eslint/js": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
-			"integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true,
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
 			}
 		},
 		"node_modules/@humanwhocodes/config-array": {
-			"version": "0.11.13",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
-			"integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+			"version": "0.11.14",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+			"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
 			"dev": true,
 			"dependencies": {
-				"@humanwhocodes/object-schema": "^2.0.1",
-				"debug": "^4.1.1",
+				"@humanwhocodes/object-schema": "^2.0.2",
+				"debug": "^4.3.1",
 				"minimatch": "^3.0.5"
 			},
 			"engines": {
@@ -385,9 +385,9 @@
 			}
 		},
 		"node_modules/@humanwhocodes/object-schema": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
-			"integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+			"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
 			"dev": true
 		},
 		"node_modules/@mdn/browser-compat-data": {
@@ -456,9 +456,9 @@
 			"dev": true
 		},
 		"node_modules/@types/semver": {
-			"version": "7.5.6",
-			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
-			"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+			"version": "7.5.8",
+			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+			"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
 			"dev": true
 		},
 		"node_modules/@typescript-eslint/scope-manager": {
@@ -775,9 +775,9 @@
 			}
 		},
 		"node_modules/browserslist": {
-			"version": "4.22.2",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
-			"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -794,8 +794,8 @@
 				}
 			],
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001565",
-				"electron-to-chromium": "^1.4.601",
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
 				"node-releases": "^2.0.14",
 				"update-browserslist-db": "^1.0.13"
 			},
@@ -807,9 +807,9 @@
 			}
 		},
 		"node_modules/browserslist-config-wikimedia": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.1.tgz",
-			"integrity": "sha512-jf532fUf/gaxiKdHgGCQUT552P5up3RpG+CzLixOQBJ5FwDmYQSRLYHCFUA9s3KMOHh4P3xVp+NUaGNxvtoT9g==",
+			"version": "0.6.1",
+			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.6.1.tgz",
+			"integrity": "sha512-F3O+12ud7ZwBaiB/RZIMGDgz3nEuXz8RhtdPB4Lkd/WVP5Vy77EqBWRMz4vJ64x8LTTH3BOaHCD2ZuUcgShqyQ==",
 			"dev": true
 		},
 		"node_modules/builtin-modules": {
@@ -825,9 +825,9 @@
 			}
 		},
 		"node_modules/builtins": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
-			"integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
+			"version": "5.1.0",
+			"resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz",
+			"integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==",
 			"dev": true,
 			"dependencies": {
 				"semver": "^7.0.0"
@@ -885,9 +885,9 @@
 			}
 		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001570",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz",
-			"integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==",
+			"version": "1.0.30001612",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz",
+			"integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==",
 			"dev": true,
 			"funding": [
 				{
@@ -921,9 +921,9 @@
 			}
 		},
 		"node_modules/ci-info": {
-			"version": "3.9.0",
-			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
-			"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+			"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
 			"dev": true,
 			"funding": [
 				{
@@ -1001,9 +1001,9 @@
 			}
 		},
 		"node_modules/comment-parser": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz",
-			"integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==",
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true,
 			"engines": {
 				"node": ">= 12.0.0"
@@ -1015,6 +1015,19 @@
 			"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 			"dev": true
 		},
+		"node_modules/core-js-compat": {
+			"version": "3.37.0",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz",
+			"integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==",
+			"dev": true,
+			"dependencies": {
+				"browserslist": "^4.23.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/core-js"
+			}
+		},
 		"node_modules/core-util-is": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -1342,9 +1355,9 @@
 			}
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.4.615",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz",
-			"integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==",
+			"version": "1.4.750",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.750.tgz",
+			"integrity": "sha512-9ItEpeu15hW5m8jKdriL+BQrgwDTXEL9pn4SkillWFu73ZNNNQ2BKKLS+ZHv2vC9UkNhosAeyfxOf/5OSeTCPA==",
 			"dev": true
 		},
 		"node_modules/emoji-regex": {
@@ -1396,16 +1409,16 @@
 			}
 		},
 		"node_modules/eslint": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
-			"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.2.0",
 				"@eslint-community/regexpp": "^4.6.1",
 				"@eslint/eslintrc": "^2.1.4",
-				"@eslint/js": "8.56.0",
-				"@humanwhocodes/config-array": "^0.11.13",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
 				"@ungap/structured-clone": "^1.2.0",
@@ -1451,10 +1464,13 @@
 			}
 		},
 		"node_modules/eslint-compat-utils": {
-			"version": "0.1.2",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz",
-			"integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==",
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz",
+			"integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==",
 			"dev": true,
+			"dependencies": {
+				"semver": "^7.5.4"
+			},
 			"engines": {
 				"node": ">=12"
 			},
@@ -1463,28 +1479,28 @@
 			}
 		},
 		"node_modules/eslint-config-wikimedia": {
-			"version": "0.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz",
-			"integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==",
+			"version": "0.27.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.27.0.tgz",
+			"integrity": "sha512-KkZ54+MUnggz17C/RCEMXQSpiiqZRF7p9fjrz4phaaeKlTrjg0B+QbM5zcDWcjGiAWaJUptHaH17+RZldadkUw==",
 			"dev": true,
 			"dependencies": {
-				"browserslist-config-wikimedia": "^0.5.1",
-				"eslint": "^8.53.0",
+				"browserslist-config-wikimedia": "^0.6.1",
+				"eslint": "^8.57.0",
 				"eslint-plugin-compat": "^4.2.0",
-				"eslint-plugin-es-x": "^7.3.0",
-				"eslint-plugin-jest": "^27.6.0",
-				"eslint-plugin-jsdoc": "^42.0.0",
+				"eslint-plugin-es-x": "^7.6.0",
+				"eslint-plugin-jest": "^27.9.0",
+				"eslint-plugin-jsdoc": "48.2.1",
 				"eslint-plugin-json-es": "^1.5.7",
-				"eslint-plugin-mediawiki": "^0.5.0",
-				"eslint-plugin-mocha": "^10.2.0",
-				"eslint-plugin-n": "^16.0.1",
+				"eslint-plugin-mediawiki": "^0.6.0",
+				"eslint-plugin-mocha": "^10.4.1",
+				"eslint-plugin-n": "^16.6.2",
 				"eslint-plugin-no-jquery": "^2.7.0",
-				"eslint-plugin-qunit": "^7.3.4",
+				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^47.0.0",
-				"eslint-plugin-vue": "^9.18.1",
-				"eslint-plugin-wdio": "^7.19.4",
-				"eslint-plugin-yml": "^1.10.0"
+				"eslint-plugin-unicorn": "^51.0.1",
+				"eslint-plugin-vue": "^9.23.0",
+				"eslint-plugin-wdio": "^8.24.12",
+				"eslint-plugin-yml": "^1.13.2"
 			}
 		},
 		"node_modules/eslint-plugin-compat": {
@@ -1509,14 +1525,14 @@
 			}
 		},
 		"node_modules/eslint-plugin-es-x": {
-			"version": "7.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz",
-			"integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz",
+			"integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.1.2",
 				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.1.2"
+				"eslint-compat-utils": "^0.5.0"
 			},
 			"engines": {
 				"node": "^14.18.0 || >=16.0.0"
@@ -1529,9 +1545,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-jest": {
-			"version": "27.6.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz",
-			"integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==",
+			"version": "27.9.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz",
+			"integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==",
 			"dev": true,
 			"dependencies": {
 				"@typescript-eslint/utils": "^5.10.0"
@@ -1540,7 +1556,7 @@
 				"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0",
+				"@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0",
 				"eslint": "^7.0.0 || ^8.0.0",
 				"jest": "*"
 			},
@@ -1554,25 +1570,36 @@
 			}
 		},
 		"node_modules/eslint-plugin-jsdoc": {
-			"version": "42.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz",
-			"integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==",
+			"version": "48.2.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.1.tgz",
+			"integrity": "sha512-iUvbcyDZSO/9xSuRv2HQBw++8VkV/pt3UWtX9cpPH0l7GKPq78QC/6+PmyQHHvNZaTjAce6QVciEbnc6J/zH5g==",
 			"dev": true,
 			"dependencies": {
-				"@es-joy/jsdoccomment": "~0.37.0",
+				"@es-joy/jsdoccomment": "~0.42.0",
 				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"debug": "^4.3.4",
 				"escape-string-regexp": "^4.0.0",
 				"esquery": "^1.5.0",
-				"semver": "^7.3.8",
-				"spdx-expression-parse": "^3.0.1"
+				"is-builtin-module": "^3.2.1",
+				"semver": "^7.6.0",
+				"spdx-expression-parse": "^4.0.0"
 			},
 			"engines": {
-				"node": "^14 || ^16 || ^17 || ^18 || ^19"
+				"node": ">=18"
 			},
 			"peerDependencies": {
-				"eslint": "^7.0.0 || ^8.0.0"
+				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
+			}
+		},
+		"node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+			"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
+			"dev": true,
+			"dependencies": {
+				"spdx-exceptions": "^2.1.0",
+				"spdx-license-ids": "^3.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-json-es": {
@@ -1589,69 +1616,26 @@
 			}
 		},
 		"node_modules/eslint-plugin-mediawiki": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.5.0.tgz",
-			"integrity": "sha512-rjkHFyv3VDan/dmu7YpD1Rl9h64NOlz4mqqesRN316R+571+ymmb6lXVOdNMbT8H1iPhmtHc+nijVLVkn7pYDw==",
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.6.0.tgz",
+			"integrity": "sha512-a2Zm18N5nPyflBajM2ZWATxucIpYPEmOSjFzUR1OBH3hAL0GY9fx1mpezEwzqAQ862d+kPkolgQOzktnZe8nKA==",
 			"dev": true,
 			"dependencies": {
-				"eslint-plugin-vue": "^8.7.1",
+				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
 			},
 			"peerDependencies": {
 				"eslint": ">=5.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-mediawiki/node_modules/eslint-plugin-vue": {
-			"version": "8.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
-			"integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
-			"dev": true,
-			"dependencies": {
-				"eslint-utils": "^3.0.0",
-				"natural-compare": "^1.4.0",
-				"nth-check": "^2.0.1",
-				"postcss-selector-parser": "^6.0.9",
-				"semver": "^7.3.5",
-				"vue-eslint-parser": "^8.0.1"
-			},
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			},
-			"peerDependencies": {
-				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
-			}
-		},
-		"node_modules/eslint-plugin-mediawiki/node_modules/vue-eslint-parser": {
-			"version": "8.3.0",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
-			"integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
-			"dev": true,
-			"dependencies": {
-				"debug": "^4.3.2",
-				"eslint-scope": "^7.0.0",
-				"eslint-visitor-keys": "^3.1.0",
-				"espree": "^9.0.0",
-				"esquery": "^1.4.0",
-				"lodash": "^4.17.21",
-				"semver": "^7.3.5"
-			},
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/mysticatea"
-			},
-			"peerDependencies": {
-				"eslint": ">=6.0.0"
-			}
-		},
 		"node_modules/eslint-plugin-mocha": {
-			"version": "10.2.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz",
-			"integrity": "sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==",
+			"version": "10.4.3",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
+			"integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
+				"globals": "^13.24.0",
 				"rambda": "^7.4.0"
 			},
 			"engines": {
@@ -1662,15 +1646,16 @@
 			}
 		},
 		"node_modules/eslint-plugin-n": {
-			"version": "16.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.5.0.tgz",
-			"integrity": "sha512-Hw02Bj1QrZIlKyj471Tb1jSReTl4ghIMHGuBGiMVmw+s0jOPbI4CBuYpGbZr+tdQ+VAvSK6FDSta3J4ib/SKHQ==",
+			"version": "16.6.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz",
+			"integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.4.0",
 				"builtins": "^5.0.1",
 				"eslint-plugin-es-x": "^7.5.0",
 				"get-tsconfig": "^4.7.0",
+				"globals": "^13.24.0",
 				"ignore": "^5.2.4",
 				"is-builtin-module": "^3.2.1",
 				"is-core-module": "^2.12.1",
@@ -1698,16 +1683,16 @@
 			}
 		},
 		"node_modules/eslint-plugin-qunit": {
-			"version": "7.3.4",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz",
-			"integrity": "sha512-EbDM0zJerH9zVdUswMJpcFF7wrrpvsGuYfNexUpa5hZkkdFhaFcX+yD+RSK4Nrauw4psMGlcqeWUMhaVo+Manw==",
+			"version": "8.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
+			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
 				"requireindex": "^1.2.0"
 			},
 			"engines": {
-				"node": "12.x || 14.x || >=16.0.0"
+				"node": "^16.0.0 || ^18.0.0 || >=20.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-security": {
@@ -1720,26 +1705,26 @@
 			}
 		},
 		"node_modules/eslint-plugin-unicorn": {
-			"version": "47.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz",
-			"integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==",
+			"version": "51.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz",
+			"integrity": "sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw==",
 			"dev": true,
 			"dependencies": {
-				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/helper-validator-identifier": "^7.22.20",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"ci-info": "^3.8.0",
+				"@eslint/eslintrc": "^2.1.4",
+				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
+				"core-js-compat": "^3.34.0",
 				"esquery": "^1.5.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.1",
 				"jsesc": "^3.0.2",
-				"lodash": "^4.17.21",
 				"pluralize": "^8.0.0",
 				"read-pkg-up": "^7.0.1",
-				"regexp-tree": "^0.1.24",
+				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"safe-regex": "^2.1.1",
-				"semver": "^7.3.8",
+				"semver": "^7.5.4",
 				"strip-indent": "^3.0.0"
 			},
 			"engines": {
@@ -1749,47 +1734,48 @@
 				"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
 			},
 			"peerDependencies": {
-				"eslint": ">=8.38.0"
+				"eslint": ">=8.56.0"
 			}
 		},
 		"node_modules/eslint-plugin-vue": {
-			"version": "9.19.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.19.2.tgz",
-			"integrity": "sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==",
+			"version": "9.25.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz",
+			"integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
-				"postcss-selector-parser": "^6.0.13",
-				"semver": "^7.5.4",
-				"vue-eslint-parser": "^9.3.1",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"vue-eslint-parser": "^9.4.2",
 				"xml-name-validator": "^4.0.0"
 			},
 			"engines": {
 				"node": "^14.17.0 || >=16.0.0"
 			},
 			"peerDependencies": {
-				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-wdio": {
-			"version": "7.25.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.25.3.tgz",
-			"integrity": "sha512-2zbYwV14Md9FNlyhaIILVGPB6w4bu2eJdOTywDUs2Qy4ebcQNwrxB0qCaf7Rm4O+T0Ir+tdYHYBBfbDocSLKng==",
+			"version": "8.24.12",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
+			"integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
 			"dev": true,
 			"engines": {
-				"node": ">=12.0.0"
+				"node": "^16.13 || >=18"
 			}
 		},
 		"node_modules/eslint-plugin-yml": {
-			"version": "1.11.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.11.0.tgz",
-			"integrity": "sha512-NBZP1NDGy0u38pY5ieix75jxS9GNOJy9xd4gQa0rU4gWbfEsVhKDwuFaQ6RJpDbv6Lq5TtcAZS/YnAc0oeRw0w==",
+			"version": "1.14.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
+			"integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
 			"dev": true,
 			"dependencies": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.1.1",
+				"eslint-compat-utils": "^0.5.0",
 				"lodash": "^4.17.21",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
@@ -2174,9 +2160,9 @@
 			}
 		},
 		"node_modules/get-tsconfig": {
-			"version": "4.7.2",
-			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
-			"integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
+			"version": "4.7.3",
+			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz",
+			"integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==",
 			"dev": true,
 			"dependencies": {
 				"resolve-pkg-maps": "^1.0.0"
@@ -3778,9 +3764,9 @@
 			}
 		},
 		"node_modules/postcss-selector-parser": {
-			"version": "6.0.13",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
-			"integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+			"version": "6.0.16",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
+			"integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
 			"dev": true,
 			"dependencies": {
 				"cssesc": "^3.0.0",
@@ -4210,9 +4196,9 @@
 			"dev": true
 		},
 		"node_modules/semver": {
-			"version": "7.5.4",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-			"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+			"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
 			"dev": true,
 			"dependencies": {
 				"lru-cache": "^6.0.0"
@@ -5079,9 +5065,9 @@
 			}
 		},
 		"node_modules/vue-eslint-parser": {
-			"version": "9.3.2",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz",
-			"integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==",
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
+			"integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
 			"dev": true,
 			"dependencies": {
 				"debug": "^4.3.4",
@@ -5187,10 +5173,13 @@
 			"dev": true
 		},
 		"node_modules/yaml": {
-			"version": "2.3.4",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-			"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+			"version": "2.4.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
+			"integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
 			"dev": true,
+			"bin": {
+				"yaml": "bin.mjs"
+			},
 			"engines": {
 				"node": ">= 14"
 			}
@@ -5430,12 +5419,12 @@
 			"requires": {}
 		},
 		"@es-joy/jsdoccomment": {
-			"version": "0.37.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz",
-			"integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==",
+			"version": "0.42.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz",
+			"integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==",
 			"dev": true,
 			"requires": {
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"esquery": "^1.5.0",
 				"jsdoc-type-pratt-parser": "~4.0.0"
 			}
@@ -5473,19 +5462,19 @@
 			}
 		},
 		"@eslint/js": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
-			"integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true
 		},
 		"@humanwhocodes/config-array": {
-			"version": "0.11.13",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
-			"integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+			"version": "0.11.14",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+			"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
 			"dev": true,
 			"requires": {
-				"@humanwhocodes/object-schema": "^2.0.1",
-				"debug": "^4.1.1",
+				"@humanwhocodes/object-schema": "^2.0.2",
+				"debug": "^4.3.1",
 				"minimatch": "^3.0.5"
 			}
 		},
@@ -5496,9 +5485,9 @@
 			"dev": true
 		},
 		"@humanwhocodes/object-schema": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
-			"integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+			"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
 			"dev": true
 		},
 		"@mdn/browser-compat-data": {
@@ -5558,9 +5547,9 @@
 			"dev": true
 		},
 		"@types/semver": {
-			"version": "7.5.6",
-			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
-			"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+			"version": "7.5.8",
+			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+			"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
 			"dev": true
 		},
 		"@typescript-eslint/scope-manager": {
@@ -5785,21 +5774,21 @@
 			}
 		},
 		"browserslist": {
-			"version": "4.22.2",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
-			"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"requires": {
-				"caniuse-lite": "^1.0.30001565",
-				"electron-to-chromium": "^1.4.601",
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
 				"node-releases": "^2.0.14",
 				"update-browserslist-db": "^1.0.13"
 			}
 		},
 		"browserslist-config-wikimedia": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.1.tgz",
-			"integrity": "sha512-jf532fUf/gaxiKdHgGCQUT552P5up3RpG+CzLixOQBJ5FwDmYQSRLYHCFUA9s3KMOHh4P3xVp+NUaGNxvtoT9g==",
+			"version": "0.6.1",
+			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.6.1.tgz",
+			"integrity": "sha512-F3O+12ud7ZwBaiB/RZIMGDgz3nEuXz8RhtdPB4Lkd/WVP5Vy77EqBWRMz4vJ64x8LTTH3BOaHCD2ZuUcgShqyQ==",
 			"dev": true
 		},
 		"builtin-modules": {
@@ -5809,9 +5798,9 @@
 			"dev": true
 		},
 		"builtins": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
-			"integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
+			"version": "5.1.0",
+			"resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz",
+			"integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==",
 			"dev": true,
 			"requires": {
 				"semver": "^7.0.0"
@@ -5850,9 +5839,9 @@
 			}
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001570",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz",
-			"integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==",
+			"version": "1.0.30001612",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz",
+			"integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==",
 			"dev": true
 		},
 		"chalk": {
@@ -5866,9 +5855,9 @@
 			}
 		},
 		"ci-info": {
-			"version": "3.9.0",
-			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
-			"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+			"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
 			"dev": true
 		},
 		"clean-regexp": {
@@ -5927,9 +5916,9 @@
 			"dev": true
 		},
 		"comment-parser": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz",
-			"integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==",
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true
 		},
 		"concat-map": {
@@ -5938,6 +5927,15 @@
 			"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 			"dev": true
 		},
+		"core-js-compat": {
+			"version": "3.37.0",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz",
+			"integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==",
+			"dev": true,
+			"requires": {
+				"browserslist": "^4.23.0"
+			}
+		},
 		"core-util-is": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -6175,9 +6173,9 @@
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.4.615",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz",
-			"integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==",
+			"version": "1.4.750",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.750.tgz",
+			"integrity": "sha512-9ItEpeu15hW5m8jKdriL+BQrgwDTXEL9pn4SkillWFu73ZNNNQ2BKKLS+ZHv2vC9UkNhosAeyfxOf/5OSeTCPA==",
 			"dev": true
 		},
 		"emoji-regex": {
@@ -6214,16 +6212,16 @@
 			"dev": true
 		},
 		"eslint": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
-			"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.2.0",
 				"@eslint-community/regexpp": "^4.6.1",
 				"@eslint/eslintrc": "^2.1.4",
-				"@eslint/js": "8.56.0",
-				"@humanwhocodes/config-array": "^0.11.13",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
 				"@ungap/structured-clone": "^1.2.0",
@@ -6260,35 +6258,37 @@
 			}
 		},
 		"eslint-compat-utils": {
-			"version": "0.1.2",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz",
-			"integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==",
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz",
+			"integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==",
 			"dev": true,
-			"requires": {}
+			"requires": {
+				"semver": "^7.5.4"
+			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz",
-			"integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==",
+			"version": "0.27.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.27.0.tgz",
+			"integrity": "sha512-KkZ54+MUnggz17C/RCEMXQSpiiqZRF7p9fjrz4phaaeKlTrjg0B+QbM5zcDWcjGiAWaJUptHaH17+RZldadkUw==",
 			"dev": true,
 			"requires": {
-				"browserslist-config-wikimedia": "^0.5.1",
-				"eslint": "^8.53.0",
+				"browserslist-config-wikimedia": "^0.6.1",
+				"eslint": "^8.57.0",
 				"eslint-plugin-compat": "^4.2.0",
-				"eslint-plugin-es-x": "^7.3.0",
-				"eslint-plugin-jest": "^27.6.0",
-				"eslint-plugin-jsdoc": "^42.0.0",
+				"eslint-plugin-es-x": "^7.6.0",
+				"eslint-plugin-jest": "^27.9.0",
+				"eslint-plugin-jsdoc": "48.2.1",
 				"eslint-plugin-json-es": "^1.5.7",
-				"eslint-plugin-mediawiki": "^0.5.0",
-				"eslint-plugin-mocha": "^10.2.0",
-				"eslint-plugin-n": "^16.0.1",
+				"eslint-plugin-mediawiki": "^0.6.0",
+				"eslint-plugin-mocha": "^10.4.1",
+				"eslint-plugin-n": "^16.6.2",
 				"eslint-plugin-no-jquery": "^2.7.0",
-				"eslint-plugin-qunit": "^7.3.4",
+				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^47.0.0",
-				"eslint-plugin-vue": "^9.18.1",
-				"eslint-plugin-wdio": "^7.19.4",
-				"eslint-plugin-yml": "^1.10.0"
+				"eslint-plugin-unicorn": "^51.0.1",
+				"eslint-plugin-vue": "^9.23.0",
+				"eslint-plugin-wdio": "^8.24.12",
+				"eslint-plugin-yml": "^1.13.2"
 			}
 		},
 		"eslint-plugin-compat": {
@@ -6307,39 +6307,52 @@
 			}
 		},
 		"eslint-plugin-es-x": {
-			"version": "7.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz",
-			"integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz",
+			"integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.1.2",
 				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.1.2"
+				"eslint-compat-utils": "^0.5.0"
 			}
 		},
 		"eslint-plugin-jest": {
-			"version": "27.6.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz",
-			"integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==",
+			"version": "27.9.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz",
+			"integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==",
 			"dev": true,
 			"requires": {
 				"@typescript-eslint/utils": "^5.10.0"
 			}
 		},
 		"eslint-plugin-jsdoc": {
-			"version": "42.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz",
-			"integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==",
+			"version": "48.2.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.1.tgz",
+			"integrity": "sha512-iUvbcyDZSO/9xSuRv2HQBw++8VkV/pt3UWtX9cpPH0l7GKPq78QC/6+PmyQHHvNZaTjAce6QVciEbnc6J/zH5g==",
 			"dev": true,
 			"requires": {
-				"@es-joy/jsdoccomment": "~0.37.0",
+				"@es-joy/jsdoccomment": "~0.42.0",
 				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"debug": "^4.3.4",
 				"escape-string-regexp": "^4.0.0",
 				"esquery": "^1.5.0",
-				"semver": "^7.3.8",
-				"spdx-expression-parse": "^3.0.1"
+				"is-builtin-module": "^3.2.1",
+				"semver": "^7.6.0",
+				"spdx-expression-parse": "^4.0.0"
+			},
+			"dependencies": {
+				"spdx-expression-parse": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+					"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
+					"dev": true,
+					"requires": {
+						"spdx-exceptions": "^2.1.0",
+						"spdx-license-ids": "^3.0.0"
+					}
+				}
 			}
 		},
 		"eslint-plugin-json-es": {
@@ -6353,66 +6366,37 @@
 			}
 		},
 		"eslint-plugin-mediawiki": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.5.0.tgz",
-			"integrity": "sha512-rjkHFyv3VDan/dmu7YpD1Rl9h64NOlz4mqqesRN316R+571+ymmb6lXVOdNMbT8H1iPhmtHc+nijVLVkn7pYDw==",
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.6.0.tgz",
+			"integrity": "sha512-a2Zm18N5nPyflBajM2ZWATxucIpYPEmOSjFzUR1OBH3hAL0GY9fx1mpezEwzqAQ862d+kPkolgQOzktnZe8nKA==",
 			"dev": true,
 			"requires": {
-				"eslint-plugin-vue": "^8.7.1",
+				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
-			},
-			"dependencies": {
-				"eslint-plugin-vue": {
-					"version": "8.7.1",
-					"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
-					"integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
-					"dev": true,
-					"requires": {
-						"eslint-utils": "^3.0.0",
-						"natural-compare": "^1.4.0",
-						"nth-check": "^2.0.1",
-						"postcss-selector-parser": "^6.0.9",
-						"semver": "^7.3.5",
-						"vue-eslint-parser": "^8.0.1"
-					}
-				},
-				"vue-eslint-parser": {
-					"version": "8.3.0",
-					"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
-					"integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
-					"dev": true,
-					"requires": {
-						"debug": "^4.3.2",
-						"eslint-scope": "^7.0.0",
-						"eslint-visitor-keys": "^3.1.0",
-						"espree": "^9.0.0",
-						"esquery": "^1.4.0",
-						"lodash": "^4.17.21",
-						"semver": "^7.3.5"
-					}
-				}
 			}
 		},
 		"eslint-plugin-mocha": {
-			"version": "10.2.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz",
-			"integrity": "sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==",
+			"version": "10.4.3",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
+			"integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
+				"globals": "^13.24.0",
 				"rambda": "^7.4.0"
 			}
 		},
 		"eslint-plugin-n": {
-			"version": "16.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.5.0.tgz",
-			"integrity": "sha512-Hw02Bj1QrZIlKyj471Tb1jSReTl4ghIMHGuBGiMVmw+s0jOPbI4CBuYpGbZr+tdQ+VAvSK6FDSta3J4ib/SKHQ==",
+			"version": "16.6.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz",
+			"integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.4.0",
 				"builtins": "^5.0.1",
 				"eslint-plugin-es-x": "^7.5.0",
 				"get-tsconfig": "^4.7.0",
+				"globals": "^13.24.0",
 				"ignore": "^5.2.4",
 				"is-builtin-module": "^3.2.1",
 				"is-core-module": "^2.12.1",
@@ -6429,9 +6413,9 @@
 			"requires": {}
 		},
 		"eslint-plugin-qunit": {
-			"version": "7.3.4",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz",
-			"integrity": "sha512-EbDM0zJerH9zVdUswMJpcFF7wrrpvsGuYfNexUpa5hZkkdFhaFcX+yD+RSK4Nrauw4psMGlcqeWUMhaVo+Manw==",
+			"version": "8.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
+			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
@@ -6448,58 +6432,59 @@
 			}
 		},
 		"eslint-plugin-unicorn": {
-			"version": "47.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz",
-			"integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==",
+			"version": "51.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz",
+			"integrity": "sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/helper-validator-identifier": "^7.22.20",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"ci-info": "^3.8.0",
+				"@eslint/eslintrc": "^2.1.4",
+				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
+				"core-js-compat": "^3.34.0",
 				"esquery": "^1.5.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.1",
 				"jsesc": "^3.0.2",
-				"lodash": "^4.17.21",
 				"pluralize": "^8.0.0",
 				"read-pkg-up": "^7.0.1",
-				"regexp-tree": "^0.1.24",
+				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"safe-regex": "^2.1.1",
-				"semver": "^7.3.8",
+				"semver": "^7.5.4",
 				"strip-indent": "^3.0.0"
 			}
 		},
 		"eslint-plugin-vue": {
-			"version": "9.19.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.19.2.tgz",
-			"integrity": "sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==",
+			"version": "9.25.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz",
+			"integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
-				"postcss-selector-parser": "^6.0.13",
-				"semver": "^7.5.4",
-				"vue-eslint-parser": "^9.3.1",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"vue-eslint-parser": "^9.4.2",
 				"xml-name-validator": "^4.0.0"
 			}
 		},
 		"eslint-plugin-wdio": {
-			"version": "7.25.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.25.3.tgz",
-			"integrity": "sha512-2zbYwV14Md9FNlyhaIILVGPB6w4bu2eJdOTywDUs2Qy4ebcQNwrxB0qCaf7Rm4O+T0Ir+tdYHYBBfbDocSLKng==",
+			"version": "8.24.12",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
+			"integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
 			"dev": true
 		},
 		"eslint-plugin-yml": {
-			"version": "1.11.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.11.0.tgz",
-			"integrity": "sha512-NBZP1NDGy0u38pY5ieix75jxS9GNOJy9xd4gQa0rU4gWbfEsVhKDwuFaQ6RJpDbv6Lq5TtcAZS/YnAc0oeRw0w==",
+			"version": "1.14.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
+			"integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.1.1",
+				"eslint-compat-utils": "^0.5.0",
 				"lodash": "^4.17.21",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
@@ -6779,9 +6764,9 @@
 			"dev": true
 		},
 		"get-tsconfig": {
-			"version": "4.7.2",
-			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
-			"integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
+			"version": "4.7.3",
+			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz",
+			"integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==",
 			"dev": true,
 			"requires": {
 				"resolve-pkg-maps": "^1.0.0"
@@ -7981,9 +7966,9 @@
 			"requires": {}
 		},
 		"postcss-selector-parser": {
-			"version": "6.0.13",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
-			"integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+			"version": "6.0.16",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
+			"integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
 			"dev": true,
 			"requires": {
 				"cssesc": "^3.0.0",
@@ -8270,9 +8255,9 @@
 			"dev": true
 		},
 		"semver": {
-			"version": "7.5.4",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-			"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+			"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
 			"dev": true,
 			"requires": {
 				"lru-cache": "^6.0.0"
@@ -8943,9 +8928,9 @@
 			}
 		},
 		"vue-eslint-parser": {
-			"version": "9.3.2",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz",
-			"integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==",
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
+			"integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.3.4",
@@ -9018,9 +9003,9 @@
 			"dev": true
 		},
 		"yaml": {
-			"version": "2.3.4",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-			"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+			"version": "2.4.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
+			"integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
 			"dev": true
 		},
 		"yaml-eslint-parser": {
diff --git a/package.json b/package.json
index 8815f3b..689e576 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
 		"test": "grunt test"
 	},
 	"devDependencies": {
-		"eslint-config-wikimedia": "0.26.0",
+		"eslint-config-wikimedia": "0.27.0",
 		"grunt": "1.6.1",
 		"grunt-banana-checker": "0.11.1",
 		"grunt-eslint": "24.3.0",
diff --git a/resources/VisualDataForms.js b/resources/VisualDataForms.js
index 11135b1..924a294 100644
--- a/resources/VisualDataForms.js
+++ b/resources/VisualDataForms.js
@@ -22,8 +22,6 @@
 /* eslint-disable no-tabs */
 /* eslint-disable no-unused-vars */
 /* eslint-disable no-underscore-dangle */
-/* eslint-disable es-x/no-async-functions */
-/* eslint-disable compat/compat */
 
 const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager ) {
 	var Model = {};
diff --git a/resources/VisualDataProcessModel.js b/resources/VisualDataProcessModel.js
index 97bd790..9bda24d 100644
--- a/resources/VisualDataProcessModel.js
+++ b/resources/VisualDataProcessModel.js
@@ -19,7 +19,6 @@
  * @copyright Copyright © 2023, https://wikisphere.org
  */
 
-/* eslint-disable no-tabs */
 /* eslint-disable no-unused-vars */
 /* eslint-disable no-underscore-dangle */
 
diff --git a/resources/VisualDataWindowManager.js b/resources/VisualDataWindowManager.js
index 9f4b647..aca33ee 100644
--- a/resources/VisualDataWindowManager.js
+++ b/resources/VisualDataWindowManager.js
@@ -20,7 +20,6 @@
  */
 
 // @see https://doc.wikimedia.org/oojs-ui/master/js/
-// eslint-disable-next-line no-unused-vars
 
 // eslint-disable-next-line no-implicit-globals
 VisualDataWindowManager = function () {
-- 
2.39.2

$ date
--- stdout ---
Sat Apr 27 13:30:21 UTC 2024

--- end ---
$ git clone file:///srv/git/mediawiki-extensions-VisualData.git repo --depth=1 -b master
--- stderr ---
Cloning into 'repo'...
--- stdout ---

--- end ---
$ git config user.name libraryupgrader
--- stdout ---

--- end ---
$ git config user.email tools.libraryupgrader@tools.wmflabs.org
--- stdout ---

--- end ---
$ git submodule update --init
--- stdout ---

--- end ---
$ grr init
--- stdout ---
Installed commit-msg hook.

--- end ---
$ git show-ref refs/heads/master
--- stdout ---
f59e4f04709b89f805d7368eb851b1806c43896d refs/heads/master

--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {},
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 0,
      "high": 0,
      "critical": 0,
      "total": 0
    },
    "dependencies": {
      "prod": 1,
      "dev": 436,
      "optional": 0,
      "peer": 10,
      "peerOptional": 0,
      "total": 436
    }
  }
}

--- end ---
$ /usr/bin/composer install
--- stderr ---
No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information.
Loading composer repositories with package information
Updating dependencies
Lock file operations: 23 installs, 0 updates, 0 removals
  - Locking composer/semver (3.4.0)
  - Locking composer/spdx-licenses (1.5.8)
  - Locking dealerdirect/phpcodesniffer-composer-installer (v1.0.0)
  - Locking mediawiki/mediawiki-codesniffer (v43.0.0)
  - Locking mediawiki/minus-x (1.1.1)
  - Locking php-parallel-lint/php-console-color (v1.0.1)
  - Locking php-parallel-lint/php-console-highlighter (v1.0.0)
  - Locking php-parallel-lint/php-parallel-lint (v1.3.2)
  - Locking phpcsstandards/phpcsextra (1.1.2)
  - Locking phpcsstandards/phpcsutils (1.0.9)
  - Locking psr/container (2.0.2)
  - Locking squizlabs/php_codesniffer (3.8.1)
  - Locking swaggest/json-diff (v3.10.5)
  - Locking symfony/console (v5.4.36)
  - Locking symfony/deprecation-contracts (v3.4.0)
  - Locking symfony/polyfill-ctype (v1.29.0)
  - Locking symfony/polyfill-intl-grapheme (v1.29.0)
  - Locking symfony/polyfill-intl-normalizer (v1.29.0)
  - Locking symfony/polyfill-mbstring (v1.29.0)
  - Locking symfony/polyfill-php73 (v1.29.0)
  - Locking symfony/polyfill-php80 (v1.29.0)
  - Locking symfony/service-contracts (v3.4.2)
  - Locking symfony/string (v6.4.4)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 23 installs, 0 updates, 0 removals
  - Downloading swaggest/json-diff (v3.10.5)
 0/1 [>---------------------------]   0%
 1/1 [============================] 100%
  - Installing squizlabs/php_codesniffer (3.8.1): Extracting archive
  - Installing dealerdirect/phpcodesniffer-composer-installer (v1.0.0): Extracting archive
  - Installing symfony/polyfill-php80 (v1.29.0): Extracting archive
  - Installing phpcsstandards/phpcsutils (1.0.9): Extracting archive
  - Installing phpcsstandards/phpcsextra (1.1.2): Extracting archive
  - Installing symfony/polyfill-mbstring (v1.29.0): Extracting archive
  - Installing composer/spdx-licenses (1.5.8): Extracting archive
  - Installing composer/semver (3.4.0): Extracting archive
  - Installing mediawiki/mediawiki-codesniffer (v43.0.0): Extracting archive
  - Installing symfony/polyfill-intl-normalizer (v1.29.0): Extracting archive
  - Installing symfony/polyfill-intl-grapheme (v1.29.0): Extracting archive
  - Installing symfony/polyfill-ctype (v1.29.0): Extracting archive
  - Installing symfony/string (v6.4.4): Extracting archive
  - Installing psr/container (2.0.2): Extracting archive
  - Installing symfony/service-contracts (v3.4.2): Extracting archive
  - Installing symfony/polyfill-php73 (v1.29.0): Extracting archive
  - Installing symfony/deprecation-contracts (v3.4.0): Extracting archive
  - Installing symfony/console (v5.4.36): Extracting archive
  - Installing mediawiki/minus-x (1.1.1): Extracting archive
  - Installing php-parallel-lint/php-console-color (v1.0.1): Extracting archive
  - Installing php-parallel-lint/php-console-highlighter (v1.0.0): Extracting archive
  - Installing php-parallel-lint/php-parallel-lint (v1.3.2): Extracting archive
  - Installing swaggest/json-diff (v3.10.5): Extracting archive
  0/21 [>---------------------------]   0%
 21/21 [============================] 100%
4 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
14 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---
PHP CodeSniffer Config installed_paths set to ../../mediawiki/mediawiki-codesniffer,../../phpcsstandards/phpcsextra,../../phpcsstandards/phpcsutils

--- end ---
Upgrading n:eslint-config-wikimedia from 0.26.0 -> 0.27.0
$ /usr/bin/npm install
--- stderr ---
npm WARN deprecated stylelint-stylistic@0.4.3: This package has been deprecated in favor of @stylistic/stylelint-plugin
--- stdout ---

added 436 packages, and audited 437 packages in 7s

93 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
$ /usr/bin/npm install grunt-eslint@24.3.0 --save-exact
--- stdout ---

up to date, audited 437 packages in 1s

93 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
$ ./node_modules/.bin/eslint i18n/en.json resources/Widgets/VisualDataRatingWidget.js i18n/de.json composer.json resources/Widgets/VisualDataMenuTagSearchMultiselect.js i18n/qqq.json resources/Widgets/VisualDataVisualEditor.js resources/VisualDataForms.js package.json resources/VisualDataUpload.js resources/VisualDataFunctions.js package-lock.json resources/VersionCheck.js resources/Widgets/VisualDataMaptiler.js resources/VisualDataInputConfig.js resources/VisualDataFormField.js resources/VisualDataContentBlock.js resources/VisualData.js resources/VisualDataGeolocation.js resources/Widgets/VisualDataintlTelInput.js resources/Widgets/VisualDataLookupElement.js resources/VisualDataSchemas.js resources/VisualDataProcessModel.js resources/Widgets/VisualDataButtonMultiselectWidget.js Gruntfile.js resources/VisualDataWindowManager.js resources/VisualDataDatatables.js resources/Widgets/VisualDataDropdownWidget.js extension.json --fix
--- stdout ---

/src/repo/resources/VersionCheck.js
  57:22  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  62:18  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  65:9   warning  Where possible, maintain application state in JS to avoid slower DOM queries        no-jquery/no-class-state

/src/repo/resources/VisualDataDatatables.js
  45:2  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  48:7  warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern

/src/repo/resources/VisualDataFormField.js
  1085:4  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector

/src/repo/resources/VisualDataForms.js
    71:6   warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
    80:1   warning  This line has a length of 106. Maximum allowed is 100                               max-len
   209:5   warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
   407:1   warning  This line has a length of 104. Maximum allowed is 100                               max-len
   431:19  warning  Found non-literal argument to RegExp Constructor                                    security/detect-non-literal-regexp
   435:19  warning  Found non-literal argument to RegExp Constructor                                    security/detect-non-literal-regexp
   442:19  warning  Found non-literal argument to RegExp Constructor                                    security/detect-non-literal-regexp
   463:17  warning  Found non-literal argument to RegExp Constructor                                    security/detect-non-literal-regexp
   491:17  warning  Found non-literal argument to RegExp Constructor                                    security/detect-non-literal-regexp
   509:1   warning  This line has a length of 117. Maximum allowed is 100                               max-len
   526:1   warning  This line has a length of 131. Maximum allowed is 100                               max-len
  1390:26  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1458:6   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1461:7   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1464:7   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1492:7   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1495:8   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1498:8   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  2129:5   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  2284:1   warning  This line has a length of 107. Maximum allowed is 100                               max-len
  2426:1   warning  This line has a length of 109. Maximum allowed is 100                               max-len
  2758:1   warning  This line has a length of 102. Maximum allowed is 100                               max-len
  2776:7   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
  2950:1   warning  This line has a length of 102. Maximum allowed is 100                               max-len
  3074:10  warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
  3162:1   warning  This line has a length of 105. Maximum allowed is 100                               max-len
  3165:1   warning  This line has a length of 101. Maximum allowed is 100                               max-len
  3385:15  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  3409:1   warning  This line has a length of 119. Maximum allowed is 100                               max-len
  3456:3   warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector

/src/repo/resources/VisualDataInputConfig.js
  838:1  warning  This line has a length of 110. Maximum allowed is 100  max-len

/src/repo/resources/VisualDataProcessModel.js
  156:11  warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/resources/VisualDataSchemas.js
   325:1   warning  This line has a length of 103. Maximum allowed is 100                               max-len
  1493:15  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  1670:4   warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  1673:15  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1689:4   warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector

/src/repo/resources/Widgets/VisualDataButtonMultiselectWidget.js
  48:12  warning  Prefer Array#indexOf to $.inArray  no-jquery/no-in-array

/src/repo/resources/Widgets/VisualDataDropdownWidget.js
  38:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  53:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/resources/Widgets/VisualDataMaptiler.js
  61:1  warning  This line has a length of 119. Maximum allowed is 100  max-len

/src/repo/resources/Widgets/VisualDataMenuTagSearchMultiselect.js
  29:1  warning  Invalid JSDoc tag name "mixins"                        jsdoc/check-tag-names
  49:1  warning  This line has a length of 110. Maximum allowed is 100  max-len
  50:1  warning  This line has a length of 107. Maximum allowed is 100  max-len

/src/repo/resources/Widgets/VisualDataRatingWidget.js
  38:19  warning  Prefer DOM building to parsing HTML literals            no-jquery/no-parse-html-literal
  45:8   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  67:6   warning  Selector extensions are not allowed                     no-jquery/no-sizzle

/src/repo/resources/Widgets/VisualDataVisualEditor.js
  40:3   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  40:19  warning  Prefer DOM building to parsing HTML literals            no-jquery/no-parse-html-literal
  47:3   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  53:9   warning  Selector extensions are not allowed                     no-jquery/no-sizzle

/src/repo/resources/Widgets/VisualDataintlTelInput.js
  38:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

✖ 58 problems (0 errors, 58 warnings)


--- end ---
$ ./node_modules/.bin/eslint i18n/en.json resources/Widgets/VisualDataRatingWidget.js i18n/de.json composer.json resources/Widgets/VisualDataMenuTagSearchMultiselect.js i18n/qqq.json resources/Widgets/VisualDataVisualEditor.js resources/VisualDataForms.js package.json resources/VisualDataUpload.js resources/VisualDataFunctions.js package-lock.json resources/VersionCheck.js resources/Widgets/VisualDataMaptiler.js resources/VisualDataInputConfig.js resources/VisualDataFormField.js resources/VisualDataContentBlock.js resources/VisualData.js resources/VisualDataGeolocation.js resources/Widgets/VisualDataintlTelInput.js resources/Widgets/VisualDataLookupElement.js resources/VisualDataSchemas.js resources/VisualDataProcessModel.js resources/Widgets/VisualDataButtonMultiselectWidget.js Gruntfile.js resources/VisualDataWindowManager.js resources/VisualDataDatatables.js resources/Widgets/VisualDataDropdownWidget.js extension.json -f json
--- stdout ---
[{"filePath":"/src/repo/Gruntfile.js","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/composer.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/extension.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/de.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/en.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/i18n/qqq.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package-lock.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/package.json","messages":[],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"indent","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"no-extra-parens","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VersionCheck.js","messages":[{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":57,"column":22,"nodeType":"CallExpression","endLine":57,"endColumn":45},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":62,"column":18,"nodeType":"CallExpression","endLine":62,"endColumn":41},{"ruleId":"no-jquery/no-class-state","severity":1,"message":"Where possible, maintain application state in JS to avoid slower DOM queries","line":65,"column":9,"nodeType":"CallExpression","endLine":65,"endColumn":75}],"suppressedMessages":[],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2023, https://wikisphere.org\n */\n$( function () {\n\tif (\n\t\t!mw.config.get( 'visualdata-show-notice-outdated-version' ) ||\n\t\tmw.cookie.get( 'visualdata-check-latest-version' )\n\t) {\n\t\treturn;\n\t}\n\n\t// display every 3 days\n\tmw.loader.using( 'mediawiki.api', function () {\n\t\tnew mw.Api()\n\t\t\t.postWithToken( 'csrf', {\n\t\t\t\taction: 'visualdata-check-latest-version'\n\t\t\t} )\n\t\t\t.done( function ( res ) {\n\t\t\t\tif ( 'visualdata-check-latest-version' in res ) {\n\t\t\t\t\tif ( res[ 'visualdata-check-latest-version' ].result === 2 ) {\n\t\t\t\t\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\t\t\t\t\ttype: 'warning',\n\t\t\t\t\t\t\tlabel: new OO.ui.HtmlSnippet(\n\t\t\t\t\t\t\t\tmw.msg(\n\t\t\t\t\t\t\t\t\t'visualdata-jsmodule-outdated-version'\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t// *** this does not work before ooui v0.43.0\n\t\t\t\t\t\t\tshowClose: true\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tvar closeFunction = function () {\n\t\t\t\t\t\t\tvar three_days = 3 * 86400;\n\t\t\t\t\t\t\tmw.cookie.set( 'visualdata-check-latest-version', true, {\n\t\t\t\t\t\t\t\tpath: '/',\n\t\t\t\t\t\t\t\texpires: three_days\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t$( messageWidget.$element ).parent().remove();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tmessageWidget.on( 'close', closeFunction );\n\t\t\t\t\t\tvar selector = $( '#visualdata-form' ).length ?\n\t\t\t\t\t\t\t'#visualdata-form' :\n\t\t\t\t\t\t\t'.VisualDataFormWrapper';\n\t\t\t\t\t\t$( selector )\n\t\t\t\t\t\t\t.first()\n\t\t\t\t\t\t\t.prepend( $( '<div><br/></div>' ).prepend( messageWidget.$element ) );\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!messageWidget.$element.hasClass( 'oo-ui-messageWidget-showClose' )\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tmessageWidget.$element.addClass( 'oo-ui-messageWidget-showClose' );\n\t\t\t\t\t\t\tvar closeButton = new OO.ui.ButtonWidget( {\n\t\t\t\t\t\t\t\tclasses: [ 'oo-ui-messageWidget-close' ],\n\t\t\t\t\t\t\t\tframed: false,\n\t\t\t\t\t\t\t\ticon: 'close',\n\t\t\t\t\t\t\t\tlabel: OO.ui.msg( 'ooui-popup-widget-close-button-aria-label' ),\n\t\t\t\t\t\t\t\tinvisibleLabel: true\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\tcloseButton.on( 'click', closeFunction );\n\t\t\t\t\t\t\tmessageWidget.$element.append( closeButton.$element );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualData.js","messages":[],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":25,"column":1,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":144,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":57,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":57,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[1807,1858],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":63,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":63,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":90,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":90,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[2736,2783],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataContentBlock.js","messages":[],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'VisualDataContentBlock' is assigned a value but never used.","line":23,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":23,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'Config' is assigned a value but never used.","line":25,"column":6,"nodeType":"Identifier","messageId":"unusedVar","endLine":25,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is assigned a value but never used.","line":67,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":67,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'property' is defined but never used.","line":110,"column":45,"nodeType":"Identifier","messageId":"unusedVar","endLine":110,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataDatatables.js","messages":[{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":45,"column":2,"nodeType":"CallExpression","endLine":45,"endColumn":30},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":48,"column":7,"nodeType":"VariableDeclarator","endLine":48,"endColumn":24}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'obj' is defined but never used.","line":27,"column":31,"nodeType":"Identifier","messageId":"unusedVar","endLine":27,"endColumn":34,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is defined but never used.","line":31,"column":27,"nodeType":"Identifier","messageId":"unusedVar","endLine":31,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'callback' is defined but never used.","line":31,"column":33,"nodeType":"Identifier","messageId":"unusedVar","endLine":31,"endColumn":41,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'visualdataDatatables' is assigned a value but never used.","line":43,"column":6,"nodeType":"Identifier","messageId":"unusedVar","endLine":43,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'preloadData' is assigned a value but never used.","line":46,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":46,"endColumn":18,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'count' is assigned a value but never used.","line":49,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":49,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'tableData' is assigned a value but never used.","line":50,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":50,"endColumn":16,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2023, https://wikisphere.org\n */\n\n/* eslint-disable no-unused-vars */\n\nconst VisualDataDatatables = function () {\n\tvar cacheLimit = 40000;\n\n\tvar getCacheKey = function ( obj ) {\n\t\t// @TODO\n\t};\n\n\tvar callApi = function ( data, callback ) {\n\t\t// @TODO\n\t};\n\n\treturn {\n\t\tgetCacheKey,\n\t\tcallApi,\n\t\tcacheLimit\n\t};\n};\n\n$( function () {\n\tvar visualdataDatatables = new VisualDataDatatables();\n\n\t$( '.visualdata.datatable' ).each( function () {\n\t\tvar preloadData = {};\n\n\t\tvar table = $( this );\n\t\tvar count = table.data( 'count' );\n\t\tvar tableData = table.data();\n\n\t\tvar conf = {\n\t\t\tpageLength: 20\n\t\t};\n\t\t$( this ).DataTable( conf );\n\t} );\n} );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataFormField.js","messages":[{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1085,"column":4,"nodeType":"CallExpression","endLine":1085,"endColumn":61}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'VisualDataFormField' is assigned a value but never used.","line":25,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":25,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":74,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":74,"endColumn":18,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[2000,2058],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":217,"column":14,"nodeType":"Program","messageId":"unexpectedTab","endLine":217,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":217,"column":32,"nodeType":"Program","messageId":"unexpectedTab","endLine":217,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":311,"column":49,"nodeType":"Identifier","messageId":"unusedVar","endLine":311,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":370,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":370,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":373,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":373,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":403,"column":14,"nodeType":"Program","messageId":"unexpectedTab","endLine":403,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":403,"column":32,"nodeType":"Program","messageId":"unexpectedTab","endLine":403,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":483,"column":49,"nodeType":"Identifier","messageId":"unusedVar","endLine":483,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":488,"column":46,"nodeType":"Identifier","messageId":"unusedVar","endLine":488,"endColumn":51,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is assigned a value but never used.","line":512,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":512,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":733,"column":48,"nodeType":"Identifier","messageId":"unusedVar","endLine":733,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":749,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":749,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":750,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":750,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":808,"column":50,"nodeType":"Identifier","messageId":"unusedVar","endLine":808,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-use-before-define","severity":2,"message":"'defaultValueInput' was used before it was defined.","line":923,"column":20,"nodeType":"Identifier","messageId":"usedBeforeDefined","endLine":923,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":953,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":953,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[26615,26673],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1010,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1010,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1011,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1011,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1012,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1012,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1013,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1013,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1014,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1014,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1024,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1024,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1025,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1025,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1026,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1026,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1027,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1027,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1048,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1048,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1049,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1049,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1055,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1055,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1056,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1056,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1057,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1057,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1058,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1058,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1059,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1059,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'property' is defined but never used.","line":1183,"column":45,"nodeType":"Identifier","messageId":"unusedVar","endLine":1183,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright ©2023-2024, https://wikisphere.org\n */\n\n/* eslint-disable no-tabs */\n\n// eslint-disable-next-line no-unused-vars\nconst VisualDataFormField = function ( phpConfig, windowManager, schemas ) {\n\tvar Config = phpConfig;\n\tvar WindowManager = windowManager;\n\tvar Schemas = schemas;\n\tvar VisualDataInputConfigInst = new VisualDataInputConfig(\n\t\tphpConfig,\n\t\twindowManager\n\t);\n\n\tvar ProcessDialog;\n\tvar Model;\n\tvar ParentObj;\n\tvar panelLayout;\n\tvar CurrentKey;\n\tvar Callback;\n\n\tfunction inArray( val, arr ) {\n\t\treturn arr.indexOf( val ) !== -1;\n\t}\n\n\tfunction getCurrentItem() {\n\t\tif ( !( CurrentKey in ParentObj ) ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn ParentObj[ CurrentKey ];\n\t}\n\n\tfunction getPropertyValue( value, propName ) {\n\t\treturn VisualDataSchemas.getPropertyValue( value, propName, {\n\t\t\tgetCurrentItem: getCurrentItem,\n\t\t\tgetModel: getModel\n\t\t} );\n\t}\n\n\tfunction getModel() {\n\t\treturn Model;\n\t}\n\n\tfunction getAvailableInputs(\n\t\tpropertyModel,\n\t\tSMWproperty,\n\t\tJSONSchemaType,\n\t\tstringFormat,\n\t\tmultipleItems\n\t) {\n\t\tif ( Config.SMW && propertyModel === 'smw-property' ) {\n\t\t\tvar dataType = VisualDataSMW.getSemanticProperty( SMWproperty, 'type' );\n\t\t\tif ( !dataType ) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error( SMWproperty + ' property does not exist' );\n\t\t\t\tdataType = '_wpg';\n\t\t\t}\n\t\t\tvar ret = VisualDataSMW.getAvailableInputs( dataType );\n\t\t} else {\n\t\t\tret = VisualDataFunctions.getAvailableInputs(\n\t\t\t\tJSONSchemaType,\n\t\t\t\tstringFormat,\n\t\t\t\tConfig\n\t\t\t);\n\t\t}\n\n\t\t// remove multiselects\n\t\tif ( multipleItems === false ) {\n\t\t\treturn ret.filter( ( x ) => !VisualDataFunctions.isMultiselect( x ) );\n\t\t}\n\n\t\t// remove options inputs and lookup widgets\n\t\t// except multiselect\n\t\treturn ret.filter(\n\t\t\t( x ) =>\n\t\t\t\t( VisualDataFunctions.lookupInputs.indexOf( x ) === -1 &&\n\t\t\t\t\tVisualDataFunctions.optionsInputs.indexOf( x ) === -1 ) ||\n\t\t\t\tVisualDataFunctions.isMultiselect( x )\n\t\t);\n\t}\n\n\t// @TODO move in VisualDataInputConfig ?\n\tfunction handleOptionsInputs( availableInputsInput, parentItems ) {\n\t\tvar items = [];\n\t\tvar layout = new OO.ui.PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: true,\n\t\t\tframed: true,\n\t\t\tclasses: []\n\t\t} );\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: 'Options'\n\t\t} );\n\t\tlayout.$element.append( fieldset.$element );\n\n\t\tparentItems.push( layout );\n\n\t\tvar optionsValues = getPropertyValue( 'options-values' ) || [];\n\n\t\tvar selectOptionsFromValue = 'options-values';\n\t\tvar wikilistValue = getPropertyValue( 'options-wikilist' );\n\n\t\t// @TODO add more data sources\n\t\tif ( !optionsValues.length ) {\n\t\t\tif ( wikilistValue ) {\n\t\t\t\tselectOptionsFromValue = 'options-wikilist';\n\t\t\t} else if ( getPropertyValue( 'options-askquery' ) ) {\n\t\t\t\tselectOptionsFromValue = 'options-askquery';\n\t\t\t}\n\t\t}\n\n\t\tvar selectOptionsFrom = new OO.ui.RadioSelectInputWidget( {\n\t\t\toptions: [\n\t\t\t\t{\n\t\t\t\t\tdata: 'options-values',\n\t\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t\t'visualdata-jsmodule-formfield-optionsfrom-values'\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdata: 'options-wikilist',\n\t\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t\t'visualdata-jsmodule-formfield-optionsfrom-wikilist'\n\t\t\t\t\t)\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tdata: 'options-askquery',\n\t\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t\t'visualdata-jsmodule-formfield-optionsfrom-askquery'\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t],\n\t\t\tvalue: selectOptionsFromValue\n\t\t} );\n\n\t\tvar nullValueInput = new OO.ui.ToggleSwitchWidget( {\n\t\t\tvalue: getPropertyValue( 'options-allow-null' )\n\t\t} );\n\n\t\tvar fieldNullValue = new OO.ui.FieldLayout( nullValueInput, {\n\t\t\tlabel: '',\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-nullvalue' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldNullValue );\n\n\t\t// used to clear \"options-values\", \"options-wikilist\", \"options-askquery\"\n\t\t// Model.selectOptionsFrom = selectOptionsFrom;\n\n\t\tvar fieldSelectOptionsFrom = new OO.ui.FieldLayout( selectOptionsFrom, {\n\t\t\tlabel: new OO.ui.HtmlSnippet(\n\t\t\t\tmw.msg( 'visualdata-jsmodule-formfield-options-from' )\n\t\t\t),\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldSelectOptionsFrom );\n\n\t\tvar messageWidgetOptionsAskQuery = new OO.ui.MessageWidget( {\n\t\t\ttype: 'info',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-message-options-askquery' ),\n\t\t\tinvisibleLabel: false,\n\t\t\tclasses: [ 'VisualDataFormFieldMessage' ]\n\t\t} );\n\n\t\titems.push( messageWidgetOptionsAskQuery );\n\n\t\tvar optionsValuesInput = new OO.ui.TagMultiselectWidget( {\n\t\t\tselected: optionsValues.filter( ( x ) => x !== '' ),\n\t\t\tallowArbitrary: true,\n\t\t\torientation: 'vertical'\n\t\t} );\n\n\t\tvar fieldOptionsValues = new OO.ui.FieldLayout( optionsValuesInput, {\n\t\t\tlabel: '',\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-options-values' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldOptionsValues );\n\n\t\tvar wikilistInput = new mw.widgets.TitleInputWidget( {\n\t\t\tvalue: wikilistValue\n\t\t} );\n\n\t\tvar fieldWikilist = new OO.ui.FieldLayout( wikilistInput, {\n\t\t\tlabel: '',\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-wikilist' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldWikilist );\n\n\t\t// ////////\t@credits: WikiTeq\t///////\n\t\tvar optionsLabelFormulaInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'options-label-formula' ),\n\t\t\tautosize: true,\n\t\t\trows: 1\n\t\t} );\n\n\t\tvar fieldOptionsLabelFormula = new OO.ui.FieldLayout(\n\t\t\toptionsLabelFormulaInput,\n\t\t\t{\n\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t'visualdata-jsmodule-formfield-options-label-formula'\n\t\t\t\t),\n\t\t\t\thelp: mw.msg(\n\t\t\t\t\t'visualdata-jsmodule-formfield-options-label-formula-help'\n\t\t\t\t),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t}\n\t\t);\n\n\t\titems.push( fieldOptionsLabelFormula );\n\n\t\t// ///////////////////////////\n\n\t\tfunction hasVisibleItems( thisFieldset ) {\n\t\t\tfor ( var item of thisFieldset.items ) {\n\t\t\t\tif ( item.isVisible() ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tselectOptionsFrom.on( 'change', function ( value ) {\n\t\t\tfieldOptionsValues.toggle( value === 'options-values' );\n\t\t\tfieldWikilist.toggle( value === 'options-wikilist' );\n\t\t\tfieldOptionsLabelFormula.toggle( value !== 'options-askquery' );\n\t\t\tmessageWidgetOptionsAskQuery.toggle( value === 'options-askquery' );\n\t\t} );\n\n\t\tvar modelMap = {\n\t\t\tselectOptionsFrom: selectOptionsFrom,\n\t\t\t'options-allow-null': nullValueInput,\n\t\t\t'options-values': optionsValuesInput,\n\t\t\t'options-wikilist': wikilistInput,\n\t\t\t'options-label-formula': optionsLabelFormulaInput\n\t\t};\n\n\t\tfunction updateModel( thisVisibleItems ) {\n\t\t\tfor ( var i in modelMap ) {\n\t\t\t\tif ( thisVisibleItems ) {\n\t\t\t\t\tModel[ i ] = modelMap[ i ];\n\t\t\t\t} else {\n\t\t\t\t\tdelete Model[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction onSelectAvailableInputs() {\n\t\t\tvar availableInputsValue = availableInputsInput.getValue();\n\t\t\tvar thisSelectOptionsFromValue = selectOptionsFrom.getValue();\n\t\t\tvar optionInput = inArray( availableInputsValue, VisualDataFunctions.optionsInputs );\n\n\t\t\tfieldSelectOptionsFrom.toggle( optionInput );\n\n\t\t\tmessageWidgetOptionsAskQuery.toggle( optionInput && thisSelectOptionsFromValue === 'options-wikilist' );\n\t\t\tfieldNullValue.toggle( optionInput );\n\n\t\t\tfieldOptionsValues.toggle(\n\t\t\t\toptionInput &&\n\t\t\t\t\t( !thisSelectOptionsFromValue ||\n\t\t\t\t\t\tthisSelectOptionsFromValue === 'options-values' )\n\t\t\t);\n\t\t\tfieldWikilist.toggle( optionInput && thisSelectOptionsFromValue === 'options-wikilist' );\n\n\t\t\tfieldOptionsLabelFormula.toggle(\n\t\t\t\tthisSelectOptionsFromValue !== 'options-askquery' &&\n\t\t\t\tinArray( availableInputsValue, VisualDataFunctions.labelFormulaInputs ) &&\n\t\t\t\t!inArray( availableInputsValue, VisualDataFunctions.lookupInputs )\n\t\t\t);\n\n\t\t\tvar thisVisibleItems = hasVisibleItems( fieldset );\n\t\t\tupdateModel( thisVisibleItems );\n\t\t\tlayout.toggle( thisVisibleItems );\n\t\t}\n\n\t\tfieldset.addItems( items );\n\n\t\tvar visibleItems = hasVisibleItems( fieldset );\n\t\tupdateModel( visibleItems );\n\t\tlayout.toggle( visibleItems );\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tavailableInputsInput.on( 'change', function ( value ) {\n\t\t\tonSelectAvailableInputs();\n\t\t} );\n\n\t\tonSelectAvailableInputs();\n\n\t\treturn selectOptionsFrom;\n\t}\n\n\tfunction handleQueryOptions( availableInputsInput, selectOptionsFrom, parentItems ) {\n\t\tvar items = [];\n\t\tvar layout = new OO.ui.PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: true,\n\t\t\tframed: true,\n\t\t\tclasses: []\n\t\t} );\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: 'Options'\n\t\t} );\n\t\tlayout.$element.append( fieldset.$element );\n\n\t\tparentItems.push( layout );\n\n\t\tvar askqueryInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'options-askquery' )\n\t\t} );\n\n\t\tvar fieldAskquery = new OO.ui.FieldLayout( askqueryInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-askquery-label' ),\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-askquery-help' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldAskquery );\n\n\t\tvar schemaInput = new OO.ui.DropdownInputWidget( {\n\t\t\toptions: VisualDataFunctions.createDropDownOptions(\n\t\t\t\tObject.keys( Schemas ),\n\t\t\t\t{ key: 'value' }\n\t\t\t),\n\t\t\tvalue: getPropertyValue( 'askquery-schema' )\n\t\t} );\n\n\t\tvar fieldSchema = new OO.ui.FieldLayout( schemaInput, {\n\t\t\tlabel: mw.msg(\n\t\t\t\t'visualdata-jsmodule-formfield-askquery-schema-label'\n\t\t\t),\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-askquery-schema-help' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldSchema );\n\n\t\tvar printoutsInputValue = getPropertyValue( 'askquery-printouts' ) || [];\n\n\t\t// var printoutsInput = new mw.widgets.TitlesMultiselectWidget({\n\t\t// \tselected: printoutsInputValue,\n\n\t\t// https://www.semantic-mediawiki.org/wiki/Help:Namespaces\n\t\t// \tnamespace: 102,\n\t\t// });\n\n\t\tvar printoutsInput = new OO.ui.TagMultiselectWidget( {\n\t\t\tallowArbitrary: true,\n\t\t\tselected: printoutsInputValue\n\t\t} );\n\n\t\tvar fieldPrintouts = new OO.ui.FieldLayout( printoutsInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-printouts' ),\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-printouts-help' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldPrintouts );\n\n\t\tvar optionFormulaInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'options-query-formula' )\n\t\t} );\n\n\t\tvar fieldOptionFormula = new OO.ui.FieldLayout( optionFormulaInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-optionformula' ),\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-optionformula-help' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldOptionFormula );\n\n\t\t// ////////\t@credits: WikiTeq\t///////\n\n\t\tvar optionsLabelFormulaInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'options-label-formula' ),\n\t\t\tautosize: true,\n\t\t\trows: 1\n\t\t} );\n\n\t\tvar fieldOptionsLabelFormula = new OO.ui.FieldLayout(\n\t\t\toptionsLabelFormulaInput,\n\t\t\t{\n\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t'visualdata-jsmodule-formfield-options-label-formula'\n\t\t\t\t),\n\t\t\t\thelp: mw.msg(\n\t\t\t\t\t'visualdata-jsmodule-formfield-options-label-formula-help'\n\t\t\t\t),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t}\n\t\t);\n\n\t\titems.push( fieldOptionsLabelFormula );\n\t\t// ///////////////////////////\n\n\t\tvar modelMap = {\n\t\t\t'options-askquery': askqueryInput,\n\t\t\t'askquery-schema': schemaInput,\n\t\t\t'askquery-printouts': printoutsInput,\n\t\t\t'options-query-formula': optionFormulaInput,\n\t\t\t'options-label-formula': optionsLabelFormulaInput\n\t\t};\n\n\t\tfunction updateModel( thisVisibleItems ) {\n\t\t\tfor ( var i in modelMap ) {\n\t\t\t\tif ( thisVisibleItems ) {\n\t\t\t\t\tModel[ i ] = modelMap[ i ];\n\t\t\t\t} else {\n\t\t\t\t\tdelete Model[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction hasVisibleItems( thisFieldset ) {\n\t\t\tfor ( var item of thisFieldset.items ) {\n\t\t\t\tif ( item.isVisible() ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tfunction onSelectAvailableInputs() {\n\t\t\tvar availableInputsValue = availableInputsInput.getValue();\n\t\t\tvar selectOptionsFromValue = selectOptionsFrom.getValue();\n\n\t\t\tvar optionInput = ( selectOptionsFromValue === 'options-askquery' &&\n\t\t\t\tinArray( availableInputsValue, VisualDataFunctions.optionsInputs ) );\n\t\t\tvar lookupInput = inArray( availableInputsValue, VisualDataFunctions.lookupInputs );\n\t\t\tvar labelFormulaInput = ( selectOptionsFromValue === 'options-askquery' &&\n\t\t\t\tinArray( availableInputsValue, VisualDataFunctions.labelFormulaInputs ) );\n\n\t\t\tfieldAskquery.toggle( lookupInput || optionInput );\n\t\t\tfieldPrintouts.toggle( lookupInput || optionInput );\n\t\t\tfieldSchema.toggle( lookupInput || optionInput );\n\t\t\tfieldOptionFormula.toggle( lookupInput || optionInput );\n\t\t\tfieldOptionsLabelFormula.toggle( labelFormulaInput );\n\n\t\t\tvar thisVisibleItems = hasVisibleItems( fieldset );\n\t\t\tupdateModel( thisVisibleItems );\n\t\t\tlayout.toggle( thisVisibleItems );\n\t\t}\n\n\t\tfieldset.addItems( items );\n\n\t\tvar visibleItems = hasVisibleItems( fieldset );\n\t\tupdateModel( visibleItems );\n\t\tlayout.toggle( visibleItems );\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tavailableInputsInput.on( 'change', function ( value ) {\n\t\t\tonSelectAvailableInputs();\n\t\t} );\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tselectOptionsFrom.on( 'change', function ( value ) {\n\t\t\tonSelectAvailableInputs();\n\t\t} );\n\n\t\tonSelectAvailableInputs();\n\t}\n\n\tfunction PanelLayout( config ) {\n\t\tPanelLayout.super.call( this, config );\n\n\t\tthis.fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: ''\n\t\t} );\n\n\t\tthis.populateFieldset();\n\n\t\tthis.$element.append( this.fieldset.$element );\n\t}\n\n\tOO.inheritClass( PanelLayout, OO.ui.PanelLayout );\n\tPanelLayout.prototype.populateFieldset = function () {\n\t\tthis.fieldset.clearItems();\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tvar data = this.data;\n\t\tvar items = [];\n\n\t\tvar currentItem = getCurrentItem();\n\t\tvar parentSchema = {};\n\n\t\t// @see VisualDataSchemas\n\t\tif (\n\t\t\tcurrentItem &&\n\t\t\tcurrentItem.type === 'array' &&\n\t\t\tVisualDataFunctions.isObject( currentItem.items )\n\t\t) {\n\t\t\tparentSchema = currentItem;\n\t\t\tcurrentItem = currentItem.items; // JSON.parse(JSON.stringify(currentItem.items));\n\t\t}\n\n\t\tvar nameInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'name' ) || CurrentKey\n\t\t} );\n\n\t\tModel.name = nameInput;\n\n\t\titems.push(\n\t\t\tnew OO.ui.FieldLayout( nameInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-name' ),\n\t\t\t\thelpInline: true,\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-name-help' ),\n\t\t\t\talign: 'top'\n\t\t\t} )\n\t\t);\n\n\t\tvar visibilityInputValue = getPropertyValue( 'visibility' );\n\n\t\tvar visibilityInput = new OO.ui.DropdownInputWidget( {\n\t\t\toptions: VisualDataFunctions.createDropDownOptions( {\n\t\t\t\tvisible: mw.msg( 'visualdata-jsmodule-formfield-visibility-visible' ),\n\t\t\t\tcondition: mw.msg( 'visualdata-jsmodule-formfield-visibility-condition' ),\n\t\t\t\thidden: mw.msg( 'visualdata-jsmodule-formfield-visibility-hidden' ),\n\t\t\t\t'oncreate-only': mw.msg(\n\t\t\t\t\t'visualdata-jsmodule-formfield-visibility-create-only'\n\t\t\t\t)\n\t\t\t} ),\n\t\t\tvalue: visibilityInputValue\n\t\t} );\n\n\t\tModel.visibility = visibilityInput;\n\n\t\titems.push(\n\t\t\tnew OO.ui.FieldLayout( visibilityInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-visibility-label' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-visibility-help' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} )\n\t\t);\n\n\t\t// ------------------ show-if -----------------\n\n\t\tvar otherFields = Object.keys( ParentObj ).filter( ( x ) => {\n\t\t\treturn ( x !== CurrentKey && ParentObj[ x ].wiki.type === 'property' &&\n\t\t\t\tParentObj[ x ].wiki[ 'multiple-items' ] === false );\n\t\t} );\n\n\t\tvar showifFieldInput = new OO.ui.DropdownInputWidget( {\n\t\t\toptions: VisualDataFunctions.createDropDownOptions( otherFields, { key: 'value' } ),\n\t\t\tvalue: getPropertyValue( 'showif-field' )\n\t\t} );\n\n\t\tvar showifConditionInput = new OO.ui.DropdownInputWidget( {\n\t\t\t// @https://github.com/Knowledge-Wiki/SemanticResultFormats/blob/561e5304e17fccc894d7b38ab88a03b75606d6c8/formats/datatables/Api.php\n\t\t\toptions: VisualDataFunctions.createDropDownOptions( {\n\t\t\t\t'=': mw.msg( 'visualdata-jsmodule-formfield-showif-condition-=' ),\n\t\t\t\t'!=': mw.msg( 'visualdata-jsmodule-formfield-showif-condition-!=' ),\n\t\t\t\tstarts: mw.msg( 'visualdata-jsmodule-formfield-showif-condition-starts' ),\n\t\t\t\t'!starts': mw.msg( 'visualdata-jsmodule-formfield-showif-condition-!starts' ),\n\t\t\t\tcontains: mw.msg( 'visualdata-jsmodule-formfield-showif-condition-contains' ),\n\t\t\t\t'!contains': mw.msg( 'visualdata-jsmodule-formfield-showif-condition-!contains' ),\n\t\t\t\tends: mw.msg( 'visualdata-jsmodule-formfield-showif-condition-ends' ),\n\t\t\t\t'!ends': mw.msg( 'visualdata-jsmodule-formfield-showif-condition-!ends' ),\n\t\t\t\t'!null': mw.msg( 'visualdata-jsmodule-formfield-showif-condition-!null' ),\n\t\t\t\tregex: mw.msg( 'visualdata-jsmodule-formfield-showif-condition-regex' )\n\t\t\t} ),\n\t\t\tvalue: getPropertyValue( 'showif-condition' )\n\t\t} );\n\n\t\tvar showifValueInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'showif-value' )\n\t\t} );\n\n\t\tshowifConditionInput.on( 'change', function ( value ) {\n\t\t\tshowifValueInput.toggle( value !== '!null' );\n\t\t\tupdateModelShowif( getPropertyValue( 'visibility' ) === 'condition' );\n\t\t} );\n\n\t\tshowifValueInput.toggle( getPropertyValue( 'showif-condition' ) !== '!null' );\n\n\t\tvar layoutHorizontal = new OO.ui.HorizontalLayout( { items: [\n\t\t\tshowifFieldInput,\n\t\t\tshowifConditionInput,\n\t\t\tshowifValueInput\n\t\t] } );\n\n\t\t// Model[ 'showif-field' ] = showifFieldInput;\n\t\t// Model[ 'showif-equal' ] = showifConditionInput;\n\t\t// Model[ 'showif-value' ] = showifValueInput;\n\n\t\tvar showifField = new OO.ui.FieldLayout(\n\t\t\tnew OO.ui.Widget( {\n\t\t\t\tcontent: [ layoutHorizontal ]\n\t\t\t} ),\n\t\t\t{\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-showif' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-showif-help' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t}\n\t\t);\n\n\t\titems.push( showifField );\n\n\t\tvar modelMap = {\n\t\t\t'showif-field': showifFieldInput,\n\t\t\t'showif-condition': showifConditionInput,\n\t\t\t'showif-value': showifValueInput\n\t\t};\n\n\t\tfunction updateModelShowif( thisVisibleItems ) {\n\t\t\tfor ( var i in modelMap ) {\n\t\t\t\tif ( thisVisibleItems ) {\n\t\t\t\t\tModel[ i ] = modelMap[ i ];\n\t\t\t\t} else {\n\t\t\t\t\tdelete Model[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( getPropertyValue( 'showif-condition' ) === '!null' ) {\n\t\t\t\tdelete Model[ 'showif-value' ];\n\t\t\t}\n\t\t}\n\n\t\tupdateModelShowif( visibilityInputValue === 'condition' );\n\t\tshowifField.toggle( visibilityInputValue === 'condition' );\n\n\t\t// ------------------ show-if >>>>>>>>>>>>>>>>>\n\n\t\tvar labelValue = getPropertyValue( 'label' );\n\n\t\tvar labelInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: labelValue\n\t\t} );\n\n\t\tModel.label = labelInput;\n\n\t\tvar labelField = new OO.ui.FieldLayout( labelInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-label' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( labelField );\n\n\t\tvar helpMessageInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'help-message' ),\n\t\t\tautosize: true,\n\t\t\trows: 2\n\t\t} );\n\n\t\tModel[ 'help-message' ] = helpMessageInput;\n\n\t\tvar helpMessageField = new OO.ui.FieldLayout( helpMessageInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-help-message' ),\n\t\t\thelpInline: true,\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-help-message-help' ),\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( helpMessageField );\n\n\t\tvar propertyModelValue = 'json-schema';\n\t\tif ( Config.SMW ) {\n\t\t\tpropertyModelValue = getPropertyValue( 'propertyModel' ) || 'smw-property';\n\t\t\tvar propertyModelInput = new OO.ui.RadioSelectInputWidget( {\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdata: 'smw-property',\n\t\t\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t\t\t'visualdata-jsmodule-formfield-propertymodel-smwproperty'\n\t\t\t\t\t\t)\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tdata: 'json-schema',\n\t\t\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t\t\t'visualdata-jsmodule-formfield-propertymodel-jsonschema'\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t],\n\t\t\t\tvalue: propertyModelValue\n\t\t\t} );\n\n\t\t\tModel.propertyModel = propertyModelInput;\n\n\t\t\titems.push(\n\t\t\t\tnew OO.ui.FieldLayout( propertyModelInput, {\n\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-propertymodel' ),\n\t\t\t\t\thelpInline: true,\n\t\t\t\t\talign: 'top'\n\t\t\t\t} )\n\t\t\t);\n\n\t\t\tvar SMWpropertiesValue =\n\t\t\t\tgetPropertyValue( 'SMW-property' ) ||\n\t\t\t\tObject.keys( VisualDataSMW.getSemanticProperties() )[ 0 ];\n\n\t\t\tvar SMWpropertiesInput = new OO.ui.DropdownInputWidget( {\n\t\t\t\toptions: VisualDataFunctions.createDropDownOptions(\n\t\t\t\t\tObject.keys( VisualDataSMW.getSemanticProperties() ),\n\t\t\t\t\t{ key: 'value' }\n\t\t\t\t),\n\t\t\t\tvalue: SMWpropertiesValue\n\t\t\t} );\n\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tSMWpropertiesInput.on( 'change', function ( value ) {\n\t\t\t\tredrawAvailableInputs();\n\t\t\t} );\n\n\t\t\tModel[ 'SMW-property' ] = SMWpropertiesInput;\n\n\t\t\tvar fieldSMWpropertiesInput = new OO.ui.FieldLayout( SMWpropertiesInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-smwproperties' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} );\n\n\t\t\titems.push( fieldSMWpropertiesInput );\n\t\t}\n\n\t\t// var smwTypesInput = new OO.ui.DropdownInputWidget({\n\t\t// \toptions: VisualDataFunctions.createDropDownOptions(VisualDataSMW.TypeLabels),\n\t\t// \tvalue:\n\t\t// });\n\n\t\tvar jsonSchemaValue = getPropertyValue( 'jsonSchema-type' ) || 'string';\n\n\t\tvar jsonSchemaInput = new OO.ui.DropdownInputWidget( {\n\t\t\toptions: VisualDataFunctions.createDropDownOptions(\n\t\t\t\t[\n\t\t\t\t\t'string',\n\t\t\t\t\t'number',\n\t\t\t\t\t'integer',\n\t\t\t\t\t'boolean'\n\t\t\t\t\t// select rather a type and toggle \"multiple values\"\n\t\t\t\t\t// \"array\",\n\t\t\t\t],\n\t\t\t\t{ key: 'value' }\n\t\t\t),\n\t\t\tvalue: jsonSchemaValue\n\t\t} );\n\n\t\tModel[ 'jsonSchema-type' ] = jsonSchemaInput;\n\n\t\tvar fieldjsonSchemaInput = new OO.ui.FieldLayout( jsonSchemaInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-schematypes' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldjsonSchemaInput );\n\n\t\tvar textFormat = [\n\t\t\t'color',\n\t\t\t'date',\n\t\t\t'datetime',\n\t\t\t'datetime-local',\n\t\t\t'email',\n\t\t\t'month',\n\t\t\t'password',\n\t\t\t'number',\n\t\t\t'range',\n\t\t\t'tel',\n\t\t\t'text',\n\t\t\t'textarea',\n\t\t\t'time',\n\t\t\t'url',\n\t\t\t'week'\n\t\t];\n\n\t\tvar jsonSchemaFormatValue = getPropertyValue( 'jsonSchema-format' ) || 'text';\n\t\tvar jsonSchemaFormatInput = new OO.ui.DropdownInputWidget( {\n\t\t\t// , { key: \"value\" }\n\t\t\toptions: VisualDataFunctions.createDropDownOptions( textFormat, {\n\t\t\t\tkey: 'value'\n\t\t\t} ),\n\t\t\tvalue: jsonSchemaFormatValue\n\t\t} );\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tjsonSchemaFormatInput.on( 'change', function ( value ) {\n\t\t\tredrawAvailableInputs();\n\t\t} );\n\n\t\tModel[ 'jsonSchema-format' ] = jsonSchemaFormatInput;\n\n\t\tvar fieldjsonSchemaFormatInput = new OO.ui.FieldLayout(\n\t\t\tjsonSchemaFormatInput,\n\t\t\t{\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-schematextsubtypes' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t}\n\t\t);\n\n\t\titems.push( fieldjsonSchemaFormatInput );\n\n\t\tjsonSchemaInput.on( 'change', function ( value ) {\n\t\t\tswitch ( value ) {\n\t\t\t\tcase 'string':\n\t\t\t\t\tfieldjsonSchemaFormatInput.toggle( true );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'integer':\n\t\t\t\tcase 'number':\n\t\t\t\tcase 'boolean':\n\t\t\t\t\tfieldjsonSchemaFormatInput.toggle( false );\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tredrawAvailableInputs();\n\t\t} );\n\n\t\tif ( Config.SMW ) {\n\t\t\tfieldSMWpropertiesInput.toggle( propertyModelValue === 'smw-property' );\n\t\t}\n\t\tfieldjsonSchemaInput.toggle( propertyModelValue === 'json-schema' );\n\t\tfieldjsonSchemaFormatInput.toggle(\n\t\t\tpropertyModelValue === 'json-schema' && jsonSchemaValue === 'string'\n\t\t);\n\n\t\tif ( Config.SMW ) {\n\t\t\tpropertyModelInput.on( 'change', function ( value ) {\n\t\t\t\tswitch ( value ) {\n\t\t\t\t\tcase 'smw-property':\n\t\t\t\t\t\tfieldSMWpropertiesInput.toggle( true );\n\t\t\t\t\t\tfieldjsonSchemaInput.toggle( false );\n\t\t\t\t\t\tfieldjsonSchemaFormatInput.toggle( false );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'json-schema':\n\t\t\t\t\t\tfieldSMWpropertiesInput.toggle( false );\n\t\t\t\t\t\tfieldjsonSchemaInput.toggle( true );\n\t\t\t\t\t\tfieldjsonSchemaFormatInput.toggle(\n\t\t\t\t\t\t\tgetPropertyValue( 'jsonSchema-type' ) === 'string'\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tredrawAvailableInputs();\n\t\t\t} );\n\t\t}\n\n\t\tvar multipleItemsInputValue =\n\t\t\tgetPropertyValue( 'multiple-items' ) || parentSchema.type === 'array';\n\t\tvar multipleItemsInput = new OO.ui.ToggleSwitchWidget( {\n\t\t\tvalue: multipleItemsInputValue\n\t\t} );\n\n\t\tModel[ 'multiple-items' ] = multipleItemsInput;\n\n\t\tvar layoutParentSchema = VisualDataSchemas.parentSchemaContainer(\n\t\t\t( Model.parentSchema = {} ),\n\t\t\t{\n\t\t\t\tgetPropertyValue: getPropertyValue\n\t\t\t}\n\t\t);\n\t\t// layoutParentSchema.toggle( multipleItemsInputValue );\n\n\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\ttype: 'info',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-message-more-inputs' ),\n\t\t\tinvisibleLabel: false,\n\t\t\tclasses: [ 'VisualDataFormFieldMessage' ]\n\t\t} );\n\n\t\tvar fieldMultipleValues = new OO.ui.FieldLayout( multipleItemsInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-multiple-values' ),\n\t\t\thelp: '',\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldMultipleValues );\n\t\titems.push( layoutParentSchema );\n\n\t\tvar availableInputsValue = getPropertyValue( 'preferred-input' );\n\t\t// preferred input based on property type\n\t\tvar availableInputsInput = new OO.ui.DropdownInputWidget( {\n\t\t\t// , { key: \"value\" }\n\t\t\toptions: VisualDataFunctions.createDropDownOptions(\n\t\t\t\tgetAvailableInputs(\n\t\t\t\t\tpropertyModelValue,\n\t\t\t\t\tSMWpropertiesValue,\n\t\t\t\t\tjsonSchemaValue,\n\t\t\t\t\tjsonSchemaFormatValue,\n\t\t\t\t\tmultipleItemsInputValue\n\t\t\t\t),\n\t\t\t\t{\n\t\t\t\t\tkey: 'value'\n\t\t\t\t}\n\t\t\t),\n\t\t\tvalue: availableInputsValue\n\t\t} );\n\n\t\tavailableInputsInput.on( 'change', function ( value ) {\n\t\t\tvar thisDefaultValueInput = getDefaultValueInput();\n\n\t\t\t// eslint-disable-next-line no-use-before-define\n\t\t\tModel.default = defaultValueInput;\n\n\t\t\tif (\n\t\t\t\tvalue === 'OO.ui.SelectFileWidget' &&\n\t\t\t\t!( 'accept' in thisDefaultValueInput )\n\t\t\t) {\n\t\t\t\tthisDefaultValueInput.accept = Config.allowedMimeTypes;\n\t\t\t}\n\t\t} );\n\n\t\tModel[ 'preferred-input' ] = availableInputsInput;\n\n\t\tvar inputConfigButton = new OO.ui.ButtonWidget( {\n\t\t\ticon: 'settings',\n\t\t\tflags: []\n\t\t} );\n\n\t\tvar defaultInputConfig = getPropertyValue( 'input-config' ) || {};\n\n\t\tModel[ 'input-config' ] = new VisualDataFunctions.MockupOOUIClass(\n\t\t\tdefaultInputConfig\n\t\t);\n\n\t\tinputConfigButton.on( 'click', function () {\n\t\t\tvar dataType = null;\n\t\t\tif ( Config.SMW ) {\n\t\t\t\tvar SMWproperty = getPropertyValue( 'SMW-property' );\n\t\t\t\tdataType = VisualDataSMW.getSemanticProperty( SMWproperty, 'type' );\n\t\t\t\tif ( !dataType ) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error( SMWproperty + ' property does not exist' );\n\t\t\t\t\tdataType = '_wpg';\n\t\t\t\t}\n\t\t\t}\n\t\t\tVisualDataInputConfigInst.openDialog(\n\t\t\t\tModel[ 'input-config' ],\n\t\t\t\tavailableInputsInput.getValue(),\n\t\t\t\tVisualDataFunctions.getInputHelpUrl( availableInputsInput.getValue() ),\n\t\t\t\tnull\n\t\t\t);\n\t\t} );\n\n\t\titems.push( messageWidget );\n\n\t\titems.push(\n\t\t\tnew OO.ui.ActionFieldLayout( availableInputsInput, inputConfigButton, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-availableinputs' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} )\n\t\t);\n\n\t\tvar selectOptionsFrom = handleOptionsInputs( availableInputsInput, items );\n\t\thandleQueryOptions( availableInputsInput, selectOptionsFrom, items );\n\n\t\tvar requiredInput = new OO.ui.ToggleSwitchWidget( {\n\t\t\tvalue: !!getPropertyValue( 'required' )\n\t\t} );\n\n\t\tModel.required = requiredInput;\n\n\t\tvar fieldRequiredInput = new OO.ui.FieldLayout( requiredInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-required' ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\tmultipleItemsInput.on( 'change', function ( value ) {\n\t\t\tredrawAvailableInputs();\n\t\t\tlayoutParentSchema.toggle( value );\n\t\t\tfieldRequiredInput.toggle( !value );\n\t\t\tnameInput.setDisabled( value );\n\t\t} );\n\n\t\tfieldRequiredInput.toggle( !multipleItemsInputValue );\n\n\t\titems.push( fieldRequiredInput );\n\n\t\tfunction getDefaultValueInput() {\n\t\t\t// @ATTENTION ! don't get the specific input othwerwise\n\t\t\t// the default values cannot be parsed as wikitext\n\t\t\t// print always a textInput and cast\n\t\t\t// the value server-side\n\n\t\t\tvar ret;\n\n\t\t\t// var availableInputs = getAvailableInputs(\n\t\t\t// \tgetPropertyValue(\"propertyModel\") || \"json-schema\",\n\t\t\t// \tgetPropertyValue(\"SMW-property\"),\n\t\t\t// \tgetPropertyValue(\"jsonSchema-type\"),\n\t\t\t// \t\"text\",\n\t\t\t// \tgetPropertyValue(\"multiple-items\")\n\t\t\t// );\n\n\t\t\t// @TODO use instead availableInputsInput.getValue()\n\t\t\t// as long as all the inputs support the standard\n\t\t\t// OOUI interface for the use with OO.ui.TagMultiselectWidget\n\t\t\t// -> inputWidget\n\t\t\t// var intputName = availableInputs[0]; // availableInputsInput.getValue()\n\n\t\t\t// var inputWidget = VisualDataFunctions.inputInstanceFromName(\n\t\t\t// \tintputName,\n\t\t\t// \t{\n\t\t\t// \t\tid: \"visualdata-jsmodule-formfield-default-value-input\",\n\t\t\t// \t}\n\t\t\t// );\n\n\t\t\tvar inputWidget = new OO.ui.TextInputWidget( {\n\t\t\t\t// value: getPropertyValue( 'default' ),\n\t\t\t\tid: 'visualdata-jsmodule-formfield-default-value-input'\n\t\t\t} );\n\n\t\t\tif ( !getPropertyValue( 'multiple-items' ) ) {\n\t\t\t\tif ( 'default' in Model ) {\n\t\t\t\t\tvar value = Model.default.getValue();\n\t\t\t\t\tif ( Array.isArray( value ) && value.length ) {\n\t\t\t\t\t\tModel.default.setValue( value[ 0 ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tinputWidget.setValue( getPropertyValue( 'default' ) );\n\t\t\t\t// set the proper input for each type\n\n\t\t\t\tret = inputWidget;\n\t\t\t\t// return new OO.ui.TextInputWidget({\n\t\t\t\t// \tvalue: getPropertyValue(\"default\"),\n\t\t\t\t// \tid: \"visualdata-jsmodule-formfield-default-value-input\",\n\t\t\t\t// });\n\t\t\t} else {\n\t\t\t\t// OO.ui.TagMultiselectWidget -> inputWidget: inputWidget does not work\n\t\t\t\t// with OO.ui.ToggleSwitchWidget\n\t\t\t\t// if (intputName === \"OO.ui.ToggleSwitchWidget\") {\n\t\t\t\t// \tinputWidget = new OO.ui.NumberInputWidget({\n\t\t\t\t// \t\tmin: 0,\n\t\t\t\t// \t\tmax: 1,\n\t\t\t\t// \t\tid: \"visualdata-jsmodule-formfield-default-value-input\",\n\t\t\t\t// \t});\n\t\t\t\t// }\n\n\t\t\t\tvar value = [];\n\t\t\t\tvar val = getPropertyValue( 'default' );\n\n\t\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\t\tvalue = val;\n\t\t\t\t} else if ( val !== '' ) {\n\t\t\t\t\tvalue = [ val ];\n\t\t\t\t}\n\n\t\t\t\tret = new OO.ui.TagMultiselectWidget( {\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tselected: value,\n\t\t\t\t\tallowArbitrary: true,\n\t\t\t\t\tallowEditTags: true,\n\t\t\t\t\tallowReordering: true,\n\t\t\t\t\t// 0 means unlimited\n\t\t\t\t\t// tagLimit: !!multipleItemsInputValue ? 0 : 1,\n\t\t\t\t\tdraggable: true,\n\t\t\t\t\tinputPosition: 'outline',\n\t\t\t\t\tinputWidget: inputWidget,\n\t\t\t\t\tid: 'visualdata-jsmodule-formfield-default-value-input'\n\t\t\t\t} );\n\t\t\t}\n\t\t\t$( '#visualdata-jsmodule-formfield-default-value-input' ).replaceWith(\n\t\t\t\tret.$element\n\t\t\t);\n\n\t\t\treturn ret;\n\t\t}\n\n\t\tvar defaultValueInput = getDefaultValueInput();\n\n\t\tModel.default = defaultValueInput;\n\n\t\titems.push(\n\t\t\tnew OO.ui.FieldLayout( defaultValueInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-default' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-default-value-help' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} )\n\t\t);\n\n\t\tvar valueFormulaInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'value-formula' ),\n\t\t\tautosize: true,\n\t\t\trows: 1\n\t\t} );\n\n\t\tModel[ 'value-formula' ] = valueFormulaInput;\n\n\t\titems.push(\n\t\t\tnew OO.ui.FieldLayout( valueFormulaInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-valueformula' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-valueformula-help' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} )\n\t\t);\n\n\t\tfunction onVisibilityInputChange( value ) {\n\t\t\tonToggleHiddenInput( value === 'hidden' );\n\t\t\tshowifField.toggle( value === 'condition' );\n\t\t\tupdateModelShowif( value === 'condition' );\n\t\t}\n\n\t\tvisibilityInput.on( 'change', function ( value ) {\n\t\t\tonVisibilityInputChange( value );\n\t\t} );\n\n\t\tfunction onToggleHiddenInput( hidden ) {\n\t\t\tif ( hidden ) {\n\t\t\t\tModel[ 'preferred-input' ].setValue( 'OO.ui.TextInputWidget' );\n\t\t\t}\n\t\t\tavailableInputsInput.setDisabled( hidden );\n\t\t\trequiredInput.setDisabled( hidden );\n\t\t\tfieldMultipleValues.toggle( !hidden );\n\t\t\tlayoutParentSchema.toggle( !hidden && ( getPropertyValue( 'multiple-items' ) || parentSchema.type === 'array' ) );\n\t\t\tnameInput.setDisabled( layoutParentSchema.isVisible() );\n\t\t\tlabelField.toggle( !hidden );\n\t\t\thelpMessageField.toggle( !hidden );\n\t\t}\n\n\t\tonVisibilityInputChange( visibilityInputValue );\n\n\t\tfunction redrawAvailableInputs() {\n\t\t\tavailableInputsInput.setOptions(\n\t\t\t\tVisualDataFunctions.createDropDownOptions(\n\t\t\t\t\tgetAvailableInputs(\n\t\t\t\t\t\tgetPropertyValue( 'propertyModel' ) || 'json-schema',\n\t\t\t\t\t\tgetPropertyValue( 'SMW-property' ),\n\t\t\t\t\t\tgetPropertyValue( 'jsonSchema-type' ),\n\t\t\t\t\t\tgetPropertyValue( 'jsonSchema-format' ),\n\t\t\t\t\t\tgetPropertyValue( 'multiple-items' )\n\t\t\t\t\t),\n\t\t\t\t\t{\n\t\t\t\t\t\tkey: 'value'\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t);\n\n\t\t\tvar thisDefaultValueInput = getDefaultValueInput();\n\t\t\tModel.default = thisDefaultValueInput;\n\t\t}\n\n\t\titems = items.filter( function ( x ) {\n\t\t\treturn !( 'items' in x ) || x.items.length;\n\t\t} );\n\n\t\tthis.isEmpty = !items.length;\n\n\t\tthis.fieldset.addItems( items );\n\n\t\tsetTimeout( function () {\n\t\t\tVisualDataFunctions.removeNbspFromLayoutHeader(\n\t\t\t\t'#visualdata-processDialogEditField'\n\t\t\t);\n\t\t}, 30 );\n\t};\n\n\t// eslint-disable-next-line no-unused-vars\n\tPanelLayout.prototype.addItem = function ( property ) {\n\t\tthis.populateFieldset();\n\t};\n\n\tfunction ProcessDialog( config ) {\n\t\tProcessDialog.super.call( this, config );\n\t}\n\tOO.inheritClass( ProcessDialog, OO.ui.ProcessDialog );\n\n\tProcessDialog.static.name = 'myDialog';\n\t// ProcessDialog.static.title = mw.msg(\n\t// \"visualdata-jsmodule-manageproperties-define-property\"\n\t// );\n\tProcessDialog.static.actions = [\n\t\t{\n\t\t\taction: 'save',\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-save' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-cancel' ),\n\t\t\tflags: [ 'safe', 'close' ]\n\t\t}\n\t];\n\n\tProcessDialog.prototype.initialize = function () {\n\t\tProcessDialog.super.prototype.initialize.apply( this, arguments );\n\n\t\tpanelLayout = new PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: true,\n\t\t\tclasses: [],\n\t\t\tdata: {}\n\t\t} );\n\n\t\tvar frameA = new OO.ui.PanelLayout( {\n\t\t\t$content: [ panelLayout.$element ],\n\t\t\texpanded: false,\n\t\t\t// framed: false,\n\t\t\tpadded: false,\n\t\t\tdata: { name: 'manageforms' }\n\t\t} );\n\n\t\tthis.$body.append( frameA.$element );\n\t};\n\n\tProcessDialog.prototype.getActionProcess = function ( action ) {\n\t\tvar dialog = this;\n\n\t\tvar currentItem = getCurrentItem() || {\n\t\t\ttype: '',\n\t\t\twiki: { type: 'property' }\n\t\t};\n\t\tvar parentSchema = currentItem;\n\t\tif (\n\t\t\tcurrentItem.type === 'array' &&\n\t\t\tVisualDataFunctions.isObject( currentItem.items )\n\t\t) {\n\t\t\tcurrentItem = currentItem.items;\n\t\t}\n\n\t\tfunction getValueRec( model, thisObj ) {\n\t\t\tfor ( var i in model ) {\n\t\t\t\tif ( !( 'getValue' in model[ i ] ) ) {\n\t\t\t\t\tgetValueRec( model[ i ], ( thisObj[ i ] = {} ) );\n\t\t\t\t} else {\n\t\t\t\t\tthisObj[ i ] = VisualDataSchemas.getWidgetValue( model[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tswitch ( action ) {\n\t\t\tcase 'save':\n\t\t\t\tvar obj = { type: 'property' };\n\t\t\t\tgetValueRec( Model, obj );\n\n\t\t\t\tvar objName = obj[ 'multiple-items' ] ? obj.parentSchema.name : obj.name;\n\n\t\t\t\tswitch ( obj.propertyModel ) {\n\t\t\t\t\tcase 'json-schema':\n\t\t\t\t\t\tdelete obj[ 'SMW-property' ];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'smw-property':\n\t\t\t\t\t\t// *** important! used to recover the type\n\t\t\t\t\t\t// if a property has been deleted\n\t\t\t\t\t\tobj[ 'smw-property-type' ] = VisualDataSMW.getSemanticProperty(\n\t\t\t\t\t\t\tobj[ 'SMW-property' ],\n\t\t\t\t\t\t\t'type'\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// delete obj[\"jsonSchema-type\"];\n\t\t\t\t\t\t// delete obj[\"jsonSchema-format\"];\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tvar alert = null;\n\t\t\t\tif ( objName === '' ) {\n\t\t\t\t\talert = mw.msg( 'visualdata-jsmodule-schemas-alert-noname' );\n\t\t\t\t} else if ( objName !== CurrentKey && objName in ParentObj ) {\n\t\t\t\t\talert = mw.msg( 'visualdata-jsmodule-schemas-alert-existing-item' );\n\t\t\t\t}\n\n\t\t\t\tif ( alert ) {\n\t\t\t\t\tVisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( alert ), {\n\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t} );\n\t\t\t\t\treturn ProcessDialog.super.prototype.getActionProcess.call(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\taction\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tVisualDataFunctions.renameObjectKey( ParentObj, CurrentKey, objName );\n\n\t\t\t\tParentObj[ objName ] = VisualDataSchemas.handleSaveArray(\n\t\t\t\t\tparentSchema,\n\t\t\t\t\tobj\n\t\t\t\t);\n\n\t\t\t\tCallback();\n\n\t\t\t\treturn new OO.ui.Process( function () {\n\t\t\t\t\tdialog.close( { action: action } );\n\t\t\t\t} );\n\t\t}\n\n\t\treturn ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t};\n\n\tProcessDialog.prototype.getTeardownProcess = function ( data ) {\n\t\treturn ProcessDialog.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( function () {\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\t/**\n\t * Override getBodyHeight to create a tall dialog relative to the screen.\n\t *\n\t * @return {number} Body height\n\t */\n\tProcessDialog.prototype.getBodyHeight = function () {\n\t\t// see here https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs\n\t\t// this.page1.content.$element.outerHeight( true );\n\t\treturn window.innerHeight - 100;\n\t};\n\n\tfunction openDialog( callback, parentObj, fieldName ) {\n\t\tCallback = callback;\n\t\tModel = {};\n\n\t\t// *** place here properties to copy\n\t\tif ( fieldName in parentObj && 'uuid' in parentObj[ fieldName ].wiki ) {\n\t\t\tModel.uuid = new VisualDataFunctions.MockupOOUIClass(\n\t\t\t\tparentObj[ fieldName ].wiki.uuid );\n\t\t}\n\n\t\tParentObj = parentObj;\n\n\t\tCurrentKey =\n\t\t\tfieldName ||\n\t\t\tVisualDataFunctions.createNewKey(\n\t\t\t\tparentObj,\n\t\t\t\tmw.msg( 'visualdata-jsmodule-formfield-newlabel' )\n\t\t\t);\n\n\t\tvar processDialog = new ProcessDialog( {\n\t\t\tsize: 'large',\n\t\t\tclasses: [],\n\t\t\tid: 'visualdata-processDialogEditField'\n\t\t} );\n\n\t\tWindowManager.newWindow( processDialog, {\n\t\t\ttitle:\n\t\t\t\tmw.msg(\n\t\t\t\t\t// The following messages are used here:\n\t\t\t\t\t// * visualdata-jsmodule-manageproperties-define-property\n\t\t\t\t\t// * visualdata-jsmodule-manageproperties-define-property - [name]\n\t\t\t\t\t'visualdata-jsmodule-formfield-definefield'\n\t\t\t\t) + ( fieldName ? ' - ' + fieldName : '' )\n\t\t} );\n\t}\n\n\treturn {\n\t\topenDialog\n\t};\n};\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataForms.js","messages":[{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":71,"column":6,"nodeType":"CallExpression","endLine":71,"endColumn":58},{"ruleId":"max-len","severity":1,"message":"This line has a length of 106. Maximum allowed is 100.","line":80,"column":1,"nodeType":"Program","messageId":"max","endLine":80,"endColumn":98},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":209,"column":5,"nodeType":"CallExpression","endLine":209,"endColumn":29},{"ruleId":"max-len","severity":1,"message":"This line has a length of 104. Maximum allowed is 100.","line":407,"column":1,"nodeType":"Program","messageId":"max","endLine":407,"endColumn":96},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":431,"column":19,"nodeType":"NewExpression","endLine":431,"endColumn":63},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":435,"column":19,"nodeType":"NewExpression","endLine":435,"endColumn":63},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":442,"column":19,"nodeType":"NewExpression","endLine":442,"endColumn":41},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":463,"column":17,"nodeType":"NewExpression","endLine":463,"endColumn":54},{"ruleId":"security/detect-non-literal-regexp","severity":1,"message":"Found non-literal argument to RegExp Constructor","line":491,"column":17,"nodeType":"NewExpression","endLine":491,"endColumn":66},{"ruleId":"max-len","severity":1,"message":"This line has a length of 117. Maximum allowed is 100.","line":509,"column":1,"nodeType":"Program","messageId":"max","endLine":509,"endColumn":88},{"ruleId":"max-len","severity":1,"message":"This line has a length of 131. Maximum allowed is 100.","line":526,"column":1,"nodeType":"Program","messageId":"max","endLine":526,"endColumn":102},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1390,"column":26,"nodeType":"CallExpression","endLine":1390,"endColumn":78},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1458,"column":6,"nodeType":"CallExpression","endLine":1460,"endColumn":7},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1461,"column":7,"nodeType":"CallExpression","endLine":1461,"endColumn":69},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1464,"column":7,"nodeType":"CallExpression","endLine":1466,"endColumn":8},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1492,"column":7,"nodeType":"CallExpression","endLine":1494,"endColumn":8},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1495,"column":8,"nodeType":"CallExpression","endLine":1495,"endColumn":48},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1498,"column":8,"nodeType":"CallExpression","endLine":1500,"endColumn":9},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":2129,"column":5,"nodeType":"CallExpression","endLine":2129,"endColumn":42},{"ruleId":"max-len","severity":1,"message":"This line has a length of 107. Maximum allowed is 100.","line":2284,"column":1,"nodeType":"Program","messageId":"max","endLine":2284,"endColumn":96},{"ruleId":"max-len","severity":1,"message":"This line has a length of 109. Maximum allowed is 100.","line":2426,"column":1,"nodeType":"Program","messageId":"max","endLine":2426,"endColumn":92},{"ruleId":"max-len","severity":1,"message":"This line has a length of 102. Maximum allowed is 100.","line":2758,"column":1,"nodeType":"Program","messageId":"max","endLine":2758,"endColumn":85},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":2776,"column":7,"nodeType":"VariableDeclarator","endLine":2776,"endColumn":25},{"ruleId":"max-len","severity":1,"message":"This line has a length of 102. Maximum allowed is 100.","line":2950,"column":1,"nodeType":"Program","messageId":"max","endLine":2950,"endColumn":70},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":3074,"column":10,"nodeType":"CallExpression","endLine":3074,"endColumn":67},{"ruleId":"max-len","severity":1,"message":"This line has a length of 105. Maximum allowed is 100.","line":3162,"column":1,"nodeType":"Program","messageId":"max","endLine":3162,"endColumn":88},{"ruleId":"max-len","severity":1,"message":"This line has a length of 101. Maximum allowed is 100.","line":3165,"column":1,"nodeType":"Program","messageId":"max","endLine":3165,"endColumn":87},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":3385,"column":15,"nodeType":"CallExpression","endLine":3387,"endColumn":6},{"ruleId":"max-len","severity":1,"message":"This line has a length of 119. Maximum allowed is 100.","line":3409,"column":1,"nodeType":"Program","messageId":"max","endLine":3409,"endColumn":108},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":3456,"column":3,"nodeType":"CallExpression","endLine":3456,"endColumn":39}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":106,"column":42,"nodeType":"Identifier","messageId":"unusedVar","endLine":106,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'resolve' is defined but never used.","line":110,"column":44,"nodeType":"Identifier","messageId":"unusedVar","endLine":110,"endColumn":51,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":110,"column":53,"nodeType":"Identifier","messageId":"unusedVar","endLine":110,"endColumn":59,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'item' is defined but never used.","line":136,"column":33,"nodeType":"Identifier","messageId":"unusedVar","endLine":136,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'items' is defined but never used.","line":141,"column":36,"nodeType":"Identifier","messageId":"unusedVar","endLine":141,"endColumn":41,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":211,"column":39,"nodeType":"Identifier","messageId":"unusedVar","endLine":211,"endColumn":45,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'resolve' is defined but never used.","line":217,"column":41,"nodeType":"Identifier","messageId":"unusedVar","endLine":217,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":217,"column":50,"nodeType":"Identifier","messageId":"unusedVar","endLine":217,"endColumn":56,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_PVAL'.","line":324,"column":7,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":324,"endColumn":35,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'field' is defined but never used.","line":368,"column":26,"nodeType":"Identifier","messageId":"unusedVar","endLine":368,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'field' is defined but never used.","line":374,"column":26,"nodeType":"Identifier","messageId":"unusedVar","endLine":374,"endColumn":31,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":576,"column":7,"nodeType":"MemberExpression","messageId":"unexpected","endLine":576,"endColumn":20,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[15741,15789],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":610,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":610,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'estimatedRemainingTime' is defined but never used.","line":683,"column":40,"nodeType":"Identifier","messageId":"unusedVar","endLine":683,"endColumn":62,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":702,"column":26,"nodeType":"Identifier","messageId":"unusedVar","endLine":702,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-inner-declarations","severity":2,"message":"Move function declaration to function body root.","line":833,"column":4,"nodeType":"FunctionDeclaration","messageId":"moveDeclToRoot","endLine":856,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":893,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":893,"endColumn":16,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[23696,23738],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":898,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":898,"endColumn":16,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[23845,23889],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1121,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1121,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1122,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1122,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'loadDataBeforeSelect' is assigned a value but never used.","line":1128,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":1128,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":1151,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":1151,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[30826,30867],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":1157,"column":60,"nodeType":"CallExpression","endLine":1157,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1218,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1218,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1219,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1219,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1220,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1220,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1221,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1221,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1222,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1222,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":1253,"column":14,"nodeType":"Identifier","messageId":"unusedVar","endLine":1253,"endColumn":17,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1260,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":1260,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1261,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":1261,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1262,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":1262,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1263,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":1263,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":1272,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":1272,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[33886,33927],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/msg-doc","severity":2,"message":"All possible message keys should be documented. See https://w.wiki/4r9a for details.","line":1278,"column":60,"nodeType":"CallExpression","endLine":1278,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1297,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1297,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1301,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1301,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1302,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1302,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1303,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1303,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1304,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1304,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1305,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1305,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1306,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1306,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1306,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":1306,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1307,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1307,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1326,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1326,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1327,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1327,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1328,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1328,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":1377,"column":39,"nodeType":"ObjectExpression","endLine":1385,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1533,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1533,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1534,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1534,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1535,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1535,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1536,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1536,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1558,"column":4,"nodeType":"Program","messageId":"unexpectedTab","endLine":1558,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1571,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1571,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'directive' is defined but never used.","line":1590,"column":66,"nodeType":"Identifier","messageId":"unusedVar","endLine":1590,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1601,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1601,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1639,"column":14,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":1639,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1641,"column":18,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1641,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1644,"column":7,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1644,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1648,"column":6,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1648,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1653,"column":19,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1653,"endColumn":46,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1669,"column":6,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1669,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1675,"column":5,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1675,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":1719,"column":7,"nodeType":"MemberExpression","messageId":"unexpected","endLine":1719,"endColumn":20,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[45075,45140],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1794,"column":10,"nodeType":"Program","messageId":"unexpectedTab","endLine":1794,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1828,"column":10,"nodeType":"Program","messageId":"unexpectedTab","endLine":1828,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'inputName' is assigned a value but never used.","line":1857,"column":10,"nodeType":"Identifier","messageId":"unusedVar","endLine":1857,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2063,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":2063,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2064,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":2064,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2065,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":2065,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'widget_'.","line":2191,"column":8,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2191,"endColumn":70,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":2241,"column":8,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2241,"endColumn":34,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'widget_'.","line":2248,"column":8,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2248,"endColumn":88,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'thisPath_'.","line":2286,"column":9,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2286,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2323,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2323,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2324,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2324,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2325,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2325,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2326,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2326,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2327,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2327,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2328,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2328,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2329,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2329,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2330,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2330,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'items_'.","line":2406,"column":10,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2406,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":2411,"column":11,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2411,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'pathNoIndex_'.","line":2413,"column":11,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2415,"endColumn":26,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'widget_'.","line":2426,"column":11,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2426,"endColumn":91,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2523,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2523,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2524,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2524,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2525,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2525,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2526,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2526,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2527,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2527,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2528,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2528,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2529,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2529,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2530,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2530,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2531,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2531,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2532,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2532,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2533,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2533,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2534,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2534,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2535,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2535,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2536,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2536,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2632,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2632,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2633,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2633,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2746,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":2746,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2747,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":2747,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2748,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":2748,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2749,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":2749,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-alert","severity":2,"message":"Unexpected alert.","line":2792,"column":5,"nodeType":"CallExpression","messageId":"unexpected","endLine":2792,"endColumn":69,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2820,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":2820,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-alert","severity":2,"message":"Unexpected confirm.","line":2893,"column":6,"nodeType":"CallExpression","messageId":"unexpected","endLine":2895,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":2972,"column":11,"nodeType":"MemberExpression","messageId":"unexpected","endLine":2972,"endColumn":24,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[78239,78286],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2984,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2984,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3089,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":3089,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":3127,"column":45,"nodeType":"ObjectExpression","endLine":3134,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":3192,"column":44,"nodeType":"ObjectExpression","endLine":3199,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3276,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3276,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3277,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3277,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3278,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3278,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3279,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3279,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"mediawiki/class-doc","severity":2,"message":"All possible CSS classes should be documented. See https://w.wiki/PS2 for details.","line":3319,"column":36,"nodeType":"ObjectExpression","endLine":3326,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3329,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3329,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3330,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3330,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3331,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3331,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3332,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3332,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3333,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3333,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3334,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3334,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3335,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3335,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3336,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3336,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3337,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3337,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3340,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3340,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3341,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3341,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3342,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3342,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3343,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3343,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3344,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3344,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3345,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3345,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3346,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3346,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3347,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3347,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":3359,"column":4,"nodeType":"CallExpression","endLine":3359,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3406,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3406,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3407,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3407,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3408,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3408,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3409,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3409,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3410,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3410,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3411,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3411,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3412,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3412,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3413,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3413,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3415,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3415,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3416,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3416,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3417,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3417,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3418,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3418,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3419,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3419,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3420,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3420,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3422,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3422,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3440,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3440,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3441,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3441,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3453,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3453,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'mutations' is defined but never used.","line":3544,"column":52,"nodeType":"Identifier","messageId":"unusedVar","endLine":3544,"endColumn":61,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'thisObserver' is defined but never used.","line":3544,"column":63,"nodeType":"Identifier","messageId":"unusedVar","endLine":3544,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":30,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2023, https://wikisphere.org\n */\n\n/* eslint-disable no-tabs */\n/* eslint-disable no-unused-vars */\n/* eslint-disable no-underscore-dangle */\n\nconst VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager ) {\n\tvar Model = {};\n\tvar ModelSchemas;\n\tvar OuterStack;\n\tvar PropertiesStack;\n\tvar processDialogSearch;\n\tvar DialogSearchName = 'dialogSearch';\n\tvar ToolbarMain;\n\tvar ActionToolbarMain;\n\tvar ActionWidget;\n\tvar SubmitButton;\n\tvar ValidateButton;\n\tvar GoBackButton;\n\t// var DeleteButton;\n\t// shallow copy\n\tvar RecordedSchemas = Form.schemas.slice();\n\tvar Fields;\n\tvar DialogName = 'dialogForm';\n\tvar StoredJsonData;\n\tvar ModelFlatten = [];\n\tvar SelectedSchema;\n\tvar PreviousSchemas = Schemas;\n\tvar ProcessModel = {};\n\tvar InputWidgets;\n\tvar SchemasLayout;\n\tvar Initialized = false;\n\tvar PendingRecursive;\n\tvar QueuedWidgets = [];\n\tvar Maps = [];\n\tvar TargetSlotField;\n\n\tfunction inArray( val, arr ) {\n\t\treturn arr.indexOf( val ) !== -1;\n\t}\n\n\tfunction escapeJsonPtr( str ) {\n\t\treturn VisualDataFunctions.escapeJsonPtr( str );\n\t}\n\n\t// @FIXME destroy/reinitialize on tab change\n\tfunction showVisualEditor() {\n\t\tfunction timeOut( i ) {\n\t\t\tsetTimeout( function () {\n\t\t\t\tif (\n\t\t\t\t\tInputWidgets[ i ] &&\n\t\t\t\t\tInputWidgets[ i ].$element.parent().is( ':visible' )\n\t\t\t\t) {\n\t\t\t\t\tInputWidgets[ i ].initialize();\n\t\t\t\t}\n\t\t\t}, 100 );\n\t\t}\n\n\t\t// @IMPORTANT use \"let\" with timeout !!\n\t\tfor ( let i in InputWidgets ) {\n\t\t\tvar constructorName = InputWidgets[ i ].constructorName || InputWidgets[ i ].constructor.name;\n\t\t\tif ( constructorName === 'VisualDataVisualEditor' ||\n\t\t\t\t( 'constructorName' in InputWidgets[ i ] &&\n\t\t\t\t\tInputWidgets[ i ].constructorName === 'VisualDataVisualEditor' )\n\t\t\t) {\n\t\t\t\ttimeOut( i );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction loadMaps() {\n\t\tfunction timeOut( obj ) {\n\t\t\t// setTimeout( function () {\n\t\t\t// @FIXME find a better way\n\t\t\tvar schemaName = obj.data.path.split( '/' )[ 0 ];\n\t\t\t// if ( obj.element.is( ':visible' ) ) {\n\t\t\tif ( schemaName === SelectedSchema ) {\n\t\t\t\tif ( obj.data.schema.wiki.coordinates === false ) {\n\t\t\t\t\tvar latFieldId = makeElementId( `${ obj.data.path }/latitude` );\n\t\t\t\t\tvar lonFieldId = makeElementId( `${ obj.data.path }/longitude` );\n\t\t\t\t\tvar escapeSelector = jQuery.escapeSelector;\n\n\t\t\t\t\tfor ( let fieldId of [ latFieldId, lonFieldId ] ) {\n\t\t\t\t\t\tlet callbackCond = function () {\n\t\t\t\t\t\t\treturn $( '#' + escapeSelector( fieldId ) ).length;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet callback = function ( resolve, reject ) {\n\t\t\t\t\t\t\t$( '#' + escapeSelector( fieldId ) ).hide();\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tlet callbackMaxAttempts = function ( resolve, reject ) {\n\t\t\t\t\t\t\t$( '#' + escapeSelector( fieldId ) ).hide();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tVisualDataFunctions.waitUntil(\n\t\t\t\t\t\t\tcallbackCond,\n\t\t\t\t\t\t\tcallback,\n\t\t\t\t\t\t\tcallbackMaxAttempts,\n\t\t\t\t\t\t\t5\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tmw.loader.using( 'ext.VisualData.Maptiler', function () {\n\t\t\t\t\tvar visualDataMaptiler = new VisualDataMaptiler();\n\t\t\t\t\tvisualDataMaptiler.initialize( obj.element, obj.data );\n\t\t\t\t} );\n\t\t\t}\n\t\t\t// }, 0 );\n\t\t}\n\n\t\t// @IMPORTANT use \"let\" with timeout !!\n\t\tfor ( let obj of Maps ) {\n\t\t\ttimeOut( obj );\n\t\t}\n\t}\n\n\tfunction onSetPropertiesStack( item ) {\n\t\tshowVisualEditor();\n\t\t// loadMaps();\n\t}\n\n\tfunction onChangePropertiesStack( items ) {}\n\n\tfunction onTabSelect( selectedSchema ) {\n\t\tSelectedSchema = selectedSchema;\n\t\tshowVisualEditor();\n\t\tloadMaps();\n\t}\n\n\tfunction makeElementId( path ) {\n\t\treturn `VisualDataGroupWidgetPanel-${ FormID }-${ path }`.replace(\n\t\t\t/ /g,\n\t\t\t'_'\n\t\t);\n\t}\n\n\tfunction callbackShowError( schemaName, errorMessage, errors, hiddenErrors ) {\n\n\t\t// remove previous error messages\n\t\tfor ( var i in Fields ) {\n\t\t\tif ( Fields[ i ].constructor.name === 'OoUiMessageWidget' ) {\n\t\t\t\tFields[ i ].toggle( false );\n\t\t\t} else {\n\t\t\t\tFields[ i ].setErrors( [] );\n\t\t\t}\n\t\t}\n\n\t\tif ( !schemaName ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar escapedSchemaName = escapeJsonPtr( schemaName );\n\n\t\tFields[ escapedSchemaName ].toggle( true );\n\t\tFields[ escapedSchemaName ].setType( 'error' );\n\n\t\tvar errorMessage = mw.msg( 'visualdata-jsmodule-forms-form-error' );\n\t\tif ( hiddenErrors && Object.keys( hiddenErrors ).length ) {\n\t\t\tfor ( var path in hiddenErrors ) {\n\t\t\t\terrorMessage += '<br />' + hiddenErrors[ path ];\n\t\t\t}\n\t\t}\n\n\t\tFields[ escapedSchemaName ].setLabel(\n\t\t\tnew OO.ui.HtmlSnippet( errorMessage )\n\t\t);\n\n\t\tfor ( var path in errors ) {\n\t\t\tif ( !( path in Fields ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( Fields[ path ].constructor.name === 'OoUiMessageWidget' ) {\n\t\t\t\tFields[ path ].setType( 'error' );\n\t\t\t\tFields[ path ].setLabel( errors[ path ] );\n\n\t\t\t\tFields[ path ].toggle( true );\n\t\t\t} else {\n\t\t\t\tFields[ path ].setErrors( [ errors[ path ] ] );\n\t\t\t}\n\t\t}\n\n\t\tselectSchema( schemaName );\n\n\t\tvar el = window.document.querySelector( '#' +\n\t\t\tjQuery.escapeSelector( makeElementId( escapedSchemaName ) ) );\n\n\t\tif ( el ) {\n\t\t\tlet callbackCond = function () {\n\t\t\t\t$( el ).is( ':visible' );\n\t\t\t};\n\t\t\tlet callback = function ( resolve, reject ) {\n\t\t\t\tel.scrollIntoView( {\n\t\t\t\t\tbehavior: 'smooth'\n\t\t\t\t} );\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tlet callbackMaxAttempts = function ( resolve, reject ) {\n\t\t\t\tel.scrollIntoView( {\n\t\t\t\t\tbehavior: 'smooth'\n\t\t\t\t} );\n\t\t\t};\n\n\t\t\tVisualDataFunctions.waitUntil(\n\t\t\t\tcallbackCond,\n\t\t\t\tcallback,\n\t\t\t\tcallbackMaxAttempts,\n\t\t\t\t5\n\t\t\t);\n\t\t}\n\t}\n\n\tfunction selectSchema( schemaName, init ) {\n\t\tif ( !schemaName ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar escapedSchemaName = escapeJsonPtr( schemaName );\n\n\t\tvar el = window.document.querySelector( '#' +\n\t\t\tjQuery.escapeSelector( makeElementId( escapedSchemaName ) ) );\n\n\t\tif ( !el ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// indexLayout\n\t\tif ( 'setTabPanel' in SchemasLayout ) {\n\t\t\tSchemasLayout.setTabPanel( schemaName );\n\n\t\t\tif ( init ) {\n\t\t\t\tSchemasLayout.on( 'set', function () {\n\t\t\t\t\tonTabSelect( SchemasLayout.getCurrentTabPanelName() );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t// booklet\n\t\t} else if ( 'setPage' in SchemasLayout ) {\n\t\t\tSchemasLayout.setPage( schemaName );\n\n\t\t\tif ( init ) {\n\t\t\t\tSchemasLayout.on( 'set', function () {\n\t\t\t\t\tonTabSelect( SchemasLayout.getCurrentPageName() );\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getInputWidget( config ) {\n\t\tvar field = config.model.schema.wiki;\n\n\t\tif ( !( 'input-config' in field ) ) {\n\t\t\tfield[ 'input-config' ] = {};\n\t\t}\n\t\tvar required = 'required' in field && field.required;\n\n\t\t// create deep copy, otherwise changes are\n\t\t// copied to Forms[ form ].properties[ property ][ 'input-config' ]\n\t\tvar inputConfig = $.extend(\n\t\t\t{}, // *** important !! cast to object\n\t\t\tVisualDataFunctions.deepCopy( field[ 'input-config' ] ),\n\t\t\t{ value: config.data, required: required }\n\t\t);\n\n\t\tif ( 'options-values-parsed' in field ) {\n\t\t\tinputConfig.options = field[ 'options-values-parsed' ];\n\t\t}\n\n\t\tvar inputName =\n\t\t\t!( 'visibility' in field ) || field.visibility !== 'hidden' ?\n\t\t\t\tVisualDataFunctions.inputNameFromLabel(\n\t\t\t\t\tVisualDataFunctions.getPreferredInput( config.model.schema )\n\t\t\t\t) :\n\t\t\t\t'OO.ui.HiddenInputWidget';\n\n\t\t// FIXME with HiddenInputWidget, value is null (as string)\n\t\tconfig.model.inputName = inputName;\n\n\t\tif ( !( 'name' in config ) || config.name.trim() === '' ) {\n\t\t\tinputConfig.name = `${ FormID }-${ config.model.path }`;\n\t\t} else {\n\t\t\tinputConfig.name = config.name;\n\t\t}\n\n\t\tif ( Array.isArray( inputConfig.value ) ) {\n\t\t\tfor ( var i in inputConfig.value ) {\n\t\t\t\tif ( inputConfig.value[ i ].trim() === '' ) {\n\t\t\t\t\tdelete inputConfig.value[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// @see https://www.semantic-mediawiki.org/wiki/Help:Special_property_Allows_value\n\t\t// SemanticMediaWiki/src/DataValues/ValueValidator/AllowsListConstraintValueValidator.php\n\t\tif ( inArray( inputName, VisualDataFunctions.optionsInputs ) ) {\n\t\t\tif ( inputConfig.options && Object.keys( inputConfig.options ).length ) {\n\t\t\t\tinputConfig.options = VisualDataFunctions.createDropDownOptions(\n\t\t\t\t\tinputConfig.options\n\t\t\t\t);\n\t\t\t} else if ( isSMWProperty( field ) ) {\n\t\t\t\tinputConfig.options = [];\n\t\t\t\tvar SMWProperty = getSMWProperty( field );\n\t\t\t\tif ( '_PVAL' in SMWProperty.properties ) {\n\t\t\t\t\tinputConfig.options = VisualDataFunctions.createDropDownOptions(\n\t\t\t\t\t\tSMWProperty.properties._PVAL,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: 'value'\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tinputConfig.options = [];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tinputConfig.options = [];\n\t\t\t}\n\t\t}\n\t\tinputConfig.data = {\n\t\t\t// path: config.model.path,\n\t\t\t// schema: config.model.schema,\n\t\t\tmodel: config.model,\n\t\t\tperformQuery\n\t\t};\n\t\treturn ( InputWidgets[ inputConfig.name ] =\n\t\t\tVisualDataFunctions.inputInstanceFromName( inputName, inputConfig ) );\n\t}\n\n\tfunction isSMWProperty( field ) {\n\t\treturn (\n\t\t\t'SMW-property' in field &&\n\t\t\tfield[ 'SMW-property' ] in VisualDataSMW.getSemanticProperties()\n\t\t);\n\t}\n\n\tfunction getSMWProperty( field ) {\n\t\tif ( 'SMW-property' in field ) {\n\t\t\treturn VisualDataSMW.getSemanticProperty( field[ 'SMW-property' ] );\n\t\t}\n\t\treturn null;\n\t}\n\n\tfunction isNewSchema( schemaName ) {\n\t\treturn !inArray( schemaName, RecordedSchemas );\n\t}\n\n\tfunction getCategories() {\n\t\treturn Form.categories;\n\t}\n\n\tfunction getFieldAlign( field ) {\n\t\treturn 'layout-align' in Form.options ?\n\t\t\tForm.options[ 'layout-align' ] :\n\t\t\t'top';\n\t}\n\n\tfunction getHelpInline( field ) {\n\t\treturn !( 'popup-help' in Form.options ? Form.options[ 'popup-help' ] : false );\n\t}\n\n\tfunction updateFieldsVisibility( sourceModel ) {\n\t\t// *** a more complicated solution is to loop through\n\t\t// siblings using model.parent or model.parentSchema\n\t\tvar pathParent = sourceModel.path.split( '/' ).slice( 0, -1 ).join( '/' );\n\t\tvar pathNoIndex = sourceModel.pathNoIndex.split( '/' ).slice( -1 )[ 0 ];\n\n\t\tfunction escapeRegExp( string ) {\n\t\t\treturn string.replace( /[.*+?^${}()|[\\]\\\\]/g, '\\\\$&' );\n\t\t}\n\n\t\tfor ( var i in ModelFlatten ) {\n\t\t\tvar model = ModelFlatten[ i ];\n\n\t\t\tif ( sourceModel.schemaName !== model.schemaName ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( pathParent !== model.path.split( '/' ).slice( 0, -1 ).join( '/' ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar field = model.schema.wiki;\n\t\t\tif ( !( 'showif-field' in field ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( field[ 'showif-field' ] !== pathNoIndex ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar value = VisualDataFunctions.castType( sourceModel.input.getValue(), model.schema.type );\n\t\t\tvar refValue = VisualDataFunctions.castType( field[ 'showif-value' ], model.schema.type );\n\n\t\t\tvar res;\n\t\t\tswitch ( field[ 'showif-condition' ] ) {\n\t\t\t\tcase '=':\n\t\t\t\t\tres = ( refValue === value );\n\t\t\t\t\tbreak;\n\t\t\t\tcase '!=':\n\t\t\t\t\tres = ( refValue !== value );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'starts':\n\t\t\t\t\tres = ( value.indexOf( refValue ) === 0 );\n\t\t\t\t\tbreak;\n\t\t\t\tcase '!starts':\n\t\t\t\t\tres = ( value.indexOf( refValue ) !== 0 );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'contains':\n\t\t\t\t\tres = ( value.indexOf( refValue ) !== -1 );\n\t\t\t\t\tbreak;\n\t\t\t\tcase '!contains':\n\t\t\t\t\tres = ( value.indexOf( refValue ) === -1 );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ends':\n\t\t\t\t\tvar regExp = new RegExp( escapeRegExp( refValue ) + '$' );\n\t\t\t\t\tres = regExp.test( value );\n\t\t\t\t\tbreak;\n\t\t\t\tcase '!ends':\n\t\t\t\t\tvar regExp = new RegExp( escapeRegExp( refValue ) + '$' );\n\t\t\t\t\tres = !regExp.test( value );\n\t\t\t\t\tbreak;\n\t\t\t\tcase '!null':\n\t\t\t\t\tres = ( !!value );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'regex':\n\t\t\t\t\tvar regExp = new RegExp( refValue );\n\t\t\t\t\tres = regExp.test( value );\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmodel.removed = !res;\n\n\t\t\t// Fields[ model.path ].toggle( res );\n\t\t\tvar el = window.document.querySelector( '#' +\n\t\t\t\tjQuery.escapeSelector( makeElementId( model.path ) ) );\n\n\t\t\t$( el ).toggle( res );\n\t\t}\n\t}\n\n\tfunction clearDependentFields( pathNoIndex ) {\n\t\tfor ( var model of ModelFlatten ) {\n\t\t\tvar field = model.schema.wiki;\n\t\t\tif ( !( 'options-askquery' in field ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar askQuery = field[ 'options-askquery' ];\n\t\t\tvar regExp = new RegExp( '<' + pathNoIndex + '>' );\n\t\t\tif ( regExp.test( askQuery ) ) {\n\t\t\t\tmodel.input.setValue( !model.multiselect ? '' : [] );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction updateDependentFields( sourceModel ) {\n\n\t\t// @TODO complete with other optionsInputs\n\t\tvar allowedInputsByContructor = [\n\t\t\t'OoUiDropdownInputWidget',\n\t\t\t'OoUiMenuTagMultiselectWidget'\n\t\t];\n\t\tfor ( let model of ModelFlatten ) {\n\t\t\tlet constructorName = model.input.constructorName || model.input.constructor.name;\n\t\t\tif ( !inArray( constructorName, allowedInputsByContructor ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ( sourceModel.schemaName !== model.schemaName ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar field = model.schema.wiki;\n\t\t\tif ( !( 'options-askquery' in field ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar askQuery = field[ 'options-askquery' ];\n\t\t\tvar regExp = new RegExp( '<' + sourceModel.pathNoIndex + '>' );\n\t\t\tif ( regExp.test( askQuery ) ) {\n\t\t\t\tProcessModel.getModel( 'schema', sourceModel.schemaName ).then( function ( res ) {\n\t\t\t\t\tfor ( var i in res.flatten ) {\n\n\t\t\t\t\t\tif ( res.flatten[ i ].pathNoIndex === sourceModel.pathNoIndex ) {\n\t\t\t\t\t\t\tperformQuery( model, res.flatten[ i ].value ).then( ( data_ ) => {\n\n\t\t\t\t\t\t\t\t// @TODO complete with other optionsInputs\n\t\t\t\t\t\t\t\tswitch ( constructorName ) {\n\t\t\t\t\t\t\t\t\tcase 'OoUiDropdownInputWidget':\n\t\t\t\t\t\t\t\t\t\t// *** @FIXME this unfortunately does not work.\n\t\t\t\t\t\t\t\t\t\t// see here https://doc.wikimedia.org/mediawiki-core/1.39.5/js/source/oojs-ui-core.html#OO-ui-DropdownInputWidget\n\t\t\t\t\t\t\t\t\t\tvar value = model.input.getValue();\n\t\t\t\t\t\t\t\t\t\tif ( !( value in data_ ) ) {\n\t\t\t\t\t\t\t\t\t\t\tvalue = null;\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tmodel.input.setOptions( VisualDataFunctions.createDropDownOptions( data_ ) );\n\t\t\t\t\t\t\t\t\t\tmodel.input.setValue( value );\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\tcase 'OoUiMenuTagMultiselectWidget':\n\t\t\t\t\t\t\t\t\t\tmodel.input.menu.clearItems();\n\t\t\t\t\t\t\t\t\t\t// Map to an array of OO.ui.MenuOptionWidgets\n\t\t\t\t\t\t\t\t\t\tvar values = model.input.getValue();\n\t\t\t\t\t\t\t\t\t\tvar items = [];\n\t\t\t\t\t\t\t\t\t\tfor ( var j in data_ ) {\n\t\t\t\t\t\t\t\t\t\t\titems.push(\n\t\t\t\t\t\t\t\t\t\t\t\tnew OO.ui.MenuOptionWidget( {\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata: j,\n\t\t\t\t\t\t\t\t\t\t\t\t\tlabel: data_[ j ]\n\t\t\t\t\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tmodel.input.addOptions( items );\n\t\t\t\t\t\t\t\t\t\tmodel.input.setValue( values.filter( ( x ) => Object.keys( data_ ).indexOf( x ) !== -1 ) );\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function performQuery( model, value ) {\n\t\tvar field = model.schema.wiki;\n\t\tvar askQuery = field[ 'options-askquery' ];\n\t\tvar matches = [];\n\n\t\tvar re = /<([^<>]+)>/g;\n\t\twhile ( true ) {\n\t\t\tvar match = re.exec( askQuery );\n\t\t\tif ( !match ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatches.push( match );\n\t\t}\n\n\t\tfunction doQuery() {\n\t\t\tvar payload = {\n\t\t\t\taction: 'visualdata-askquery',\n\t\t\t\tdata: JSON.stringify( {\n\t\t\t\t\tquery: askQuery,\n\t\t\t\t\tproperties: field[ 'askquery-printouts' ],\n\t\t\t\t\tschema: field[ 'askquery-schema' ],\n\t\t\t\t\t'options-query-formula': field[ 'options-query-formula' ],\n\t\t\t\t\t'options-label-formula': field[ 'options-label-formula' ]\n\t\t\t\t} )\n\t\t\t};\n\n\t\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\t\tnew mw.Api()\n\t\t\t\t\t.postWithToken( 'csrf', payload )\n\t\t\t\t\t.done( function ( thisRes ) {\n\t\t\t\t\t\tif ( payload.action in thisRes ) {\n\t\t\t\t\t\t\tvar thisData = thisRes[ payload.action ];\n\t\t\t\t\t\t\tthisData = JSON.parse( thisData.result );\n\t\t\t\t\t\t\tresolve( thisData );\n\t\t\t\t\t\t}\n\t\t\t\t\t} )\n\t\t\t\t\t.fail( function ( thisRes ) {\n\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\tconsole.error( 'visualdata-askquery', thisRes );\n\t\t\t\t\t\treject( thisRes );\n\t\t\t\t\t} );\n\t\t\t} ).catch( ( err ) => {\n\t\t\t\tVisualDataFunctions.OOUIAlert( `error: ${ err }`, { size: 'medium' } );\n\t\t\t} );\n\t\t}\n\n\t\tif ( matches.length ) {\n\t\t\tvar res = await ProcessModel.getModel( 'schema', model.schemaName );\n\n\t\t\t// @MUST MATCH classes/SubmitForm -> replaceFormula\n\t\t\tvar parent = model.path.slice( 0, Math.max( 0, model.path.indexOf( '/' ) ) );\n\t\t\tfor ( var match of matches ) {\n\t\t\t\tfor ( var i in res.flatten ) {\n\t\t\t\t\tif ( match[ 1 ] === 'value' ) {\n\t\t\t\t\t\taskQuery = askQuery.replace(\n\t\t\t\t\t\t\tmatch[ 0 ],\n\t\t\t\t\t\t\t// value of lookupElement\n\t\t\t\t\t\t\tvalue\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// match first names at the same level\n\t\t\t\t\tvar fullPath = parent + '/' + match[ 1 ];\n\n\t\t\t\t\tif ( fullPath in res.flatten ) {\n\t\t\t\t\t\taskQuery = askQuery.replace( match[ 0 ], res.flatten[ fullPath ].value );\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// var fullPath = match[1];\n\t\t\t\t\t// if (fullPath.charAt(0) !== \"/\") {\n\t\t\t\t\t// \tfullPath = \"/${ fullPath }\";\n\t\t\t\t\t// }\n\n\t\t\t\t\tif ( res.flatten[ i ].pathNoIndex === fullPath ) {\n\t\t\t\t\t\taskQuery = askQuery.replace( match[ 0 ], res.flatten[ i ].value );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn doQuery();\n\t}\n\n\tvar FileItemWidget = function ( config ) {\n\t\tconfig = config || {};\n\t\tFileItemWidget.super.call( this, config );\n\n\t\tvar self = this;\n\t\tthis.parentWidget = config.parentWidget;\n\t\tthis.parentWidget.setFileKey( null );\n\n\t\tOO.ui.mixin.GroupWidget.call(\n\t\t\tthis,\n\t\t\t$.extend(\n\t\t\t\t{\n\t\t\t\t\t$group: this.$element\n\t\t\t\t},\n\t\t\t\tconfig\n\t\t\t)\n\t\t);\n\n\t\tvar deleteButton = new OO.ui.ButtonWidget( {\n\t\t\ticon: 'trash'\n\t\t\t// flags: [\"destructive\"],\n\t\t} );\n\n\t\tvar inputConfig = {\n\t\t\trequired: true,\n\t\t\tvalue: config.value\n\t\t};\n\n\t\tvar inputWidget = VisualDataFunctions.inputInstanceFromName(\n\t\t\t'OO.ui.TextInputWidget',\n\t\t\tinputConfig\n\t\t);\n\n\t\tthis.inputWidget = inputWidget;\n\n\t\tvar filePreview = new OO.ui.Widget( {\n\t\t\tclasses: [ 'mw-upload-bookletLayout-filePreview' ]\n\t\t} );\n\t\tvar progressBarWidget = new OO.ui.ProgressBarWidget( {\n\t\t\tprogress: 0\n\t\t} );\n\n\t\tthis.progressBarWidget = progressBarWidget;\n\t\tthis.textInputWidget = inputWidget;\n\n\t\tthis.messageWidget = new OO.ui.MessageWidget( {\n\t\t\ttype: 'error',\n\t\t\tlabel: '',\n\t\t\tinvisibleLabel: true,\n\t\t\tclasses: [ 'visualdata-upload-messagewidget' ]\n\t\t} );\n\n\t\tfilePreview.$element.append( progressBarWidget.$element );\n\t\tfilePreview.$element.append( inputWidget.$element );\n\t\tfilePreview.$element.append( this.messageWidget.$element );\n\n\t\tprogressBarWidget.toggle( !config.loaded );\n\t\tinputWidget.toggle( config.loaded );\n\t\tthis.messageWidget.toggle( false );\n\n\t\tthis.progress = function ( progress, estimatedRemainingTime ) {\n\t\t\tself.progressBarWidget.setProgress( progress * 100 );\n\t\t};\n\n\t\tthis.uploadComplete = function ( file, res ) {\n\t\t\tself.progressBarWidget.toggle( false );\n\t\t\tself.textInputWidget.toggle( true );\n\n\t\t\tself.parentWidget.setFileKey( res.upload.filekey );\n\t\t};\n\n\t\tthis.errorMessage = function ( errorMessage ) {\n\t\t\tself.textInputWidget.toggle( false );\n\t\t\tself.progressBarWidget.toggle( false );\n\n\t\t\tself.messageWidget.$element.append( errorMessage.getMessage() );\n\t\t\tself.messageWidget.toggle( true );\n\t\t};\n\n\t\tthis.fail = function ( res ) {};\n\n\t\tvar widget = new OO.ui.ActionFieldLayout( filePreview, deleteButton, {\n\t\t\tlabel: '',\n\t\t\talign: 'top'\n\t\t\t// classes: [\"inputName-\" + config.inputName],\n\t\t} );\n\n\t\tthis.$element.append( widget.$element );\n\n\t\tdeleteButton.connect( this, {\n\t\t\tclick: 'onDeleteButtonClick'\n\t\t} );\n\t};\n\n\tOO.inheritClass( FileItemWidget, OO.ui.Widget );\n\tOO.mixinClass( FileItemWidget, OO.ui.mixin.GroupWidget );\n\n\tFileItemWidget.prototype.onDeleteButtonClick = function () {\n\t\tthis.emit( 'delete', 'file' );\n\n\t\tthis.parentWidget.clearFileClick( this );\n\t};\n\n\tvar FileUploadGroupWidget = function ( config ) {\n\t\t// Configuration initialization\n\t\tconfig = config || {};\n\n\t\t// Parent constructor\n\t\tFileUploadGroupWidget.super.call( this, config );\n\n\t\t// Mixin constructors\n\t\tOO.ui.mixin.GroupElement.call(\n\t\t\tthis,\n\t\t\t$.extend(\n\t\t\t\t{\n\t\t\t\t\t$group: this.$element\n\t\t\t\t},\n\t\t\t\tconfig\n\t\t\t)\n\t\t);\n\n\t\tthis.addItems( config.items || [] );\n\t};\n\n\tOO.inheritClass( FileUploadGroupWidget, OO.ui.Widget );\n\tOO.mixinClass( FileUploadGroupWidget, OO.ui.mixin.GroupElement );\n\n\tvar ItemWidget = function ( config ) {\n\t\tconfig = config || {};\n\t\tItemWidget.super.call( this, config );\n\n\t\tvar field = config.model.schema.wiki;\n\n\t\tvar helpMessage = '';\n\t\tif ( 'help-message' in field ) {\n\t\t\tif ( field[ 'help-message-parsed' ] ) {\n\t\t\t\thelpMessage = field[ 'help-message-parsed' ];\n\t\t\t} else {\n\t\t\t\thelpMessage = field[ 'help-message' ];\n\n\t\t\t\tif ( Array.isArray( helpMessage ) ) {\n\t\t\t\t\thelpMessage = helpMessage[ 0 ];\n\t\t\t\t}\n\t\t\t}\n\t\t} else if ( isSMWProperty( field ) ) {\n\t\t\tvar SMWProperty = getSMWProperty( field );\n\t\t\tif ( SMWProperty.description ) {\n\t\t\t\thelpMessage = SMWProperty.description;\n\t\t\t}\n\t\t}\n\n\t\tvar label = '';\n\t\tif ( 'label' in field ) {\n\t\t\tif ( field[ 'label-parsed' ] ) {\n\t\t\t\tlabel = field[ 'label-parsed' ];\n\t\t\t} else {\n\t\t\t\tlabel = field.label;\n\n\t\t\t\tif ( Array.isArray( label ) ) {\n\t\t\t\t\tlabel = label[ 0 ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tvar fieldAlign = getFieldAlign( field );\n\t\tvar helpInline = getHelpInline( field );\n\n\t\tvar inputWidget = getInputWidget( config );\n\n\t\tinputWidget.on( 'change', function () {\n\t\t\tclearDependentFields( config.model.pathNoIndex );\n\t\t} );\n\n\t\tinputWidget.$element.find( 'input' ).on( 'blur', function () {\n\t\t\tupdateFieldsVisibility( config.model );\n\t\t\tupdateDependentFields( config.model );\n\t\t} );\n\n\t\tconfig.model.input = inputWidget;\n\n\t\tModelFlatten.push( config.model );\n\n\t\tconfig.model.multiselect = VisualDataFunctions.isMultiselect(\n\t\t\tfield[ 'preferred-input' ]\n\t\t);\n\n\t\tconfig.model.isFile = config.model.inputName === 'OO.ui.SelectFileWidget';\n\n\t\tif ( config.model.isFile ) {\n\t\t\tvar fileItemWidget;\n\n\t\t\tvar restoreButton = new OO.ui.ButtonWidget( {\n\t\t\t\ticon: 'restore'\n\t\t\t} );\n\n\t\t\trestoreButton.toggle( false );\n\n\t\t\tvar fileUploadGroupWidget = new FileUploadGroupWidget( {\n\t\t\t\titems: [ inputWidget, restoreButton ]\n\t\t\t} );\n\n\t\t\tthis.setFileKey = function ( filekey ) {\n\t\t\t\tconfig.model.filekey = filekey;\n\t\t\t};\n\n\t\t\tvar loadedFiles = {};\n\n\t\t\tvar self = this;\n\n\t\t\t// @FIXME\n\t\t\t// eslint-disable-next-line no-inner-declarations\n\t\t\tfunction createFileItemWidget( filename, loaded ) {\n\t\t\t\t// inputWidget is the SelectFileWidget\n\t\t\t\tinputWidget.toggle( false );\n\n\t\t\t\t// if ( loaded ) {\n\t\t\t\tconfig.model.previousFilename = filename;\n\t\t\t\t// }\n\n\t\t\t\tvar thisFileItemWidget = new FileItemWidget( {\n\t\t\t\t\tclasses: [ 'VisualDataFileItemWidget' ],\n\t\t\t\t\tvalue: filename,\n\t\t\t\t\tloaded: loaded,\n\t\t\t\t\tparentWidget: self\n\t\t\t\t} );\n\n\t\t\t\tloadedFiles[ filename ] = thisFileItemWidget;\n\t\t\t\tfileUploadGroupWidget.addItems( [ thisFileItemWidget ] );\n\n\t\t\t\t// overwrite the model, we want to\n\t\t\t\t// validate the filename\n\t\t\t\tconfig.model.input = thisFileItemWidget.inputWidget;\n\n\t\t\t\treturn thisFileItemWidget;\n\t\t\t}\n\n\t\t\t// create fileItemWidget with existing filename\n\t\t\tif ( typeof config.data === 'string' && config.data.trim() !== '' ) {\n\t\t\t\tfileItemWidget = createFileItemWidget( config.data, true );\n\t\t\t}\n\n\t\t\tthis.clearFileClick = function ( item ) {\n\t\t\t\trestoreButton.toggle( true );\n\n\t\t\t\t// inputWidget is the SelectFileWidget\n\t\t\t\tinputWidget.toggle( true );\n\t\t\t\tinputWidget.setValue( null );\n\n\t\t\t\t// TextInputWidget used for validation\n\t\t\t\tconfig.model.input.setValue( null );\n\n\t\t\t\t// this will remove fileItemWidget\n\t\t\t\tfileUploadGroupWidget.removeItems( [ item ] );\n\t\t\t};\n\n\t\t\trestoreButton.on( 'click', function () {\n\t\t\t\tinputWidget.toggle( false );\n\t\t\t\trestoreButton.toggle( false );\n\t\t\t\tfileUploadGroupWidget.removeItems( [ fileItemWidget ] );\n\t\t\t\tfileItemWidget = createFileItemWidget(\n\t\t\t\t\t// the previous content of fileItemWidget.inputWidget\n\t\t\t\t\t// (a TextInputWidget with filename)\n\t\t\t\t\tconfig.model.previousFilename,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t} );\n\n\t\t\t// @FIXME move to FileItemWidget\n\n\t\t\tthis.on( 'fileUploaded', function ( file ) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log( 'event fileUploaded', file );\n\t\t\t} );\n\n\t\t\tthis.on( 'fileUploadInit', function ( file ) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log( 'event fileUploadInit', file );\n\t\t\t\trestoreButton.toggle( false );\n\t\t\t\tfileItemWidget = createFileItemWidget( file.name, false );\n\t\t\t} );\n\n\t\t\tthis.on(\n\t\t\t\t'fileUploadProgress',\n\t\t\t\tfunction ( file, progress, estimatedRemainingTime ) {\n\t\t\t\t\tloadedFiles[ file.name ].progress( progress, estimatedRemainingTime );\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tthis.on( 'fileUploadComplete', function ( file, res ) {\n\t\t\t\tloadedFiles[ file.name ].uploadComplete( file, res );\n\t\t\t} );\n\n\t\t\tthis.on( 'fileUploadErrorMessage', function ( file, errorMessage ) {\n\t\t\t\tloadedFiles[ file.name ].errorMessage( errorMessage );\n\t\t\t} );\n\n\t\t\tthis.on( 'fileUploadFail', function ( file, res ) {\n\t\t\t\tloadedFiles[ file.name ].fail( res );\n\t\t\t} );\n\n\t\t\tvar upload = new VisualDataUpload();\n\t\t\tupload.initialize( inputWidget, this );\n\t\t\tinputWidget.on( 'change', upload.uploadFiles.bind( upload ) );\n\t\t}\n\n\t\tvar fieldLayout = new OO.ui.FieldLayout(\n\t\t\t!config.model.isFile ? inputWidget : fileUploadGroupWidget,\n\t\t\t{\n\t\t\t\tlabel: new OO.ui.HtmlSnippet( label ),\n\t\t\t\talign: fieldAlign,\n\t\t\t\thelpInline: helpMessage ? helpInline : true,\n\t\t\t\thelp: new OO.ui.HtmlSnippet( helpMessage )\n\t\t\t\t// classes: [`visualdata-input-${ config.model.path }`],\n\t\t\t}\n\t\t);\n\n\t\tFields[ config.model.path ] = fieldLayout;\n\n\t\tthis.$element.append( fieldLayout.$element );\n\t};\n\n\tOO.inheritClass( ItemWidget, OO.ui.Widget );\n\tOO.mixinClass( ItemWidget, OO.ui.mixin.GroupWidget );\n\n\t// @see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/c2805c7e9e83e2f3a857451d46c80231d1658a0f/demos/classes/SearchWidgetDialog.js\n\tfunction ProcessDialogSearch( config ) {\n\t\tProcessDialogSearch.super.call( this, config );\n\t}\n\tOO.inheritClass( ProcessDialogSearch, OO.ui.ProcessDialog );\n\tProcessDialogSearch.static.name = DialogSearchName;\n\n\tProcessDialogSearch.prototype.initialize = function () {\n\t\tProcessDialogSearch.super.prototype.initialize.apply( this, arguments );\n\t\tvar self = this;\n\t\tvar selectedSchemas = Form.schemas;\n\t\tthis.selectedItems = [];\n\t\tfunction getItems( value ) {\n\t\t\tvar values;\n\t\t\tswitch ( self.data.toolName ) {\n\t\t\t\tcase 'addremoveschemas':\n\t\t\t\t\tself.selectedItems = selectedSchemas;\n\t\t\t\t\tvalues = Object.keys( Schemas );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif ( value ) {\n\t\t\t\tvar valueLowerCase = value.toLowerCase();\n\t\t\t\tvalues = values.filter(\n\t\t\t\t\t( x ) => x.toLowerCase().indexOf( valueLowerCase ) !== -1\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn values.map( ( x ) => {\n\t\t\t\tvar menuOptionWidget = new OO.ui.MenuOptionWidget( {\n\t\t\t\t\tdata: x,\n\t\t\t\t\tlabel: x,\n\t\t\t\t\tselected: inArray( x, self.selectedItems )\n\t\t\t\t} );\n\t\t\t\treturn menuOptionWidget;\n\t\t\t} );\n\t\t}\n\n\t\tvar searchWidget = new OO.ui.SearchWidget( {\n\t\t\t// id: \"visualdata-import-search-widget\",\n\t\t} );\n\n\t\tsearchWidget.results.addItems( getItems() );\n\n\t\t// searchWidget.getResults() is a SelectWidget\n\t\t// https://doc.wikimedia.org/oojs-ui/master/js/#!/api/OO.ui.SelectWidget\n\t\tvar searchWidgetResults = searchWidget.getResults();\n\t\tsearchWidgetResults.multiselect = true;\n\n\t\tsearchWidgetResults.on( 'press', function ( value ) {\n\t\t\tif ( value === null ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( inArray( value.data, self.selectedItems ) ) {\n\t\t\t\tself.selectedItems.splice( self.selectedItems.indexOf( value.data ), 1 );\n\t\t\t} else {\n\t\t\t\tself.selectedItems.push( value.data );\n\t\t\t}\n\t\t} );\n\t\tsearchWidget.onQueryChange = function ( value ) {\n\t\t\tsearchWidget.results.clearItems();\n\t\t\tsearchWidget.results.addItems( getItems( value ) );\n\t\t};\n\n\t\tthis.$body.append( [ searchWidget.$element ] );\n\t};\n\n\tProcessDialogSearch.prototype.getBodyHeight = function () {\n\t\treturn 300;\n\t};\n\n\tProcessDialogSearch.static.actions = [\n\t\t{\n\t\t\taction: 'save',\n\t\t\t// modes: \"edit\",\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-searchdialog-save' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\t// modes: \"edit\",\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-cancel' ),\n\t\t\tflags: [ 'safe', 'close' ]\n\t\t}\n\t];\n\tProcessDialogSearch.prototype.getActionProcess = function ( action ) {\n\t\tvar dialog = this;\n\n\t\tif ( action === 'save' ) {\n\t\t\tvar values = processDialogSearch.selectedItems;\n\t\t\t// ProcessModel.getModel(\"fetch\").then(function (res) {\n\t\t\t// Form.jsonData.schemas = res;\n\n\t\t\tswitch ( dialog.data.toolName ) {\n\t\t\t\tcase 'addremoveschemas':\n\t\t\t\t\tfor ( var i in ModelSchemas ) {\n\t\t\t\t\t\tif ( !inArray( i, values ) ) {\n\t\t\t\t\t\t\t// delete Form.jsonData.schemas[ i ];\n\t\t\t\t\t\t\tdelete ModelSchemas[ i ];\n\t\t\t\t\t\t\tdelete Fields[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar missingSchemas = [];\n\t\t\t\t\tfor ( var i of values ) {\n\t\t\t\t\t\tif ( !( i in Schemas ) || !Object.keys( Schemas[ i ] ).length ) {\n\t\t\t\t\t\t\tmissingSchemas.push( i );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// select first schema of new selection\n\t\t\t\t\tfor ( var i of values ) {\n\t\t\t\t\t\tif ( !( i in ModelSchemas ) ) {\n\t\t\t\t\t\t\tSelectedSchema = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( missingSchemas.length ) {\n\t\t\t\t\t\tVisualData.loadSchemas( missingSchemas );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tupdatePanels();\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// });\n\t\t}\n\n\t\treturn new OO.ui.Process( function () {\n\t\t\tdialog.close( { action: action } );\n\t\t} );\n\n\t\t// return ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t};\n\tProcessDialogSearch.prototype.getTeardownProcess = function ( data ) {\n\t\treturn ProcessDialogSearch.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( function () {\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\tfunction openSearchDialog( toolName ) {\n\t\tprocessDialogSearch = new ProcessDialogSearch( {\n\t\t\tsize: 'medium',\n\t\t\t// classes: [\"visualdata-search-dialog\"],\n\t\t\tdata: { toolName: toolName }\n\t\t} );\n\n\t\tWindowManager.newWindow( processDialogSearch, {\n\t\t\ttitle: mw.msg(\n\t\t\t\t'visualdata-jsmodule-forms-dialogsearch-selectschemas'\n\t\t\t)\n\t\t} );\n\t}\n\n\t// @see https://doc.wikimedia.org/oojs-ui/master/js/#!/api/OO.ui.Toolbar\n\t// @see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/c2805c7e9e83e2f3a857451d46c80231d1658a0f/demos/pages/toolbars.js\n\tfunction createToolbar( /* disabled */ ) {\n\t\tvar toolFactory = new OO.ui.ToolFactory();\n\t\tvar toolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\tvar toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\tactions: true\n\t\t} );\n\n\t\tvar onSelect = function ( self ) {\n\t\t\tvar self = arguments.length ? self : this;\n\t\t\tvar toolName = self.getName();\n\n\t\t\tswitch ( toolName ) {\n\t\t\t\tcase 'addremoveschemas':\n\t\t\t\t\topenSearchDialog( toolName );\n\t\t\t\t\tbreak;\n\t\t\t\t// case \"createschema\":\n\t\t\t\t// \tVisualDataSchemas.openDialog(null, false);\n\t\t\t\t// \tbreak;\n\t\t\t}\n\n\t\t\tself.setActive( false );\n\t\t};\n\n\t\tvar loadDataBeforeSelect = function () {\n\t\t\tvar dataToLoad = VisualData.matchLoadedData( Config, [\n\t\t\t\t'schemas'\n\t\t\t] );\n\n\t\t\tif ( !dataToLoad.length ) {\n\t\t\t\treturn onSelect( this );\n\t\t\t}\n\n\t\t\tthis.setDisabled( true );\n\t\t\tthis.pushPending();\n\n\t\t\tVisualData.loadData( Config, dataToLoad )\n\t\t\t\t.then( ( res ) => {\n\t\t\t\t\tif ( 'schemas' in res ) {\n\t\t\t\t\t\tSchemas = res.schemas;\n\t\t\t\t\t}\n\t\t\t\t\tthis.setDisabled( false );\n\t\t\t\t\tthis.popPending();\n\t\t\t\t\tonSelect( this );\n\t\t\t\t} )\n\t\t\t\t.catch( ( error ) => {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error( 'loadData error', error );\n\t\t\t\t\tthis.popPending();\n\t\t\t\t\tthis.setDisabled( false );\n\t\t\t\t\tthis.setActive( false );\n\n\t\t\t\t\t// eslint-disable-next-line mediawiki/msg-doc\n\t\t\t\t\tVisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( mw.msg( error ) ), {\n\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t};\n\n\t\tvar toolGroup = [];\n\n\t\tif ( Config.context !== 'parserfunction' ) {\n\t\t\ttoolGroup.push( {\n\t\t\t\tname: 'addremoveschemas',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg(\n\t\t\t\t\t'visualdata-jsmodule-forms-addremoveschemas'\n\t\t\t\t),\n\t\t\t\tonSelect: onSelect\n\t\t\t} );\n\t\t}\n\n\t\tVisualDataFunctions.createToolGroup( toolFactory, 'group', toolGroup );\n\n\t\ttoolbar.setup( [\n\t\t\t{\n\t\t\t\tname: 'my-group',\n\t\t\t\t// type: \"bar\",\n\t\t\t\t// label: \"Create property\",\n\t\t\t\tinclude: [ { group: 'group' } ]\n\t\t\t}\n\t\t] );\n\n\t\treturn toolbar;\n\t}\n\n\tfunction createActionToolbar( /* disabled */ ) {\n\t\t// see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/refs/tags/v0.40.4/demos/pages/toolbars.js\n\t\tvar toolFactory = new OO.ui.ToolFactory();\n\t\tvar toolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\tvar toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\tactions: false\n\t\t} );\n\n\t\tvar onSelect = function ( self ) {\n\t\t\tvar self = arguments.length ? self : this;\n\t\t\tvar selected = self.getName();\n\n\t\t\tvar panels = OuterStack.getItems();\n\t\t\tfor ( var panel of panels ) {\n\t\t\t\tif ( panel.getData().name === selected ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tOuterStack.setItem( panel );\n\n\t\t\t// *** this prevents inconsistencies of the datatable layout\n\t\t\tswitch ( selected ) {\n\t\t\t\tcase 'manage-schemas':\n\t\t\t\t\tVisualDataSchemas.initialize();\n\t\t\t\t\tbreak;\n\t\t\t\t// case \"manage-forms\":\n\t\t\t\t// \t\tVisualDataForms.initialize();\n\t\t\t\t// \t\tbreak;\n\t\t\t\t// \tcase \"manage-semantic-properties\":\n\t\t\t\t// \t\tVisualDataSMW.initialize();\n\t\t\t\t// \t\tbreak;\n\t\t\t}\n\n\t\t\tself.setActive( false );\n\t\t};\n\n\t\tvar loadDataBeforeSelect = function () {\n\t\t\tvar dataToLoad = VisualData.matchLoadedData( Config, [\n\t\t\t\t// \"forms\",\n\t\t\t\t'schemas'\n\t\t\t\t// \"semantic-properties\",\n\t\t\t\t// \"imported-vocabularies\",\n\t\t\t\t// \"type-labels\",\n\t\t\t\t// \"property-labels\",\n\t\t\t] );\n\n\t\t\tif ( !dataToLoad.length ) {\n\t\t\t\treturn onSelect( this );\n\t\t\t}\n\n\t\t\t// this.setDisabled(true);\n\t\t\t// this.pushPending();\n\n\t\t\tActionWidget = new OO.ui.ActionWidget();\n\t\t\tToolbarMain.$bar.wrapInner( '<div class=\"wrapper\"></div>' );\n\t\t\tActionWidget.setPendingElement( ToolbarMain.$bar.find( '.wrapper' ) );\n\t\t\tActionWidget.pushPending();\n\n\t\t\t$( ToolbarMain.$bar ).find( '.wrapper' ).css( 'pointer-events', 'none' );\n\n\t\t\tVisualData.loadData( Config, dataToLoad )\n\t\t\t\t.then( ( res ) => {\n\t\t\t\t\t// this.setDisabled(false);\n\t\t\t\t\t// this.popPending();\n\t\t\t\t\tActionWidget.popPending();\n\t\t\t\t\t$( ToolbarMain.$bar ).find( '.wrapper' ).css( 'pointer-events', 'auto' );\n\n\t\t\t\t\t// VisualDataSMW.initialize(\n\t\t\t\t\t// \t\tSelf,\n\t\t\t\t\t// \t\tres[\"imported-vocabularies\"],\n\t\t\t\t\t// \t\tres[\"type-labels\"],\n\t\t\t\t\t// \t\tres[\"property-labels\"]\n\t\t\t\t\t// );\n\n\t\t\t\t\t// VisualDataForms.initialize(Self, Forms);\n\n\t\t\t\t\tonSelect( this );\n\t\t\t\t} )\n\t\t\t\t.catch( ( error ) => {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error( 'loadData error', error );\n\t\t\t\t\tActionWidget.popPending();\n\t\t\t\t\t$( ToolbarMain.$bar ).find( '.wrapper' ).css( 'pointer-events', 'auto' );\n\t\t\t\t\tthis.setActive( false );\n\n\t\t\t\t\t// eslint-disable-next-line mediawiki/msg-doc\n\t\t\t\t\tVisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( mw.msg( error ) ), {\n\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t} );\n\t\t\t\t} );\n\t\t};\n\n\t\tvar toolGroup = [\n\t\t\t{\n\t\t\t\tname: 'visualdata',\n\t\t\t\ticon: null,\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-forms-edit-data' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'manage-schemas',\n\t\t\t\ticon: null,\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-forms-manage-schemas' ),\n\t\t\t\tonSelect: loadDataBeforeSelect\n\t\t\t\t// config: {\n\t\t\t\t// \tdata: { disabled: disabled },\n\t\t\t\t// },\n\t\t\t}\n\t\t\t// {\n\t\t\t// \tname: 'manage-forms',\n\t\t\t// \ticon: null,\n\t\t\t// \ttitle: mw.msg( 'visualdata-jsmodule-forms-manage-forms' ),\n\t\t\t// \tonSelect: loadDataBeforeSelect\n\t\t\t// \t// config: {\n\t\t\t// \t// \tdata: { disabled: disabled },\n\t\t\t// \t// },\n\t\t\t// }\n\t\t];\n\n\t\ttoolbar.setup( [\n\t\t\t// see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/c2805c7e9e83e2f3a857451d46c80231d1658a0f/demos/pages/toolbars.js\n\t\t\t{\n\t\t\t\tname: 'editorSwitch',\n\t\t\t\talign: 'after',\n\t\t\t\ttype: 'list',\n\t\t\t\tlabel: 'Switch editor',\n\t\t\t\tinvisibleLabel: true,\n\t\t\t\ticon: 'menu',\n\t\t\t\tinclude: [ { group: 'selectSwitch' } ]\n\t\t\t}\n\t\t] );\n\n\t\t// @see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/c2805c7e9e83e2f3a857451d46c80231d1658a0f/demos/pages/toolbars.js\n\t\t// VisualDataFunctions.createDisabledToolGroup(\n\t\t// \ttoolGroupFactory,\n\t\t// \tOO.ui.ListToolGroup,\n\t\t// \t\"editorSwitch\",\n\t\t// );\n\n\t\tVisualDataFunctions.createToolGroup(\n\t\t\ttoolFactory,\n\t\t\t'selectSwitch',\n\t\t\ttoolGroup\n\t\t);\n\n\t\treturn toolbar;\n\t}\n\n\tvar GroupWidget = function ( config, data ) {\n\t\tconfig = config || {};\n\t\tGroupWidget.super.call( this, config );\n\n\t\tOO.ui.mixin.GroupWidget.call(\n\t\t\tthis,\n\t\t\t$.extend( { $group: this.$element }, config )\n\t\t);\n\t\t// OO.EventEmitter.call( this );\n\n\t\tthis.data = data;\n\n\t\tfunction showBorder() {\n\t\t\tif (\n\t\t\t\tdata.root ||\n\t\t\t\tdata.schema.wiki.type === 'content-block' ||\n\t\t\t\tdata.schema.wiki.type === 'property'\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tdata.schema.type === 'array' &&\n\t\t\t\tdata.schema.items.type !== 'object' &&\n\t\t\t\t'wiki' in data.schema.items &&\n\t\t\t\t'preferred-input' in data.schema.items.wiki &&\n\t\t\t\tVisualDataFunctions.isMultiselect(\n\t\t\t\t\tdata.schema.items.wiki[ 'preferred-input' ]\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tvar showBorderValue = showBorder();\n\n\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\tvar layout = new OO.ui.PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: showBorderValue,\n\t\t\tframed: showBorderValue,\n\t\t\tclasses: [\n\t\t\t\t'VisualDataGroupWidgetPanel' + ( !showBorderValue ? '-border' : '' )\n\t\t\t],\n\t\t\tid: makeElementId( data.path )\n\t\t} );\n\n\t\tthis.layout = layout;\n\n\t\tif ( data.root ) {\n\t\t\tvar $containerRight = $( '<div class=\"visualdata-form-container-right\">' );\n\t\t\tlayout.$element.append( $containerRight );\n\n\t\t\tif ( Config.context === 'EditData' ) {\n\t\t\t\tvar deleteButton = new OO.ui.ButtonWidget( {\n\t\t\t\t\ticon: 'trash',\n\t\t\t\t\tframed: false,\n\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-delete-schema' ),\n\t\t\t\t\tinvisibleLabel: true,\n\t\t\t\t\tflags: [ 'destructive' ]\n\t\t\t\t} );\n\n\t\t\t\tdeleteButton.on( 'click', function () {\n\t\t\t\t\tForm.schemas.splice( Form.schemas.indexOf( data.schema.wiki.name ), 1 );\n\t\t\t\t\t// delete Form.jsonData.schemas[ data.schema.wiki.name ];\n\t\t\t\t\tdelete ModelSchemas[ data.schema.wiki.name ];\n\t\t\t\t\tdelete Fields[ data.schema.wiki.name ];\n\t\t\t\t\tupdatePanels();\n\t\t\t\t} );\n\n\t\t\t\t$containerRight.append( deleteButton.$element );\n\t\t\t}\n\n\t\t\tif ( Config.canmanageschemas ) {\n\t\t\t\tvar editButton = new OO.ui.ButtonWidget( {\n\t\t\t\t\t// 'settings'\n\t\t\t\t\ticon: 'edit',\n\t\t\t\t\tframed: false,\n\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-edit-schema' ),\n\t\t\t\t\tinvisibleLabel: true\n\t\t\t\t\t// classes: [\"VisualDataOptionsListDeleteButton\"],\n\t\t\t\t} );\n\n\t\t\t\teditButton.on( 'click', function () {\n\t\t\t\t\tVisualDataSchemas.openSchemaDialog(\n\t\t\t\t\t\t[ data.schema.wiki.name ],\n\t\t\t\t\t\t'properties'\n\t\t\t\t\t);\n\t\t\t\t} );\n\n\t\t\t\t$containerRight.append( editButton.$element );\n\t\t\t}\n\t\t}\n\n\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\tclasses: [ 'VisualDataGroupWidgetMessageWidget' ]\n\t\t} );\n\n\t\t// @TODO toggle parent as well if all children\n\t\t// aren't visible\n\t\tthis.toggle(\n\t\t\t!VisualDataFunctions.getNestedProp(\n\t\t\t\t[ 'schema', 'options', 'hidden' ],\n\t\t\t\tdata\n\t\t\t)\n\t\t);\n\n\t\tmessageWidget.toggle( false );\n\n\t\tFields[ data.path ] = messageWidget;\n\n\t\tlayout.$element.append( messageWidget.$element );\n\n\t\tswitch ( data.schema.wiki.layout ) {\n\t\t\tcase 'horizontal':\n\t\t\t\tthis.layoutHorizontal = new OO.ui.HorizontalLayout();\n\n\t\t\t\tlayout.$element.append(\n\t\t\t\t\t$(\n\t\t\t\t\t\t'<div class=\"visualdata-form-table-multiple-fields\" style=\"display: table\">'\n\t\t\t\t\t).append( [\n\t\t\t\t\t\t$( '<div style=\"display: table-cell;vertical-align:middle\">' ).append(\n\t\t\t\t\t\t\tthis.layoutHorizontal.$element\n\t\t\t\t\t\t),\n\t\t\t\t\t\t$(\n\t\t\t\t\t\t\t'<div class=\"visualdata-horizontal-section-remove-row\" style=\"display: table-cell\">'\n\t\t\t\t\t\t)\n\t\t\t\t\t] )\n\t\t\t\t);\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// title and description are mapped to label and\n\t\t\t\t// help-message in the property field, and\n\t\t\t\t// schema.wiki.title and schema.wiki.description\n\t\t\t\t// contain the wikitext, not the parsed output\n\t\t\t\tthis.fieldset = new OO.ui.FieldsetLayout( {\n\t\t\t\t\tlabel: new OO.ui.HtmlSnippet( 'title' in data.schema.wiki ? data.schema.title : '' )\n\t\t\t\t} );\n\n\t\t\t\tif ( 'description' in data.schema.wiki ) {\n\t\t\t\t\tthis.fieldset.addItems( [\n\t\t\t\t\t\tnew OO.ui.Element( {\n\t\t\t\t\t\t\tcontent: [\n\t\t\t\t\t\t\t\tnew OO.ui.HtmlSnippet( data.schema.description )\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t} )\n\t\t\t\t\t] );\n\t\t\t\t}\n\n\t\t\t\tif ( data.schema.wiki.layout === 'table' ) {\n\t\t\t\t\tlayout.$element.append(\n\t\t\t\t\t\t$(\n\t\t\t\t\t\t\t'<div class=\"visualdata-form-table-multiple-fields\" style=\"display: table\">'\n\t\t\t\t\t\t).append( [\n\t\t\t\t\t\t\t$( '<div style=\"display: table-cell\">' ).append(\n\t\t\t\t\t\t\t\tthis.fieldset.$element\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t$(\n\t\t\t\t\t\t\t\t'<div class=\"visualdata-horizontal-section-remove-row\" style=\"display: table-cell\">'\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t] )\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tlayout.$element.append( this.fieldset.$element );\n\t\t\t\t}\n\n\t\t\t\tif ( data.schema.wiki.type === 'geolocation' && data.schema.wiki.map === true ) {\n\t\t\t\t\tif ( !Maps.length ) {\n\t\t\t\t\t\t( new VisualDataMaptiler() ).load();\n\t\t\t\t\t}\n\t\t\t\t\tMaps.push( { data, element: layout.$element } );\n\t\t\t\t}\n\n\t\t\t\tthis.connect( this, {\n\t\t\t\t\tformLoaded: 'formLoaded'\n\t\t\t\t} );\n\t\t}\n\n\t\t/*\n\t\t// @TODO implement button switch for oneOf, anyOf\n\t\tthis.buttonSelectWidget = new OO.ui.ButtonSelectWidget();\n\n\t\tvar self = this;\n\t\tthis.buttonSelectWidget.on(\"choose\", function (item, seleted) {\n\t\t\tself.booklet.setPage(item.data);\n\t\t});\n\n\t\tlayout.$element.append(this.buttonSelectWidget.$element);\n\n\t\t// var directives = [ 'anyOf', 'oneOf', 'allOf' ];\n\n\t\t// for ( var directive of directives ) {\n\t\t// \tthis['fieldset-' + directive] = new OO.ui.FieldsetLayout({\n\t\t// \t\t// label: data.wiki.title,\n\t\t// \t});\n\t\t// \tlayout.$element.append(this['fieldset-' + directive].$element);\n\t\t// }\n\n\t\tthis.booklet = new OO.ui.BookletLayout({\n\t\t\toutlined: false,\n\t\t\texpanded: true,\n\t\t\tpadded: false,\n\t\t\tclasses: [\"VisualDataGroupWidgetBooklet\"],\n\t\t});\n\n\t\tlayout.$element.append(this.booklet.$element);\n\n\t\t*/\n\n\t\tthis.$element.append( layout.$element );\n\t};\n\n\tOO.inheritClass( GroupWidget, OO.ui.Widget );\n\tOO.mixinClass( GroupWidget, OO.ui.mixin.GroupWidget );\n\t// OO.mixinClass( GroupWidget, OO.EventEmitter );\n\n\tGroupWidget.prototype.formLoaded = function () {\n\t//\tif ( this.data.root === true ) {\n\t\tsetTimeout( function () {\n\t\t\tVisualDataFunctions.removeNbspFromLayoutHeader( 'form' );\n\t\t}, 30 );\n\n\t\tsetTimeout( function () {\n\t\t\tVisualDataFunctions.removeNbspFromLayoutHeader(\n\t\t\t\t'#visualdataform-wrapper-dialog-' + FormID\n\t\t\t);\n\t\t}, 30 );\n\n\t\t// *** we use mutationChange instead\n\t\t// for ( var model of ModelFlatten ) {\n\t\t//\tupdateFieldsVisibility( model );\n\t\t// }\n\n\t\tloadMaps();\n\n\t\tfor ( var model of ModelFlatten ) {\n\t\t\tupdateDependentFields( model );\n\t\t}\n\t\t// }\n\t};\n\n\tGroupWidget.prototype.addItems = function ( items ) {\n\t\tif ( this.data.schema.wiki.layout === 'horizontal' ) {\n\t\t\tthis.layoutHorizontal.addItems( items );\n\t\t} else {\n\t\t\tthis.fieldset.addItems( items );\n\t\t}\n\t};\n\n\tGroupWidget.prototype.addCombinedItem = function ( item, title, directive ) {\n\t\t// this['fieldset-' + directive].addItems(items);\n\n\t\tvar items = [\n\t\t\tnew OO.ui.ButtonOptionWidget( {\n\t\t\t\tdata: title,\n\t\t\t\tlabel: title\n\t\t\t} )\n\t\t];\n\t\tthis.buttonSelectWidget.addItems( items );\n\n\t\t//\tthis['fieldset-' + directive]..addItems(items);\n\n\t\tif ( this.buttonSelectWidget.items.length === 1 ) {\n\t\t\tthis.buttonSelectWidget.selectItem( items[ 0 ] );\n\t\t}\n\n\t\tvar ThisPageLayout = function ( name, config ) {\n\t\t\tpageLayout.super.call( this, name, config );\n\t\t\tthis.$element.append( item.$element );\n\t\t};\n\t\tOO.inheritClass( ThisPageLayout, OO.ui.PageLayout );\n\n\t\tvar page = new ThisPageLayout( title );\n\n\t\tthis.booklet.addPages( [ page ] );\n\t};\n\n\tfunction PanelLayout( config ) {\n\t\tPanelLayout.super.call( this, config );\n\n\t\tvar data = this.data;\n\t\tvar content;\n\n\t\tif ( !( 'layout' in Form.options ) ) {\n\t\t\tForm.options.layout = 'tabs';\n\t\t}\n\n\t\t// @TODO implement booklet also outside dialog\n\t\tif ( Form.options.layout === 'booklet' && Form.options.view !== 'popup' && Form.options.view !== 'button' ) {\n\t\t\tForm.options.layout = 'tabs';\n\t\t}\n\n\t\tPendingRecursive = 0;\n\t\tQueuedWidgets = [];\n\t\tMaps = [];\n\t\tfunction getWidgets() {\n\t\t\tvar ret = {};\n\n\t\t\tfor ( var schemaName_ of Form.schemas ) {\n\n\t\t\t\tvar schema = Schemas[ schemaName_ ];\n\t\t\t\tvar previousSchema =\n\t\t\t\t\tschemaName_ in PreviousSchemas ?\n\t\t\t\t\t\tPreviousSchemas[ schemaName_ ] :\n\t\t\t\t\t\t{};\n\n\t\t\t\tif ( !( schemaName_ in Form.jsonData.schemas ) ) {\n\t\t\t\t\tForm.jsonData.schemas[ schemaName_ ] = {};\n\t\t\t\t}\n\n\t\t\t\tvar path = `${ escapeJsonPtr( schemaName_ ) }`;\n\t\t\t\tvar pathNoIndex = '';\n\t\t\t\tvar model = ( ModelSchemas[ schemaName_ ] = {\n\t\t\t\t\tparent: ModelSchemas,\n\t\t\t\t\tchildIndex: schemaName_,\n\t\t\t\t\tparentSchema: null\n\t\t\t\t} );\n\t\t\t\tvar widget = new GroupWidget(\n\t\t\t\t\t{},\n\t\t\t\t\t{ root: true, schema, path, model }\n\t\t\t\t);\n\n\t\t\t\tprocessSchema(\n\t\t\t\t\twidget,\n\t\t\t\t\tschema,\n\t\t\t\t\tpreviousSchema,\n\t\t\t\t\tschemaName_,\n\t\t\t\t\tmodel,\n\t\t\t\t\tForm.jsonData.schemas[ schemaName_ ],\n\t\t\t\t\tpath,\n\t\t\t\t\tpathNoIndex,\n\t\t\t\t\tfalse\n\t\t\t\t);\n\n\t\t\t\tret[ schemaName_ ] = widget;\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\tfunction getFreeTextInput( wikitext, thisConfig ) {\n\t\t\tvar thisInputWidget;\n\n\t\t\tthisConfig = $.extend(\n\t\t\t\t{\n\t\t\t\t\tname: `${ FormID }-model-freetext`,\n\t\t\t\t\tid: `${ FormID }-model-freetext`\n\t\t\t\t},\n\t\t\t\tthisConfig\n\t\t\t);\n\n\t\t\tif ( !wikitext || !Config.VEForAll ) {\n\t\t\t\tthisInputWidget = new OO.ui.MultilineTextInputWidget(\n\t\t\t\t\t$.extend(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tautosize: true,\n\t\t\t\t\t\t\trows: 6\n\t\t\t\t\t\t},\n\t\t\t\t\t\tthisConfig\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthisInputWidget = new VisualDataVisualEditor( thisConfig );\n\t\t\t}\n\t\t\tModel.freetext = thisInputWidget;\n\t\t\tInputWidgets[ thisConfig.name ] = thisInputWidget;\n\t\t\treturn thisInputWidget;\n\t\t}\n\n\t\tswitch ( data.name ) {\n\t\t\tcase 'schemas':\n\t\t\t\tif ( !( 'schemas' in Form.jsonData ) ) {\n\t\t\t\t\tForm.jsonData.schemas = {};\n\t\t\t\t}\n\n\t\t\t\tfor ( var thisSchemaName of Form.schemas ) {\n\t\t\t\t\tif ( !( thisSchemaName in Schemas ) ) {\n\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\tconsole.error( \"required schema doesn't exist\", thisSchemaName );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tForm.schemas = Form.schemas.filter( ( x ) => x in Schemas );\n\n\t\t\t\tif ( !SelectedSchema || Form.schemas.indexOf( SelectedSchema ) === -1 ) {\n\t\t\t\t\tSelectedSchema = ( Form.schemas.length ? Form.schemas[ 0 ] : null );\n\t\t\t\t}\n\n\t\t\t\tvar layout = Form.options.layout;\n\t\t\t\tvar widgets = getWidgets();\n\n\t\t\t\tif ( !SelectedSchema ) {\n\t\t\t\t\tthis.isEmpty = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tvar ThisPageLayout = function ( name, thisConfig ) {\n\t\t\t\t\tpageLayout.super.call( this, name, thisConfig );\n\t\t\t\t};\n\n\t\t\t\tOO.inheritClass( ThisPageLayout, OO.ui.PageLayout );\n\n\t\t\t\tThisPageLayout.prototype.setupOutlineItem = function () {\n\t\t\t\t\tthis.outlineItem.setLabel( this.name );\n\t\t\t\t};\n\n\t\t\t\tvar ThisTabPanelLayout = function ( name, thisConfig ) {\n\t\t\t\t\tthis.name = name;\n\t\t\t\t\tThisTabPanelLayout.super.call( this, name, thisConfig );\n\t\t\t\t};\n\n\t\t\t\tOO.inheritClass( ThisTabPanelLayout, OO.ui.TabPanelLayout );\n\t\t\t\tThisTabPanelLayout.prototype.setupTabItem = function () {\n\t\t\t\t\tthis.tabItem.setLabel( this.name );\n\n\t\t\t\t\tthis.deleteButton = new OO.ui.ButtonWidget( {\n\t\t\t\t\t\ticon: 'close',\n\t\t\t\t\t\tframed: false,\n\t\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-delete-schema' ),\n\t\t\t\t\t\tinvisibleLabel: true,\n\t\t\t\t\t\tclasses: [ 'VisualDataTabPanelLayoutTabItemDeleteButton' ]\n\t\t\t\t\t} );\n\n\t\t\t\t\tthis.deleteButton.on( 'click', function () {\n\t\t\t\t\t\tForm.schemas.splice( Form.schemas.indexOf( this.name ), 1 );\n\t\t\t\t\t\t// delete Form.jsonData.schemas[ data.schema.wiki.name ];\n\t\t\t\t\t\tdelete ModelSchemas[ this.name ];\n\t\t\t\t\t\tdelete Fields[ this.name ];\n\t\t\t\t\t\tupdatePanels();\n\t\t\t\t\t} );\n\n\t\t\t\t\tthis.deleteButton.toggle( this.name === SelectedSchema );\n\t\t\t\t\t// @TODO\n\t\t\t\t\t// this.tabItem.$label.append( this.deleteButton.$element );\n\t\t\t\t};\n\n\t\t\t\tThisTabPanelLayout.prototype.toggleCloseButton = function () {\n\t\t\t\t};\n\n\t\t\t\tswitch ( layout ) {\n\t\t\t\t\tcase 'single':\n\t\t\t\t\t\tcontent = widgets[ SelectedSchema ];\n\t\t\t\t\t\tthis.$element.addClass( 'PanelPropertiesStackPanelSingle' );\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'booklet':\n\t\t\t\t\t\tvar booklet = new OO.ui.BookletLayout( {\n\t\t\t\t\t\t\toutlined: true,\n\t\t\t\t\t\t\texpanded: true,\n\t\t\t\t\t\t\tpadded: false\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t// booklet.on( 'set', function () {\n\t\t\t\t\t\t// \tonTabSelect( booklet.getCurrentPageName() );\n\t\t\t\t\t\t// } );\n\n\t\t\t\t\t\tSchemasLayout = booklet;\n\n\t\t\t\t\t\tvar items = [];\n\n\t\t\t\t\t\tfor ( var schemaName in widgets ) {\n\t\t\t\t\t\t\tvar tabPanel = new ThisPageLayout( schemaName );\n\t\t\t\t\t\t\ttabPanel.$element.append( widgets[ schemaName ].$element );\n\t\t\t\t\t\t\titems.push( tabPanel );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbooklet.addPages( items );\n\t\t\t\t\t\tcontent = booklet;\n\n\t\t\t\t\t\t// booklet.setPage( SelectedSchema );\n\n\t\t\t\t\t\tthis.$element.addClass( 'PanelPropertiesStackPanelBooklet' );\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'tabs':\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvar indexLayout = new OO.ui.IndexLayout( {\n\t\t\t\t\t\t\tframed: true,\n\t\t\t\t\t\t\tshowMenu: false,\n\t\t\t\t\t\t\texpanded: true,\n\t\t\t\t\t\t\tpadded: false,\n\t\t\t\t\t\t\tautoFocus: false\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tSchemasLayout = indexLayout;\n\n\t\t\t\t\t\t// indexLayout.on( 'set', function () {\n\t\t\t\t\t\t// \tonTabSelect( indexLayout.getCurrentTabPanelName() );\n\t\t\t\t\t\t// } );\n\n\t\t\t\t\t\tvar items = [];\n\t\t\t\t\t\tfor ( var schemaName in widgets ) {\n\t\t\t\t\t\t\tvar tabPanel = new ThisTabPanelLayout( schemaName );\n\t\t\t\t\t\t\ttabPanel.$element.append( widgets[ schemaName ].$element );\n\t\t\t\t\t\t\titems.push( tabPanel );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tindexLayout.addTabPanels( items );\n\t\t\t\t\t\t// indexLayout.setTabPanel( SelectedSchema );\n\t\t\t\t\t\tcontent = indexLayout;\n\n\t\t\t\t\t\tthis.$element.addClass( 'PanelPropertiesStackPanelTabs' );\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'article':\n\t\t\t\tvar items = [];\n\t\t\t\tvar userDefinedInput;\n\t\t\t\tvar userDefinedField;\n\t\t\t\tvar freeTextField;\n\t\t\t\tvar categoriesField;\n\t\t\t\tvar contentModelField;\n\n\t\t\t\tif ( data.userDefined ) {\n\t\t\t\t\tvar inputName = 'mw.widgets.TitleInputWidget';\n\n\t\t\t\t\tuserDefinedInput = new mw.widgets.TitleInputWidget( {\n\t\t\t\t\t\tname: `${ FormID }-model-target-title`,\n\t\t\t\t\t\tvalue: !( 'userDefined' in Form ) ? '' : Form.userDefined,\n\t\t\t\t\t\t// @FIXME if the stack panel is hidden\n\t\t\t\t\t\t// this will create a browser error\n\t\t\t\t\t\trequired: true\n\t\t\t\t\t} );\n\n\t\t\t\t\tModel[ 'target-title' ] = userDefinedInput;\n\n\t\t\t\t\tuserDefinedField = new OO.ui.FieldLayout( userDefinedInput, {\n\t\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-pagename' ),\n\t\t\t\t\t\talign: data.fieldAlign\n\t\t\t\t\t\t// classes: [\"ItemWidget\", \"inputName-\" + inputName],\n\t\t\t\t\t} );\n\t\t\t\t\titems.push( userDefinedField );\n\t\t\t\t}\n\n\t\t\t\tif ( data.editTargetSlot ) {\n\t\t\t\t\tvar targetSlotInput = new OO.ui.DropdownInputWidget( {\n\t\t\t\t\t\tname: `${ FormID }-model-target-slot`,\n\t\t\t\t\t\toptions: VisualDataFunctions.createDropDownOptions( {\n\t\t\t\t\t\t\tjsondata: mw.msg( 'visualdata-jsmodule-forms-target-slot-option-jsondata' ),\n\t\t\t\t\t\t\tmain: mw.msg( 'visualdata-jsmodule-forms-target-slot-option-main' )\n\t\t\t\t\t\t} ),\n\t\t\t\t\t\tvalue: Form.options[ 'target-slot' ]\n\t\t\t\t\t} );\n\n\t\t\t\t\tModel[ 'target-slot' ] = targetSlotInput;\n\n\t\t\t\t\ttargetSlotInput.on( 'change', function ( value ) {\n\t\t\t\t\t\tif ( freeTextField ) {\n\t\t\t\t\t\t\tfreeTextField.toggle( value !== 'main' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( categoriesField ) {\n\t\t\t\t\t\t\tcategoriesField.toggle( value !== 'main' );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( contentModelField ) {\n\t\t\t\t\t\t\tcontentModelField.toggle( value !== 'main' );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\tTargetSlotField = new OO.ui.FieldLayout( targetSlotInput, {\n\t\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-target-slot' ),\n\t\t\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-forms-target-slot-help' ),\n\t\t\t\t\t\thelpInline: true,\n\t\t\t\t\t\talign: data.fieldAlign\n\t\t\t\t\t} );\n\n\t\t\t\t\t// TargetSlotField.toggle( false );\n\n\t\t\t\t\titems.push( TargetSlotField );\n\t\t\t\t}\n\n\t\t\t\tif ( data.editFreeText ) {\n\t\t\t\t\tvar inputWidget = getFreeTextInput( Config.contentModel === 'wikitext', {\n\t\t\t\t\t\tvalue: Form.freetext,\n\t\t\t\t\t\tcontentModel: Config.contentModel\n\t\t\t\t\t} );\n\n\t\t\t\t\tfreeTextField = new OO.ui.FieldLayout( inputWidget, {\n\t\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-freetext' ),\n\t\t\t\t\t\talign: data.fieldAlign\n\t\t\t\t\t} );\n\n\t\t\t\t\tfreeTextField.toggle( Form.options[ 'target-slot' ] !== 'main' );\n\n\t\t\t\t\titems.push( freeTextField );\n\t\t\t\t}\n\n\t\t\t\tif ( data.editCategories ) {\n\t\t\t\t\tvar categories = data.categories;\n\n\t\t\t\t\tvar categoriesInput = new mw.widgets.CategoryMultiselectWidget( {\n\t\t\t\t\t\tname: `${ FormID }-model-categories`\n\t\t\t\t\t\t// value: categories,\n\t\t\t\t\t} );\n\n\t\t\t\t\tModel.categories = categoriesInput;\n\n\t\t\t\t\t// ***prevents error \"Cannot read properties of undefined (reading 'apiUrl')\"\n\t\t\t\t\tfor ( var category of categories ) {\n\t\t\t\t\t\tcategoriesInput.addTag( category );\n\t\t\t\t\t}\n\n\t\t\t\t\tcategoriesField = new OO.ui.FieldLayout( categoriesInput, {\n\t\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-categories' ),\n\t\t\t\t\t\talign: data.fieldAlign,\n\t\t\t\t\t\tclasses: [ 'VisualDataItemWidget' ]\n\t\t\t\t\t} );\n\n\t\t\t\t\tcategoriesField.toggle( Form.options[ 'target-slot' ] !== 'main' );\n\n\t\t\t\t\titems.push( categoriesField );\n\t\t\t\t}\n\n\t\t\t\tif ( data.editContentModel ) {\n\t\t\t\t\tvar contentModelInput = new OO.ui.DropdownInputWidget( {\n\t\t\t\t\t\tname: `${ FormID }-model-content-model`,\n\t\t\t\t\t\toptions: VisualDataFunctions.createDropDownOptions(\n\t\t\t\t\t\t\tConfig.contentModels\n\t\t\t\t\t\t),\n\t\t\t\t\t\tvalue: Config.contentModel\n\t\t\t\t\t} );\n\n\t\t\t\t\tcontentModelInput.on( 'change', async function ( value ) {\n\t\t\t\t\t\tif ( !( 'freetext' in Model ) ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar thisInputWidget;\n\t\t\t\t\t\tvar freetextValue = Model.freetext.getValue();\n\n\t\t\t\t\t\tif ( VisualDataFunctions.isPromise( freetextValue ) ) {\n\t\t\t\t\t\t\tfreetextValue = await freetextValue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// @TODO convert from/to html and wikitext\n\t\t\t\t\t\t// value === \"html\" ||\n\t\t\t\t\t\tif ( value === 'wikitext' ) {\n\t\t\t\t\t\t\tthisInputWidget = getFreeTextInput( true, {\n\t\t\t\t\t\t\t\tcontentModel: value,\n\t\t\t\t\t\t\t\tvalue: freetextValue\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t// // @TODO use TinyMCE for html\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthisInputWidget = getFreeTextInput( false, {\n\t\t\t\t\t\t\t\tvalue: freetextValue\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t\t$( `#${ FormID }-model-freetext` ).replaceWith( thisInputWidget.$element );\n\t\t\t\t\t} );\n\n\t\t\t\t\tModel[ 'content-model' ] = contentModelInput;\n\n\t\t\t\t\tcontentModelField = new OO.ui.FieldLayout( contentModelInput, {\n\t\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-content-models' ),\n\t\t\t\t\t\talign: data.fieldAlign,\n\t\t\t\t\t\tclasses: [ 'VisualDataItemWidget' ]\n\t\t\t\t\t} );\n\n\t\t\t\t\tcontentModelField.toggle( Form.options[ 'target-slot' ] !== 'main' );\n\n\t\t\t\t\titems.push( contentModelField );\n\t\t\t\t}\n\n\t\t\t\tif ( !items.length ) {\n\t\t\t\t\tthis.isEmpty = true;\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tthis.$element.addClass( 'PanelPropertiesStackPanelFieldset' );\n\n\t\t\t\tcontent = new OO.ui.FieldsetLayout( {\n\t\t\t\t\tlabel: '',\n\t\t\t\t\titems: items\n\t\t\t\t} );\n\t\t}\n\n\t\tthis.isEmpty = false;\n\t\tthis.$element.append( content.$element );\n\t}\n\n\tOO.inheritClass( PanelLayout, OO.ui.PanelLayout );\n\n\tvar OptionsList = function ListWidget( config, schema, model ) {\n\t\tconfig = config || {};\n\n\t\t// Call parent constructor\n\t\tOptionsList.super.call( this, config );\n\n\t\tOO.ui.mixin.GroupWidget.call(\n\t\t\tthis,\n\t\t\t$.extend(\n\t\t\t\t{\n\t\t\t\t\t$group: this.$element\n\t\t\t\t},\n\t\t\t\tconfig\n\t\t\t)\n\t\t);\n\n\t\tthis.schema = schema;\n\t\tthis.model = model;\n\n\t\tthis.aggregate( {\n\t\t\tdelete: 'itemDelete'\n\t\t} );\n\n\t\tthis.connect( this, {\n\t\t\titemDelete: 'onItemDelete'\n\t\t} );\n\n\t\tthis.connect( this, {\n\t\t\tadd: 'onAddItem'\n\t\t} );\n\t};\n\n\tOO.inheritClass( OptionsList, OO.ui.Widget );\n\tOO.mixinClass( OptionsList, OO.ui.mixin.GroupWidget );\n\n\tOptionsList.prototype.onAddItem = function () {};\n\n\tOptionsList.prototype.onItemDelete = function () {};\n\n\t// OptionsList.prototype.addItems = function (items) {\n\t// \tfor ( var i in items ) {\n\t// \t\tOO.ui.mixin.GroupWidget.prototype.addItem.call(this, items[i], i);\n\t// \t}\n\t// }\n\n\tOptionsList.prototype.addItem = function ( item, i ) {\n\t\tvar self = this;\n\t\titem.data.index = i;\n\n\t\tfunction recDeleteValue( model ) {\n\t\t\tswitch ( model.schema.type ) {\n\t\t\t\tcase 'object':\n\t\t\t\t\tif ( 'properties' in model ) {\n\t\t\t\t\t\tfor ( var ii in model.properties ) {\n\t\t\t\t\t\t\trecDeleteValue( model.properties[ ii ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'array':\n\t\t\t\t\t// @TODO implement tuple\n\t\t\t\t\tif ( VisualDataFunctions.isObject( schema.items ) ) {\n\t\t\t\t\t\trecDeleteValue( model.items );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tif ( 'input' in model ) {\n\t\t\t\t\t\tmodel.input.setValue( !model.multiselect ? '' : [] );\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar deleteButton = new OO.ui.ButtonWidget( {\n\t\t\ticon: 'close'\n\t\t\t// flags: [\"destructive\"],\n\t\t\t// classes: [\"VisualDataOptionsListDeleteButton\"],\n\t\t} );\n\t\tdeleteButton.on( 'click', function () {\n\t\t\tif (\n\t\t\t\t!( 'minItems' in self.schema ) ||\n\t\t\t\tself.items.length > self.schema.minItems\n\t\t\t) {\n\t\t\t\t// *** rather than removing the item\n\t\t\t\t// from the model, we mark it as removed\n\t\t\t\t// this ensures consistency of the data\n\t\t\t\t// structure, the items marked as removed\n\t\t\t\t// will be removed from submitted data.\n\t\t\t\t// Both the 2 alternate methods aren't\n\t\t\t\t// optimal: updatePanels() is too expensive\n\t\t\t\t// and renaming all the data structure\n\t\t\t\t// is too tricky and leads to errors\n\t\t\t\tself.removeItems( [ item ] );\n\t\t\t\tself.model[ item.data.index ].removed = true;\n\t\t\t} else {\n\t\t\t\trecDeleteValue( self.model[ item.data.index ] );\n\t\t\t}\n\t\t} );\n\n\t\tif (\n\t\t\titem.data.schema.wiki.layout === 'horizontal' ||\n\t\t\titem.data.schema.wiki.layout === 'table'\n\t\t) {\n\t\t\t$( item.$element )\n\t\t\t\t.find( '.visualdata-horizontal-section-remove-row' )\n\t\t\t\t.append( deleteButton.$element );\n\t\t} else {\n\t\t\titem.$element.prepend(\n\t\t\t\t$( '<div style=\"text-align:right\">' ).append( deleteButton.$element )\n\t\t\t);\n\t\t}\n\n\t\tOO.ui.mixin.GroupWidget.prototype.addItems.call( this, [ item ] );\n\n\t\tthis.emit( 'add', item );\n\n\t\treturn this;\n\t};\n\n\tOptionsList.prototype.removeItems = function ( items ) {\n\t\tOO.ui.mixin.GroupWidget.prototype.removeItems.call( this, items );\n\t\tthis.emit( 'remove', items );\n\t\treturn this;\n\t};\n\n\tOptionsList.prototype.clearItems = function () {\n\t\tvar items = this.items.slice();\n\t\tOO.ui.mixin.GroupWidget.prototype.clearItems.call( this );\n\t\tthis.emit( 'remove', items );\n\t\treturn this;\n\t};\n\n\t// @FIXME store for each separate schema\n\tfunction applyUntransformed( data, i, path ) {\n\t\tif (\n\t\t\t!( 'schemas-data' in Form.jsonData ) ||\n\t\t\t!( 'untransformed' in Form.jsonData[ 'schemas-data' ] ) ||\n\t\t\t!( path in Form.jsonData[ 'schemas-data' ].untransformed )\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// *** this ensures subsequent edits are maintained\n\t\tdata[ i ] = Form.jsonData[ 'schemas-data' ].untransformed[ path ];\n\t\tdelete Form.jsonData[ 'schemas-data' ].untransformed[ path ];\n\t}\n\n\tvar OptionsListContainer = function OptionsListContainer(\n\t\tconfig,\n\t\tschema,\n\t\titem,\n\t\tpreviousItem,\n\t\tschemaName,\n\t\tmodel,\n\t\tdata,\n\t\tpath,\n\t\tpathNoIndex,\n\t\tnewItem\n\t) {\n\t\tconfig = config || {};\n\n\t\t// Call parent constructor\n\t\tOptionsListContainer.super.call( this, config );\n\n\t\t// display multiselect\n\t\tif (\n\t\t\titem.type !== 'object' &&\n\t\t\t'preferred-input' in item.wiki &&\n\t\t\tVisualDataFunctions.isMultiselect( item.wiki[ 'preferred-input' ] )\n\t\t) {\n\t\t\tvar widget_ = new GroupWidget( {}, { schema: item, path, model } );\n\t\t\tprocessSchema(\n\t\t\t\twidget_,\n\t\t\t\titem,\n\t\t\t\tpreviousItem,\n\t\t\t\tschemaName,\n\t\t\t\tmodel,\n\t\t\t\tdata,\n\t\t\t\tpath,\n\t\t\t\tpathNoIndex,\n\t\t\t\tnewItem\n\t\t\t);\n\t\t\tthis.$element.append( widget_.$element );\n\t\t\treturn;\n\t\t}\n\n\t\tthis.optionsList = new OptionsList( {}, schema, model );\n\n\t\tvar minItems = 'minItems' in schema ? schema.minItems : 0;\n\t\tvar data;\n\t\tif (\n\t\t\tArray.isArray( item.default ) &&\n\t\t\t( !Array.isArray( data ) || !data.length ) &&\n\t\t\t( isNewSchema( schemaName ) || Form.options.action === 'create' )\n\t\t) {\n\t\t\tdata =\n\t\t\t\t'default-parsed' in item.wiki ?\n\t\t\t\t\titem.wiki[ 'default-parsed' ] :\n\t\t\t\t\titem.default;\n\t\t}\n\n\t\tif ( Array.isArray( data ) && minItems < data.length ) {\n\t\t\tminItems = data.length;\n\t\t}\n\n\t\t// data is not an object if the type of schema\n\t\t// changed from non object to object, e.g.\n\t\t// an array of text fields vs an array\n\t\t// of subitems, and the name/key was the same\n\t\tif ( data === null || typeof data !== 'object' ) {\n\t\t\tdata = {};\n\t\t}\n\n\t\tvar i = 0;\n\t\twhile ( this.optionsList.items.length < minItems ) {\n\t\t\tvar newItem = false;\n\t\t\tif ( !( i in data ) ) {\n\t\t\t\tdata[ i ] = {};\n\t\t\t\tnewItem = true;\n\t\t\t}\n\t\t\tvar path_ = `${ path }/${ i }`;\n\t\t\tapplyUntransformed( data, i, path );\n\t\t\tvar thisModel = ( model[ i ] = {\n\t\t\t\tparent: model,\n\t\t\t\tchildIndex: i,\n\t\t\t\tparentSchema: schema\n\t\t\t} );\n\t\t\tvar widget_ = new GroupWidget( {}, { schema: item, path: path_, model: thisModel } );\n\t\t\tprocessSchema(\n\t\t\t\twidget_,\n\t\t\t\titem,\n\t\t\t\tpreviousItem,\n\t\t\t\tschemaName,\n\t\t\t\tthisModel,\n\t\t\t\tdata[ i ],\n\t\t\t\tpath_,\n\t\t\t\tpathNoIndex,\n\t\t\t\tnewItem\n\t\t\t);\n\t\t\tthis.optionsList.addItem( widget_, i );\n\t\t\ti++;\n\t\t}\n\n\t\tvar self = this;\n\n\t\tvar addOption = new OO.ui.ButtonWidget( {\n\t\t\ticon: 'add'\n\t\t} );\n\n\t\taddOption.on( 'click', function () {\n\t\t\tif (\n\t\t\t\t!( 'maxItems' in schema ) ||\n\t\t\t\tself.optionsList.items.length < schema.maxItems\n\t\t\t) {\n\t\t\t\tvar ii = self.optionsList.items.length ?\n\t\t\t\t\tself.optionsList.items[ self.optionsList.items.length - 1 ].data\n\t\t\t\t\t\t.index + 1 :\n\t\t\t\t\t0;\n\t\t\t\tvar modelAddOption = ( model[ ii ] = {\n\t\t\t\t\tparent: model,\n\t\t\t\t\tchildIndex: ii,\n\t\t\t\t\tparentSchema: schema\n\t\t\t\t} );\n\t\t\t\tvar widgetAddOption = new GroupWidget( {}, { schema: item, path, model: modelAddOption } );\n\n\t\t\t\tvar thisPath_ = `${ path }/${ ii }`;\n\t\t\t\tprocessSchema(\n\t\t\t\t\twidgetAddOption,\n\t\t\t\t\titem,\n\t\t\t\t\tpreviousItem,\n\t\t\t\t\tschemaName,\n\t\t\t\t\tmodelAddOption,\n\t\t\t\t\t( data[ ii ] = {} ),\n\t\t\t\t\tthisPath_,\n\t\t\t\t\tpathNoIndex,\n\t\t\t\t\ttrue\n\t\t\t\t);\n\t\t\t\tself.optionsList.addItem( widgetAddOption, ii );\n\t\t\t}\n\t\t} );\n\n\t\tthis.$element.append( this.optionsList.$element );\n\t\tthis.$element.append( addOption.$element );\n\t};\n\n\tOO.inheritClass( OptionsListContainer, OO.ui.Widget );\n\t// OO.mixinClass(OptionsListContainer, OO.ui.mixin.GroupWidget);\n\n\tfunction determineInputValue(\n\t\tschema,\n\t\tpreviousSchema,\n\t\tschemaName,\n\t\tmodel,\n\t\tdata,\n\t\tnewItem\n\t) {\n\t\t// can be an array, in case of multiselect\n\t\tvar ret = VisualDataFunctions.isObject( data ) ? null : data;\n\t\t// remove value-prefix\n\t\t// ***this is not necessary, since is hanlded\n\t\t// by applyUntransformed\n\t\t// if (defaultValue) {\n\t\t// \tif (\"value-prefix\" in schema.wiki) {\n\t\t// \t\tvar prefixLength = schema.wiki[\"value-prefix\"].length;\n\t\t// \t\tif (Array.isArray(defaultValue)) {\n\t\t// \t\t\tdefaultValue = value.map((x) => x.substr(prefixLength));\n\t\t// \t\t} else {\n\t\t// \t\t\tdefaultValue = defaultValue.substr(prefixLength);\n\t\t// \t\t}\n\t\t// \t}\n\t\t// }\n\n\t\tif (\n\t\t\t!newItem &&\n\t\t\t!isNewSchema( schemaName ) &&\n\t\t\tForm.options.action !== 'create'\n\t\t) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tif ( !( 'default-parsed' in schema.wiki ) ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tif (\n\t\t\tret !== null &&\n\t\t\t( !( 'wiki' in previousSchema ) ||\n\t\t\t\t!( 'default-parsed' in previousSchema.wiki ) ||\n\t\t\t\tret !== previousSchema.wiki[ 'default-parsed' ] )\n\t\t) {\n\t\t\treturn ret;\n\t\t}\n\n\t\t// *** in case of array the default values will\n\t\t// create the respective entries by OptionsListContainer\n\t\tif (\n\t\t\tArray.isArray( schema.wiki[ 'default-parsed' ] ) &&\n\t\t\t\t(\n\t\t\t\t\t!( 'preferred-input' in schema.wiki ) ||\n\t\t\t\t\t!VisualDataFunctions.isMultiselect( schema.wiki[ 'preferred-input' ] )\n\t\t\t\t)\n\t\t) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn schema.wiki[ 'default-parsed' ];\n\t}\n\n\tfunction processSchema(\n\t\twidget,\n\t\tschema,\n\t\tpreviousSchema,\n\t\tschemaName,\n\t\tmodel,\n\t\tdata,\n\t\tpath,\n\t\tpathNoIndex,\n\t\tnewItem\n\t) {\n\t\tPendingRecursive++;\n\t\tif ( !( 'type' in schema ) ) {\n\t\t\tschema.type = 'default' in schema ? 'string' : 'object';\n\t\t}\n\t\tmodel.previousSchema = previousSchema;\n\n\t\tmodel.schema = VisualDataFunctions.deepCopy( schema );\n\t\tmodel.schemaName = schemaName;\n\t\tmodel.path = path;\n\t\tmodel.pathNoIndex = pathNoIndex;\n\t\t// @TODO implement allOf, anyOf, oneOf using addCombinedItem\n\t\t// @TODO implement \"$ref\"\n\n\t\tswitch ( schema.type ) {\n\t\t\tcase 'object':\n\t\t\t\tmodel.properties = {};\n\t\t\t\tif ( 'properties' in schema ) {\n\n\t\t\t\t\t// data is not an object if the type of schema\n\t\t\t\t\t// changed from non object to object, e.g.\n\t\t\t\t\t// an array of text fields vs an array\n\t\t\t\t\t// of subitems, and the name/key was the same\n\t\t\t\t\tif ( !VisualDataFunctions.isObject( data ) ) {\n\t\t\t\t\t\tdata = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tvar items_ = [];\n\t\t\t\t\tfor ( var i in schema.properties ) {\n\t\t\t\t\t\tif ( !( i in data ) ) {\n\t\t\t\t\t\t\tdata[ i ] = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar path_ = `${ path }/${ escapeJsonPtr( i ) }`;\n\t\t\t\t\t\tapplyUntransformed( data, i, path_ );\n\t\t\t\t\t\tvar pathNoIndex_ = pathNoIndex ?\n\t\t\t\t\t\t\t`${ pathNoIndex }/${ escapeJsonPtr( i ) }` :\n\t\t\t\t\t\t\tescapeJsonPtr( i );\n\t\t\t\t\t\tvar item = schema.properties[ i ];\n\t\t\t\t\t\tvar previousItem =\n\t\t\t\t\t\t\t'properties' in previousSchema && i in previousSchema.properties ?\n\t\t\t\t\t\t\t\tpreviousSchema.properties[ i ] :\n\t\t\t\t\t\t\t\t{};\n\t\t\t\t\t\tvar thisModel = ( model.properties[ i ] = {\n\t\t\t\t\t\t\tparent: model.properties,\n\t\t\t\t\t\t\tchildIndex: i,\n\t\t\t\t\t\t\tparentSchema: schema\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tvar widget_ = new GroupWidget( {}, { schema: item, path: path_, model: thisModel } );\n\t\t\t\t\t\tprocessSchema(\n\t\t\t\t\t\t\twidget_,\n\t\t\t\t\t\t\titem,\n\t\t\t\t\t\t\tpreviousItem,\n\t\t\t\t\t\t\tschemaName,\n\t\t\t\t\t\t\tthisModel,\n\t\t\t\t\t\t\tdata[ i ],\n\t\t\t\t\t\t\tpath_,\n\t\t\t\t\t\t\tpathNoIndex_,\n\t\t\t\t\t\t\tnewItem\n\t\t\t\t\t\t);\n\t\t\t\t\t\titems_.push( widget_ );\n\t\t\t\t\t}\n\t\t\t\t\twidget.addItems( items_ );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'array':\n\t\t\t\tif ( 'items' in schema ) {\n\t\t\t\t\tif ( VisualDataFunctions.isObject( schema.items ) ) {\n\t\t\t\t\t\tvar item = schema.items;\n\t\t\t\t\t\tmodel.items = {};\n\t\t\t\t\t\tif ( item.wiki.type === 'property' ) {\n\t\t\t\t\t\t\titem.wiki.layout = 'table';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar previousItem =\n\t\t\t\t\t\t\t'items' in previousSchema ? previousSchema.items : {};\n\n\t\t\t\t\t\tvar optionsListContainer = new OptionsListContainer(\n\t\t\t\t\t\t\t{},\n\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\titem,\n\t\t\t\t\t\t\tpreviousItem,\n\t\t\t\t\t\t\tschemaName,\n\t\t\t\t\t\t\tmodel.items,\n\t\t\t\t\t\t\tdata,\n\t\t\t\t\t\t\tpath,\n\t\t\t\t\t\t\tpathNoIndex,\n\t\t\t\t\t\t\tnewItem\n\t\t\t\t\t\t);\n\t\t\t\t\t\twidget.addItems( [ optionsListContainer ] );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// @TODO\n\t\t\t\t\t\t// implement tuple\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// 'string',\n\t\t\t\t// 'number',\n\t\t\t\t// 'integer',\n\t\t\t\t// 'boolean',\n\t\t\t\t// 'null'\n\t\t\t\t// model.type = \"property\";\n\t\t\t\tif ( !( 'wiki' in schema ) ) {\n\t\t\t\t\tschema.wiki = {};\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t'visibility' in schema.wiki &&\n\t\t\t\t\tschema.wiki.visibility === 'oncreate-only' &&\n\t\t\t\t\tForm.options.action !== 'create'\n\t\t\t\t) {\n\t\t\t\t\tdelete model.parent[ model.childIndex ];\n\n\t\t\t\t} else {\n\t\t\t\t\tvar inputValue = determineInputValue(\n\t\t\t\t\t\tschema,\n\t\t\t\t\t\tpreviousSchema,\n\t\t\t\t\t\tschemaName,\n\t\t\t\t\t\tmodel,\n\t\t\t\t\t\tdata,\n\t\t\t\t\t\tnewItem\n\t\t\t\t\t);\n\n\t\t\t\t\tif ( Array.isArray( inputValue ) ) {\n\t\t\t\t\t\tinputValue = inputValue.filter(\n\t\t\t\t\t\t\t( x ) => !VisualDataFunctions.isObject( x )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\t// used by getFieldAlign\n\t\t\t\t\t// model.schema.wiki.schema = schemaName;\n\t\t\t\t\tvar item = new ItemWidget( {\n\t\t\t\t\t\tclasses: [ 'VisualDataItemWidget' ],\n\t\t\t\t\t\tmodel: model,\n\t\t\t\t\t\tdata: inputValue\n\t\t\t\t\t} );\n\n\t\t\t\t\twidget.addItems( [ item ] );\n\t\t\t\t}\n\t\t}\n\n\t\t// @TODO implement anyOf, oneOf, allOf\n\t\t// https://json-schema.org/understanding-json-schema/reference/combining.html\n\t\t// var directives = [\"anyOf\", \"oneOf\", \"allOf\"];\n\t\t// for (var directive of directives) {\n\t\t// \tif (directive in schema) {\n\t\t// \t\t// *** this is by default an array,\n\t\t// \t\t// but transformed to an object\n\t\t// \t\tfor (var i in schema[directive]) {\n\t\t// \t\t\tvar item = schema[directive][i];\n\t\t// \t\t\tlet widget_ = new GroupWidget({}, item);\n\t\t// \t\t\tprocessSchema(widget_, item, schemaName, (model[i] = {}));\n\t\t// \t\t\tif ( directive!=='allOf' ) {\n\t\t// \t\t\t\twidget.addCombinedItem(widget_, item.title || i, directive);\n\t\t// \t\t\t} else {\n\t\t// \t\t\t\twidget.addItems([widget_]);\n\t\t// \t\t\t}\n\t\t// \t\t}\n\t\t// \t}\n\t\t// }\n\n\t\tQueuedWidgets.push( widget );\n\t\t// inform queued widgets that the rendering of the form is complete\n\t\tif ( --PendingRecursive === 0 ) {\n\t\t\t// for ( widget_ of QueuedWidgets ) {\n\t\t\t// @see https://www.mediawiki.org/wiki/OOjs/Events\n\n\t\t\t// widget_.emit( 'formLoaded' );\n\t\t\tif ( QueuedWidgets.length ) {\n\t\t\t\tQueuedWidgets[ 0 ].emit( 'formLoaded' );\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getSchemasPanelLayout() {\n\t\tFields = {};\n\t\tModelSchemas = {};\n\t\tModelFlatten = [];\n\t\tInputWidgets = {};\n\n\t\t// @TODO implement a better interface between\n\t\t// VisualData instance and this constructor\n\t\tProcessModel = new VisualDataProcessModel(\n\t\t\tcallbackShowError,\n\t\t\tForm,\n\t\t\tSchemas,\n\t\t\tRecordedSchemas,\n\t\t\tModel,\n\t\t\tModelSchemas,\n\t\t\tmakeElementId\n\t\t);\n\n\t\treturn new PanelLayout( {\n\t\t\texpanded: true,\n\t\t\tpadded: false,\n\t\t\tframed: false,\n\t\t\t// classes: [\"PanelProperties-panel-section\"],\n\t\t\tdata: {\n\t\t\t\tname: 'schemas',\n\t\t\t\tschemas: Form.schemas\n\t\t\t}\n\t\t} );\n\t}\n\n\tfunction getArticlePanelLayout() {\n\t\tvar userDefined = Config.isNewPage && Form.options[ 'edit-page' ] === '';\n\n\t\tvar editFreeText = Config.isNewPage && Config.context === 'EditData';\n\t\tvar editContentModel = Config.context === 'EditData';\n\t\tvar editCategories = Config.context === 'EditData';\n\t\tvar editTargetSlot = Config.context === 'EditData';\n\n\t\tvar categories = [];\n\n\t\tif ( 'edit-content-model' in Form.options ) {\n\t\t\teditContentModel = Form.options[ 'edit-content-model' ];\n\t\t}\n\n\t\tif ( 'edit-categories' in Form.options ) {\n\t\t\teditCategories = Form.options[ 'edit-categories' ]; // !Form.schemas.length || !Config.isNewPage;\n\t\t}\n\n\t\tif ( 'edit-freetext' in Form.options ) {\n\t\t\teditFreeText = Form.options[ 'edit-freetext' ];\n\t\t}\n\n\t\tif ( 'edit-target-slot' in Form.options ) {\n\t\t\teditTargetSlot = Form.options[ 'edit-target-slot' ];\n\t\t}\n\n\t\tif ( editTargetSlot === false &&\n\t\t\t'target-slot' in Form.options &&\n\t\t\tForm.options[ 'target-slot' ] === 'main'\n\t\t) {\n\t\t\teditFreeText = false;\n\t\t\teditContentModel = false;\n\t\t}\n\n\t\tvar fieldAlign = 'top';\n\n\t\tif (\n\t\t\tForm.options.action === 'create' &&\n\t\t\tForm.options[ 'pagename-formula' ] === ''\n\t\t) {\n\t\t\tuserDefined = true;\n\t\t}\n\n\t\t// this will set the fieldAlign of the wiki\n\t\t// section as the fieldAlign of last form\n\t\tif ( 'layout-align' in Form.options ) {\n\t\t\tfieldAlign = Form.options[ 'layout-align' ];\n\t\t}\n\n\t\t// if (Form.options[\"default-categories\"]) {\n\t\t// \tcategories = Form.options[\"default-categories\"].split(/\\s*,\\s*/)\n\t\t// \t\t.filter( x => x.trim() !== '' );\n\t\t// }\n\t\tvar categories = (\n\t\t\t'default-categories' in Form.options ?\n\t\t\t\tForm.options[ 'default-categories' ] :\n\t\t\t\t[]\n\t\t).concat( Form.categories );\n\n\t\t// for some reason appending the method\n\t\t// halts the execution combined with mw.loader\n\t\tcategories = categories.filter( function onlyUnique( value, index, self ) {\n\t\t\treturn self.indexOf( value ) === index;\n\t\t} );\n\n\t\t// create title and free text input\n\t\tif ( !userDefined && !editFreeText && !editCategories && !editContentModel ) {\n\t\t\treturn { isEmpty: true };\n\t\t}\n\n\t\treturn new PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: true,\n\t\t\tframed: false,\n\t\t\t// classes: [\"PanelProperties-panel-section\"],\n\t\t\tdata: {\n\t\t\t\tname: 'article',\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-wiki' ),\n\t\t\t\tuserDefined,\n\t\t\t\teditFreeText,\n\t\t\t\teditCategories,\n\t\t\t\teditContentModel,\n\t\t\t\teditTargetSlot,\n\t\t\t\tcategories,\n\t\t\t\tfieldAlign\n\t\t\t}\n\t\t} );\n\t}\n\n\tfunction removeSchemasPanel() {\n\t\tvar panels = PropertiesStack.getItems();\n\t\tfor ( var panel of panels ) {\n\t\t\tif ( panel.getData().name === 'schemas' ) {\n\t\t\t\tPropertiesStack.removeItems( [ panel ] );\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction updatePanels() {\n\t\tProcessModel.getModel( 'fetch' ).then( function ( res ) {\n\t\t\tForm.jsonData.schemas = $.extend( Form.jsonData.schemas, res );\n\n\t\t\tremoveSchemasPanel();\n\n\t\t\tvar schemasPanelLayout = getSchemasPanelLayout();\n\t\t\tif ( !schemasPanelLayout.isEmpty ) {\n\t\t\t\tPropertiesStack.addItems( [ schemasPanelLayout ], 0 );\n\t\t\t}\n\n\t\t\tvar panels = PropertiesStack.getItems();\n\n\t\t\tPropertiesStack.setItem( panels[ 0 ] );\n\n\t\t\tselectSchema( SelectedSchema, true );\n\n\t\t\tPropertiesStack.$element.removeClass( [\n\t\t\t\t'PanelPropertiesStack',\n\t\t\t\t'PanelPropertiesStack-empty'\n\t\t\t] );\n\n\t\t\tswitch ( panels.length ) {\n\t\t\t\tcase 0:\n\t\t\t\t\tPropertiesStack.$element.addClass( 'PanelPropertiesStack-empty' );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tPropertiesStack.$element.addClass( 'PanelPropertiesStack' );\n\t\t\t}\n\n\t\t\tupdateButtons( panels );\n\t\t} );\n\t}\n\n\tfunction updateButtons( panels ) {\n\t\tif ( TargetSlotField ) {\n\t\t\tTargetSlotField.toggle( hasMultiplePanels() ||\n\t\t\t\t( 'target-slot' in Model && Model[ 'target-slot' ].getValue() === 'main' ) );\n\t\t}\n\n\t\tif ( Form.options.view === 'popup' || Form.options.view === 'button' ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( hasMultiplePanels() ) {\n\t\t\tValidateButton.toggle( panels.length !== 0 );\n\t\t\t// DeleteButton.toggle( hasStoredJsonData() );\n\t\t\tGoBackButton.toggle( false );\n\t\t\tSubmitButton.toggle( false );\n\t\t} else {\n\t\t\tSubmitButton.toggle( panels.length !== 0 );\n\t\t\t// DeleteButton.toggle( hasStoredJsonData() );\n\t\t\tGoBackButton.toggle( false );\n\t\t\tValidateButton.toggle( false );\n\t\t}\n\t}\n\n\tfunction updateSchemas( schemas, data ) {\n\t\tPreviousSchemas = Schemas;\n\t\tSchemas = VisualDataFunctions.deepCopy( schemas );\n\n\t\tif ( data && data[ 'result-action' ] === 'rename' ) {\n\t\t\t// *** do not compare Schemas with Form.schemas,\n\t\t\t// since a rename could match an existing entry\n\t\t\t// in Schemas\n\t\t\t// for ( var schemaName in Schemas ) {\n\t\t\t// \tif ( Form.schemas.indexOf( schemaName ) === -1 ) {\n\t\t\t// \t\tSelectedSchema = schemaName;\n\t\t\t// \t\tbreak;\n\t\t\t// \t}\n\t\t\t// }\n\t\t\tSelectedSchema = data.label;\n\n\t\t\tfor ( var i in Form.schemas ) {\n\t\t\t\tvar schemaName = Form.schemas[ i ];\n\t\t\t\tif ( !( schemaName in Schemas ) ) {\n\t\t\t\t\tForm.schemas.splice( i, 1, SelectedSchema );\n\t\t\t\t\tif ( !( SelectedSchema in Form.jsonData.schemas ) ) {\n\t\t\t\t\t\tForm.jsonData.schemas[ SelectedSchema ] = Form.jsonData.schemas[ schemaName ];\n\t\t\t\t\t}\n\t\t\t\t\tdelete Form.jsonData.schemas[ schemaName ];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// uninitialized\n\t\tif ( !( 'getModel' in ProcessModel ) ) {\n\t\t\treturn;\n\t\t}\n\t\tupdatePanels();\n\t}\n\n\tasync function onSubmit( e ) {\n\t\te.preventDefault();\n\n\t\tvar action;\n\t\tvar formEl = $( this ); // .closest(\".VisualDataForm\");\n\n\t\tif ( formEl.data( 'delete' ) === true ) {\n\t\t\taction = 'delete';\n\t\t} else {\n\t\t\taction = !hasMultiplePanels() ? 'validate&submit' : 'submit';\n\t\t}\n\n\t\tProcessModel.getModel( action ).then( async function ( res ) {\n\t\t\tif ( typeof res === 'boolean' && res === false ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( res.form[ 'target-slot' ] === 'main' && !res.schemas.length &&\n\t\t\t\t!RecordedSchemas.length ) {\n\t\t\t\t// eslint-disable-next-line no-alert\n\t\t\t\talert( mw.msg( 'visualdata-jsmodule-forms-submit-no-schemas' ) );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( 'callback' in Form.options && Form.options.callback !== '' ) {\n\t\t\t\tVisualDataFunctions.executeFunctionByName( Form.options.callback, window, [ res ] );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$( '<input>' )\n\t\t\t\t.attr( {\n\t\t\t\t\ttype: 'hidden',\n\t\t\t\t\tname: 'data',\n\t\t\t\t\tvalue: JSON.stringify( getFormAttributes( res ) )\n\t\t\t\t} )\n\t\t\t\t.appendTo( formEl );\n\n\t\t\tformEl.unbind( 'submit' ).submit();\n\t\t} );\n\t}\n\n\tfunction ProcessDialog( config ) {\n\t\tProcessDialog.super.call( this, config );\n\t}\n\tOO.inheritClass( ProcessDialog, OO.ui.ProcessDialog );\n\n\tProcessDialog.static.name = DialogName;\n\t// ProcessDialog.static.title = mw.msg(\n\t// \t\"visualdata-jsmodule-forms-defineform\"\n\t// );\n\tProcessDialog.static.actions = [\n\t\t{\n\t\t\taction: 'delete',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-delete' ),\n\t\t\tflags: 'destructive',\n\t\t\tmodes: [ 'validate-delete', 'submit-single-delete' ]\n\t\t},\n\t\t{\n\t\t\taction: 'validate',\n\t\t\tmodes: [ 'validate', 'validate-delete' ],\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-validate' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\taction: 'back',\n\t\t\tlabel: OO.ui.deferMsg( 'visualdata-jsmodule-dialog-goback' ),\n\t\t\tflags: [ 'safe', 'back' ],\n\t\t\tmodes: [ 'submit', 'submit-delete' ]\n\t\t},\n\t\t{\n\t\t\taction: 'submit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-submit' ),\n\t\t\tflags: [ 'primary', 'progressive' ],\n\t\t\tmodes: [ 'submit', 'submit-delete' ]\n\t\t},\n\t\t{\n\t\t\taction: 'validate&submit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-submit' ),\n\t\t\tflags: [ 'primary', 'progressive' ],\n\t\t\tmodes: [ 'submit-single', 'submit-single-delete' ]\n\t\t},\n\t\t{\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-close' ),\n\t\t\tflags: [ 'safe', 'close' ],\n\t\t\tmodes: [\n\t\t\t\t'validate',\n\t\t\t\t'submit-single',\n\t\t\t\t'validate-delete',\n\t\t\t\t'submit-single-delete'\n\t\t\t]\n\t\t}\n\t];\n\n\tProcessDialog.prototype.getSetupProcess = function ( data ) {\n\t\t// data = data || {};\n\t\t// @see https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs\n\t\treturn ProcessDialog.super.prototype.getSetupProcess\n\t\t\t.call( this, data )\n\t\t\t.next( function () {\n\t\t\t\t// @see resources/lib/ooui/oojs-ui-windows.js\n\t\t\t\tthis.actions.setMode(\n\t\t\t\t\t( hasMultiplePanels() ?\n\t\t\t\t\t\t'validate' :\n\t\t\t\t\t\t'submit-single' ) + ( !hasStoredJsonData() ? '' : '-delete' )\n\t\t\t\t);\n\n\t\t\t\tthis.$body.append( data.PropertiesStack.$element );\n\t\t\t}, this );\n\t};\n\n\tProcessDialog.prototype.initialize = function () {\n\t\tProcessDialog.super.prototype.initialize.apply( this, arguments );\n\t\t// this.$body.append(this.data.OuterStack.$element);\n\t\t// showVisualEditor();\n\t};\n\n\tProcessDialog.prototype.getActionProcess = function ( action ) {\n\t\tif (\n\t\t\t!action ||\n\t\t\t( action === 'delete' &&\n\t\t\t\t// eslint-disable-next-line no-alert\n\t\t\t\t!confirm(\n\t\t\t\t\tmw.msg( 'visualdata-jsmodule-forms-delete-data-confirm' )\n\t\t\t\t) )\n\t\t) {\n\t\t\treturn ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t\t}\n\t\tvar self = this;\n\t\treturn ProcessDialog.super.prototype.getActionProcess\n\t\t\t.call( this, action )\n\t\t\t.next( function () {\n\t\t\t\tswitch ( action ) {\n\t\t\t\t\tcase 'back':\n\t\t\t\t\t\tvar panels = PropertiesStack.getItems();\n\t\t\t\t\t\tPropertiesStack.setItem( panels[ 0 ] );\n\t\t\t\t\t\tself.setSize(\n\t\t\t\t\t\t\t!( 'popup-size' in Form.options ) ||\n\t\t\t\t\t\t\t\tForm.options[ 'popup-size' ] === '' ?\n\t\t\t\t\t\t\t\t'medium' :\n\t\t\t\t\t\t\t\tForm.options[ 'popup-size' ]\n\t\t\t\t\t\t);\n\t\t\t\t\t\tself.actions.setMode(\n\t\t\t\t\t\t\t'validate' + ( !hasStoredJsonData() ? '' : '-delete' )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'validate':\n\t\t\t\t\t\tProcessModel.getModel( 'validate' ).then( function ( res ) {\n\t\t\t\t\t\t\tif ( typeof res === 'boolean' ) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar thisPanels = PropertiesStack.getItems();\n\t\t\t\t\t\t\tPropertiesStack.setItem( thisPanels[ thisPanels.length - 1 ] );\n\t\t\t\t\t\t\tself.setSize( 'medium' );\n\t\t\t\t\t\t\tself.actions.setMode(\n\t\t\t\t\t\t\t\t'submit' + ( !hasStoredJsonData() ? '' : '-delete' )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'validate&submit':\n\t\t\t\t\tcase 'submit':\n\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\treturn ProcessModel.getModel( action ).then( function ( res ) {\n\t\t\t\t\t\t\tif ( action.indexOf( 'submit' ) !== 1 && typeof res === 'boolean' ) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar payload = {\n\t\t\t\t\t\t\t\tdata: JSON.stringify( getFormAttributes( res ) ),\n\t\t\t\t\t\t\t\taction: 'visualdata-submit-form'\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\t\t\t\t\t\tnew mw.Api()\n\t\t\t\t\t\t\t\t\t.postWithToken( 'csrf', payload )\n\t\t\t\t\t\t\t\t\t.done( function ( thisRes ) {\n\t\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t\t\tif ( payload.action in thisRes ) {\n\t\t\t\t\t\t\t\t\t\t\tvar data = JSON.parse( thisRes[ payload.action ].result );\n\t\t\t\t\t\t\t\t\t\t\tif ( !data.errors.length ) {\n\t\t\t\t\t\t\t\t\t\t\t\tWindowManager.closeActiveWindow();\n\t\t\t\t\t\t\t\t\t\t\t\t// @FIXME reload only if the changes affect\n\t\t\t\t\t\t\t\t\t\t\t\t// the current page\n\t\t\t\t\t\t\t\t\t\t\t\tif ( data[ 'target-url' ] === window.location.href ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\twindow.location.href = data[ 'target-url' ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert(\n\t\t\t\t\t\t\t\t\t\t\t\t\tnew OO.ui.HtmlSnippet( data.errors.join( '<br />' ) ),\n\t\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t\t.fail( function ( thisRes ) {\n\t\t\t\t\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\t\t\t\t\tconsole.error( 'visualdata-submit-form', res );\n\t\t\t\t\t\t\t\t\t\treject( thisRes );\n\t\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} ).catch( ( err ) => {\n\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert( `error: ${ err }`, { size: 'medium' } );\n\t\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t// return new OO.ui.Process(function () {\n\t\t// \tdialog.close({ action: action });\n\t\t// });\n\n\t\t// return ProcessDialog.super.prototype.getActionProcess.call(this, action);\n\t};\n\n\tProcessDialog.prototype.getTeardownProcess = function ( data ) {\n\t\treturn ProcessDialog.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( function () {\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\t/**\n\t * Override getBodyHeight to create a tall dialog relative to the screen.\n\t *\n\t * @return {number} Body height\n\t */\n\tProcessDialog.prototype.getBodyHeight = function () {\n\t\t// see here https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs\n\t\t// this.page1.content.$element.outerHeight( true );\n\t\treturn window.innerHeight - 100;\n\t};\n\n\tfunction getFormAttributes( jsondata ) {\n\t\treturn $.extend(\n\t\t\t{\n\t\t\t\tformID: FormID,\n\t\t\t\tconfig: Config\n\t\t\t},\n\t\t\tjsondata\n\t\t);\n\t}\n\n\tfunction initializePropertiesStack() {\n\t\tvar panels = [ getSchemasPanelLayout(), getArticlePanelLayout() ].filter(\n\t\t\t( x ) => !x.isEmpty\n\t\t);\n\n\t\tvar classes = [];\n\n\t\tswitch ( panels.length ) {\n\t\t\tcase 0:\n\t\t\t\tclasses.push( 'PanelPropertiesStack-empty' );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tclasses.push( 'PanelPropertiesStack' );\n\t\t}\n\n\t\tPropertiesStack = new OO.ui.StackLayout( {\n\t\t\titems: panels,\n\t\t\tcontinuous: false, // !hasMultiplePanels(),\n\t\t\texpanded: true,\n\t\t\tpadded: false,\n\t\t\t// The following classes are used here:\n\t\t\t// * PanelPropertiesStack\n\t\t\t// * PanelPropertiesStack-empty\n\t\t\tclasses: classes\n\t\t} );\n\n\t\tPropertiesStack.on( 'change', onChangePropertiesStack );\n\t\tPropertiesStack.on( 'set', onSetPropertiesStack );\n\t\treturn panels;\n\t}\n\n\tfunction hasMultiplePanels() {\n\t\treturn PropertiesStack && PropertiesStack.getItems().length > 1;\n\t}\n\n\tfunction hasStoredJsonData() {\n\t\tif ( Config.context !== 'EditData' && Form.options.action !== 'edit' ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ( !( 'schemas' in StoredJsonData ) ) {\n\t\t\treturn false;\n\t\t}\n\t\tfor ( var i in StoredJsonData.schemas ) {\n\t\t\tif (\n\t\t\t\tVisualDataFunctions.isObject( StoredJsonData.schemas[ i ] ) &&\n\t\t\t\tObject.keys( StoredJsonData.schemas[ i ] ).length\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction isVisible() {\n\t\treturn $( '#visualdataform-wrapper-' + FormID ).is( ':visible' );\n\t}\n\n\tfunction mutationChange() {\n\t\tif ( !isVisible() ) {\n\t\t\tInitialized = false;\n\t\t} else if ( !Initialized ) {\n\t\t\tinitialize();\n\t\t}\n\n\t\tfor ( var model of ModelFlatten ) {\n\t\t\tupdateFieldsVisibility( model );\n\t\t}\n\n\t\t// for ( var model of ModelFlatten ) {\n\t\t//\tupdateDependentFields( model );\n\t\t// }\n\t}\n\n\tfunction initialize() {\n\t\tif ( !isVisible() ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tInitialized = true;\n\n\t\tif ( Form.options.view === 'button' ) {\n\n\t\t\tvar button = new OO.ui.ButtonWidget( {\n\t\t\t\ticon: Form.options.icon,\n\t\t\t\tflags: [ 'primary', 'progressive' ],\n\t\t\t\tlabel: Form.options.label\n\t\t\t} );\n\t\t\tvar widget;\n\n\t\t\tif ( Form.options.schema !== '' ) {\n\t\t\t\tvar editButton = new OO.ui.ButtonWidget( {\n\t\t\t\t\ticon: 'edit',\n\t\t\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t\t\t} );\n\n\t\t\t\teditButton.on( 'click', function () {\n\t\t\t\t\tinitializePropertiesStack();\n\t\t\t\t\tStoredJsonData = VisualDataFunctions.deepCopy(\n\t\t\t\t\t\tForm.jsonData\n\t\t\t\t\t);\n\n\t\t\t\t\tvar thisClasses = [];\n\t\t\t\t\tif ( 'css-class' in Form.options && Form.options[ 'css-class' ] !== '' ) {\n\t\t\t\t\t\tthisClasses.push( Form.options[ 'css-class' ] );\n\t\t\t\t\t}\n\n\t\t\t\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\t\t\t\tvar processDialog = new ProcessDialog( {\n\t\t\t\t\t\tsize:\n\t\t\t\t\t\t\t!( 'popup-size' in Form.options ) || Form.options[ 'popup-size' ] === '' ?\n\t\t\t\t\t\t\t\t'medium' :\n\t\t\t\t\t\t\t\tForm.options[ 'popup-size' ],\n\t\t\t\t\t\tid: 'visualdataform-wrapper-dialog-' + FormID,\n\t\t\t\t\t\tclasses: thisClasses\n\t\t\t\t\t} );\n\n\t\t\t\t\tWindowManager.newWindow( processDialog, {\n\t\t\t\t\t\ttitle: Form.options.title,\n\t\t\t\t\t\tPropertiesStack: PropertiesStack\n\t\t\t\t\t} );\n\t\t\t\t} );\n\n\t\t\t\twidget = new OO.ui.ActionFieldLayout( button, editButton, {\n\t\t\t\t\tlabel: '',\n\t\t\t\t\talign: 'top',\n\t\t\t\t\tclasses: [ 'VisualDataPageButtonsActionField' ]\n\t\t\t\t} );\n\n\t\t\t} else {\n\t\t\t\twidget = button;\n\t\t\t}\n\n\t\t\tbutton.on( 'click', function () {\n\t\t\t\tvar args = [ Form.options.value ];\n\n\t\t\t\tif ( Form.options.schema !== '' ) {\n\t\t\t\t\tinitializePropertiesStack();\n\t\t\t\t\tProcessModel.getModel( 'schema', Form.options.schema ).then( async function ( res ) {\n\t\t\t\t\t\tif ( typeof res === 'boolean' && res === false ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\targs.push( res.data );\n\t\t\t\t\t\tVisualDataFunctions.executeFunctionByName( Form.options.callback, window, args );\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\tVisualDataFunctions.executeFunctionByName( Form.options.callback, window, args );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t$( '#visualdataform-wrapper-' + FormID ).html( widget.$element );\n\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( Form.options.view === 'popup' ) {\n\t\t\tvar popupButton = new OO.ui.ButtonWidget( {\n\t\t\t\ticon: 'edit',\n\t\t\t\tlabel: Form.options.title\n\t\t\t} );\n\n\t\t\tpopupButton.on( 'click', function () {\n\t\t\t\tinitializePropertiesStack();\n\t\t\t\tStoredJsonData = VisualDataFunctions.deepCopy(\n\t\t\t\t\tForm.jsonData\n\t\t\t\t);\n\n\t\t\t\tvar thisClasses = [];\n\t\t\t\tif ( 'css-class' in Form.options && Form.options[ 'css-class' ] !== '' ) {\n\t\t\t\t\tthisClasses.push( Form.options[ 'css-class' ] );\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\t\t\tvar processDialog = new ProcessDialog( {\n\t\t\t\t\tsize:\n\t\t\t\t\t\t!( 'popup-size' in Form.options ) || Form.options[ 'popup-size' ] === '' ?\n\t\t\t\t\t\t\t'medium' :\n\t\t\t\t\t\t\tForm.options[ 'popup-size' ],\n\t\t\t\t\tid: 'visualdataform-wrapper-dialog-' + FormID,\n\t\t\t\t\tclasses: thisClasses\n\t\t\t\t} );\n\n\t\t\t\tWindowManager.newWindow( processDialog, {\n\t\t\t\t\ttitle: Form.options.title,\n\t\t\t\t\tPropertiesStack: PropertiesStack\n\t\t\t\t} );\n\t\t\t} );\n\t\t\t$( '#visualdataform-wrapper-' + FormID ).html( popupButton.$element );\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvar formContent = [];\n\n\t\tif ( Form.errors.length ) {\n\t\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\t\ttype: 'error',\n\t\t\t\tlabel: new OO.ui.HtmlSnippet( Form.errors.join( '<br /> ' ) )\n\t\t\t} );\n\n\t\t\tformContent.push( messageWidget.$element );\n\t\t\tformContent.push( $( '<br>' ) );\n\t\t}\n\n\t\tvar panels = initializePropertiesStack();\n\t\tStoredJsonData = VisualDataFunctions.deepCopy( Form.jsonData );\n\n\t\tSubmitButton = new OO.ui.ButtonInputWidget( {\n\t\t\tlabel:\n\t\t\t\t!( 'submit-button-text' in Form.options ) ||\n\t\t\t\tForm.options[ 'submit-button-text' ] === '' ?\n\t\t\t\t\tmw.msg( 'visualdata-jsmodule-forms-submit' ) :\n\t\t\t\t\tForm.options[ 'submit-button-text' ],\n\n\t\t\tflags: [ 'primary', 'progressive' ],\n\t\t\tclasses: [ 'VisualDataFormSubmitButton' ],\n\t\t\ttype: 'submit'\n\t\t} );\n\n\t\tformContent.push( PropertiesStack.$element );\n\t\tformContent.push( SubmitButton.$element );\n\n\t\tValidateButton = new OO.ui.ButtonInputWidget( {\n\t\t\tlabel:\n\t\t\t\t!( 'validate-button-text' in Form.options ) ||\n\t\t\t\tForm.options[ 'validate-button-text' ] === '' ?\n\t\t\t\t\tmw.msg( 'visualdata-jsmodule-forms-validate' ) :\n\t\t\t\t\tForm.options[ 'validate-button-text' ],\n\t\t\tclasses: [ 'VisualDataFormSubmitButton' ],\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t\t// type: \"submit\",\n\t\t} );\n\n\t\tValidateButton.on( 'click', function () {\n\t\t\tProcessModel.getModel( 'validate' ).then( function ( res ) {\n\t\t\t\tif ( typeof res === 'boolean' && res === false ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar thisPanels = PropertiesStack.getItems();\n\t\t\t\tPropertiesStack.setItem( thisPanels[ thisPanels.length - 1 ] );\n\n\t\t\t\tValidateButton.toggle( false );\n\t\t\t\tSubmitButton.toggle( true );\n\t\t\t\tGoBackButton.toggle( true );\n\t\t\t\t// DeleteButton.toggle( false );\n\t\t\t\t$( '#visualdataform-wrapper-' + FormID )\n\t\t\t\t\t.get( 0 )\n\t\t\t\t\t.scrollIntoView( { behavior: 'smooth' } );\n\t\t\t} );\n\t\t} );\n\n\t\tformContent.push( ValidateButton.$element );\n\n\t\t// var printDeleteButton = hasStoredJsonData();\n\n\t\t// DeleteButton = new OO.ui.ButtonInputWidget( {\n\t\t// \tlabel: mw.msg( 'visualdata-jsmodule-forms-delete' ),\n\t\t// \tclasses: [ 'VisualDataFormSubmitButton' ],\n\t\t// \tflags: [ 'destructive' ],\n\t\t// \ttype: 'submit'\n\t\t// } );\n\n\t\t// formContent.push( DeleteButton.$element );\n\n\t\tGoBackButton = new OO.ui.ButtonInputWidget( {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-forms-goback' ),\n\t\t\tclasses: [ 'VisualDataFormSubmitButton' ],\n\t\t\tflags: [ 'progressive' ],\n\t\t\ticon: 'arrowPrevious'\n\t\t} );\n\n\t\tGoBackButton.on( 'click', function () {\n\t\t\tvar thisPanels = PropertiesStack.getItems();\n\t\t\tPropertiesStack.setItem( thisPanels[ 0 ] );\n\n\t\t\tValidateButton.toggle( true );\n\t\t\tSubmitButton.toggle( false );\n\t\t\tGoBackButton.toggle( false );\n\t\t\t// DeleteButton.toggle( hasStoredJsonData() );\n\n\t\t\t$( '#visualdataform-wrapper-' + FormID )\n\t\t\t\t.get( 0 )\n\t\t\t\t.scrollIntoView( { behavior: 'smooth' } );\n\t\t} );\n\n\t\tformContent.push( GoBackButton.$element );\n\n\t\tupdateButtons( panels );\n\n\t\tvar classes = [\n\t\t\t'VisualDataForm',\n\t\t\t'VisualDataFormContext-' + Config.context\n\t\t];\n\n\t\tif ( 'css-class' in Form.options && Form.options[ 'css-class' ] !== '' ) {\n\t\t\tclasses.push( Form.options[ 'css-class' ] );\n\t\t}\n\n\t\t// eslint-disable-next-line mediawiki/class-doc\n\t\tvar form = new OO.ui.FormLayout( {\n\t\t\taction: Config.actionUrl,\n\t\t\tmethod: 'post',\n\t\t\tenctype: 'multipart/form-data',\n\t\t\t$content: formContent,\n\t\t\tclasses: classes,\n\t\t\tdata: { name: 'visualdata' }\n\t\t} );\n\n\t\t// DeleteButton.on( 'click', function () {\n\t\t// \tif (\n\t\t// \t\t// eslint-disable-next-line no-alert\n\t\t// \t\tconfirm(\n\t\t// \t\t\tmw.msg( 'visualdata-jsmodule-forms-delete-data-confirm' )\n\t\t// \t\t)\n\t\t// \t) {\n\t\t// \t\tform.$element.data( { delete: true } );\n\t\t// \t\tform.$element.trigger( 'submit' );\n\t\t// \t}\n\n\t\t// VisualDataFunctions.OOUIAlert(\n\t\t// \tnew OO.ui.HtmlSnippet(\n\t\t// \t\tmw.msg(\"visualdata-jsmodule-visualdata-delete-data-confirm\")\n\t\t// \t),\n\t\t// \t{ size: \"medium\" },\n\t\t// \tfunction () {\n\t\t// \t\tform.$element.data({ delete: true });\n\t\t// \t\tform.$element.submit();\n\t\t// \t}\n\t\t// );\n\t\t// } );\n\n\t\tform.$element.on( 'submit', onSubmit );\n\n\t\tvar editToolbar = Config.canmanageschemas || Config.caneditdata;\n\n\t\tif ( Config.context === 'parserfunction' || !editToolbar ) {\n\t\t\t$( '#visualdataform-wrapper-' + FormID ).html( form.$element );\n\n\t\t\t// eslint-disable-next-line no-jquery/no-global-selector\n\t\t\t$( '#mw-rcfilters-spinner-wrapper' ).remove();\n\t\t\t// showVisualEditor();\n\n\t\t\treturn true;\n\t\t}\n\n\t\tvar items = [];\n\t\tToolbarMain = createToolbar( Config.context === 'EditData' );\n\n\t\tvar frameA = new OO.ui.PanelLayout( {\n\t\t\t$content: [ ToolbarMain.$element, form.$element ],\n\t\t\texpanded: false,\n\t\t\tframed: false,\n\t\t\tpadded: false,\n\t\t\tdata: { name: 'visualdata' }\n\t\t} );\n\n\t\titems.push( frameA );\n\n\t\tif ( Config.canmanageschemas ) {\n\t\t\tActionToolbarMain = createActionToolbar( Config.context === 'EditData' );\n\t\t\tToolbarMain.$actions.append( ActionToolbarMain.$element );\n\n\t\t\t// https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/c2805c7e9e83e2f3a857451d46c80231d1658a0f/demos/pages/layouts.js\n\t\t\tvar toolbarSchemas = VisualDataSchemas.createToolbarA();\n\t\t\tvar contentSchemas = new OO.ui.PanelLayout( {\n\t\t\t\t$content: $(\n\t\t\t\t\t'<table id=\"visualdata-schemas-datatable\" class=\"visualdata-datatable display\" width=\"100%\"></table>'\n\t\t\t\t),\n\t\t\t\texpanded: false,\n\t\t\t\tframed: true,\n\t\t\t\tpadded: true,\n\t\t\t\tclasses: [ 'VisualDataEditDataOuterStackPanel' ]\n\t\t\t} );\n\n\t\t\tvar frameSchemas = new OO.ui.PanelLayout( {\n\t\t\t\t$content: [ toolbarSchemas.$element, contentSchemas.$element ],\n\t\t\t\texpanded: false,\n\t\t\t\tframed: false,\n\t\t\t\tpadded: false,\n\t\t\t\tdata: { name: 'manage-schemas' }\n\t\t\t} );\n\n\t\t\titems.push( frameSchemas );\n\t\t}\n\n\t\t// if (Config.canmanageforms) {\n\t\t// \tvar toolbarForms = VisualDataForms.createToolbarA();\n\t\t// \tvar contentForms = new OO.ui.PanelLayout({\n\t\t// \t\t$content: $(\n\t\t// \t\t\t'<table id=\"visualdata-forms-datatable\" class=\"visualdata-datatable display\" width=\"100%\"></table>'\n\t\t// \t\t),\n\t\t// \t\texpanded: false,\n\t\t// \t\tpadded: true,\n\t\t// \t});\n\t\t//\n\t\t// \tvar frameForms = new OO.ui.PanelLayout({\n\t\t// \t\t$content: [toolbarForms.$element, contentForms.$element],\n\t\t// \t\texpanded: false,\n\t\t// \t\tframed: true,\n\t\t// \t\tdata: { name: \"manage-forms\" },\n\t\t// \t});\n\t\t//\n\t\t// \titems.push(frameForms);\n\t\t// }\n\n\t\tOuterStack = new OO.ui.StackLayout( {\n\t\t\titems: items,\n\t\t\texpanded: false,\n\t\t\tcontinuous: false\n\t\t\t// classes: [\"visualdataform-wrapper\"],\n\t\t} );\n\n\t\tif ( Config.canmanageschemas ) {\n\t\t\tvar actionToolbarSchemas = createActionToolbar(\n\t\t\t\tConfig.context === 'EditData'\n\t\t\t);\n\t\t\ttoolbarSchemas.$actions.append( actionToolbarSchemas.$element );\n\t\t}\n\n\t\t// if (Config.canmanageforms) {\n\t\t// \tvar actionToolbarForms = createActionToolbar();\n\t\t// \ttoolbarForms.$actions.append(actionToolbarForms.$element);\n\t\t// }\n\n\t\t$( '#visualdataform-wrapper-' + FormID ).html( OuterStack.$element );\n\n\t\tToolbarMain.initialize();\n\n\t\tif ( Config.canmanageschemas ) {\n\t\t\ttoolbarSchemas.initialize();\n\t\t}\n\n\t\t// if (Config.canmanageforms) {\n\t\t// \ttoolbarForms.initialize();\n\t\t// }\n\n\t\t$( '#mw-rcfilters-spinner-wrapper' ).remove();\n\n\t\t// showVisualEditor();\n\n\t\treturn true;\n\t}\n\n\treturn {\n\t\tinitialize,\n\t\tgetCategories,\n\t\t// updateForms,\n\t\tupdateSchemas,\n\t\tupdatePanels,\n\t\tmutationChange\n\t};\n};\n\n$( function () {\n\tvar schemas = JSON.parse( mw.config.get( 'visualdata-schemas' ) );\n\t// console.log(\"schemas\", schemas);\n\n\tvar submissionData = JSON.parse(\n\t\tmw.config.get( 'visualdata-submissiondata' )\n\t);\n\t// console.log(\"submissionData\", submissionData);\n\n\tvar pageForms = JSON.parse( mw.config.get( 'visualdata-pageforms' ) );\n\t// console.log(\"pageForms\", pageForms);\n\n\tvar config = JSON.parse( mw.config.get( 'visualdata-config' ) );\n\t// console.log(\"config\", config);\n\n\tvar windowManager = new VisualDataWindowManager();\n\n\tif ( !submissionData ) {\n\t\tsubmissionData = {};\n\t}\n\n\tfunction init() {\n\t\tvar instances = [];\n\n\t\tfor ( var formID in pageForms ) {\n\t\t\tvar form = pageForms[ formID ];\n\n\t\t\tform = $.extend(\n\t\t\t\t{\n\t\t\t\t\tfreetext: '',\n\t\t\t\t\tjsonData: {},\n\t\t\t\t\tcategories: [],\n\t\t\t\t\terrors: [],\n\t\t\t\t\tschemas: [],\n\t\t\t\t\toptions: {}\n\t\t\t\t},\n\t\t\t\tform\n\t\t\t);\n\n\t\t\tif ( formID in submissionData ) {\n\t\t\t\tform = $.extend(\n\t\t\t\t\tform,\n\t\t\t\t\tsubmissionData[ formID ]\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tvar visualDataForm = new VisualDataForms(\n\t\t\t\tconfig,\n\t\t\t\tform,\n\t\t\t\tformID,\n\t\t\t\tschemas,\n\t\t\t\twindowManager\n\t\t\t);\n\n\t\t\tvisualDataForm.initialize();\n\n\t\t\tif ( config.context === 'parserfunction' && form.errors.length ) {\n\t\t\t\t$( '#visualdataform-wrapper-' + formID )\n\t\t\t\t\t.get( 0 )\n\t\t\t\t\t.scrollIntoView();\n\t\t\t}\n\n\t\t\tinstances.push( visualDataForm );\n\t\t}\n\n\t\t// *** this allows to render forms when they\n\t\t// are contained within not visible elements\n\t\t// like datatables cells, or dialogs\n\t\tvar MutationObserver = window.MutationObserver || window.WebKitMutationObserver;\n\n\t\tif ( MutationObserver ) {\n\t\t\tvar observer = new MutationObserver( function ( mutations, thisObserver ) {\n\t\t\t\tfor ( var instance of instances ) {\n\t\t\t\t\tinstance.mutationChange();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tobserver.observe( document, {\n\t\t\t\tsubtree: true,\n\t\t\t\tchildList: true\n\t\t\t} );\n\t\t}\n\n\t\treturn instances;\n\t}\n\n\tif ( !config.canmanageschemas ) {\n\t\tVisualData.setVars( config, schemas, init() );\n\n\t} else {\n\t\tmw.loader.using( 'ext.VisualData.ManageSchemas', function () {\n\t\t\tvar instances = init();\n\t\t\tVisualData.setVars( config, schemas, instances );\n\t\t\tVisualDataSchemas.setVars(\n\t\t\t\tconfig,\n\t\t\t\twindowManager,\n\t\t\t\tschemas,\n\t\t\t\tinstances\n\t\t\t);\n\t\t} );\n\t}\n\n} );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataFunctions.js","messages":[],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":25,"column":1,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":824,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":80,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":80,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":81,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":81,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":82,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":82,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":83,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":83,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":84,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":84,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":97,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":97,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-useless-escape","severity":2,"message":"Unnecessary escape character: \\(.","line":122,"column":52,"nodeType":"Literal","messageId":"unnecessaryEscape","endLine":122,"endColumn":53,"suggestions":[{"messageId":"removeEscape","fix":{"range":[3528,3529],"text":""},"desc":"Remove the `\\`. This maintains the current functionality."},{"messageId":"escapeBackslash","fix":{"range":[3528,3528],"text":"\\"},"desc":"Replace the `\\` with `\\\\` to include the actual backslash character."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-useless-escape","severity":2,"message":"Unnecessary escape character: \\).","line":122,"column":54,"nodeType":"Literal","messageId":"unnecessaryEscape","endLine":122,"endColumn":55,"suggestions":[{"messageId":"removeEscape","fix":{"range":[3530,3531],"text":""},"desc":"Remove the `\\`. This maintains the current functionality."},{"messageId":"escapeBackslash","fix":{"range":[3530,3530],"text":"\\"},"desc":"Replace the `\\` with `\\\\` to include the actual backslash character."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":483,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":483,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":484,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":484,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":485,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":485,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":486,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":486,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":487,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":487,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":488,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":488,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-sequences","severity":2,"message":"Unexpected use of comma operator.","line":640,"column":59,"nodeType":"SequenceExpression","messageId":"unexpectedCommaExpression","endLine":640,"endColumn":60,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'e' is defined but never used.","line":765,"column":47,"nodeType":"Identifier","messageId":"unusedVar","endLine":765,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-self-compare","severity":2,"message":"Comparing to itself is potentially pointless.","line":780,"column":39,"nodeType":"BinaryExpression","messageId":"comparingToSelf","endLine":780,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataGeolocation.js","messages":[],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'VisualDataGeolocation' is assigned a value but never used.","line":24,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":24,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'Config' is assigned a value but never used.","line":26,"column":6,"nodeType":"Identifier","messageId":"unusedVar","endLine":26,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 158. Maximum allowed is 100.","line":65,"column":1,"nodeType":"Program","messageId":"max","endLine":65,"endColumn":144,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 161. Maximum allowed is 100.","line":70,"column":1,"nodeType":"Program","messageId":"max","endLine":70,"endColumn":147,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 116. Maximum allowed is 100.","line":86,"column":1,"nodeType":"Program","messageId":"max","endLine":86,"endColumn":102,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 147. Maximum allowed is 100.","line":108,"column":1,"nodeType":"Program","messageId":"max","endLine":108,"endColumn":133,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 356. Maximum allowed is 100.","line":112,"column":1,"nodeType":"Program","messageId":"max","endLine":112,"endColumn":342,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 273. Maximum allowed is 100.","line":116,"column":1,"nodeType":"Program","messageId":"max","endLine":116,"endColumn":259,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 102. Maximum allowed is 100.","line":123,"column":1,"nodeType":"Program","messageId":"max","endLine":123,"endColumn":88,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 250. Maximum allowed is 100.","line":124,"column":1,"nodeType":"Program","messageId":"max","endLine":124,"endColumn":236,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 204. Maximum allowed is 100.","line":126,"column":1,"nodeType":"Program","messageId":"max","endLine":126,"endColumn":190,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 186. Maximum allowed is 100.","line":132,"column":1,"nodeType":"Program","messageId":"max","endLine":132,"endColumn":172,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 237. Maximum allowed is 100.","line":141,"column":1,"nodeType":"Program","messageId":"max","endLine":141,"endColumn":223,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 118. Maximum allowed is 100.","line":157,"column":1,"nodeType":"Program","messageId":"max","endLine":157,"endColumn":104,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is assigned a value but never used.","line":183,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":183,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"max-len","severity":1,"message":"This line has a length of 108. Maximum allowed is 100.","line":317,"column":1,"nodeType":"Program","messageId":"max","endLine":317,"endColumn":100,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-inner-declarations","severity":2,"message":"Move function declaration to function body root.","line":425,"column":4,"nodeType":"FunctionDeclaration","messageId":"moveDeclToRoot","endLine":430,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-inner-declarations","severity":2,"message":"Move function declaration to function body root.","line":435,"column":4,"nodeType":"FunctionDeclaration","messageId":"moveDeclToRoot","endLine":440,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-inner-declarations","severity":2,"message":"Move function declaration to function body root.","line":443,"column":4,"nodeType":"FunctionDeclaration","messageId":"moveDeclToRoot","endLine":448,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'property' is defined but never used.","line":461,"column":45,"nodeType":"Identifier","messageId":"unusedVar","endLine":461,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataInputConfig.js","messages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 110. Maximum allowed is 100.","line":838,"column":1,"nodeType":"Program","messageId":"max","endLine":838,"endColumn":96}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'VisualDataInputConfig' is assigned a value but never used.","line":26,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":26,"endColumn":28,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'Config' is assigned a value but never used.","line":28,"column":6,"nodeType":"Identifier","messageId":"unusedVar","endLine":28,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":294,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":294,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":295,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":295,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":304,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":304,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":305,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":305,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":425,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":425,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":426,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":426,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":485,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":485,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":486,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":486,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":494,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":494,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":495,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":495,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":649,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":649,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":650,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":650,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":678,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":678,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":679,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":679,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":715,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":715,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":716,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":716,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":774,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":774,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":775,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":775,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":832,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":832,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":833,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":833,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":837,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":837,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":838,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":838,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":854,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":854,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":855,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":855,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is assigned a value but never used.","line":1088,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":1088,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'property' is defined but never used.","line":1156,"column":45,"nodeType":"Identifier","messageId":"unusedVar","endLine":1156,"endColumn":53,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright ©2023, https://wikisphere.org\n */\n\n/* eslint-disable no-tabs */\n\n// @see https://doc.wikimedia.org/oojs-ui/master/js/\n// eslint-disable-next-line no-unused-vars\nconst VisualDataInputConfig = function ( phpConfig, windowManager ) {\n\t// eslint-disable-next-line no-unused-vars\n\tvar Config = phpConfig;\n\tvar WindowManager = windowManager;\n\tvar ProcessDialog;\n\tvar DialogSearchName = 'dialogSearch';\n\tvar processDialogSearch;\n\tvar Model;\n\tvar InputName;\n\tvar CustomInputConfig;\n\tvar Callback;\n\tvar panelLayout;\n\tvar SelectedItems = {};\n\tvar HelpUrl;\n\n\tfunction inArray( val, arr ) {\n\t\treturn arr.indexOf( val ) !== -1;\n\t}\n\n\t// @TODO add default for each of them\n\tfunction getInputConfig( inputName ) {\n\t\tswitch ( inputName ) {\n\t\t\tcase 'mw.widgets.UserInputWidget':\n\t\t\tcase 'mw.widgets.TitleInputWidget':\n\t\t\tcase 'mw.widgets.DateInputWidget':\n\t\t\tcase 'OO.ui.TextInputWidget':\n\t\t\t\tvar ret = {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\tautocomplete: [\n\t\t\t\t\t\t'boolean', // 'boolean|string',\n\t\t\t\t\t\t'Should the browser support autocomplete for this field?'\n\t\t\t\t\t],\n\t\t\t\t\tautofocus: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Use an HTML autofocus attribute to instruct the browser to focus this widget.'\n\t\t\t\t\t],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tflags: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The name or names of the flags (e.g., 'progressive' or 'primary') to apply.\"\n\t\t\t\t\t],\n\t\t\t\t\ticon: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names.'\n\t\t\t\t\t],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tindicator: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Symbolic name of the indicator (e.g. ‘required’ or ‘down’).'\n\t\t\t\t\t],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tinvisibleLabel: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether the label should be visually hidden (but still accessible to screen-readers).'\n\t\t\t\t\t],\n\t\t\t\t\tlabel: [ 'string', 'The label text' ],\n\t\t\t\t\tlabelPosition: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The position of the inline label relative to that of the value or placeholder text: 'before' or 'after'\"\n\t\t\t\t\t],\n\t\t\t\t\tmaxLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Maximum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\tminLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Minimum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\tplaceholder: [ 'string', 'Placeholder text' ],\n\t\t\t\t\treadOnly: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Prevent changes to the value of the text input.'\n\t\t\t\t\t],\n\t\t\t\t\tspellcheck: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Should the browser support spellcheck for this field (undefined means leaving it up to the browser).'\n\t\t\t\t\t],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ],\n\t\t\t\t\ttype: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The value of the HTML type attribute: 'text', 'password', 'email', 'url' or 'number'.\"\n\t\t\t\t\t],\n\t\t\t\t\tvalidate: [\n\t\t\t\t\t\t'string', // regex\n\t\t\t\t\t\t'A regular expression that must match the value for it to be considered valid. See <a target=\"_blank\" href=\"https://json-schema.org/understanding-json-schema/reference/regular_expressions\">Regular Expressions</a>'\n\t\t\t\t\t]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\t\tswitch ( inputName ) {\n\t\t\t\t\tcase 'mw.widgets.DateInputWidget':\n\t\t\t\t\t\treturn jQuery.extend( ret, {\n\t\t\t\t\t\t\tprecision: [ 'day/month', \" Date precision to use, 'day' or 'month'\" ],\n\t\t\t\t\t\t\tinputFormat: [\n\t\t\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\t\t'Date format string to use for the textual input field'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tdisplayFormat: [\n\t\t\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\t\t'Date format string to use for the clickable label'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tlongDisplayFormat: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'If a custom displayFormat is not specified, use unabbreviated day of the week and month names in the default language-specific displayFormat'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tplaceholderLabel: [\n\t\t\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\t\t'Placeholder text shown when the widget is not'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tplaceholderDateFormat: [\n\t\t\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\t\t\"User-visible date format string displayed in the textual input field when it's empty\"\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tmustBeAfter: [ 'date', 'Validates the date to be after this' ],\n\t\t\t\t\t\t\tmustBeBefore: [ 'date', 'Validates the date to be before this' ]\n\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'mw.widgets.TitleInputWidget':\n\t\t\t\t\t\treturn jQuery.extend( ret, {\n\t\t\t\t\t\t\tlimit: [ 'integer', 'Number of results to show' ],\n\t\t\t\t\t\t\tnamespace: [ 'integer', 'Namespace to prepend to queries' ],\n\t\t\t\t\t\t\tmaxLength: [ 'integer', 'Maximum query length' ],\n\t\t\t\t\t\t\trelative: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'If a namespace is set, display titles relative to it'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tsuggestions: [ 'boolean', 'Display search suggestions' ],\n\t\t\t\t\t\t\tshowRedirectTargets: [ 'boolean', 'Show the targets of redirects' ],\n\t\t\t\t\t\t\tshowImages: [ 'boolean', 'Show page images' ],\n\t\t\t\t\t\t\tshowDescriptions: [ 'boolean', 'Show page descriptions' ],\n\t\t\t\t\t\t\tshowDisambigsLast: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'Show disambiguation pages as the last results'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tshowMissing: [ 'boolean', 'Show missing pages' ],\n\t\t\t\t\t\t\tshowInterwikis: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'Show pages with a valid interwiki prefix'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\taddQueryInput: [ 'boolean', \"Add exact user's input query to results\" ],\n\t\t\t\t\t\t\texcludeCurrentPage: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'Exclude the current page from suggestions'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\texcludeDynamicNamespaces: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'Exclude pages whose namespace is negative'\n\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\tvalidateTitle: [ 'boolean', 'Whether the input must be a valid title' ],\n\t\t\t\t\t\t\trequired: [ 'boolean', 'Whether the input must not be empty' ],\n\t\t\t\t\t\t\thighlightSearchQuery: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'Highlight the partial query the user used for this title'\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'mw.widgets.UserInputWidget':\n\t\t\t\t\t\treturn jQuery.extend( ret, {\n\t\t\t\t\t\t\tlimit: [ 'integer', 'Number of results to show' ]\n\t\t\t\t\t\t} );\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\tcase 'OO.ui.ToggleSwitchWidget':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.RadioSelectInputWidget':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\t// options: [\"array\", \"Array of menu options\"],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text' ]\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.NumberInputWidget':\n\t\t\t\treturn {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\tautocomplete: [\n\t\t\t\t\t\t'boolean', // 'boolean|string',\n\t\t\t\t\t\t'Should the browser support autocomplete for this field?'\n\t\t\t\t\t],\n\t\t\t\t\tautofocus: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Use an HTML autofocus attribute to instruct the browser to focus this widget.'\n\t\t\t\t\t],\n\t\t\t\t\tbuttonStep: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Delta when using the buttons or Up/Down arrow keys'\n\t\t\t\t\t],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tflags: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The name or names of the flags (e.g., 'progressive' or 'primary') to apply.\"\n\t\t\t\t\t],\n\t\t\t\t\ticon: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names.'\n\t\t\t\t\t],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tindicator: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Symbolic name of the indicator (e.g. ‘required’ or ‘down’).'\n\t\t\t\t\t],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tinvisibleLabel: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether the label should be visually hidden (but still accessible to screen-readers).'\n\t\t\t\t\t],\n\t\t\t\t\tlabel: [ 'string', 'The label text' ],\n\t\t\t\t\tlabelPosition: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The position of the inline label relative to that of the value or placeholder text: 'before' or 'after'\"\n\t\t\t\t\t],\n\t\t\t\t\tmax: [ 'number', 'Maximum allowed value' ],\n\t\t\t\t\tmaxLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Maximum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\tmin: [ 'number', 'Minimum allowed value' ],\n\t\t\t\t\tminLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Minimum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\t// minusButton: [\n\t\t\t\t\t// \t'object',\n\t\t\t\t\t// \t'Configuration options to pass to the decrementing button widget'\n\t\t\t\t\t// ],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\tpageStep: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Delta when using the Page-up/Page-down keys. Defaults to 10 times buttonStep'\n\t\t\t\t\t],\n\t\t\t\t\tplaceholder: [ 'string', 'Placeholder text' ],\n\t\t\t\t\t// plusButton: [\n\t\t\t\t\t// \t'object',\n\t\t\t\t\t// \t'Configuration options to pass to the incrementing button widget.'\n\t\t\t\t\t// ],\n\t\t\t\t\treadOnly: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Prevent changes to the value of the text input.'\n\t\t\t\t\t],\n\t\t\t\t\tshowButtons: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether to show the plus and minus buttons.'\n\t\t\t\t\t],\n\t\t\t\t\tspellcheck: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Should the browser support spellcheck for this field (undefined means leaving it up to the browser).'\n\t\t\t\t\t],\n\t\t\t\t\tstep: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'If specified, the field only accepts values that are multiples of this.'\n\t\t\t\t\t],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ],\n\t\t\t\t\ttype: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The value of the HTML type attribute: 'text', 'password', 'email', 'url' or 'number'.\"\n\t\t\t\t\t],\n\t\t\t\t\tvalidate: [\n\t\t\t\t\t\t'string', // regex\n\t\t\t\t\t\t'A regular expression that must match the value for it to be considered valid'\n\t\t\t\t\t]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\tcase 'mw.widgets.UsersMultiselectWidget':\n\t\t\tcase 'mw.widgets.TitlesMultiselectWidget':\n\t\t\tcase 'mw.widgets.CategoryMultiselectWidget':\n\t\t\tcase 'OO.ui.TagMultiselectWidget':\n\t\t\tcase 'OO.ui.MenuTagMultiselectWidget':\n\t\t\t\tvar ret = {\n\t\t\t\t\tallowArbitrary: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Allow data items to be added even if not present in the menu.'\n\t\t\t\t\t],\n\t\t\t\t\tallowDisplayInvalidTags: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Allow the display of invalid tags.'\n\t\t\t\t\t],\n\t\t\t\t\tallowDuplicates: [ 'boolean', 'Allow duplicate items to be added' ],\n\t\t\t\t\tallowEditTags: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Allow editing of the tags by clicking them'\n\t\t\t\t\t],\n\t\t\t\t\tallowReordering: [ 'boolean', 'Allow reordering of the items' ],\n\t\t\t\t\tallowedValues: [\n\t\t\t\t\t\t'array',\n\t\t\t\t\t\t'An array representing the allowed items by their datas'\n\t\t\t\t\t],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tdraggable: [ 'boolean', 'The items are draggable.' ],\n\t\t\t\t\tflags: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The name or names of the flags (e.g., 'progressive' or 'primary') to apply.\"\n\t\t\t\t\t],\n\t\t\t\t\ticon: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names.'\n\t\t\t\t\t],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tindicator: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Symbolic name of the indicator (e.g. ‘required’ or ‘down’).'\n\t\t\t\t\t],\n\t\t\t\t\t// input: [ 'object', 'Configuration options for the input widget' ],\n\n\t\t\t\t\tinputPosition: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Position of the input. Options are: - inline: The input is invisible, but exists inside the tag list, so the user types into the tag groups to add tags. - outline: The input is underneath the tag area. - none: No input supplied'\n\t\t\t\t\t],\n\t\t\t\t\t// items: [\"array\", \"\"],\n\t\t\t\t\t// menu: [ 'object', 'Configuration object for the menu widget' ],\n\n\t\t\t\t\t// options: [\"array\", \"Array of menu options\"],\n\t\t\t\t\torientation: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"Item orientation: 'horizontal' or 'vertical'.\"\n\t\t\t\t\t],\n\t\t\t\t\tplaceholder: [ 'string', 'Placeholder text' ],\n\t\t\t\t\t// selected: [\"array\", \"A set of selected tags\"],\n\t\t\t\t\ttagLimit: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'An optional limit on the number of selected options'\n\t\t\t\t\t],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text' ]\n\t\t\t\t};\n\t\t\t\tswitch ( inputName ) {\n\t\t\t\t\tcase 'OO.ui.MenuTagMultiselectWidget':\n\t\t\t\t\t\treturn jQuery.extend( ret, {\n\t\t\t\t\t\t\tclearInputOnChoose: [\n\t\t\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t\t\t'Clear the text input value when a menu option is chosen'\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t} );\n\t\t\t\t\tcase 'mw.widgets.CategoryMultiselectWidget':\n\t\t\t\t\t\treturn jQuery.extend( ret, {\n\t\t\t\t\t\t\tlimit: [ 'integer', 'Maximum number of results to load' ]\n\t\t\t\t\t\t} );\n\t\t\t\t\tcase 'mw.widgets.TitlesMultiselectWidget':\n\t\t\t\t\t\treturn jQuery.extend( ret, {\n\t\t\t\t\t\t\tclearInputOnChoose: [ 'boolean', 'clear input on choose' ],\n\t\t\t\t\t\t\tinputPosition: [ 'string', 'input position' ],\n\n\t\t\t\t\t\t\tallowEditTags: [ 'boolean', 'clear input on choose' ]\n\t\t\t\t\t\t} );\n\t\t\t\t\tcase 'mw.widgets.UsersMultiselectWidget':\n\t\t\t\t\t\treturn jQuery.extend( ret, {\n\t\t\t\t\t\t\tlimit: [ 'integer', 'Number of results to show' ],\n\t\t\t\t\t\t\t// name: [\n\t\t\t\t\t\t\t// \t'string',\n\t\t\t\t\t\t\t// \t'Name of input to submit results (when used in HTML forms)'\n\t\t\t\t\t\t\t// ],\n\t\t\t\t\t\t\tipAllowed: [ 'boolean', 'Show IP addresses in autocomplete menu' ],\n\t\t\t\t\t\t\t'ipRangeLimits.IPv4': [ 'integer', ' Maximum allowed IPv4 range' ],\n\t\t\t\t\t\t\t'ipRangeLimits.IPv6': [ 'integer', ' Maximum allowed IPv6 range' ]\n\t\t\t\t\t\t} );\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\tcase 'OO.ui.ComboBoxInputWidget':\n\t\t\t\treturn {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\tautocomplete: [\n\t\t\t\t\t\t'boolean', // |string\n\t\t\t\t\t\t'Should the browser support autocomplete for this field?'\n\t\t\t\t\t],\n\t\t\t\t\tautofocus: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Use an HTML autofocus attribute to instruct the browser to focus this widget.'\n\t\t\t\t\t],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tflags: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The name or names of the flags (e.g., 'progressive' or 'primary') to apply.\"\n\t\t\t\t\t],\n\t\t\t\t\ticon: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names.'\n\t\t\t\t\t],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tindicator: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Symbolic name of the indicator (e.g. ‘required’ or ‘down’).'\n\t\t\t\t\t],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tinvisibleLabel: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether the label should be visually hidden (but still accessible to screen-readers).'\n\t\t\t\t\t],\n\t\t\t\t\tlabel: [ 'string', 'The label text' ],\n\t\t\t\t\tlabelPosition: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The position of the inline label relative to that of the value or placeholder text: 'before' or 'after'\"\n\t\t\t\t\t],\n\t\t\t\t\tmaxLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Maximum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\t// menu: [\n\t\t\t\t\t// \t'object',\n\t\t\t\t\t// \t'configuration options to pass to the menu select widget'\n\t\t\t\t\t// ],\n\t\t\t\t\tminLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Minimum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\t// options: [\n\t\t\t\t\t// \t\"object\",\n\t\t\t\t\t// \t\"onfiguration options to pass to the menu select widget\",\n\t\t\t\t\t// ],\n\t\t\t\t\tplaceholder: [ 'string', 'Placeholder text' ],\n\t\t\t\t\treadOnly: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Prevent changes to the value of the text input.'\n\t\t\t\t\t],\n\t\t\t\t\tspellcheck: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Should the browser support spellcheck for this field (undefined means leaving it up to the browser).'\n\t\t\t\t\t],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ],\n\t\t\t\t\ttype: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The value of the HTML type attribute: 'text', 'password', 'email', 'url' or 'number'.\"\n\t\t\t\t\t],\n\t\t\t\t\tvalidate: [\n\t\t\t\t\t\t'string', // regex\n\t\t\t\t\t\t'A regular expression that must match the value for it to be considered valid'\n\t\t\t\t\t]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.MultilineTextInputWidget':\n\t\t\t\treturn {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\tautocomplete: [\n\t\t\t\t\t\t'boolean', // 'boolean|string',\n\t\t\t\t\t\t'Should the browser support autocomplete for this field?'\n\t\t\t\t\t],\n\t\t\t\t\tautofocus: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Use an HTML autofocus attribute to instruct the browser to focus this widget.'\n\t\t\t\t\t],\n\t\t\t\t\tautosize: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Automatically resize the text input to fit its content'\n\t\t\t\t\t],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tflags: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The name or names of the flags (e.g., 'progressive' or 'primary') to apply.\"\n\t\t\t\t\t],\n\t\t\t\t\ticon: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names.'\n\t\t\t\t\t],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tindicator: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Symbolic name of the indicator (e.g. ‘required’ or ‘down’).'\n\t\t\t\t\t],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tinvisibleLabel: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether the label should be visually hidden (but still accessible to screen-readers).'\n\t\t\t\t\t],\n\t\t\t\t\tlabel: [ 'string', 'The label text' ],\n\t\t\t\t\tlabelPosition: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The position of the inline label relative to that of the value or placeholder text: 'before' or 'after'\"\n\t\t\t\t\t],\n\t\t\t\t\tmaxLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Maximum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\tmaxRows: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Maximum number of rows to display when autosize is set to true'\n\t\t\t\t\t],\n\t\t\t\t\tminLength: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Minimum number of characters allowed in the input.'\n\t\t\t\t\t],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\tplaceholder: [ 'string', 'Placeholder text' ],\n\t\t\t\t\treadOnly: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Prevent changes to the value of the text input.'\n\t\t\t\t\t],\n\t\t\t\t\trows: [\n\t\t\t\t\t\t'integer',\n\t\t\t\t\t\t'Number of visible lines in textarea. If used with autosize, specifies minimum number of rows to display.'\n\t\t\t\t\t],\n\t\t\t\t\tspellcheck: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Should the browser support spellcheck for this field (undefined means leaving it up to the browser).'\n\t\t\t\t\t],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ],\n\t\t\t\t\ttype: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"The value of the HTML type attribute: 'text', 'password', 'email', 'url' or 'number'.\"\n\t\t\t\t\t],\n\t\t\t\t\tvalidate: [\n\t\t\t\t\t\t'string', // regex\n\t\t\t\t\t\t'A regular expression that must match the value for it to be considered valid'\n\t\t\t\t\t]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.MultiselectWidget':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\t// items: ['array', 'An array of options to add to the multiselect'],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ]\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.ButtonSelectWidget':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\titems: [ 'array', 'An array of options to add to the multiselect' ],\n\t\t\t\t\tmultiselect: [ 'boolean', 'Allow for multiple selections' ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ]\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.CheckboxMultiselectInputWidget':\n\t\t\t\treturn {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\t// options: [\n\t\t\t\t\t// \t'array',\n\t\t\t\t\t// \t'Array of menu options in the format described above.'\n\t\t\t\t\t// ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ]\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.DropdownInputWidget':\n\t\t\t\treturn {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\t// dropdown: [ 'object', 'Configuration options for DropdownWidget' ],\n\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\t// options: [\n\t\t\t\t\t// \t'array',\n\t\t\t\t\t// \t'Array of menu options in the format described above.'\n\t\t\t\t\t// ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.InputWidget':\n\t\t\tcase 'mw.widgets.datetime.DateTimeInputWidget':\n\t\t\t\tvar ret = {\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\n\t\t\t\tswitch ( inputName ) {\n\t\t\t\t\tcase 'mw.widgets.datetime.DateTimeInputWidget':\n\t\t\t\t\t\treturn jQuery.extend( ret, {\n\t\t\t\t\t\t\ttype: [ 'string', \"Whether to act like a 'date'\" ],\n\t\t\t\t\t\t\trequired: [ 'boolean', 'Whether a value is required' ],\n\t\t\t\t\t\t\tclearable: [ 'boolean', 'Whether to provide for blanking the value.' ],\n\t\t\t\t\t\t\t// value: [\n\t\t\t\t\t\t\t// \t'boolean',\n\t\t\t\t\t\t\t// \t'Default value for the widget'\n\t\t\t\t\t\t\t// ],\n\t\t\t\t\t\t\tmin: [ 'string', ' Minimum allowed date' ],\n\t\t\t\t\t\t\tmax: [ 'string', 'Maximum allowed date' ]\n\t\t\t\t\t\t} );\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\tcase 'ButtonMultiselectWidget':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ]\n\t\t\t\t};\n\n\t\t\tcase 'intl-tel-input':\n\t\t\t\t// @see https://github.com/jackocnr/intl-tel-input\n\t\t\t\treturn {\n\t\t\t\t\tallowDropdown: [ 'boolean', 'Whether or not to allow the dropdown' ],\n\t\t\t\t\tautoInsertDialCode: [\n\t\t\t\t\t\t'Boolean',\n\t\t\t\t\t\t'When enabled (requires nationalMode to be disabled), the international dial code will be automatically inserted into the input'\n\t\t\t\t\t],\n\t\t\t\t\tautoPlaceholder: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t\"Set the input's placeholder to an example number for the selected country, and update it if the country changes\"\n\t\t\t\t\t],\n\t\t\t\t\tcustomContainer: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Additional classes to add to the parent div.'\n\t\t\t\t\t],\n\t\t\t\t\tcustomPlaceholder: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Change the placeholder generated by autoPlaceholder. Must return a string'\n\t\t\t\t\t],\n\t\t\t\t\texcludeCountries: [\n\t\t\t\t\t\t'array',\n\t\t\t\t\t\t'In the dropdown, display all countries except the ones you specify here.'\n\t\t\t\t\t],\n\t\t\t\t\tformatOnDisplay: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Format the input value (according to the nationalMode option) during initialisation, and on setNumber. Requires the utilsScript option'\n\t\t\t\t\t],\n\t\t\t\t\tgeoIpLookup: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'When setting initialCountry to \"auto\", you must use this option to specify a custom function that looks up the user\\'s location, and then calls the success callback with the relevant country code'\n\t\t\t\t\t],\n\t\t\t\t\thiddenInput: [ 'string', 'Add a hidden input with the given name.' ],\n\t\t\t\t\tinitialCountry: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Set the initial country selection by specifying its country code'\n\t\t\t\t\t],\n\t\t\t\t\t// 'localizedCountries': [\n\t\t\t\t\t// \t'object',\n\t\t\t\t\t// \t'Allow localisation of country names'\n\t\t\t\t\t// ],\n\t\t\t\t\tnationalMode: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Format numbers in the national format, rather than the international format.'\n\t\t\t\t\t],\n\t\t\t\t\tonlyCountries: [\n\t\t\t\t\t\t'array',\n\t\t\t\t\t\t'In the dropdown, display only the countries you specify'\n\t\t\t\t\t],\n\t\t\t\t\tplaceholderNumberType: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Specify one of the keys from the global enum intlTelInputUtils.numberType'\n\t\t\t\t\t],\n\t\t\t\t\tpreferredCountries: [\n\t\t\t\t\t\t'array',\n\t\t\t\t\t\t'Specify the countries to appear at the top of the list'\n\t\t\t\t\t],\n\t\t\t\t\tseparateDialCode: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Display the country dial code next to the selected flag'\n\t\t\t\t\t],\n\t\t\t\t\tshowFlags: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Set this to false to hide the flags e.g. for political reasons'\n\t\t\t\t\t],\n\t\t\t\t\tutilsScript: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Enable formatting/validation etc. by specifying the URL of the included utils.js script (or alternatively just point it to the file on cdnjs.com)'\n\t\t\t\t\t]\n\t\t\t\t};\n\n\t\t\tcase 'RatingWidget':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ]\n\t\t\t\t};\n\n\t\t\tcase 'VisualEditor':\n\t\t\t\treturn {\n\t\t\t\t\tclasses: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The names of the CSS classes to apply to the element.'\n\t\t\t\t\t]\n\t\t\t\t\t// contentModel: [ 'string', 'Output (wikitext or html)' ],\n\t\t\t\t};\n\n\t\t\tcase 'OO.ui.SelectFileWidget':\n\t\t\t\treturn {\n\t\t\t\t\taccept: [ 'array', 'MIME types to accept.' ],\n\t\t\t\t\taccessKey: [ 'string', 'The access key' ],\n\t\t\t\t\t// button: [\n\t\t\t\t\t// \t'object',\n\t\t\t\t\t// \t'Config to pass to select file button.'\n\t\t\t\t\t// ],\n\t\t\t\t\t// @TODO uncomment ...\n\t\t\t\t\t// buttonOnly: [\n\t\t\t\t\t// \t'boolean',\n\t\t\t\t\t// \t'Show only the select file button, no info field. Requires showDropTarget to be false'\n\t\t\t\t\t// ],\n\t\t\t\t\tdir: [ 'string', 'The directionality of the input (ltr/rtl).' ],\n\t\t\t\t\tdisabled: [ 'boolean', 'Disable the widget.' ],\n\t\t\t\t\tdroppable: [ 'boolean', 'Whether to accept files by drag and drop' ],\n\t\t\t\t\ticon: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The symbolic name of the icon (e.g., ‘remove’ or ‘menu’), or a map of symbolic names.'\n\t\t\t\t\t],\n\t\t\t\t\tid: [ 'string', 'The HTML id attribute used in the rendered tag.' ],\n\t\t\t\t\tinputFilter: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'The name of an input filter function. Input filters modify the value of an input before it is accepted'\n\t\t\t\t\t],\n\t\t\t\t\tinputId: [ 'string', 'The value of the input’s HTML id attribute.' ],\n\t\t\t\t\t// multiple: [\n\t\t\t\t\t// \t'boolean',\n\t\t\t\t\t// \t'Allow multiple files to be selected'\n\t\t\t\t\t// ],\n\t\t\t\t\tinvisibleLabel: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether the label should be visually hidden (but still accessible to screen-readers).'\n\t\t\t\t\t],\n\t\t\t\t\tname: [ 'string', 'The value of the input’s HTML name attribute.' ],\n\t\t\t\t\tnotsupported: [\n\t\t\t\t\t\t'string',\n\t\t\t\t\t\t'Text to display when file support is missing in the browser.'\n\t\t\t\t\t],\n\t\t\t\t\tplaceholder: [ 'string', 'Placeholder text' ],\n\t\t\t\t\tshowDropTarget: [\n\t\t\t\t\t\t'boolean',\n\t\t\t\t\t\t'Whether to show a drop target. Requires droppable to be true.'\n\t\t\t\t\t],\n\t\t\t\t\ttext: [ 'string', 'Text to insert' ],\n\t\t\t\t\tthumbnailSizeLimit: [\n\t\t\t\t\t\t'number',\n\t\t\t\t\t\t'File size limit in MiB above which to not try and show a preview (for performance)'\n\t\t\t\t\t],\n\t\t\t\t\ttitle: [ 'string', 'The title text.' ]\n\t\t\t\t\t// value: [\"string\", \"The value of the input.\"],\n\t\t\t\t};\n\t\t}\n\t}\n\n\tfunction createToolbarB() {\n\t\tvar toolFactory = new OO.ui.ToolFactory();\n\t\tvar toolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\tvar toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\tactions: true\n\t\t} );\n\n\t\tvar onSelect = function () {\n\t\t\tvar toolName = this.getName();\n\n\t\t\tswitch ( toolName ) {\n\t\t\t\tcase 'addfield':\n\t\t\t\t\topenSearchDialog();\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.setActive( false );\n\t\t};\n\n\t\tvar toolGroup = [\n\t\t\t{\n\t\t\t\tname: 'addfield',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-inputconfig-addremoveoptions' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t}\n\t\t];\n\t\tVisualDataFunctions.createToolGroup( toolFactory, 'group', toolGroup );\n\n\t\ttoolbar.setup( [\n\t\t\t{\n\t\t\t\tname: 'my-group',\n\t\t\t\t// type: \"bar\",\n\t\t\t\t// label: \"Create property\",\n\t\t\t\tinclude: [ { group: 'group' } ]\n\t\t\t}\n\t\t] );\n\n\t\treturn toolbar;\n\t}\n\n\t// @see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/c2805c7e9e83e2f3a857451d46c80231d1658a0f/demos/classes/SearchWidgetDialog.js\n\tfunction ProcessDialogSearch( config ) {\n\t\tProcessDialogSearch.super.call( this, config );\n\t}\n\tOO.inheritClass( ProcessDialogSearch, OO.ui.ProcessDialog );\n\tProcessDialogSearch.static.name = DialogSearchName;\n\tProcessDialogSearch.static.title = mw.msg(\n\t\t'visualdata-jsmodule-inputconfig-selectfield'\n\t);\n\tProcessDialogSearch.prototype.initialize = function () {\n\t\tProcessDialogSearch.super.prototype.initialize.apply( this, arguments );\n\t\tvar self = this;\n\t\tthis.selectedItems = Object.keys( SelectedItems );\n\n\t\tvar obj = ( !CustomInputConfig ? getInputConfig( InputName ) :\n\t\t\tCustomInputConfig( InputName ) );\n\n\t\tfunction getItems( value ) {\n\t\t\tvar values = Object.keys( obj );\n\t\t\tif ( value ) {\n\t\t\t\tvar valueLowerCase = value.toLowerCase();\n\t\t\t\tvalues = values.filter(\n\t\t\t\t\t( x ) => x.toLowerCase().indexOf( valueLowerCase ) !== -1\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn values.map( ( x ) => {\n\t\t\t\tvar menuOptionWidget = new OO.ui.MenuOptionWidget( {\n\t\t\t\t\tdata: x,\n\t\t\t\t\tlabel: x,\n\t\t\t\t\tselected: inArray( x, self.selectedItems )\n\t\t\t\t} );\n\n\t\t\t\treturn menuOptionWidget;\n\t\t\t} );\n\t\t}\n\n\t\tvar searchWidget = new OO.ui.SearchWidget( {\n\t\t\t// id: 'visualdata-import-search-widget'\n\t\t} );\n\n\t\tsearchWidget.results.addItems( getItems() );\n\n\t\t// searchWidget.getResults() is a SelectWidget\n\t\t// https://doc.wikimedia.org/oojs-ui/master/js/#!/api/OO.ui.SelectWidget\n\t\tvar searchWidgetResults = searchWidget.getResults();\n\t\tsearchWidgetResults.multiselect = true;\n\n\t\t// this.searchWidgetResults = searchWidgetResults;\n\n\t\t// we don't rely anymore on searchWidgetResults.findSelectedItems()\n\t\t// to handle non-visible highlighted items\n\t\tsearchWidgetResults.on( 'press', function ( value ) {\n\t\t\tif ( value === null ) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif ( inArray( value.data, self.selectedItems ) ) {\n\t\t\t\tself.selectedItems.splice( self.selectedItems.indexOf( value.data ), 1 );\n\t\t\t} else {\n\t\t\t\tself.selectedItems.push( value.data );\n\t\t\t}\n\t\t} );\n\n\t\tsearchWidget.onQueryChange = function ( value ) {\n\t\t\tsearchWidget.results.clearItems();\n\t\t\tsearchWidget.results.addItems( getItems( value ) );\n\t\t};\n\n\t\tthis.$body.append( [ searchWidget.$element ] );\n\t};\n\n\tProcessDialogSearch.prototype.getBodyHeight = function () {\n\t\treturn 300;\n\t};\n\n\tProcessDialogSearch.static.actions = [\n\t\t{\n\t\t\taction: 'save',\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-done' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\t// modes: \"edit\",\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-cancel' ),\n\t\t\tflags: [ 'safe', 'close' ]\n\t\t}\n\t];\n\tProcessDialogSearch.prototype.getActionProcess = function ( action ) {\n\t\tvar dialog = this;\n\n\t\tif ( action === 'save' ) {\n\t\t\t// var items = dialog.searchWidgetResults.findSelectedItems();\n\t\t\t// var selectedItems = items.map( ( x ) => x.data );\n\n\t\t\t// remove unselected properties\n\t\t\tfor ( var key in SelectedItems ) {\n\t\t\t\tif ( !inArray( key, dialog.selectedItems ) ) {\n\t\t\t\t\tdelete SelectedItems[ key ];\n\t\t\t\t\tdelete Model[ key ];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// add new properties\n\t\t\tfor ( var key of dialog.selectedItems ) {\n\t\t\t\tif ( !( key in SelectedItems ) ) {\n\t\t\t\t\tSelectedItems[ key ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tpanelLayout.populateFieldset();\n\t\t}\n\n\t\treturn new OO.ui.Process( function () {\n\t\t\tdialog.close( { action: action } );\n\t\t} );\n\n\t\t// return ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t};\n\tProcessDialogSearch.prototype.getTeardownProcess = function ( data ) {\n\t\treturn ProcessDialogSearch.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( function () {\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\tfunction openSearchDialog() {\n\t\tprocessDialogSearch = new ProcessDialogSearch( {\n\t\t\tsize: 'medium',\n\t\t\tclasses: [ 'visualdata-search-dialog' ]\n\t\t\t// data: { label: label }\n\t\t} );\n\n\t\tWindowManager.newWindow( processDialogSearch );\n\t}\n\n\tfunction PanelLayout( config ) {\n\t\tPanelLayout.super.call( this, config );\n\n\t\t/*\n\t\tthis.messageWidget = new OO.ui.MessageWidget({\n\t\t\ttype: \"notice\",\n\t\t\tlabel: new OO.ui.HtmlSnippet(\n\t\t\t\tmw.msg(\"visualdata-jsmodule-visualdata-no-properties\")\n\t\t\t),\n\t\t});\n*/\n\n\t\tthis.fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: ''\n\t\t} );\n\n\t\tthis.populateFieldset();\n\n\t\tthis.$element.append( this.fieldset.$element );\n\t\t// this.$element.append(this.messageWidget.$element);\n\t}\n\n\tOO.inheritClass( PanelLayout, OO.ui.PanelLayout );\n\tPanelLayout.prototype.populateFieldset = function () {\n\t\tthis.fieldset.clearItems();\n\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tvar data = this.data;\n\t\tvar items = [];\n\t\tvar obj = ( !CustomInputConfig ? getInputConfig( InputName ) :\n\t\t\tCustomInputConfig( InputName ) );\n\n\t\tfor ( var i in obj ) {\n\t\t\tif ( !( i in SelectedItems ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar inputName;\n\t\t\tvar config = {};\n\t\t\tvar type = obj[ i ][ 0 ];\n\t\t\tswitch ( type ) {\n\t\t\t\tcase 'boolean':\n\t\t\t\t\tinputName = 'OO.ui.ToggleSwitchWidget';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'string':\n\t\t\t\t\tinputName = 'OO.ui.TextInputWidget';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'number':\n\t\t\t\tcase 'integer':\n\t\t\t\t\tinputName = 'OO.ui.NumberInputWidget';\n\t\t\t\t\tconfig.type = 'number';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'date':\n\t\t\t\t\tinputName = 'mw.widgets.DateInputWidget';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'array':\n\t\t\t\t\tinputName = 'OO.ui.TagMultiselectWidget';\n\t\t\t\t\tbreak;\n\n\t\t\t\t// not implemented\n\t\t\t\tcase 'object':\n\t\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( typeof SelectedItems[ i ] !== 'undefined' ) {\n\t\t\t\tconfig.value = SelectedItems[ i ];\n\t\t\t}\n\n\t\t\tvar inputWidget = VisualDataFunctions.inputInstanceFromName(\n\t\t\t\tinputName,\n\t\t\t\tconfig\n\t\t\t);\n\t\t\tModel[ i ] = { input: inputWidget, type: type };\n\n\t\t\titems.push(\n\t\t\t\tnew OO.ui.FieldLayout( inputWidget, {\n\t\t\t\t\tlabel: i,\n\t\t\t\t\talign: 'top',\n\t\t\t\t\thelp: new OO.ui.HtmlSnippet( obj[ i ][ 1 ] ),\n\t\t\t\t\thelpInline: true,\n\t\t\t\t\tclasses: []\n\t\t\t\t} )\n\t\t\t);\n\t\t}\n\n\t\titems = items.filter( function ( x ) {\n\t\t\treturn !( 'items' in x ) || x.items.length;\n\t\t} );\n\n\t\tthis.isEmpty = !items.length;\n\n\t\tthis.fieldset.addItems( items );\n\t};\n\n\t// eslint-disable-next-line no-unused-vars\n\tPanelLayout.prototype.addItem = function ( property ) {\n\t\tthis.populateFieldset();\n\t};\n\n\tfunction ProcessDialog( config ) {\n\t\tProcessDialog.super.call( this, config );\n\t}\n\tOO.inheritClass( ProcessDialog, OO.ui.ProcessDialog );\n\n\tProcessDialog.static.name = 'myDialog';\n\t// ProcessDialog.static.title = mw.msg(\n\t// \"visualdata-jsmodule-manageproperties-define-property\"\n\t// );\n\tProcessDialog.static.actions = [\n\t\t{\n\t\t\taction: 'save',\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-save' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-cancel' ),\n\t\t\tflags: [ 'safe', 'close' ]\n\t\t}\n\t];\n\n\tfunction createActionToolbar() {\n\t\t// see https://gerrit.wikimedia.org/r/plugins/gitiles/oojs/ui/+/refs/tags/v0.40.4/demos/pages/toolbars.js\n\t\tvar toolFactory = new OO.ui.ToolFactory();\n\t\tvar toolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\tvar toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\tactions: false\n\t\t} );\n\n\t\tvar onSelect = function () {\n\t\t\twindow.open( HelpUrl, '_blank' ).focus();\n\t\t\tthis.setActive( false );\n\t\t};\n\n\t\tvar toolGroup = [\n\t\t\t{\n\t\t\t\tname: 'help-button',\n\t\t\t\ticon: 'helpNotice',\n\t\t\t\t// title: mw.msg( 'visualdata-jsmodule-forms-toolbars-help-button' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t}\n\t\t];\n\n\t\t// @see https://www.mediawiki.org/wiki/OOUI/Toolbars\n\t\ttoolbar.setup( [\n\t\t\t{\n\t\t\t\ttype: 'bar',\n\t\t\t\tinclude: [ 'help-button' ]\n\t\t\t}\n\t\t] );\n\n\t\tVisualDataFunctions.createToolGroup(\n\t\t\ttoolFactory,\n\t\t\t'selectSwitch',\n\t\t\ttoolGroup\n\t\t);\n\n\t\treturn toolbar;\n\t}\n\n\tProcessDialog.prototype.initialize = function () {\n\t\tProcessDialog.super.prototype.initialize.apply( this, arguments );\n\t\tvar toolbar = createToolbarB();\n\n\t\tif ( HelpUrl ) {\n\t\t\tvar actionToolbar = createActionToolbar();\n\t\t\ttoolbar.$actions.append( actionToolbar.$element );\n\t\t}\n\n\t\tpanelLayout = new PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: true,\n\t\t\tclasses: [ 'visualdata-forms-fields-contentframe' ],\n\t\t\tdata: {}\n\t\t} );\n\n\t\tvar frameA = new OO.ui.PanelLayout( {\n\t\t\t$content: [ toolbar.$element, panelLayout.$element ],\n\t\t\texpanded: false,\n\t\t\t// framed: false,\n\t\t\tpadded: false,\n\t\t\tdata: { name: 'manageforms' }\n\t\t} );\n\n\t\tthis.$body.append( frameA.$element );\n\t};\n\n\tProcessDialog.prototype.getActionProcess = function ( action ) {\n\t\tvar dialog = this;\n\n\t\tswitch ( action ) {\n\t\t\tcase 'save':\n\t\t\t\tvar obj = {};\n\t\t\t\tfor ( var i in Model ) {\n\t\t\t\t\tobj[ i ] = VisualDataFunctions.castType(\n\t\t\t\t\t\tModel[ i ].input.getValue(),\n\t\t\t\t\t\tModel[ i ].type\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tCallback.setValue( obj );\n\t\t\t\treturn new OO.ui.Process( function () {\n\t\t\t\t\tdialog.close( { action: action } );\n\t\t\t\t} );\n\t\t}\n\n\t\treturn ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t};\n\n\tProcessDialog.prototype.getTeardownProcess = function ( data ) {\n\t\treturn ProcessDialog.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( function () {\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\t/**\n\t * Override getBodyHeight to create a tall dialog relative to the screen.\n\t *\n\t * @return {number} Body height\n\t */\n\tProcessDialog.prototype.getBodyHeight = function () {\n\t\t// see here https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs\n\t\t// this.page1.content.$element.outerHeight( true );\n\t\treturn window.innerHeight - 100;\n\t};\n\n\tfunction openDialog( callback, inputName, helpUrl, customInputConfig ) {\n\t\tModel = {};\n\t\tCallback = callback;\n\t\tSelectedItems = callback.getValue();\n\t\tHelpUrl = helpUrl;\n\n\t\t// @TODO update once a form key -> value is used\n\t\t// for the options widget of available inputs dropdown\n\t\tInputName = inputName.split( / / )[ 0 ];\n\t\tCustomInputConfig = customInputConfig;\n\n\t\tvar processDialog = new ProcessDialog( {\n\t\t\tsize: 'large'\n\t\t} );\n\n\t\tWindowManager.newWindow( processDialog, {\n\t\t\ttitle:\n\t\t\t\tmw.msg(\n\t\t\t\t\t// The following messages are used here:\n\t\t\t\t\t// * visualdata-jsmodule-manageproperties-define-property\n\t\t\t\t\t// * visualdata-jsmodule-manageproperties-define-property - [name]\n\t\t\t\t\t'visualdata-jsmodule-inputconfig-dialog-label'\n\t\t\t\t) + ( inputName ? ' - ' + inputName : '' )\n\t\t} );\n\t}\n\n\treturn {\n\t\topenDialog\n\t};\n};\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataProcessModel.js","messages":[{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":156,"column":11,"nodeType":"CallExpression","endLine":156,"endColumn":85}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'VisualDataProcessModel' is assigned a value but never used.","line":25,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":25,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":61,"column":7,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":61,"endColumn":58,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":74,"column":5,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":74,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":84,"column":3,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":84,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":92,"column":4,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":92,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"new-cap","severity":2,"message":"A constructor name should not start with a lowercase letter.","line":102,"column":26,"nodeType":"NewExpression","messageId":"lower","endLine":102,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":108,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":108,"endColumn":17,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[2897,2928],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":142,"column":15,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":142,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":149,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":149,"endColumn":18,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[4407,4430],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":183,"column":11,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":183,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":211,"column":10,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":211,"endColumn":74,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":270,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":270,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[7296,7327],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2023, https://wikisphere.org\n */\n\n/* eslint-disable no-unused-vars */\n/* eslint-disable no-underscore-dangle */\n\nconst VisualDataProcessModel = function (\n\tcallbackShowError,\n\tForm,\n\tSchemas,\n\tRecordedSchemas,\n\tModel,\n\tModelSchemas,\n\tmakeElementId\n) {\n\tvar Flatten;\n\tvar Action;\n\tvar Removed;\n\tvar Errors;\n\n\tfunction castType( value, model ) {\n\t\t// *** this is an hack to prevent\n\t\t// empty string, alternatively\n\t\t// use required native validation\n\t\t// or \"minLength\": 1\n\n\t\tif ( model.schema.wiki.required ) {\n\t\t\tswitch ( model.schema.type ) {\n\t\t\t\tcase 'number':\n\t\t\t\tcase 'string':\n\t\t\t\t\t// value can be undefined for OO.ui.SelectFileWidget\n\t\t\t\t\tif ( !value || ( typeof value === 'string' && value.trim() === '' ) ) {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn VisualDataFunctions.castType( value, model.schema.type );\n\t}\n\n\tasync function formatValue( path, model ) {\n\t\tvar path_ = ( Action === 'submit' ? path : model.path );\n\t\tvar value = 'getValue' in model.input ? model.input.getValue() : '';\n\n\t\tif ( VisualDataFunctions.isPromise( value ) ) {\n\t\t\tvalue = await value;\n\t\t}\n\n\t\tif ( 'validateFunc' in model.input ) {\n\t\t\tvar errorMsg = model.input.validateFunc();\n\t\t\tif ( VisualDataFunctions.isPromise( errorMsg ) ) {\n\t\t\t\terrorMsg = await errorMsg;\n\t\t\t}\n\t\t\tif ( typeof errorMsg === 'string' ) {\n\t\t\t\tErrors[ path_ ] = errorMsg;\n\t\t\t}\n\t\t}\n\n\t\tif ( Array.isArray( value ) ) {\n\t\t\tvalue = value.map( ( x ) => castType( x, model ) );\n\t\t} else {\n\t\t\tvalue = castType( value, model );\n\t\t}\n\n\t\tFlatten[ path_ ] = {\n\t\t\tpathNoIndex: model.pathNoIndex,\n\t\t\tvalue: value,\n\t\t\tmultiselect: model.multiselect,\n\t\t\tschema: model.schema\n\t\t};\n\n\t\tif ( model.isFile ) {\n\t\t\tFlatten[ path_ ].filekey = model.filekey;\n\t\t\t// Flatten[model.path].previousFilaneme = model.previousFilaneme;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tfunction validate( schemaName, data, schema ) {\n\t\tvar errors = Errors;\n\t\t// eslint-disable-next-line new-cap\n\t\tconst ajv = new window.ajv7( { strict: false, allErrors: true } );\n\t\tvar validateAjv;\n\t\ttry {\n\t\t\tvalidateAjv = ajv.compile( schema );\n\t\t} catch ( e ) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error( 'validate', e );\n\t\t\tcallbackShowError( schemaName, e.message );\n\n\t\t\t// @MAYBETODO\n\t\t\t// add: \"please report the issue in the talk page\n\t\t\t// of the extension\"\n\t\t\treturn false;\n\t\t}\n\t\tif ( validateAjv( data ) && !Object.keys( errors ).length ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tvar hiddenErrors = {};\n\t\tif ( 'errors' in validateAjv && Array.isArray( validateAjv.errors ) ) {\n\t\t\tvar AjvErrors = [];\n\n\t\t\t// pre-process errors\n\t\t\t// @see https://ajv.js.org/api.html\n\t\t\tfor ( var error of validateAjv.errors ) {\n\t\t\t\tswitch ( error.keyword ) {\n\t\t\t\t\tcase 'uniqueItems':\n\t\t\t\t\t\tif ( Removed.indexOf( `${ VisualDataFunctions.escapeJsonPtr( schemaName ) }${ error.instancePath }/${ error.params.j }` ) === -1 ) {\n\t\t\t\t\t\t\tAjvErrors.push( $.extend( VisualDataFunctions.deepCopy( error ), { instancePath: `${ error.instancePath }/${ error.params.i }` } ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( Removed.indexOf( `${ VisualDataFunctions.escapeJsonPtr( schemaName ) }${ error.instancePath }/${ error.params.i }` ) === -1 ) {\n\t\t\t\t\t\t\tAjvErrors.push( $.extend( VisualDataFunctions.deepCopy( error ), { instancePath: `${ error.instancePath }/${ error.params.j }` } ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tAjvErrors.push( error );\n\t\t\t\t}\n\t\t\t}\n\t\t\tloopA: for ( var error of AjvErrors ) {\n\t\t\t\tvar path = `${ VisualDataFunctions.escapeJsonPtr( schemaName ) }${ error.instancePath }`;\n\t\t\t\tfor ( var path_ of Removed ) {\n\t\t\t\t\tif ( path.indexOf( path_ ) === 0 ) {\n\t\t\t\t\t\tcontinue loopA;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error( error );\n\n\t\t\t\tif ( !( path in Flatten ) ) {\n\t\t\t\t\thiddenErrors[ path ] = `${ error.instancePath.slice( 1 ) } ${ error.message }`;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif ( !$( '#' + jQuery.escapeSelector( makeElementId( path ) ) ).is( ':visible' ) ) {\n\t\t\t\t\thiddenErrors[ path ] = `${ Flatten[ path ].schema.wiki.name } ${ error.message }`;\n\t\t\t\t}\n\n\t\t\t\terrors[ path ] = error.message;\n\t\t\t}\n\t\t}\n\n\t\tif ( !Object.keys( errors ).length && !Object.keys( hiddenErrors ).length ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tcallbackShowError( schemaName, null, errors, hiddenErrors );\n\t\treturn false;\n\t}\n\n\tasync function getValuesRec( path, model ) {\n\t\tswitch ( model.schema.type ) {\n\t\t\tcase 'array':\n\t\t\t\tvar items = [];\n\t\t\t\t// @TODO handle tuple\n\t\t\t\t// multiselect\n\t\t\t\tif ( 'schema' in model.items ) {\n\t\t\t\t\titems = await formatValue( path, model.items );\n\t\t\t\t} else {\n\t\t\t\t\tvar n = 0;\n\t\t\t\t\tfor ( var ii in model.items ) {\n\t\t\t\t\t\tvar path_ = `${ path }/${ n }`;\n\t\t\t\t\t\tif ( model.items[ ii ].removed ) {\n\t\t\t\t\t\t\tif ( Action !== 'validate' ) {\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tRemoved.push( path_ );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\titems.push( await getValuesRec( path_, model.items[ ii ] ) );\n\t\t\t\t\t\tn++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/* set to null only required items */\n\t\t\t\tfor ( var ii in items ) {\n\t\t\t\t\tif (\n\t\t\t\t\t\ttypeof items[ ii ] === 'string' &&\n\t\t\t\t\t\titems[ ii ].trim() === '' &&\n\t\t\t\t\t\t'minItems' in model.schema &&\n\t\t\t\t\t\tii <= model.schema.minItems\n\t\t\t\t\t) {\n\t\t\t\t\t\titems[ ii ] = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn items;\n\n\t\t\tcase 'object':\n\t\t\t\tvar items = {};\n\t\t\t\tfor ( var ii in model.properties ) {\n\t\t\t\t\tvar path_ = `${ path }/${ VisualDataFunctions.escapeJsonPtr( ii ) }`;\n\n\t\t\t\t\tif ( model.properties[ ii ].removed ) {\n\t\t\t\t\t\tif ( Action !== 'validate' ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tRemoved.push( path_ );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\titems[ ii ] = await getValuesRec( path_, model.properties[ ii ] );\n\t\t\t\t}\n\t\t\t\treturn items;\n\n\t\t\tdefault:\n\t\t\t\treturn await formatValue( path, model );\n\t\t}\n\t}\n\n\tasync function getFormModel() {\n\t\tvar ret = {};\n\t\tfor ( var i in Model ) {\n\t\t\tret[ i ] = Model[ i ].getValue();\n\n\t\t\tif ( VisualDataFunctions.isPromise( ret[ i ] ) ) {\n\t\t\t\tret[ i ] = await ret[ i ];\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t}\n\n\tasync function getModel( action, schemaName ) {\n\t\tAction = action;\n\t\tFlatten = {};\n\t\tRemoved = [];\n\t\tErrors = {};\n\n\t\tvar ret = {};\n\t\tswitch ( action ) {\n\t\t\tcase 'validate':\n\t\t\t\tcallbackShowError( null );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( var schemaName in ModelSchemas ) {\n\t\t\t\t\t\tif ( Form.schemas.indexOf( schemaName ) === -1 ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tret[ schemaName ] = await getValuesRec(\n\t\t\t\t\t\t\tVisualDataFunctions.escapeJsonPtr( schemaName ),\n\t\t\t\t\t\t\tModelSchemas[ schemaName ]\n\t\t\t\t\t\t);\n\t\t\t\t\t\t// removeNulls(ret);\n\n\t\t\t\t\t\tif ( !validate( schemaName, ret[ schemaName ], Schemas[ schemaName ] ) ) {\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch ( e ) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error( 'validate', e );\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn ret;\n\n\t\t\tcase 'fetch':\n\t\t\t\tfor ( var schemaName in ModelSchemas ) {\n\t\t\t\t\tret[ schemaName ] = await getValuesRec(\n\t\t\t\t\t\tVisualDataFunctions.escapeJsonPtr( schemaName ),\n\t\t\t\t\t\tModelSchemas[ schemaName ]\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn ret;\n\n\t\t\tcase 'submit':\n\t\t\t\tfor ( var schemaName in ModelSchemas ) {\n\t\t\t\t\tif ( Form.schemas.indexOf( schemaName ) === -1 ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tret[ schemaName ] = await getValuesRec(\n\t\t\t\t\t\tVisualDataFunctions.escapeJsonPtr( schemaName ),\n\t\t\t\t\t\tModelSchemas[ schemaName ]\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tvar formModel = await getFormModel();\n\n\t\t\t\treturn {\n\t\t\t\t\tdata: ret,\n\t\t\t\t\tflatten: Flatten,\n\t\t\t\t\tform: formModel,\n\t\t\t\t\tschemas: Form.schemas,\n\t\t\t\t\t// @FIXME or retrieve it server side\n\t\t\t\t\toptions: Form.options,\n\t\t\t\t\trecordedSchemas: RecordedSchemas\n\t\t\t\t};\n\n\t\t\tcase 'validate&submit':\n\t\t\t\tAction = 'validate';\n\n\t\t\t\tif ( !( await getModel( 'validate' ) ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tAction = 'submit';\n\t\t\t\treturn await getModel( 'submit' );\n\n\t\t\tcase 'delete':\n\t\t\t\tvar formModel = await getFormModel();\n\t\t\t\tForm.options.action = 'delete';\n\t\t\t\treturn {\n\t\t\t\t\tform: formModel,\n\t\t\t\t\toptions: Form.options,\n\t\t\t\t\tschemas: RecordedSchemas // Object.keys(ModelSchemas),\n\t\t\t\t};\n\n\t\t\tcase 'schema':\n\t\t\t\tif ( !( schemaName in ModelSchemas ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tvar ret = await getValuesRec(\n\t\t\t\t\tVisualDataFunctions.escapeJsonPtr( schemaName ),\n\t\t\t\t\tModelSchemas[ schemaName ]\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tdata: ret,\n\t\t\t\t\tflatten: Flatten\n\t\t\t\t};\n\t\t}\n\t}\n\n\treturn {\n\t\tgetModel\n\t};\n};\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataSchemas.js","messages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 103. Maximum allowed is 100.","line":325,"column":1,"nodeType":"Program","messageId":"max","endLine":325,"endColumn":95},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1493,"column":15,"nodeType":"CallExpression","endLine":1493,"endColumn":51},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1670,"column":4,"nodeType":"CallExpression","endLine":1670,"endColumn":27},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1673,"column":15,"nodeType":"CallExpression","endLine":1675,"endColumn":6},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1689,"column":4,"nodeType":"CallExpression","endLine":1689,"endColumn":27}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":26,"column":1,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":1732,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'VisualDataForms' is assigned a value but never used.","line":36,"column":6,"nodeType":"Identifier","messageId":"unusedVar","endLine":36,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":97,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":97,"endColumn":17,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[2431,2469],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"array-callback-return","severity":2,"message":"Array.prototype.every() expects a return value from function.","line":125,"column":27,"nodeType":"FunctionExpression","messageId":"expectedInside","endLine":125,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'tableLoop' is defined but never used.","line":125,"column":46,"nodeType":"Identifier","messageId":"unusedVar","endLine":125,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'rowLoop' is defined but never used.","line":125,"column":57,"nodeType":"Identifier","messageId":"unusedVar","endLine":125,"endColumn":64,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'meta' is defined but never used.","line":288,"column":47,"nodeType":"Identifier","messageId":"unusedVar","endLine":288,"endColumn":51,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'thisIsArray' is assigned a value but never used.","line":325,"column":37,"nodeType":"Identifier","messageId":"unusedVar","endLine":325,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":443,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":443,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":485,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":485,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-alert","severity":2,"message":"Unexpected confirm.","line":554,"column":6,"nodeType":"CallExpression","messageId":"unexpected","endLine":554,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-fallthrough","severity":1,"message":"Expected a 'break' statement before 'case'.","line":634,"column":6,"nodeType":"SwitchCase","messageId":"case","endLine":710,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":699,"column":10,"nodeType":"MemberExpression","messageId":"unexpected","endLine":699,"endColumn":23,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[18892,18939],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unreachable","severity":2,"message":"Unreachable code.","line":715,"column":3,"nodeType":"ReturnStatement","messageId":"unreachableCode","endLine":715,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":787,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":787,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-alert","severity":2,"message":"Unexpected confirm.","line":877,"column":6,"nodeType":"CallExpression","messageId":"unexpected","endLine":877,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":879,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":879,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'target_'.","line":971,"column":9,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":973,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1084,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1084,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1085,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1085,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1086,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1086,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1087,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1087,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1091,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1091,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1092,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1092,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1093,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1093,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1094,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1094,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1309,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1309,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1317,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1317,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1469,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1469,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1470,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1470,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1471,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1471,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1472,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1472,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1473,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1473,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1474,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1474,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":5,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright ©2023, https://wikisphere.org\n */\n\n/* eslint-disable no-tabs */\n/* eslint-disable no-underscore-dangle */\n\n// eslint-disable-next-line no-implicit-globals\nVisualDataSchemas = ( function () {\n\tvar Models = [];\n\tvar SelectedItems = [];\n\tvar DataTable;\n\tvar DialogName = 'dialogSchemas';\n\tvar Config;\n\tvar WindowManager;\n\tvar Schemas = [];\n\n\t/* eslint-disable-next-line no-unused-vars */\n\tvar VisualDataForms;\n\tvar VisualDataFormFieldInst;\n\tvar VisualDataContentBlockInst;\n\tvar VisualDataGeolocationInst;\n\n\tfunction getModel() {\n\t\treturn Models[ Models.length - 1 ];\n\t}\n\n\tfunction getWidgetValue( obj ) {\n\t\tvar ret = '';\n\t\tif ( 'getValue' in obj ) {\n\t\t\tret = obj.getValue();\n\t\t\tif ( typeof ret === 'string' ) {\n\t\t\t\treturn ret.trim();\n\t\t\t} else if ( Array.isArray( ret ) ) {\n\t\t\t\treturn ret.map( ( x ) => x.trim() );\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t\treturn Object.keys( obj )\n\t\t\t.map( ( i ) => {\n\t\t\t\treturn obj[ i ];\n\t\t\t} )\n\t\t\t.map( ( x ) => x.getValue() );\n\t}\n\n\tfunction getPropertyValue( property, propName, self ) {\n\t\tif ( !self ) {\n\t\t\tvar self = VisualDataSchemas;\n\t\t}\n\t\tvar model = self.getModel();\n\n\t\tif ( propName ) {\n\t\t\tmodel = model[ propName ];\n\t\t}\n\t\tif ( property in model ) {\n\t\t\treturn getWidgetValue( model[ property ] );\n\t\t}\n\n\t\tvar currentItem = self.getCurrentItem();\n\n\t\tif ( !currentItem ) {\n\t\t\treturn '';\n\t\t}\n\n\t\t// new item\n\t\tif ( propName && currentItem.type !== 'array' ) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (\n\t\t\t!propName &&\n\t\t\tcurrentItem.type === 'array' &&\n\t\t\tVisualDataFunctions.isObject( currentItem.items )\n\t\t) {\n\t\t\tcurrentItem = currentItem.items;\n\t\t}\n\n\t\tif ( !( 'wiki' in currentItem ) ) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.error( 'missing \"wiki\" key' );\n\t\t\treturn '';\n\t\t}\n\n\t\tif ( property in currentItem.wiki ) {\n\t\t\treturn currentItem.wiki[ property ];\n\t\t}\n\t\treturn '';\n\t}\n\n\tfunction getDatatableId( panel ) {\n\t\treturn `visualdata-schemas-datatable-dialog-${ SelectedItems.length }-${ panel }`;\n\t}\n\n\tfunction getCurrentItem() {\n\t\tif ( !SelectedItems.length ) {\n\t\t\treturn null;\n\t\t}\n\t\treturn SelectedItems[ SelectedItems.length - 1 ];\n\t}\n\n\tfunction orderFields( fields, panel ) {\n\t\tif ( !$.fn.DataTable.isDataTable( '#' + getDatatableId( panel ) ) ) {\n\t\t\treturn fields;\n\t\t}\n\t\tvar datatable = $( '#' + getDatatableId( panel ) ).DataTable();\n\t\tvar ret = {};\n\t\t// eslint-disable-next-line no-unused-vars, array-callback-return\n\t\tdatatable.rows().every( function ( rowIdx, tableLoop, rowLoop ) {\n\t\t\tvar key = Object.keys( fields )[ rowIdx ];\n\t\t\tif ( key in fields ) {\n\t\t\t\tret[ key ] = fields[ key ];\n\t\t\t}\n\t\t} );\n\t\tvar newItems = {};\n\t\tfor ( var i in fields ) {\n\t\t\tif ( !( i in ret ) ) {\n\t\t\t\tnewItems[ i ] = fields[ i ];\n\t\t\t}\n\t\t\tdelete fields[ i ];\n\t\t}\n\t\tfor ( var i in ret ) {\n\t\t\tfields[ i ] = ret[ i ];\n\t\t}\n\t\tfor ( var i in newItems ) {\n\t\t\tfields[ i ] = newItems[ i ];\n\t\t}\n\t}\n\n\tfunction initializeNestedDataTable( panel ) {\n\t\tvar currentItem = getCurrentItem();\n\n\t\t// array items can share the same schema for\n\t\t// all items, or to contain a tuple (to be an\n\t\t// array of items of fixed length)\n\t\t// in the first case, we consider the schema\n\t\t// being the child schema,\n\t\t// in the second case being the parent schema\n\t\t// (in the first case, we will provide an\n\t\t// editable panel with the properties of the\n\t\t// parent schema)\n\t\tif (\n\t\t\tcurrentItem.type === 'array' &&\n\t\t\tVisualDataFunctions.isObject( currentItem.items )\n\t\t) {\n\t\t\tcurrentItem = currentItem.items;\n\t\t}\n\n\t\torderFields( currentItem[ panel ], panel );\n\n\t\tVisualDataFunctions.destroyDataTable( getDatatableId( panel ) );\n\n\t\tfunction getType( thisItem ) {\n\t\t\tvar ret;\n\t\t\tswitch ( thisItem.wiki.type ) {\n\t\t\t\tcase 'schema':\n\t\t\t\t\tret = mw.msg( 'visualdata-jsmodule-schemas-subitem' );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'property':\n\t\t\t\t\tret =\n\t\t\t\t\t\t'SMW-property' in thisItem ?\n\t\t\t\t\t\t\tthisItem[ 'SMW-property' ] :\n\t\t\t\t\t\t\tthisItem.wiki[ 'jsonSchema-type' ] +\n\t\t\t\t\t\t\t( thisItem.wiki[ 'jsonSchema-type' ] !== 'string' ?\n\t\t\t\t\t\t\t\t'' :\n\t\t\t\t\t\t\t\t' (' + thisItem.wiki[ 'jsonSchema-format' ] + ')' );\n\n\t\t\t\t\tif ( !( 'preferred-input' in thisItem.wiki ) ) {\n\t\t\t\t\t\tthisItem.wiki[ 'preferred-input' ] =\n\t\t\t\t\t\t\tVisualDataFunctions.getPreferredInput( thisItem.wiki );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'content-block':\n\t\t\t\t\tret = mw.msg( 'visualdata-jsmodule-schemas-content-block' );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'geolocation':\n\t\t\t\t\tret = mw.msg( 'visualdata-jsmodule-schemas-geolocation' );\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\n\t\t// this returns a modified item, the object schema\n\t\t// or the array schema \"subject\" in case of\n\t\t// array, with name of parent schema\n\t\tfunction getItem( thisItem ) {\n\t\t\tvar thisItem = VisualDataFunctions.deepCopy( thisItem );\n\t\t\tif ( !( 'wiki' in thisItem ) ) {\n\t\t\t\tthisItem.wiki = { name: '' };\n\t\t\t}\n\n\t\t\t// handle from property panel\n\t\t\t// @TODO handle tuple\n\t\t\tif (\n\t\t\t\tthisItem.type === 'array' &&\n\t\t\t\tVisualDataFunctions.isObject( thisItem.items ) &&\n\t\t\t\tthisItem.items.type !== 'array'\n\t\t\t) {\n\t\t\t\tvar ret = thisItem.items;\n\t\t\t\tret.wiki.name = thisItem.wiki.name;\n\t\t\t\treturn { item: ret, isArray: true };\n\t\t\t}\n\t\t\treturn { item: thisItem, isArray: false };\n\t\t}\n\n\t\tvar n = 0;\n\t\tvar data = [];\n\t\tvar propName = panel;\n\n\t\tfor ( var i in currentItem[ propName ] ) {\n\t\t\tvar { item, isArray } = getItem( currentItem[ propName ][ i ] );\n\t\t\tvar required = '';\n\t\t\t// var input = '';\n\t\t\tvar multiple = '';\n\t\t\tif ( item.wiki.type === 'property' ) {\n\t\t\t\t// input = item.wiki[ 'preferred-input' ];\n\t\t\t\trequired = item.wiki.required ?\n\t\t\t\t\tmw.msg( 'visualdata-jsmodule-formfield-required' ) :\n\t\t\t\t\tmw.msg( 'visualdata-jsmodule-formfield-not-required' );\n\t\t\t} else {\n\t\t\t\trequired = mw.msg( 'visualdata-jsmodule-formfield-n/a' );\n\t\t\t\t// input = mw.msg( 'visualdata-jsmodule-formfield-n/a' );\n\t\t\t}\n\t\t\tif ( isArray ) {\n\t\t\t\tmultiple = mw.msg( 'visualdata-jsmodule-schemas-multiple' );\n\t\t\t}\n\t\t\tvar type = getType( item );\n\t\t\tdata.push( [\n\t\t\t\tn,\n\t\t\t\titem.wiki.name,\n\t\t\t\ttype,\n\t\t\t\t// input\n\t\t\t\tmultiple,\n\t\t\t\trequired,\n\t\t\t\t''\n\t\t\t] );\n\n\t\t\tn++;\n\t\t}\n\n\t\tif ( !data.length ) {\n\t\t\treturn;\n\t\t}\n\n\t\t$( '#' + getDatatableId( panel ) ).DataTable( {\n\t\t\t// order: 1,\n\t\t\t// pageLength: 20,\n\t\t\t// https://datatables.net/reference/option/dom\n\t\t\tdom: '<\"visualdata-datatable-left\"f><\"visualdata-datatable-right\"l>rtip',\n\n\t\t\t// @ATTENTION! this conflicts with \"rowReorder\"\n\t\t\t// use instead an hidden column and set orderable to false\n\t\t\t// for all visible columns\n\t\t\t// ordering: false,\n\n\t\t\tiDisplayLength: 100,\n\t\t\tsearching: false,\n\t\t\tpaging: false,\n\t\t\tinfo: false,\n\t\t\trowReorder: {\n\t\t\t\t// update: false,\n\t\t\t\t// dataSrc: 0,\n\t\t\t\tselector: 'td:not(:last-child)'\n\t\t\t},\n\t\t\tscrollX: true,\n\t\t\tcolumnDefs: [\n\t\t\t\t{ targets: 0, orderable: true, visible: false },\n\t\t\t\t{ orderable: false, targets: '_all' },\n\t\t\t\t{\n\t\t\t\t\ttargets: 5,\n\t\t\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\t\t\trender: function ( data_, thisType, row, meta ) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t'<span class=\"buttons-wrapper\" style=\"white-space:nowrap\" data-row=\"' +\n\t\t\t\t\t\t\trow[ 0 ] +\n\t\t\t\t\t\t\t'\"></span>'\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t],\n\n\t\t\t// lengthMenu: [ 10, 20, 50, 100, 200 ],\n\t\t\t// lengthChange: false,\n\t\t\tdata: data,\n\t\t\t// stateSave: true,\n\t\t\tcolumns: [ '' ].concat(\n\t\t\t\tmw.msg( 'visualdata-jsmodule-schemas-properties-columns' )\n\t\t\t\t\t.split( /\\s*,\\s*/ )\n\t\t\t\t\t.map( function ( x ) {\n\t\t\t\t\t\treturn { title: x };\n\t\t\t\t\t} )\n\t\t\t)\n\t\t} );\n\n\t\t$( '#' + getDatatableId( panel ) + ' .buttons-wrapper' ).each( function () {\n\t\t\tvar buttonWidgetEdit = new OO.ui.ButtonWidget( {\n\t\t\t\ticon: 'edit'\n\t\t\t\t// flags: [\"progressive\"],\n\t\t\t} );\n\n\t\t\tvar row = $( this ).data().row;\n\t\t\tvar key = Object.keys( currentItem[ propName ] )[ row ];\n\n\t\t\t// this is the modified item, the object schema\n\t\t\t// or the array schema \"subject\" in case of\n\t\t\t// array, with name of parent schema\n\n\t\t\t// eslint-disable-next-line no-unused-vars\n\t\t\tconst { item: thisItem, isArray: thisIsArray } = getItem( currentItem[ propName ][ key ] );\n\n\t\t\tif ( !( 'type' in thisItem.wiki ) ) {\n\t\t\t\tthisItem.wiki.type = 'property';\n\t\t\t}\n\n\t\t\tvar targetItem =\n\t\t\t\tcurrentItem.type !== 'array' ?\n\t\t\t\t\tcurrentItem[ propName ] :\n\t\t\t\t\tcurrentItem.items[ propName ];\n\n\t\t\tvar callback = function () {\n\t\t\t\tinitializeNestedDataTable( panel );\n\t\t\t};\n\n\t\t\tbuttonWidgetEdit.on( 'click', function () {\n\t\t\t\t// switch by subschema type (if array)\n\t\t\t\tswitch ( thisItem.wiki.type ) {\n\t\t\t\t\tcase 'property':\n\t\t\t\t\t\tVisualDataFormFieldInst.openDialog( callback, targetItem, key );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'content-block':\n\t\t\t\t\t\tVisualDataContentBlockInst.openDialog(\n\t\t\t\t\t\t\tcallback,\n\t\t\t\t\t\t\ttargetItem,\n\t\t\t\t\t\t\tkey\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'geolocation':\n\t\t\t\t\t\tVisualDataGeolocationInst.openDialog(\n\t\t\t\t\t\t\tcallback,\n\t\t\t\t\t\t\ttargetItem,\n\t\t\t\t\t\t\tkey\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'schema':\n\t\t\t\t\t\t// pass the child schema, we don't pass the target\n\t\t\t\t\t\t// item since the dialog must handle the parent schema\n\t\t\t\t\t\t// as well (in case of array)\n\t\t\t\t\t\topenDialog( currentItem[ propName ][ key ], propName );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tvar buttonWidgetDelete = new OO.ui.ButtonWidget( {\n\t\t\t\ticon: 'close',\n\t\t\t\tflags: [ 'destructive' ]\n\t\t\t} );\n\n\t\t\tbuttonWidgetDelete.on( 'click', function () {\n\t\t\t\tVisualDataFunctions.OOUIAlert(\n\t\t\t\t\tnew OO.ui.HtmlSnippet(\n\t\t\t\t\t\tmw.msg( 'visualdata-jsmodule-schemas-delete-confirm' )\n\t\t\t\t\t),\n\t\t\t\t\t{ size: 'medium' },\n\t\t\t\t\tfunction () {\n\t\t\t\t\t\tdelete currentItem[ propName ][ key ];\n\t\t\t\t\t\t// *** or delete the row manually\n\t\t\t\t\t\tinitializeNestedDataTable( panel );\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t} );\n\t\t\t$( this ).append( [ buttonWidgetEdit.$element, buttonWidgetDelete.$element ] );\n\t\t} );\n\n\t\t// DataTables[DataTables.length - 1].draw();\n\t}\n\n\tfunction PageTwoLayout( name, config ) {\n\t\tPageTwoLayout.super.call( this, name, config );\n\n\t\tthis.name = name;\n\n\t\tvar toolbar = createToolbarB( name );\n\n\t\tvar contentFrame = new OO.ui.PanelLayout( {\n\t\t\t$content: $(\n\t\t\t\t// display\n\t\t\t\t'<table id=\"' +\n\t\t\t\t\tgetDatatableId( name ) +\n\t\t\t\t\t'\" class=\"visualdata-datatable\" width=\"100%\"></table>'\n\t\t\t), // this.fieldset.$element,\n\t\t\texpanded: false,\n\t\t\tpadded: false,\n\t\t\tclasses: [ 'visualdata-schemas-properties-contentframe' ]\n\t\t} );\n\n\t\tvar frameA = new OO.ui.PanelLayout( {\n\t\t\t$content: [ toolbar.$element, contentFrame.$element ],\n\t\t\texpanded: false,\n\t\t\t// framed: false,\n\t\t\tpadded: false,\n\t\t\tdata: { name: 'manage-schemas' }\n\t\t} );\n\n\t\tthis.$element.append( frameA.$element );\n\t}\n\n\tOO.inheritClass( PageTwoLayout, OO.ui.PageLayout );\n\tPageTwoLayout.prototype.setupOutlineItem = function () {\n\t\tthis.outlineItem.setLabel(\n\t\t\t// Messages that can be used here:\n\t\t\t// * visualdata-jsmodule-schemas-panel-properties\n\t\t\t// * visualdata-jsmodule-schemas-panel-oneOf\n\t\t\tmw.msg( 'visualdata-jsmodule-schemas-panel-' + this.name )\n\t\t);\n\t};\n\n\tfunction ProcessDialog( config ) {\n\t\tProcessDialog.super.call( this, config );\n\t}\n\tOO.inheritClass( ProcessDialog, OO.ui.ProcessDialog );\n\n\tProcessDialog.static.name = DialogName;\n\t// ProcessDialog.static.title = mw.msg(\n\t// \t\"visualdata-jsmodule-forms-defineform\"\n\t// );\n\tProcessDialog.static.actions = [\n\t\t{\n\t\t\taction: 'delete',\n\t\t\tmodes: 'main',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-delete' ),\n\t\t\tflags: 'destructive'\n\t\t},\n\t\t{\n\t\t\taction: 'save',\n\t\t\tmodes: [ 'main', 'properties' ],\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-save' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\tmodes: [ 'main', 'properties' ],\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-cancel' ),\n\t\t\tflags: [ 'safe', 'close' ]\n\t\t}\n\t];\n\n\tfunction DialogContent() {\n\t\tvar page1 = new PageOneLayout( 'main', {} );\n\n\t\tvar page2 = new PageTwoLayout( 'properties', {\n\t\t\tclasses: [ 'visualdata-schemas-panel-properties' ]\n\t\t} );\n\n\t\t// *** the following requires more brainstorming\n\t\t// specifically, anyOf and oneOf are expected to\n\t\t// be objects, not properties in the same schema\n\t\t// so addField should be disabled in this case\n\t\t// or should inherit the current schema ...\n\t\t/*\n\t\tthis.page3 = new PageTwoLayout(\"anyOf\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\tthis.page4 = new PageTwoLayout(\"oneOf\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\t// this.page5 = new PageTwoLayout(\"prefixItems\", {\n\t\t// \tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t// });\n\t\tthis.page5 = new PageTwoLayout(\"allOf\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\tthis.page6 = new PageTwoLayout(\"additionalProperties\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\t*/\n\n\t\tvar booklet = new OO.ui.BookletLayout( {\n\t\t\toutlined: true,\n\t\t\texpanded: true,\n\t\t\tpadded: false\n\t\t} );\n\n\t\tbooklet.addPages( [\n\t\t\tpage1,\n\t\t\tpage2\n\t\t\t// this.page3,\n\t\t\t// this.page4,\n\t\t\t// this.page5,\n\t\t\t// this.page6,\n\t\t] );\n\n\t\treturn booklet;\n\t}\n\n\tProcessDialog.prototype.getSetupProcess = function ( data ) {\n\t\tvar initPropertiesTab = function ( tabName ) {\n\t\t\tif (\n\t\t\t\ttabName !== 'page1' &&\n\t\t\t\t!$.fn.DataTable.isDataTable( '#' + getDatatableId( tabName ) )\n\t\t\t) {\n\t\t\t\t// $('#visualdata-forms-datatable-dialog').DataTable().clear().draw();\n\t\t\t\tinitializeNestedDataTable( tabName );\n\t\t\t}\n\t\t};\n\n\t\treturn ProcessDialog.super.prototype.getSetupProcess.call( this, data )\n\t\t\t.next( function () {\n\t\t\t\tthis.actions.setMode( data.initialTab );\n\t\t\t\tvar booklet = DialogContent();\n\t\t\t\tthis.$body.append( booklet.$element );\n\t\t\t\tbooklet.setPage( data.initialTab );\n\n\t\t\t\tbooklet.on( 'set', function ( value ) {\n\t\t\t\t\tinitPropertiesTab( value.name );\n\t\t\t\t} );\n\n\t\t\t\tsetTimeout( function () {\n\t\t\t\t\tinitPropertiesTab( data.initialTab );\n\t\t\t\t\tVisualDataFunctions.removeNbspFromLayoutHeader(\n\t\t\t\t\t\t'#visualdata-ProcessDialogEditData'\n\t\t\t\t\t);\n\t\t\t\t}, 30 );\n\n\t\t\t}, this );\n\t};\n\n\tProcessDialog.prototype.initialize = function () {\n\t\tProcessDialog.super.prototype.initialize.apply( this, arguments );\n\t};\n\n\tProcessDialog.prototype.getActionProcess = function ( action ) {\n\t\tif (\n\t\t\t!action ||\n\t\t\t( action === 'delete' &&\n\t\t\t\t// eslint-disable-next-line no-alert\n\t\t\t\t!confirm( mw.msg( 'visualdata-jsmodule-schemas-delete-schema-confirm' ) ) )\n\t\t) {\n\t\t\treturn ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t\t}\n\n\t\tvar currentItem = getCurrentItem();\n\n\t\tvar payload = {\n\t\t\taction: 'visualdata-save-schema',\n\t\t\t'dialog-action': action,\n\t\t\t'previous-label': currentItem.wiki.name,\n\t\t\t'source-page': mw.config.get( 'wgPageName' ),\n\t\t\tformat: 'json',\n\t\t\tschema: {}\n\t\t};\n\t\t// https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs#Action_sets\n\t\treturn ProcessDialog.super.prototype.getActionProcess\n\t\t\t.call( this, action )\n\t\t\t.next( function () {\n\t\t\t\tswitch ( action ) {\n\t\t\t\t\tcase 'save':\n\t\t\t\t\t\tvar obj = { type: 'schema' };\n\t\t\t\t\t\tvar model = Models[ 0 ];\n\n\t\t\t\t\t\t// var propName = currentItem.type === 'array' ? 'items': 'properties'\n\n\t\t\t\t\t\tfor ( var i in model ) {\n\t\t\t\t\t\t\tobj[ i ] = getPropertyValue( i );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// @TODO sanitize label\n\n\t\t\t\t\t\tvar alert = null;\n\t\t\t\t\t\tif ( obj.name === '' ) {\n\t\t\t\t\t\t\talert = mw.msg( 'visualdata-jsmodule-schemas-alert-noname' );\n\t\t\t\t\t\t} else if ( currentItem.wiki.name === '' && obj.name in Schemas ) {\n\t\t\t\t\t\t\talert = mw.msg(\n\t\t\t\t\t\t\t\t'visualdata-jsmodule-schemas-alert-existing-schema'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t!Object.keys( currentItem.properties ).length\n\t\t\t\t\t\t\t//  && !Object.keys(currentItem.allOf).length &&\n\t\t\t\t\t\t\t// !Object.keys(currentItem.anyOf).length &&\n\t\t\t\t\t\t\t// !Object.keys(currentItem.oneOf).length\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\talert = mw.msg(\n\t\t\t\t\t\t\t\t'visualdata-jsmodule-schemas-alert-no-properties'\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( alert ) {\n\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( alert ), {\n\t\t\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\treturn ProcessDialog.super.prototype.getActionProcess.call(\n\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\taction\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdelete obj.parentSchema;\n\t\t\t\t\t\tpayload.schema.wiki = obj;\n\t\t\t\t\t\tpayload.schema.type = 'object';\n\n\t\t\t\t\t\tfor ( var panel of [\n\t\t\t\t\t\t\t'properties'\n\t\t\t\t\t\t\t// \"anyOf\",\n\t\t\t\t\t\t\t// \"oneOf\",\n\t\t\t\t\t\t\t// \"additionalProperties\",\n\t\t\t\t\t\t] ) {\n\t\t\t\t\t\t\tif ( Object.keys( currentItem[ panel ] ).length ) {\n\t\t\t\t\t\t\t\tpayload.schema[ panel ] = currentItem[ panel ];\n\t\t\t\t\t\t\t\torderFields( payload.schema[ panel ], panel );\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdelete payload.schema[ panel ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// eslint-disable-next-line no-fallthrough\n\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t// console.log(\"payload\", JSON.parse(JSON.stringify(payload)));\n\t\t\t\t\t\tpayload.schema = JSON.stringify( payload.schema );\n\n\t\t\t\t\t\t// return;\n\t\t\t\t\t\tvar callApi = function ( postData, resolve, reject ) {\n\t\t\t\t\t\t\tnew mw.Api()\n\t\t\t\t\t\t\t\t.postWithToken( 'csrf', postData )\n\t\t\t\t\t\t\t\t.done( function ( res ) {\n\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t\tif ( payload.action in res ) {\n\t\t\t\t\t\t\t\t\t\tvar data = res[ payload.action ];\n\t\t\t\t\t\t\t\t\t\tif ( 'schemas' in data ) {\n\t\t\t\t\t\t\t\t\t\t\tdata.schemas = JSON.parse( data.schemas );\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tif ( data[ 'result-action' ] === 'error' ) {\n\t\t\t\t\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert(\n\t\t\t\t\t\t\t\t\t\t\t\tnew OO.ui.HtmlSnippet( data.error ),\n\t\t\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tif ( 'jobs-count-warning' in data ) {\n\t\t\t\t\t\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert(\n\t\t\t\t\t\t\t\t\t\t\t\t\tmw.msg(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t'visualdata-jsmodule-create-jobs-alert',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tparseInt( data[ 'jobs-count-warning' ] )\n\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t{ size: 'medium' },\n\t\t\t\t\t\t\t\t\t\t\t\t\tcallApi,\n\t\t\t\t\t\t\t\t\t\t\t\t\t[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t$.extend( postData, {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'confirm-job-execution': true\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t} ),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tresolve,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treject\n\t\t\t\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\tif ( parseInt( data[ 'jobs-count' ] ) ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmw.msg(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t'visualdata-jsmodule-created-jobs',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tparseInt( data[ 'jobs-count' ] )\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{ size: 'medium' }\n\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tSchemas = VisualData.updateSchemas( data, data[ 'result-action' ] );\n\t\t\t\t\t\t\t\t\t\t\t\t// initialize();\n\t\t\t\t\t\t\t\t\t\t\t\tModels.pop();\n\t\t\t\t\t\t\t\t\t\t\t\tSelectedItems.pop();\n\t\t\t\t\t\t\t\t\t\t\t\tWindowManager.closeActiveWindow();\n\t\t\t\t\t\t\t\t\t\t\t\tinitializeDataTable();\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert( 'unknown error', {\n\t\t\t\t\t\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t\t.fail( function ( res ) {\n\t\t\t\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\t\t\t\tconsole.error( 'visualdata-save-schema', res );\n\t\t\t\t\t\t\t\t\treject( res );\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\t\t\t\t\tmw.loader.using( 'mediawiki.api', function () {\n\t\t\t\t\t\t\t\tcallApi( payload, resolve, reject );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} ).catch( ( err ) => {\n\t\t\t\t\t\t\tVisualDataFunctions.OOUIAlert( `error: ${ err }`, { size: 'medium' } );\n\t\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t} ); // .next\n\n\t\t// eslint-disable-next-line no-unreachable\n\t\treturn ProcessDialog.super.prototype.getActionProcess.call( this, action );\n\t};\n\n\tProcessDialog.prototype.getTeardownProcess = function ( data ) {\n\t\treturn ProcessDialog.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( function () {\n\t\t\t\tModels.pop();\n\t\t\t\tSelectedItems.pop();\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\t/**\n\t * Override getBodyHeight to create a tall dialog relative to the screen.\n\t *\n\t * @return {number} Body height\n\t */\n\tProcessDialog.prototype.getBodyHeight = function () {\n\t\t// see here https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs\n\t\t// this.page1.content.$element.outerHeight( true );\n\t\treturn window.innerHeight - 100;\n\t};\n\n\tfunction ProcessDialogNested( config ) {\n\t\tProcessDialogNested.super.call( this, config );\n\n\t\tthis.data = config.data;\n\t}\n\tOO.inheritClass( ProcessDialogNested, OO.ui.ProcessDialog );\n\n\tProcessDialogNested.static.name = DialogName;\n\n\tProcessDialogNested.static.actions = [\n\t\t/*\n\t\t{\n\t\t\taction: 'delete',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-manageproperties-delete' ),\n\t\t\tflags: 'destructive'\n\t\t},\n\t\t*/\n\t\t{\n\t\t\taction: 'save',\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-save' ),\n\t\t\tflags: [ 'primary', 'progressive' ]\n\t\t},\n\t\t{\n\t\t\tmodes: 'edit',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-dialog-cancel' ),\n\t\t\tflags: [ 'safe', 'close' ]\n\t\t}\n\t];\n\n\tProcessDialogNested.prototype.initialize = function () {\n\t\tProcessDialogNested.super.prototype.initialize.apply( this, arguments );\n\t\tthis.page1 = new PageOneLayoutNested( 'page1', {} );\n\t\tthis.page2 = new PageTwoLayout( 'properties', {\n\t\t\tclasses: [ 'visualdata-schemas-panel-properties' ]\n\t\t} );\n\t\t/*\n\t\tthis.page3 = new PageTwoLayout(\"anyOf\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\tthis.page4 = new PageTwoLayout(\"oneOf\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\n\t\tthis.page5 = new PageTwoLayout(\"allOf\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\t// this.page5 = new PageTwoLayout(\"prefixItems\", {\n\t\t// \tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t// });\n\t\tthis.page6 = new PageTwoLayout(\"additionalProperties\", {\n\t\t\tclasses: [\"visualdata-schemas-panel-properties\"],\n\t\t});\n\t\t*/\n\n\t\tvar booklet = new OO.ui.BookletLayout( {\n\t\t\toutlined: true,\n\t\t\texpanded: true,\n\t\t\tpadded: false\n\t\t} );\n\n\t\tbooklet.addPages( [\n\t\t\tthis.page1,\n\t\t\tthis.page2\n\t\t\t// this.page3,\n\t\t\t// this.page4,\n\t\t\t// this.page5,\n\t\t\t// this.page6,\n\t\t] );\n\t\tbooklet.setPage( 'page1' );\n\n\t\tbooklet.on( 'set', function ( value ) {\n\t\t\tif (\n\t\t\t\tvalue.name !== 'page1' &&\n\t\t\t\t!$.fn.DataTable.isDataTable( '#' + getDatatableId( value.name ) )\n\t\t\t) {\n\t\t\t\t// $('#visualdata-forms-datatable-dialog').DataTable().clear().draw();\n\t\t\t\tinitializeNestedDataTable( value.name );\n\t\t\t}\n\t\t} );\n\n\t\tthis.$body.append( booklet.$element );\n\n\t\tsetTimeout( function () {\n\t\t\tVisualDataFunctions.removeNbspFromLayoutHeader(\n\t\t\t\t'#visualdata-ProcessDialogEditProperties'\n\t\t\t);\n\t\t}, 30 );\n\t};\n\n\tfunction handleSaveArray( currentItem, obj ) {\n\t\tvar parentSchema = obj.parentSchema;\n\t\tdelete obj.parentSchema;\n\n\t\t// *** important !! otherwise it will be processed\n\t\t// as field by VisualDataSchemaProcessor\n\t\tif ( obj[ 'multiple-items' ] ) {\n\t\t\tparentSchema.type = 'schema';\n\t\t}\n\n\t\tif (\n\t\t\t( obj[ 'multiple-items' ] && currentItem.type === 'array' ) ||\n\t\t\t( !obj[ 'multiple-items' ] && currentItem.type !== 'array' )\n\t\t) {\n\t\t\tif ( obj[ 'multiple-items' ] ) {\n\t\t\t\tcurrentItem.wiki = parentSchema;\n\t\t\t\tcurrentItem.items = $.extend( currentItem.items, { wiki: obj } );\n\t\t\t\treturn currentItem;\n\t\t\t}\n\n\t\t\tcurrentItem.wiki = obj;\n\t\t\treturn currentItem;\n\t\t}\n\n\t\t// move child to parent\n\t\tif ( !obj[ 'multiple-items' ] ) {\n\t\t\t// currentItem.type should be always array\n\t\t\treturn $.extend(\n\t\t\t\tcurrentItem.type === 'array' ? currentItem.items : currentItem,\n\t\t\t\t{ wiki: obj }\n\t\t\t);\n\t\t}\n\n\t\t// create parent - child\n\t\treturn {\n\t\t\ttype: 'array',\n\t\t\twiki: parentSchema,\n\t\t\titems: $.extend( currentItem, { wiki: obj } )\n\t\t};\n\t}\n\n\tProcessDialogNested.prototype.getActionProcess = function ( action ) {\n\t\tvar dialog = this;\n\n\t\tif (\n\t\t\t!action ||\n\t\t\t( action === 'delete' &&\n\t\t\t\t// eslint-disable-next-line no-alert\n\t\t\t\t!confirm( mw.msg( 'visualdata-jsmodule-schemas-delete-schema-confirm' ) ) )\n\t\t) {\n\t\t\t//\treturn ProcessDialogNested.super.prototype.getActionProcess.call( this, action );\n\t\t}\n\n\t\tvar data = this.data;\n\t\tvar propName = data.propName;\n\n\t\tvar currentItem = getCurrentItem();\n\t\tvar parentSchema = currentItem;\n\t\tif (\n\t\t\tcurrentItem.type === 'array' &&\n\t\t\tVisualDataFunctions.isObject( currentItem.items )\n\t\t) {\n\t\t\tcurrentItem = currentItem.items;\n\t\t}\n\n\t\tfunction getValueRec( thisModel, thisObj ) {\n\t\t\tfor ( var i in thisModel ) {\n\t\t\t\tif ( !( 'getValue' in thisModel[ i ] ) ) {\n\t\t\t\t\tgetValueRec( thisModel[ i ], ( thisObj[ i ] = {} ) );\n\t\t\t\t} else {\n\t\t\t\t\tthisObj[ i ] = getWidgetValue( thisModel[ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tswitch ( action ) {\n\t\t\tcase 'delete':\n\t\t\t\tif ( parentSchema.wiki.name !== '' ) {\n\t\t\t\t\tdelete SelectedItems[ SelectedItems.length - 1 ][ propName ][\n\t\t\t\t\t\tparentSchema.wiki.name\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'save':\n\t\t\t\tvar model = Models[ Models.length - 1 ];\n\t\t\t\tvar ParentObj = SelectedItems[ SelectedItems.length - 2 ];\n\n\t\t\t\tvar obj = { type: 'schema' };\n\t\t\t\tgetValueRec( model, obj );\n\n\t\t\t\tvar objName = obj[ 'multiple-items' ] ? obj.parentSchema.name : obj.name;\n\n\t\t\t\tvar target =\n\t\t\t\t\tParentObj.type !== 'array' ?\n\t\t\t\t\t\tParentObj[ propName ] :\n\t\t\t\t\t\tParentObj.items[ propName ];\n\n\t\t\t\tvar alert = null;\n\t\t\t\tif ( objName === '' ) {\n\t\t\t\t\talert = mw.msg( 'visualdata-jsmodule-schemas-alert-noname' );\n\n\t\t\t\t\t// @see VisualDataFormField\n\t\t\t\t} else if ( objName !== parentSchema.wiki.name && objName in target ) {\n\t\t\t\t\talert = mw.msg( 'visualdata-jsmodule-schemas-alert-existing-item' );\n\t\t\t\t} else if (\n\t\t\t\t\t!Object.keys( currentItem.properties ).length\n\t\t\t\t\t//  && !Object.keys(currentItem.allOf).length &&\n\t\t\t\t\t// !Object.keys(currentItem.anyOf).length &&\n\t\t\t\t\t// !Object.keys(currentItem.oneOf).length\n\t\t\t\t) {\n\t\t\t\t\talert = mw.msg( 'visualdata-jsmodule-schemas-alert-no-properties' );\n\t\t\t\t}\n\n\t\t\t\tif ( alert ) {\n\t\t\t\t\tVisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( alert ), {\n\t\t\t\t\t\tsize: 'medium'\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn ProcessDialog.super.prototype.getActionProcess.call(\n\t\t\t\t\t\tthis,\n\t\t\t\t\t\taction\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tVisualDataFunctions.renameObjectKey(\n\t\t\t\t\ttarget,\n\t\t\t\t\tparentSchema.wiki.name,\n\t\t\t\t\tobjName\n\t\t\t\t);\n\n\t\t\t\tvar updatedSchema = handleSaveArray( parentSchema, obj );\n\t\t\t\tupdatedSchema.type = !obj[ 'multiple-items' ] ? 'object' : 'array';\n\n\t\t\t\tvar panels = [\n\t\t\t\t\t'properties'\n\t\t\t\t\t// \"anyOf\",\n\t\t\t\t\t// \"oneOf\",\n\t\t\t\t\t// \"allOf\",\n\t\t\t\t\t// \"additionalProperties\",\n\t\t\t\t];\n\n\t\t\t\tvar target_ = !obj[ 'multiple-items' ] ?\n\t\t\t\t\tupdatedSchema :\n\t\t\t\t\tupdatedSchema.items;\n\n\t\t\t\tfor ( var panel of panels ) {\n\t\t\t\t\tif ( panel in target_ ) {\n\t\t\t\t\t\torderFields( target_[ panel ], panel );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\ttarget[ objName ] = updatedSchema;\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn new OO.ui.Process( function () {\n\t\t\tdialog.close( { action: action } );\n\t\t} );\n\n\t\t// return ProcessDialogNested.super.prototype.getActionProcess.call( this, action );\n\t};\n\n\tProcessDialogNested.prototype.getTeardownProcess = function ( data ) {\n\t\tvar self = this;\n\t\treturn ProcessDialogNested.super.prototype.getTeardownProcess\n\t\t\t.call( this, data )\n\t\t\t.first( function () {\n\t\t\t\tModels.pop();\n\t\t\t\tSelectedItems.pop();\n\t\t\t\tinitializeNestedDataTable( self.data.propName );\n\t\t\t\tWindowManager.removeActiveWindow();\n\t\t\t}, this );\n\t};\n\n\t/**\n\t * Override getBodyHeight to create a tall dialog relative to the screen.\n\t *\n\t * @return {number} Body height\n\t */\n\tProcessDialogNested.prototype.getBodyHeight = function () {\n\t\t// see here https://www.mediawiki.org/wiki/OOUI/Windows/Process_Dialogs\n\t\t// this.page1.content.$element.outerHeight( true );\n\t\treturn window.innerHeight - 100;\n\t};\n\n\tfunction PageOneLayout( name, config ) {\n\t\tPageOneLayout.super.call( this, name, config );\n\n\t\tvar currentItem = getCurrentItem();\n\n\t\tvar model = Models[ Models.length - 1 ];\n\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: ''\n\t\t} );\n\n\t\t//  || currentItem.wiki.name\n\t\tvar nameInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'name' )\n\t\t} );\n\n\t\tmodel.name = nameInput;\n\n\t\tvar titleInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'title' )\n\t\t} );\n\n\t\tmodel.title = titleInput;\n\n\t\tvar descriptionInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tautosize: true,\n\t\t\trows: 2,\n\t\t\tvalue: getPropertyValue( 'description' )\n\t\t} );\n\n\t\tmodel.description = descriptionInput;\n\n\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\ttype: 'info',\n\t\t\tlabel: new OO.ui.HtmlSnippet(\n\t\t\t\tmw.msg(\n\t\t\t\t\t'visualdata-jsmodule-formfield-message-schemapage',\n\t\t\t\t\t`${ Config.VisualDataSchemaUrl }${ getPropertyValue( 'name' ) }`\n\t\t\t\t)\n\t\t\t),\n\n\t\t\tinvisibleLabel: false,\n\t\t\tclasses: [ 'VisualDataFormFieldMessage' ]\n\t\t} );\n\n\t\tmessageWidget.toggle( currentItem.wiki.name !== '' );\n\n\t\tfieldset.addItems( [\n\t\t\tmessageWidget,\n\t\t\tnew OO.ui.FieldLayout( nameInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-name' ),\n\t\t\t\talign: 'top'\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( titleInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-title' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-title-help' ),\n\t\t\t\talign: 'top',\n\t\t\t\thelpInline: true\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( descriptionInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-description' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-description-help' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} )\n\n\t\t\t// new OO.ui.FieldLayout(collapsibleInput, {\n\t\t\t// \tlabel: mw.msg(\"visualdata-jsmodule-schemas-collapsible\"),\n\t\t\t// \talign: \"top\",\n\t\t\t// \thelp: mw.msg(\"visualdata-jsmodule-schemas-collapsible-help\"),\n\t\t\t// \thelpInline: true,\n\t\t\t// }),\n\n\t\t\t// new OO.ui.FieldLayout(collapsedInput, {\n\t\t\t// \tlabel: mw.msg(\"visualdata-jsmodule-schemas-collapsed\"),\n\t\t\t// \talign: \"top\",\n\t\t\t// \thelp: mw.msg(\"visualdata-jsmodule-schemas-collapsed-help\"),\n\t\t\t// \thelpInline: true,\n\t\t\t// }),\n\t\t] );\n\n\t\tthis.content = new OO.ui.PanelLayout( {\n\t\t\t$content: fieldset.$element,\n\t\t\tpadded: true,\n\t\t\texpanded: false\n\t\t} );\n\n\t\tthis.$element.append( this.content.$element );\n\t}\n\n\tOO.inheritClass( PageOneLayout, OO.ui.PageLayout );\n\n\tPageOneLayout.prototype.setupOutlineItem = function () {\n\t\tthis.outlineItem.setLabel(\n\t\t\tmw.msg( 'visualdata-jsmodule-dialog-main' )\n\t\t);\n\t};\n\n\tfunction parentSchemaContainer( model, self ) {\n\t\tif ( !self ) {\n\t\t\tvar self = VisualDataSchemas;\n\t\t}\n\t\tvar layout = new OO.ui.PanelLayout( {\n\t\t\texpanded: false,\n\t\t\tpadded: true,\n\t\t\tframed: true,\n\t\t\tclasses: []\n\t\t} );\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-container-schema' )\n\t\t} );\n\n\t\tlayout.$element.append( fieldset.$element );\n\n\t\tvar nameInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: self.getPropertyValue( 'name', 'parentSchema' )\n\t\t} );\n\n\t\tmodel.name = nameInput;\n\n\t\tvar titleInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: self.getPropertyValue( 'title', 'parentSchema' )\n\t\t} );\n\n\t\tmodel.title = titleInput;\n\n\t\tvar descriptionInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tautosize: true,\n\t\t\trows: 2,\n\t\t\tvalue: self.getPropertyValue( 'description', 'parentSchema' )\n\t\t} );\n\n\t\tmodel.description = descriptionInput;\n\n\t\t// @TODO\n\t\t// add:\n\t\t// min: number, at least: number\n\t\t// layout: section, horizontal, greed\n\t\t// collapsible: toggle\n\t\t// collasped: toggle\n\t\tvar minItemsInput = new OO.ui.NumberInputWidget( {\n\t\t\tvalue: self.getPropertyValue( 'min-items', 'parentSchema' ),\n\t\t\ttype: 'number'\n\t\t} );\n\t\tvar maxItemsInput = new OO.ui.NumberInputWidget( {\n\t\t\tvalue: self.getPropertyValue( 'max-items', 'parentSchema' ),\n\t\t\ttype: 'number'\n\t\t} );\n\n\t\tmodel[ 'min-items' ] = minItemsInput;\n\t\tmodel[ 'max-items' ] = maxItemsInput;\n\n\t\tvar uniqueItemsInput = new OO.ui.ToggleSwitchWidget( {\n\t\t\tvalue: self.getPropertyValue( 'unique-items', 'parentSchema' )\n\t\t} );\n\n\t\tmodel[ 'unique-items' ] = uniqueItemsInput;\n\n\t\tvar fieldMinItems = new OO.ui.FieldLayout( minItemsInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-min-items' ),\n\t\t\talign: 'top',\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-min-items-help' ),\n\t\t\thelpInline: true\n\t\t} );\n\n\t\tvar fieldMaxItems = new OO.ui.FieldLayout( maxItemsInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-max-items' ),\n\t\t\talign: 'top',\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-max-items-help' ),\n\t\t\thelpInline: true\n\t\t} );\n\n\t\tvar fieldUniqueItems = new OO.ui.FieldLayout( uniqueItemsInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-unique-items' ),\n\t\t\talign: 'top',\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-unique-items-help' ),\n\t\t\thelpInline: true\n\t\t} );\n\n\t\tvar messageWidget = new OO.ui.MessageWidget( {\n\t\t\ttype: 'info',\n\t\t\tlabel: new OO.ui.HtmlSnippet(\n\t\t\t\tmw.msg(\n\t\t\t\t\t'visualdata-jsmodule-schemas-message-container-info'\n\t\t\t\t)\n\t\t\t),\n\n\t\t\tinvisibleLabel: false,\n\t\t\tclasses: [ 'VisualDataFormFieldMessage' ]\n\t\t} );\n\n\t\tfieldset.addItems( [\n\t\t\tmessageWidget,\n\n\t\t\tnew OO.ui.FieldLayout( nameInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-name' ),\n\t\t\t\talign: 'top'\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( titleInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-title' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-title-help' ),\n\t\t\t\talign: 'top',\n\t\t\t\thelpInline: true\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( descriptionInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-description' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-description-help' ),\n\t\t\t\thelpInline: true,\n\t\t\t\talign: 'top'\n\t\t\t} ),\n\t\t\tfieldMinItems,\n\t\t\tfieldMaxItems,\n\t\t\tfieldUniqueItems\n\t\t] );\n\n\t\treturn layout;\n\t}\n\n\tfunction PageOneLayoutNested( name, config ) {\n\t\tPageOneLayoutNested.super.call( this, name, config );\n\n\t\tvar currentItem = getCurrentItem();\n\t\tvar parentSchema = {};\n\n\t\t// array items can share the same schema for\n\t\t// all items, or to contain a tuple (to be an\n\t\t// array of items of fixed length)\n\t\t// in the first case, we consider the schema\n\t\t// being the child schema,\n\t\t// in the second case being the parent schema\n\t\t// (in the firse case, we will provide an\n\t\t// editable panel with the properties of the\n\t\t// parent schema)\n\t\tif (\n\t\t\tcurrentItem.type === 'array' &&\n\t\t\tVisualDataFunctions.isObject( currentItem.items )\n\t\t) {\n\t\t\tparentSchema = currentItem;\n\t\t\tcurrentItem = currentItem.items;\n\t\t}\n\n\t\tvar model = Models[ Models.length - 1 ];\n\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: ''\n\t\t} );\n\n\t\t//  || currentItem.wiki.name\n\t\tvar nameInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'name' )\n\t\t} );\n\n\t\tmodel.name = nameInput;\n\n\t\tvar titleInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'title' )\n\t\t} );\n\n\t\tmodel.title = titleInput;\n\n\t\tvar descriptionInput = new OO.ui.MultilineTextInputWidget( {\n\t\t\tautosize: true,\n\t\t\trows: 2,\n\t\t\tvalue: getPropertyValue( 'description' )\n\t\t} );\n\n\t\tmodel.description = descriptionInput;\n\n\t\t// *** TODO, manage arrays and tuples\n\t\t// @see https://json-schema.org/understanding-json-schema/reference/array.html#tuple-validation\n\n\t\tvar multipleItemsInputValue =\n\t\t\tgetPropertyValue( 'multiple-items' ) || parentSchema.type === 'array';\n\n\t\tvar multipleItemsInput = new OO.ui.ToggleSwitchWidget( {\n\t\t\tvalue: multipleItemsInputValue\n\t\t} );\n\n\t\tmodel[ 'multiple-items' ] = multipleItemsInput;\n\n\t\tvar layoutParentSchema = parentSchemaContainer( ( model.parentSchema = {} ) );\n\t\tlayoutParentSchema.toggle( multipleItemsInputValue );\n\t\tnameInput.setDisabled( multipleItemsInputValue );\n\n\t\tmultipleItemsInput.on( 'change', function ( enabled ) {\n\t\t\tlayoutParentSchema.toggle( enabled );\n\t\t\tnameInput.setDisabled( enabled );\n\t\t} );\n\n\t\t// var layout = new OO.ui.HorizontalLayout( {\n\t\t// \titems: [ minInstancesInput, maxInstancesInput ]\n\t\t// } );\n\n\t\tvar layoutInput = new OO.ui.DropdownInputWidget( {\n\t\t\toptions: VisualDataFunctions.createDropDownOptions( {\n\t\t\t\tsection: mw.msg( 'visualdata-jsmodule-schemas-layout-section' ),\n\t\t\t\thorizontal: mw.msg( 'visualdata-jsmodule-schemas-layout-horizontal' )\n\t\t\t\t// 'grid': mw.msg(\n\t\t\t\t// \t'visualdata-jsmodule-forms-freetext-showalways'\n\t\t\t\t// )\n\t\t\t} ),\n\t\t\tvalue: getPropertyValue( 'layout' ) || 'section'\n\t\t} );\n\n\t\tmodel.layout = layoutInput;\n\n\t\tfieldset.addItems( [\n\t\t\tnew OO.ui.FieldLayout( nameInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-name' ),\n\t\t\t\talign: 'top'\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( titleInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-title' ),\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-title-help' ),\n\t\t\t\talign: 'top',\n\t\t\t\thelpInline: true\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( descriptionInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-description' ),\n\t\t\t\talign: 'top'\n\t\t\t} ),\n\n\t\t\tnew OO.ui.FieldLayout( multipleItemsInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-multiple-items' ),\n\t\t\t\talign: 'top',\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-multiple-items-help' ),\n\t\t\t\t// 'Toggle on to allow multiple items', // mw.msg(),\n\t\t\t\thelpInline: true\n\t\t\t} ),\n\n\t\t\tlayoutParentSchema,\n\n\t\t\tnew OO.ui.FieldLayout( layoutInput, {\n\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-schemas-layout' ),\n\t\t\t\talign: 'top',\n\t\t\t\thelp: mw.msg( 'visualdata-jsmodule-schemas-layout-help' ),\n\t\t\t\thelpInline: true\n\t\t\t} )\n\t\t] );\n\n\t\tthis.content = new OO.ui.PanelLayout( {\n\t\t\t$content: fieldset.$element,\n\t\t\tpadded: true,\n\t\t\texpanded: false\n\t\t} );\n\n\t\tthis.$element.append( this.content.$element );\n\t}\n\n\tOO.inheritClass( PageOneLayoutNested, OO.ui.PageLayout );\n\n\tPageOneLayoutNested.prototype.setupOutlineItem = function () {\n\t\tthis.outlineItem.setLabel(\n\t\t\tmw.msg( 'visualdata-jsmodule-dialog-main' )\n\t\t);\n\t};\n\n\tfunction openDialog( schema, propName, initialTab ) {\n\t\tif ( !schema ) {\n\t\t\tSelectedItems.push( {\n\t\t\t\tproperties: {},\n\n\t\t\t\t// treat as objects\n\t\t\t\t// items: {},\n\t\t\t\t// anyOf: {},\n\t\t\t\t// oneOf: {},\n\t\t\t\t// allOf: {},\n\n\t\t\t\t// additionalProperties: {},\n\t\t\t\twiki: { name: '' }\n\t\t\t} );\n\t\t} else {\n\t\t\tSelectedItems.push(\n\t\t\t\tjQuery.extend(\n\t\t\t\t\t{\n\t\t\t\t\t\tproperties: {},\n\n\t\t\t\t\t\t// treat as objects\n\t\t\t\t\t\t// items: {},\n\t\t\t\t\t\t// anyOf: {},\n\t\t\t\t\t\t// oneOf: {},\n\t\t\t\t\t\t// allOf: {},\n\t\t\t\t\t\t// additionalProperties: {},\n\t\t\t\t\t\twiki: {}\n\t\t\t\t\t},\n\t\t\t\t\tschema\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\tModels.push( { parentSchema: {} } );\n\n\t\t// *** place here properties to copy\n\t\tif ( 'uuid' in SelectedItems[ SelectedItems.length - 1 ].wiki ) {\n\t\t\tModels[ Models.length - 1 ].uuid = new VisualDataFunctions.MockupOOUIClass(\n\t\t\t\tschema.wiki.uuid );\n\t\t}\n\n\t\tvar processDialog;\n\t\tvar title;\n\n\t\tif ( !propName ) {\n\t\t\tprocessDialog = new ProcessDialog( {\n\t\t\t\tsize: 'larger',\n\t\t\t\tid: 'visualdata-ProcessDialogEditData'\n\t\t\t} );\n\n\t\t\ttitle =\n\t\t\t\tmw.msg(\n\t\t\t\t\t// The following messages are used here:\n\t\t\t\t\t// * visualdata-jsmodule-schemas-defineschema\n\t\t\t\t\t// * visualdata-jsmodule-schemas-defineschema - [name]\n\t\t\t\t\t'visualdata-jsmodule-schemas-defineschema'\n\t\t\t\t) + ( name ? ' - ' + name : '' );\n\t\t} else {\n\t\t\tprocessDialog = new ProcessDialogNested( {\n\t\t\t\tsize: 'larger',\n\t\t\t\tid: 'visualdata-ProcessDialogEditProperties',\n\t\t\t\tdata: { propName: propName }\n\t\t\t} );\n\n\t\t\ttitle =\n\t\t\t\tmw.msg(\n\t\t\t\t\t// The following messages are used here:\n\t\t\t\t\t// * visualdata-jsmodule-schemas-defineschema\n\t\t\t\t\t// * visualdata-jsmodule-schemas-defineschema - [name]\n\t\t\t\t\t'visualdata-jsmodule-schemas-defineschema'\n\t\t\t\t) + ( name ? ' - ' + name : '' );\n\t\t}\n\n\t\tWindowManager.newWindow( processDialog, { title: title, initialTab: initialTab || 'main' } );\n\n\t\tif ( !Config.jsonDiffLibrary && !mw.cookie.get( 'visualdata-check-json-diff-library' ) ) {\n\t\t\tVisualDataFunctions.OOUIAlert( new OO.ui.HtmlSnippet( mw.msg( 'visualdata-jsmodule-missing-json-diff-library' ) ), {\n\t\t\t\tsize: 'medium',\n\t\t\t\tactions: [ OO.ui.MessageDialog.static.actions[ 0 ] ]\n\t\t\t}, function () {\n\t\t\t\t// 15 days\n\t\t\t\tvar timeLapse = 15 * 86400;\n\t\t\t\tmw.cookie.set( 'visualdata-check-json-diff-library', true, {\n\t\t\t\t\tpath: '/',\n\t\t\t\t\texpires: timeLapse\n\t\t\t\t} );\n\t\t\t} );\n\t\t}\n\t}\n\n\t// function escape( s ) {\n\t// \treturn String( s )\n\t// \t\t.replace( /&/g, '&amp;' )\n\t// \t\t.replace( /</g, '&lt;' )\n\t// \t\t.replace( />/g, '&gt;' )\n\t// \t\t.replace( /\"/g, '&quot;' )\n\t// \t\t.replace( /'/g, '&#039;' );\n\t// }\n\n\tfunction initializeDataTable() {\n\t\tVisualDataFunctions.destroyDataTable(\n\t\t\t'visualdata-schemas-datatable'\n\t\t);\n\n\t\tvar data = [];\n\t\tfor ( var i in Schemas ) {\n\t\t\tvar value = Schemas[ i ];\n\n\t\t\t// *** or use https://datatables.net/manual/data/renderers#Text-helper\n\t\t\tdata.push( [\n\t\t\t\ti,\n\t\t\t\t'properties' in value ? Object.keys( value.properties ).join( ', ' ) : ''\n\t\t\t] );\n\t\t}\n\n\t\tDataTable = $( '#visualdata-schemas-datatable' ).DataTable( {\n\t\t\torder: 1,\n\t\t\tpageLength: 20,\n\n\t\t\t// https://datatables.net/reference/option/dom\n\t\t\tdom: '<\"visualdata-datatable-left\"f><\"visualdata-datatable-right\"l>rtip',\n\t\t\tlengthMenu: [ 10, 20, 50, 100, 200 ],\n\t\t\t// lengthChange: false,\n\t\t\tdata: data,\n\t\t\tstateSave: true,\n\t\t\tcolumns: mw\n\t\t\t\t.msg( 'visualdata-jsmodule-schemas-columns' )\n\t\t\t\t.split( /\\s*,\\s*/ )\n\t\t\t\t.map( function ( x ) {\n\t\t\t\t\treturn { title: x };\n\t\t\t\t} )\n\t\t} );\n\n\t\tDataTable.on( 'click', 'tr', function () {\n\t\t\tvar index = DataTable.row( this ).index();\n\t\t\tif ( index !== undefined ) {\n\t\t\t\tvar label = data[ index ][ 0 ];\n\t\t\t\topenSchemaDialog( label, false );\n\t\t\t}\n\t\t} );\n\t}\n\n\tfunction openSchemaDialog( label, initialTab ) {\n\t\tif ( !Object.keys( Schemas[ label ] ).length ) {\n\t\t\tVisualData.loadSchemas( [ label ] ).then( function ( schemas ) {\n\t\t\t\tfor ( var i in schemas ) {\n\t\t\t\t\tSchemas[ i ] = schemas[ i ];\n\t\t\t\t}\n\t\t\t\topenDialog( Schemas[ label ], null, initialTab );\n\t\t\t} );\n\t\t} else {\n\t\t\topenDialog( Schemas[ label ], null, initialTab );\n\t\t}\n\t}\n\n\tfunction createToolbarB( panelName ) {\n\t\tvar toolFactory = new OO.ui.ToolFactory();\n\t\tvar toolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\tvar toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\tactions: true\n\t\t} );\n\n\t\tvar currentItem = getCurrentItem();\n\t\t// var propName = currentItem.type === \"array\" ? \"items\" : panelName;\n\t\tvar propName = panelName;\n\n\t\tvar onSelect = function () {\n\t\t\tvar toolName = this.getName();\n\n\t\t\tvar callback = function () {\n\t\t\t\tinitializeNestedDataTable( panelName );\n\t\t\t};\n\t\t\tswitch ( toolName ) {\n\t\t\t\tcase 'add-geolocation':\n\t\t\t\t\tVisualDataGeolocationInst.openDialog(\n\t\t\t\t\t\tcallback,\n\t\t\t\t\t\tcurrentItem.type !== 'array' ?\n\t\t\t\t\t\t\tcurrentItem[ propName ] :\n\t\t\t\t\t\t\tcurrentItem.items[ propName ]\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'add-block-content':\n\t\t\t\t\tVisualDataContentBlockInst.openDialog(\n\t\t\t\t\t\tcallback,\n\t\t\t\t\t\tcurrentItem.type !== 'array' ?\n\t\t\t\t\t\t\tcurrentItem[ propName ] :\n\t\t\t\t\t\t\tcurrentItem.items[ propName ]\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'add-field':\n\t\t\t\t\tVisualDataFormFieldInst.openDialog(\n\t\t\t\t\t\tcallback,\n\t\t\t\t\t\tcurrentItem.type !== 'array' ?\n\t\t\t\t\t\t\tcurrentItem[ propName ] :\n\t\t\t\t\t\t\tcurrentItem.items[ propName ]\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'add-subitem':\n\t\t\t\t\topenDialog( null, propName );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.setActive( false );\n\t\t};\n\n\t\tvar toolGroup = [\n\t\t\t{\n\t\t\t\tname: 'add-field',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-schemas-add-field' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'add-block-content',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-schemas-add-block-content' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'add-subitem',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-schemas-add-subitem' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'add-geolocation',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-schemas-add-geolocation' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t}\n\t\t];\n\t\tVisualDataFunctions.createToolGroup( toolFactory, 'group', toolGroup );\n\n\t\ttoolbar.setup( [\n\t\t\t{\n\t\t\t\tname: 'my-group',\n\t\t\t\t// type: \"bar\",\n\t\t\t\t// label: \"Create property\",\n\t\t\t\tinclude: [ { group: 'group' } ]\n\t\t\t}\n\t\t] );\n\n\t\treturn toolbar;\n\t}\n\n\tfunction createToolbarA() {\n\t\tvar toolFactory = new OO.ui.ToolFactory();\n\t\tvar toolGroupFactory = new OO.ui.ToolGroupFactory();\n\n\t\tvar toolbar = new OO.ui.Toolbar( toolFactory, toolGroupFactory, {\n\t\t\tactions: true\n\t\t} );\n\n\t\tvar onSelect = function () {\n\t\t\tvar toolName = this.getName();\n\n\t\t\tswitch ( toolName ) {\n\t\t\t\tcase 'createschema':\n\t\t\t\t\topenDialog( null, null );\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.setActive( false );\n\t\t};\n\n\t\tvar toolGroup = [\n\t\t\t{\n\t\t\t\tname: 'createschema',\n\t\t\t\ticon: 'add',\n\t\t\t\ttitle: mw.msg( 'visualdata-jsmodule-schemas-create-schema' ),\n\t\t\t\tonSelect: onSelect\n\t\t\t}\n\t\t];\n\t\tVisualDataFunctions.createToolGroup( toolFactory, 'group', toolGroup );\n\n\t\ttoolbar.setup( [\n\t\t\t{\n\t\t\t\tname: 'my-group',\n\t\t\t\t// type: \"bar\",\n\t\t\t\t// label: \"Create property\",\n\t\t\t\tinclude: [ { group: 'group' } ]\n\t\t\t}\n\t\t] );\n\n\t\treturn toolbar;\n\t}\n\n\tfunction initialize() {\n\t\tif ( Config.context === 'ManageSchemas' ) {\n\t\t\t$( '#schemas-wrapper' ).empty();\n\n\t\t\tvar contentFrame = new OO.ui.PanelLayout( {\n\t\t\t\t$content: $(\n\t\t\t\t\t'<table id=\"visualdata-schemas-datatable\" class=\"visualdata-datatable display\" width=\"100%\"></table>'\n\t\t\t\t),\n\t\t\t\texpanded: false,\n\t\t\t\tpadded: true\n\t\t\t} );\n\n\t\t\tvar toolbar = createToolbarA();\n\n\t\t\tvar frame = new OO.ui.PanelLayout( {\n\t\t\t\t$content: [ toolbar.$element, contentFrame.$element ],\n\t\t\t\texpanded: false,\n\t\t\t\tframed: true,\n\t\t\t\tdata: { name: 'manage-schemas' }\n\t\t\t} );\n\n\t\t\t$( '#schemas-wrapper' ).append( frame.$element );\n\n\t\t\ttoolbar.initialize();\n\t\t\ttoolbar.emit( 'updateState' );\n\t\t}\n\n\t\tinitializeDataTable();\n\t}\n\n\tfunction setVars( config, windowManager, schemas, visualDataForms ) {\n\t\tConfig = config;\n\t\tWindowManager = windowManager;\n\t\tSchemas = schemas;\n\t\tVisualDataForms = visualDataForms;\n\n\t\tVisualDataFormFieldInst = new VisualDataFormField(\n\t\t\tconfig,\n\t\t\twindowManager,\n\t\t\tSchemas\n\t\t);\n\t\tVisualDataContentBlockInst = new VisualDataContentBlock(\n\t\t\tconfig,\n\t\t\twindowManager\n\t\t);\n\t\tVisualDataGeolocationInst = new VisualDataGeolocation(\n\t\t\tconfig,\n\t\t\twindowManager\n\t\t);\n\t}\n\n\treturn {\n\t\tinitialize,\n\t\tcreateToolbarA,\n\t\topenDialog,\n\t\tparentSchemaContainer,\n\t\tgetPropertyValue,\n\t\tgetCurrentItem,\n\t\tgetModel,\n\t\thandleSaveArray,\n\t\tgetWidgetValue,\n\t\topenSchemaDialog,\n\t\tsetVars\n\t};\n}() );\n\n$( function () {\n\tvar config = JSON.parse( mw.config.get( 'visualdata-config' ) );\n\t// console.log(\"config\", config);\n\n\tif ( config.context === 'ManageSchemas' ) {\n\t\tvar schemas = JSON.parse( mw.config.get( 'visualdata-schemas' ) );\n\t\t// console.log(\"schemas\", schemas);\n\n\t\tvar windowManager = new VisualDataWindowManager();\n\t\tvar instances = [];\n\t\tVisualData.setVars( config, schemas, instances );\n\n\t\tVisualDataSchemas.setVars(\n\t\t\tconfig,\n\t\t\twindowManager,\n\t\t\tschemas,\n\t\t\tinstances\n\t\t);\n\n\t\tVisualDataSchemas.initialize();\n\t}\n\n} );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataUpload.js","messages":[],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":26,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":32,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":105,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":105,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[3108,3154],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/VisualDataWindowManager.js","messages":[],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":25,"column":1,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":62,"endColumn":2,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataButtonMultiselectWidget.js","messages":[{"ruleId":"no-jquery/no-in-array","severity":1,"message":"Prefer Array#indexOf to $.inArray","line":48,"column":12,"nodeType":"CallExpression","endLine":48,"endColumn":59}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":24,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":59,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2023, https://wikisphere.org\n */\n\n( function () {\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataButtonMultiselectWidget = function ( config ) {\n\t\tconfig = config || {};\n\n\t\tif ( !( 'classes' in config ) ) {\n\t\t\tconfig.classes = [];\n\t\t}\n\n\t\tthis.options = {};\n\t\tfor ( var value of config.options ) {\n\t\t\tthis.options[ [ value.data ] ] = value.label;\n\t\t}\n\n\t\t// ***important, add position: relative to display\n\t\t// property native validation\n\t\tconfig.classes.push( 'visualdata-button-multiselect-widget' );\n\n\t\tVisualDataButtonMultiselectWidget.super.call( this, config );\n\n\t\tvar self = this;\n\t\tthis.items = {};\n\t\tfor ( var i in this.options ) {\n\t\t\tthis.items[ i ] = new OO.ui.ToggleButtonWidget( {\n\t\t\t\tdata: i,\n\t\t\t\tlabel: this.options[ i ],\n\t\t\t\tvalue: $.inArray( this.options[ i ], config.selected ) !== -1\n\t\t\t} );\n\n\t\t\tthis.items[ i ].on( 'change', function () {\n\t\t\t\tself.emit( 'change', self.getValue().join().trim() );\n\t\t\t} );\n\t\t}\n\n\t\tfor ( var i in this.items ) {\n\t\t\tthis.$element.append( this.items[ i ].$element );\n\t\t}\n\t};\n\n\tOO.inheritClass( VisualDataButtonMultiselectWidget, OO.ui.Widget );\n\tOO.mixinClass( VisualDataButtonMultiselectWidget, OO.EventEmitter );\n\n\tVisualDataButtonMultiselectWidget.prototype.getValue = function () {\n\t\tvar ret = [];\n\t\tfor ( var i in this.items ) {\n\t\t\tif ( this.items[ i ].getValue() ) {\n\t\t\t\tret.push( this.options[ i ] );\n\t\t\t}\n\t\t}\n\t\treturn ret;\n\t};\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataDropdownWidget.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":38,"column":7,"nodeType":"VariableDeclarator","endLine":38,"endColumn":71},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":53,"column":7,"nodeType":"VariableDeclarator","endLine":59,"endColumn":21}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":24,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":62,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2023, https://wikisphere.org\n */\n\n( function () {\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataDropdownWidget = function ( config ) {\n\t\tconfig = config || {};\n\n\t\tif ( !( 'classes' in config ) ) {\n\t\t\tconfig.classes = [];\n\t\t}\n\t\tvar self = this;\n\n\t\tconfig.classes.push( 'visualdata-dropdown-widget' );\n\n\t\tVisualDataDropdownWidget.super.call( this, config );\n\n\t\tvar options = config.options;\n\n\t\tvar select = $( '<select>' ).attr( 'class', 'oo-ui-indicator-down' );\n\t\tfor ( var option of options ) {\n\t\t\tselect.append(\n\t\t\t\t$( '<option>' )\n\t\t\t\t\t.attr( { value: option.data, selected: option.data === config.value } )\n\t\t\t\t\t.text( option.label )\n\t\t\t);\n\t\t}\n\n\t\tthis.select = select;\n\n\t\tselect.on( 'change', function () {\n\t\t\tself.emit( 'change', self.getValue() );\n\t\t} );\n\n\t\tvar div = $( '<div>' )\n\t\t\t.attr(\n\t\t\t\t'class',\n\t\t\t\t'oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-dropdownInputWidget'\n\t\t\t)\n\n\t\t\t.append( select );\n\n\t\tthis.$element.append( div );\n\t};\n\n\tOO.inheritClass( VisualDataDropdownWidget, OO.ui.Widget );\n\tOO.mixinClass( VisualDataDropdownWidget, OO.EventEmitter );\n\n\tVisualDataDropdownWidget.prototype.getValue = function () {\n\t\treturn this.select.val();\n\t};\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataLookupElement.js","messages":[],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":24,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":29,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataMaptiler.js","messages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 119. Maximum allowed is 100.","line":61,"column":1,"nodeType":"Program","messageId":"max","endLine":61,"endColumn":111}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":26,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":31,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'config' is defined but never used.","line":26,"column":34,"nodeType":"Identifier","messageId":"unusedVar","endLine":26,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'self' is assigned a value but never used.","line":38,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":38,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'e' is defined but never used.","line":47,"column":61,"nodeType":"Identifier","messageId":"unusedVar","endLine":47,"endColumn":62,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":82,"column":26,"nodeType":"Identifier","messageId":"unusedVar","endLine":82,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":88,"column":40,"nodeType":"Identifier","messageId":"unusedVar","endLine":88,"endColumn":43,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":99,"column":36,"nodeType":"Identifier","messageId":"unusedVar","endLine":99,"endColumn":39,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":103,"column":46,"nodeType":"Identifier","messageId":"unusedVar","endLine":103,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":107,"column":46,"nodeType":"Identifier","messageId":"unusedVar","endLine":107,"endColumn":49,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2024, https://wikisphere.org\n */\n\n/* eslint-disable no-unused-vars */\n\n( function () {\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataMaptiler = function ( config ) {\n\t\tthis.scripts = [\n\t\t\t'https://cdn.maptiler.com/maptiler-sdk-js/v1.2.0/maptiler-sdk.umd.min.js',\n\t\t\t'https://cdn.maptiler.com/maptiler-geocoding-control/v1.2.0/maptilersdk.umd.js'\n\t\t];\n\t};\n\n\tVisualDataMaptiler.prototype.load = function () {\n\t\tVisualDataFunctions.loadScripts( this.scripts );\n\t};\n\n\tVisualDataMaptiler.prototype.initialize = function ( $element, data ) {\n\t\tvar self = this;\n\n\t\t// *** prevents ajv error \"Maximum call stack size exceeded\"\n\t\tvar config = VisualDataFunctions.deepCopy( data.schema.wiki );\n\t\tvar latInput = data.model.properties.latitude.input;\n\t\tvar lngInput = data.model.properties.longitude.input;\n\t\tvar zoomInput = data.model.properties.zoom.input;\n\t\tvar mapId = 'visualdata-maptiler-map-' + data.path;\n\n\t\tVisualDataFunctions.loadScripts( this.scripts, function ( e ) {\n\t\t\tif ( $( '#' + jQuery.escapeSelector( mapId ) ).length ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tmaptilersdk.config.apiKey = mw.config.get( 'visualdata-maptiler-apikey' );\n\t\t\tvar $container = $( '<div style=\"width:100%;height:400px\" id=\"' + mapId + '\" />' );\n\t\t\t$element.append( $container );\n\n\t\t\tconfig[ 'maptiler-map-config' ].container = mapId;\n\t\t\tconfig[ 'maptiler-map-config' ].style = maptilersdk.MapStyle.HYBRID;\n\n\t\t\tvar center = [ parseFloat( lngInput.getValue() ), parseFloat( latInput.getValue() ) ];\n\n\t\t\tvar isValidCenter = !VisualDataFunctions.isNaN( center[ 0 ] ) && !VisualDataFunctions.isNaN( center[ 1 ] );\n\n\t\t\tif ( isValidCenter ) {\n\t\t\t\tconfig[ 'maptiler-map-config' ].center = center;\n\t\t\t\tconfig[ 'maptiler-map-config' ].zoom = parseInt( zoomInput.getValue() );\n\t\t\t\tconfig[ 'maptiler-map-config' ].geolocate = false;\n\n\t\t\t} else {\n\t\t\t\tif ( !( 'geolocate' in config[ 'maptiler-map-config' ] ) ) {\n\t\t\t\t\tconfig[ 'maptiler-map-config' ].geolocate = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst map = ( window.map = new maptilersdk.Map( config[ 'maptiler-map-config' ] ) );\n\t\t\tconfig[ 'maptiler-map-config' ].marker = false;\n\n\t\t\tvar marker;\n\n\t\t\tif ( config[ 'reverse-geocoding' ] ) {\n\t\t\t\tconst gc = new maptilersdkMaptilerGeocoder.GeocodingControl( config[ 'maptiler-map-config' ] );\n\n\t\t\t\tmap.on( 'zoomend', ( res ) => {\n\t\t\t\t\t// console.log('zoomend:', res);\n\t\t\t\t\tzoomInput.setValue( map.getZoom() );\n\t\t\t\t} );\n\n\t\t\t\t// https://docs.maptiler.com/sdk-js/modules/geocoding/api/api-reference/#event:featuresListed\n\t\t\t\tgc.addEventListener( 'response', ( res ) => {\n\t\t\t\t\t// console.log(\"response:\", res);\n\t\t\t\t} );\n\n\t\t\t\tgc.addEventListener( 'select', ( res ) => {\n\t\t\t\t\t// console.log(\"select:\", res );\n\t\t\t\t\tif ( res.detail ) {\n\t\t\t\t\t\tmarker.setLngLat( res.detail.center );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tgc.addEventListener( 'pick', ( res ) => {\n\t\t\t\t\t// console.log(\"pick:\", res );\n\t\t\t\t} );\n\n\t\t\t\tgc.addEventListener( 'featuresListed', ( res ) => {\n\t\t\t\t\t// console.log(\"featuresListed:\", res);\n\t\t\t\t} );\n\n\t\t\t\tgc.addEventListener( 'featuresMarked', ( res ) => {\n\t\t\t\t\t// console.log(\"featuresMarked:\", res);\n\t\t\t\t} );\n\n\t\t\t\tmap.addControl( gc, 'top-left' );\n\t\t\t}\n\n\t\t\tfunction onDragEnd() {\n\t\t\t\tvar lngLat = marker.getLngLat();\n\t\t\t\tsetTimeout( function () {\n\t\t\t\t\tlngInput.setValue( lngLat.lng );\n\t\t\t\t\tlatInput.setValue( lngLat.lat );\n\t\t\t\t\tzoomInput.setValue( map.getZoom() );\n\t\t\t\t}, 100 );\n\t\t\t}\n\n\t\t\tmap.on( 'load', function () {\n\t\t\t\tif ( !marker ) {\n\t\t\t\t\tmarker = new maptilersdk.Marker( {\n\t\t\t\t\t\tdraggable: true\n\t\t\t\t\t} )\n\t\t\t\t\t\t.setLngLat( map.getCenter() )\n\t\t\t\t\t\t.addTo( map );\n\n\t\t\t\t\tmarker.on( 'dragend', onDragEnd );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tif ( isValidCenter ) {\n\t\t\t\tmarker = new maptilersdk.Marker( {\n\t\t\t\t\tdraggable: true\n\t\t\t\t} )\n\t\t\t\t\t.setLngLat( center )\n\t\t\t\t\t.addTo( map );\n\n\t\t\t\tmarker.on( 'dragend', onDragEnd );\n\t\t\t}\n\n\t\t\t// update marker\n\t\t\tdata.model.properties.latitude.input.on( 'change', function ( value ) {\n\t\t\t\tmarker.setLngLat( [ lngInput.getValue(), value ] );\n\t\t\t} );\n\t\t\tdata.model.properties.longitude.input.on( 'change', function ( value ) {\n\t\t\t\tmarker.setLngLat( [ value, latInput.getValue() ] );\n\t\t\t} );\n\n\t\t} );\n\t};\n\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataMenuTagSearchMultiselect.js","messages":[{"ruleId":"jsdoc/check-tag-names","severity":1,"message":"Invalid JSDoc tag name \"mixins\".","line":29,"column":1,"nodeType":"Block","endLine":29,"endColumn":1},{"ruleId":"max-len","severity":1,"message":"This line has a length of 110. Maximum allowed is 100.","line":49,"column":1,"nodeType":"Program","messageId":"max","endLine":49,"endColumn":99},{"ruleId":"max-len","severity":1,"message":"This line has a length of 107. Maximum allowed is 100.","line":50,"column":1,"nodeType":"Program","messageId":"max","endLine":50,"endColumn":96}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":37,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":71,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2023, https://wikisphere.org\n */\n\n// @credits: mw.widgets.CategoryMultiselectWidget\n\n( function () {\n\t/**\n\t * @class VisualDataMenuTagSearchMultiselect\n\t * @uses mw.Api\n\t * @extends OO.ui.MenuTagMultiselectWidget\n\t * @mixins OO.ui.mixin.PendingElement\n\t *\n\t * @constructor\n\t * @param {Object} [config] Configuration options\n\t * @cfg {number} [limit=10] Maximum number of results to load\n\t */\n\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataMenuTagSearchMultiselect = function ( config ) {\n\t\t// Config initialization\n\t\tthis.limit = config.limit;\n\n\t\t// Parent constructor\n\t\tVisualDataMenuTagSearchMultiselect.parent.call(\n\t\t\tthis,\n\t\t\t$.extend( true, {}, config, {\n\t\t\t\tmenu: {\n\t\t\t\t\tfilterFromInput: false\n\t\t\t\t},\n\t\t\t\tplaceholder: mw.msg( 'visualdata-menutagmultiselect-placeholder' ),\n\t\t\t\t// This allows the user to both select non-existent categories, and prevents the selector from\n\t\t\t\t// being wiped from #onMenuItemsChange when we change the available options in the dropdown\n\t\t\t\tallowArbitrary: false\n\t\t\t} )\n\t\t);\n\n\t\t// Mixin constructors\n\t\tOO.ui.mixin.PendingElement.call(\n\t\t\tthis,\n\t\t\t$.extend( {}, config, { $pending: this.$handle } )\n\t\t);\n\n\t\t// Event handler to call the autocomplete methods\n\t\tthis.input.$input.on(\n\t\t\t'change input cut paste',\n\t\t\tOO.ui.debounce( this.updateMenuItems.bind( this ), 100 )\n\t\t);\n\n\t\t// Initialize\n\t\t// @TODO\n\t\tthis.api = { abort: function () {} }; // config.api || new mw.Api();\n\t\tthis.searchCache = {};\n\t};\n\n\t/* Setup */\n\n\tOO.inheritClass(\n\t\tVisualDataMenuTagSearchMultiselect,\n\t\tOO.ui.MenuTagMultiselectWidget\n\t);\n\tOO.mixinClass(\n\t\tVisualDataMenuTagSearchMultiselect,\n\t\tOO.ui.mixin.PendingElement\n\t);\n\n\t/* Methods */\n\n\t/**\n\t * Gets new items based on the input by calling\n\t * {@link #getNewMenuItems getNewItems} and updates the menu\n\t * after removing duplicates based on the data value.\n\t *\n\t * @private\n\t * @method\n\t */\n\tVisualDataMenuTagSearchMultiselect.prototype.updateMenuItems =\n\t\tfunction () {\n\t\t\tthis.getMenu().clearItems();\n\t\t\tthis.getNewMenuItems( this.input.$input.val() ).then(\n\t\t\t\tfunction ( items ) {\n\t\t\t\t\tvar existingItems,\n\t\t\t\t\t\tmenu = this.getMenu();\n\n\t\t\t\t\t// Never show the menu if the input lost focus in the meantime\n\t\t\t\t\tif ( !this.input.$input.is( ':focus' ) ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Array of strings of the data of OO.ui.MenuOptionsWidgets\n\t\t\t\t\texistingItems = menu.getItems().map( function ( item ) {\n\t\t\t\t\t\treturn item.data;\n\t\t\t\t\t} );\n\n\t\t\t\t\t// Remove if items' data already exists\n\t\t\t\t\tfor ( var i in items ) {\n\t\t\t\t\t\tif ( existingItems.indexOf( i ) !== -1 ) {\n\t\t\t\t\t\t\tdelete items[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Map to an array of OO.ui.MenuOptionWidgets\n\t\t\t\t\tvar ret = [];\n\t\t\t\t\tfor ( var i in items ) {\n\t\t\t\t\t\tret.push(\n\t\t\t\t\t\t\tnew OO.ui.MenuOptionWidget( {\n\t\t\t\t\t\t\t\tdata: i,\n\t\t\t\t\t\t\t\tlabel: items[ i ]\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tmenu.addItems( ret ).toggle( true );\n\t\t\t\t}.bind( this )\n\t\t\t);\n\t\t};\n\n\t/**\n\t * @inheritdoc\n\t */\n\tVisualDataMenuTagSearchMultiselect.prototype.clearInput = function () {\n\t\tVisualDataMenuTagSearchMultiselect.parent.prototype.clearInput.call(\n\t\t\tthis\n\t\t);\n\t\t// Abort all pending requests, we won't need their results\n\t\tthis.api.abort();\n\t};\n\n\t/**\n\t * Searches for categories based on the input.\n\t *\n\t * @private\n\t * @method\n\t * @param {string} input The input used to prefix search categories\n\t * @return {jQuery.Promise} Resolves with an array of categories\n\t */\n\tVisualDataMenuTagSearchMultiselect.prototype.getNewMenuItems = function (\n\t\tinput\n\t) {\n\t\tvar deferred = $.Deferred();\n\n\t\tif ( input.trim() === '' ) {\n\t\t\tdeferred.resolve( [] );\n\t\t\treturn deferred.promise();\n\t\t}\n\n\t\t// Abort all pending requests, we won't need their results\n\t\tthis.api.abort();\n\n\t\tthis.pushPending();\n\n\t\treturn this.searchItems( input ).always( this.popPending.bind( this ) );\n\t};\n\n\t/**\n\t * @private\n\t * @method\n\t * @param {string} value The input value\n\t * @return {jQuery.Promise} Resolves with an array of items\n\t */\n\tVisualDataMenuTagSearchMultiselect.prototype.searchItems = function (\n\t\tvalue\n\t) {\n\t\tvar deferred = $.Deferred(),\n\t\t\tcacheKey = value;\n\n\t\t// Check cache\n\t\tif ( cacheKey in this.searchCache ) {\n\t\t\treturn this.searchCache[ cacheKey ];\n\t\t}\n\n\t\tthis.data.performQuery( this.data.model, value ).then( ( data ) => {\n\t\t\tdeferred.resolve( data );\n\t\t} );\n\n\t\t// Cache the result\n\t\tthis.searchCache[ cacheKey ] = deferred.promise();\n\n\t\treturn deferred.promise( { abort: function () {} } );\n\t};\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataRatingWidget.js","messages":[{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":38,"column":19,"nodeType":"CallExpression","endLine":38,"endColumn":47},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":45,"column":8,"nodeType":"VariableDeclarator","endLine":51,"endColumn":7},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":67,"column":6,"nodeType":"CallExpression","endLine":69,"endColumn":7}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":24,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":91,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"eqeqeq","severity":2,"message":"Expected '===' and instead saw '=='.","line":54,"column":11,"nodeType":"BinaryExpression","messageId":"unexpected","endLine":54,"endColumn":13,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"eqeqeq","severity":2,"message":"Expected '===' and instead saw '=='.","line":64,"column":25,"nodeType":"BinaryExpression","messageId":"unexpected","endLine":64,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":3,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2022, https://wikisphere.org\n */\n\n( function () {\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataRatingWidget = function ( config ) {\n\t\tconfig = config || {};\n\n\t\tif ( !( 'classes' in config ) ) {\n\t\t\tconfig.classes = [];\n\t\t}\n\n\t\t// ***important, add position: relative to display\n\t\t// property native validation\n\t\tconfig.classes.push( 'visualdata-rating-widget' );\n\n\t\tVisualDataRatingWidget.super.call( this, config );\n\n\t\t// @see https://iamkate.com/code/star-rating-widget/\n\t\tvar $fieldset = $( ' <div class=\"rating\">' );\n\n\t\tthis.$input = $fieldset;\n\n\t\tvar self = this;\n\t\tthis.isChecked = 0;\n\t\tfor ( var i = 1; i < 6; i++ ) {\n\t\t\tvar input = $( '<input>' ).attr( {\n\t\t\t\ttype: 'radio',\n\t\t\t\tvalue: i,\n\t\t\t\tid: 'rating-' + i,\n\t\t\t\tname: config.name,\n\t\t\t\t'data-i': i\n\t\t\t} );\n\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif ( i == config.value ) {\n\t\t\t\tinput.prop( 'checked', true );\n\t\t\t\tthis.isChecked = i;\n\t\t\t}\n\n\t\t\t// uncheck the radio button if\n\t\t\t// alread selected, and check the previous one\n\t\t\tinput.on( 'click', function () {\n\t\t\t\tvar ii = $( this ).data( 'i' );\n\t\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\t\tif ( self.isChecked == ii ) {\n\t\t\t\t\tself.isChecked = ii - 1;\n\t\t\t\t\t$( this ).prop( 'checked', false );\n\t\t\t\t\t$(\n\t\t\t\t\t\t\":input[name='\" + config.name + \"'][data-i='\" + ( ii - 1 ) + \"']\"\n\t\t\t\t\t).prop( 'checked', true );\n\t\t\t\t} else {\n\t\t\t\t\tself.isChecked = ii;\n\t\t\t\t}\n\n\t\t\t\tself.emit( 'change', self.getValue() );\n\n\t\t\t} );\n\n\t\t\t$fieldset.append( [\n\t\t\t\tinput,\n\t\t\t\t$( '<label>' ).attr( {\n\t\t\t\t\tfor: 'rating-' + i\n\t\t\t\t} )\n\t\t\t] );\n\t\t}\n\n\t\tthis.getValue = function () {\n\t\t\treturn this.isChecked ? String( this.isChecked ) : '';\n\t\t};\n\n\t\tthis.$element.append( $fieldset );\n\t};\n\n\tOO.inheritClass( VisualDataRatingWidget, OO.ui.Widget );\n\tOO.mixinClass( VisualDataRatingWidget, OO.EventEmitter );\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataVisualEditor.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":40,"column":3,"nodeType":"AssignmentExpression","endLine":42,"endColumn":47},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":40,"column":19,"nodeType":"CallExpression","endLine":40,"endColumn":45},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":47,"column":3,"nodeType":"AssignmentExpression","endLine":47,"endColumn":69},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":53,"column":9,"nodeType":"CallExpression","endLine":53,"endColumn":48}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":27,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":57,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":37,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":37,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":73,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":73,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":76,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":76,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":79,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":79,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":80,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":80,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":81,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":81,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":82,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":82,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":85,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":85,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":89,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":89,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":90,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":90,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":91,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":91,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":92,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":92,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":105,"column":38,"nodeType":"Identifier","messageId":"unusedVar","endLine":105,"endColumn":44,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":109,"column":49,"nodeType":"Identifier","messageId":"unusedVar","endLine":109,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'e' is defined but never used.","line":110,"column":56,"nodeType":"Identifier","messageId":"unusedVar","endLine":110,"endColumn":57,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-return-assign","severity":2,"message":"Return statement should not contain assignment.","line":146,"column":5,"nodeType":"ReturnStatement","messageId":"returnAssignment","endLine":146,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":160,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":160,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":163,"column":34,"nodeType":"Identifier","messageId":"unusedVar","endLine":163,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":4,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2023, https://wikisphere.org\n */\n\n/* eslint-disable no-tabs */\n/* eslint-disable no-unused-vars */\n\n( function () {\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataVisualEditor = function ( config ) {\n\t\tconfig = config || {};\n\t\tif ( !( 'classes' in config ) ) {\n\t\t\tconfig.classes = [];\n\t\t}\n\t\tvar self = this;\n\t\tthis.config = config;\n\n\t\t// @FIXME only allows wikitext for now\n\t\t// this.isHtml =\n\t\t// \t\"contentModel\" in this.config && this.config.contentModel === \"html\";\n\t\tVisualDataVisualEditor.super.call( this, config );\n\n\t\tthis.textarea = $( '<textarea rows=\"8\">' )\n\t\t\t.attr( 'name', config.name )\n\t\t\t.attr( 'class', 'visualdata toolbarOnTop' );\n\n\t\tthis.text = this.config.value || '';\n\t\tthis.textarea.val( this.text );\n\n\t\tthis.VEInstance = $( '<span>' ).attr( 'class', 've-area-wrapper' );\n\t\tthis.$element.append( this.VEInstance.append( this.textarea ) );\n\t\tthis.Editor = null;\n\t\tthis.initialized = false;\n\n\t\tsetTimeout( function () {\n\t\t\tif ( self.$element.parent().is( ':visible' ) ) {\n\t\t\t\tself.initialize();\n\t\t\t}\n\t\t}, 50 );\n\t};\n\n\tOO.inheritClass( VisualDataVisualEditor, OO.ui.Widget );\n\tOO.mixinClass( VisualDataVisualEditor, OO.EventEmitter );\n\n\t// @see https://github.com/Open-CSP/FlexForm/blob/main/Modules/FlexForm.general.js\n\tVisualDataVisualEditor.prototype.initialize = async function () {\n\t\tif ( this.initialized ) {\n\t\t\treturn;\n\t\t}\n\t\tthis.destroyEditor();\n\t\tvar self = this;\n\t\tself.initialized = true;\n\n\t\tthis.loadVEForAll().then( function () {\n\t\t\t// if (!self.isHtml) {\n\t\t\t// \treturn;\n\t\t\t// }\n\t\t\t// var callbackCond = function () {\n\t\t\t// \treturn self.getEditor();\n\t\t\t// };\n\t\t\t// var callback = function (resolve, reject) {\n\t\t\t// \tsetTimeout(function() {\n\t\t\t// \t\tself.getEditor().createWithHtmlContent(self.text);\n\t\t\t// \t}, 100);\n\t\t\t// \tresolve();\n\t\t\t// };\n\t\t\t// var callbackMaxAttempts = function (resolve, reject) {\n\t\t\t// \treject();\n\t\t\t// };\n\n\t\t\t// VisualDataFunctions.waitUntil(\n\t\t\t// \tcallbackCond,\n\t\t\t// \tcallback,\n\t\t\t// \tcallbackMaxAttempts,\n\t\t\t// \t8\n\t\t\t// );\n\t\t} );\n\t};\n\n\t// @see https://github.com/Open-CSP/FlexForm/blob/main/Modules/FlexForm.general.js\n\tVisualDataVisualEditor.prototype.loadVEForAll = async function () {\n\t\tvar self = this;\n\n\t\tvar callbackCond = function () {\n\t\t\treturn typeof $().applyVisualEditor === 'function';\n\t\t};\n\n\t\tvar callback = function ( resolve, reject ) {\n\t\t\tself.textarea.applyVisualEditor();\n\t\t\tresolve();\n\t\t};\n\t\tvar callbackMaxAttempts = function ( resolve, reject ) {\n\t\t\tjQuery( document ).on( 'VEForAllLoaded', function ( e ) {\n\t\t\t\tself.textarea.applyVisualEditor();\n\t\t\t\tresolve();\n\t\t\t} );\n\t\t};\n\n\t\treturn VisualDataFunctions.waitUntil(\n\t\t\tcallbackCond,\n\t\t\tcallback,\n\t\t\tcallbackMaxAttempts,\n\t\t\t5\n\t\t);\n\t};\n\n\tVisualDataVisualEditor.prototype.destroyEditor = function () {\n\t\tif ( typeof $.fn.getVEInstances === 'function' ) {\n\t\t\tvar visualEditors = $.fn.getVEInstances();\n\t\t\tfor ( var i in visualEditors ) {\n\t\t\t\tvar editor = visualEditors[ i ];\n\t\t\t\tif ( $( editor.$node ).attr( 'name' ) === this.config.name ) {\n\t\t\t\t\teditor.destroy();\n\t\t\t\t\tvisualEditors.splice( i, 1 );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t// @see PageForms PF_submit.js\n\tVisualDataVisualEditor.prototype.getEditor = function () {\n\t\tif ( this.Editor ) {\n\t\t\treturn this.Editor;\n\t\t}\n\t\tvar visualEditors = $.fn.getVEInstances();\n\t\tfor ( var editor of visualEditors ) {\n\t\t\tif ( $( editor.$node ).attr( 'name' ) === this.config.name ) {\n\t\t\t\t// eslint-disable-next-line no-return-assign\n\t\t\t\treturn this.Editor = editor.target;\n\t\t\t}\n\t\t}\n\t};\n\n\tVisualDataVisualEditor.prototype.getValue = function () {\n\t\tvar self = this;\n\t\tvar editor = this.getEditor();\n\n\t\tif ( !this.initialized || !editor ) {\n\t\t\treturn this.textarea.val();\n\t\t}\n\n\t\t// if (this.isHtml) {\n\t\t// \treturn VisualDataFunctions.decodeHTMLEntities( editor.getSurface().getHtml() );\n\t\t// }\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\t$.when( editor.updateContent() ).then( function () {\n\t\t\t\t// @see ext.veforall.target.js\n\t\t\t\t// *** sometimes convertToWikiText is not called\n\t\t\t\t// based on focus\n\t\t\t\teditor.$node.addClass( 've-for-all-waiting-for-update' );\n\n\t\t\t\tresolve( self.textarea.val() );\n\t\t\t} );\n\t\t} );\n\t};\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]},{"filePath":"/src/repo/resources/Widgets/VisualDataintlTelInput.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":38,"column":7,"nodeType":"VariableDeclarator","endLine":43,"endColumn":6}],"suppressedMessages":[{"ruleId":"no-implicit-globals","severity":2,"message":"Global variable leak, declare the variable if it is intended to be local.","line":26,"column":2,"nodeType":"AssignmentExpression","messageId":"globalVariableLeak","endLine":91,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":51,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":51,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":52,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":52,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"new-cap","severity":2,"message":"A constructor name should not start with a lowercase letter.","line":173,"column":25,"nodeType":"NewExpression","messageId":"lower","endLine":173,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":183,"column":7,"nodeType":"MemberExpression","messageId":"unexpected","endLine":183,"endColumn":20,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[4992,5054],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":192,"column":7,"nodeType":"MemberExpression","messageId":"unexpected","endLine":192,"endColumn":20,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[5257,5310],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":0,"fatalErrorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"/**\n * This file is part of the MediaWiki extension VisualData.\n *\n * VisualData is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 2 of the License, or\n * (at your option) any later version.\n *\n * VisualData is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with VisualData. If not, see <http://www.gnu.org/licenses/>.\n *\n * @file\n * @author thomas-topway-it <support@topway.it>\n * @copyright Copyright © 2021-2023, https://wikisphere.org\n */\n\n/* eslint-disable no-tabs */\n\n( function () {\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataIntlTelInput = function ( config ) {\n\t\tVisualDataIntlTelInput.super.call( this, config );\n\n\t\tvar self = this;\n\t\tthis.config = config;\n\n\t\t// https://github.com/jackocnr/intl-tel-input/tree/master?tab=readme-ov-file\n\t\tif ( 'nationalMode' in this.config && this.config.nationalMode === true ) {\n\t\t\tthis.config.showFlags = false;\n\t\t\tthis.config.allowDropdown = false;\n\t\t}\n\n\t\tvar input = $( '<input>' ).attr( {\n\t\t\ttype: 'tel',\n\t\t\tname: config.name,\n\t\t\tvalue: config.value,\n\t\t\tclass: 'oo-ui-inputWidget-input'\n\t\t} );\n\n\t\tthis.input = input;\n\n\t\t// required when handled by OO.ui.TagMultiselectWidget -> inputWidget: inputWidget\n\t\tthis.$input = input;\n\n\t\t// input.on(\"input\", function () {\n\t\t// \tself.config.value = self.input.val();\n\t\t// \tself.emit(\"change\", self.config.value);\n\t\t// });\n\n\t\tinput.on( 'blur', function () {\n\t\t\tself.formatNumber();\n\t\t} );\n\n\t\tthis.$element = $( '<div>' )\n\t\t\t.attr(\n\t\t\t\t'class',\n\t\t\t\t'oo-ui-widget oo-ui-widget-enabled oo-ui-inputWidget oo-ui-textInputWidget oo-ui-textInputWidget-type-text'\n\t\t\t)\n\t\t\t.append( input );\n\n\t\tself.fixConfigCountries( config );\n\n\t\tself.iti = window.intlTelInput(\n\t\t\tinput.get( 0 ),\n\t\t\t$.extend(\n\t\t\t\t{\n\t\t\t\t\tutilsScript:\n\t\t\t\t\t\t'https://cdn.jsdelivr.net/npm/intl-tel-input@18.3.3/build/js/utils.js',\n\t\t\t\t\tinitialCountry: 'auto',\n\t\t\t\t\tgeoIpLookup: function ( callback ) {\n\t\t\t\t\t\tfetch( 'https://ipapi.co/json' )\n\t\t\t\t\t\t\t.then( function ( res ) {\n\t\t\t\t\t\t\t\treturn res.json();\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.then( function ( data ) {\n\t\t\t\t\t\t\t\tcallback( data.country_code );\n\t\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.catch( function () {\n\t\t\t\t\t\t\t\tcallback( 'us' );\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tconfig\n\t\t\t)\n\t\t);\n\t};\n\n\tOO.inheritClass( VisualDataIntlTelInput, OO.ui.Widget );\n\tOO.mixinClass( VisualDataIntlTelInput, OO.EventEmitter );\n\n\tVisualDataIntlTelInput.prototype.formatNumber = function () {\n\t\t// https://github.com/jackocnr/intl-tel-input/blob/master/src/js/utils.js#L109\n\t\tvar numberFormat = intlTelInputUtils.numberFormat.E164;\n\t\tif ( 'nationalMode' in this.config && this.config.nationalMode === true ) {\n\t\t\tnumberFormat = intlTelInputUtils.numberFormat.NATIONAL;\n\t\t}\n\n\t\tif ( typeof this.iti === 'object' && typeof intlTelInputUtils === 'object' ) {\n\t\t\tthis.setValue(\n\t\t\t\tthis.iti.getNumber( numberFormat )\n\t\t\t);\n\t\t}\n\t};\n\n\tVisualDataIntlTelInput.prototype.validateFunc = async function () {\n\t\tif ( this.getValue().trim() === '' ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( !this.iti.isPossibleNumber() ) {\n\t\t\t// https://github.com/jackocnr/intl-tel-input/blob/master/src/js/utils.js#L148\n\t\t\tvar error = this.iti.getValidationError();\n\t\t\tvar msg = '';\n\t\t\tswitch ( error ) {\n\t\t\t\tcase 1:\n\t\t\t\t\tmsg = 'invalid country code';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 2:\n\t\t\t\t\tmsg = 'too short';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 3:\n\t\t\t\t\tmsg = 'too long';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 4:\n\t\t\t\t\tmsg = 'is possible local only';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 5:\n\t\t\t\t\tmsg = 'invalid length';\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn 'wrong number' + ( msg ? `: ${ msg }` : '' );\n\t\t}\n\n\t\treturn true;\n\t};\n\n\tVisualDataIntlTelInput.prototype.getValue = function () {\n\t\tthis.formatNumber();\n\t\t// return this.config.value;\n\t\treturn this.input.val();\n\t};\n\n\tVisualDataIntlTelInput.prototype.setValue = function ( value ) {\n\t\t// this.config.value = value;\n\t\tthis.input.val( value );\n\t};\n\n\tVisualDataIntlTelInput.prototype.fixConfigCountries = function ( config ) {\n\t\t// excludeCountries, initialCountry, onlyCountries, preferredCountries\n\t\tvar configCountries = [\n\t\t\t'excludeCountries',\n\t\t\t'initialCountry',\n\t\t\t'onlyCountries',\n\t\t\t'preferredCountries'\n\t\t];\n\n\t\tif (\n\t\t\t!Object.keys( config ).filter( ( x ) => configCountries.indexOf( x ) !== -1 )\n\t\t\t\t.length\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// first get all countries to handle the error\n\t\t// \"No country data for ... \"\n\t\t// eslint-disable-next-line new-cap\n\t\tvar iso2 = new window.intlTelInput( this.input.get( 0 ) ).countries.map(\n\t\t\t( x ) => x.iso2\n\t\t);\n\n\t\tfor ( var i of configCountries ) {\n\t\t\tif ( i in config ) {\n\t\t\t\tif ( i === 'initialCountry' ) {\n\t\t\t\t\tconfig[ i ] = config[ i ].toLowerCase();\n\t\t\t\t\tif ( iso2.indexOf( config[ i ] ) === -1 ) {\n\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\tconsole.error( config[ i ] + ' is not a valid country code' );\n\t\t\t\t\t\tdelete config[ i ];\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var ii of config[ i ] ) {\n\t\t\t\t\tif ( iso2.indexOf( ii ) === -1 ) {\n\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\tconsole.error( ii + ' is not a valid country code' );\n\t\t\t\t\t\tvalues.splice( ii, 1 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconfig[ i ] = values;\n\t\t\t}\n\t\t}\n\t};\n}() );\n","usedDeprecatedRules":[{"ruleId":"max-len","replacedBy":[]},{"ruleId":"arrow-parens","replacedBy":[]},{"ruleId":"arrow-spacing","replacedBy":[]},{"ruleId":"lines-between-class-members","replacedBy":[]},{"ruleId":"no-new-require","replacedBy":[]},{"ruleId":"template-curly-spacing","replacedBy":[]},{"ruleId":"array-bracket-spacing","replacedBy":[]},{"ruleId":"block-spacing","replacedBy":[]},{"ruleId":"brace-style","replacedBy":[]},{"ruleId":"comma-dangle","replacedBy":[]},{"ruleId":"comma-spacing","replacedBy":[]},{"ruleId":"comma-style","replacedBy":[]},{"ruleId":"computed-property-spacing","replacedBy":[]},{"ruleId":"dot-location","replacedBy":[]},{"ruleId":"eol-last","replacedBy":[]},{"ruleId":"func-call-spacing","replacedBy":[]},{"ruleId":"indent","replacedBy":[]},{"ruleId":"key-spacing","replacedBy":[]},{"ruleId":"keyword-spacing","replacedBy":[]},{"ruleId":"linebreak-style","replacedBy":[]},{"ruleId":"max-statements-per-line","replacedBy":[]},{"ruleId":"new-parens","replacedBy":[]},{"ruleId":"no-floating-decimal","replacedBy":[]},{"ruleId":"no-multi-spaces","replacedBy":[]},{"ruleId":"no-multiple-empty-lines","replacedBy":[]},{"ruleId":"no-new-object","replacedBy":["no-object-constructor"]},{"ruleId":"no-tabs","replacedBy":[]},{"ruleId":"no-trailing-spaces","replacedBy":[]},{"ruleId":"no-whitespace-before-property","replacedBy":[]},{"ruleId":"object-curly-spacing","replacedBy":[]},{"ruleId":"operator-linebreak","replacedBy":[]},{"ruleId":"quote-props","replacedBy":[]},{"ruleId":"quotes","replacedBy":[]},{"ruleId":"semi","replacedBy":[]},{"ruleId":"semi-spacing","replacedBy":[]},{"ruleId":"semi-style","replacedBy":[]},{"ruleId":"space-before-blocks","replacedBy":[]},{"ruleId":"space-before-function-paren","replacedBy":[]},{"ruleId":"space-in-parens","replacedBy":[]},{"ruleId":"space-infix-ops","replacedBy":[]},{"ruleId":"space-unary-ops","replacedBy":[]},{"ruleId":"spaced-comment","replacedBy":[]},{"ruleId":"switch-colon-spacing","replacedBy":[]},{"ruleId":"wrap-iife","replacedBy":[]},{"ruleId":"no-extra-semi","replacedBy":[]},{"ruleId":"no-mixed-spaces-and-tabs","replacedBy":[]}]}]

--- end ---
$ /usr/bin/npm ci
--- stderr ---
npm WARN deprecated stylelint-stylistic@0.4.3: This package has been deprecated in favor of @stylistic/stylelint-plugin
--- stdout ---

added 436 packages, and audited 437 packages in 4s

93 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

--- end ---
$ /usr/bin/npm test
--- stdout ---

> test
> grunt test

Running "eslint:all" (eslint) task

/src/repo/resources/VersionCheck.js
  57:22  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  62:18  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  65:9   warning  Where possible, maintain application state in JS to avoid slower DOM queries        no-jquery/no-class-state

/src/repo/resources/VisualDataDatatables.js
  45:2  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  48:7  warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern

/src/repo/resources/VisualDataFormField.js
  1085:4  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector

/src/repo/resources/VisualDataForms.js
    71:6   warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
    80:1   warning  This line has a length of 106. Maximum allowed is 100                               max-len
   209:5   warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
   407:1   warning  This line has a length of 104. Maximum allowed is 100                               max-len
   431:19  warning  Found non-literal argument to RegExp Constructor                                    security/detect-non-literal-regexp
   435:19  warning  Found non-literal argument to RegExp Constructor                                    security/detect-non-literal-regexp
   442:19  warning  Found non-literal argument to RegExp Constructor                                    security/detect-non-literal-regexp
   463:17  warning  Found non-literal argument to RegExp Constructor                                    security/detect-non-literal-regexp
   491:17  warning  Found non-literal argument to RegExp Constructor                                    security/detect-non-literal-regexp
   509:1   warning  This line has a length of 117. Maximum allowed is 100                               max-len
   526:1   warning  This line has a length of 131. Maximum allowed is 100                               max-len
  1390:26  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1458:6   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1461:7   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1464:7   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1492:7   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1495:8   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1498:8   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  2129:5   warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  2284:1   warning  This line has a length of 107. Maximum allowed is 100                               max-len
  2426:1   warning  This line has a length of 109. Maximum allowed is 100                               max-len
  2758:1   warning  This line has a length of 102. Maximum allowed is 100                               max-len
  2776:7   warning  jQuery collection names must match the variablePattern                              no-jquery/variable-pattern
  2950:1   warning  This line has a length of 102. Maximum allowed is 100                               max-len
  3074:10  warning  Selector extensions are not allowed                                                 no-jquery/no-sizzle
  3162:1   warning  This line has a length of 105. Maximum allowed is 100                               max-len
  3165:1   warning  This line has a length of 101. Maximum allowed is 100                               max-len
  3385:15  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  3409:1   warning  This line has a length of 119. Maximum allowed is 100                               max-len
  3456:3   warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector

/src/repo/resources/VisualDataInputConfig.js
  838:1  warning  This line has a length of 110. Maximum allowed is 100  max-len

/src/repo/resources/VisualDataProcessModel.js
  156:11  warning  Selector extensions are not allowed  no-jquery/no-sizzle

/src/repo/resources/VisualDataSchemas.js
   325:1   warning  This line has a length of 103. Maximum allowed is 100                               max-len
  1493:15  warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  1670:4   warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector
  1673:15  warning  Prefer DOM building to parsing HTML literals                                        no-jquery/no-parse-html-literal
  1689:4   warning  Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible  no-jquery/no-global-selector

/src/repo/resources/Widgets/VisualDataButtonMultiselectWidget.js
  48:12  warning  Prefer Array#indexOf to $.inArray  no-jquery/no-in-array

/src/repo/resources/Widgets/VisualDataDropdownWidget.js
  38:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  53:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

/src/repo/resources/Widgets/VisualDataMaptiler.js
  61:1  warning  This line has a length of 119. Maximum allowed is 100  max-len

/src/repo/resources/Widgets/VisualDataMenuTagSearchMultiselect.js
  29:1  warning  Invalid JSDoc tag name "mixins"                        jsdoc/check-tag-names
  49:1  warning  This line has a length of 110. Maximum allowed is 100  max-len
  50:1  warning  This line has a length of 107. Maximum allowed is 100  max-len

/src/repo/resources/Widgets/VisualDataRatingWidget.js
  38:19  warning  Prefer DOM building to parsing HTML literals            no-jquery/no-parse-html-literal
  45:8   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  67:6   warning  Selector extensions are not allowed                     no-jquery/no-sizzle

/src/repo/resources/Widgets/VisualDataVisualEditor.js
  40:3   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  40:19  warning  Prefer DOM building to parsing HTML literals            no-jquery/no-parse-html-literal
  47:3   warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern
  53:9   warning  Selector extensions are not allowed                     no-jquery/no-sizzle

/src/repo/resources/Widgets/VisualDataintlTelInput.js
  38:7  warning  jQuery collection names must match the variablePattern  no-jquery/variable-pattern

✖ 58 problems (0 errors, 58 warnings)


Running "stylelint:all" (stylelint) task
>> Linted 3 files without errors

Running "banana:VisualData" (banana) task
>> 1 message directory checked.

Done.

--- end ---
Upgrading c:php-parallel-lint/php-parallel-lint from 1.3.2 -> 1.4.0
$ /usr/bin/composer update
--- stderr ---
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 1 update, 0 removals
  - Upgrading php-parallel-lint/php-parallel-lint (v1.3.2 => v1.4.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 1 update, 0 removals
  - Upgrading php-parallel-lint/php-parallel-lint (v1.3.2 => v1.4.0): Extracting archive
Generating autoload files
14 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
No security vulnerability advisories found
--- stdout ---

--- end ---
$ /usr/bin/composer install
--- stderr ---
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Nothing to install, update or remove
Generating autoload files
14 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
--- stdout ---

--- end ---
$ /usr/bin/composer test
--- stderr ---
> parallel-lint . --exclude vendor --exclude node_modules
> minus-x check .
> phpcs -sp --cache
--- stdout ---
PHP 8.2.7 | 10 parallel jobs
...................................................          51/51 (100%)


Checked 51 files in 0.2 seconds
No syntax error found
MinusX
======
Processing /src/repo...
.............................................................
.............................................................
........
All good!
................................................... 51 / 51 (100%)


Time: 302ms; Memory: 10MB


--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
  "auditReportVersion": 2,
  "vulnerabilities": {},
  "metadata": {
    "vulnerabilities": {
      "info": 0,
      "low": 0,
      "moderate": 0,
      "high": 0,
      "critical": 0,
      "total": 0
    },
    "dependencies": {
      "prod": 1,
      "dev": 436,
      "optional": 0,
      "peer": 10,
      "peerOptional": 0,
      "total": 436
    }
  }
}

--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json

--- end ---
build: Updating dependencies

composer:
* php-parallel-lint/php-parallel-lint: 1.3.2 → 1.4.0

npm:
* eslint-config-wikimedia: 0.26.0 → 0.27.0


$ git add .
--- stdout ---

--- end ---
$ git commit -F /tmp/tmp8covpb1_
--- stdout ---
[master 9a966cb] build: Updating dependencies
 6 files changed, 330 insertions(+), 349 deletions(-)

--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From 9a966cb1dbb931ea1d92eb9c0f9b8d78aa575119 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Sat, 27 Apr 2024 13:31:04 +0000
Subject: [PATCH] build: Updating dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

composer:
* php-parallel-lint/php-parallel-lint: 1.3.2 → 1.4.0

npm:
* eslint-config-wikimedia: 0.26.0 → 0.27.0

Change-Id: I4cf36e90ad86ad74f16b4bb9892d831a88eec1b9
---
 composer.json                        |   2 +-
 package-lock.json                    | 671 +++++++++++++--------------
 package.json                         |   2 +-
 resources/VisualDataForms.js         |   2 -
 resources/VisualDataProcessModel.js  |   1 -
 resources/VisualDataWindowManager.js |   1 -
 6 files changed, 330 insertions(+), 349 deletions(-)

diff --git a/composer.json b/composer.json
index 65986e5..4efdbba 100644
--- a/composer.json
+++ b/composer.json
@@ -3,7 +3,7 @@
 		"mediawiki/mediawiki-codesniffer": "43.0.0",
 		"mediawiki/minus-x": "1.1.1",
 		"php-parallel-lint/php-console-highlighter": "1.0.0",
-		"php-parallel-lint/php-parallel-lint": "1.3.2"
+		"php-parallel-lint/php-parallel-lint": "1.4.0"
 	},
 	"scripts": {
 		"test": [
diff --git a/package-lock.json b/package-lock.json
index 7fffced..1a12473 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,7 +6,7 @@
 		"": {
 			"name": "VisualData",
 			"devDependencies": {
-				"eslint-config-wikimedia": "0.26.0",
+				"eslint-config-wikimedia": "0.27.0",
 				"grunt": "1.6.1",
 				"grunt-banana-checker": "0.11.1",
 				"grunt-eslint": "24.3.0",
@@ -288,17 +288,17 @@
 			}
 		},
 		"node_modules/@es-joy/jsdoccomment": {
-			"version": "0.37.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz",
-			"integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==",
+			"version": "0.42.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz",
+			"integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==",
 			"dev": true,
 			"dependencies": {
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"esquery": "^1.5.0",
 				"jsdoc-type-pratt-parser": "~4.0.0"
 			},
 			"engines": {
-				"node": "^14 || ^16 || ^17 || ^18 || ^19 || ^20"
+				"node": ">=16"
 			}
 		},
 		"node_modules/@eslint-community/eslint-utils": {
@@ -349,22 +349,22 @@
 			}
 		},
 		"node_modules/@eslint/js": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
-			"integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true,
 			"engines": {
 				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
 			}
 		},
 		"node_modules/@humanwhocodes/config-array": {
-			"version": "0.11.13",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
-			"integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+			"version": "0.11.14",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+			"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
 			"dev": true,
 			"dependencies": {
-				"@humanwhocodes/object-schema": "^2.0.1",
-				"debug": "^4.1.1",
+				"@humanwhocodes/object-schema": "^2.0.2",
+				"debug": "^4.3.1",
 				"minimatch": "^3.0.5"
 			},
 			"engines": {
@@ -385,9 +385,9 @@
 			}
 		},
 		"node_modules/@humanwhocodes/object-schema": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
-			"integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+			"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
 			"dev": true
 		},
 		"node_modules/@mdn/browser-compat-data": {
@@ -456,9 +456,9 @@
 			"dev": true
 		},
 		"node_modules/@types/semver": {
-			"version": "7.5.6",
-			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
-			"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+			"version": "7.5.8",
+			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+			"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
 			"dev": true
 		},
 		"node_modules/@typescript-eslint/scope-manager": {
@@ -775,9 +775,9 @@
 			}
 		},
 		"node_modules/browserslist": {
-			"version": "4.22.2",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
-			"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"funding": [
 				{
@@ -794,8 +794,8 @@
 				}
 			],
 			"dependencies": {
-				"caniuse-lite": "^1.0.30001565",
-				"electron-to-chromium": "^1.4.601",
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
 				"node-releases": "^2.0.14",
 				"update-browserslist-db": "^1.0.13"
 			},
@@ -807,9 +807,9 @@
 			}
 		},
 		"node_modules/browserslist-config-wikimedia": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.1.tgz",
-			"integrity": "sha512-jf532fUf/gaxiKdHgGCQUT552P5up3RpG+CzLixOQBJ5FwDmYQSRLYHCFUA9s3KMOHh4P3xVp+NUaGNxvtoT9g==",
+			"version": "0.6.1",
+			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.6.1.tgz",
+			"integrity": "sha512-F3O+12ud7ZwBaiB/RZIMGDgz3nEuXz8RhtdPB4Lkd/WVP5Vy77EqBWRMz4vJ64x8LTTH3BOaHCD2ZuUcgShqyQ==",
 			"dev": true
 		},
 		"node_modules/builtin-modules": {
@@ -825,9 +825,9 @@
 			}
 		},
 		"node_modules/builtins": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
-			"integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
+			"version": "5.1.0",
+			"resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz",
+			"integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==",
 			"dev": true,
 			"dependencies": {
 				"semver": "^7.0.0"
@@ -885,9 +885,9 @@
 			}
 		},
 		"node_modules/caniuse-lite": {
-			"version": "1.0.30001570",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz",
-			"integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==",
+			"version": "1.0.30001612",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz",
+			"integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==",
 			"dev": true,
 			"funding": [
 				{
@@ -921,9 +921,9 @@
 			}
 		},
 		"node_modules/ci-info": {
-			"version": "3.9.0",
-			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
-			"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+			"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
 			"dev": true,
 			"funding": [
 				{
@@ -1001,9 +1001,9 @@
 			}
 		},
 		"node_modules/comment-parser": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz",
-			"integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==",
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true,
 			"engines": {
 				"node": ">= 12.0.0"
@@ -1015,6 +1015,19 @@
 			"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 			"dev": true
 		},
+		"node_modules/core-js-compat": {
+			"version": "3.37.0",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz",
+			"integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==",
+			"dev": true,
+			"dependencies": {
+				"browserslist": "^4.23.0"
+			},
+			"funding": {
+				"type": "opencollective",
+				"url": "https://opencollective.com/core-js"
+			}
+		},
 		"node_modules/core-util-is": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -1342,9 +1355,9 @@
 			}
 		},
 		"node_modules/electron-to-chromium": {
-			"version": "1.4.615",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz",
-			"integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==",
+			"version": "1.4.750",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.750.tgz",
+			"integrity": "sha512-9ItEpeu15hW5m8jKdriL+BQrgwDTXEL9pn4SkillWFu73ZNNNQ2BKKLS+ZHv2vC9UkNhosAeyfxOf/5OSeTCPA==",
 			"dev": true
 		},
 		"node_modules/emoji-regex": {
@@ -1396,16 +1409,16 @@
 			}
 		},
 		"node_modules/eslint": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
-			"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.2.0",
 				"@eslint-community/regexpp": "^4.6.1",
 				"@eslint/eslintrc": "^2.1.4",
-				"@eslint/js": "8.56.0",
-				"@humanwhocodes/config-array": "^0.11.13",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
 				"@ungap/structured-clone": "^1.2.0",
@@ -1451,10 +1464,13 @@
 			}
 		},
 		"node_modules/eslint-compat-utils": {
-			"version": "0.1.2",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz",
-			"integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==",
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz",
+			"integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==",
 			"dev": true,
+			"dependencies": {
+				"semver": "^7.5.4"
+			},
 			"engines": {
 				"node": ">=12"
 			},
@@ -1463,28 +1479,28 @@
 			}
 		},
 		"node_modules/eslint-config-wikimedia": {
-			"version": "0.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz",
-			"integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==",
+			"version": "0.27.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.27.0.tgz",
+			"integrity": "sha512-KkZ54+MUnggz17C/RCEMXQSpiiqZRF7p9fjrz4phaaeKlTrjg0B+QbM5zcDWcjGiAWaJUptHaH17+RZldadkUw==",
 			"dev": true,
 			"dependencies": {
-				"browserslist-config-wikimedia": "^0.5.1",
-				"eslint": "^8.53.0",
+				"browserslist-config-wikimedia": "^0.6.1",
+				"eslint": "^8.57.0",
 				"eslint-plugin-compat": "^4.2.0",
-				"eslint-plugin-es-x": "^7.3.0",
-				"eslint-plugin-jest": "^27.6.0",
-				"eslint-plugin-jsdoc": "^42.0.0",
+				"eslint-plugin-es-x": "^7.6.0",
+				"eslint-plugin-jest": "^27.9.0",
+				"eslint-plugin-jsdoc": "48.2.1",
 				"eslint-plugin-json-es": "^1.5.7",
-				"eslint-plugin-mediawiki": "^0.5.0",
-				"eslint-plugin-mocha": "^10.2.0",
-				"eslint-plugin-n": "^16.0.1",
+				"eslint-plugin-mediawiki": "^0.6.0",
+				"eslint-plugin-mocha": "^10.4.1",
+				"eslint-plugin-n": "^16.6.2",
 				"eslint-plugin-no-jquery": "^2.7.0",
-				"eslint-plugin-qunit": "^7.3.4",
+				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^47.0.0",
-				"eslint-plugin-vue": "^9.18.1",
-				"eslint-plugin-wdio": "^7.19.4",
-				"eslint-plugin-yml": "^1.10.0"
+				"eslint-plugin-unicorn": "^51.0.1",
+				"eslint-plugin-vue": "^9.23.0",
+				"eslint-plugin-wdio": "^8.24.12",
+				"eslint-plugin-yml": "^1.13.2"
 			}
 		},
 		"node_modules/eslint-plugin-compat": {
@@ -1509,14 +1525,14 @@
 			}
 		},
 		"node_modules/eslint-plugin-es-x": {
-			"version": "7.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz",
-			"integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz",
+			"integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.1.2",
 				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.1.2"
+				"eslint-compat-utils": "^0.5.0"
 			},
 			"engines": {
 				"node": "^14.18.0 || >=16.0.0"
@@ -1529,9 +1545,9 @@
 			}
 		},
 		"node_modules/eslint-plugin-jest": {
-			"version": "27.6.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz",
-			"integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==",
+			"version": "27.9.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz",
+			"integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==",
 			"dev": true,
 			"dependencies": {
 				"@typescript-eslint/utils": "^5.10.0"
@@ -1540,7 +1556,7 @@
 				"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
 			},
 			"peerDependencies": {
-				"@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0",
+				"@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0",
 				"eslint": "^7.0.0 || ^8.0.0",
 				"jest": "*"
 			},
@@ -1554,25 +1570,36 @@
 			}
 		},
 		"node_modules/eslint-plugin-jsdoc": {
-			"version": "42.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz",
-			"integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==",
+			"version": "48.2.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.1.tgz",
+			"integrity": "sha512-iUvbcyDZSO/9xSuRv2HQBw++8VkV/pt3UWtX9cpPH0l7GKPq78QC/6+PmyQHHvNZaTjAce6QVciEbnc6J/zH5g==",
 			"dev": true,
 			"dependencies": {
-				"@es-joy/jsdoccomment": "~0.37.0",
+				"@es-joy/jsdoccomment": "~0.42.0",
 				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"debug": "^4.3.4",
 				"escape-string-regexp": "^4.0.0",
 				"esquery": "^1.5.0",
-				"semver": "^7.3.8",
-				"spdx-expression-parse": "^3.0.1"
+				"is-builtin-module": "^3.2.1",
+				"semver": "^7.6.0",
+				"spdx-expression-parse": "^4.0.0"
 			},
 			"engines": {
-				"node": "^14 || ^16 || ^17 || ^18 || ^19"
+				"node": ">=18"
 			},
 			"peerDependencies": {
-				"eslint": "^7.0.0 || ^8.0.0"
+				"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
+			}
+		},
+		"node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": {
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+			"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
+			"dev": true,
+			"dependencies": {
+				"spdx-exceptions": "^2.1.0",
+				"spdx-license-ids": "^3.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-json-es": {
@@ -1589,69 +1616,26 @@
 			}
 		},
 		"node_modules/eslint-plugin-mediawiki": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.5.0.tgz",
-			"integrity": "sha512-rjkHFyv3VDan/dmu7YpD1Rl9h64NOlz4mqqesRN316R+571+ymmb6lXVOdNMbT8H1iPhmtHc+nijVLVkn7pYDw==",
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.6.0.tgz",
+			"integrity": "sha512-a2Zm18N5nPyflBajM2ZWATxucIpYPEmOSjFzUR1OBH3hAL0GY9fx1mpezEwzqAQ862d+kPkolgQOzktnZe8nKA==",
 			"dev": true,
 			"dependencies": {
-				"eslint-plugin-vue": "^8.7.1",
+				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
 			},
 			"peerDependencies": {
 				"eslint": ">=5.0.0"
 			}
 		},
-		"node_modules/eslint-plugin-mediawiki/node_modules/eslint-plugin-vue": {
-			"version": "8.7.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
-			"integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
-			"dev": true,
-			"dependencies": {
-				"eslint-utils": "^3.0.0",
-				"natural-compare": "^1.4.0",
-				"nth-check": "^2.0.1",
-				"postcss-selector-parser": "^6.0.9",
-				"semver": "^7.3.5",
-				"vue-eslint-parser": "^8.0.1"
-			},
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			},
-			"peerDependencies": {
-				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
-			}
-		},
-		"node_modules/eslint-plugin-mediawiki/node_modules/vue-eslint-parser": {
-			"version": "8.3.0",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
-			"integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
-			"dev": true,
-			"dependencies": {
-				"debug": "^4.3.2",
-				"eslint-scope": "^7.0.0",
-				"eslint-visitor-keys": "^3.1.0",
-				"espree": "^9.0.0",
-				"esquery": "^1.4.0",
-				"lodash": "^4.17.21",
-				"semver": "^7.3.5"
-			},
-			"engines": {
-				"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-			},
-			"funding": {
-				"url": "https://github.com/sponsors/mysticatea"
-			},
-			"peerDependencies": {
-				"eslint": ">=6.0.0"
-			}
-		},
 		"node_modules/eslint-plugin-mocha": {
-			"version": "10.2.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz",
-			"integrity": "sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==",
+			"version": "10.4.3",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
+			"integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
+				"globals": "^13.24.0",
 				"rambda": "^7.4.0"
 			},
 			"engines": {
@@ -1662,15 +1646,16 @@
 			}
 		},
 		"node_modules/eslint-plugin-n": {
-			"version": "16.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.5.0.tgz",
-			"integrity": "sha512-Hw02Bj1QrZIlKyj471Tb1jSReTl4ghIMHGuBGiMVmw+s0jOPbI4CBuYpGbZr+tdQ+VAvSK6FDSta3J4ib/SKHQ==",
+			"version": "16.6.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz",
+			"integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.4.0",
 				"builtins": "^5.0.1",
 				"eslint-plugin-es-x": "^7.5.0",
 				"get-tsconfig": "^4.7.0",
+				"globals": "^13.24.0",
 				"ignore": "^5.2.4",
 				"is-builtin-module": "^3.2.1",
 				"is-core-module": "^2.12.1",
@@ -1698,16 +1683,16 @@
 			}
 		},
 		"node_modules/eslint-plugin-qunit": {
-			"version": "7.3.4",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz",
-			"integrity": "sha512-EbDM0zJerH9zVdUswMJpcFF7wrrpvsGuYfNexUpa5hZkkdFhaFcX+yD+RSK4Nrauw4psMGlcqeWUMhaVo+Manw==",
+			"version": "8.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
+			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
 			"dev": true,
 			"dependencies": {
 				"eslint-utils": "^3.0.0",
 				"requireindex": "^1.2.0"
 			},
 			"engines": {
-				"node": "12.x || 14.x || >=16.0.0"
+				"node": "^16.0.0 || ^18.0.0 || >=20.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-security": {
@@ -1720,26 +1705,26 @@
 			}
 		},
 		"node_modules/eslint-plugin-unicorn": {
-			"version": "47.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz",
-			"integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==",
+			"version": "51.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz",
+			"integrity": "sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw==",
 			"dev": true,
 			"dependencies": {
-				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/helper-validator-identifier": "^7.22.20",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"ci-info": "^3.8.0",
+				"@eslint/eslintrc": "^2.1.4",
+				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
+				"core-js-compat": "^3.34.0",
 				"esquery": "^1.5.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.1",
 				"jsesc": "^3.0.2",
-				"lodash": "^4.17.21",
 				"pluralize": "^8.0.0",
 				"read-pkg-up": "^7.0.1",
-				"regexp-tree": "^0.1.24",
+				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"safe-regex": "^2.1.1",
-				"semver": "^7.3.8",
+				"semver": "^7.5.4",
 				"strip-indent": "^3.0.0"
 			},
 			"engines": {
@@ -1749,47 +1734,48 @@
 				"url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
 			},
 			"peerDependencies": {
-				"eslint": ">=8.38.0"
+				"eslint": ">=8.56.0"
 			}
 		},
 		"node_modules/eslint-plugin-vue": {
-			"version": "9.19.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.19.2.tgz",
-			"integrity": "sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==",
+			"version": "9.25.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz",
+			"integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==",
 			"dev": true,
 			"dependencies": {
 				"@eslint-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
-				"postcss-selector-parser": "^6.0.13",
-				"semver": "^7.5.4",
-				"vue-eslint-parser": "^9.3.1",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"vue-eslint-parser": "^9.4.2",
 				"xml-name-validator": "^4.0.0"
 			},
 			"engines": {
 				"node": "^14.17.0 || >=16.0.0"
 			},
 			"peerDependencies": {
-				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+				"eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
 			}
 		},
 		"node_modules/eslint-plugin-wdio": {
-			"version": "7.25.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.25.3.tgz",
-			"integrity": "sha512-2zbYwV14Md9FNlyhaIILVGPB6w4bu2eJdOTywDUs2Qy4ebcQNwrxB0qCaf7Rm4O+T0Ir+tdYHYBBfbDocSLKng==",
+			"version": "8.24.12",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
+			"integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
 			"dev": true,
 			"engines": {
-				"node": ">=12.0.0"
+				"node": "^16.13 || >=18"
 			}
 		},
 		"node_modules/eslint-plugin-yml": {
-			"version": "1.11.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.11.0.tgz",
-			"integrity": "sha512-NBZP1NDGy0u38pY5ieix75jxS9GNOJy9xd4gQa0rU4gWbfEsVhKDwuFaQ6RJpDbv6Lq5TtcAZS/YnAc0oeRw0w==",
+			"version": "1.14.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
+			"integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
 			"dev": true,
 			"dependencies": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.1.1",
+				"eslint-compat-utils": "^0.5.0",
 				"lodash": "^4.17.21",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
@@ -2174,9 +2160,9 @@
 			}
 		},
 		"node_modules/get-tsconfig": {
-			"version": "4.7.2",
-			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
-			"integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
+			"version": "4.7.3",
+			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz",
+			"integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==",
 			"dev": true,
 			"dependencies": {
 				"resolve-pkg-maps": "^1.0.0"
@@ -3778,9 +3764,9 @@
 			}
 		},
 		"node_modules/postcss-selector-parser": {
-			"version": "6.0.13",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
-			"integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+			"version": "6.0.16",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
+			"integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
 			"dev": true,
 			"dependencies": {
 				"cssesc": "^3.0.0",
@@ -4210,9 +4196,9 @@
 			"dev": true
 		},
 		"node_modules/semver": {
-			"version": "7.5.4",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-			"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+			"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
 			"dev": true,
 			"dependencies": {
 				"lru-cache": "^6.0.0"
@@ -5079,9 +5065,9 @@
 			}
 		},
 		"node_modules/vue-eslint-parser": {
-			"version": "9.3.2",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz",
-			"integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==",
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
+			"integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
 			"dev": true,
 			"dependencies": {
 				"debug": "^4.3.4",
@@ -5187,10 +5173,13 @@
 			"dev": true
 		},
 		"node_modules/yaml": {
-			"version": "2.3.4",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-			"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+			"version": "2.4.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
+			"integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
 			"dev": true,
+			"bin": {
+				"yaml": "bin.mjs"
+			},
 			"engines": {
 				"node": ">= 14"
 			}
@@ -5430,12 +5419,12 @@
 			"requires": {}
 		},
 		"@es-joy/jsdoccomment": {
-			"version": "0.37.1",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz",
-			"integrity": "sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg==",
+			"version": "0.42.0",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.42.0.tgz",
+			"integrity": "sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==",
 			"dev": true,
 			"requires": {
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"esquery": "^1.5.0",
 				"jsdoc-type-pratt-parser": "~4.0.0"
 			}
@@ -5473,19 +5462,19 @@
 			}
 		},
 		"@eslint/js": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
-			"integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
+			"integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
 			"dev": true
 		},
 		"@humanwhocodes/config-array": {
-			"version": "0.11.13",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz",
-			"integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==",
+			"version": "0.11.14",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+			"integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
 			"dev": true,
 			"requires": {
-				"@humanwhocodes/object-schema": "^2.0.1",
-				"debug": "^4.1.1",
+				"@humanwhocodes/object-schema": "^2.0.2",
+				"debug": "^4.3.1",
 				"minimatch": "^3.0.5"
 			}
 		},
@@ -5496,9 +5485,9 @@
 			"dev": true
 		},
 		"@humanwhocodes/object-schema": {
-			"version": "2.0.1",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz",
-			"integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==",
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+			"integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
 			"dev": true
 		},
 		"@mdn/browser-compat-data": {
@@ -5558,9 +5547,9 @@
 			"dev": true
 		},
 		"@types/semver": {
-			"version": "7.5.6",
-			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz",
-			"integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==",
+			"version": "7.5.8",
+			"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+			"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
 			"dev": true
 		},
 		"@typescript-eslint/scope-manager": {
@@ -5785,21 +5774,21 @@
 			}
 		},
 		"browserslist": {
-			"version": "4.22.2",
-			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
-			"integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+			"version": "4.23.0",
+			"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+			"integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
 			"dev": true,
 			"requires": {
-				"caniuse-lite": "^1.0.30001565",
-				"electron-to-chromium": "^1.4.601",
+				"caniuse-lite": "^1.0.30001587",
+				"electron-to-chromium": "^1.4.668",
 				"node-releases": "^2.0.14",
 				"update-browserslist-db": "^1.0.13"
 			}
 		},
 		"browserslist-config-wikimedia": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.5.1.tgz",
-			"integrity": "sha512-jf532fUf/gaxiKdHgGCQUT552P5up3RpG+CzLixOQBJ5FwDmYQSRLYHCFUA9s3KMOHh4P3xVp+NUaGNxvtoT9g==",
+			"version": "0.6.1",
+			"resolved": "https://registry.npmjs.org/browserslist-config-wikimedia/-/browserslist-config-wikimedia-0.6.1.tgz",
+			"integrity": "sha512-F3O+12ud7ZwBaiB/RZIMGDgz3nEuXz8RhtdPB4Lkd/WVP5Vy77EqBWRMz4vJ64x8LTTH3BOaHCD2ZuUcgShqyQ==",
 			"dev": true
 		},
 		"builtin-modules": {
@@ -5809,9 +5798,9 @@
 			"dev": true
 		},
 		"builtins": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
-			"integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
+			"version": "5.1.0",
+			"resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz",
+			"integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==",
 			"dev": true,
 			"requires": {
 				"semver": "^7.0.0"
@@ -5850,9 +5839,9 @@
 			}
 		},
 		"caniuse-lite": {
-			"version": "1.0.30001570",
-			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz",
-			"integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==",
+			"version": "1.0.30001612",
+			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz",
+			"integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==",
 			"dev": true
 		},
 		"chalk": {
@@ -5866,9 +5855,9 @@
 			}
 		},
 		"ci-info": {
-			"version": "3.9.0",
-			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
-			"integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+			"version": "4.0.0",
+			"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz",
+			"integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==",
 			"dev": true
 		},
 		"clean-regexp": {
@@ -5927,9 +5916,9 @@
 			"dev": true
 		},
 		"comment-parser": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz",
-			"integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==",
+			"version": "1.4.1",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+			"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
 			"dev": true
 		},
 		"concat-map": {
@@ -5938,6 +5927,15 @@
 			"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 			"dev": true
 		},
+		"core-js-compat": {
+			"version": "3.37.0",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz",
+			"integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==",
+			"dev": true,
+			"requires": {
+				"browserslist": "^4.23.0"
+			}
+		},
 		"core-util-is": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
@@ -6175,9 +6173,9 @@
 			}
 		},
 		"electron-to-chromium": {
-			"version": "1.4.615",
-			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz",
-			"integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==",
+			"version": "1.4.750",
+			"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.750.tgz",
+			"integrity": "sha512-9ItEpeu15hW5m8jKdriL+BQrgwDTXEL9pn4SkillWFu73ZNNNQ2BKKLS+ZHv2vC9UkNhosAeyfxOf/5OSeTCPA==",
 			"dev": true
 		},
 		"emoji-regex": {
@@ -6214,16 +6212,16 @@
 			"dev": true
 		},
 		"eslint": {
-			"version": "8.56.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
-			"integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+			"version": "8.57.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
+			"integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.2.0",
 				"@eslint-community/regexpp": "^4.6.1",
 				"@eslint/eslintrc": "^2.1.4",
-				"@eslint/js": "8.56.0",
-				"@humanwhocodes/config-array": "^0.11.13",
+				"@eslint/js": "8.57.0",
+				"@humanwhocodes/config-array": "^0.11.14",
 				"@humanwhocodes/module-importer": "^1.0.1",
 				"@nodelib/fs.walk": "^1.2.8",
 				"@ungap/structured-clone": "^1.2.0",
@@ -6260,35 +6258,37 @@
 			}
 		},
 		"eslint-compat-utils": {
-			"version": "0.1.2",
-			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.1.2.tgz",
-			"integrity": "sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==",
+			"version": "0.5.0",
+			"resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz",
+			"integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==",
 			"dev": true,
-			"requires": {}
+			"requires": {
+				"semver": "^7.5.4"
+			}
 		},
 		"eslint-config-wikimedia": {
-			"version": "0.26.0",
-			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.26.0.tgz",
-			"integrity": "sha512-TAXTySls9k3oWs754rIjlcd9PBLvYeMvjqjiuU8u4gweu0UDgBJGslf+zcvVNXEooAtyLZdENjrzDDjG8ssS7Q==",
+			"version": "0.27.0",
+			"resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.27.0.tgz",
+			"integrity": "sha512-KkZ54+MUnggz17C/RCEMXQSpiiqZRF7p9fjrz4phaaeKlTrjg0B+QbM5zcDWcjGiAWaJUptHaH17+RZldadkUw==",
 			"dev": true,
 			"requires": {
-				"browserslist-config-wikimedia": "^0.5.1",
-				"eslint": "^8.53.0",
+				"browserslist-config-wikimedia": "^0.6.1",
+				"eslint": "^8.57.0",
 				"eslint-plugin-compat": "^4.2.0",
-				"eslint-plugin-es-x": "^7.3.0",
-				"eslint-plugin-jest": "^27.6.0",
-				"eslint-plugin-jsdoc": "^42.0.0",
+				"eslint-plugin-es-x": "^7.6.0",
+				"eslint-plugin-jest": "^27.9.0",
+				"eslint-plugin-jsdoc": "48.2.1",
 				"eslint-plugin-json-es": "^1.5.7",
-				"eslint-plugin-mediawiki": "^0.5.0",
-				"eslint-plugin-mocha": "^10.2.0",
-				"eslint-plugin-n": "^16.0.1",
+				"eslint-plugin-mediawiki": "^0.6.0",
+				"eslint-plugin-mocha": "^10.4.1",
+				"eslint-plugin-n": "^16.6.2",
 				"eslint-plugin-no-jquery": "^2.7.0",
-				"eslint-plugin-qunit": "^7.3.4",
+				"eslint-plugin-qunit": "^8.1.1",
 				"eslint-plugin-security": "^1.7.1",
-				"eslint-plugin-unicorn": "^47.0.0",
-				"eslint-plugin-vue": "^9.18.1",
-				"eslint-plugin-wdio": "^7.19.4",
-				"eslint-plugin-yml": "^1.10.0"
+				"eslint-plugin-unicorn": "^51.0.1",
+				"eslint-plugin-vue": "^9.23.0",
+				"eslint-plugin-wdio": "^8.24.12",
+				"eslint-plugin-yml": "^1.13.2"
 			}
 		},
 		"eslint-plugin-compat": {
@@ -6307,39 +6307,52 @@
 			}
 		},
 		"eslint-plugin-es-x": {
-			"version": "7.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.5.0.tgz",
-			"integrity": "sha512-ODswlDSO0HJDzXU0XvgZ3lF3lS3XAZEossh15Q2UHjwrJggWeBoKqqEsLTZLXl+dh5eOAozG0zRcYtuE35oTuQ==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz",
+			"integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.1.2",
 				"@eslint-community/regexpp": "^4.6.0",
-				"eslint-compat-utils": "^0.1.2"
+				"eslint-compat-utils": "^0.5.0"
 			}
 		},
 		"eslint-plugin-jest": {
-			"version": "27.6.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.0.tgz",
-			"integrity": "sha512-MTlusnnDMChbElsszJvrwD1dN3x6nZl//s4JD23BxB6MgR66TZlL064su24xEIS3VACfAoHV1vgyMgPw8nkdng==",
+			"version": "27.9.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz",
+			"integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==",
 			"dev": true,
 			"requires": {
 				"@typescript-eslint/utils": "^5.10.0"
 			}
 		},
 		"eslint-plugin-jsdoc": {
-			"version": "42.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-42.0.0.tgz",
-			"integrity": "sha512-qXYr45G8atPKowZbIOdmABukMzu9IMjAlj6j5Fe0iuUItznWSXUDiBj57ejXcbt8bkPrg83333nuz+cqGKFgcQ==",
+			"version": "48.2.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-48.2.1.tgz",
+			"integrity": "sha512-iUvbcyDZSO/9xSuRv2HQBw++8VkV/pt3UWtX9cpPH0l7GKPq78QC/6+PmyQHHvNZaTjAce6QVciEbnc6J/zH5g==",
 			"dev": true,
 			"requires": {
-				"@es-joy/jsdoccomment": "~0.37.0",
+				"@es-joy/jsdoccomment": "~0.42.0",
 				"are-docs-informative": "^0.0.2",
-				"comment-parser": "1.3.1",
+				"comment-parser": "1.4.1",
 				"debug": "^4.3.4",
 				"escape-string-regexp": "^4.0.0",
 				"esquery": "^1.5.0",
-				"semver": "^7.3.8",
-				"spdx-expression-parse": "^3.0.1"
+				"is-builtin-module": "^3.2.1",
+				"semver": "^7.6.0",
+				"spdx-expression-parse": "^4.0.0"
+			},
+			"dependencies": {
+				"spdx-expression-parse": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+					"integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
+					"dev": true,
+					"requires": {
+						"spdx-exceptions": "^2.1.0",
+						"spdx-license-ids": "^3.0.0"
+					}
+				}
 			}
 		},
 		"eslint-plugin-json-es": {
@@ -6353,66 +6366,37 @@
 			}
 		},
 		"eslint-plugin-mediawiki": {
-			"version": "0.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.5.0.tgz",
-			"integrity": "sha512-rjkHFyv3VDan/dmu7YpD1Rl9h64NOlz4mqqesRN316R+571+ymmb6lXVOdNMbT8H1iPhmtHc+nijVLVkn7pYDw==",
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mediawiki/-/eslint-plugin-mediawiki-0.6.0.tgz",
+			"integrity": "sha512-a2Zm18N5nPyflBajM2ZWATxucIpYPEmOSjFzUR1OBH3hAL0GY9fx1mpezEwzqAQ862d+kPkolgQOzktnZe8nKA==",
 			"dev": true,
 			"requires": {
-				"eslint-plugin-vue": "^8.7.1",
+				"eslint-plugin-vue": "^9.23.0",
 				"upath": "^2.0.1"
-			},
-			"dependencies": {
-				"eslint-plugin-vue": {
-					"version": "8.7.1",
-					"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
-					"integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
-					"dev": true,
-					"requires": {
-						"eslint-utils": "^3.0.0",
-						"natural-compare": "^1.4.0",
-						"nth-check": "^2.0.1",
-						"postcss-selector-parser": "^6.0.9",
-						"semver": "^7.3.5",
-						"vue-eslint-parser": "^8.0.1"
-					}
-				},
-				"vue-eslint-parser": {
-					"version": "8.3.0",
-					"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
-					"integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
-					"dev": true,
-					"requires": {
-						"debug": "^4.3.2",
-						"eslint-scope": "^7.0.0",
-						"eslint-visitor-keys": "^3.1.0",
-						"espree": "^9.0.0",
-						"esquery": "^1.4.0",
-						"lodash": "^4.17.21",
-						"semver": "^7.3.5"
-					}
-				}
 			}
 		},
 		"eslint-plugin-mocha": {
-			"version": "10.2.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.2.0.tgz",
-			"integrity": "sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==",
+			"version": "10.4.3",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.4.3.tgz",
+			"integrity": "sha512-emc4TVjq5Ht0/upR+psftuz6IBG5q279p+1dSRDeHf+NS9aaerBi3lXKo1SEzwC29hFIW21gO89CEWSvRsi8IQ==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
+				"globals": "^13.24.0",
 				"rambda": "^7.4.0"
 			}
 		},
 		"eslint-plugin-n": {
-			"version": "16.5.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.5.0.tgz",
-			"integrity": "sha512-Hw02Bj1QrZIlKyj471Tb1jSReTl4ghIMHGuBGiMVmw+s0jOPbI4CBuYpGbZr+tdQ+VAvSK6FDSta3J4ib/SKHQ==",
+			"version": "16.6.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz",
+			"integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.4.0",
 				"builtins": "^5.0.1",
 				"eslint-plugin-es-x": "^7.5.0",
 				"get-tsconfig": "^4.7.0",
+				"globals": "^13.24.0",
 				"ignore": "^5.2.4",
 				"is-builtin-module": "^3.2.1",
 				"is-core-module": "^2.12.1",
@@ -6429,9 +6413,9 @@
 			"requires": {}
 		},
 		"eslint-plugin-qunit": {
-			"version": "7.3.4",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.4.tgz",
-			"integrity": "sha512-EbDM0zJerH9zVdUswMJpcFF7wrrpvsGuYfNexUpa5hZkkdFhaFcX+yD+RSK4Nrauw4psMGlcqeWUMhaVo+Manw==",
+			"version": "8.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-qunit/-/eslint-plugin-qunit-8.1.1.tgz",
+			"integrity": "sha512-j3xhiAf2Wvr8Dfwl5T6tlJ+F55vqYE9ZdAHUOTzq1lGerYrXzOS46RvK4SSWug2D8sl3ZYr2lA4/hgVXgLloxw==",
 			"dev": true,
 			"requires": {
 				"eslint-utils": "^3.0.0",
@@ -6448,58 +6432,59 @@
 			}
 		},
 		"eslint-plugin-unicorn": {
-			"version": "47.0.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-47.0.0.tgz",
-			"integrity": "sha512-ivB3bKk7fDIeWOUmmMm9o3Ax9zbMz1Bsza/R2qm46ufw4T6VBFBaJIR1uN3pCKSmSXm8/9Nri8V+iUut1NhQGA==",
+			"version": "51.0.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-51.0.1.tgz",
+			"integrity": "sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.19.1",
+				"@babel/helper-validator-identifier": "^7.22.20",
 				"@eslint-community/eslint-utils": "^4.4.0",
-				"ci-info": "^3.8.0",
+				"@eslint/eslintrc": "^2.1.4",
+				"ci-info": "^4.0.0",
 				"clean-regexp": "^1.0.0",
+				"core-js-compat": "^3.34.0",
 				"esquery": "^1.5.0",
 				"indent-string": "^4.0.0",
 				"is-builtin-module": "^3.2.1",
 				"jsesc": "^3.0.2",
-				"lodash": "^4.17.21",
 				"pluralize": "^8.0.0",
 				"read-pkg-up": "^7.0.1",
-				"regexp-tree": "^0.1.24",
+				"regexp-tree": "^0.1.27",
 				"regjsparser": "^0.10.0",
-				"safe-regex": "^2.1.1",
-				"semver": "^7.3.8",
+				"semver": "^7.5.4",
 				"strip-indent": "^3.0.0"
 			}
 		},
 		"eslint-plugin-vue": {
-			"version": "9.19.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.19.2.tgz",
-			"integrity": "sha512-CPDqTOG2K4Ni2o4J5wixkLVNwgctKXFu6oBpVJlpNq7f38lh9I80pRTouZSJ2MAebPJlINU/KTFSXyQfBUlymA==",
+			"version": "9.25.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz",
+			"integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==",
 			"dev": true,
 			"requires": {
 				"@eslint-community/eslint-utils": "^4.4.0",
+				"globals": "^13.24.0",
 				"natural-compare": "^1.4.0",
 				"nth-check": "^2.1.1",
-				"postcss-selector-parser": "^6.0.13",
-				"semver": "^7.5.4",
-				"vue-eslint-parser": "^9.3.1",
+				"postcss-selector-parser": "^6.0.15",
+				"semver": "^7.6.0",
+				"vue-eslint-parser": "^9.4.2",
 				"xml-name-validator": "^4.0.0"
 			}
 		},
 		"eslint-plugin-wdio": {
-			"version": "7.25.3",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-7.25.3.tgz",
-			"integrity": "sha512-2zbYwV14Md9FNlyhaIILVGPB6w4bu2eJdOTywDUs2Qy4ebcQNwrxB0qCaf7Rm4O+T0Ir+tdYHYBBfbDocSLKng==",
+			"version": "8.24.12",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-wdio/-/eslint-plugin-wdio-8.24.12.tgz",
+			"integrity": "sha512-OmzGteXFOQnJDdkTNnTfksaVa18WlFCyeLjZXHvDpkbomLWAg9wc296Pr0wnTCagqNj8qfEHpy+N2XVew5VCMA==",
 			"dev": true
 		},
 		"eslint-plugin-yml": {
-			"version": "1.11.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.11.0.tgz",
-			"integrity": "sha512-NBZP1NDGy0u38pY5ieix75jxS9GNOJy9xd4gQa0rU4gWbfEsVhKDwuFaQ6RJpDbv6Lq5TtcAZS/YnAc0oeRw0w==",
+			"version": "1.14.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-yml/-/eslint-plugin-yml-1.14.0.tgz",
+			"integrity": "sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.3.2",
-				"eslint-compat-utils": "^0.1.1",
+				"eslint-compat-utils": "^0.5.0",
 				"lodash": "^4.17.21",
 				"natural-compare": "^1.4.0",
 				"yaml-eslint-parser": "^1.2.1"
@@ -6779,9 +6764,9 @@
 			"dev": true
 		},
 		"get-tsconfig": {
-			"version": "4.7.2",
-			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz",
-			"integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==",
+			"version": "4.7.3",
+			"resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz",
+			"integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==",
 			"dev": true,
 			"requires": {
 				"resolve-pkg-maps": "^1.0.0"
@@ -7981,9 +7966,9 @@
 			"requires": {}
 		},
 		"postcss-selector-parser": {
-			"version": "6.0.13",
-			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
-			"integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+			"version": "6.0.16",
+			"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
+			"integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
 			"dev": true,
 			"requires": {
 				"cssesc": "^3.0.0",
@@ -8270,9 +8255,9 @@
 			"dev": true
 		},
 		"semver": {
-			"version": "7.5.4",
-			"resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
-			"integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+			"version": "7.6.0",
+			"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+			"integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
 			"dev": true,
 			"requires": {
 				"lru-cache": "^6.0.0"
@@ -8943,9 +8928,9 @@
 			}
 		},
 		"vue-eslint-parser": {
-			"version": "9.3.2",
-			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz",
-			"integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==",
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
+			"integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.3.4",
@@ -9018,9 +9003,9 @@
 			"dev": true
 		},
 		"yaml": {
-			"version": "2.3.4",
-			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
-			"integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+			"version": "2.4.1",
+			"resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz",
+			"integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==",
 			"dev": true
 		},
 		"yaml-eslint-parser": {
diff --git a/package.json b/package.json
index 8815f3b..689e576 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,7 @@
 		"test": "grunt test"
 	},
 	"devDependencies": {
-		"eslint-config-wikimedia": "0.26.0",
+		"eslint-config-wikimedia": "0.27.0",
 		"grunt": "1.6.1",
 		"grunt-banana-checker": "0.11.1",
 		"grunt-eslint": "24.3.0",
diff --git a/resources/VisualDataForms.js b/resources/VisualDataForms.js
index 11135b1..924a294 100644
--- a/resources/VisualDataForms.js
+++ b/resources/VisualDataForms.js
@@ -22,8 +22,6 @@
 /* eslint-disable no-tabs */
 /* eslint-disable no-unused-vars */
 /* eslint-disable no-underscore-dangle */
-/* eslint-disable es-x/no-async-functions */
-/* eslint-disable compat/compat */
 
 const VisualDataForms = function ( Config, Form, FormID, Schemas, WindowManager ) {
 	var Model = {};
diff --git a/resources/VisualDataProcessModel.js b/resources/VisualDataProcessModel.js
index 97bd790..9bda24d 100644
--- a/resources/VisualDataProcessModel.js
+++ b/resources/VisualDataProcessModel.js
@@ -19,7 +19,6 @@
  * @copyright Copyright © 2023, https://wikisphere.org
  */
 
-/* eslint-disable no-tabs */
 /* eslint-disable no-unused-vars */
 /* eslint-disable no-underscore-dangle */
 
diff --git a/resources/VisualDataWindowManager.js b/resources/VisualDataWindowManager.js
index 9f4b647..aca33ee 100644
--- a/resources/VisualDataWindowManager.js
+++ b/resources/VisualDataWindowManager.js
@@ -20,7 +20,6 @@
  */
 
 // @see https://doc.wikimedia.org/oojs-ui/master/js/
-// eslint-disable-next-line no-unused-vars
 
 // eslint-disable-next-line no-implicit-globals
 VisualDataWindowManager = function () {
-- 
2.39.2


--- end ---

composer dependencies

Dependencies
Development dependencies

npm dependencies

Development dependencies

Logs

Source code is licensed under the AGPL.