$ date
--- stdout ---
Mon Mar 31 07:41:57 UTC 2025
--- 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 ---
0024745c85a96c890366150c10489816571461b9 refs/heads/master
--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
"auditReportVersion": 2,
"vulnerabilities": {
"cross-spawn": {
"name": "cross-spawn",
"severity": "high",
"isDirect": false,
"via": [
{
"source": 1100563,
"name": "cross-spawn",
"dependency": "cross-spawn",
"title": "Regular Expression Denial of Service (ReDoS) in cross-spawn",
"url": "https://github.com/advisories/GHSA-3xgq-45jj-v275",
"severity": "high",
"cwe": [
"CWE-1333"
],
"cvss": {
"score": 7.5,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
},
"range": ">=7.0.0 <7.0.5"
}
],
"effects": [],
"range": "7.0.0 - 7.0.4",
"nodes": [
"node_modules/cross-spawn"
],
"fixAvailable": true
},
"nanoid": {
"name": "nanoid",
"severity": "moderate",
"isDirect": false,
"via": [
{
"source": 1101163,
"name": "nanoid",
"dependency": "nanoid",
"title": "Predictable results in nanoid generation when given non-integer values",
"url": "https://github.com/advisories/GHSA-mwcw-c2x4-8c55",
"severity": "moderate",
"cwe": [
"CWE-835"
],
"cvss": {
"score": 4.3,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N"
},
"range": "<3.3.8"
}
],
"effects": [],
"range": "<3.3.8",
"nodes": [
"node_modules/nanoid"
],
"fixAvailable": true
}
},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 0,
"moderate": 1,
"high": 1,
"critical": 0,
"total": 2
},
"dependencies": {
"prod": 1,
"dev": 422,
"optional": 0,
"peer": 1,
"peerOptional": 0,
"total": 422
}
}
}
--- 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: 22 installs, 0 updates, 0 removals
- Locking composer/semver (3.4.3)
- Locking composer/spdx-licenses (1.5.8)
- Locking dealerdirect/phpcodesniffer-composer-installer (v1.0.0)
- Locking mediawiki/mediawiki-codesniffer (v45.0.0)
- Locking mediawiki/minus-x (1.1.3)
- 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.4.0)
- Locking phpcsstandards/phpcsextra (1.2.1)
- Locking phpcsstandards/phpcsutils (1.0.12)
- Locking psr/container (2.0.2)
- Locking squizlabs/php_codesniffer (3.10.3)
- Locking swaggest/json-diff (v3.12.1)
- Locking symfony/console (v7.2.5)
- Locking symfony/deprecation-contracts (v3.5.1)
- Locking symfony/polyfill-ctype (v1.31.0)
- Locking symfony/polyfill-intl-grapheme (v1.31.0)
- Locking symfony/polyfill-intl-normalizer (v1.31.0)
- Locking symfony/polyfill-mbstring (v1.31.0)
- Locking symfony/polyfill-php80 (v1.31.0)
- Locking symfony/service-contracts (v3.5.1)
- Locking symfony/string (v7.2.0)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 22 installs, 0 updates, 0 removals
- Downloading swaggest/json-diff (v3.12.1)
0/1 [>---------------------------] 0%
1/1 [============================] 100%
- Installing squizlabs/php_codesniffer (3.10.3): Extracting archive
- Installing dealerdirect/phpcodesniffer-composer-installer (v1.0.0): Extracting archive
- Installing symfony/polyfill-php80 (v1.31.0): Extracting archive
- Installing phpcsstandards/phpcsutils (1.0.12): Extracting archive
- Installing phpcsstandards/phpcsextra (1.2.1): Extracting archive
- Installing symfony/polyfill-mbstring (v1.31.0): Extracting archive
- Installing composer/spdx-licenses (1.5.8): Extracting archive
- Installing composer/semver (3.4.3): Extracting archive
- Installing mediawiki/mediawiki-codesniffer (v45.0.0): Extracting archive
- Installing symfony/polyfill-intl-normalizer (v1.31.0): Extracting archive
- Installing symfony/polyfill-intl-grapheme (v1.31.0): Extracting archive
- Installing symfony/polyfill-ctype (v1.31.0): Extracting archive
- Installing symfony/string (v7.2.0): Extracting archive
- Installing symfony/deprecation-contracts (v3.5.1): Extracting archive
- Installing psr/container (2.0.2): Extracting archive
- Installing symfony/service-contracts (v3.5.1): Extracting archive
- Installing symfony/console (v7.2.5): Extracting archive
- Installing mediawiki/minus-x (1.1.3): 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.4.0): Extracting archive
- Installing swaggest/json-diff (v3.12.1): Extracting archive
0/20 [>---------------------------] 0%
20/20 [============================] 100%
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.28.2 -> 0.29.1
Upgrading n:stylelint-config-wikimedia from 0.17.2 -> 0.18.0
$ /usr/bin/npm install
--- stderr ---
npm WARN deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm WARN deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
--- stdout ---
added 404 packages, and audited 405 packages in 5s
92 packages are looking for funding
run `npm fund` for details
1 high severity vulnerability
To address all issues, run:
npm audit fix
Run `npm audit` for details.
--- 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 405 packages in 1s
92 packages are looking for funding
run `npm fund` for details
1 high severity vulnerability
To address all issues, run:
npm audit fix
Run `npm audit` for details.
--- end ---
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json
--- end ---
$ ./node_modules/.bin/eslint i18n/de.json resources/VisualDataProcessModel.js resources/VisualDataWindowManager.js i18n/qqq.json resources/VisualDataSchemas.js resources/Widgets/VisualDataButtonMultiselectWidget.js composer.json resources/VersionCheck.js resources/VisualData.js resources/VisualDataForms.js Gruntfile.js resources/VisualDataMaps.js resources/VisualDataUpload.js resources/VisualDataInputConfig.js resources/Widgets/VisualDataLookupElement.js resources/Widgets/VisualDataDropdownWidget.js package-lock.json resources/Widgets/VisualDataMaptiler.js resources/Widgets/VisualDataVisualEditor.js resources/VisualDataGeolocation.js resources/VisualDataContentBlock.js resources/VisualDataFormField.js resources/slick/main.js resources/Widgets/VisualDataMenuTagSearchMultiselect.js resources/Widgets/VisualDataTinyMCE.js resources/VisualDataFunctions.js extension.json resources/Widgets/VisualDataintlTelInput.js i18n/en.json resources/VisualDataDatatables.js resources/Widgets/VisualDataRatingWidget.js package.json resources/Widgets/VisualDataDateTimeInputWidget.js --fix
--- stdout ---
/src/repo/resources/VersionCheck.js
31:3 error Prefer .then to .done no-jquery/no-done-fail
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/VisualData.js
56:4 error Prefer .then to .done no-jquery/no-done-fail
56:4 error Prefer .then to .fail no-jquery/no-done-fail
92:4 error Prefer .then to .done no-jquery/no-done-fail
92:4 error Prefer .then to .fail no-jquery/no-done-fail
/src/repo/resources/VisualDataDatatables.js
27:6 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
43:1 warning This line has a length of 144. Maximum allowed is 100 max-len
59:1 warning This line has a length of 111. Maximum allowed is 100 max-len
140:1 warning This line has a length of 101. Maximum allowed is 100 max-len
173:3 error Prefer .then to .done no-jquery/no-done-fail
173:3 error Prefer .then to .fail no-jquery/no-done-fail
242:1 warning This line has a length of 112. Maximum allowed is 100 max-len
279:3 error Prefer .then to .done no-jquery/no-done-fail
279:3 error Prefer .then to .fail no-jquery/no-done-fail
358:5 warning Prefer Array#indexOf to $.inArray no-jquery/no-in-array
641:8 warning Prefer Array#indexOf to $.inArray no-jquery/no-in-array
677:8 warning Expected a 'break' statement before 'case' no-fallthrough
681:8 warning Expected a 'break' statement before 'case' no-fallthrough
683:8 warning Expected a 'break' statement before 'case' no-fallthrough
1055:2 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
1072:3 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
/src/repo/resources/VisualDataFormField.js
285:1 warning This line has a length of 108. Maximum allowed is 100 max-len
301:1 warning This line has a length of 135. Maximum allowed is 100 max-len
1048: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
78:6 warning Selector extensions are not allowed no-jquery/no-sizzle
212:5 warning Selector extensions are not allowed no-jquery/no-sizzle
506:1 warning This line has a length of 117. Maximum allowed is 100 max-len
523:1 warning This line has a length of 131. Maximum allowed is 100 max-len
562:5 error Prefer .then to .done no-jquery/no-done-fail
562:5 error Prefer .then to .fail no-jquery/no-done-fail
893:5 error Prefer .then to .fail no-jquery/no-done-fail
1353:4 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
1355:26 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1433:6 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1436:7 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1439:7 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1468:7 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1471:8 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1474:8 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
2120:5 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
2277:1 warning This line has a length of 107. Maximum allowed is 100 max-len
2453:1 warning This line has a length of 109. Maximum allowed is 100 max-len
2785:1 warning This line has a length of 102. Maximum allowed is 100 max-len
2803:7 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
2971:9 error Prefer .then to .done no-jquery/no-done-fail
2971:9 error Prefer .then to .fail no-jquery/no-done-fail
2976:1 warning This line has a length of 102. Maximum allowed is 100 max-len
3100:10 warning Selector extensions are not allowed no-jquery/no-sizzle
3243:1 warning This line has a length of 108. Maximum allowed is 100 max-len
3248:1 warning This line has a length of 105. Maximum allowed is 100 max-len
3466:15 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
3490:1 warning This line has a length of 119. Maximum allowed is 100 max-len
3537: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
840:1 warning This line has a length of 110. Maximum allowed is 100 max-len
/src/repo/resources/VisualDataMaps.js
35:1 warning This line has a length of 108. Maximum allowed is 100 max-len
119:2 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
/src/repo/resources/VisualDataProcessModel.js
199:1 warning This line has a length of 116. Maximum allowed is 100 max-len
203:11 warning Selector extensions are not allowed no-jquery/no-sizzle
/src/repo/resources/VisualDataSchemas.js
328:1 warning This line has a length of 103. Maximum allowed is 100 max-len
643:8 error Prefer .then to .done no-jquery/no-done-fail
643:8 error Prefer .then to .fail no-jquery/no-done-fail
1615:15 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
1792:4 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
1795:15 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1811:4 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
/src/repo/resources/VisualDataUpload.js
128:3 error Prefer .then to .fail no-jquery/no-done-fail
280:3 error Prefer .then to .done no-jquery/no-done-fail
280:3 error Prefer .then to .fail no-jquery/no-done-fail
369:3 error Prefer .then to .done no-jquery/no-done-fail
369:3 error Prefer .then to .fail no-jquery/no-done-fail
/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
41:9 warning Selector extensions are not allowed no-jquery/no-sizzle
43:4 error Expected an error object to be thrown no-throw-literal
66:1 warning This line has a length of 102. Maximum allowed is 100 max-len
68:1 warning This line has a length of 123. 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/VisualDataTinyMCE.js
39:3 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
39:19 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
66:9 warning Selector extensions are not allowed no-jquery/no-sizzle
68:4 error Expected an error object to be thrown no-throw-literal
/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
67:9 warning Selector extensions are not allowed no-jquery/no-sizzle
68:4 error Expected an error object to be thrown no-throw-literal
/src/repo/resources/Widgets/VisualDataintlTelInput.js
38:7 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
/src/repo/resources/slick/main.js
24:3 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
25:4 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
45:3 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
64:2 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
✖ 100 problems (24 errors, 76 warnings)
--- end ---
$ ./node_modules/.bin/eslint i18n/de.json resources/VisualDataProcessModel.js resources/VisualDataWindowManager.js i18n/qqq.json resources/VisualDataSchemas.js resources/Widgets/VisualDataButtonMultiselectWidget.js composer.json resources/VersionCheck.js resources/VisualData.js resources/VisualDataForms.js Gruntfile.js resources/VisualDataMaps.js resources/VisualDataUpload.js resources/VisualDataInputConfig.js resources/Widgets/VisualDataLookupElement.js resources/Widgets/VisualDataDropdownWidget.js package-lock.json resources/Widgets/VisualDataMaptiler.js resources/Widgets/VisualDataVisualEditor.js resources/VisualDataGeolocation.js resources/VisualDataContentBlock.js resources/VisualDataFormField.js resources/slick/main.js resources/Widgets/VisualDataMenuTagSearchMultiselect.js resources/Widgets/VisualDataTinyMCE.js resources/VisualDataFunctions.js extension.json resources/Widgets/VisualDataintlTelInput.js i18n/en.json resources/VisualDataDatatables.js resources/Widgets/VisualDataRatingWidget.js package.json resources/Widgets/VisualDataDateTimeInputWidget.js -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-done-fail","severity":2,"message":"Prefer .then to .done","line":31,"column":3,"nodeType":"CallExpression","endLine":80,"endColumn":7},{"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":1,"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 = $( '#schemas-wrapper' ).length ?\n\t\t\t\t\t\t\t'#schemas-wrapper' :\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":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":56,"column":4,"nodeType":"CallExpression","endLine":72,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":56,"column":4,"nodeType":"CallExpression","endLine":77,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":92,"column":4,"nodeType":"CallExpression","endLine":106,"endColumn":8},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":92,"column":4,"nodeType":"CallExpression","endLine":111,"endColumn":8}],"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":165,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":75,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":75,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[2331,2382],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":81,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":81,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":109,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":109,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[3377,3424],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":4,"fatalErrorCount":0,"warningCount":0,"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-2024, https://wikisphere.org\n */\n\n/* eslint-disable no-tabs */\n\n// eslint-disable-next-line no-implicit-globals\nVisualData = ( function () {\n\tvar VisualDataForms = [];\n\tvar Schemas = {};\n\tvar Config;\n\n\tfunction matchLoadedData( config, dataToLoad ) {\n\t\treturn dataToLoad.filter( ( x ) => !VisualDataFunctions.inArray( x, config.loadedData ) );\n\t}\n\n\tfunction adjustSchemas( schemas ) {\n\t\t// adjust schema, to ensure it can be handled\n\t\t// @FIXME put in VisualDataSchemas, redesign assignement\n\t\t// to Schemas in VisualDataForms -> loadDataBeforeSelect\n\t\tfor ( var i in schemas ) {\n\t\t\tif ( !( 'wiki' in schemas[ i ] ) ) {\n\t\t\t\tschemas[ i ].wiki = {};\n\t\t\t}\n\t\t\tif ( !( 'name' in schemas[ i ].wiki ) ) {\n\t\t\t\tschemas[ i ].wiki.name = i;\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction loadData( config, dataToLoad ) {\n\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\tvar payload = {\n\t\t\t\taction: 'visualdata-load-data',\n\t\t\t\tdataset: dataToLoad.join( '|' ),\n\t\t\t\t'source-page': mw.config.get( 'wgPageName' ),\n\t\t\t\tformat: 'json'\n\t\t\t};\n\t\t\tnew mw.Api()\n\t\t\t\t.postWithToken( 'csrf', payload )\n\t\t\t\t.done( function ( res ) {\n\t\t\t\t\tif ( payload.action in res ) {\n\t\t\t\t\t\tvar data = res[ payload.action ];\n\t\t\t\t\t\tfor ( var i in data ) {\n\t\t\t\t\t\t\tdata[ i ] = JSON.parse( data[ i ] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( 'schemas' in data ) {\n\t\t\t\t\t\t\tadjustSchemas( data.schemas );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconfig.loadedData = config.loadedData.concat( dataToLoad );\n\t\t\t\t\t\tresolve( data );\n\t\t\t\t\t} else {\n\t\t\t\t\t\treject();\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.fail( function ( res ) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error( 'visualdata-load-data error', res );\n\t\t\t\t\treject( res );\n\t\t\t\t} );\n\t\t} );\n\t\t// *** catch is performed in the calling function\n\t\t// .catch( ( err ) => {\n\t\t// \tVisualDataFunctions.OOUIAlert( `error: ${ err }`, { size: 'medium' } );\n\t\t// } );\n\t}\n\n\tfunction loadSchemas( schemas ) {\n\t\tvar payload = {\n\t\t\taction: 'visualdata-get-schemas',\n\t\t\tschemas: schemas.join( '|' )\n\t\t};\n\t\tvar previousSchemas = VisualDataFunctions.deepCopy( Schemas );\n\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\tnew mw.Api()\n\t\t\t\t.postWithToken( 'csrf', payload )\n\t\t\t\t.done( function ( res ) {\n\t\t\t\t\tif ( payload.action in res ) {\n\t\t\t\t\t\tvar thisSchemas = JSON.parse( res[ payload.action ].schemas );\n\t\t\t\t\t\tadjustSchemas( thisSchemas );\n\t\t\t\t\t\tfor ( var i in thisSchemas ) {\n\t\t\t\t\t\t\tSchemas[ i ] = thisSchemas[ i ];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresolve( thisSchemas );\n\t\t\t\t\t\tfor ( var instance of VisualDataForms ) {\n\t\t\t\t\t\t\tinstance.updateSchemas( previousSchemas, Schemas );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.fail( function ( res ) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error( 'visualdata-get-schemas', res );\n\t\t\t\t\treject( res );\n\t\t\t\t} );\n\t\t} ).catch( ( err ) => {\n\t\t\tVisualDataFunctions.OOUIAlert( `error: ${ err }`, { size: 'medium' } );\n\t\t} );\n\t}\n\n\tfunction setVars( config, schemas, instances ) {\n\t\tConfig = config;\n\t\tSchemas = schemas;\n\t\tVisualDataForms = instances;\n\t}\n\n\tfunction updateSchemas( data, action ) {\n\t\tvar previousSchemas = VisualDataFunctions.deepCopy( Schemas );\n\n\t\tswitch ( action ) {\n\t\t\tcase 'update':\n\t\t\t\tSchemas = jQuery.extend( Schemas, data.schemas );\n\t\t\t\tbreak;\n\n\t\t\tcase 'delete':\n\t\t\t\tif ( data[ 'deleted-schema' ] in Schemas ) {\n\t\t\t\t\tdelete Schemas[ data[ 'deleted-schema' ] ];\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'create':\n\t\t\t\tSchemas = jQuery.extend( Schemas, data.schemas );\n\t\t\t\tSchemas = VisualDataFunctions.sortObjectByKeys( Schemas );\n\t\t\t\tbreak;\n\n\t\t\tcase 'rename':\n\t\t\t\tdelete Schemas[ data[ 'previous-label' ] ];\n\t\t\t\tSchemas = jQuery.extend( Schemas, data.schemas );\n\t\t\t\tSchemas = VisualDataFunctions.sortObjectByKeys( Schemas );\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( Config.context !== 'ManageSchemas' ) {\n\t\t\tfor ( var instance of VisualDataForms ) {\n\t\t\t\tinstance.updateSchemas( previousSchemas, Schemas, data );\n\t\t\t}\n\t\t}\n\n\t\treturn Schemas;\n\t}\n\n\treturn {\n\t\tloadData,\n\t\tloadSchemas,\n\t\tsetVars,\n\t\tupdateSchemas,\n\t\tmatchLoadedData\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/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/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":27,"column":6,"nodeType":"VariableDeclarator","endLine":27,"endColumn":21},{"ruleId":"max-len","severity":1,"message":"This line has a length of 144. Maximum allowed is 100.","line":43,"column":1,"nodeType":"Program","messageId":"max","endLine":43,"endColumn":139},{"ruleId":"max-len","severity":1,"message":"This line has a length of 111. Maximum allowed is 100.","line":59,"column":1,"nodeType":"Program","messageId":"max","endLine":59,"endColumn":100},{"ruleId":"max-len","severity":1,"message":"This line has a length of 101. Maximum allowed is 100.","line":140,"column":1,"nodeType":"Program","messageId":"max","endLine":140,"endColumn":90},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":173,"column":3,"nodeType":"CallExpression","endLine":202,"endColumn":7},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":173,"column":3,"nodeType":"CallExpression","endLine":206,"endColumn":7},{"ruleId":"max-len","severity":1,"message":"This line has a length of 112. Maximum allowed is 100.","line":242,"column":1,"nodeType":"Program","messageId":"max","endLine":242,"endColumn":101},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":279,"column":3,"nodeType":"CallExpression","endLine":293,"endColumn":7},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":279,"column":3,"nodeType":"CallExpression","endLine":297,"endColumn":7},{"ruleId":"no-jquery/no-in-array","severity":1,"message":"Prefer Array#indexOf to $.inArray","line":358,"column":5,"nodeType":"CallExpression","endLine":358,"endColumn":49},{"ruleId":"no-jquery/no-in-array","severity":1,"message":"Prefer Array#indexOf to $.inArray","line":641,"column":8,"nodeType":"CallExpression","endLine":641,"endColumn":53},{"ruleId":"no-fallthrough","severity":1,"message":"Expected a 'break' statement before 'case'.","line":677,"column":8,"nodeType":"SwitchCase","messageId":"case","endLine":677,"endColumn":20},{"ruleId":"no-fallthrough","severity":1,"message":"Expected a 'break' statement before 'case'.","line":681,"column":8,"nodeType":"SwitchCase","messageId":"case","endLine":681,"endColumn":21},{"ruleId":"no-fallthrough","severity":1,"message":"Expected a 'break' statement before 'case'.","line":683,"column":8,"nodeType":"SwitchCase","messageId":"case","endLine":683,"endColumn":21},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1055,"column":2,"nodeType":"CallExpression","endLine":1055,"endColumn":30},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1072,"column":3,"nodeType":"CallExpression","endLine":1072,"endColumn":31}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'obj' is defined but never used.","line":36,"column":33,"nodeType":"Identifier","messageId":"unusedVar","endLine":36,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_iDisplayStart'.","line":104,"column":18,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":104,"endColumn":51,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_iDisplayStart'.","line":144,"column":6,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":144,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":165,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":165,"endColumn":15,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[4582,4618],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":181,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":181,"endColumn":17,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[4957,4987],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":183,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":183,"endColumn":17,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[5037,5063],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":205,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":205,"endColumn":18,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[5588,5640],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":271,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":271,"endColumn":15,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[7498,7534],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":287,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":287,"endColumn":17,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[7875,7907],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":289,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":289,"endColumn":17,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[7957,7983],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":296,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":296,"endColumn":18,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[8100,8158],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":591,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":591,"endColumn":15,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[15873,15911],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'e' is defined but never used.","line":799,"column":24,"nodeType":"Identifier","messageId":"unusedVar","endLine":799,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'dt' is defined but never used.","line":799,"column":27,"nodeType":"Identifier","messageId":"unusedVar","endLine":799,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'node' is defined but never used.","line":799,"column":31,"nodeType":"Identifier","messageId":"unusedVar","endLine":799,"endColumn":35,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'config' is defined but never used.","line":799,"column":37,"nodeType":"Identifier","messageId":"unusedVar","endLine":799,"endColumn":43,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":838,"column":9,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":838,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'settings' is defined but never used.","line":905,"column":34,"nodeType":"Identifier","messageId":"unusedVar","endLine":905,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'settings' is defined but never used.","line":984,"column":51,"nodeType":"Identifier","messageId":"unusedVar","endLine":984,"endColumn":59,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":1016,"column":8,"nodeType":"MemberExpression","messageId":"unexpected","endLine":1016,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[27155,27199],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":1037,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":1037,"endColumn":15,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[27547,27575],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-new","severity":2,"message":"Do not use 'new' for side effects.","line":1074,"column":4,"nodeType":"ExpressionStatement","messageId":"noNewStatement","endLine":1074,"endColumn":44,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":4,"fatalErrorCount":0,"warningCount":12,"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-2025, https://wikisphere.org\n */\n\n/* eslint-disable no-unused-vars */\n\nconst VisualDataDatatables = function ( el, elIndex ) {\n\tvar Datatable;\n\tvar CacheLimit = 40000;\n\tvar Table = $( el );\n\tvar TableData = Table.data();\n\tvar SynchInterval;\n\tvar FaviconHref;\n\tvar DatatableLibrary = $.fn.dataTable.ext;\n\tvar PreloadData = {};\n\tvar Count;\n\tvar ElIndex = elIndex;\n\n\tvar getCacheLimit = function ( obj ) {\n\t\treturn CacheLimit;\n\t};\n\n\tvar getCacheKey = function ( obj ) {\n\t\t// this ensures that the preload key\n\t\t// and the dynamic key match\n\t\t// this does not work: \"searchPanes\" in obj && Object.entries(obj.searchPanes).find(x => Object.keys(x).length ) ? obj.searchPanes : {},\n\t\tif ( 'searchPanes' in obj ) {\n\t\t\tfor ( var i in obj.searchPanes ) {\n\t\t\t\tif ( !Object.keys( obj.searchPanes[ i ] ).length ) {\n\t\t\t\t\tdelete obj.searchPanes[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn objectHash.sha1( {\n\t\t\torder: obj.order.map( ( x ) => {\n\t\t\t\treturn { column: x.column, dir: x.dir };\n\t\t\t} ),\n\t\t\t// search: obj.search,\n\t\t\tsearchPanes:\n\t\t\t\t'searchPanes' in obj &&\n\t\t\t\tVisualDataFunctions.objectEntries( obj.searchPanes ).find( ( x ) => Object.keys( x ).length ) ?\n\t\t\t\t\tobj.searchPanes :\n\t\t\t\t\t{},\n\t\t\tsearchBuilder: 'searchBuilder' in obj ? obj.searchBuilder : {}\n\t\t} );\n\t};\n\n\tvar getCacheData = function ( cacheKey, datatableData ) {\n\t\tif ( !( cacheKey in PreloadData ) ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tvar data = [];\n\t\tfor ( var i = datatableData.start; i < datatableData.start + datatableData.length; i++ ) {\n\t\t\tif ( i >= Count ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !( i in PreloadData[ cacheKey ].data ) ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tdata.push( PreloadData[ cacheKey ].data[ i ] );\n\t\t}\n\n\t\treturn { count: PreloadData[ cacheKey ].count, data };\n\t};\n\n\tvar setCacheData = function ( json ) {\n\t\tvar cacheKey = json.cacheKey;\n\t\tif ( !( cacheKey in PreloadData ) ) {\n\t\t\tPreloadData[ cacheKey ] = { data: {} };\n\t\t}\n\n\t\tvar n = json.start;\n\t\tfor ( var row of json.data ) {\n\t\t\tPreloadData[ cacheKey ].data[ n ] = row;\n\t\t\tn++;\n\t\t}\n\n\t\tPreloadData[ cacheKey ].count = json.recordsFiltered;\n\t};\n\n\t// @credits https://stackoverflow.com/questions/32692618/how-to-export-all-rows-from-datatables-using-ajax\n\tvar exportAction = function ( e1, dt, button, config ) {\n\t\tvar self = this;\n\t\t// eslint-disable-next-line no-underscore-dangle\n\t\tvar oldStart = dt.settings()[ 0 ]._iDisplayStart;\n\t\tvar buttonClass = config.className.split( ' ' ).shift();\n\n\t\tvar funcName = null;\n\t\tswitch ( buttonClass ) {\n\t\t\tcase 'buttons-copy':\n\t\t\t\tfuncName = 'copyHtml5';\n\t\t\t\tbreak;\n\t\t\tcase 'buttons-excel':\n\t\t\t\tfuncName = ( DatatableLibrary.buttons.excelHtml5.available( dt, config ) ? 'excelHtml5' : 'excelFlash' );\n\t\t\t\tbreak;\n\t\t\tcase 'buttons-csv':\n\t\t\t\tfuncName = ( DatatableLibrary.buttons.csvHtml5.available( dt, config ) ? 'csvHtml5' : 'csvFlash' );\n\t\t\t\tbreak;\n\t\t\tcase 'buttons-pdf':\n\t\t\t\tfuncName = ( DatatableLibrary.buttons.pdfHtml5.available( dt, config ) ? 'pdfHtml5' : 'pdfFlash' );\n\t\t\t\tbreak;\n\t\t\tcase 'buttons-print':\n\t\t\t\tfuncName = 'print';\n\t\t\t\tbreak;\n\t\t}\n\n\t\tvar cb = function () {\n\t\t\tbutton.removeClass( 'processing' );\n\t\t};\n\n\t\tif ( !funcName ) {\n\t\t\tcb();\n\t\t\treturn;\n\t\t}\n\n\t\tdt.one( 'preXhr', function ( e2, s, data ) {\n\t\t\tdata.start = 0;\n\t\t\tdata.length = TableData.count;\n\n\t\t\tdt.one( 'preDraw', function ( e3, settings ) {\n\t\t\t\tDatatableLibrary.buttons[ funcName ].action.call( self, e3, dt, button, config, cb );\n\n\t\t\t\tdt.one( 'preXhr', function ( e4, s1, data1 ) {\n\t\t\t\t\t// eslint-disable-next-line no-underscore-dangle\n\t\t\t\t\tsettings._iDisplayStart = oldStart;\n\t\t\t\t\tdata1.start = oldStart;\n\t\t\t\t} );\n\n\t\t\t\tsetTimeout( dt.ajax.reload, 0 );\n\t\t\t\treturn false;\n\t\t\t} );\n\n\t\t} );\n\n\t\tdt.ajax.reload();\n\t};\n\n\tvar callApi = function (\n\t\tdata,\n\t\tcallback,\n\t\tsearchPanesOptions,\n\t\tdisplayLog\n\t) {\n\t\tif ( displayLog ) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log( 'payload data', data );\n\t\t}\n\n\t\tvar payload = {\n\t\t\taction: 'visualdata-datatables',\n\t\t\tdata: JSON.stringify( data )\n\t\t};\n\n\t\tnew mw.Api()\n\t\t\t.postWithToken( 'csrf', payload )\n\t\t\t.done( function ( res ) {\n\t\t\t\tvar json = res[ payload.action ].result;\n\t\t\t\tvar log = res[ payload.action ].log;\n\n\t\t\t\tif ( displayLog ) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.log( 'result', json );\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.log( 'log', log );\n\t\t\t\t}\n\n\t\t\t\t// cache all retrieved rows for each sorting\n\t\t\t\t// dimension (column/dir), up to a fixed\n\t\t\t\t// threshold (CacheLimit)\n\t\t\t\tif ( json.cacheKey ) {\n\t\t\t\t\tsetCacheData( json );\n\t\t\t\t}\n\n\t\t\t\t// we retrieve more than \"length\"\n\t\t\t\t// expected by datatables, so return the\n\t\t\t\t// sliced result\n\t\t\t\tjson.data = json.data.slice( 0, json.datalength );\n\t\t\t\tjson.searchPanes = {\n\t\t\t\t\toptions: searchPanesOptions\n\t\t\t\t};\n\n\t\t\t\tcallback( json );\n\t\t\t} )\n\t\t\t.fail( function ( error ) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error( 'visualdata-datatables-api', error );\n\t\t\t} );\n\t};\n\n\tvar restoreBadge = function () {\n\t\tfunction drawBadge( favicon ) {\n\t\t\tif ( favicon ) {\n\t\t\t\tfavicon.parentNode.removeChild( favicon );\n\t\t\t}\n\t\t\tvar newLink = document.createElement( 'link' );\n\t\t\tnewLink.href = FaviconHref;\n\t\t\tnewLink.rel = 'icon';\n\t\t\tdocument.head.appendChild( newLink );\n\t\t}\n\t\tif ( FaviconHref ) {\n\t\t\tvar link = document.querySelector( \"link[rel~='icon']\" );\n\t\t\tdrawBadge( link );\n\t\t}\n\t};\n\n\t// @credits https://www.sitelint.com/blog/add-a-badge-to-the-browser-tab-favicon-using-javascript\n\t// @credits https://stackoverflow.com/questions/260857/changing-website-favicon-dynamically\n\tvar addBadge = function () {\n\t\tdocument.head = document.head || document.getElementsByTagName( 'head' )[ 0 ];\n\n\t\tfunction drawBadge( favicon ) {\n\t\t\tconst faviconSize = 32;\n\t\t\tconst canvas = document.createElement( 'canvas' );\n\t\t\tcanvas.width = faviconSize;\n\t\t\tcanvas.height = faviconSize;\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tconst img = document.createElement( 'img' );\n\n\t\t\tconst createBadge = () => {\n\t\t\t\tcontext.drawImage( img, 0, 0, faviconSize, faviconSize );\n\n\t\t\t\tcontext.beginPath();\n\t\t\t\tcontext.arc( canvas.width - faviconSize / 6, faviconSize / 6, faviconSize / 6, 0, 2 * Math.PI );\n\t\t\t\tcontext.fillStyle = '#e30';\n\t\t\t\tcontext.fill();\n\n\t\t\t\tif ( favicon ) {\n\t\t\t\t\tfavicon.parentNode.removeChild( favicon );\n\t\t\t\t}\n\t\t\t\tvar newIcon = document.createElement( 'link' );\n\t\t\t\tnewIcon.href = canvas.toDataURL( 'image/png' );\n\t\t\t\tnewIcon.rel = 'icon';\n\t\t\t\tdocument.head.appendChild( newIcon );\n\t\t\t};\n\n\t\t\timg.addEventListener( 'load', createBadge );\n\t\t\timg.src = favicon.href;\n\t\t\tFaviconHref = favicon.href;\n\t\t}\n\n\t\tvar link = document.querySelector( \"link[rel~='icon']\" );\n\t\tdrawBadge( link );\n\t};\n\n\tvar callApiSynch = function (\n\t\tdata,\n\t\tcallback,\n\t\tdisplayLog\n\t) {\n\t\tif ( displayLog ) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log( 'payload data', data );\n\t\t}\n\n\t\tvar payload = {\n\t\t\taction: 'visualdata-datatables',\n\t\t\tdata: JSON.stringify( data )\n\t\t};\n\n\t\tnew mw.Api()\n\t\t\t.postWithToken( 'csrf', payload )\n\t\t\t.done( function ( res ) {\n\t\t\t\tvar result = res[ payload.action ].result;\n\t\t\t\tvar log = res[ payload.action ].log;\n\n\t\t\t\tif ( displayLog ) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.log( 'result', result );\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.log( 'log', log );\n\t\t\t\t}\n\n\t\t\t\tcallback( result );\n\t\t\t} )\n\t\t\t.fail( function ( error ) {\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.error( 'visualdata-datatables-api-synch', error );\n\t\t\t} );\n\t};\n\n\tfunction objectValues( obj ) {\n\t\treturn Object.keys( obj ).map( function ( e ) {\n\t\t\treturn obj[ e ];\n\t\t} );\n\t}\n\n\tvar initColumnSort = function ( order, headers ) {\n\t\tvar ret = [];\n\t\t// eg. new_property asc, new_property_2 desc\n\t\tvar values = order.split( /\\s*,\\s*/ );\n\n\t\t// @see QueryProcessor -> getOptions\n\t\tfor ( var i in values ) {\n\t\t\tvar match = values[ i ].match( /^\\s*(.+?)\\s*(ASC|DESC)?\\s*$/i );\n\t\t\tif ( !match ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar propName = match[ 1 ];\n\t\t\tvar sort = match[ 2 ] ? match[ 2 ] : 'ASC';\n\t\t\tvar index = Object.keys( headers ).indexOf( propName );\n\t\t\tif ( index !== -1 ) {\n\t\t\t\tret.push( [ index, sort.toLowerCase() ] );\n\t\t\t}\n\t\t}\n\t\tif ( ret.length > 0 ) {\n\t\t\tTable.data( 'order', ret );\n\t\t} else {\n\t\t\t// default @see https://datatables.net/reference/option/order\n\t\t\tTable.data( 'order', [ [ 0, 'asc' ] ] );\n\t\t}\n\t};\n\n\tvar initSearchPanesColumns = function ( columnDefs, conf ) {\n\t\t// remove non existing columns (starts from 0)\n\t\tif ( 'columns' in conf.searchPanes ) {\n\t\t\tfor ( var i in conf.searchPanes.columns ) {\n\t\t\t\tif ( conf.searchPanes.columns[ i ] >= Object.keys( columnDefs ).length ) {\n\t\t\t\t\tdelete conf.searchPanes.columns[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( var i in columnDefs ) {\n\t\t\tif ( !( 'searchPanes' in columnDefs[ i ] ) ) {\n\t\t\t\tcolumnDefs[ i ].searchPanes = {};\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t'show' in columnDefs[ i ].searchPanes &&\n\t\t\t\tcolumnDefs[ i ].searchPanes.show === false\n\t\t\t) {\n\t\t\t\tdelete columnDefs[ i ].searchPanes;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t'columns' in conf.searchPanes &&\n\t\t\t\tconf.searchPanes.columns.length &&\n\t\t\t\t$.inArray( i * 1, conf.searchPanes.columns ) < 0\n\t\t\t) {\n\t\t\t\tdelete columnDefs[ i ].searchPanes;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcolumnDefs[ i ].searchPanes.show = true;\n\t\t}\n\t};\n\n\t// this is used only if Ajax is disabled\n\tvar getPanesOptions = function ( data, columnDefs, conf ) {\n\t\tvar ret = {};\n\t\tvar dataLength = {};\n\t\tvar div = document.createElement( 'div' );\n\n\t\tfor ( var i in columnDefs ) {\n\t\t\tif ( 'searchPanes' in columnDefs[ i ] ) {\n\t\t\t\tret[ i ] = {};\n\t\t\t\tdataLength[ i ] = 0;\n\t\t\t}\n\t\t}\n\n\t\tfor ( var i in data ) {\n\t\t\tfor ( var ii in ret ) {\n\t\t\t\tvar key = Object.keys( data[ i ] )[ ii ];\n\n\t\t\t\tfor ( var iii in data[ i ][ key ] ) {\n\t\t\t\t\tvar value = data[ i ][ key ][ iii ];\n\n\t\t\t\t\tif ( value === '' ) {\n\t\t\t\t\t\tif ( !conf.searchPanes.showEmpty ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataLength[ ii ]++;\n\t\t\t\t\tvar label;\n\t\t\t\t\tif ( conf.searchPanes.htmlLabels === false ) {\n\t\t\t\t\t\tdiv.innerHTML = value;\n\t\t\t\t\t\tlabel = div.textContent || div.innerText || '';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlabel = value;\n\t\t\t\t\t}\n\n\t\t\t\t\t// this will exclude images as well if\n\t\t\t\t\t// conf.searchPanes.htmlLabels === false\n\t\t\t\t\tif ( label === '' ) {\n\t\t\t\t\t\tif ( !conf.searchPanes.showEmpty ) {\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tlabel = `<i>${ conf.searchPanes.emptyMessage }</i>`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !( value in ret[ key ] ) ) {\n\t\t\t\t\t\tret[ key ][ value ] = {\n\t\t\t\t\t\t\tlabel: label,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\tcount: 0\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tret[ key ][ value ].count++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor ( var i in ret ) {\n\t\t\tvar threshold =\n\t\t\t\t'threshold' in columnDefs[ i ].searchPanes ?\n\t\t\t\t\tcolumnDefs[ i ].searchPanes.threshold :\n\t\t\t\t\tconf.searchPanes.threshold;\n\n\t\t\t// @see https://datatables.net/extensions/searchpanes/examples/initialisation/threshold.htm\n\t\t\t// @see https://github.com/DataTables/SearchPanes/blob/818900b75dba6238bf4b62a204fdd41a9b8944b7/src/SearchPane.ts#L824\n\t\t\t// _uniqueRatio\n\t\t\tvar binLength = Object.keys( ret[ i ] ).length;\n\t\t\t// data.length;\n\t\t\tvar uniqueRatio = binLength / dataLength[ i ];\n\n\t\t\t// || binLength <= 1\n\t\t\tif ( uniqueRatio > threshold ) {\n\t\t\t\tdelete ret[ i ];\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tret[ i ] = objectValues( ret[ i ] ).filter(\n\t\t\t\t( x ) => x.count >= conf.searchPanes.minCount\n\t\t\t);\n\n\t\t\tif ( !ret[ i ].length ) {\n\t\t\t\tdelete ret[ i ];\n\t\t\t}\n\t\t}\n\n\t\tfor ( var i in columnDefs ) {\n\t\t\tif ( !( i in ret ) ) {\n\t\t\t\t// delete columnDefs[i].searchPanes;\n\t\t\t\tcolumnDefs[ i ].searchPanes = { show: false };\n\t\t\t}\n\t\t}\n\n\t\t// *** doesn't have effect\n\t\tfor ( var i in ret ) {\n\t\t\tret[ i ].sort( function ( a, b ) {\n\t\t\t\tif ( a.value === '' && b.value !== '' ) {\n\t\t\t\t\treturn -1;\n\t\t\t\t}\n\t\t\t\tif ( a.value !== '' && b.value === '' ) {\n\t\t\t\t\treturn 1;\n\t\t\t\t}\n\t\t\t\treturn 0;\n\t\t\t} );\n\t\t}\n\n\t\treturn ret;\n\t};\n\n\tvar setPanesOptions = function ( data, searchPanesOptions, columnDefs ) {\n\t\tfor ( let i in searchPanesOptions ) {\n\t\t\t// @see https://datatables.net/reference/option/columns.searchPanes.combiner\n\t\t\tcolumnDefs[ i ].searchPanes.combiner =\n\t\t\t\t'combiner' in columnDefs[ i ].searchPanes ?\n\t\t\t\t\tcolumnDefs[ i ].searchPanes.combiner :\n\t\t\t\t\t'or';\n\t\t\tcolumnDefs[ i ].searchPanes.options = [];\n\n\t\t\t// @see https://datatables.net/reference/option/columns.searchPanes.options\n\t\t\tfor ( let ii in searchPanesOptions[ i ] ) {\n\t\t\t\tcolumnDefs[ i ].searchPanes.options.push( {\n\t\t\t\t\tlabel: searchPanesOptions[ i ][ ii ].label,\n\t\t\t\t\tvalue: function ( rowData, rowIdx ) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tobjectValues( data[ rowIdx ] )[ i ].indexOf(\n\t\t\t\t\t\t\t\tsearchPanesOptions[ i ][ ii ].value ) !== -1\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// @TODO sort panes after rendering using the following\n\t\t\t// https://github.com/DataTables/SearchPanes/blob/master/src/SearchPane.ts\n\t\t}\n\t};\n\n\tvar searchPanesOptionsServer = function (\n\t\tsearchPanesOptions,\n\t\tcolumnDefs,\n\t\tconf,\n\t\theadersRaw\n\t) {\n\t\tfunction indexFromPrintout( printout ) {\n\t\t\tfor ( var thisIndex in columnDefs ) {\n\t\t\t\tif ( columnDefs[ thisIndex ].name === printout ) {\n\t\t\t\t\treturn thisIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn -1;\n\t\t}\n\t\tvar ret = {};\n\t\tfor ( var i in searchPanesOptions ) {\n\t\t\tvar index = indexFromPrintout( i );\n\t\t\tif ( index !== -1 ) {\n\t\t\t\tret[ index ] = searchPanesOptions[ i ];\n\t\t\t}\n\t\t}\n\n\t\tvar div = document.createElement( 'div' );\n\t\tfor ( var i in ret ) {\n\t\t\tif ( !( 'searchPanes' in columnDefs[ i ] ) ) {\n\t\t\t\tcolumnDefs[ i ].searchPanes = {};\n\t\t\t}\n\t\t\tcolumnDefs[ i ].searchPanes.show = Object.keys( ret[ i ] ).length > 0;\n\n\t\t\tfor ( var ii in ret[ i ] ) {\n\t\t\t\tif ( conf.searchPanes.htmlLabels === false && headersRaw[ i ] ) {\n\t\t\t\t\tdiv.innerHTML = ret[ i ][ ii ].label;\n\t\t\t\t\tret[ i ][ ii ].label = div.textContent || div.innerText || '';\n\t\t\t\t}\n\n\t\t\t\tret[ i ][ ii ].total = ret[ i ][ ii ].count;\n\t\t\t}\n\t\t}\n\n\t\tfor ( var i in columnDefs ) {\n\t\t\tif ( 'searchPanes' in columnDefs[ i ] && !( indexFromPrintout( columnDefs[ i ].name ) in ret ) ) {\n\t\t\t\tdelete columnDefs[ i ].searchPanes;\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t};\n\n\tvar renderCards = function ( headers ) {\n\t\tif ( Table.hasClass( 'cards' ) ) {\n\t\t\tvar labels = objectValues( headers );\n\n\t\t\t// Add data-label attribute to each cell\n\t\t\t// (will be used by .visualdata.datatable.cards td:before)\n\t\t\t$( 'tbody tr', Table ).each( function () {\n\t\t\t\t$( this ).find( 'td' ).each( function ( column ) {\n\t\t\t\t\t$( this ).attr( 'data-label', labels[ column ] );\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t\t// set same heigth for all cards\n\t\t\tvar max = 0;\n\t\t\t$( 'tbody tr', Table ).each( function () {\n\t\t\t\tmax = Math.max( $( this ).height(), max );\n\t\t\t} ).height( max );\n\t\t}\n\t};\n\n\tvar render = function () {\n\t\tCount = TableData.count;\n\t\tvar conf = TableData.conf;\n\t\tvar query = TableData.query;\n\t\tvar data = TableData.json;\n\t\tvar params = TableData.params;\n\t\tvar printouts = TableData.printouts;\n\t\tvar templates = TableData.templates;\n\t\tvar mapPathSchema = TableData.mapPathSchema;\n\t\tvar categoryFields = TableData.categoryFields;\n\t\tvar headers = TableData.headers;\n\t\t// var headersRaw = TableData.headersRaw;\n\t\tvar headersRaw = objectValues( TableData.headersRaw );\n\t\tvar printoutsOptions = TableData.printoutsOptions;\n\t\tvar searchPanesOptions = TableData.searchPanesOptions;\n\t\tvar useAjax = ( Count > data.length );\n\n\t\tvar displayLog = params.displayLog;\n\t\tif ( displayLog ) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log( 'TableData', TableData );\n\t\t}\n\t\tinitColumnSort( query.params.order, headers );\n\t\tvar order = Table.data( 'order' );\n\n\t\tfunction isObject( obj ) {\n\t\t\treturn obj !== null && typeof obj === 'object' && !Array.isArray( obj );\n\t\t}\n\n\t\tif ( isObject( conf.scroller ) ) {\n\t\t\tif ( !( 'scrollY' in conf ) || !conf.scrollY ) {\n\t\t\t\tconf.scrollY = '300px';\n\n\t\t\t\t// expected type is string\n\t\t\t} else if ( !isNaN( conf.scrollY ) ) {\n\t\t\t\tconf.scrollY = conf.scrollY + 'px';\n\t\t\t}\n\t\t}\n\n\t\tvar searchPanes = isObject( conf.searchPanes );\n\t\tvar synch = isObject( conf.synch );\n\n\t\tvar searchBuilder = conf.searchBuilder;\n\t\tif ( searchBuilder ) {\n\t\t\t// if (options.dom.indexOf(\"Q\") === -1) {\n\t\t\t// options.dom = \"Q\" + options.dom;\n\t\t\t// }\n\n\t\t\t// @see https://datatables.net/extensions/searchbuilder/customConditions.html\n\t\t\t// @see https://github.com/DataTables/SearchBuilder/blob/master/src/searchBuilder.ts\n\t\t\tconf.searchBuilder = {\n\t\t\t\tdepthLimit: 1,\n\t\t\t\tconditions: {\n\t\t\t\t\thtml: {\n\t\t\t\t\t\tnull: null\n\t\t\t\t\t},\n\t\t\t\t\tstring: {\n\t\t\t\t\t\tnull: null\n\t\t\t\t\t},\n\t\t\t\t\tdate: {\n\t\t\t\t\t\tnull: null\n\t\t\t\t\t},\n\t\t\t\t\tnum: {\n\t\t\t\t\t\tnull: null\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t// add the pagelength at the proper place in the length menu\n\t\tif ( $.inArray( conf.pageLength, conf.lengthMenu ) < 0 ) {\n\t\t\tconf.lengthMenu.push( conf.pageLength );\n\t\t\tconf.lengthMenu.sort( function ( a, b ) {\n\t\t\t\treturn a - b;\n\t\t\t} );\n\t\t}\n\n\t\t// datatables columns.type\n\t\t// https://datatables.net/reference/option/columns.type\n\t\t/*\nstring\ndate\nnum\nnum-fmt\nhtml\nhtml-fmt\nhtml-num-fmt\n*/\n\t\tvar index = 0;\n\t\tvar columnDefs = [];\n\t\tfor ( var key in headers ) {\n\t\t\tvar datatablesFormat;\n\t\t\tvar columnType;\n\t\t\tif ( key in mapPathSchema ) {\n\t\t\t\tcolumnType = mapPathSchema[ key ].type;\n\t\t\t\tswitch ( mapPathSchema[ key ].type ) {\n\t\t\t\t\tcase 'boolean':\n\t\t\t\t\t\tdatatablesFormat = 'string';\n\t\t\t\t\t\tcolumnType = 'boolean';\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'string':\n\t\t\t\t\t\tcolumnType = mapPathSchema[ key ].format;\n\t\t\t\t\t\tswitch ( mapPathSchema[ key ].format ) {\n\t\t\t\t\t\t\tcase 'color':\n\n\t\t\t\t\t\t\tcase 'date':\n\t\t\t\t\t\t\tcase 'datetime':\n\t\t\t\t\t\t\tcase 'datetime-local':\n\t\t\t\t\t\t\t\tdatatablesFormat = 'date';\n\t\t\t\t\t\t\tcase 'email':\n\n\t\t\t\t\t\t\tcase 'month':\n\t\t\t\t\t\t\tcase 'number':\n\t\t\t\t\t\t\tcase 'week':\n\t\t\t\t\t\t\t\tdatatablesFormat = 'num';\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'password':\n\t\t\t\t\t\t\tcase 'range':\n\t\t\t\t\t\t\tcase 'tel':\n\t\t\t\t\t\t\tcase 'text':\n\t\t\t\t\t\t\tcase 'textarea':\n\t\t\t\t\t\t\tcase 'time':\n\t\t\t\t\t\t\t\tdatatablesFormat = 'string';\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase 'url':\n\t\t\t\t\t\t\t\tdatatablesFormat = 'html';\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tdatatablesFormat = 'string';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'number':\n\t\t\t\t\tcase 'integer':\n\t\t\t\t\t\tdatatablesFormat = 'num';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tdatatablesFormat = 'string';\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// or categories\n\t\t\t\tcolumnType = 'page title';\n\t\t\t\tdatatablesFormat = 'html';\n\t\t\t}\n\n\t\t\tif ( !conf.columns.type ) {\n\t\t\t\t// @TODO use \"any-number\" for numeric values\n\t\t\t\tconf.columns.type = null;\n\t\t\t}\n\n\t\t\tcolumnDefs.push(\n\t\t\t\t$.extend(\n\t\t\t\t\t{\n\t\t\t\t\t\t// https://datatables.net/reference/option/columnDefs\n\t\t\t\t\t\t// data: ...\n\t\t\t\t\t\ttitle: headers[ key ],\n\t\t\t\t\t\tname: key,\n\t\t\t\t\t\tclassName: 'schema-type-' + columnType,\n\t\t\t\t\t\ttargets: [ index ],\n\n\t\t\t\t\t\t// @see https://datatables.net/reference/option/columns.data\n\t\t\t\t\t\t// @see https://datatables.net/examples/ajax/objects_subarrays.html\n\t\t\t\t\t\t// @see https://datatables.net/extensions/searchpanes/examples/advanced/renderArrays.html\n\t\t\t\t\t\t// data: function ( row, type, val, meta ) {\n\t\t\t\t\t\t// return row[ meta.col ].join( params[ 'values-separator' ] );\n\t\t\t\t\t\t// },\n\n\t\t\t\t\t\trender: function ( thisData, type, row, meta ) {\n\t\t\t\t\t\t// if ( !headersRaw[ Object.keys( headers )[ meta.col ] ] ) {\n\t\t\t\t\t\t\tif ( !headersRaw[ meta.col ] ) {\n\t\t\t\t\t\t\t\tthisData = thisData.map( function ( value ) {\n\t\t\t\t\t\t\t\t\treturn VisualDataFunctions.escapeHTML( value );\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn thisData.join( params[ 'values-separator' ] );\n\t\t\t\t\t\t},\n\t\t\t\t\t\t// @FIXME https://datatables.net/reference/option/columns.searchBuilderType\n\t\t\t\t\t\t// implement in the proper way\n\t\t\t\t\t\tsearchBuilderType: datatablesFormat\n\t\t\t\t\t},\n\t\t\t\t\tconf.columns,\n\t\t\t\t\tprintoutsOptions[ key ]\n\t\t\t\t)\n\t\t\t);\n\t\t\tindex++;\n\t\t}\n\n\t\tif ( conf.cards ) {\n\t\t\tconf.responsive = false;\n\t\t}\n\n\t\t// *** url params are passed for the use\n\t\t// with the template ResultPrinter which\n\t\t// may use the \"urlget\" parser function or similar\n\n\t\t// do not use VisualDataFunctions.objectEntries\n\t\tvar searchParams = new URLSearchParams( location.search );\n\t\tvar urlParams = {};\n\t\tfor ( const [ k, v ] of searchParams ) {\n\t\t\turlParams[ k ] = v;\n\t\t}\n\t\tdelete urlParams.title;\n\t\tdelete urlParams.action;\n\n\t\tif ( synch ) {\n\t\t\tvar payloadDataSync = {\n\t\t\t\tsynch: true,\n\t\t\t\tparams,\n\t\t\t\tsynchProperty: conf.synch.property,\n\t\t\t\tquery: query.query,\n\t\t\t\ttemplates,\n\t\t\t\tprintouts,\n\t\t\t\turlParams,\n\t\t\t\tsourcePage: mw.config.get( 'wgPageName' )\n\t\t\t};\n\n\t\t\tif ( !Array.isArray( conf.buttons ) ) {\n\t\t\t\tconf.buttons = [];\n\t\t\t}\n\n\t\t\t// https://datatables.net/reference/feature/buttons.buttons\n\t\t\tconf.buttons.unshift( {\n\t\t\t\ttext: mw.msg( 'visualdata-jsmodule-datatables-buttons-reload-label' ),\n\t\t\t\tattr: {\n\t\t\t\t\tid: 'visualdata-datatables-buttons-reload-' + ElIndex,\n\t\t\t\t\tstyle: 'display: none'\n\t\t\t\t},\n\t\t\t\taction: function ( e, dt, node, config ) {\n\t\t\t\t\t// called from the OOUII button\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// call each n seconds, if new items\n\t\t\t// exist, show the update button to\n\t\t\t// retrieve again the original query\n\t\t\tSynchInterval = setInterval( function () {\n\t\t\t\tvar callback = function ( result ) {\n\t\t\t\t\t// update time\n\t\t\t\t\tconf.queryTime = result.queryTime;\n\t\t\t\t\t// *** for now we leave it, we retrieve\n\t\t\t\t\t// instead the all table\n\t\t\t\t\t// $( self ).DataTable( conf ).row.add( json.data ).draw( false );\n\n\t\t\t\t\tif ( result.count > 0 ) {\n\t\t\t\t\t\tclearInterval( SynchInterval );\n\t\t\t\t\t\taddBadge();\n\n\t\t\t\t\t\t// $( '#visualdata-datatables-buttons-reload-' + ElIndex ).show();\n\t\t\t\t\t\tvar reloadButton = new OO.ui.ButtonWidget( {\n\t\t\t\t\t\t\tlabel: mw.msg( 'visualdata-jsmodule-datatables-buttons-reload-table-label' ),\n\t\t\t\t\t\t\t// or bell\n\t\t\t\t\t\t\ticon: 'reload',\n\t\t\t\t\t\t\tflags: [ 'destructive' ]\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\treloadButton.on( 'click', function () {\n\t\t\t\t\t\t\treloadButton.setDisabled( true );\n\t\t\t\t\t\t\treloadButton.$element.find( '.oo-ui-iconElement-icon' ).addClass( 'rotating' );\n\n\t\t\t\t\t\t\tvar thisCallback = function ( thisResult ) {\n\t\t\t\t\t\t\t\treloadButton.$element.find( '.oo-ui-iconElement-icon' ).removeClass( 'rotating' );\n\t\t\t\t\t\t\t\treloadButton.setDisabled( false );\n\t\t\t\t\t\t\t\tDatatable.destroy();\n\t\t\t\t\t\t\t\trestoreBadge();\n\t\t\t\t\t\t\t\tel = $( el ).replaceWithPush( thisResult.data );\n\t\t\t\t\t\t\t\t// eslint-disable-next-line no-new\n\t\t\t\t\t\t\t\tnew VisualDataDatatables( el );\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcallApiSynch( $.extend( payloadDataSync, {\n\t\t\t\t\t\t\t\tapi: false\n\t\t\t\t\t\t\t} ),\n\t\t\t\t\t\t\tthisCallback,\n\t\t\t\t\t\t\tdisplayLog\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t$( '#visualdata-datatables-buttons-reload-' + ElIndex ).replaceWith( reloadButton.$element );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tcallApiSynch( $.extend( payloadDataSync, {\n\t\t\t\t\tqueryTime: conf.queryTime,\n\t\t\t\t\tapi: true\n\t\t\t\t} ),\n\t\t\t\tcallback,\n\t\t\t\tdisplayLog\n\t\t\t\t);\n\t\t\t}, conf.synch.interval * 1000 );\n\t\t}\n\n\t\t// default layout\n\t\t// https://datatables.net/reference/option/layout\n\t\tif ( conf.buttons.length &&\n\t\t\tconf.layout.topStart !== 'buttons' &&\n\t\t\tconf.layout.topEnd !== 'buttons' &&\n\t\t\tconf.layout.bottomStart !== 'buttons' &&\n\t\t\tconf.layout.bottomEnd !== 'buttons'\n\t\t) {\n\t\t\tconf.layout.top1Start = 'buttons';\n\t\t}\n\n\t\tif ( searchPanes ) {\n\t\t\t// https://datatables.net/examples/layout/ids-and-classes.html\n\t\t\tconf.layout.top2 = {\n\t\t\t\t// whatever class\n\t\t\t\trowClass: 'row-class',\n\t\t\t\tfeatures: 'searchPanes'\n\t\t\t};\n\n\t\t\tinitSearchPanesColumns( columnDefs, conf );\n\n\t\t\tif ( !useAjax ) {\n\t\t\t\tsearchPanesOptions = getPanesOptions(\n\t\t\t\t\tdata,\n\t\t\t\t\tcolumnDefs,\n\t\t\t\t\tconf\n\t\t\t\t);\n\t\t\t\tsetPanesOptions(\n\t\t\t\t\tdata,\n\t\t\t\t\tsearchPanesOptions,\n\t\t\t\t\tcolumnDefs\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tsearchPanesOptions = searchPanesOptionsServer(\n\t\t\t\t\tsearchPanesOptions,\n\t\t\t\t\tcolumnDefs,\n\t\t\t\t\tconf,\n\t\t\t\t\theadersRaw\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconf.columnDefs = columnDefs;\n\n\t\tconf.drawCallback = function ( settings ) {\n\t\t\tif ( conf.cards ) {\n\t\t\t\trenderCards( headers );\n\t\t\t}\n\t\t};\n\n\t\tvar extendButtons = function ( obj ) {\n\t\t\tvar defaultExtend = function ( name ) {\n\t\t\t\treturn {\n\t\t\t\t\textend: name,\n\t\t\t\t\t// @see https://datatables.net/extensions/buttons/examples/print/columns.html\n\t\t\t\t\texportOptions: {\n\t\t\t\t\t\tcolumns: ':visible'\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tfor ( var i in conf.buttons ) {\n\t\t\t\t// @see https://datatables.net/reference/button/?extn=buttons\n\t\t\t\tswitch ( conf.buttons[ i ] ) {\n\t\t\t\t\tcase 'print':\n\t\t\t\t\tcase 'pdf':\n\t\t\t\t\tcase 'excel':\n\t\t\t\t\tcase 'csv':\n\t\t\t\t\tcase 'copy':\n\t\t\t\t\t\tconf.buttons[ i ] = $.extend( defaultExtend( conf.buttons[ i ] ), obj );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// conf.destroy = true;\n\t\t// conf.retrieve = false;\n\t\tif ( !useAjax ) {\n\t\t\tconf.serverSide = false;\n\t\t\tconf.data = data;\n\n\t\t\textendButtons();\n\n\t\t\t// use Ajax only when required\n\t\t} else {\n\t\t\t// prevents double spinner\n\t\t\t// $(container).find(\".datatables-spinner\").hide();\n\n\t\t\textendButtons( { action: exportAction } );\n\n\t\t\t// cache using the column index and sorting\n\t\t\t// method, as pseudo-multidimensional array\n\t\t\t// column index + dir (asc/desc) + searchPanes (empty selection)\n\t\t\tvar cacheKey = getCacheKey( {\n\t\t\t\torder: order.map( ( x ) => {\n\t\t\t\t\treturn { column: x[ 0 ], dir: x[ 1 ] };\n\t\t\t\t} )\n\t\t\t} );\n\n\t\t\tsetCacheData( { cacheKey, data, recordsFiltered: Count, start: params.offset } );\n\n\t\t\tvar payloadData = {\n\t\t\t\tquery,\n\t\t\t\tcolumnDefs,\n\t\t\t\tprintouts,\n\t\t\t\tparams,\n\t\t\t\ttemplates,\n\t\t\t\tcategoryFields,\n\t\t\t\tsourcePage: mw.config.get( 'wgPageName' ),\n\t\t\t\tsettings: { count: Count, displayLog }\n\t\t\t};\n\n\t\t\tconf = $.extend( conf, {\n\t\t\t\t// *** attention! deferLoading when used in conjunction with\n\t\t\t\t// ajax, expects only the first page of data, if the preloaded\n\t\t\t\t// data contain more rows, datatables will show a wrong rows\n\t\t\t\t// counter. For this reason we renounce to use deferRender, and\n\t\t\t\t// instead we use the following hack: the Ajax function returns\n\t\t\t\t// the preloaded data as long they are available for the requested\n\t\t\t\t// slice, and then it uses an ajax call for not available data.\n\t\t\t\t// deferLoading: table.data(\"count\"),\n\t\t\t\tprocessing: true,\n\t\t\t\tserverSide: true,\n\t\t\t\tajax: function ( datatableData, thisCallback, settings ) {\n\n\t\t\t\t\t// must match initial cacheKey\n\t\t\t\t\tvar thisCacheKey = ( !VisualDataFunctions.getNestedProp( [ 'search', 'value' ], datatableData ) ?\n\t\t\t\t\t\tgetCacheKey( datatableData ) :\n\t\t\t\t\t\tnull );\n\n\t\t\t\t\t// returned cached data for the required\n\t\t\t\t\t// dimension (order column/dir)\n\t\t\t\t\tif ( thisCacheKey ) {\n\t\t\t\t\t\tvar cacheData = getCacheData( thisCacheKey, datatableData );\n\t\t\t\t\t\tif ( cacheData ) {\n\t\t\t\t\t\t\treturn thisCallback( {\n\t\t\t\t\t\t\t\tdraw: datatableData.draw,\n\t\t\t\t\t\t\t\tdata: cacheData.data,\n\t\t\t\t\t\t\t\trecordsTotal: Count,\n\t\t\t\t\t\t\t\trecordsFiltered: cacheData.count,\n\t\t\t\t\t\t\t\tsearchPanes: {\n\t\t\t\t\t\t\t\t\toptions: searchPanesOptions\n\t\t\t\t\t\t\t\t}\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\t// flush cache each 40,000 rows\n\t\t\t\t\t// *** another method is to compute the actual\n\t\t\t\t\t// size in bytes of each row, but it takes more\n\t\t\t\t\t// resources\n\t\t\t\t\tfor ( var ii in PreloadData ) {\n\t\t\t\t\t\tvar totalSize = objectValues( PreloadData[ ii ].data ).length;\n\n\t\t\t\t\t\tif ( totalSize > getCacheLimit() ) {\n\t\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\t\tconsole.log( 'flushing datatables cache!' );\n\t\t\t\t\t\t\tPreloadData[ ii ] = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcallApi(\n\t\t\t\t\t\t$.extend( payloadData, {\n\t\t\t\t\t\t\tdatatableData,\n\t\t\t\t\t\t\tcacheKey: thisCacheKey,\n\t\t\t\t\t\t\turlParams,\n\t\t\t\t\t\t\tapi: true\n\t\t\t\t\t\t} ),\n\t\t\t\t\t\tthisCallback,\n\t\t\t\t\t\tsearchPanesOptions,\n\t\t\t\t\t\tdisplayLog\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tif ( displayLog ) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log( 'conf', conf );\n\t\t}\n\n\t\tDatatable = $( el ).DataTable( conf );\n\t};\n\n\trender();\n};\n\n$( function () {\n\t// https://stackoverflow.com/questions/6118778/jquery-replacewith-find-new-element\n\t$.fn.replaceWithPush = function ( a ) {\n\t\tvar $a = $( a );\n\t\tthis.replaceWith( $a );\n\t\treturn $a;\n\t};\n\n\tvar buttons = [];\n\t$( '.visualdata.datatable' ).each( function () {\n\t\tvar data = $( this ).data();\n\t\tif ( data.conf && ( 'buttons' in data.conf ) && Array.isArray( data.conf.buttons ) ) {\n\t\t\tbuttons = buttons.concat( data.conf.buttons );\n\t\t}\n\t} );\n\n\tvar modules = [];\n\tif ( buttons.indexOf( 'pdf' ) !== -1 ) {\n\t\tmodules.push( 'ext.VisualData.Datatables.export.pdf' );\n\t}\n\n\tif ( buttons.indexOf( 'excel' ) !== -1 ) {\n\t\tmodules.push( 'ext.VisualData.Datatables.export.excel' );\n\t}\n\n\tfunction initialize() {\n\t\t$( '.visualdata.datatable' ).each( function ( index ) {\n\t\t\t// eslint-disable-next-line no-new\n\t\t\tnew VisualDataDatatables( this, index );\n\t\t} );\n\t}\n\n\tif ( !modules.length ) {\n\t\tinitialize();\n\t} else {\n\t\tmw.loader.using( modules, function () {\n\t\t\tinitialize();\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/VisualDataFormField.js","messages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 108. Maximum allowed is 100.","line":285,"column":1,"nodeType":"Program","messageId":"max","endLine":285,"endColumn":100},{"ruleId":"max-len","severity":1,"message":"This line has a length of 135. Maximum allowed is 100.","line":301,"column":1,"nodeType":"Program","messageId":"max","endLine":301,"endColumn":124},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1048,"column":4,"nodeType":"CallExpression","endLine":1048,"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-tabs","severity":2,"message":"Unexpected tab character.","line":246,"column":14,"nodeType":"Program","messageId":"unexpectedTab","endLine":246,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":246,"column":32,"nodeType":"Program","messageId":"unexpectedTab","endLine":246,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":352,"column":49,"nodeType":"Identifier","messageId":"unusedVar","endLine":352,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":424,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":424,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":427,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":427,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":457,"column":14,"nodeType":"Program","messageId":"unexpectedTab","endLine":457,"endColumn":15,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":457,"column":32,"nodeType":"Program","messageId":"unexpectedTab","endLine":457,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":528,"column":49,"nodeType":"Identifier","messageId":"unusedVar","endLine":528,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":533,"column":69,"nodeType":"Identifier","messageId":"unusedVar","endLine":533,"endColumn":74,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is assigned a value but never used.","line":557,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":557,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'value' is defined but never used.","line":802,"column":50,"nodeType":"Identifier","messageId":"unusedVar","endLine":802,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-use-before-define","severity":2,"message":"'defaultValueInput' was used before it was defined.","line":893,"column":20,"nodeType":"Identifier","messageId":"usedBeforeDefined","endLine":893,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":974,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":974,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":975,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":975,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":976,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":976,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":977,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":977,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":987,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":987,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":988,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":988,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":989,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":989,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":990,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":990,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1011,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1011,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1012,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1012,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1018,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1018,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1019,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1019,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1020,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1020,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1021,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1021,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1022,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1022,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'property' is defined but never used.","line":1134,"column":45,"nodeType":"Identifier","messageId":"unusedVar","endLine":1134,"endColumn":53,"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-2025, 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\tvar HandleOptionsInputsInt;\n\tvar HandleQueryOptionsInt;\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\tJSONSchemaType,\n\t\tstringFormat,\n\t\tmultipleItems\n\t) {\n\t\tvar ret = VisualDataFunctions.getAvailableInputs(\n\t\t\tJSONSchemaType,\n\t\t\tstringFormat,\n\t\t\tConfig\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\tfunction UpdateModel( modelMap, visibleItems ) {\n\t\tvar optionsHasVisibleItems = HandleOptionsInputsInt.hasVisibleItems();\n\t\tvar queryHasVisibleItems = HandleQueryOptionsInt.hasVisibleItems();\n\n\t\tfor ( var i in modelMap ) {\n\t\t\tif ( visibleItems ) {\n\t\t\t\tModel[ i ] = modelMap[ i ];\n\n\t\t\t} else {\n\t\t\t\tvar visibleSharedOptions =\n\t\t\t\t\tObject.keys( HandleOptionsInputsInt.modelMap ).indexOf( i ) !== -1 &&\n\t\t\t\t\tObject.keys( HandleQueryOptionsInt.modelMap ).indexOf( i ) !== -1 &&\n\t\t\t\t\t( optionsHasVisibleItems || queryHasVisibleItems );\n\n\t\t\t\tif ( !visibleSharedOptions ) {\n\t\t\t\t\tdelete Model[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// @TODO move to 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\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: 'Options'\n\t\t} );\n\n\t\tlayout.$element.append( fieldset.$element );\n\n\t\tparentItems.push( layout );\n\n\t\t// keep the variables separated\n\t\tvar optionsWikilistValue = getPropertyValue( 'options-wikilist' ) || '';\n\t\t// var optionsQueryValue = getPropertyValue( 'options-query' ) || '';\n\t\t// var optionsSMWQueryValue = getPropertyValue( 'options-smwquery' ) || '';\n\t\tvar optionsValues = getPropertyValue( 'options-values' ) || [];\n\n\t\tvar selectOptionsFromValue = getPropertyValue( 'selectOptionsFrom' );\n\n\t\t// @TODO add more data sources\n\t\tvar methods = [ 'values', 'wikilist', 'query' ];\n\n\t\tif ( Config.SMW ) {\n\t\t\tmethods.push( 'smwquery' );\n\t\t}\n\n\t\t// only for lookup widget\n\t\tvar methodsReduced = [ 'query' ];\n\t\tif ( Config.SMW ) {\n\t\t\tmethodsReduced.push( 'smwquery' );\n\t\t}\n\n\t\tvar inputIsEmpty = function ( thisMethod, value ) {\n\t\t\tswitch ( thisMethod ) {\n\t\t\t\tcase 'values':\n\t\t\t\t\treturn !value.length;\n\t\t\t\tdefault:\n\t\t\t\t\treturn value === '';\n\t\t\t}\n\t\t};\n\n\t\tif ( selectOptionsFromValue === '' ) {\n\t\t\tfor ( var method of methods ) {\n\t\t\t\tif ( !inputIsEmpty( method, getPropertyValue( 'options-' + method ) ) ) {\n\t\t\t\t\tselectOptionsFromValue = 'options-' + method;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar selectOptionsFrom = new OO.ui.RadioSelectInputWidget( {\n\t\t\toptions: methods.map( function ( x ) {\n\t\t\t\treturn {\n\t\t\t\t\tdata: 'options-' + x,\n\t\t\t\t\t// Messages that can be used here:\n\t\t\t\t\t// * visualdata-jsmodule-formfield-optionsfrom-values\n\t\t\t\t\t// * visualdata-jsmodule-formfield-optionsfrom-wikilist\n\t\t\t\t\t// * visualdata-jsmodule-formfield-optionsfrom-query\n\t\t\t\t\t// * visualdata-jsmodule-formfield-optionsfrom-smwquery\n\t\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t\t'visualdata-jsmodule-formfield-optionsfrom-' + x\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\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 messageWidgetOptionsQuery = new OO.ui.MessageWidget( {\n\t\t\ttype: 'info',\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-message-options-query' ),\n\t\t\tinvisibleLabel: false,\n\t\t\tclasses: [ 'VisualDataFormFieldMessage' ]\n\t\t} );\n\n\t\titems.push( messageWidgetOptionsQuery );\n\n\t\tvar optionsValuesInput = new OO.ui.TagMultiselectWidget( {\n\t\t\tselected: optionsValues,\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: optionsWikilistValue\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() {\n\t\t\tfor ( var item of fieldset.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-query' && value !== 'options-smwquery' );\n\n\t\t\tvar optionInput = inArray( availableInputsInput.getValue(), VisualDataFunctions.optionsInputs );\n\t\t\tmessageWidgetOptionsQuery.toggle( optionInput && ( value === 'options-query' || value === 'options-smwquery' ) );\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 onSelectAvailableInputs() {\n\t\t\tvar availableInputsValue = availableInputsInput.getValue();\n\n\t\t\tselectOptionsFrom.setOptions(\n\t\t\t\t( !inArray( availableInputsValue, VisualDataFunctions.lookupInputs ) ? methods : methodsReduced ).map( function ( x ) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: 'options-' + x,\n\n\t\t\t\t\t\t// Messages that can be used here:\n\t\t\t\t\t\t// * visualdata-jsmodule-formfield-optionsfrom-values\n\t\t\t\t\t\t// * visualdata-jsmodule-formfield-optionsfrom-wikilist\n\t\t\t\t\t\t// * visualdata-jsmodule-formfield-optionsfrom-query\n\t\t\t\t\t\t// * visualdata-jsmodule-formfield-optionsfrom-smwquery\n\t\t\t\t\t\tlabel: mw.msg(\n\t\t\t\t\t\t\t'visualdata-jsmodule-formfield-optionsfrom-' + x.toLowerCase()\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\tvar thisSelectOptionsFromValue = selectOptionsFrom.getValue();\n\t\t\tvar optionInput = inArray( availableInputsValue, VisualDataFunctions.optionsInputs );\n\n\t\t\tfieldSelectOptionsFrom.toggle( optionInput ||\n\t\t\t\t( Config.SMW && inArray( availableInputsValue, VisualDataFunctions.lookupInputs ) )\n\t\t\t);\n\n\t\t\tmessageWidgetOptionsQuery.toggle( optionInput && ( thisSelectOptionsFromValue === 'options-query' || thisSelectOptionsFromValue === 'options-smwquery' ) );\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-query' &&\n\t\t\t\tthisSelectOptionsFromValue !== 'options-smwquery' &&\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();\n\t\t\tUpdateModel( modelMap, thisVisibleItems );\n\t\t\tlayout.toggle( thisVisibleItems );\n\t\t}\n\n\t\tfieldset.addItems( items );\n\n\t\tvar visibleItems = hasVisibleItems();\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\treturn { selectOptionsFrom, hasVisibleItems, modelMap, onSelectAvailableInputs };\n\t}\n\n\tfunction handleQueryOptions( 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\n\t\tvar fieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: 'Options'\n\t\t} );\n\n\t\tlayout.$element.append( fieldset.$element );\n\n\t\tparentItems.push( layout );\n\n\t\tvar queryInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'options-query' )\n\t\t} );\n\n\t\tvar fieldQuery = new OO.ui.FieldLayout( queryInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-query-label' ),\n\t\t\thelp: new OO.ui.HtmlSnippet( mw.msg( 'visualdata-jsmodule-formfield-query-help' ) ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldQuery );\n\n\t\tvar SMWQueryInput = new OO.ui.TextInputWidget( {\n\t\t\tvalue: getPropertyValue( 'options-smwquery' )\n\t\t} );\n\n\t\tvar fieldSMWQuery = new OO.ui.FieldLayout( SMWQueryInput, {\n\t\t\tlabel: mw.msg( 'visualdata-jsmodule-formfield-smwquery-label' ),\n\t\t\thelp: new OO.ui.HtmlSnippet( mw.msg( 'visualdata-jsmodule-formfield-smwquery-help' ) ),\n\t\t\thelpInline: true,\n\t\t\talign: 'top'\n\t\t} );\n\n\t\titems.push( fieldSMWQuery );\n\n\t\tvar schemaInput = new OO.ui.DropdownInputWidget( {\n\t\t\toptions: VisualDataFunctions.createDropDownOptions(\n\t\t\t\tVisualDataFunctions.sort( Object.keys( Schemas ) ),\n\t\t\t\t{ key: 'value' }\n\t\t\t),\n\t\t\tvalue: getPropertyValue( 'query-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-query-schema-label'\n\t\t\t),\n\t\t\thelp: mw.msg( 'visualdata-jsmodule-formfield-query-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( 'query-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-query': queryInput,\n\t\t\t'options-smwquery': SMWQueryInput,\n\t\t\t'query-schema': schemaInput,\n\t\t\t'query-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 hasVisibleItems() {\n\t\t\tfor ( var item of fieldset.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 = HandleOptionsInputsInt.selectOptionsFrom.getValue();\n\n\t\t\tvar optionInput = ( ( selectOptionsFromValue === 'options-query' || selectOptionsFromValue === 'options-smwquery' ) &&\n\t\t\t\tinArray( availableInputsValue, VisualDataFunctions.optionsInputs ) );\n\t\t\tvar lookupInput = inArray( availableInputsValue, VisualDataFunctions.lookupInputs );\n\t\t\tvar labelFormulaInput = ( ( selectOptionsFromValue === 'options-query' || selectOptionsFromValue === 'options-smwquery' ) &&\n\t\t\t\tinArray( availableInputsValue, VisualDataFunctions.labelFormulaInputs ) );\n\n\t\t\tfieldQuery.toggle( ( lookupInput || optionInput ) && selectOptionsFromValue === 'options-query' );\n\t\t\tfieldSMWQuery.toggle( ( lookupInput || optionInput ) && selectOptionsFromValue === 'options-smwquery' );\n\t\t\tfieldPrintouts.toggle( lookupInput || optionInput );\n\t\t\tfieldSchema.toggle( ( lookupInput || optionInput ) && selectOptionsFromValue !== 'options-smwquery' );\n\t\t\tfieldOptionFormula.toggle( lookupInput || optionInput );\n\t\t\tfieldOptionsLabelFormula.toggle( labelFormulaInput );\n\n\t\t\tvar thisVisibleItems = hasVisibleItems();\n\t\t\tUpdateModel( modelMap, thisVisibleItems );\n\t\t\tlayout.toggle( thisVisibleItems );\n\t\t}\n\n\t\tfieldset.addItems( items );\n\n\t\tvar visibleItems = hasVisibleItems();\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\tHandleOptionsInputsInt.selectOptionsFrom.on( 'change', function ( value ) {\n\t\t\tonSelectAvailableInputs();\n\t\t} );\n\n\t\treturn { modelMap, hasVisibleItems, onSelectAvailableInputs };\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\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\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\t// *** now a constant\n\t\tvar propertyModelValue = 'json-schema';\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\tfieldjsonSchemaInput.toggle( propertyModelValue === 'json-schema' );\n\t\tfieldjsonSchemaFormatInput.toggle(\n\t\t\tpropertyModelValue === 'json-schema' && jsonSchemaValue === 'string'\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\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\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\tHandleOptionsInputsInt = handleOptionsInputs( availableInputsInput, items );\n\t\tHandleQueryOptionsInt = handleQueryOptions( availableInputsInput, items );\n\n\t\t// this will also call UpdateModel\n\t\tHandleOptionsInputsInt.onSelectAvailableInputs();\n\t\tHandleQueryOptionsInt.onSelectAvailableInputs();\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(\"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 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\tlayoutParentSchema.toggle( ( 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( '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\t// remove unsupported value\n\t\t\t\tif ( 'SMW-property' in obj ) {\n\t\t\t\t\tdelete obj[ 'SMW-property' ];\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\t// @FIXME with arrays this is mistakenly copying to\n\t\t// the child, not the parent schema\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":78,"column":6,"nodeType":"CallExpression","endLine":78,"endColumn":58},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":212,"column":5,"nodeType":"CallExpression","endLine":212,"endColumn":29},{"ruleId":"max-len","severity":1,"message":"This line has a length of 117. Maximum allowed is 100.","line":506,"column":1,"nodeType":"Program","messageId":"max","endLine":506,"endColumn":88},{"ruleId":"max-len","severity":1,"message":"This line has a length of 131. Maximum allowed is 100.","line":523,"column":1,"nodeType":"Program","messageId":"max","endLine":523,"endColumn":102},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":562,"column":5,"nodeType":"CallExpression","endLine":576,"endColumn":9},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":562,"column":5,"nodeType":"CallExpression","endLine":581,"endColumn":9},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":893,"column":5,"nodeType":"CallExpression","endLine":893,"endColumn":41},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":1353,"column":4,"nodeType":"AssignmentExpression","endLine":1353,"endColumn":38},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1355,"column":26,"nodeType":"CallExpression","endLine":1355,"endColumn":78},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1433,"column":6,"nodeType":"CallExpression","endLine":1435,"endColumn":7},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1436,"column":7,"nodeType":"CallExpression","endLine":1436,"endColumn":69},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1439,"column":7,"nodeType":"CallExpression","endLine":1441,"endColumn":8},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1468,"column":7,"nodeType":"CallExpression","endLine":1470,"endColumn":8},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1471,"column":8,"nodeType":"CallExpression","endLine":1471,"endColumn":48},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1474,"column":8,"nodeType":"CallExpression","endLine":1476,"endColumn":9},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":2120,"column":5,"nodeType":"CallExpression","endLine":2120,"endColumn":42},{"ruleId":"max-len","severity":1,"message":"This line has a length of 107. Maximum allowed is 100.","line":2277,"column":1,"nodeType":"Program","messageId":"max","endLine":2277,"endColumn":96},{"ruleId":"max-len","severity":1,"message":"This line has a length of 109. Maximum allowed is 100.","line":2453,"column":1,"nodeType":"Program","messageId":"max","endLine":2453,"endColumn":92},{"ruleId":"max-len","severity":1,"message":"This line has a length of 102. Maximum allowed is 100.","line":2785,"column":1,"nodeType":"Program","messageId":"max","endLine":2785,"endColumn":85},{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":2803,"column":7,"nodeType":"VariableDeclarator","endLine":2803,"endColumn":25},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":2971,"column":9,"nodeType":"CallExpression","endLine":2995,"endColumn":13},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":2971,"column":9,"nodeType":"CallExpression","endLine":3000,"endColumn":13},{"ruleId":"max-len","severity":1,"message":"This line has a length of 102. Maximum allowed is 100.","line":2976,"column":1,"nodeType":"Program","messageId":"max","endLine":2976,"endColumn":70},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":3100,"column":10,"nodeType":"CallExpression","endLine":3100,"endColumn":67},{"ruleId":"max-len","severity":1,"message":"This line has a length of 108. Maximum allowed is 100.","line":3243,"column":1,"nodeType":"Program","messageId":"max","endLine":3243,"endColumn":94},{"ruleId":"max-len","severity":1,"message":"This line has a length of 105. Maximum allowed is 100.","line":3248,"column":1,"nodeType":"Program","messageId":"max","endLine":3248,"endColumn":91},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":3466,"column":15,"nodeType":"CallExpression","endLine":3468,"endColumn":6},{"ruleId":"max-len","severity":1,"message":"This line has a length of 119. Maximum allowed is 100.","line":3490,"column":1,"nodeType":"Program","messageId":"max","endLine":3490,"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":3537,"column":3,"nodeType":"CallExpression","endLine":3537,"endColumn":39}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'Initialized' is assigned a value but never used.","line":51,"column":6,"nodeType":"Identifier","messageId":"unusedVar","endLine":51,"endColumn":17,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'constructorName_'.","line":70,"column":8,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":71,"endColumn":39,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":98,"column":41,"nodeType":"Identifier","messageId":"unusedVar","endLine":98,"endColumn":47,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'resolve' is defined but never used.","line":102,"column":43,"nodeType":"Identifier","messageId":"unusedVar","endLine":102,"endColumn":50,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":102,"column":52,"nodeType":"Identifier","messageId":"unusedVar","endLine":102,"endColumn":58,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":117,"column":34,"nodeType":"Identifier","messageId":"unusedVar","endLine":117,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":131,"column":64,"nodeType":"Identifier","messageId":"unusedVar","endLine":131,"endColumn":67,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":135,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":135,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[4087,4108],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'item' is defined but never used.","line":141,"column":33,"nodeType":"Identifier","messageId":"unusedVar","endLine":141,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'items' is defined but never used.","line":143,"column":36,"nodeType":"Identifier","messageId":"unusedVar","endLine":143,"endColumn":41,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":214,"column":39,"nodeType":"Identifier","messageId":"unusedVar","endLine":214,"endColumn":45,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'resolve' is defined but never used.","line":220,"column":41,"nodeType":"Identifier","messageId":"unusedVar","endLine":220,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":220,"column":50,"nodeType":"Identifier","messageId":"unusedVar","endLine":220,"endColumn":56,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'schema' is defined but never used.","line":344,"column":26,"nodeType":"Identifier","messageId":"unusedVar","endLine":344,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'schema' is defined but never used.","line":350,"column":26,"nodeType":"Identifier","messageId":"unusedVar","endLine":350,"endColumn":32,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'callback' is defined but never used.","line":354,"column":54,"nodeType":"Identifier","messageId":"unusedVar","endLine":354,"endColumn":62,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":419,"column":34,"nodeType":"Identifier","messageId":"unusedVar","endLine":419,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'model_'.","line":422,"column":10,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":422,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'field_'.","line":428,"column":10,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":428,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":572,"column":9,"nodeType":"MemberExpression","messageId":"unexpected","endLine":572,"endColumn":22,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[15782,15841],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":579,"column":7,"nodeType":"MemberExpression","messageId":"unexpected","endLine":579,"endColumn":20,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[15988,16040],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":613,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":613,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'estimatedRemainingTime' is defined but never used.","line":686,"column":40,"nodeType":"Identifier","messageId":"unusedVar","endLine":686,"endColumn":62,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":705,"column":26,"nodeType":"Identifier","messageId":"unusedVar","endLine":705,"endColumn":29,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-inner-declarations","severity":2,"message":"Move function declaration to function body root.","line":807,"column":4,"nodeType":"FunctionDeclaration","messageId":"moveDeclToRoot","endLine":830,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":867,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":867,"endColumn":16,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[23291,23333],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":872,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":872,"endColumn":16,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[23440,23484],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1097,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1097,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1098,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1098,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'loadDataBeforeSelect' is assigned a value but never used.","line":1104,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":1104,"endColumn":27,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":1127,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":1127,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[30679,30720],"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":1133,"column":60,"nodeType":"CallExpression","endLine":1133,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1194,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1194,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1195,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1195,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":1226,"column":14,"nodeType":"Identifier","messageId":"unusedVar","endLine":1226,"endColumn":17,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":1238,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":1238,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[33478,33519],"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":1244,"column":60,"nodeType":"CallExpression","endLine":1244,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1263,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1263,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1267,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1267,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1268,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1268,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1269,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1269,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1270,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1270,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1271,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1271,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1272,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1272,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1272,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":1272,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1273,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1273,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1292,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1292,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1293,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1293,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1294,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1294,"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":1342,"column":39,"nodeType":"ObjectExpression","endLine":1350,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1509,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1509,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1510,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1510,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1511,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1511,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1512,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1512,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'directive' is defined but never used.","line":1566,"column":66,"nodeType":"Identifier","messageId":"unusedVar","endLine":1566,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1577,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1577,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1615,"column":14,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":1615,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1616,"column":5,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1616,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1617,"column":18,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1617,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1620,"column":7,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1620,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1624,"column":6,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1624,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1629,"column":19,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1629,"endColumn":46,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1645,"column":6,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1645,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'schemaName_'.","line":1651,"column":5,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":1651,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":1695,"column":7,"nodeType":"MemberExpression","messageId":"unexpected","endLine":1695,"endColumn":20,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[45023,45088],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1778,"column":10,"nodeType":"Program","messageId":"unexpectedTab","endLine":1778,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1811,"column":10,"nodeType":"Program","messageId":"unexpectedTab","endLine":1811,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'inputName' is assigned a value but never used.","line":1840,"column":10,"nodeType":"Identifier","messageId":"unusedVar","endLine":1840,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2054,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":2054,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2055,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":2055,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2056,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":2056,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'widget_'.","line":2187,"column":8,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2187,"endColumn":70,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":2234,"column":8,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2234,"endColumn":34,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'widget_'.","line":2241,"column":8,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2241,"endColumn":88,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'thisPath_'.","line":2279,"column":9,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2279,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2334,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2334,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2335,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2335,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2336,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2336,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2337,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2337,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2338,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2338,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2339,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2339,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2340,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2340,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2341,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2341,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'items_'.","line":2433,"column":10,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2433,"endColumn":21,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":2438,"column":11,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2438,"endColumn":58,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'pathNoIndex_'.","line":2440,"column":11,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2442,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'widget_'.","line":2453,"column":11,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":2453,"endColumn":91,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2550,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2550,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2551,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2551,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2552,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2552,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2553,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2553,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2554,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2554,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2555,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2555,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2556,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2556,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2557,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2557,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2558,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2558,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2559,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2559,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2560,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2560,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2561,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2561,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2562,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2562,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2563,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2563,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2658,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2658,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2659,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":2659,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2766,"column":21,"nodeType":"Program","messageId":"unexpectedTab","endLine":2766,"endColumn":22,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2773,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":2773,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2774,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":2774,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2775,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":2775,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2776,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":2776,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-alert","severity":2,"message":"Unexpected alert.","line":2819,"column":5,"nodeType":"CallExpression","messageId":"unexpected","endLine":2819,"endColumn":69,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":2847,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":2847,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-alert","severity":2,"message":"Unexpected confirm.","line":2919,"column":6,"nodeType":"CallExpression","messageId":"unexpected","endLine":2921,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":2998,"column":11,"nodeType":"MemberExpression","messageId":"unexpected","endLine":2998,"endColumn":24,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[79893,79944],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3010,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3010,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'thisObserver' is defined but never used.","line":3126,"column":63,"nodeType":"Identifier","messageId":"unusedVar","endLine":3126,"endColumn":75,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'matchedClasses' is defined but never used.","line":3147,"column":49,"nodeType":"Identifier","messageId":"unusedVar","endLine":3147,"endColumn":63,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3152,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3152,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3154,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3154,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":3174,"column":62,"nodeType":"Identifier","messageId":"unusedVar","endLine":3174,"endColumn":65,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":3178,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":3178,"endColumn":15,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[84873,84892],"text":""},"desc":"Remove the console.log()."}],"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":3213,"column":45,"nodeType":"ObjectExpression","endLine":3220,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3244,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":3244,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3245,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":3245,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3246,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":3246,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3247,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":3247,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3248,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":3248,"endColumn":10,"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":3275,"column":44,"nodeType":"ObjectExpression","endLine":3282,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3358,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3358,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3359,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3359,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3360,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3360,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3361,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3361,"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":3401,"column":36,"nodeType":"ObjectExpression","endLine":3408,"endColumn":4,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3411,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3411,"endColumn":7,"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":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3414,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3414,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3415,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3415,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3416,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3416,"endColumn":7,"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":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":3423,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3423,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3424,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3424,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3425,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3425,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3426,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3426,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3427,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3427,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3428,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3428,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3429,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3429,"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":3441,"column":4,"nodeType":"CallExpression","endLine":3441,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3487,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3487,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3488,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3488,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3489,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3489,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3490,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3490,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3491,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3491,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3492,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3492,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3493,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3493,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3494,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3494,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3496,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3496,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3497,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3497,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3498,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3498,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3499,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3499,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3500,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3500,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3501,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3501,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3503,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3503,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3521,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3521,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3522,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3522,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":3534,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":3534,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":5,"fatalErrorCount":0,"warningCount":24,"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-2024, 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 = VisualDataFunctions.deepCopy( Form.jsonData );\n\tvar ModelFlatten = [];\n\tvar SelectedSchema;\n\tvar PreviousSchemas = {};\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\tvar MutationObservers = {};\n\n\tfunction inArray( val, arr ) {\n\t\treturn arr.indexOf( val ) !== -1;\n\t}\n\n\tfunction escapeJsonPointer( str ) {\n\t\treturn VisualDataFunctions.escapeJsonPointer( str );\n\t}\n\n\tfunction showLazyWidget( constructorName ) {\n\t\tvar promises = [];\n\t\t// @IMPORTANT use \"let\" if used with timeout !!\n\t\tfor ( let i in InputWidgets ) {\n\t\t\tvar constructorName_ = InputWidgets[ i ].constructorName ||\n\t\t\t\tInputWidgets[ i ].constructor.name;\n\n\t\t\tif ( constructorName_ === constructorName ||\n\t\t\t\t( 'constructorName' in InputWidgets[ i ] &&\n\t\t\t\t\tInputWidgets[ i ].constructorName === constructorName )\n\t\t\t) {\n\t\t\t\tif (\n\t\t\t\t\tInputWidgets[ i ].$element.parent().is( ':visible' )\n\t\t\t\t) {\n\t\t\t\t\tpromises.push( InputWidgets[ i ].initialize() );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn promises;\n\t}\n\n\tasync function loadMaps() {\n\t\tfunction initMap( obj ) {\n\t\t\tif ( obj.data.schema.wiki.coordinates === false ) {\n\t\t\t\tvar latFieldId = makeElementId( `${ obj.data.path }/latitude` );\n\t\t\t\tvar lonFieldId = makeElementId( `${ obj.data.path }/longitude` );\n\t\t\t\tvar escapeSelector = jQuery.escapeSelector;\n\n\t\t\t\tfor ( let fieldId of [ latFieldId, lonFieldId ] ) {\n\t\t\t\t\tlet callbackCond = function () {\n\t\t\t\t\t\treturn $( '#' + escapeSelector( fieldId ) ).length;\n\t\t\t\t\t};\n\t\t\t\t\tlet callback = function ( resolve, reject ) {\n\t\t\t\t\t\t$( '#' + escapeSelector( fieldId ) ).hide();\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t};\n\t\t\t\t\tlet callbackMaxAttempts = function ( resolve, reject ) {\n\t\t\t\t\t\t$( '#' + escapeSelector( fieldId ) ).hide();\n\t\t\t\t\t};\n\t\t\t\t\tVisualDataFunctions.waitUntil(\n\t\t\t\t\t\tcallbackCond,\n\t\t\t\t\t\tcallback,\n\t\t\t\t\t\tcallbackMaxAttempts,\n\t\t\t\t\t\t5\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn ( new VisualDataMaptiler() )\n\t\t\t\t.initialize( obj.element, obj.data );\n\t\t}\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\tmw.loader.using( 'ext.VisualData.Maptiler', function () {\n\t\t\t\tvar promises = [];\n\t\t\t\t// @IMPORTANT use \"let\" if used with timeout !!\n\t\t\t\tfor ( let obj of Maps ) {\n\t\t\t\t\t// @FIXME find a better way\n\t\t\t\t\tvar schemaName = obj.data.path.split( '/' )[ 0 ];\n\t\t\t\t\t// *** load only if the form/tab is visible\n\t\t\t\t\t// to prevent inconsistencies of display\n\t\t\t\t\tif ( schemaName === SelectedSchema ) {\n\t\t\t\t\t\tpromises.push( initMap( obj ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tVisualDataFunctions.promisesAllSettled( promises ).then( ( res ) => {\n\t\t\t\t\tresolve();\n\t\t\t\t} ).catch( ( err ) => {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error( err );\n\t\t\t\t} );\n\t\t\t} );\n\t\t} );\n\t}\n\n\tfunction onSetPropertiesStack( item ) {}\n\n\tfunction onChangePropertiesStack( items ) {}\n\n\tfunction onTabSelect( selectedSchema ) {\n\t\tSelectedSchema = selectedSchema;\n\t\tsetTimeout( function () {\n\t\t\tonMutationChange( selectedSchema );\n\t\t}, 30 );\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 = escapeJsonPointer( 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 = escapeJsonPointer( 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 {\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 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( schema ) {\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( schema ) {\n\t\treturn !( 'popup-help' in Form.options ? Form.options[ 'popup-help' ] : false );\n\t}\n\n\tasync function updateFieldsVisibility( sourceModel, callback ) {\n\t\tvar field = sourceModel.schema.wiki;\n\n\t\tfunction escapeRegExp( string ) {\n\t\t\treturn string.replace( /[.*+?^${}()|[\\]\\\\]/g, '\\\\$&' );\n\t\t}\n\n\t\tfunction toggleVisibility( value, thisModel, thisField ) {\n\t\t\tvar refValue = VisualDataFunctions.castType( thisField[ 'showif-value' ], sourceModel.schema.type );\n\n\t\t\tvar res;\n\t\t\tif ( sourceModel.removed ) {\n\t\t\t\tres = false;\n\n\t\t\t} else {\n\t\t\t\tswitch ( thisField[ 'showif-condition' ] ) {\n\t\t\t\t\tcase '=':\n\t\t\t\t\t\tres = ( refValue === value );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '!=':\n\t\t\t\t\t\tres = ( refValue !== value );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'starts':\n\t\t\t\t\t\tres = ( value.indexOf( refValue ) === 0 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '!starts':\n\t\t\t\t\t\tres = ( value.indexOf( refValue ) !== 0 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'contains':\n\t\t\t\t\t\tres = ( value.indexOf( refValue ) !== -1 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '!contains':\n\t\t\t\t\t\tres = ( value.indexOf( refValue ) === -1 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'ends':\n\t\t\t\t\t\tvar regExp = new RegExp( escapeRegExp( refValue ) + '$' );\n\t\t\t\t\t\tres = regExp.test( value );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '!ends':\n\t\t\t\t\t\tvar regExp = new RegExp( escapeRegExp( refValue ) + '$' );\n\t\t\t\t\t\tres = !regExp.test( value );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '!null':\n\t\t\t\t\t\tres = ( !!value );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'regex':\n\t\t\t\t\t\tvar regExp = new RegExp( refValue );\n\t\t\t\t\t\tres = regExp.test( value );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthisModel.removed = !res;\n\t\t\t// Fields[ model.path ].toggle( res );\n\t\t\tvar el = window.document.querySelector( '#' +\n\t\t\t\tjQuery.escapeSelector( makeElementId( thisModel.path ) ) );\n\n\t\t\t$( el ).toggle( res );\n\t\t}\n\n\t\t// *** attention, VEForAll was causing an infinite loop\n\t\t// by adding the following class:\n\t\t// ve-for-all-waiting-for-update\n\t\t// use mutation observer's disconnect(); and\n\t\t// initialize again\n\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\tProcessModel.getValue( sourceModel ).then( function ( value ) {\n\t\t\t\tfor ( var i in sourceModel.parent ) {\n\t\t\t\t\tvar model_ = sourceModel.parent[ i ];\n\n\t\t\t\t\tif ( sourceModel.schemaName !== model_.schemaName ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar field_ = model_.schema.wiki;\n\t\t\t\t\tif ( model_.schema.type === 'array' ) {\n\t\t\t\t\t\tfield_ = model_.schema.items.wiki;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( !( 'showif-field' in field_ ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// consider only same level\n\t\t\t\t\tif ( field_[ 'showif-field' ] !== field.name ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\ttoggleVisibility( value, model_, field_ );\n\t\t\t\t}\n\t\t\t\tresolve();\n\t\t\t} );\n\t\t} );\n\t}\n\n\tfunction clearDependentFields( model ) {\n\t\tfor ( var thisModel of ModelFlatten ) {\n\t\t\tif ( thisModel.schemaName !== model.schemaName ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar field = thisModel.schema.wiki;\n\t\t\tif ( !( 'options-query' in field ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar query = field[ 'options-query' ];\n\t\t\tvar regExp = new RegExp( '<' + model.pathNoIndex + '>' );\n\t\t\tif ( regExp.test( query ) ) {\n\t\t\t\tthisModel.input.setValue( !thisModel.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-query' in field ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar query = field[ 'options-query' ];\n\t\t\tvar regExp = new RegExp( '<' + sourceModel.pathNoIndex + '>' );\n\t\t\tif ( regExp.test( query ) ) {\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 query = field[ 'options-query' ] || field[ 'options-smwquery' ];\n\t\tvar matches = [];\n\n\t\tvar re = /<([^<>]+)>/g;\n\t\twhile ( true ) {\n\t\t\tvar match = re.exec( query );\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-queryoptions',\n\t\t\t\tdata: JSON.stringify( {\n\t\t\t\t\tquery,\n\t\t\t\t\tproperties: field[ 'query-printouts' ],\n\t\t\t\t\tschema: field[ 'query-schema' ] || '',\n\t\t\t\t\t'options-query-formula': field[ 'options-query-formula' ] || null,\n\t\t\t\t\t'options-label-formula': field[ 'options-label-formula' ] || null\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\tif ( 'result' in thisData ) {\n\t\t\t\t\t\t\t\tthisData = thisData.result;\n\t\t\t\t\t\t\t\tresolve( thisData );\n\t\t\t\t\t\t\t} else if ( 'error' in thisData ) {\n\t\t\t\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\t\t\t\tconsole.error( 'visualdata-queryoptions', thisData.error );\n\t\t\t\t\t\t\t\treject( thisData.error );\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\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-queryoptions', 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\t\t\tvar parent = model.path.slice( 0, Math.max( 0, model.path.indexOf( '/' ) ) );\n\n\t\t\tfor ( var match of matches ) {\n\t\t\t\tif ( match[ 1 ] === 'value' ) {\n\t\t\t\t\tquery = query.replace(\n\t\t\t\t\t\tmatch[ 0 ],\n\t\t\t\t\t\t// value of lookupElement\n\t\t\t\t\t\tvalue\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// @MUST MATCH classes/SubmitForm -> replaceFormula\n\t\t\t\tfor ( var i in res.flatten ) {\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\tquery = query.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\tquery = query.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 schema = config.model.schema;\n\t\tvar fieldAlign = getFieldAlign( schema );\n\t\tvar helpInline = getHelpInline( schema );\n\n\t\tvar inputWidget = getInputWidget( config );\n\n\t\tinputWidget.on( 'change', function () {\n\t\t\t// updateFieldsVisibility( config.model );\n\t\t\tclearDependentFields( config.model );\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\tupdateDefaultValue( 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\tschema.wiki[ '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\t// schema.description is removed if wiki['help-message'] was \"\"\n\t\tvar helpMessage = ( 'help-message' in schema.wiki && 'description' in schema ? schema.description : '' );\n\n\t\tvar fieldLayout = new OO.ui.FieldLayout(\n\t\t\t!config.model.isFile ? inputWidget : fileUploadGroupWidget, {\n\t\t\t\tlabel: new OO.ui.HtmlSnippet( 'label' in schema.wiki && 'title' in schema ? schema.title : '' ),\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 VisualDataFunctions.sort( 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}\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// 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\tVisualDataFunctions.getNestedProp( [ 'items', 'wiki', 'preferred-input' ], data.schema ) &&\n\t\t\t\tdata.schema.items.type !== 'object' &&\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\tif ( data.root ) {\n\t\t\tthis.data.rootEl = layout.$element;\n\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\tif ( data.schema.type === 'array' ) {\n\t\t\tthis.toggle(\n\t\t\t\t!VisualDataFunctions.getNestedProp(\n\t\t\t\t\t[ 'schema', 'items', 'options', 'hidden' ],\n\t\t\t\t\tdata\n\t\t\t\t)\n\t\t\t);\n\n\t\t} else {\n\t\t\tthis.toggle(\n\t\t\t\t!VisualDataFunctions.getNestedProp(\n\t\t\t\t\t[ 'schema', 'options', 'hidden' ],\n\t\t\t\t\tdata\n\t\t\t\t)\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\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 && 'title' in data.schema ? data.schema.title : '' )\n\t\t\t\t} );\n\n\t\t\t\tif ( 'description' in data.schema.wiki && 'description' in data.schema ) {\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\tvar self = this;\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\tvar schemaName = self.data.model.schemaName;\n\n\t\tsetTimeout( function () {\n\t\t\tonMutationChange( schemaName, self.data.rootEl.get( 0 ) );\n\t\t}, 30 );\n\n\t\tfor ( var model of ModelFlatten ) {\n\t\t\tif ( model.schemaName === schemaName ) {\n\t\t\t\tupdateDependentFields( model );\n\t\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\tThisPageLayout.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\tfunction getWidgets() {\n\t\t\tMaps = [];\n\t\t\tPendingRecursive = 0;\n\t\t\tQueuedWidgets = {};\n\t\t\tvar ret = {};\n\n\t\t\tfor ( var schemaName_ of Form.schemas ) {\n\t\t\t\tQueuedWidgets[ schemaName_ ] = [];\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 = `${ escapeJsonPointer( 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\t// @credits https://gerrit.wikimedia.org/r/c/mediawiki/extensions/VisualData/+/1034934\n\t\t\t\t\tif ( 'selected-schema' in Form.options &&\n\t\t\t\t\t\tForm.options[ 'selected-schema' ] !== '' &&\n\t\t\t\t\t\tinArray( Form.options[ 'selected-schema' ], Form.schemas )\n\t\t\t\t\t) {\n\t\t\t\t\t\tSelectedSchema = Form.options[ 'selected-schema' ];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tSelectedSchema = ( Form.schemas.length ? Form.schemas[ 0 ] : null );\n\t\t\t\t\t}\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\tThisPageLayout.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\t\t\t\t\t\tbooklet.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\tindexLayout.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 ( 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( data.contentModel === 'wikitext', {\n\t\t\t\t\t\tvalue: Form.freetext,\n\t\t\t\t\t\t// @FIXME this could be removed\n\t\t\t\t\t\tcontentModel: data.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\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: data.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\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\t// @FIXME this could be removed\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\n\t\t\t\t\t\t\t// *** this is not caught by the mutation\n\t\t\t\t\t\t\tsetTimeout( function () {\n\t\t\t\t\t\t\t\tshowLazyWidget( 'VisualDataVisualEditor' );\n\t\t\t\t\t\t\t}, 50 );\n\n\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\n\t\t\t\tsetTimeout( function () {\n\t\t\t\t\tshowLazyWidget( 'VisualDataVisualEditor' );\n\t\t\t\t}, 50 );\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\tfunction schemaHasData( schemaName ) {\n\t\treturn VisualDataFunctions.getNestedProp( [ 'schemas', schemaName ], StoredJsonData ) &&\n\t\t\tObject.keys( StoredJsonData.schemas[ schemaName ] ).length;\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.emptyData )\n\t\t) {\n\t\t\tdata = item.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 updateDefaultValue( model ) {\n\t\tif ( !VisualDataFunctions.getNestedProp(\n\t\t\t[ 'schema', 'wiki', 'default' ],\n\t\t\tmodel\n\t\t) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tProcessModel.getValue( model ).then( function ( res ) {\n\t\t\tif ( VisualDataFunctions.isEmpty( res ) &&\n\t\t\t\tmodel.schema.wiki.required &&\n\t\t\t\t!VisualDataFunctions.isEmpty( model.schema.wiki.default )\n\t\t\t) {\n\t\t\t\tmodel.input.setValue( model.schema.wiki.default );\n\t\t\t}\n\t\t} );\n\t}\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 handled\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 ( !( 'default' in schema ) ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\t// @FIXME schema.default may be returned\n\t\t// immediately ?\n\t\tvar requiredDefaultWithEmptyValue = VisualDataFunctions.isEmpty( data ) &&\n\t\t\tschema.wiki.required &&\n\t\t\t!VisualDataFunctions.isEmpty( schema.default );\n\n\t\t// possibly return schema.default (bypass this)\n\t\t// if is a new item, or is a new schema,\n\t\t// or there are not data entered through\n\t\t// the form in the form\n\t\tif (\n\t\t\t!newItem &&\n\t\t\t!isNewSchema( schemaName ) &&\n\t\t\t!Form.emptyData &&\n\t\t\t!requiredDefaultWithEmptyValue\n\t\t) {\n\t\t\treturn ret;\n\t\t}\n\n\t\t// possibly return schema.default (bypass this)\n\t\t// if ret is null or is equal to the default value\n\t\t// of previousSchema\n\t\tif (\n\t\t\tret !== null &&\n\t\t\t( !( 'default' in previousSchema ) || ret !== previousSchema.default )\n\t\t) {\n\t\t\treturn ret;\n\t\t}\n\n\t\t// possibly return schema.default (bypass this)\n\t\t// if the default value is not an array\n\t\t// or the preferred input is not a multiselect\n\t\t// (the respective entries by OptionsListContainer)\n\t\tif (\n\t\t\tArray.isArray( schema.default ) &&\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.default;\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\tQueuedWidgets[ schemaName ].push( widget );\n\t\tPendingRecursive++;\n\n\t\tif ( !( 'type' in schema ) ) {\n\t\t\tschema.type = 'default' in schema ? 'string' : 'object';\n\t\t}\n\t\t// model.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 }/${ escapeJsonPointer( 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 }/${ escapeJsonPointer( i ) }` :\n\t\t\t\t\t\t\tescapeJsonPointer( 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\t// inform the root widget that the rendering of the form is complete\n\t\tif ( --PendingRecursive === 0 ) {\n\t\t\t// @see https://www.mediawiki.org/wiki/OOjs/Events\n\t\t\tif ( QueuedWidgets[ schemaName ].length ) {\n\t\t\t\tQueuedWidgets[ schemaName ][ 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\tvar contentModel = ( Form.options.action === 'create' && ( 'default-content-model' in Form.options ) ?\n\t\t\tForm.options[ 'default-content-model' ] : Config.contentModel );\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\tcontentModel,\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( previousSchemas, schemas, data ) {\n\t\tPreviousSchemas = previousSchemas;\n\t\tSchemas = schemas;\t// 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};\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', thisRes );\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 setMutation( schemaName, rootEl ) {\n\t\tif ( schemaName in MutationObservers ) {\n\t\t\tMutationObservers[ schemaName ].disconnect();\n\t\t}\n\n\t\t// the root element may not have been yet\n\t\t// appended when the form is loaded\n\t\tif ( rootEl ) {\n\t\t\tvar el = rootEl;\n\t\t} else {\n\t\t\tvar escapedSchemaName = escapeJsonPointer( schemaName );\n\t\t\tvar el = window.document.querySelector( '#' +\n\t\t\t\tjQuery.escapeSelector( makeElementId( escapedSchemaName ) ) );\n\t\t}\n\n\t\tif ( !el ) {\n\t\t\t// console.log( 'element not found ' + makeElementId( escapedSchemaName ) );\n\t\t\treturn;\n\t\t}\n\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\tvar matchedClasses = [];\n\t\t\t\tfor ( var mutation of mutations ) {\n\t\t\t\t\tif ( mutation.type === 'attributes' && mutation.attributeName === 'class' ) {\n\t\t\t\t\t\tmatchedClasses.concat( mutation.target.classList );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tonMutationChange( schemaName, el, matchedClasses );\n\t\t\t} );\n\n\t\t\t// observe only current tab/schema\n\t\t\tobserver.observe( el, {\n\t\t\t\tsubtree: true,\n\t\t\t\tchildList: true,\n\t\t\t\tattributes: true\n\t\t\t} );\n\n\t\t\tMutationObservers[ schemaName ] = observer;\n\t\t}\n\t}\n\n\tfunction onMutationChange( schemaName, rootEl, matchedClasses ) {\n\t\t// *** this unfortunately does not solve the issue\n\t\t// so we pause the observer with disconnect\n\t\t// var VisualEditorIgnoreClasses = [ 've-for-all-waiting-for-update' ];\n\t\t// if ( Array.isArray( matchedClasses ) &&\n\t\t// \tVisualDataFunctions.arrayIntersect( matchedClasses, VisualEditorIgnoreClasses ).length\n\t\t// ) {\n\t\t// \treturn;\n\t\t// }\n\t\tif ( schemaName in MutationObservers ) {\n\t\t\tMutationObservers[ schemaName ].disconnect();\n\t\t}\n\n\t\tvar promises = [ loadMaps() ]\n\t\t\t.concat( showLazyWidget( 'VisualDataVisualEditor' ) )\n\t\t\t.concat( showLazyWidget( 'VisualDataTinyMCE' ) );\n\n\t\t// *** MutationObservers[ sourceModel.schemaName ].disconnect()\n\t\t// could be called here and resumed on completion\n\t\t// of the loop and the updateFieldsVisibility (asynch) function\n\t\t// however updateFieldsVisibility is also called on inputs\n\t\t// change\n\t\tvar models = ModelFlatten.filter( ( x ) => x.schemaName === schemaName );\n\t\tfor ( var i in models ) {\n\t\t\tpromises.push( updateFieldsVisibility( models[ i ] ) );\n\t\t}\n\n\t\tVisualDataFunctions.promisesAllSettled( promises ).then( ( res ) => {\n\t\t\tsetMutation( schemaName, rootEl );\n\t\t} ).catch( ( err ) => {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log( err );\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[ 'edit-page' ] !== '' ) {\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\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 !== '' && schemaHasData( Form.options.schema ) ) {\n\t\t\t\t\t// initializePropertiesStack();\n\t\t\t\t\t// ProcessModel.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\targs.push( StoredJsonData.schemas[ Form.options.schema ] );\n\t\t\t\t}\n\t\t\t\tVisualDataFunctions.executeFunctionByName( Form.options.callback, window, args );\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\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\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\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\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};\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\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 ( !config.caneditdata ) {\n\t\t\t\t// form.options.title\n\t\t\t\t$( '#visualdataform-wrapper-' + formID ).addClass( 'visualdata-form-wrapper-cannot-edit' );\n\t\t\t\t$( '#visualdataform-wrapper-' + formID ).html( mw.msg( 'visualdata-jsmodule-forms-cannot-edit-form' ) );\n\t\t\t\tcontinue;\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\treturn instances;\n\t}\n\n\tif ( !config.canmanageschemas ) {\n\t\tVisualData.setVars( config, schemas, init() );\n\n\t} else {\n\t\tvar modules = [ 'ext.VisualData.ManageSchemas' ];\n\n\t\t// *** this prevents errors if 'ext.VisualData.Datatables'\n\t\t// was already loaded through DatatableResultPrinter\n\t\t// @TODO the best solution is to use scoped versions\n\t\tif ( !$.fn.DataTable ) {\n\t\t\tmodules.unshift( 'ext.VisualData.DatatablesLite' );\n\t\t}\n\t\tmw.loader.using( modules, 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":977,"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":127,"column":52,"nodeType":"Literal","messageId":"unnecessaryEscape","endLine":127,"endColumn":53,"suggestions":[{"messageId":"removeEscape","fix":{"range":[3665,3666],"text":""},"desc":"Remove the `\\`. This maintains the current functionality."},{"messageId":"escapeBackslash","fix":{"range":[3665,3665],"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":127,"column":54,"nodeType":"Literal","messageId":"unnecessaryEscape","endLine":127,"endColumn":55,"suggestions":[{"messageId":"removeEscape","fix":{"range":[3667,3668],"text":""},"desc":"Remove the `\\`. This maintains the current functionality."},{"messageId":"escapeBackslash","fix":{"range":[3667,3667],"text":"\\"},"desc":"Replace the `\\` with `\\\\` to include the actual backslash character."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":283,"column":3,"nodeType":"MemberExpression","messageId":"unexpected","endLine":283,"endColumn":14,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"log"},"fix":{"range":[7627,7645],"text":""},"desc":"Remove the console.log()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":528,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":528,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":529,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":529,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":530,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":530,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":531,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":531,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":532,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":532,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":533,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":533,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-sequences","severity":2,"message":"Unexpected use of comma operator.","line":685,"column":59,"nodeType":"SequenceExpression","messageId":"unexpectedCommaExpression","endLine":685,"endColumn":60,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":808,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":808,"endColumn":17,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[21564,21638],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'e' is defined but never used.","line":819,"column":47,"nodeType":"Identifier","messageId":"unusedVar","endLine":819,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-self-compare","severity":2,"message":"Comparing to itself is potentially pointless.","line":834,"column":39,"nodeType":"BinaryExpression","messageId":"comparingToSelf","endLine":834,"endColumn":54,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":922,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":922,"endColumn":18,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[24113,24165],"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/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":439,"column":4,"nodeType":"FunctionDeclaration","messageId":"moveDeclToRoot","endLine":444,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-inner-declarations","severity":2,"message":"Move function declaration to function body root.","line":449,"column":4,"nodeType":"FunctionDeclaration","messageId":"moveDeclToRoot","endLine":454,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-inner-declarations","severity":2,"message":"Move function declaration to function body root.","line":457,"column":4,"nodeType":"FunctionDeclaration","messageId":"moveDeclToRoot","endLine":462,"endColumn":5,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'property' is defined but never used.","line":475,"column":45,"nodeType":"Identifier","messageId":"unusedVar","endLine":475,"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":840,"column":1,"nodeType":"Program","messageId":"max","endLine":840,"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":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":296,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":296,"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":306,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":306,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":427,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":427,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":428,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":428,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":487,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":487,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":488,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":488,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":496,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":496,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":497,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":497,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":651,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":651,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":652,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":652,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":680,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":680,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":681,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":681,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":717,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":717,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":718,"column":11,"nodeType":"Program","messageId":"unexpectedTab","endLine":718,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":776,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":776,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":777,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":777,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":834,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":834,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":835,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":835,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":839,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":839,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":840,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":840,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":856,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":856,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":857,"column":9,"nodeType":"Program","messageId":"unexpectedTab","endLine":857,"endColumn":10,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'data' is assigned a value but never used.","line":1090,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":1090,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'property' is defined but never used.","line":1158,"column":45,"nodeType":"Identifier","messageId":"unusedVar","endLine":1158,"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\tcase 'LookupElement':\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\tcase 'MenuTagSearchMultiselect':\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 VisualDataFunctions.sort( 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/VisualDataMaps.js","messages":[{"ruleId":"max-len","severity":1,"message":"This line has a length of 108. Maximum allowed is 100.","line":35,"column":1,"nodeType":"Program","messageId":"max","endLine":35,"endColumn":103},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":119,"column":2,"nodeType":"CallExpression","endLine":119,"endColumn":24}],"suppressedMessages":[{"ruleId":"no-unused-vars","severity":2,"message":"'el' is defined but never used.","line":24,"column":35,"nodeType":"Identifier","messageId":"unusedVar","endLine":24,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'tiles' is assigned a value but never used.","line":60,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":60,"endColumn":12,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_popup'.","line":94,"column":38,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":94,"endColumn":50,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in '_popup'.","line":97,"column":44,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":97,"endColumn":56,"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 © 2025, https://wikisphere.org\n */\n\n/* eslint-disable no-unused-vars */\n\nconst VisualDataMaps = function ( el ) {\n\n\tvar getFilteredMarkers = function ( markersArr ) {\n\t\tvar latLngs = markersArr.map( ( marker ) => marker.getLatLng() );\n\n\t\tvar center = L.latLng(\n\t\t\tlatLngs.reduce( ( sum, latLng ) => sum + latLng.lat, 0 ) / latLngs.length,\n\t\t\tlatLngs.reduce( ( sum, latLng ) => sum + latLng.lng, 0 ) / latLngs.length\n\t\t);\n\n\t\tvar distances = latLngs.map( ( latLng ) => center.distanceTo( latLng ) );\n\t\tvar averageDistance = distances.reduce( ( sum, distance ) => sum + distance, 0 ) / distances.length;\n\n\t\treturn markersArr.filter( ( marker ) =>\n\t\t\tcenter.distanceTo( marker.getLatLng() ) <= averageDistance\n\t\t);\n\t};\n\n\treturn {\n\t\tgetFilteredMarkers\n\t};\n};\n\n$( function () {\n\t// @see https://leafletjs.com/reference.html#popup-option\n\t// @see view-source:https://leaflet.github.io/Leaflet.markercluster/example/marker-clustering-realworld.10000.html\n\n\tfunction init( $el ) {\n\t\tvar visualDataMaps = new VisualDataMaps( $el );\n\n\t\tvar data = $el.data();\n\t\tvar params = data.params;\n\t\tvar json = data.json;\n\n\t\tvar map = L.map( $el.get( 0 ), params.map );\n\n\t\tvar tiles = L.tileLayer(\n\t\t\t'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',\n\t\t\tparams.tileLayer\n\t\t).addTo( map );\n\n\t\tvar markers = ( !params.markerCluster ?\n\t\t\tL.layerGroup() :\n\t\t\tL.markerClusterGroup( params.markerClusterGroup ) );\n\n\t\t// for some reason the images aren't loaded\n\t\t// relatively from leaflet.js\n\t\tvar mw_extensionAssetsPath = mw.config.get( 'wgExtensionAssetsPath' );\n\t\tvar basePath = mw_extensionAssetsPath + '/VisualData/resources/Leaflet/images/';\n\n\t\tfor ( var key of [ 'iconUrl', 'iconRetinaUrl', 'shadowUrl' ] ) {\n\t\t\tparams.icon[ key ] = basePath + params.icon[ key ];\n\t\t}\n\n\t\tvar markersArr = [ ];\n\t\tfor ( var value of json ) {\n\t\t\tvar markerOptions = params.marker;\n\n\t\t\tmarkerOptions.icon = L.icon( params.icon );\n\n\t\t\tif ( params.markerTooltip && value.name ) {\n\t\t\t\tmarkerOptions.title = value.name;\n\t\t\t}\n\n\t\t\tvar marker = L.marker(\n\t\t\t\tL.latLng( value.latitude, value.longitude ),\n\t\t\t\tmarkerOptions\n\t\t\t);\n\n\t\t\t// eslint-disable-next-line no-underscore-dangle\n\t\t\tif ( value.name || value.popup || value._popup ) {\n\t\t\t\tvar customPopup = L.popup( params.popup );\n\t\t\t\t// eslint-disable-next-line no-underscore-dangle\n\t\t\t\tcustomPopup.setContent( value.popup || value._popup || value.name );\n\t\t\t\tmarker.bindPopup( customPopup );\n\t\t\t}\n\n\t\t\tmarkers.addLayer( marker );\n\t\t\tmarkersArr.push( marker );\n\t\t}\n\n\t\tmap.addLayer( markers );\n\n\t\tvar filteredMarkers = visualDataMaps.getFilteredMarkers( markersArr );\n\t\tif ( filteredMarkers.length > 1 ) {\n\t\t\tvar featureGroup = L.featureGroup( filteredMarkers );\n\t\t\tmap.fitBounds( featureGroup.getBounds(), params.map.fitBounds );\n\n\t\t} else if ( markersArr.length === 1 ) {\n\t\t\tmap.setView( L.latLng( json[ 0 ].latitude, json[ 0 ].longitude ),\n\t\t\t\tparams.map.zoom\n\t\t\t);\n\t\t}\n\t}\n\n\t$( '.visualdata-map' ).each( function () {\n\t\tinit( $( this ) );\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":"max-len","severity":1,"message":"This line has a length of 116. Maximum allowed is 100.","line":199,"column":1,"nodeType":"Program","messageId":"max","endLine":199,"endColumn":105},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":203,"column":11,"nodeType":"CallExpression","endLine":203,"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":87,"column":7,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":87,"endColumn":58,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":100,"column":5,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":100,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":110,"column":3,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":110,"endColumn":19,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":118,"column":4,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":118,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"new-cap","severity":2,"message":"A constructor name should not start with a lowercase letter.","line":128,"column":26,"nodeType":"NewExpression","messageId":"lower","endLine":128,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":134,"column":4,"nodeType":"MemberExpression","messageId":"unexpected","endLine":134,"endColumn":17,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[3511,3542],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":172,"column":10,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":172,"endColumn":62,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":175,"column":26,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":175,"endColumn":42,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":176,"column":7,"nodeType":"MemberExpression","messageId":"unexpectedUnderscore","endLine":176,"endColumn":23,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":182,"column":15,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":182,"endColumn":20,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":191,"column":5,"nodeType":"MemberExpression","messageId":"unexpected","endLine":191,"endColumn":18,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[5503,5526],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":234,"column":11,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":234,"endColumn":37,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'path_'.","line":262,"column":10,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":262,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":321,"column":6,"nodeType":"MemberExpression","messageId":"unexpected","endLine":321,"endColumn":19,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[8662,8693],"text":""},"desc":"Remove the console.error()."}],"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 © 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\tasync function getValue( model, errors ) {\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.push( 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\treturn value;\n\t}\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.escapeJsonPointer( 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.escapeJsonPointer( 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.escapeJsonPointer( schemaName ) }${ error.instancePath }`;\n\n\t\t\t\t// check if multiselect\n\t\t\t\t// @FIXME add specific reference to arrays\n\t\t\t\tif ( !( path in Flatten ) && /\\/\\d+$/.test( path ) ) {\n\t\t\t\t\tvar path_ = path.split( '/' ).slice( 0, -1 ).join( '/' );\n\n\t\t\t\t\tif ( ( path_ in Flatten ) &&\n\t\t\t\t\t\t( 'multiselect' in Flatten[ path_ ] ) &&\n\t\t\t\t\t\tFlatten[ path_ ].multiselect === true\n\t\t\t\t\t) {\n\t\t\t\t\t\tpath = path_;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor ( var path_ of Removed ) {\n\t\t\t\t\tif ( path === path_ ||\n\t\t\t\t\t\t// @FIXME add specific reference to arrays\n\t\t\t\t\t\t( /\\/\\d+$/.test( path_ ) && 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\t// ignore NaN values if the field is not required\n\t\t\t\tif ( VisualDataFunctions.isNaN( Flatten[ path ].value ) && !Flatten[ path ].schema.wiki.required ) {\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\t// @TODO handle tuple\n\t\t\t\tif ( !VisualDataFunctions.isObject( model.items ) ) {\n\t\t\t\t\treturn [];\n\t\t\t\t}\n\t\t\t\tvar items = [];\n\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.escapeJsonPointer( 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.escapeJsonPointer( 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.escapeJsonPointer( 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.escapeJsonPointer( 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.escapeJsonPointer( 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\tgetValue\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":328,"column":1,"nodeType":"Program","messageId":"max","endLine":328,"endColumn":95},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":643,"column":8,"nodeType":"CallExpression","endLine":700,"endColumn":12},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":643,"column":8,"nodeType":"CallExpression","endLine":705,"endColumn":12},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":1615,"column":15,"nodeType":"CallExpression","endLine":1615,"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":1792,"column":4,"nodeType":"CallExpression","endLine":1792,"endColumn":27},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":1795,"column":15,"nodeType":"CallExpression","endLine":1797,"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":1811,"column":4,"nodeType":"CallExpression","endLine":1811,"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":1854,"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":[2436,2474],"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":131,"column":27,"nodeType":"FunctionExpression","messageId":"expectedInside","endLine":131,"endColumn":36,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'tableLoop' is defined but never used.","line":131,"column":46,"nodeType":"Identifier","messageId":"unusedVar","endLine":131,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'rowLoop' is defined but never used.","line":131,"column":57,"nodeType":"Identifier","messageId":"unusedVar","endLine":131,"endColumn":64,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'meta' is defined but never used.","line":291,"column":47,"nodeType":"Identifier","messageId":"unusedVar","endLine":291,"endColumn":51,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'thisIsArray' is assigned a value but never used.","line":328,"column":37,"nodeType":"Identifier","messageId":"unusedVar","endLine":328,"endColumn":48,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":446,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":446,"endColumn":6,"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-alert","severity":2,"message":"Unexpected confirm.","line":557,"column":6,"nodeType":"CallExpression","messageId":"unexpected","endLine":557,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-fallthrough","severity":1,"message":"Expected a 'break' statement before 'case'.","line":637,"column":6,"nodeType":"SwitchCase","messageId":"case","endLine":714,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-console","severity":2,"message":"Unexpected console statement.","line":703,"column":10,"nodeType":"MemberExpression","messageId":"unexpected","endLine":703,"endColumn":23,"suggestions":[{"messageId":"removeConsole","data":{"propertyName":"error"},"fix":{"range":[18931,18978],"text":""},"desc":"Remove the console.error()."}],"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unreachable","severity":2,"message":"Unreachable code.","line":719,"column":3,"nodeType":"ReturnStatement","messageId":"unreachableCode","endLine":719,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":791,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":791,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-alert","severity":2,"message":"Unexpected confirm.","line":881,"column":6,"nodeType":"CallExpression","messageId":"unexpected","endLine":881,"endColumn":78,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":883,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":883,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-underscore-dangle","severity":2,"message":"Unexpected dangling '_' in 'target_'.","line":975,"column":9,"nodeType":"VariableDeclarator","messageId":"unexpectedUnderscore","endLine":977,"endColumn":25,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1088,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1088,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1089,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1089,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1090,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1090,"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":1095,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1095,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1096,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1096,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1097,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1097,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1098,"column":7,"nodeType":"Program","messageId":"unexpectedTab","endLine":1098,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1313,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":1313,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1321,"column":8,"nodeType":"Program","messageId":"unexpectedTab","endLine":1321,"endColumn":9,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1591,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1591,"endColumn":6,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1592,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1592,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1593,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1593,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1594,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1594,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1595,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1595,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":1596,"column":5,"nodeType":"Program","messageId":"unexpectedTab","endLine":1596,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":2,"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-2024, 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\tvar ret = SelectedItems[ SelectedItems.length - 1 ];\n\n\t\tif ( ret.type === 'array' && !ret.items ) {\n\t\t\tret.items = { wiki: {}, properties: {} };\n\t\t}\n\n\t\treturn ret;\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 = thisItem.wiki[ 'jsonSchema-type' ] +\n\t\t\t\t\t\t( thisItem.wiki[ 'jsonSchema-type' ] !== 'string' ?\n\t\t\t\t\t\t\t'' :\n\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\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\tvar visibilityInputValue = getPropertyValue( 'visibility' ) || 'visible';\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} ),\n\t\t\tvalue: visibilityInputValue\n\t\t} );\n\n\t\tmodel.visibility = visibilityInput;\n\n\t\tvar items = [\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\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 ParentObj = SelectedItems[ SelectedItems.length - 2 ].properties;\n\n\t\tvar otherFields = Object.keys( ParentObj ).filter( ( x ) => {\n\t\t\treturn ( 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\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\tfunction onVisibilityInputChange( value ) {\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\t// ------------------ show-if >>>>>>>>>>>>>>>>>\n\n\t\tfieldset.addItems( items );\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\t// @FIXME with arrays this is mistakenly copying to\n\t\t// the child, not the parent schema\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, '&' )\n\t// \t\t.replace( /</g, '<' )\n\t// \t\t.replace( />/g, '>' )\n\t// \t\t.replace( /\"/g, '"' )\n\t// \t\t.replace( /'/g, ''' );\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":[{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":128,"column":3,"nodeType":"CallExpression","endLine":131,"endColumn":6},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":280,"column":3,"nodeType":"CallExpression","endLine":290,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":280,"column":3,"nodeType":"CallExpression","endLine":304,"endColumn":5},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .done","line":369,"column":3,"nodeType":"CallExpression","endLine":375,"endColumn":7},{"ruleId":"no-jquery/no-done-fail","severity":2,"message":"Prefer .then to .fail","line":369,"column":3,"nodeType":"CallExpression","endLine":378,"endColumn":7}],"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":5,"fatalErrorCount":0,"warningCount":0,"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// @credits resources/src/mediawiki.Upload.BookletLayout/BookletLayout.js\n\n\t// eslint-disable-next-line no-implicit-globals\n\tVisualDataUpload = function ( config ) {\n\t\t// Parent constructor\n\t\tVisualDataUpload.parent.call( this, config );\n\n\t\t// this.$overlay = config.$overlay;\n\t\t// this.filekey = config.filekey;\n\t};\n\n\t/* Setup */\n\n\tOO.inheritClass( VisualDataUpload, OO.ui.BookletLayout );\n\n\tVisualDataUpload.prototype.initialize = function (\n\t\tselectFileWidget,\n\t\tparentWidget\n\t) {\n\t\t// this.clear();\n\t\tthis.upload = this.createUpload();\n\n\t\tthis.selectFileWidget = selectFileWidget;\n\t\t// this.filenameWidget = filenameWidget;\n\t\tthis.parentWidget = parentWidget;\n\t};\n\n\tVisualDataUpload.prototype.createUpload = function () {\n\t\treturn new mw.Upload( {\n\t\t\tparameters: {\n\t\t\t\terrorformat: 'html',\n\t\t\t\terrorlang: mw.config.get( 'wgUserLanguage' ),\n\t\t\t\terrorsuselocal: 1,\n\t\t\t\tformatversion: 2\n\t\t\t}\n\t\t} );\n\t};\n\n\tVisualDataUpload.prototype.uploadFiles = function ( files ) {\n\t\tfor ( var i in files ) {\n\t\t\tthis.uploadFile( files[ i ] );\n\t\t}\n\t};\n\n\tVisualDataUpload.prototype.uploadFile = function ( file ) {\n\t\tvar deferred = $.Deferred(),\n\t\t\tstartTime = mw.now(),\n\t\t\tlayout = this;\n\n\t\tif ( this.filekey ) {\n\t\t\tif ( file === null ) {\n\t\t\t\t// Someone gonna get-a hurt real bad\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"filekey not passed into file select widget, which is impossible. Quitting while we're behind.\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Stashed file already uploaded.\n\t\t\tdeferred.resolve();\n\t\t\tthis.uploadPromise = deferred;\n\t\t\tthis.parentWidget.emit( 'fileUploaded', file );\n\t\t\treturn deferred;\n\t\t}\n\n\t\tthis.setFilename( file.name );\n\n\t\tlayout.parentWidget.emit( 'fileUploadInit', file );\n\n\t\tthis.upload.setFile( file );\n\t\t// The original file name might contain invalid characters, so use our sanitized one\n\t\tthis.upload.setFilename( this.getFilename() );\n\t\t// this.upload.setFilename( this.selectFileWidget.getValue().name );\n\n\t\tthis.upload.upload().then(\n\t\t\tfunction ( res ) {\n\t\t\t\tdeferred.resolve();\n\t\t\t\tlayout.parentWidget.emit( 'fileUploadComplete', file, res );\n\t\t\t},\n\t\t\tfunction () {\n\t\t\t\t// These errors will be thrown while the user is on the info page.\n\t\t\t\tlayout.getErrorMessageForStateDetails().then( function ( errorMessage ) {\n\t\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\t\tconsole.error( 'errorMessage', errorMessage );\n\t\t\t\t\tdeferred.reject( errorMessage );\n\t\t\t\t\tlayout.parentWidget.emit( 'fileUploadErrorMessage', file, errorMessage );\n\t\t\t\t} );\n\t\t\t},\n\t\t\tfunction ( progress ) {\n\t\t\t\tvar elapsedTime = mw.now() - startTime,\n\t\t\t\t\testimatedTotalTime = ( 1 / progress ) * elapsedTime,\n\t\t\t\t\testimatedRemainingTime = moment.duration(\n\t\t\t\t\t\testimatedTotalTime - elapsedTime\n\t\t\t\t\t);\n\n\t\t\t\tlayout.parentWidget.emit(\n\t\t\t\t\t'fileUploadProgress',\n\t\t\t\t\tfile,\n\t\t\t\t\tprogress,\n\t\t\t\t\testimatedRemainingTime\n\t\t\t\t);\n\t\t\t\t// console.log(\"fileUploadProgress\", progress, estimatedRemainingTime);\n\t\t\t}\n\t\t);\n\n\t\t// cancel uploading\n\t\tdeferred.fail( function ( res ) {\n\t\t\t// layout.setPage( 'upload' );\n\t\t\tlayout.parentWidget.emit( 'fileUploadFail', file, res );\n\t\t} );\n\n\t\treturn deferred;\n\t};\n\n\tVisualDataUpload.prototype.getErrorMessageForStateDetails = function () {\n\t\tvar state = this.upload.getState(),\n\t\t\tstateDetails = this.upload.getStateDetails(),\n\t\t\twarnings = stateDetails.upload && stateDetails.upload.warnings,\n\t\t\t$ul = $( '<ul>' ),\n\t\t\t$error;\n\n\t\tif ( state === mw.Upload.State.ERROR ) {\n\t\t\t$error = new mw.Api().getErrorMessage( stateDetails );\n\n\t\t\treturn $.Deferred().resolve(\n\t\t\t\tnew OO.ui.Error( $error, { recoverable: false } )\n\t\t\t);\n\t\t}\n\n\t\tif ( state === mw.Upload.State.WARNING ) {\n\t\t\t// We could get more than one of these errors, these are in order\n\t\t\t// of importance. For example fixing the thumbnail like file name\n\t\t\t// won't help the fact that the file already exists.\n\t\t\tif ( warnings.exists !== undefined ) {\n\t\t\t\treturn $.Deferred().resolve(\n\t\t\t\t\tnew OO.ui.Error(\n\t\t\t\t\t\t$( '<p>' ).msg( 'fileexists', 'File:' + warnings.exists ),\n\t\t\t\t\t\t{ recoverable: false }\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else if ( warnings[ 'exists-normalized' ] !== undefined ) {\n\t\t\t\treturn $.Deferred().resolve(\n\t\t\t\t\tnew OO.ui.Error(\n\t\t\t\t\t\t$( '<p>' ).msg( 'fileexists', 'File:' + warnings[ 'exists-normalized' ] ),\n\t\t\t\t\t\t{ recoverable: false }\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else if ( warnings[ 'page-exists' ] !== undefined ) {\n\t\t\t\treturn $.Deferred().resolve(\n\t\t\t\t\tnew OO.ui.Error(\n\t\t\t\t\t\t$( '<p>' ).msg( 'filepageexists', 'File:' + warnings[ 'page-exists' ] ),\n\t\t\t\t\t\t{ recoverable: false }\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else if ( Array.isArray( warnings.duplicate ) ) {\n\t\t\t\twarnings.duplicate.forEach( function ( filename ) {\n\t\t\t\t\tvar $a = $( '<a>' ).text( filename ),\n\t\t\t\t\t\thref = mw.Title.makeTitle(\n\t\t\t\t\t\t\tmw.config.get( 'wgNamespaceIds' ).file,\n\t\t\t\t\t\t\tfilename\n\t\t\t\t\t\t).getUrl( {} );\n\n\t\t\t\t\t$a.attr( { href: href, target: '_blank' } );\n\t\t\t\t\t$ul.append( $( '<li>' ).append( $a ) );\n\t\t\t\t} );\n\n\t\t\t\treturn $.Deferred().resolve(\n\t\t\t\t\tnew OO.ui.Error(\n\t\t\t\t\t\t$( '<p>' )\n\t\t\t\t\t\t\t.msg( 'file-exists-duplicate', warnings.duplicate.length )\n\t\t\t\t\t\t\t.append( $ul ),\n\t\t\t\t\t\t{ recoverable: false }\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else if ( warnings[ 'thumb-name' ] !== undefined ) {\n\t\t\t\treturn $.Deferred().resolve(\n\t\t\t\t\tnew OO.ui.Error( $( '<p>' ).msg( 'filename-thumb-name' ), {\n\t\t\t\t\t\trecoverable: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\t\t\t} else if ( warnings[ 'bad-prefix' ] !== undefined ) {\n\t\t\t\treturn $.Deferred().resolve(\n\t\t\t\t\tnew OO.ui.Error(\n\t\t\t\t\t\t$( '<p>' ).msg( 'filename-bad-prefix', warnings[ 'bad-prefix' ] ),\n\t\t\t\t\t\t{ recoverable: false }\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else if ( warnings[ 'duplicate-archive' ] !== undefined ) {\n\t\t\t\treturn $.Deferred().resolve(\n\t\t\t\t\tnew OO.ui.Error(\n\t\t\t\t\t\t$( '<p>' ).msg(\n\t\t\t\t\t\t\t'file-deleted-duplicate',\n\t\t\t\t\t\t\t'File:' + warnings[ 'duplicate-archive' ]\n\t\t\t\t\t\t),\n\t\t\t\t\t\t{ recoverable: false }\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else if ( warnings[ 'was-deleted' ] !== undefined ) {\n\t\t\t\treturn $.Deferred().resolve(\n\t\t\t\t\tnew OO.ui.Error(\n\t\t\t\t\t\t$( '<p>' ).msg( 'filewasdeleted', 'File:' + warnings[ 'was-deleted' ] ),\n\t\t\t\t\t\t{ recoverable: false }\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t} else if ( warnings.badfilename !== undefined ) {\n\t\t\t\t// Change the name if the current name isn't acceptable\n\t\t\t\t// TODO This might not really be the best place to do this\n\t\t\t\tthis.setFilename( warnings.badfilename );\n\t\t\t\treturn $.Deferred().resolve(\n\t\t\t\t\tnew OO.ui.Error( $( '<p>' ).msg( 'badfilename', warnings.badfilename ) )\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\treturn $.Deferred().resolve(\n\t\t\t\t\tnew OO.ui.Error(\n\t\t\t\t\t\t// Let's get all the help we can if we can't pin point the error\n\t\t\t\t\t\t$( '<p>' ).msg(\n\t\t\t\t\t\t\t'api-error-unknown-warning',\n\t\t\t\t\t\t\tJSON.stringify( stateDetails )\n\t\t\t\t\t\t),\n\t\t\t\t\t\t{ recoverable: false }\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n\n\tVisualDataUpload.prototype.renderUploadForm = function () {\n\t\tvar fieldset,\n\t\t\tlayout = this;\n\n\t\tthis.selectFileWidget = this.getFileWidget();\n\t\tfieldset = new OO.ui.FieldsetLayout();\n\t\tfieldset.addItems( [ this.selectFileWidget ] );\n\t\tthis.uploadForm = new OO.ui.FormLayout( { items: [ fieldset ] } );\n\n\t\t// Validation (if the SFW is for a stashed file, this never fires)\n\t\tthis.selectFileWidget.on( 'change', this.onUploadFormChange.bind( this ) );\n\n\t\tthis.selectFileWidget.on( 'change', function () {\n\t\t\tlayout.updateFilePreview();\n\t\t} );\n\n\t\treturn this.uploadForm;\n\t};\n\n\tVisualDataUpload.prototype.getFileWidget = function () {\n\t\tif ( this.filekey ) {\n\t\t\treturn new mw.widgets.StashedFileWidget( {\n\t\t\t\tfilekey: this.filekey\n\t\t\t} );\n\t\t}\n\n\t\treturn new OO.ui.SelectFileWidget( {\n\t\t\tshowDropTarget: true\n\t\t} );\n\t};\n\n\tVisualDataUpload.prototype.updateFilePreview = function () {\n\t\tthis.selectFileWidget\n\t\t\t.loadAndGetImageUrl()\n\t\t\t.done(\n\t\t\t\tfunction ( url ) {\n\t\t\t\t\tthis.filePreview.$element.find( 'p' ).remove();\n\t\t\t\t\tthis.filePreview.$element.css( 'background-image', 'url(' + url + ')' );\n\t\t\t\t\tthis.infoForm.$element.addClass(\n\t\t\t\t\t\t'mw-upload-bookletLayout-hasThumbnail'\n\t\t\t\t\t);\n\t\t\t\t}.bind( this )\n\t\t\t)\n\t\t\t.fail(\n\t\t\t\tfunction () {\n\t\t\t\t\tthis.filePreview.$element.find( 'p' ).remove();\n\t\t\t\t\tif ( this.selectFileWidget.getValue() ) {\n\t\t\t\t\t\tthis.filePreview.$element.append(\n\t\t\t\t\t\t\t$( '<p>' ).text( this.selectFileWidget.getValue().name )\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthis.filePreview.$element.css( 'background-image', '' );\n\t\t\t\t\tthis.infoForm.$element.removeClass(\n\t\t\t\t\t\t'mw-upload-bookletLayout-hasThumbnail'\n\t\t\t\t\t);\n\t\t\t\t}.bind( this )\n\t\t\t);\n\t};\n\n\tVisualDataUpload.prototype.onUploadFormChange = function () {\n\t\tthis.emit( 'uploadValid', !!this.selectFileWidget.getValue() );\n\t};\n\n\tVisualDataUpload.prototype.renderInfoForm = function () {\n\t\tvar fieldset;\n\n\t\tthis.filePreview = new OO.ui.Widget( {\n\t\t\tclasses: [ 'mw-upload-bookletLayout-filePreview' ]\n\t\t} );\n\t\tthis.progressBarWidget = new OO.ui.ProgressBarWidget( {\n\t\t\tprogress: 0\n\t\t} );\n\t\tthis.filePreview.$element.append( this.progressBarWidget.$element );\n\n\t\tthis.filenameWidget = new OO.ui.TextInputWidget( {\n\t\t\tindicator: 'required',\n\t\t\trequired: true,\n\t\t\tvalidate: /.+/\n\t\t} );\n\t\tthis.descriptionWidget = new OO.ui.MultilineTextInputWidget( {\n\t\t\tindicator: 'required',\n\t\t\trequired: true,\n\t\t\tvalidate: /\\S+/,\n\t\t\tautosize: true\n\t\t} );\n\n\t\tfieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: mw.msg( 'upload-form-label-infoform-title' )\n\t\t} );\n\t\tfieldset.addItems( [\n\t\t\tnew OO.ui.FieldLayout( this.filenameWidget, {\n\t\t\t\tlabel: mw.msg( 'upload-form-label-infoform-name' ),\n\t\t\t\talign: 'top',\n\t\t\t\thelp: mw.msg( 'upload-form-label-infoform-name-tooltip' )\n\t\t\t} ),\n\t\t\tnew OO.ui.FieldLayout( this.descriptionWidget, {\n\t\t\t\tlabel: mw.msg( 'upload-form-label-infoform-description' ),\n\t\t\t\talign: 'top',\n\t\t\t\thelp: mw.msg( 'upload-form-label-infoform-description-tooltip' )\n\t\t\t} )\n\t\t] );\n\t\tthis.infoForm = new OO.ui.FormLayout( {\n\t\t\tclasses: [ 'mw-upload-bookletLayout-infoForm' ],\n\t\t\titems: [ this.filePreview, fieldset ]\n\t\t} );\n\n\t\tthis.on(\n\t\t\t'fileUploadProgress',\n\t\t\tfunction ( progress ) {\n\t\t\t\tthis.progressBarWidget.setProgress( progress * 100 );\n\t\t\t}.bind( this )\n\t\t);\n\n\t\tthis.filenameWidget.on( 'change', this.onInfoFormChange.bind( this ) );\n\t\tthis.descriptionWidget.on( 'change', this.onInfoFormChange.bind( this ) );\n\n\t\treturn this.infoForm;\n\t};\n\n\tVisualDataUpload.prototype.onInfoFormChange = function () {\n\t\tvar layout = this;\n\t\t$.when(\n\t\t\tthis.filenameWidget.getValidity(),\n\t\t\tthis.descriptionWidget.getValidity()\n\t\t)\n\t\t\t.done( function () {\n\t\t\t\tlayout.emit( 'infoValid', true );\n\t\t\t} )\n\t\t\t.fail( function () {\n\t\t\t\tlayout.emit( 'infoValid', false );\n\t\t\t} );\n\t};\n\n\tVisualDataUpload.prototype.renderInsertForm = function () {\n\t\tvar fieldset;\n\n\t\tthis.filenameUsageWidget = new OO.ui.TextInputWidget();\n\t\tfieldset = new OO.ui.FieldsetLayout( {\n\t\t\tlabel: mw.msg( 'upload-form-label-usage-title' )\n\t\t} );\n\t\tfieldset.addItems( [\n\t\t\tnew OO.ui.FieldLayout( this.filenameUsageWidget, {\n\t\t\t\tlabel: mw.msg( 'upload-form-label-usage-filename' ),\n\t\t\t\talign: 'top'\n\t\t\t} )\n\t\t] );\n\t\tthis.insertForm = new OO.ui.FormLayout( { items: [ fieldset ] } );\n\n\t\treturn this.insertForm;\n\t};\n\n\tVisualDataUpload.prototype.getFile = function () {\n\t\treturn this.selectFileWidget.getValue();\n\t};\n\n\tVisualDataUpload.prototype.getFilename = function () {\n\t\t// var filename = this.filenameWidget.getValue();\n\t\tvar filename = this.filename;\n\t\tif ( this.filenameExtension ) {\n\t\t\tfilename += '.' + this.filenameExtension;\n\t\t}\n\t\treturn filename;\n\t};\n\n\tVisualDataUpload.prototype.setFilename = function ( filename ) {\n\t\tvar title = mw.Title.newFromFileName( filename );\n\n\t\tif ( title ) {\n\t\t\t// this.filenameWidget.setValue( title.getNameText() );\n\t\t\tthis.filenameExtension = mw.Title.normalizeExtension(\n\t\t\t\ttitle.getExtension()\n\t\t\t);\n\n\t\t\tthis.filename = title.getNameText();\n\t\t} else {\n\t\t\t// Seems to happen for files with no extension, which should fail some checks anyway...\n\t\t\t// this.filenameWidget.setValue( filename );\n\t\t\tthis.filename = filename;\n\t\t\tthis.filenameExtension = null;\n\t\t}\n\t};\n\n\tVisualDataUpload.prototype.getText = function () {\n\t\treturn this.descriptionWidget.getValue();\n\t};\n\n\tVisualDataUpload.prototype.setFile = function ( file ) {\n\t\tthis.selectFileWidget.setValue( [ file ] );\n\t};\n\n\tVisualDataUpload.prototype.setFilekey = function ( filekey ) {\n\t\tthis.upload.setFilekey( this.filekey );\n\t\tthis.selectFileWidget.setValue( filekey );\n\n\t\tthis.onUploadFormChange();\n\t};\n\n\tVisualDataUpload.prototype.clear = function () {\n\t\tthis.selectFileWidget.setValue( null );\n\t\tthis.progressBarWidget.setProgress( 0 );\n\t\tthis.filenameWidget.setValue( null ).setValidityFlag( true );\n\t\tthis.descriptionWidget.setValue( null ).setValidityFlag( true );\n\t\tthis.filenameUsageWidget.setValue( null );\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/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/VisualDataDateTimeInputWidget.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":33,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":48,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":48,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":49,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":49,"endColumn":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":50,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":50,"endColumn":8,"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":8,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":53,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":53,"endColumn":8,"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/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":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":41,"column":9,"nodeType":"CallExpression","endLine":41,"endColumn":43},{"ruleId":"no-throw-literal","severity":2,"message":"Expected an error object to be thrown.","line":43,"column":4,"nodeType":"ThrowStatement","messageId":"object","endLine":43,"endColumn":41},{"ruleId":"max-len","severity":1,"message":"This line has a length of 102. Maximum allowed is 100.","line":66,"column":1,"nodeType":"Program","messageId":"max","endLine":66,"endColumn":91},{"ruleId":"max-len","severity":1,"message":"This line has a length of 123. Maximum allowed is 100.","line":68,"column":1,"nodeType":"Program","messageId":"max","endLine":68,"endColumn":112}],"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":"'reject' is defined but never used.","line":57,"column":34,"nodeType":"Identifier","messageId":"unusedVar","endLine":57,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'e' is defined but never used.","line":58,"column":62,"nodeType":"Identifier","messageId":"unusedVar","endLine":58,"endColumn":63,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":89,"column":27,"nodeType":"Identifier","messageId":"unusedVar","endLine":89,"endColumn":30,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":95,"column":41,"nodeType":"Identifier","messageId":"unusedVar","endLine":95,"endColumn":44,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":106,"column":37,"nodeType":"Identifier","messageId":"unusedVar","endLine":106,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":110,"column":47,"nodeType":"Identifier","messageId":"unusedVar","endLine":110,"endColumn":50,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'res' is defined but never used.","line":114,"column":47,"nodeType":"Identifier","messageId":"unusedVar","endLine":114,"endColumn":50,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":1,"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 © 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 = async function ( $element, data ) {\n\t\tvar self = this;\n\n\t\t// only load scripts\n\t\tif ( !$element.parent().is( ':visible' ) ) {\n\t\t\tVisualDataFunctions.loadScripts( this.scripts );\n\t\t\tthrow 'Maptiler element not visible';\n\t\t}\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\tif ( $( '#' + jQuery.escapeSelector( mapId ) ).length ) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\tVisualDataFunctions.loadScripts( this.scripts, function ( e ) {\n\t\t\t\tmaptilersdk.config.apiKey = mw.config.get( 'visualdata-maptiler-apikey' );\n\t\t\t\tvar $container = $( '<div style=\"width:100%;height:400px\" id=\"' + mapId + '\" />' );\n\t\t\t\t$element.append( $container );\n\n\t\t\t\tconfig[ 'maptiler-map-config' ].container = mapId;\n\t\t\t\tconfig[ 'maptiler-map-config' ].style = maptilersdk.MapStyle.HYBRID;\n\n\t\t\t\tvar center = [ parseFloat( lngInput.getValue() ), parseFloat( latInput.getValue() ) ];\n\n\t\t\t\tvar isValidCenter = !VisualDataFunctions.isNaN( center[ 0 ] ) && !VisualDataFunctions.isNaN( center[ 1 ] );\n\n\t\t\t\tif ( isValidCenter ) {\n\t\t\t\t\tconfig[ 'maptiler-map-config' ].center = center;\n\t\t\t\t\tconfig[ 'maptiler-map-config' ].zoom = parseInt( zoomInput.getValue() );\n\t\t\t\t\tconfig[ 'maptiler-map-config' ].geolocate = false;\n\n\t\t\t\t} else {\n\t\t\t\t\tif ( !( 'geolocate' in config[ 'maptiler-map-config' ] ) ) {\n\t\t\t\t\t\tconfig[ 'maptiler-map-config' ].geolocate = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst map = ( window.map = new maptilersdk.Map( config[ 'maptiler-map-config' ] ) );\n\t\t\t\tconfig[ 'maptiler-map-config' ].marker = false;\n\n\t\t\t\tvar marker;\n\n\t\t\t\tif ( config[ 'reverse-geocoding' ] ) {\n\t\t\t\t\tconst gc = new maptilersdkMaptilerGeocoder.GeocodingControl( config[ 'maptiler-map-config' ] );\n\n\t\t\t\t\tmap.on( 'zoomend', ( res ) => {\n\t\t\t\t\t\t// console.log('zoomend:', res);\n\t\t\t\t\t\tzoomInput.setValue( map.getZoom() );\n\t\t\t\t\t} );\n\n\t\t\t\t\t// https://docs.maptiler.com/sdk-js/modules/geocoding/api/api-reference/#event:featuresListed\n\t\t\t\t\tgc.addEventListener( 'response', ( res ) => {\n\t\t\t\t\t\t// console.log(\"response:\", res);\n\t\t\t\t\t} );\n\n\t\t\t\t\tgc.addEventListener( 'select', ( res ) => {\n\t\t\t\t\t\t// console.log(\"select:\", res );\n\t\t\t\t\t\tif ( res.detail ) {\n\t\t\t\t\t\t\tmarker.setLngLat( res.detail.center );\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t\tgc.addEventListener( 'pick', ( res ) => {\n\t\t\t\t\t\t// console.log(\"pick:\", res );\n\t\t\t\t\t} );\n\n\t\t\t\t\tgc.addEventListener( 'featuresListed', ( res ) => {\n\t\t\t\t\t\t// console.log(\"featuresListed:\", res);\n\t\t\t\t\t} );\n\n\t\t\t\t\tgc.addEventListener( 'featuresMarked', ( res ) => {\n\t\t\t\t\t\t// console.log(\"featuresMarked:\", res);\n\t\t\t\t\t} );\n\n\t\t\t\t\tmap.addControl( gc, 'top-left' );\n\t\t\t\t}\n\n\t\t\t\tfunction onDragEnd() {\n\t\t\t\t\tvar lngLat = marker.getLngLat();\n\t\t\t\t\tsetTimeout( function () {\n\t\t\t\t\t\tlngInput.setValue( lngLat.lng );\n\t\t\t\t\t\tlatInput.setValue( lngLat.lat );\n\t\t\t\t\t\tzoomInput.setValue( map.getZoom() );\n\t\t\t\t\t}, 100 );\n\t\t\t\t}\n\n\t\t\t\tmap.on( 'load', function () {\n\t\t\t\t\tif ( !marker ) {\n\t\t\t\t\t\tmarker = new maptilersdk.Marker( {\n\t\t\t\t\t\t\tdraggable: true\n\t\t\t\t\t\t} )\n\t\t\t\t\t\t\t.setLngLat( map.getCenter() )\n\t\t\t\t\t\t\t.addTo( map );\n\n\t\t\t\t\t\tmarker.on( 'dragend', onDragEnd );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tif ( isValidCenter ) {\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( center )\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\n\t\t\t\t// update marker\n\t\t\t\tdata.model.properties.latitude.input.on( 'change', function ( value ) {\n\t\t\t\t\tmarker.setLngLat( [ lngInput.getValue(), value ] );\n\t\t\t\t} );\n\t\t\t\tdata.model.properties.longitude.input.on( 'change', function ( value ) {\n\t\t\t\t\tmarker.setLngLat( [ value, latInput.getValue() ] );\n\t\t\t\t} );\n\n\t\t\t\tresolve();\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/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\t// allowArbitrary: 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/VisualDataTinyMCE.js","messages":[{"ruleId":"no-jquery/variable-pattern","severity":1,"message":"jQuery collection names must match the variablePattern","line":39,"column":3,"nodeType":"AssignmentExpression","endLine":41,"endColumn":34},{"ruleId":"no-jquery/no-parse-html-literal","severity":1,"message":"Prefer DOM building to parsing HTML literals","line":39,"column":19,"nodeType":"CallExpression","endLine":39,"endColumn":45},{"ruleId":"no-jquery/no-sizzle","severity":1,"message":"Selector extensions are not allowed","line":66,"column":9,"nodeType":"CallExpression","endLine":66,"endColumn":48},{"ruleId":"no-throw-literal","severity":2,"message":"Expected an error object to be thrown.","line":68,"column":4,"nodeType":"ThrowStatement","messageId":"object","endLine":68,"endColumn":40}],"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":54,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'self' is assigned a value but never used.","line":31,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":31,"endColumn":11,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":71,"column":34,"nodeType":"Identifier","messageId":"unusedVar","endLine":71,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'e' is defined but never used.","line":72,"column":62,"nodeType":"Identifier","messageId":"unusedVar","endLine":72,"endColumn":63,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":1,"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 © 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\tVisualDataTinyMCE = 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.initialized = false;\n\t\tthis.config = config;\n\n\t\tVisualDataTinyMCE.super.call( this, config );\n\n\t\tthis.textareaId = 'visualdata-tinimce-' + config.data.model.path;\n\n\t\tthis.textarea = $( '<textarea rows=\"8\">' )\n\t\t\t.attr( 'name', config.name )\n\t\t\t.attr( 'id', this.textareaId );\n\n\t\tthis.text = this.config.value || '';\n\t\tthis.textarea.val( this.text );\n\n\t\tthis.$element.append( this.textarea );\n\n\t\tvar mw_extensionAssetsPath = mw.config.get( 'wgExtensionAssetsPath' );\n\t\tthis.basePath = mw_extensionAssetsPath + '/VisualData/resources/tinymce';\n\n\t\tthis.scripts = [\n\t\t\tthis.basePath + '/tinymce.min.js'\n\t\t];\n\t};\n\n\tOO.inheritClass( VisualDataTinyMCE, OO.ui.Widget );\n\tOO.mixinClass( VisualDataTinyMCE, OO.EventEmitter );\n\n\tVisualDataTinyMCE.prototype.initialize = async function () {\n\t\tvar self = this;\n\t\tif ( self.initialized ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// only load scripts\n\t\tif ( !self.$element.parent().is( ':visible' ) ) {\n\t\t\tVisualDataFunctions.loadScripts( this.scripts );\n\t\t\tthrow 'TinyMCE element not visible';\n\t\t}\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\tVisualDataFunctions.loadScripts( this.scripts, function ( e ) {\n\t\t\t\tthis.tinymce = tinymce.init( {\n\t\t\t\t\tbase_url: this.basePath,\n\t\t\t\t\tstatusbar: false,\n\t\t\t\t\tselector: '#' + jQuery.escapeSelector( self.textareaId ),\n\t\t\t\t\tobject_resizing: true,\n\t\t\t\t\tallow_html_in_named_anchor: true,\n\t\t\t\t\tbrowser_spellcheck: true,\n\t\t\t\t\tautomatic_uploads: true,\n\t\t\t\t\tpaste_data_images: true,\n\t\t\t\t\tshowPlaceholders: false,\n\t\t\t\t\tdecodeHtmlEntitiesOnInput: false,\n\t\t\t\t\tauto_focus: true,\n\t\t\t\t\tvisual: false,\n\t\t\t\t\tsetup: function ( editor ) {\n\t\t\t\t\t\teditor.on( 'init', function () {\n\t\t\t\t\t\t\tself.initialized = true;\n\t\t\t\t\t\t\t// editor.setContent( self.text );\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t\t// license_key: 'gpl|<your-license-key>',\n\t\t\t\t} );\n\t\t\t} );\n\t\t} );\n\t};\n\n\tVisualDataTinyMCE.prototype.getValue = function () {\n\t\tif ( typeof tinymce === 'undefined' ) {\n\t\t\treturn this.text;\n\t\t}\n\t\tvar editor = tinymce.get( this.textareaId );\n\t\tif ( editor && this.initialized ) {\n\t\t\treturn editor.getContent( this.textareaId );\n\t\t}\n\t\treturn this.text;\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/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":67,"column":9,"nodeType":"CallExpression","endLine":67,"endColumn":48},{"ruleId":"no-throw-literal","severity":2,"message":"Expected an error object to be thrown.","line":68,"column":4,"nodeType":"ThrowStatement","messageId":"object","endLine":68,"endColumn":41}],"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":51,"endColumn":3,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'self' is assigned a value but never used.","line":32,"column":7,"nodeType":"Identifier","messageId":"unusedVar","endLine":32,"endColumn":11,"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-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":94,"column":38,"nodeType":"Identifier","messageId":"unusedVar","endLine":94,"endColumn":44,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":98,"column":49,"nodeType":"Identifier","messageId":"unusedVar","endLine":98,"endColumn":55,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'e' is defined but never used.","line":99,"column":56,"nodeType":"Identifier","messageId":"unusedVar","endLine":99,"endColumn":57,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-return-assign","severity":2,"message":"Return statement should not contain assignment.","line":139,"column":5,"nodeType":"ReturnStatement","messageId":"returnAssignment","endLine":139,"endColumn":33,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-tabs","severity":2,"message":"Unexpected tab character.","line":153,"column":6,"nodeType":"Program","messageId":"unexpectedTab","endLine":153,"endColumn":7,"suppressions":[{"kind":"directive","justification":""}]},{"ruleId":"no-unused-vars","severity":2,"message":"'reject' is defined but never used.","line":156,"column":34,"nodeType":"Identifier","messageId":"unusedVar","endLine":156,"endColumn":40,"suppressions":[{"kind":"directive","justification":""}]}],"errorCount":1,"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-2024, 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\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 ( destroy ) {\n\t\tvar self = this;\n\t\tif ( destroy ) {\n\t\t\tthis.destroyEditor();\n\t\t}\n\n\t\tif ( this.initialized ) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif ( !self.$element.parent().is( ':visible' ) ) {\n\t\t\tthrow 'VEForAll element not visible';\n\t\t}\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\tthis.loadVEForAll().then( function () {\n\t\t\t\tvar editor = self.getEditor();\n\t\t\t\tif ( editor ) {\n\t\t\t\t\teditor.initCallbacks.push( function () {\n\t\t\t\t\t\tself.initialized = true;\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t} );\n\t\t\t\t} else {\n\t\t\t\t\treject( 'VEForAll no editor' );\n\t\t\t\t}\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\tthis.initialized = false;\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 ( !( 'getVEInstances' in $.fn ) ) {\n\t\t\treturn null;\n\t\t}\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;\n\t\t\t}\n\t\t}\n\t};\n\n\tVisualDataVisualEditor.prototype.getValue = async function () {\n\t\tvar self = this;\n\t\tvar editor = this.getEditor();\n\n\t\tif ( !this.initialized || !( 'target' in 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.target.getSurface().getHtml() );\n\t\t// }\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\t\t\t$.when( editor.target.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.target.$node.addClass( 've-for-all-waiting-for-update' );\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":[]}]},{"filePath":"/src/repo/resources/slick/main.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":24,"column":3,"nodeType":"CallExpression","endLine":24,"endColumn":23},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":25,"column":4,"nodeType":"CallExpression","endLine":25,"endColumn":37},{"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":3,"nodeType":"CallExpression","endLine":45,"endColumn":36},{"ruleId":"no-jquery/no-global-selector","severity":1,"message":"Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible.","line":64,"column":2,"nodeType":"CallExpression","endLine":64,"endColumn":22}],"suppressedMessages":[],"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 © 2024, https://wikisphere.org\n */\n\n( function () {\n\t$( window ).on( 'resize', function () {\n\t\t$( '.slick-slider' ).each( function () {\n\t\t\t$( '.slick-slider .slick-slide' ).each( function () {\n\t\t\t\tif ( $( window ).width() < 800 && !$( '.slick-slide-content.caption-title', $( this ) ).length ) {\n\t\t\t\t\t$( '.slick-slide-content.caption', $( this ) ).hide();\n\t\t\t\t} else {\n\t\t\t\t\t$( '.slick-slide-content.caption', $( this ) ).show();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t} );\n\n\tfunction init( $slide ) {\n\t\t// show pictures again\n\t\t$( $slide ).find( '.slick-slide-content' ).show();\n\n\t\t$slide.slick( $slide.data().slick );\n\n\t\tif ( $slide.data().slick.adaptiveHeight ) {\n\t\t\t$slide.addClass( 'adaptiveHeight' );\n\t\t}\n\n\t\t$( '.slick-slider .slick-slide' ).each( function () {\n\t\t\t// hide caption frame if title is empty\n\t\t\t// and screen < 800px\n\t\t\tif ( $( window ).width() < 800 && !$( '.slick-slide-content.caption-title', $( this ) ).length ) {\n\t\t\t\t$( '.slick-slide-content.caption', $( this ) ).hide();\n\t\t\t} else {\n\t\t\t\t$( '.slick-slide-content.caption', $( this ) ).show();\n\t\t\t}\n\n\t\t\tif ( $( this ).attr( 'data-url' ) ) {\n\t\t\t\t// $(this).attr('title', $(this).attr('data-title') )\n\t\t\t\t$( this ).css( 'cursor', 'pointer' );\n\t\t\t\t$( this ).on( 'click', function () {\n\t\t\t\t\twindow.location = $( this ).attr( 'data-url' );\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t}\n\n\t$( '.slick-slider' ).each( function () {\n\t\tinit( $( this ) );\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":[]}]}]
--- end ---
Disabling eslint rule 'no-jquery/no-done-fail' (broken in .eslintrc.json) on .eslintrc.json
Disabling eslint rule 'no-jquery/no-done-fail' (broken in .eslintrc.json) on .eslintrc.json
Disabling eslint rule 'no-jquery/no-done-fail' (broken in .eslintrc.json) on .eslintrc.json
Disabling eslint rule 'no-jquery/no-done-fail' (broken in .eslintrc.json) on .eslintrc.json
Disabling eslint rule 'no-jquery/no-done-fail' (broken in .eslintrc.json) on .eslintrc.json
Disabling eslint rule 'no-jquery/no-done-fail' (broken in .eslintrc.json) on .eslintrc.json
Disabling eslint rule 'no-throw-literal' (broken in .eslintrc.json) on .eslintrc.json
Disabling eslint rule 'no-throw-literal' (broken in .eslintrc.json) on .eslintrc.json
Disabling eslint rule 'no-throw-literal' (broken in .eslintrc.json) on .eslintrc.json
$ ./node_modules/.bin/grunt stylelint
--- stdout ---
Running "stylelint:all" (stylelint) task
>> Linted 4 files without errors
Done.
--- end ---
$ /usr/bin/npm ci
--- stderr ---
npm WARN deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm WARN deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
--- stdout ---
added 404 packages, and audited 405 packages in 5s
92 packages are looking for funding
run `npm fund` for details
1 high severity vulnerability
To address all issues, run:
npm audit fix
Run `npm audit` for details.
--- end ---
$ /usr/bin/npm test
--- stdout ---
> test
> grunt test
Running "eslint:all" (eslint) task
/src/repo/resources/VersionCheck.js
31:3 warning Prefer .then to .done no-jquery/no-done-fail
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/VisualData.js
56:4 warning Prefer .then to .done no-jquery/no-done-fail
56:4 warning Prefer .then to .fail no-jquery/no-done-fail
92:4 warning Prefer .then to .done no-jquery/no-done-fail
92:4 warning Prefer .then to .fail no-jquery/no-done-fail
/src/repo/resources/VisualDataDatatables.js
27:6 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
43:1 warning This line has a length of 144. Maximum allowed is 100 max-len
59:1 warning This line has a length of 111. Maximum allowed is 100 max-len
140:1 warning This line has a length of 101. Maximum allowed is 100 max-len
173:3 warning Prefer .then to .done no-jquery/no-done-fail
173:3 warning Prefer .then to .fail no-jquery/no-done-fail
242:1 warning This line has a length of 112. Maximum allowed is 100 max-len
279:3 warning Prefer .then to .done no-jquery/no-done-fail
279:3 warning Prefer .then to .fail no-jquery/no-done-fail
358:5 warning Prefer Array#indexOf to $.inArray no-jquery/no-in-array
641:8 warning Prefer Array#indexOf to $.inArray no-jquery/no-in-array
677:8 warning Expected a 'break' statement before 'case' no-fallthrough
681:8 warning Expected a 'break' statement before 'case' no-fallthrough
683:8 warning Expected a 'break' statement before 'case' no-fallthrough
1055:2 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
1072:3 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
/src/repo/resources/VisualDataFormField.js
285:1 warning This line has a length of 108. Maximum allowed is 100 max-len
301:1 warning This line has a length of 135. Maximum allowed is 100 max-len
1048: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
78:6 warning Selector extensions are not allowed no-jquery/no-sizzle
212:5 warning Selector extensions are not allowed no-jquery/no-sizzle
506:1 warning This line has a length of 117. Maximum allowed is 100 max-len
523:1 warning This line has a length of 131. Maximum allowed is 100 max-len
562:5 warning Prefer .then to .done no-jquery/no-done-fail
562:5 warning Prefer .then to .fail no-jquery/no-done-fail
893:5 warning Prefer .then to .fail no-jquery/no-done-fail
1353:4 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
1355:26 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1433:6 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1436:7 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1439:7 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1468:7 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1471:8 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1474:8 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
2120:5 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
2277:1 warning This line has a length of 107. Maximum allowed is 100 max-len
2453:1 warning This line has a length of 109. Maximum allowed is 100 max-len
2785:1 warning This line has a length of 102. Maximum allowed is 100 max-len
2803:7 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
2971:9 warning Prefer .then to .done no-jquery/no-done-fail
2971:9 warning Prefer .then to .fail no-jquery/no-done-fail
2976:1 warning This line has a length of 102. Maximum allowed is 100 max-len
3100:10 warning Selector extensions are not allowed no-jquery/no-sizzle
3243:1 warning This line has a length of 108. Maximum allowed is 100 max-len
3248:1 warning This line has a length of 105. Maximum allowed is 100 max-len
3466:15 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
3490:1 warning This line has a length of 119. Maximum allowed is 100 max-len
3537: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
840:1 warning This line has a length of 110. Maximum allowed is 100 max-len
/src/repo/resources/VisualDataMaps.js
35:1 warning This line has a length of 108. Maximum allowed is 100 max-len
119:2 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
/src/repo/resources/VisualDataProcessModel.js
199:1 warning This line has a length of 116. Maximum allowed is 100 max-len
203:11 warning Selector extensions are not allowed no-jquery/no-sizzle
/src/repo/resources/VisualDataSchemas.js
328:1 warning This line has a length of 103. Maximum allowed is 100 max-len
643:8 warning Prefer .then to .done no-jquery/no-done-fail
643:8 warning Prefer .then to .fail no-jquery/no-done-fail
1615:15 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
1792:4 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
1795:15 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1811:4 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
/src/repo/resources/VisualDataUpload.js
128:3 warning Prefer .then to .fail no-jquery/no-done-fail
280:3 warning Prefer .then to .done no-jquery/no-done-fail
280:3 warning Prefer .then to .fail no-jquery/no-done-fail
369:3 warning Prefer .then to .done no-jquery/no-done-fail
369:3 warning Prefer .then to .fail no-jquery/no-done-fail
/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
41:9 warning Selector extensions are not allowed no-jquery/no-sizzle
43:4 warning Expected an error object to be thrown no-throw-literal
66:1 warning This line has a length of 102. Maximum allowed is 100 max-len
68:1 warning This line has a length of 123. 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/VisualDataTinyMCE.js
39:3 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
39:19 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
66:9 warning Selector extensions are not allowed no-jquery/no-sizzle
68:4 warning Expected an error object to be thrown no-throw-literal
/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
67:9 warning Selector extensions are not allowed no-jquery/no-sizzle
68:4 warning Expected an error object to be thrown no-throw-literal
/src/repo/resources/Widgets/VisualDataintlTelInput.js
38:7 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
/src/repo/resources/slick/main.js
24:3 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
25:4 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
45:3 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
64:2 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
✖ 100 problems (0 errors, 100 warnings)
Running "stylelint:all" (stylelint) task
>> Linted 4 files without errors
Running "banana:VisualData" (banana) task
>> 1 message directory checked.
Done.
--- end ---
Upgrading c:mediawiki/mediawiki-codesniffer from 45.0.0 -> 46.0.0
$ /usr/bin/composer update
--- stderr ---
Loading composer repositories with package information
Updating dependencies
Lock file operations: 0 installs, 2 updates, 0 removals
- Upgrading mediawiki/mediawiki-codesniffer (v45.0.0 => v46.0.0)
- Upgrading squizlabs/php_codesniffer (3.10.3 => 3.11.3)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 0 installs, 2 updates, 0 removals
0 [>---------------------------] 0 [->--------------------------]
- Upgrading squizlabs/php_codesniffer (3.10.3 => 3.11.3): Extracting archive
- Upgrading mediawiki/mediawiki-codesniffer (v45.0.0 => v46.0.0): Extracting archive
0/2 [>---------------------------] 0%
1/2 [==============>-------------] 50%
2/2 [============================] 100%
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 ---
PHP CodeSniffer Config installed_paths set to ../../mediawiki/mediawiki-codesniffer,../../phpcsstandards/phpcsextra,../../phpcsstandards/phpcsutils
--- end ---
Previously failing phpcs rules: {'Squiz.Scope.MethodScope.Missing', 'MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName', 'Generic.Files.LineLength.TooLong', 'Generic.Files.OneObjectStructurePerFile.MultipleFound', 'MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic', 'MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals'}
$ vendor/bin/phpcs --report=json
--- stdout ---
{"totals":{"errors":40,"warnings":81,"fixable":0},"files":{"\/src\/repo\/VisualData.alias.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/VisualDataMagic.i18n.magic.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/aliases\/Title.php":{"errors":1,"warnings":0,"messages":[{"message":"Only one object structure is allowed in a file","source":"Generic.Files.OneObjectStructurePerFile.MultipleFound","severity":5,"fixable":false,"type":"ERROR","line":32,"column":5}]},"\/src\/repo\/includes\/specials\/BrowseData\/BrowseQueries.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/BrowseData\/BrowseSchemas.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/BrowseData\/BrowseData.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/api\/VisualDataApiLoadData.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/BrowseData\/BrowseForms.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/api\/VisualDataApiQueryResults.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":65,"column":12}]},"\/src\/repo\/includes\/api\/VisualDataApiCheckLatestVersion.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/maintenance\/DeleteRegex.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/SpecialManageSchemas.php":{"errors":0,"warnings":1,"messages":[{"message":"Line exceeds 120 characters; contains 135 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":92,"column":135}]},"\/src\/repo\/includes\/api\/VisualDataApiSubmitForm.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/content\/VisualDataHtmlContent.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/formats\/CountResultPrinter.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":31,"column":12}]},"\/src\/repo\/maintenance\/ImportData.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/api\/VisualDataApiGetSchemas.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/SpecialVisualDataSubmit.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/formats\/JsonResultPrinter.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":31,"column":12}]},"\/src\/repo\/includes\/api\/VisualDataApiQueryOptions.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/content\/VisualDataJsonDataContentHandler.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/content\/VisualDataJsonDataContent.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/formats\/LuaResultPrinter.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":32,"column":12}]},"\/src\/repo\/includes\/classes\/formats\/TemplateResultPrinter.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/formats\/PageidResultPrinter.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":29,"column":12}]},"\/src\/repo\/includes\/specials\/pagers\/FormsPager.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/PageForms\/PFArrayMap.php":{"errors":1,"warnings":1,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":28,"column":19},{"message":"Line exceeds 120 characters; contains 124 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":59,"column":124}]},"\/src\/repo\/includes\/specials\/pagers\/QueriesPager.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/formats\/PagetitleResultPrinter.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":29,"column":12}]},"\/src\/repo\/includes\/VisualDataEditAction.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/formats\/Base64ResultPrinter.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/UpdateDataJob.php":{"errors":2,"warnings":4,"messages":[{"message":"Visibility must be declared on method \"__construct\"","source":"Squiz.Scope.MethodScope.Missing","severity":5,"fixable":false,"type":"ERROR","line":41,"column":5},{"message":"Visibility must be declared on method \"run\"","source":"Squiz.Scope.MethodScope.Missing","severity":5,"fixable":false,"type":"ERROR","line":48,"column":5},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":114,"column":125},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":135,"column":125},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":147,"column":126},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":170,"column":128}]},"\/src\/repo\/includes\/classes\/formats\/QueryResultPrinter.php":{"errors":0,"warnings":1,"messages":[{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":63,"column":121}]},"\/src\/repo\/includes\/content\/VisualDataHtmlContentHandler.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/formats\/JsonRawResultPrinter.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":40,"column":12}]},"\/src\/repo\/maintenance\/ReplaceText\/Search.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/PublishStashedFile.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":41,"column":12}]},"\/src\/repo\/includes\/classes\/PageForms\/PFArrayMapTemplate.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":30,"column":19}]},"\/src\/repo\/includes\/api\/VisualDataApiSaveSchema.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/aliases\/Html.php":{"errors":1,"warnings":0,"messages":[{"message":"Only one object structure is allowed in a file","source":"Generic.Files.OneObjectStructurePerFile.MultipleFound","severity":5,"fixable":false,"type":"ERROR","line":32,"column":5}]},"\/src\/repo\/includes\/specials\/pagers\/SchemasPager.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/SpecialVisualDataBrowse.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/utils\/HtmlTable.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/utils\/DateParser.php":{"errors":3,"warnings":0,"messages":[{"message":"Method name \"DateTimeImmutable\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":79,"column":12},{"message":"Method name \"date_parse\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":118,"column":12},{"message":"Method name \"IntlDateFormatter\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":141,"column":12}]},"\/src\/repo\/includes\/specials\/SpecialEditData.php":{"errors":2,"warnings":1,"messages":[{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":111,"column":22},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":113,"column":61},{"message":"Line exceeds 120 characters; contains 135 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":176,"column":135}]},"\/src\/repo\/maintenance\/Uninstall.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/maintenance\/ProcessData.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/pagers\/DataPager.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/Importer.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/formats\/TableResultPrinter.php":{"errors":0,"warnings":5,"messages":[{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":98,"column":121},{"message":"Line exceeds 120 characters; contains 132 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":120,"column":132},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":170,"column":121},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":171,"column":125},{"message":"Line exceeds 120 characters; contains 129 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":318,"column":129}]},"\/src\/repo\/includes\/VisualDataHooks.php":{"errors":8,"warnings":8,"messages":[{"message":"Line exceeds 120 characters; contains 130 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":77,"column":130},{"message":"Line exceeds 120 characters; contains 135 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":116,"column":135},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":120,"column":24},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":122,"column":21},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":149,"column":24},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":151,"column":21},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":161,"column":126},{"message":"Line exceeds 120 characters; contains 134 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":203,"column":134},{"message":"Line exceeds 120 characters; contains 177 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":365,"column":177},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":473,"column":81},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":474,"column":31},{"message":"Line exceeds 120 characters; contains 129 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":587,"column":129},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":595,"column":43},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":595,"column":61},{"message":"Line exceeds 120 characters; contains 167 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":601,"column":167},{"message":"Line exceeds 120 characters; contains 147 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":608,"column":147}]},"\/src\/repo\/includes\/importer\/VisualDataImporter1_35.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/maintenance\/RebuildData.php":{"errors":0,"warnings":1,"messages":[{"message":"Line exceeds 120 characters; contains 127 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":414,"column":127}]},"\/src\/repo\/includes\/classes\/SubmitForm.php":{"errors":0,"warnings":10,"messages":[{"message":"Line exceeds 120 characters; contains 140 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":80,"column":140},{"message":"Line exceeds 120 characters; contains 143 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":107,"column":143},{"message":"Line exceeds 120 characters; contains 137 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":167,"column":137},{"message":"Line exceeds 120 characters; contains 124 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":212,"column":124},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":403,"column":17},{"message":"Line exceeds 120 characters; contains 133 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":444,"column":133},{"message":"Line exceeds 120 characters; contains 124 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":448,"column":124},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":485,"column":128},{"message":"Line exceeds 120 characters; contains 131 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":497,"column":131},{"message":"Line exceeds 120 characters; contains 129 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":571,"column":129}]},"\/src\/repo\/includes\/classes\/ResultPrinter.php":{"errors":0,"warnings":6,"messages":[{"message":"Line exceeds 120 characters; contains 136 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":125,"column":136},{"message":"Line exceeds 120 characters; contains 132 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":355,"column":132},{"message":"Line exceeds 120 characters; contains 137 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":374,"column":137},{"message":"Line exceeds 120 characters; contains 171 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":414,"column":171},{"message":"Line exceeds 120 characters; contains 146 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":488,"column":146},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":577,"column":121}]},"\/src\/repo\/includes\/classes\/formats\/CarouselResultPrinter.php":{"errors":1,"warnings":3,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":339,"column":12},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":389,"column":121},{"message":"Line exceeds 120 characters; contains 138 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":467,"column":138},{"message":"Line exceeds 120 characters; contains 143 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":468,"column":143}]},"\/src\/repo\/includes\/importer\/VisualDataImporter1_42.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/formats\/DatatableResultPrinter.php":{"errors":0,"warnings":3,"messages":[{"message":"Line exceeds 120 characters; contains 140 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":383,"column":140},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":622,"column":128},{"message":"Line exceeds 120 characters; contains 132 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":700,"column":132}]},"\/src\/repo\/includes\/classes\/formats\/MapResultPrinter.php":{"errors":1,"warnings":3,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":581,"column":12},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":637,"column":121},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":671,"column":121},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":672,"column":125}]},"\/src\/repo\/includes\/importer\/VisualDataImporter.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/DatabaseManager.php":{"errors":0,"warnings":3,"messages":[{"message":"Line exceeds 120 characters; contains 122 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":753,"column":122},{"message":"Line exceeds 120 characters; contains 123 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1019,"column":123},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1035,"column":126}]},"\/src\/repo\/includes\/classes\/MimeTypes.php":{"errors":0,"warnings":8,"messages":[{"message":"Line exceeds 120 characters; contains 146 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":77,"column":146},{"message":"Line exceeds 120 characters; contains 147 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":122,"column":147},{"message":"Line exceeds 120 characters; contains 133 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":379,"column":133},{"message":"Line exceeds 120 characters; contains 133 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":456,"column":133},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":457,"column":121},{"message":"Line exceeds 120 characters; contains 133 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":643,"column":133},{"message":"Line exceeds 120 characters; contains 145 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":726,"column":145},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":802,"column":121}]},"\/src\/repo\/includes\/classes\/SchemaProcessor.php":{"errors":5,"warnings":9,"messages":[{"message":"Visibility must be declared on method \"handleSchemaTo\"","source":"Squiz.Scope.MethodScope.Missing","severity":5,"fixable":false,"type":"ERROR","line":580,"column":5},{"message":"Line exceeds 120 characters; contains 122 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":753,"column":122},{"message":"Line exceeds 120 characters; contains 142 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":754,"column":142},{"message":"Line exceeds 120 characters; contains 160 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":759,"column":160},{"message":"Line exceeds 120 characters; contains 164 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":760,"column":164},{"message":"Line exceeds 120 characters; contains 162 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":767,"column":162},{"message":"Line exceeds 120 characters; contains 166 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":768,"column":166},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":871,"column":128},{"message":"Visibility must be declared on method \"handleSchemaFrom\"","source":"Squiz.Scope.MethodScope.Missing","severity":5,"fixable":false,"type":"ERROR","line":956,"column":5},{"message":"Visibility must be declared on method \"handleOptionsFrom\"","source":"Squiz.Scope.MethodScope.Missing","severity":5,"fixable":false,"type":"ERROR","line":1123,"column":5},{"message":"Visibility must be declared on method \"isValidObj\"","source":"Squiz.Scope.MethodScope.Missing","severity":5,"fixable":false,"type":"ERROR","line":1152,"column":5},{"message":"Method name \"SMWQueryResults\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":1290,"column":19},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1290,"column":126},{"message":"Line exceeds 120 characters; contains 130 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1422,"column":130}]},"\/src\/repo\/includes\/classes\/Scribunto\/LuaLibrary.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/QueryProcessor.php":{"errors":0,"warnings":3,"messages":[{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":900,"column":125},{"message":"Line exceeds 120 characters; contains 122 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1017,"column":13},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1114,"column":121}]},"\/src\/repo\/includes\/VisualData.php":{"errors":4,"warnings":11,"messages":[{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":906,"column":122},{"message":"Line exceeds 120 characters; contains 138 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1336,"column":138},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1853,"column":121},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2029,"column":21},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2160,"column":128},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2189,"column":126},{"message":"Line exceeds 120 characters; contains 124 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2194,"column":33},{"message":"Line exceeds 120 characters; contains 136 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2195,"column":136},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2351,"column":121},{"message":"Method name \"VEenabledForUser\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":2395,"column":20},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2399,"column":125},{"message":"Method name \"page_ancestors\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":2864,"column":19},{"message":"Method name \"array_filter_recursive\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":3181,"column":19},{"message":"Method name \"array_merge_recursive\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":3203,"column":19},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":3223,"column":13}]},"\/src\/repo\/includes\/api\/VisualDataApiDatatables.php":{"errors":2,"warnings":0,"messages":[{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":143,"column":9},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":218,"column":9}]}}}
--- end ---
PHPCS run failed
$ vendor/bin/phpcs --report=json
--- stdout ---
{"totals":{"errors":40,"warnings":81,"fixable":0},"files":{"\/src\/repo\/includes\/aliases\/Title.php":{"errors":1,"warnings":0,"messages":[{"message":"Only one object structure is allowed in a file","source":"Generic.Files.OneObjectStructurePerFile.MultipleFound","severity":5,"fixable":false,"type":"ERROR","line":32,"column":5}]},"\/src\/repo\/VisualData.alias.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/VisualDataMagic.i18n.magic.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/BrowseData\/BrowseSchemas.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/BrowseData\/BrowseQueries.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/BrowseData\/BrowseForms.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/BrowseData\/BrowseData.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/formats\/CountResultPrinter.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":31,"column":12}]},"\/src\/repo\/includes\/classes\/formats\/JsonResultPrinter.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":31,"column":12}]},"\/src\/repo\/includes\/classes\/formats\/PageidResultPrinter.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":29,"column":12}]},"\/src\/repo\/includes\/classes\/formats\/Base64ResultPrinter.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/SpecialManageSchemas.php":{"errors":0,"warnings":1,"messages":[{"message":"Line exceeds 120 characters; contains 135 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":92,"column":135}]},"\/src\/repo\/includes\/api\/VisualDataApiQueryResults.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":65,"column":12}]},"\/src\/repo\/includes\/specials\/SpecialVisualDataSubmit.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/api\/VisualDataApiLoadData.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/content\/VisualDataJsonDataContentHandler.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/content\/VisualDataHtmlContent.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/content\/VisualDataJsonDataContent.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/VisualDataEditAction.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/maintenance\/DeleteRegex.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/api\/VisualDataApiCheckLatestVersion.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/PageForms\/PFArrayMap.php":{"errors":1,"warnings":1,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":28,"column":19},{"message":"Line exceeds 120 characters; contains 124 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":59,"column":124}]},"\/src\/repo\/includes\/classes\/formats\/JsonRawResultPrinter.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":40,"column":12}]},"\/src\/repo\/includes\/classes\/formats\/QueryResultPrinter.php":{"errors":0,"warnings":1,"messages":[{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":63,"column":121}]},"\/src\/repo\/includes\/classes\/formats\/TemplateResultPrinter.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/formats\/LuaResultPrinter.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":32,"column":12}]},"\/src\/repo\/maintenance\/ImportData.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/formats\/PagetitleResultPrinter.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":29,"column":12}]},"\/src\/repo\/includes\/content\/VisualDataHtmlContentHandler.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/api\/VisualDataApiSubmitForm.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/api\/VisualDataApiQueryOptions.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/PageForms\/PFArrayMapTemplate.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":30,"column":19}]},"\/src\/repo\/includes\/api\/VisualDataApiGetSchemas.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/PublishStashedFile.php":{"errors":1,"warnings":0,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":41,"column":12}]},"\/src\/repo\/includes\/specials\/pagers\/QueriesPager.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/pagers\/FormsPager.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/utils\/DateParser.php":{"errors":3,"warnings":0,"messages":[{"message":"Method name \"DateTimeImmutable\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":79,"column":12},{"message":"Method name \"date_parse\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":118,"column":12},{"message":"Method name \"IntlDateFormatter\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":141,"column":12}]},"\/src\/repo\/includes\/specials\/pagers\/SchemasPager.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/UpdateDataJob.php":{"errors":2,"warnings":4,"messages":[{"message":"Visibility must be declared on method \"__construct\"","source":"Squiz.Scope.MethodScope.Missing","severity":5,"fixable":false,"type":"ERROR","line":41,"column":5},{"message":"Visibility must be declared on method \"run\"","source":"Squiz.Scope.MethodScope.Missing","severity":5,"fixable":false,"type":"ERROR","line":48,"column":5},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":114,"column":125},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":135,"column":125},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":147,"column":126},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":170,"column":128}]},"\/src\/repo\/includes\/specials\/SpecialVisualDataBrowse.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/maintenance\/Uninstall.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/maintenance\/ReplaceText\/Search.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/maintenance\/ProcessData.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/api\/VisualDataApiSaveSchema.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/aliases\/Html.php":{"errors":1,"warnings":0,"messages":[{"message":"Only one object structure is allowed in a file","source":"Generic.Files.OneObjectStructurePerFile.MultipleFound","severity":5,"fixable":false,"type":"ERROR","line":32,"column":5}]},"\/src\/repo\/includes\/specials\/pagers\/DataPager.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/utils\/HtmlTable.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/specials\/SpecialEditData.php":{"errors":2,"warnings":1,"messages":[{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":111,"column":22},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":113,"column":61},{"message":"Line exceeds 120 characters; contains 135 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":176,"column":135}]},"\/src\/repo\/includes\/classes\/formats\/TableResultPrinter.php":{"errors":0,"warnings":5,"messages":[{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":98,"column":121},{"message":"Line exceeds 120 characters; contains 132 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":120,"column":132},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":170,"column":121},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":171,"column":125},{"message":"Line exceeds 120 characters; contains 129 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":318,"column":129}]},"\/src\/repo\/includes\/classes\/Importer.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/importer\/VisualDataImporter1_35.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/ResultPrinter.php":{"errors":0,"warnings":6,"messages":[{"message":"Line exceeds 120 characters; contains 136 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":125,"column":136},{"message":"Line exceeds 120 characters; contains 132 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":355,"column":132},{"message":"Line exceeds 120 characters; contains 137 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":374,"column":137},{"message":"Line exceeds 120 characters; contains 171 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":414,"column":171},{"message":"Line exceeds 120 characters; contains 146 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":488,"column":146},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":577,"column":121}]},"\/src\/repo\/maintenance\/RebuildData.php":{"errors":0,"warnings":1,"messages":[{"message":"Line exceeds 120 characters; contains 127 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":414,"column":127}]},"\/src\/repo\/includes\/classes\/formats\/CarouselResultPrinter.php":{"errors":1,"warnings":3,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":339,"column":12},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":389,"column":121},{"message":"Line exceeds 120 characters; contains 138 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":467,"column":138},{"message":"Line exceeds 120 characters; contains 143 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":468,"column":143}]},"\/src\/repo\/includes\/classes\/SubmitForm.php":{"errors":0,"warnings":10,"messages":[{"message":"Line exceeds 120 characters; contains 140 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":80,"column":140},{"message":"Line exceeds 120 characters; contains 143 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":107,"column":143},{"message":"Line exceeds 120 characters; contains 137 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":167,"column":137},{"message":"Line exceeds 120 characters; contains 124 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":212,"column":124},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":403,"column":17},{"message":"Line exceeds 120 characters; contains 133 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":444,"column":133},{"message":"Line exceeds 120 characters; contains 124 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":448,"column":124},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":485,"column":128},{"message":"Line exceeds 120 characters; contains 131 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":497,"column":131},{"message":"Line exceeds 120 characters; contains 129 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":571,"column":129}]},"\/src\/repo\/includes\/classes\/formats\/DatatableResultPrinter.php":{"errors":0,"warnings":3,"messages":[{"message":"Line exceeds 120 characters; contains 140 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":383,"column":140},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":622,"column":128},{"message":"Line exceeds 120 characters; contains 132 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":700,"column":132}]},"\/src\/repo\/includes\/VisualDataHooks.php":{"errors":8,"warnings":8,"messages":[{"message":"Line exceeds 120 characters; contains 130 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":77,"column":130},{"message":"Line exceeds 120 characters; contains 135 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":116,"column":135},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":120,"column":24},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":122,"column":21},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":149,"column":24},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":151,"column":21},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":161,"column":126},{"message":"Line exceeds 120 characters; contains 134 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":203,"column":134},{"message":"Line exceeds 120 characters; contains 177 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":365,"column":177},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":473,"column":81},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":474,"column":31},{"message":"Line exceeds 120 characters; contains 129 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":587,"column":129},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":595,"column":43},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":595,"column":61},{"message":"Line exceeds 120 characters; contains 167 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":601,"column":167},{"message":"Line exceeds 120 characters; contains 147 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":608,"column":147}]},"\/src\/repo\/includes\/classes\/formats\/MapResultPrinter.php":{"errors":1,"warnings":3,"messages":[{"message":"Missing function doc comment","source":"MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic","severity":5,"fixable":false,"type":"ERROR","line":581,"column":12},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":637,"column":121},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":671,"column":121},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":672,"column":125}]},"\/src\/repo\/includes\/importer\/VisualDataImporter.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/importer\/VisualDataImporter1_42.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/SchemaProcessor.php":{"errors":5,"warnings":9,"messages":[{"message":"Visibility must be declared on method \"handleSchemaTo\"","source":"Squiz.Scope.MethodScope.Missing","severity":5,"fixable":false,"type":"ERROR","line":580,"column":5},{"message":"Line exceeds 120 characters; contains 122 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":753,"column":122},{"message":"Line exceeds 120 characters; contains 142 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":754,"column":142},{"message":"Line exceeds 120 characters; contains 160 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":759,"column":160},{"message":"Line exceeds 120 characters; contains 164 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":760,"column":164},{"message":"Line exceeds 120 characters; contains 162 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":767,"column":162},{"message":"Line exceeds 120 characters; contains 166 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":768,"column":166},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":871,"column":128},{"message":"Visibility must be declared on method \"handleSchemaFrom\"","source":"Squiz.Scope.MethodScope.Missing","severity":5,"fixable":false,"type":"ERROR","line":956,"column":5},{"message":"Visibility must be declared on method \"handleOptionsFrom\"","source":"Squiz.Scope.MethodScope.Missing","severity":5,"fixable":false,"type":"ERROR","line":1123,"column":5},{"message":"Visibility must be declared on method \"isValidObj\"","source":"Squiz.Scope.MethodScope.Missing","severity":5,"fixable":false,"type":"ERROR","line":1152,"column":5},{"message":"Method name \"SMWQueryResults\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":1290,"column":19},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1290,"column":126},{"message":"Line exceeds 120 characters; contains 130 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1422,"column":130}]},"\/src\/repo\/includes\/classes\/QueryProcessor.php":{"errors":0,"warnings":3,"messages":[{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":900,"column":125},{"message":"Line exceeds 120 characters; contains 122 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1017,"column":13},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1114,"column":121}]},"\/src\/repo\/includes\/classes\/Scribunto\/LuaLibrary.php":{"errors":0,"warnings":0,"messages":[]},"\/src\/repo\/includes\/classes\/MimeTypes.php":{"errors":0,"warnings":8,"messages":[{"message":"Line exceeds 120 characters; contains 146 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":77,"column":146},{"message":"Line exceeds 120 characters; contains 147 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":122,"column":147},{"message":"Line exceeds 120 characters; contains 133 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":379,"column":133},{"message":"Line exceeds 120 characters; contains 133 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":456,"column":133},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":457,"column":121},{"message":"Line exceeds 120 characters; contains 133 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":643,"column":133},{"message":"Line exceeds 120 characters; contains 145 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":726,"column":145},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":802,"column":121}]},"\/src\/repo\/includes\/classes\/DatabaseManager.php":{"errors":0,"warnings":3,"messages":[{"message":"Line exceeds 120 characters; contains 122 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":753,"column":122},{"message":"Line exceeds 120 characters; contains 123 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1019,"column":123},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1035,"column":126}]},"\/src\/repo\/includes\/VisualData.php":{"errors":4,"warnings":11,"messages":[{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":906,"column":122},{"message":"Line exceeds 120 characters; contains 138 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1336,"column":138},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":1853,"column":121},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2029,"column":21},{"message":"Line exceeds 120 characters; contains 128 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2160,"column":128},{"message":"Line exceeds 120 characters; contains 126 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2189,"column":126},{"message":"Line exceeds 120 characters; contains 124 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2194,"column":33},{"message":"Line exceeds 120 characters; contains 136 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2195,"column":136},{"message":"Line exceeds 120 characters; contains 121 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2351,"column":121},{"message":"Method name \"VEenabledForUser\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":2395,"column":20},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":2399,"column":125},{"message":"Method name \"page_ancestors\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":2864,"column":19},{"message":"Method name \"array_filter_recursive\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":3181,"column":19},{"message":"Method name \"array_merge_recursive\" should use lower camel case.","source":"MediaWiki.NamingConventions.LowerCamelFunctionsName.FunctionName","severity":5,"fixable":false,"type":"ERROR","line":3203,"column":19},{"message":"Line exceeds 120 characters; contains 125 characters","source":"Generic.Files.LineLength.TooLong","severity":5,"fixable":false,"type":"WARNING","line":3223,"column":13}]},"\/src\/repo\/includes\/api\/VisualDataApiDatatables.php":{"errors":2,"warnings":0,"messages":[{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":143,"column":9},{"message":"\"$_GET\" superglobals should not be accessed.","source":"MediaWiki.Usage.SuperGlobalsUsage.SuperGlobals","severity":5,"fixable":false,"type":"ERROR","line":218,"column":9}]}}}
--- end ---
$ git checkout .phpcs.xml
--- stderr ---
Updated 1 path from the index
--- 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.20 | 10 parallel jobs
............................................................ 60/67 ( 89%)
....... 67/67 (100%)
Checked 67 files in 0.3 seconds
No syntax error found
MinusX
======
Processing /src/repo...
.............................................................
.............................................................
.............................................................
.............................................................
.............................................................
.........
All good!
.................................. 34 / 34 (100%)
Time: 297ms; Memory: 12MB
--- end ---
$ /usr/bin/npm audit --json
--- stdout ---
{
"auditReportVersion": 2,
"vulnerabilities": {
"cross-spawn": {
"name": "cross-spawn",
"severity": "high",
"isDirect": false,
"via": [
{
"source": 1100563,
"name": "cross-spawn",
"dependency": "cross-spawn",
"title": "Regular Expression Denial of Service (ReDoS) in cross-spawn",
"url": "https://github.com/advisories/GHSA-3xgq-45jj-v275",
"severity": "high",
"cwe": [
"CWE-1333"
],
"cvss": {
"score": 7.5,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
},
"range": ">=7.0.0 <7.0.5"
}
],
"effects": [],
"range": "7.0.0 - 7.0.4",
"nodes": [
"node_modules/cross-spawn"
],
"fixAvailable": true
}
},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 0,
"moderate": 0,
"high": 1,
"critical": 0,
"total": 1
},
"dependencies": {
"prod": 1,
"dev": 404,
"optional": 0,
"peer": 1,
"peerOptional": 0,
"total": 404
}
}
}
--- end ---
Attempting to npm audit fix
$ /usr/bin/npm audit fix --dry-run --only=dev --json
--- stderr ---
npm WARN invalid config only="dev" set in command line options
npm WARN invalid config Must be one of: null, prod, production
--- stdout ---
{
"added": 0,
"removed": 0,
"changed": 1,
"audited": 405,
"funding": 92,
"audit": {
"auditReportVersion": 2,
"vulnerabilities": {
"cross-spawn": {
"name": "cross-spawn",
"severity": "high",
"isDirect": false,
"via": [
{
"source": 1100563,
"name": "cross-spawn",
"dependency": "cross-spawn",
"title": "Regular Expression Denial of Service (ReDoS) in cross-spawn",
"url": "https://github.com/advisories/GHSA-3xgq-45jj-v275",
"severity": "high",
"cwe": [
"CWE-1333"
],
"cvss": {
"score": 7.5,
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"
},
"range": ">=7.0.0 <7.0.5"
}
],
"effects": [],
"range": "7.0.0 - 7.0.4",
"nodes": [
""
],
"fixAvailable": true
}
},
"metadata": {
"vulnerabilities": {
"info": 0,
"low": 0,
"moderate": 0,
"high": 1,
"critical": 0,
"total": 1
},
"dependencies": {
"prod": 1,
"dev": 404,
"optional": 0,
"peer": 1,
"peerOptional": 0,
"total": 404
}
}
}
}
--- end ---
{"added": 0, "removed": 0, "changed": 1, "audited": 405, "funding": 92, "audit": {"auditReportVersion": 2, "vulnerabilities": {"cross-spawn": {"name": "cross-spawn", "severity": "high", "isDirect": false, "via": [{"source": 1100563, "name": "cross-spawn", "dependency": "cross-spawn", "title": "Regular Expression Denial of Service (ReDoS) in cross-spawn", "url": "https://github.com/advisories/GHSA-3xgq-45jj-v275", "severity": "high", "cwe": ["CWE-1333"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": ">=7.0.0 <7.0.5"}], "effects": [], "range": "7.0.0 - 7.0.4", "nodes": [""], "fixAvailable": true}}, "metadata": {"vulnerabilities": {"info": 0, "low": 0, "moderate": 0, "high": 1, "critical": 0, "total": 1}, "dependencies": {"prod": 1, "dev": 404, "optional": 0, "peer": 1, "peerOptional": 0, "total": 404}}}}
$ /usr/bin/npm audit fix --only=dev
--- stderr ---
npm WARN invalid config only="dev" set in command line options
npm WARN invalid config Must be one of: null, prod, production
--- stdout ---
up to date, audited 405 packages in 1s
92 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
--- end ---
Verifying that tests still pass
$ /usr/bin/npm ci
--- stderr ---
npm WARN deprecated @humanwhocodes/config-array@0.13.0: Use @eslint/config-array instead
npm WARN deprecated @humanwhocodes/object-schema@2.0.3: Use @eslint/object-schema instead
--- stdout ---
added 404 packages, and audited 405 packages in 5s
92 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
31:3 warning Prefer .then to .done no-jquery/no-done-fail
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/VisualData.js
56:4 warning Prefer .then to .done no-jquery/no-done-fail
56:4 warning Prefer .then to .fail no-jquery/no-done-fail
92:4 warning Prefer .then to .done no-jquery/no-done-fail
92:4 warning Prefer .then to .fail no-jquery/no-done-fail
/src/repo/resources/VisualDataDatatables.js
27:6 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
43:1 warning This line has a length of 144. Maximum allowed is 100 max-len
59:1 warning This line has a length of 111. Maximum allowed is 100 max-len
140:1 warning This line has a length of 101. Maximum allowed is 100 max-len
173:3 warning Prefer .then to .done no-jquery/no-done-fail
173:3 warning Prefer .then to .fail no-jquery/no-done-fail
242:1 warning This line has a length of 112. Maximum allowed is 100 max-len
279:3 warning Prefer .then to .done no-jquery/no-done-fail
279:3 warning Prefer .then to .fail no-jquery/no-done-fail
358:5 warning Prefer Array#indexOf to $.inArray no-jquery/no-in-array
641:8 warning Prefer Array#indexOf to $.inArray no-jquery/no-in-array
677:8 warning Expected a 'break' statement before 'case' no-fallthrough
681:8 warning Expected a 'break' statement before 'case' no-fallthrough
683:8 warning Expected a 'break' statement before 'case' no-fallthrough
1055:2 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
1072:3 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
/src/repo/resources/VisualDataFormField.js
285:1 warning This line has a length of 108. Maximum allowed is 100 max-len
301:1 warning This line has a length of 135. Maximum allowed is 100 max-len
1048: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
78:6 warning Selector extensions are not allowed no-jquery/no-sizzle
212:5 warning Selector extensions are not allowed no-jquery/no-sizzle
506:1 warning This line has a length of 117. Maximum allowed is 100 max-len
523:1 warning This line has a length of 131. Maximum allowed is 100 max-len
562:5 warning Prefer .then to .done no-jquery/no-done-fail
562:5 warning Prefer .then to .fail no-jquery/no-done-fail
893:5 warning Prefer .then to .fail no-jquery/no-done-fail
1353:4 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
1355:26 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1433:6 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1436:7 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1439:7 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1468:7 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1471:8 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1474:8 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
2120:5 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
2277:1 warning This line has a length of 107. Maximum allowed is 100 max-len
2453:1 warning This line has a length of 109. Maximum allowed is 100 max-len
2785:1 warning This line has a length of 102. Maximum allowed is 100 max-len
2803:7 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
2971:9 warning Prefer .then to .done no-jquery/no-done-fail
2971:9 warning Prefer .then to .fail no-jquery/no-done-fail
2976:1 warning This line has a length of 102. Maximum allowed is 100 max-len
3100:10 warning Selector extensions are not allowed no-jquery/no-sizzle
3243:1 warning This line has a length of 108. Maximum allowed is 100 max-len
3248:1 warning This line has a length of 105. Maximum allowed is 100 max-len
3466:15 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
3490:1 warning This line has a length of 119. Maximum allowed is 100 max-len
3537: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
840:1 warning This line has a length of 110. Maximum allowed is 100 max-len
/src/repo/resources/VisualDataMaps.js
35:1 warning This line has a length of 108. Maximum allowed is 100 max-len
119:2 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
/src/repo/resources/VisualDataProcessModel.js
199:1 warning This line has a length of 116. Maximum allowed is 100 max-len
203:11 warning Selector extensions are not allowed no-jquery/no-sizzle
/src/repo/resources/VisualDataSchemas.js
328:1 warning This line has a length of 103. Maximum allowed is 100 max-len
643:8 warning Prefer .then to .done no-jquery/no-done-fail
643:8 warning Prefer .then to .fail no-jquery/no-done-fail
1615:15 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
1792:4 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
1795:15 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
1811:4 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
/src/repo/resources/VisualDataUpload.js
128:3 warning Prefer .then to .fail no-jquery/no-done-fail
280:3 warning Prefer .then to .done no-jquery/no-done-fail
280:3 warning Prefer .then to .fail no-jquery/no-done-fail
369:3 warning Prefer .then to .done no-jquery/no-done-fail
369:3 warning Prefer .then to .fail no-jquery/no-done-fail
/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
41:9 warning Selector extensions are not allowed no-jquery/no-sizzle
43:4 warning Expected an error object to be thrown no-throw-literal
66:1 warning This line has a length of 102. Maximum allowed is 100 max-len
68:1 warning This line has a length of 123. 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/VisualDataTinyMCE.js
39:3 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
39:19 warning Prefer DOM building to parsing HTML literals no-jquery/no-parse-html-literal
66:9 warning Selector extensions are not allowed no-jquery/no-sizzle
68:4 warning Expected an error object to be thrown no-throw-literal
/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
67:9 warning Selector extensions are not allowed no-jquery/no-sizzle
68:4 warning Expected an error object to be thrown no-throw-literal
/src/repo/resources/Widgets/VisualDataintlTelInput.js
38:7 warning jQuery collection names must match the variablePattern no-jquery/variable-pattern
/src/repo/resources/slick/main.js
24:3 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
25:4 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
45:3 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
64:2 warning Avoid queries which search the entire DOM. Keep DOM nodes in memory where possible no-jquery/no-global-selector
✖ 100 problems (0 errors, 100 warnings)
Running "stylelint:all" (stylelint) task
>> Linted 4 files without errors
Running "banana:VisualData" (banana) task
>> 1 message directory checked.
Done.
--- end ---
{"1100563": {"source": 1100563, "name": "cross-spawn", "dependency": "cross-spawn", "title": "Regular Expression Denial of Service (ReDoS) in cross-spawn", "url": "https://github.com/advisories/GHSA-3xgq-45jj-v275", "severity": "high", "cwe": ["CWE-1333"], "cvss": {"score": 7.5, "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}, "range": ">=7.0.0 <7.0.5"}}
Upgrading n:cross-spawn from 7.0.3 -> 7.0.6
$ package-lock-lint package-lock.json
--- stdout ---
Checking package-lock.json
--- end ---
build: Updating dependencies
composer:
* mediawiki/mediawiki-codesniffer: 45.0.0 → 46.0.0
npm:
* eslint-config-wikimedia: 0.28.2 → 0.29.1
The following rules are failing and were disabled:
* no-jquery/no-done-fail
* no-throw-literal
* stylelint-config-wikimedia: 0.17.2 → 0.18.0
* cross-spawn: 7.0.3 → 7.0.6
* https://github.com/advisories/GHSA-3xgq-45jj-v275
Additional changes:
* Enable stylelint caching.
$ git add .
--- stdout ---
--- end ---
$ git commit -F /tmp/tmp1rp1idkn
--- stdout ---
[master 9c035f1] build: Updating dependencies
14 files changed, 338 insertions(+), 797 deletions(-)
--- end ---
$ git format-patch HEAD~1 --stdout
--- stdout ---
From 9c035f140da2c87f32d0dd6f58a2f4c06914dd27 Mon Sep 17 00:00:00 2001
From: libraryupgrader <tools.libraryupgrader@tools.wmflabs.org>
Date: Mon, 31 Mar 2025 07:43:17 +0000
Subject: [PATCH] build: Updating dependencies
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
composer:
* mediawiki/mediawiki-codesniffer: 45.0.0 → 46.0.0
npm:
* eslint-config-wikimedia: 0.28.2 → 0.29.1
The following rules are failing and were disabled:
* no-jquery/no-done-fail
* no-throw-literal
* stylelint-config-wikimedia: 0.17.2 → 0.18.0
* cross-spawn: 7.0.3 → 7.0.6
* https://github.com/advisories/GHSA-3xgq-45jj-v275
Additional changes:
* Enable stylelint caching.
Change-Id: Icffb10b1c37c363c44bf3c6e26d8a50267b2715d
---
.eslintrc.json | 4 +-
.gitignore | 1 +
Gruntfile.js | 3 +
composer.json | 2 +-
package-lock.json | 1101 +++++------------
package.json | 4 +-
resources/VisualDataForms.js | 2 -
resources/VisualDataProcessModel.js | 1 -
resources/VisualDataWindowManager.js | 1 -
.../Widgets/VisualDataDateTimeInputWidget.js | 2 +-
resources/Widgets/VisualDataMaptiler.js | 4 +-
resources/Widgets/VisualDataTinyMCE.js | 4 +-
resources/Widgets/VisualDataVisualEditor.js | 4 +-
resources/slick/main.js | 2 +-
14 files changed, 338 insertions(+), 797 deletions(-)
diff --git a/.eslintrc.json b/.eslintrc.json
index 1a88eee..826b821 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -25,7 +25,9 @@
"arrow-body-style": "off",
"implicit-arrow-linebreak": "off",
"no-jquery/no-extend": "off",
- "prefer-arrow-callback": "off"
+ "prefer-arrow-callback": "off",
+ "no-jquery/no-done-fail": "warn",
+ "no-throw-literal": "warn"
},
"parserOptions": {
"ecmaVersion": 8
diff --git a/.gitignore b/.gitignore
index d34f130..e40d78b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@
/vendor
/node_modules
/.eslintcache
+/.stylelintcache
diff --git a/Gruntfile.js b/Gruntfile.js
index 4418322..cda4e2d 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -28,6 +28,9 @@ module.exports = function ( grunt ) {
]
},
stylelint: {
+ options: {
+ cache: true
+ },
all: [
'**/*.{css,less}',
'!node_modules/**',
diff --git a/composer.json b/composer.json
index c4a0dbd..7fb22bb 100644
--- a/composer.json
+++ b/composer.json
@@ -1,6 +1,6 @@
{
"require-dev": {
- "mediawiki/mediawiki-codesniffer": "45.0.0",
+ "mediawiki/mediawiki-codesniffer": "46.0.0",
"mediawiki/minus-x": "1.1.3",
"php-parallel-lint/php-console-highlighter": "1.0.0",
"php-parallel-lint/php-parallel-lint": "1.4.0"
diff --git a/package-lock.json b/package-lock.json
index ee251f0..bd39aa0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -6,12 +6,12 @@
"": {
"name": "VisualData",
"devDependencies": {
- "eslint-config-wikimedia": "0.28.2",
+ "eslint-config-wikimedia": "0.29.1",
"grunt": "1.6.1",
"grunt-banana-checker": "0.13.0",
"grunt-eslint": "24.3.0",
"grunt-stylelint": "0.20.1",
- "stylelint-config-wikimedia": "0.17.2"
+ "stylelint-config-wikimedia": "0.18.0"
}
},
"node_modules/@aashutoshrathi/word-wrap": {
@@ -132,9 +132,9 @@
}
},
"node_modules/@csstools/css-parser-algorithms": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz",
- "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz",
+ "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==",
"dev": true,
"funding": [
{
@@ -150,13 +150,13 @@
"node": ">=18"
},
"peerDependencies": {
- "@csstools/css-tokenizer": "^3.0.1"
+ "@csstools/css-tokenizer": "^3.0.3"
}
},
"node_modules/@csstools/css-tokenizer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz",
- "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz",
+ "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==",
"dev": true,
"funding": [
{
@@ -195,28 +195,6 @@
"@csstools/css-tokenizer": "^3.0.1"
}
},
- "node_modules/@csstools/selector-specificity": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz",
- "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "postcss-selector-parser": "^6.1.0"
- }
- },
"node_modules/@dual-bundle/import-meta-resolve": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
@@ -390,104 +368,40 @@
}
},
"node_modules/@stylistic/stylelint-config": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@stylistic/stylelint-config/-/stylelint-config-1.0.1.tgz",
- "integrity": "sha512-JgFP88HZEyo34k9RpWVdcQJtLPrMxYE58IO3qypXhmvE/NmZohj+xjDtQ8UfaarnYsLecnldw57/GHum07Ctdw==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@stylistic/stylelint-config/-/stylelint-config-2.0.0.tgz",
+ "integrity": "sha512-8J4YAxggy2Nzkb8KJIOLbtMXTPZ5gpKVmyhiiuKEUgCl9XFND5lM0e/ZZBMGEYZ68h5qcsS/jgg1wh235erRAw==",
"dev": true,
"dependencies": {
- "@stylistic/stylelint-plugin": "^2.0.0"
+ "@stylistic/stylelint-plugin": "^3.0.0"
},
"engines": {
"node": "^18.12 || >=20.9"
},
"peerDependencies": {
- "stylelint": "^16.0.2"
+ "stylelint": "^16.8.0"
}
},
"node_modules/@stylistic/stylelint-plugin": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-2.0.0.tgz",
- "integrity": "sha512-dHKuT6PGd1WGZLOTuozAM7GdQzdmlmnFXYzvV1jYJXXpcCpV/OJ3+n8TXpMkoOeKHpJydY43EOoZTO1W/FOA4Q==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.1.tgz",
+ "integrity": "sha512-XagAHHIa528EvyGybv8EEYGK5zrVW74cHpsjhtovVATbhDRuJYfE+X4HCaAieW9lCkwbX6L+X0I4CiUG3w/hFw==",
"dev": true,
"dependencies": {
- "@csstools/css-parser-algorithms": "^2.3.2",
- "@csstools/css-tokenizer": "^2.2.1",
- "@csstools/media-query-list-parser": "^2.1.5",
+ "@csstools/css-parser-algorithms": "^3.0.1",
+ "@csstools/css-tokenizer": "^3.0.1",
+ "@csstools/media-query-list-parser": "^3.0.1",
"is-plain-object": "^5.0.0",
- "postcss-selector-parser": "^6.0.13",
+ "postcss-selector-parser": "^6.1.2",
"postcss-value-parser": "^4.2.0",
"style-search": "^0.1.0",
- "stylelint": "^16.0.2"
+ "stylelint": "^16.8.2"
},
"engines": {
"node": "^18.12 || >=20.9"
},
"peerDependencies": {
- "stylelint": "^16.0.2"
- }
- },
- "node_modules/@stylistic/stylelint-plugin/node_modules/@csstools/css-parser-algorithms": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz",
- "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "engines": {
- "node": "^14 || ^16 || >=18"
- },
- "peerDependencies": {
- "@csstools/css-tokenizer": "^2.4.1"
- }
- },
- "node_modules/@stylistic/stylelint-plugin/node_modules/@csstools/css-tokenizer": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz",
- "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "engines": {
- "node": "^14 || ^16 || >=18"
- }
- },
- "node_modules/@stylistic/stylelint-plugin/node_modules/@csstools/media-query-list-parser": {
- "version": "2.1.13",
- "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz",
- "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "engines": {
- "node": "^14 || ^16 || >=18"
- },
- "peerDependencies": {
- "@csstools/css-parser-algorithms": "^2.7.1",
- "@csstools/css-tokenizer": "^2.4.1"
+ "stylelint": "^16.8.0"
}
},
"node_modules/@stylistic/stylelint-plugin/node_modules/is-plain-object": {
@@ -905,9 +819,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001667",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz",
- "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==",
+ "version": "1.0.30001707",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz",
+ "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==",
"dev": true,
"funding": [
{
@@ -1084,9 +998,9 @@
}
},
"node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"dependencies": {
"path-key": "^3.1.0",
@@ -1098,9 +1012,9 @@
}
},
"node_modules/css-functions-list": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz",
- "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz",
+ "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==",
"dev": true,
"engines": {
"node": ">=12 || >=16"
@@ -1117,12 +1031,12 @@
}
},
"node_modules/css-tree": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
- "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz",
+ "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==",
"dev": true,
"dependencies": {
- "mdn-data": "2.0.30",
+ "mdn-data": "2.12.2",
"source-map-js": "^1.0.1"
},
"engines": {
@@ -1207,13 +1121,13 @@
}
},
"node_modules/doiuse": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-6.0.3.tgz",
- "integrity": "sha512-cgu7al1yxHpRS+Q+ru3LQYUDttoPBGYgY7JunTdr0VeFMjBAwXVHTyZxn48ZOuxpBB30W52kOK6mwbduuqNboQ==",
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-6.0.5.tgz",
+ "integrity": "sha512-ljuf9ndGqKST0GlPAYyCg04hbQAeR1xIIWVDjQaDDkoTY/Y1Vb+8FNoy6NuVuJIEEKe/nKUH8NRWjG7JJxZ9Eg==",
"dev": true,
"dependencies": {
- "browserslist": "^4.23.3",
- "caniuse-lite": "^1.0.30001662",
+ "browserslist": "^4.24.0",
+ "caniuse-lite": "^1.0.30001669",
"css-tokenize": "^1.0.1",
"duplexify": "^4.1.3",
"multimatch": "^5.0.0",
@@ -1270,9 +1184,9 @@
}
},
"node_modules/domutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
- "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
"dev": true,
"dependencies": {
"dom-serializer": "^2.0.0",
@@ -1474,9 +1388,9 @@
}
},
"node_modules/eslint-config-wikimedia": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
- "integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
+ "version": "0.29.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.29.1.tgz",
+ "integrity": "sha512-4dbL5o3hKGSvreyrGZWLPoTDLFubZ575IQOPhUaTcpbTsi0u05TBEMsOyYkthTaK21vsFQqhSYtxp/xU93BSdA==",
"dev": true,
"dependencies": {
"browserslist-config-wikimedia": "^0.7.0",
@@ -1489,13 +1403,16 @@
"eslint-plugin-mediawiki": "^0.7.0",
"eslint-plugin-mocha": "^10.4.3",
"eslint-plugin-n": "^17.7.0",
- "eslint-plugin-no-jquery": "^3.0.1",
+ "eslint-plugin-no-jquery": "^3.1.1",
"eslint-plugin-qunit": "^8.1.1",
"eslint-plugin-security": "^1.7.1",
"eslint-plugin-unicorn": "^53.0.0",
"eslint-plugin-vue": "^9.26.0",
"eslint-plugin-wdio": "^8.24.12",
"eslint-plugin-yml": "^1.14.0"
+ },
+ "engines": {
+ "node": ">=18 <23"
}
},
"node_modules/eslint-plugin-compat": {
@@ -1693,9 +1610,9 @@
}
},
"node_modules/eslint-plugin-no-jquery": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
- "integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
+ "integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
"dev": true,
"peerDependencies": {
"eslint": ">=8.0.0"
@@ -2080,10 +1997,20 @@
"dev": true
},
"node_modules/fast-uri": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz",
- "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==",
- "dev": true
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ]
},
"node_modules/fastest-levenshtein": {
"version": "1.0.16",
@@ -3004,9 +2931,9 @@
}
},
"node_modules/known-css-properties": {
- "version": "0.34.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz",
- "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==",
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz",
+ "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==",
"dev": true
},
"node_modules/levn": {
@@ -3133,9 +3060,9 @@
}
},
"node_modules/mdn-data": {
- "version": "2.0.30",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
- "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
+ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
"dev": true
},
"node_modules/meow": {
@@ -3219,9 +3146,9 @@
}
},
"node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"dev": true,
"funding": [
{
@@ -3552,9 +3479,9 @@
}
},
"node_modules/picocolors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
- "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"dev": true
},
"node_modules/picomatch": {
@@ -3579,9 +3506,9 @@
}
},
"node_modules/postcss": {
- "version": "8.4.47",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
- "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
"dev": true,
"funding": [
{
@@ -3598,8 +3525,8 @@
}
],
"dependencies": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.1.0",
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
"engines": {
@@ -3607,13 +3534,13 @@
}
},
"node_modules/postcss-html": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.6.0.tgz",
- "integrity": "sha512-OWgQ9/Pe23MnNJC0PL4uZp8k0EDaUvqpJFSiwFxOLClAhmD7UEisyhO3x5hVsD4xFrjReVTXydlrMes45dJ71w==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.7.0.tgz",
+ "integrity": "sha512-MfcMpSUIaR/nNgeVS8AyvyDugXlADjN9AcV7e5rDfrF1wduIAGSkL4q2+wgrZgA3sHVAHLDO9FuauHhZYW2nBw==",
"dev": true,
"dependencies": {
"htmlparser2": "^8.0.0",
- "js-tokens": "^8.0.0",
+ "js-tokens": "^9.0.0",
"postcss": "^8.4.0",
"postcss-safe-parser": "^6.0.0"
},
@@ -3622,9 +3549,9 @@
}
},
"node_modules/postcss-html/node_modules/js-tokens": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz",
- "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==",
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
"dev": true
},
"node_modules/postcss-html/node_modules/postcss-safe-parser": {
@@ -4270,9 +4197,9 @@
"dev": true
},
"node_modules/stylelint": {
- "version": "16.9.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz",
- "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==",
+ "version": "16.12.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.12.0.tgz",
+ "integrity": "sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg==",
"dev": true,
"funding": [
{
@@ -4285,44 +4212,43 @@
}
],
"dependencies": {
- "@csstools/css-parser-algorithms": "^3.0.1",
- "@csstools/css-tokenizer": "^3.0.1",
- "@csstools/media-query-list-parser": "^3.0.1",
- "@csstools/selector-specificity": "^4.0.0",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/media-query-list-parser": "^4.0.2",
+ "@csstools/selector-specificity": "^5.0.0",
"@dual-bundle/import-meta-resolve": "^4.1.0",
"balanced-match": "^2.0.0",
"colord": "^2.9.3",
"cosmiconfig": "^9.0.0",
- "css-functions-list": "^3.2.2",
- "css-tree": "^2.3.1",
- "debug": "^4.3.6",
+ "css-functions-list": "^3.2.3",
+ "css-tree": "^3.0.1",
+ "debug": "^4.3.7",
"fast-glob": "^3.3.2",
"fastest-levenshtein": "^1.0.16",
- "file-entry-cache": "^9.0.0",
+ "file-entry-cache": "^9.1.0",
"global-modules": "^2.0.0",
"globby": "^11.1.0",
"globjoin": "^0.1.4",
"html-tags": "^3.3.1",
- "ignore": "^5.3.2",
+ "ignore": "^6.0.2",
"imurmurhash": "^0.1.4",
"is-plain-object": "^5.0.0",
- "known-css-properties": "^0.34.0",
+ "known-css-properties": "^0.35.0",
"mathml-tag-names": "^2.1.3",
"meow": "^13.2.0",
"micromatch": "^4.0.8",
"normalize-path": "^3.0.0",
- "picocolors": "^1.0.1",
- "postcss": "^8.4.41",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.49",
"postcss-resolve-nested-selector": "^0.1.6",
- "postcss-safe-parser": "^7.0.0",
- "postcss-selector-parser": "^6.1.2",
+ "postcss-safe-parser": "^7.0.1",
+ "postcss-selector-parser": "^7.0.0",
"postcss-value-parser": "^4.2.0",
"resolve-from": "^5.0.0",
"string-width": "^4.2.3",
- "strip-ansi": "^7.1.0",
"supports-hyperlinks": "^3.1.0",
"svg-tags": "^1.0.0",
- "table": "^6.8.2",
+ "table": "^6.9.0",
"write-file-atomic": "^5.0.1"
},
"bin": {
@@ -4333,81 +4259,66 @@
}
},
"node_modules/stylelint-config-recommended": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz",
- "integrity": "sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==",
+ "version": "14.0.1",
+ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz",
+ "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/stylelint"
+ }
+ ],
"engines": {
"node": ">=18.12.0"
},
"peerDependencies": {
- "stylelint": "^16.0.0"
+ "stylelint": "^16.1.0"
}
},
"node_modules/stylelint-config-wikimedia": {
- "version": "0.17.2",
- "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.17.2.tgz",
- "integrity": "sha512-cc3PYhe1O/GTgsMOp+Ri3ru579YBbZ3Me0oU7xNb06n4iwyXYPz8qO5G4iQ13UH19UW2NIS8Tk0goPRrJ1RAfw==",
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.18.0.tgz",
+ "integrity": "sha512-Lr45NIe7pG8i7BPcMc6EddO1pRK8/KNG8gp4o/oOG1Ez10hglJuJb/QT17BlzX8NPkhtP2KdY63NS2f/Wcj6Ww==",
"dev": true,
"dependencies": {
- "@stylistic/stylelint-config": "1.0.1",
- "@stylistic/stylelint-plugin": "2.0.0",
+ "@stylistic/stylelint-config": "2.0.0",
+ "@stylistic/stylelint-plugin": "3.1.1",
"browserslist-config-wikimedia": "0.7.0",
- "postcss-html": "1.6.0",
+ "postcss-html": "1.7.0",
"postcss-less": "6.0.0",
- "stylelint": "16.2.0",
- "stylelint-config-recommended": "14.0.0",
- "stylelint-no-unsupported-browser-features": "8.0.1"
+ "stylelint": "16.12.0",
+ "stylelint-config-recommended": "14.0.1",
+ "stylelint-no-unsupported-browser-features": "8.0.2"
},
"peerDependencies": {
"postcss-less": "^6.0.0"
}
},
- "node_modules/stylelint-config-wikimedia/node_modules/@csstools/css-parser-algorithms": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz",
- "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==",
+ "node_modules/stylelint-no-unsupported-browser-features": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-8.0.2.tgz",
+ "integrity": "sha512-4PY2qJ3ZTEje9RgGfaQ82eJoPioXxs6hazeKpji/wzLNVzTX2wd4b0Ds3ewdLkH3ID+o63IInuTquU2MNJO3YQ==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
+ "dependencies": {
+ "doiuse": "^6.0.5",
+ "postcss": "^8.4.32"
+ },
"engines": {
- "node": "^14 || ^16 || >=18"
+ "node": ">=18.12.0"
},
"peerDependencies": {
- "@csstools/css-tokenizer": "^2.4.1"
- }
- },
- "node_modules/stylelint-config-wikimedia/node_modules/@csstools/css-tokenizer": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz",
- "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "engines": {
- "node": "^14 || ^16 || >=18"
+ "stylelint": "^16.0.2"
}
},
- "node_modules/stylelint-config-wikimedia/node_modules/@csstools/media-query-list-parser": {
- "version": "2.1.13",
- "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz",
- "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==",
+ "node_modules/stylelint/node_modules/@csstools/media-query-list-parser": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz",
+ "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==",
"dev": true,
"funding": [
{
@@ -4420,17 +4331,17 @@
}
],
"engines": {
- "node": "^14 || ^16 || >=18"
+ "node": ">=18"
},
"peerDependencies": {
- "@csstools/css-parser-algorithms": "^2.7.1",
- "@csstools/css-tokenizer": "^2.4.1"
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3"
}
},
- "node_modules/stylelint-config-wikimedia/node_modules/@csstools/selector-specificity": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz",
- "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==",
+ "node_modules/stylelint/node_modules/@csstools/selector-specificity": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
+ "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
"dev": true,
"funding": [
{
@@ -4443,214 +4354,10 @@
}
],
"engines": {
- "node": "^14 || ^16 || >=18"
- },
- "peerDependencies": {
- "postcss-selector-parser": "^6.0.13"
- }
- },
- "node_modules/stylelint-config-wikimedia/node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/stylelint-config-wikimedia/node_modules/balanced-match": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
- "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
- "dev": true
- },
- "node_modules/stylelint-config-wikimedia/node_modules/file-entry-cache": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
- "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
- "dev": true,
- "dependencies": {
- "flat-cache": "^4.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/stylelint-config-wikimedia/node_modules/flat-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
- "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
- "dev": true,
- "dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.4"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/stylelint-config-wikimedia/node_modules/global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dev": true,
- "dependencies": {
- "global-prefix": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/stylelint-config-wikimedia/node_modules/global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dev": true,
- "dependencies": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/stylelint-config-wikimedia/node_modules/is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/stylelint-config-wikimedia/node_modules/known-css-properties": {
- "version": "0.29.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
- "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
- "dev": true
- },
- "node_modules/stylelint-config-wikimedia/node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/stylelint-config-wikimedia/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/stylelint-config-wikimedia/node_modules/stylelint": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.2.0.tgz",
- "integrity": "sha512-gwqU5AkIb52wrAzzn+359S3NIJDMl02TXLUaV2tzA/L6jUdpTwNt+MCxHlc8+Hb2bUHlYVo92YeSIryF2gJthA==",
- "dev": true,
- "dependencies": {
- "@csstools/css-parser-algorithms": "^2.5.0",
- "@csstools/css-tokenizer": "^2.2.3",
- "@csstools/media-query-list-parser": "^2.1.7",
- "@csstools/selector-specificity": "^3.0.1",
- "balanced-match": "^2.0.0",
- "colord": "^2.9.3",
- "cosmiconfig": "^9.0.0",
- "css-functions-list": "^3.2.1",
- "css-tree": "^2.3.1",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "fastest-levenshtein": "^1.0.16",
- "file-entry-cache": "^8.0.0",
- "global-modules": "^2.0.0",
- "globby": "^11.1.0",
- "globjoin": "^0.1.4",
- "html-tags": "^3.3.1",
- "ignore": "^5.3.0",
- "imurmurhash": "^0.1.4",
- "is-plain-object": "^5.0.0",
- "known-css-properties": "^0.29.0",
- "mathml-tag-names": "^2.1.3",
- "meow": "^13.1.0",
- "micromatch": "^4.0.5",
- "normalize-path": "^3.0.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.4.33",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^7.0.0",
- "postcss-selector-parser": "^6.0.15",
- "postcss-value-parser": "^4.2.0",
- "resolve-from": "^5.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^7.1.0",
- "supports-hyperlinks": "^3.0.0",
- "svg-tags": "^1.0.0",
- "table": "^6.8.1",
- "write-file-atomic": "^5.0.1"
- },
- "bin": {
- "stylelint": "bin/stylelint.mjs"
- },
- "engines": {
- "node": ">=18.12.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/stylelint"
- }
- },
- "node_modules/stylelint-config-wikimedia/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/stylelint-no-unsupported-browser-features": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-8.0.1.tgz",
- "integrity": "sha512-tc8Xn5DaqJhxTmbA4H8gZbYdAz027NfuSZv5+cVieQb7BtBrF/1/iKYdpcGwXPl3GtqkQrisiXuGqKkKnzWcLw==",
- "dev": true,
- "dependencies": {
- "doiuse": "^6.0.2",
- "postcss": "^8.4.32"
- },
- "engines": {
- "node": ">=18.12.0"
+ "node": ">=18"
},
"peerDependencies": {
- "stylelint": "^16.0.2"
- }
- },
- "node_modules/stylelint/node_modules/ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ "postcss-selector-parser": "^7.0.0"
}
},
"node_modules/stylelint/node_modules/balanced-match": {
@@ -4710,6 +4417,15 @@
"node": ">=6"
}
},
+ "node_modules/stylelint/node_modules/ignore": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
+ "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
"node_modules/stylelint/node_modules/is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
@@ -4719,6 +4435,19 @@
"node": ">=0.10.0"
}
},
+ "node_modules/stylelint/node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/stylelint/node_modules/resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -4728,21 +4457,6 @@
"node": ">=8"
}
},
- "node_modules/stylelint/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
"node_modules/stylelint/node_modules/which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
@@ -4802,9 +4516,9 @@
"dev": true
},
"node_modules/table": {
- "version": "6.8.2",
- "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
- "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz",
+ "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==",
"dev": true,
"dependencies": {
"ajv": "^8.0.1",
@@ -5281,16 +4995,16 @@
}
},
"@csstools/css-parser-algorithms": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.1.tgz",
- "integrity": "sha512-lSquqZCHxDfuTg/Sk2hiS0mcSFCEBuj49JfzPHJogDBT0mGCyY5A1AQzBWngitrp7i1/HAZpIgzF/VjhOEIJIg==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz",
+ "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==",
"dev": true,
"requires": {}
},
"@csstools/css-tokenizer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.1.tgz",
- "integrity": "sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz",
+ "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==",
"dev": true
},
"@csstools/media-query-list-parser": {
@@ -5300,13 +5014,6 @@
"dev": true,
"requires": {}
},
- "@csstools/selector-specificity": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz",
- "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==",
- "dev": true,
- "requires": {}
- },
"@dual-bundle/import-meta-resolve": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
@@ -5429,50 +5136,30 @@
}
},
"@stylistic/stylelint-config": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@stylistic/stylelint-config/-/stylelint-config-1.0.1.tgz",
- "integrity": "sha512-JgFP88HZEyo34k9RpWVdcQJtLPrMxYE58IO3qypXhmvE/NmZohj+xjDtQ8UfaarnYsLecnldw57/GHum07Ctdw==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@stylistic/stylelint-config/-/stylelint-config-2.0.0.tgz",
+ "integrity": "sha512-8J4YAxggy2Nzkb8KJIOLbtMXTPZ5gpKVmyhiiuKEUgCl9XFND5lM0e/ZZBMGEYZ68h5qcsS/jgg1wh235erRAw==",
"dev": true,
"requires": {
- "@stylistic/stylelint-plugin": "^2.0.0"
+ "@stylistic/stylelint-plugin": "^3.0.0"
}
},
"@stylistic/stylelint-plugin": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-2.0.0.tgz",
- "integrity": "sha512-dHKuT6PGd1WGZLOTuozAM7GdQzdmlmnFXYzvV1jYJXXpcCpV/OJ3+n8TXpMkoOeKHpJydY43EOoZTO1W/FOA4Q==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.1.tgz",
+ "integrity": "sha512-XagAHHIa528EvyGybv8EEYGK5zrVW74cHpsjhtovVATbhDRuJYfE+X4HCaAieW9lCkwbX6L+X0I4CiUG3w/hFw==",
"dev": true,
"requires": {
- "@csstools/css-parser-algorithms": "^2.3.2",
- "@csstools/css-tokenizer": "^2.2.1",
- "@csstools/media-query-list-parser": "^2.1.5",
+ "@csstools/css-parser-algorithms": "^3.0.1",
+ "@csstools/css-tokenizer": "^3.0.1",
+ "@csstools/media-query-list-parser": "^3.0.1",
"is-plain-object": "^5.0.0",
- "postcss-selector-parser": "^6.0.13",
+ "postcss-selector-parser": "^6.1.2",
"postcss-value-parser": "^4.2.0",
"style-search": "^0.1.0",
- "stylelint": "^16.0.2"
+ "stylelint": "^16.8.2"
},
"dependencies": {
- "@csstools/css-parser-algorithms": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz",
- "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==",
- "dev": true,
- "requires": {}
- },
- "@csstools/css-tokenizer": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz",
- "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==",
- "dev": true
- },
- "@csstools/media-query-list-parser": {
- "version": "2.1.13",
- "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz",
- "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==",
- "dev": true,
- "requires": {}
- },
"is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
@@ -5766,9 +5453,9 @@
"dev": true
},
"caniuse-lite": {
- "version": "1.0.30001667",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz",
- "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==",
+ "version": "1.0.30001707",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz",
+ "integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==",
"dev": true
},
"chalk": {
@@ -5882,9 +5569,9 @@
}
},
"cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"requires": {
"path-key": "^3.1.0",
@@ -5893,9 +5580,9 @@
}
},
"css-functions-list": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz",
- "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz",
+ "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==",
"dev": true
},
"css-tokenize": {
@@ -5909,12 +5596,12 @@
}
},
"css-tree": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
- "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz",
+ "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==",
"dev": true,
"requires": {
- "mdn-data": "2.0.30",
+ "mdn-data": "2.12.2",
"source-map-js": "^1.0.1"
}
},
@@ -5970,13 +5657,13 @@
}
},
"doiuse": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-6.0.3.tgz",
- "integrity": "sha512-cgu7al1yxHpRS+Q+ru3LQYUDttoPBGYgY7JunTdr0VeFMjBAwXVHTyZxn48ZOuxpBB30W52kOK6mwbduuqNboQ==",
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-6.0.5.tgz",
+ "integrity": "sha512-ljuf9ndGqKST0GlPAYyCg04hbQAeR1xIIWVDjQaDDkoTY/Y1Vb+8FNoy6NuVuJIEEKe/nKUH8NRWjG7JJxZ9Eg==",
"dev": true,
"requires": {
- "browserslist": "^4.23.3",
- "caniuse-lite": "^1.0.30001662",
+ "browserslist": "^4.24.0",
+ "caniuse-lite": "^1.0.30001669",
"css-tokenize": "^1.0.1",
"duplexify": "^4.1.3",
"multimatch": "^5.0.0",
@@ -6012,9 +5699,9 @@
}
},
"domutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
- "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
"dev": true,
"requires": {
"dom-serializer": "^2.0.0",
@@ -6176,9 +5863,9 @@
}
},
"eslint-config-wikimedia": {
- "version": "0.28.2",
- "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.28.2.tgz",
- "integrity": "sha512-5+rdnT7wH1gpKAO6tHYThg78eMhZMruJzvqku3Y5iaEY/A7kSKLFpA/vOj/snys9fKjDHC9BXmArQh+agkOoJQ==",
+ "version": "0.29.1",
+ "resolved": "https://registry.npmjs.org/eslint-config-wikimedia/-/eslint-config-wikimedia-0.29.1.tgz",
+ "integrity": "sha512-4dbL5o3hKGSvreyrGZWLPoTDLFubZ575IQOPhUaTcpbTsi0u05TBEMsOyYkthTaK21vsFQqhSYtxp/xU93BSdA==",
"dev": true,
"requires": {
"browserslist-config-wikimedia": "^0.7.0",
@@ -6191,7 +5878,7 @@
"eslint-plugin-mediawiki": "^0.7.0",
"eslint-plugin-mocha": "^10.4.3",
"eslint-plugin-n": "^17.7.0",
- "eslint-plugin-no-jquery": "^3.0.1",
+ "eslint-plugin-no-jquery": "^3.1.1",
"eslint-plugin-qunit": "^8.1.1",
"eslint-plugin-security": "^1.7.1",
"eslint-plugin-unicorn": "^53.0.0",
@@ -6326,9 +6013,9 @@
}
},
"eslint-plugin-no-jquery": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.0.2.tgz",
- "integrity": "sha512-n/+6p6PFhWDNPVLJj1463hw4OTIRBbROGcbhmtOHTgw7yihSKzkwZiQ00EJTneyeR3jRiw5lpWSMCCBhtb8t2g==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-3.1.1.tgz",
+ "integrity": "sha512-LTLO3jH/Tjr1pmxCEqtV6qmt+OChv8La4fwgG470JRpgxyFF4NOzoC9CRy92GIWD3Yjl0qLEgPmD2FLQWcNEjg==",
"dev": true,
"requires": {}
},
@@ -6602,9 +6289,9 @@
"dev": true
},
"fast-uri": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz",
- "integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==",
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
"dev": true
},
"fastest-levenshtein": {
@@ -7302,9 +6989,9 @@
"dev": true
},
"known-css-properties": {
- "version": "0.34.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz",
- "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==",
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz",
+ "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==",
"dev": true
},
"levn": {
@@ -7408,9 +7095,9 @@
"dev": true
},
"mdn-data": {
- "version": "2.0.30",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
- "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
+ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
"dev": true
},
"meow": {
@@ -7470,9 +7157,9 @@
}
},
"nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"dev": true
},
"natural-compare": {
@@ -7715,9 +7402,9 @@
"dev": true
},
"picocolors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz",
- "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"dev": true
},
"picomatch": {
@@ -7733,32 +7420,32 @@
"dev": true
},
"postcss": {
- "version": "8.4.47",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz",
- "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==",
+ "version": "8.5.3",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
"dev": true,
"requires": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.1.0",
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
}
},
"postcss-html": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.6.0.tgz",
- "integrity": "sha512-OWgQ9/Pe23MnNJC0PL4uZp8k0EDaUvqpJFSiwFxOLClAhmD7UEisyhO3x5hVsD4xFrjReVTXydlrMes45dJ71w==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.7.0.tgz",
+ "integrity": "sha512-MfcMpSUIaR/nNgeVS8AyvyDugXlADjN9AcV7e5rDfrF1wduIAGSkL4q2+wgrZgA3sHVAHLDO9FuauHhZYW2nBw==",
"dev": true,
"requires": {
"htmlparser2": "^8.0.0",
- "js-tokens": "^8.0.0",
+ "js-tokens": "^9.0.0",
"postcss": "^8.4.0",
"postcss-safe-parser": "^6.0.0"
},
"dependencies": {
"js-tokens": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz",
- "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==",
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz",
+ "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==",
"dev": true
},
"postcss-safe-parser": {
@@ -8206,57 +7893,64 @@
"dev": true
},
"stylelint": {
- "version": "16.9.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.9.0.tgz",
- "integrity": "sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==",
+ "version": "16.12.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.12.0.tgz",
+ "integrity": "sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg==",
"dev": true,
"requires": {
- "@csstools/css-parser-algorithms": "^3.0.1",
- "@csstools/css-tokenizer": "^3.0.1",
- "@csstools/media-query-list-parser": "^3.0.1",
- "@csstools/selector-specificity": "^4.0.0",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/media-query-list-parser": "^4.0.2",
+ "@csstools/selector-specificity": "^5.0.0",
"@dual-bundle/import-meta-resolve": "^4.1.0",
"balanced-match": "^2.0.0",
"colord": "^2.9.3",
"cosmiconfig": "^9.0.0",
- "css-functions-list": "^3.2.2",
- "css-tree": "^2.3.1",
- "debug": "^4.3.6",
+ "css-functions-list": "^3.2.3",
+ "css-tree": "^3.0.1",
+ "debug": "^4.3.7",
"fast-glob": "^3.3.2",
"fastest-levenshtein": "^1.0.16",
- "file-entry-cache": "^9.0.0",
+ "file-entry-cache": "^9.1.0",
"global-modules": "^2.0.0",
"globby": "^11.1.0",
"globjoin": "^0.1.4",
"html-tags": "^3.3.1",
- "ignore": "^5.3.2",
+ "ignore": "^6.0.2",
"imurmurhash": "^0.1.4",
"is-plain-object": "^5.0.0",
- "known-css-properties": "^0.34.0",
+ "known-css-properties": "^0.35.0",
"mathml-tag-names": "^2.1.3",
"meow": "^13.2.0",
"micromatch": "^4.0.8",
"normalize-path": "^3.0.0",
- "picocolors": "^1.0.1",
- "postcss": "^8.4.41",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.49",
"postcss-resolve-nested-selector": "^0.1.6",
- "postcss-safe-parser": "^7.0.0",
- "postcss-selector-parser": "^6.1.2",
+ "postcss-safe-parser": "^7.0.1",
+ "postcss-selector-parser": "^7.0.0",
"postcss-value-parser": "^4.2.0",
"resolve-from": "^5.0.0",
"string-width": "^4.2.3",
- "strip-ansi": "^7.1.0",
"supports-hyperlinks": "^3.1.0",
"svg-tags": "^1.0.0",
- "table": "^6.8.2",
+ "table": "^6.9.0",
"write-file-atomic": "^5.0.1"
},
"dependencies": {
- "ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
- "dev": true
+ "@csstools/media-query-list-parser": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz",
+ "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==",
+ "dev": true,
+ "requires": {}
+ },
+ "@csstools/selector-specificity": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
+ "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
+ "dev": true,
+ "requires": {}
},
"balanced-match": {
"version": "2.0.0",
@@ -8303,27 +7997,34 @@
"which": "^1.3.1"
}
},
+ "ignore": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
+ "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
+ "dev": true
+ },
"is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"dev": true
},
+ "postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ }
+ },
"resolve-from": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true
},
- "strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
- "requires": {
- "ansi-regex": "^6.0.1"
- }
- },
"which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
@@ -8336,197 +8037,35 @@
}
},
"stylelint-config-recommended": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz",
- "integrity": "sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==",
+ "version": "14.0.1",
+ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz",
+ "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==",
"dev": true,
"requires": {}
},
"stylelint-config-wikimedia": {
- "version": "0.17.2",
- "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.17.2.tgz",
- "integrity": "sha512-cc3PYhe1O/GTgsMOp+Ri3ru579YBbZ3Me0oU7xNb06n4iwyXYPz8qO5G4iQ13UH19UW2NIS8Tk0goPRrJ1RAfw==",
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-wikimedia/-/stylelint-config-wikimedia-0.18.0.tgz",
+ "integrity": "sha512-Lr45NIe7pG8i7BPcMc6EddO1pRK8/KNG8gp4o/oOG1Ez10hglJuJb/QT17BlzX8NPkhtP2KdY63NS2f/Wcj6Ww==",
"dev": true,
"requires": {
- "@stylistic/stylelint-config": "1.0.1",
- "@stylistic/stylelint-plugin": "2.0.0",
+ "@stylistic/stylelint-config": "2.0.0",
+ "@stylistic/stylelint-plugin": "3.1.1",
"browserslist-config-wikimedia": "0.7.0",
- "postcss-html": "1.6.0",
+ "postcss-html": "1.7.0",
"postcss-less": "6.0.0",
- "stylelint": "16.2.0",
- "stylelint-config-recommended": "14.0.0",
- "stylelint-no-unsupported-browser-features": "8.0.1"
- },
- "dependencies": {
- "@csstools/css-parser-algorithms": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.7.1.tgz",
- "integrity": "sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==",
- "dev": true,
- "requires": {}
- },
- "@csstools/css-tokenizer": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.4.1.tgz",
- "integrity": "sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==",
- "dev": true
- },
- "@csstools/media-query-list-parser": {
- "version": "2.1.13",
- "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.13.tgz",
- "integrity": "sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==",
- "dev": true,
- "requires": {}
- },
- "@csstools/selector-specificity": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz",
- "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==",
- "dev": true,
- "requires": {}
- },
- "ansi-regex": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
- "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
- "dev": true
- },
- "balanced-match": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
- "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
- "dev": true
- },
- "file-entry-cache": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
- "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
- "dev": true,
- "requires": {
- "flat-cache": "^4.0.0"
- }
- },
- "flat-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
- "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
- "dev": true,
- "requires": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.4"
- }
- },
- "global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dev": true,
- "requires": {
- "global-prefix": "^3.0.0"
- }
- },
- "global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dev": true,
- "requires": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- }
- },
- "is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
- "dev": true
- },
- "known-css-properties": {
- "version": "0.29.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz",
- "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==",
- "dev": true
- },
- "resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true
- },
- "strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
- "requires": {
- "ansi-regex": "^6.0.1"
- }
- },
- "stylelint": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.2.0.tgz",
- "integrity": "sha512-gwqU5AkIb52wrAzzn+359S3NIJDMl02TXLUaV2tzA/L6jUdpTwNt+MCxHlc8+Hb2bUHlYVo92YeSIryF2gJthA==",
- "dev": true,
- "requires": {
- "@csstools/css-parser-algorithms": "^2.5.0",
- "@csstools/css-tokenizer": "^2.2.3",
- "@csstools/media-query-list-parser": "^2.1.7",
- "@csstools/selector-specificity": "^3.0.1",
- "balanced-match": "^2.0.0",
- "colord": "^2.9.3",
- "cosmiconfig": "^9.0.0",
- "css-functions-list": "^3.2.1",
- "css-tree": "^2.3.1",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "fastest-levenshtein": "^1.0.16",
- "file-entry-cache": "^8.0.0",
- "global-modules": "^2.0.0",
- "globby": "^11.1.0",
- "globjoin": "^0.1.4",
- "html-tags": "^3.3.1",
- "ignore": "^5.3.0",
- "imurmurhash": "^0.1.4",
- "is-plain-object": "^5.0.0",
- "known-css-properties": "^0.29.0",
- "mathml-tag-names": "^2.1.3",
- "meow": "^13.1.0",
- "micromatch": "^4.0.5",
- "normalize-path": "^3.0.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.4.33",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^7.0.0",
- "postcss-selector-parser": "^6.0.15",
- "postcss-value-parser": "^4.2.0",
- "resolve-from": "^5.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^7.1.0",
- "supports-hyperlinks": "^3.0.0",
- "svg-tags": "^1.0.0",
- "table": "^6.8.1",
- "write-file-atomic": "^5.0.1"
- }
- },
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
- }
+ "stylelint": "16.12.0",
+ "stylelint-config-recommended": "14.0.1",
+ "stylelint-no-unsupported-browser-features": "8.0.2"
}
},
"stylelint-no-unsupported-browser-features": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-8.0.1.tgz",
- "integrity": "sha512-tc8Xn5DaqJhxTmbA4H8gZbYdAz027NfuSZv5+cVieQb7BtBrF/1/iKYdpcGwXPl3GtqkQrisiXuGqKkKnzWcLw==",
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-8.0.2.tgz",
+ "integrity": "sha512-4PY2qJ3ZTEje9RgGfaQ82eJoPioXxs6hazeKpji/wzLNVzTX2wd4b0Ds3ewdLkH3ID+o63IInuTquU2MNJO3YQ==",
"dev": true,
"requires": {
- "doiuse": "^6.0.2",
+ "doiuse": "^6.0.5",
"postcss": "^8.4.32"
}
},
@@ -8562,9 +8101,9 @@
"dev": true
},
"table": {
- "version": "6.8.2",
- "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
- "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz",
+ "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==",
"dev": true,
"requires": {
"ajv": "^8.0.1",
diff --git a/package.json b/package.json
index 38d3bd4..6635627 100644
--- a/package.json
+++ b/package.json
@@ -5,11 +5,11 @@
"test": "grunt test"
},
"devDependencies": {
- "eslint-config-wikimedia": "0.28.2",
+ "eslint-config-wikimedia": "0.29.1",
"grunt": "1.6.1",
"grunt-banana-checker": "0.13.0",
"grunt-eslint": "24.3.0",
"grunt-stylelint": "0.20.1",
- "stylelint-config-wikimedia": "0.17.2"
+ "stylelint-config-wikimedia": "0.18.0"
}
}
diff --git a/resources/VisualDataForms.js b/resources/VisualDataForms.js
index da93013..c84c916 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 46182f9..142bd92 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 () {
diff --git a/resources/Widgets/VisualDataDateTimeInputWidget.js b/resources/Widgets/VisualDataDateTimeInputWidget.js
index e9e440a..a0cbe09 100644
--- a/resources/Widgets/VisualDataDateTimeInputWidget.js
+++ b/resources/Widgets/VisualDataDateTimeInputWidget.js
@@ -56,7 +56,7 @@
// m = /^(\d{4,})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?Z$/.exec( value );
// ***edited, matches both +01:00 (ISO 8601 vP) and +0100 (ISO 8601 vO)
- // eslint-disable-next-line security/detect-unsafe-regex
+
const regex = /^(\d{4,})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{1,3}))?(Z|[+-]\d{2}:?\d{2}|[+-]\d{4})?$/;
m = regex.exec( value );
diff --git a/resources/Widgets/VisualDataMaptiler.js b/resources/Widgets/VisualDataMaptiler.js
index 18a4206..29294f3 100644
--- a/resources/Widgets/VisualDataMaptiler.js
+++ b/resources/Widgets/VisualDataMaptiler.js
@@ -40,7 +40,7 @@
// only load scripts
if ( !$element.parent().is( ':visible' ) ) {
VisualDataFunctions.loadScripts( this.scripts );
- return Promise.reject( 'Maptiler element not visible' );
+ throw 'Maptiler element not visible';
}
// *** prevents ajv error "Maximum call stack size exceeded"
@@ -51,7 +51,7 @@
var mapId = 'visualdata-maptiler-map-' + data.path;
if ( $( '#' + jQuery.escapeSelector( mapId ) ).length ) {
- return Promise.resolve();
+ return;
}
return new Promise( ( resolve, reject ) => {
diff --git a/resources/Widgets/VisualDataTinyMCE.js b/resources/Widgets/VisualDataTinyMCE.js
index fbf907a..4e71a44 100644
--- a/resources/Widgets/VisualDataTinyMCE.js
+++ b/resources/Widgets/VisualDataTinyMCE.js
@@ -59,13 +59,13 @@
VisualDataTinyMCE.prototype.initialize = async function () {
var self = this;
if ( self.initialized ) {
- return Promise.resolve();
+ return;
}
// only load scripts
if ( !self.$element.parent().is( ':visible' ) ) {
VisualDataFunctions.loadScripts( this.scripts );
- return Promise.reject( 'TinyMCE element not visible' );
+ throw 'TinyMCE element not visible';
}
return new Promise( ( resolve, reject ) => {
diff --git a/resources/Widgets/VisualDataVisualEditor.js b/resources/Widgets/VisualDataVisualEditor.js
index d5fbd14..858a99e 100644
--- a/resources/Widgets/VisualDataVisualEditor.js
+++ b/resources/Widgets/VisualDataVisualEditor.js
@@ -61,11 +61,11 @@
}
if ( this.initialized ) {
- return Promise.resolve( true );
+ return true;
}
if ( !self.$element.parent().is( ':visible' ) ) {
- return Promise.reject( 'VEForAll element not visible' );
+ throw 'VEForAll element not visible';
}
return new Promise( ( resolve, reject ) => {
diff --git a/resources/slick/main.js b/resources/slick/main.js
index 731c622..699c8d8 100644
--- a/resources/slick/main.js
+++ b/resources/slick/main.js
@@ -54,7 +54,7 @@
if ( $( this ).attr( 'data-url' ) ) {
// $(this).attr('title', $(this).attr('data-title') )
$( this ).css( 'cursor', 'pointer' );
- $( this ).click( function () {
+ $( this ).on( 'click', function () {
window.location = $( this ).attr( 'data-url' );
} );
}
--
2.39.2
--- end ---