N°3523 Add accessibility to silo selection and user menu toggler

This commit is contained in:
Stephen Abello
2021-11-19 11:14:39 +01:00
parent 18b8e7093a
commit 72d1ab5cbc
29 changed files with 540 additions and 7 deletions

View File

@@ -196,7 +196,7 @@ class UIExtKeyWidget
$bIsAutocomplete = $oAllowedValues->CountExceeds($iMaxComboLength);
$sWrapperCssClass = $bIsAutocomplete ? 'ibo-input-select-autocomplete-wrapper' : 'ibo-input-select-wrapper';
$sHTMLValue = "<div class=\"field_input_zone field_input_extkey ibo-input-wrapper ibo-input-select-wrapper--with-buttons $sWrapperCssClass\" data-attcode=\"".$this->sAttCode."\" data-validation=\"untouched\">";
$sHTMLValue = "<div class=\"field_input_zone field_input_extkey ibo-input-wrapper ibo-input-select-wrapper--with-buttons $sWrapperCssClass\" data-attcode=\"".$this->sAttCode."\" data-validation=\"untouched\" data-accessibility-selectize-label=\"$sTitle\">";
// We just need to compare the number of entries with MaxComboLength, so no need to get the real count.
if (!$bIsAutocomplete) {

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Company logo~~',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Expand / Collapse~~',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Expand / Collapse (Filtered on %1$s)~~',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filter...~~',
@@ -27,6 +28,7 @@ Dict::Add('CS CZ', 'Czech', 'Čeština', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'No result for this menu filter~~',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!~~',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s contact picture~~',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filter menu entries~~',
));

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('DA DA', 'Danish', 'Dansk', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Company logo~~',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Expand / Collapse~~',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Expand / Collapse (Filtered on %1$s)~~',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filter...~~',
@@ -27,6 +28,7 @@ Dict::Add('DA DA', 'Danish', 'Dansk', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'No result for this menu filter~~',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!~~',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s contact picture~~',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filter menu entries~~',
));

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Unternehmenslogo',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Ausklappen/Einklappen',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Ausklappen/Einklappen (Gefiltert nach %1$s)',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filter...',
@@ -27,6 +28,7 @@ Dict::Add('DE DE', 'German', 'Deutsch', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'Kein Ergebnis für diesen Menü-Filter',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s Profilbild',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filtere Menüeinträge',
));

View File

@@ -20,6 +20,7 @@
// Navigation menu
Dict::Add('EN US', 'English', 'English', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Company logo',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Expand / Collapse',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Expand / Collapse (Filtered on %1$s)',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filter...',
@@ -28,6 +29,7 @@ Dict::Add('EN US', 'English', 'English', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'Seems like there is no matching menu',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s contact picture',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filter menu entries',
));

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('ES CR', 'Spanish', 'Español, Castellaño', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Company logo~~',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Expand / Collapse~~',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Expand / Collapse (Filtered on %1$s)~~',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filter...~~',
@@ -27,6 +28,7 @@ Dict::Add('ES CR', 'Spanish', 'Español, Castellaño', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'No result for this menu filter~~',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!~~',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s contact picture~~',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filter menu entries~~',
));

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('FR FR', 'French', 'Français', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Logo entreprise',
'UI:Layout:NavigationMenu:Silo:Label' => 'Selectionnez l\'organisation sur laquelle filtrer',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Déplier / Replier',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Déplier / Replier (Filtré sur %1$s)~~',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filtrer...',
@@ -27,6 +28,7 @@ Dict::Add('FR FR', 'French', 'Français', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'Aucun menu ne semble correspondre',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Bonjour %1$s !',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => 'Image de contact de %1$s',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Ouvre le menu utilisateur',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filtrer les entrées de menu',
));

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Company logo~~',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Expand / Collapse~~',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Expand / Collapse (Filtered on %1$s)~~',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filter...~~',
@@ -27,6 +28,7 @@ Dict::Add('HU HU', 'Hungarian', 'Magyar', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'No result for this menu filter~~',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!~~',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s contact picture~~',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filter menu entries~~',
));

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('IT IT', 'Italian', 'Italiano', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Company logo~~',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Expand / Collapse~~',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Expand / Collapse (Filtered on %1$s)~~',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filter...~~',
@@ -27,6 +28,7 @@ Dict::Add('IT IT', 'Italian', 'Italiano', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'No result for this menu filter~~',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!~~',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s contact picture~~',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filter menu entries~~',
));

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('JA JP', 'Japanese', '日本語', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Company logo~~',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Expand / Collapse~~',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Expand / Collapse (Filtered on %1$s)~~',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filter...~~',
@@ -27,6 +28,7 @@ Dict::Add('JA JP', 'Japanese', '日本語', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'No result for this menu filter~~',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!~~',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s contact picture~~',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filter menu entries~~',
));

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Bedrijfslogo',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Vergroot / Verberg',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Vergroot / Verberg (Gefilterd op %1$s)',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filter…',
@@ -27,6 +28,7 @@ Dict::Add('NL NL', 'Dutch', 'Nederlands', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'No result for this menu filter~~',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Welkom %1$s!',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s profielfoto',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filter menu\'s',
));

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Company logo~~',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Expand / Collapse~~',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Expand / Collapse (Filtered on %1$s)~~',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filter...~~',
@@ -27,6 +28,7 @@ Dict::Add('PT BR', 'Brazilian', 'Brazilian', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'No result for this menu filter~~',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!~~',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s contact picture~~',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filter menu entries~~',
));

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('RU RU', 'Russian', 'Русский', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Логотип компании',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Развернуть / Свернуть',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Развернуть / Свернуть (фильтр по %1$s)',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Фильтр...',
@@ -27,5 +28,6 @@ Dict::Add('RU RU', 'Russian', 'Русский', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'Нет совпадений',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Добрый день, %1$s!',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => 'Фотография',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Фильтр пунктов меню',
));

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('SK SK', 'Slovak', 'Slovenčina', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Company logo~~',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Expand / Collapse~~',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Expand / Collapse (Filtered on %1$s)~~',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filter...~~',
@@ -27,6 +28,7 @@ Dict::Add('SK SK', 'Slovak', 'Slovenčina', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'No result for this menu filter~~',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!~~',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s contact picture~~',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filter menu entries~~',
));

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => 'Company logo~~',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => 'Expand / Collapse~~',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => 'Expand / Collapse (Filtered on %1$s)~~',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => 'Filter...~~',
@@ -27,6 +28,7 @@ Dict::Add('TR TR', 'Turkish', 'Türkçe', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'No result for this menu filter~~',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!~~',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s contact picture~~',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filter menu entries~~',
));

View File

@@ -19,6 +19,7 @@
// Navigation menu
Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'UI:Layout:NavigationMenu:CompanyLogo:AltText' => '公司logo',
'UI:Layout:NavigationMenu:Silo:Label' => 'Select organization to filter on~~',
'UI:Layout:NavigationMenu:Toggler:Tooltip' => '展开 / 折叠',
'UI:Layout:NavigationMenu:Toggler:TooltipWithSiloLabel' => '展开 / 折叠 (Filtered on %1$s)~~',
'UI:Layout:NavigationMenu:MenuFilter:Input:Placeholder' => '过滤器...',
@@ -27,6 +28,7 @@ Dict::Add('ZH CN', 'Chinese', '简体中文', array(
'UI:Layout:NavigationMenu:MenuFilter:Placeholder:Hint' => 'No result for this menu filter~~',
'UI:Layout:NavigationMenu:UserInfo:WelcomeMessage:Text' => 'Hi %1$s!',
'UI:Layout:NavigationMenu:UserInfo:Picture:AltText' => '%1$s\'s contact picture~~',
'UI:Layout:NavigationMenu:UserMenu:Toggler:Label' => 'Open user menu~~',
'UI:Layout:NavigationMenu:KeyboardShortcut:FocusFilter' => 'Filter menu entries~~',
));

View File

@@ -127,7 +127,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
}
this.AddSelectize = function (options, initValue) {
let $select = $('#'+me.id).selectize({
plugins:['custom_itop'],
plugins:['custom_itop', 'selectize-plugin-a11y'],
render: {
item: function (item) {
if (item.obsolescence_flag == 1) {
@@ -156,7 +156,7 @@ function ExtKeyWidget(id, sTargetClass, sFilter, sTitle, bSelectMode, oWizHelper
val = val+'<br><i>'+item.additional_field+'</i>';
}
val = val+'</span>';
return $("<div class=\"option ibo-input-select--autocomplete-item\">").append(val);
return $("<div class=\"option ibo-input-select--autocomplete-item\" role=\"option\" id=\"${$item.text.replace(' ', '')}\">g").append(val);
}
},
valueField: 'value',

5
node_modules/.package-lock.json generated vendored
View File

@@ -76,6 +76,11 @@
"node": ">=0.10.x"
}
},
"node_modules/selectize-plugin-a11y": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/selectize-plugin-a11y/-/selectize-plugin-a11y-1.1.0.tgz",
"integrity": "sha512-fgY8fzE5Jx6DaoMg1c6otibyftkBw5y64YL778pyq7rS92h10QCPmgMaRtsHdXBFwPt6qO8qqQ1Pj1JJ0GDPrA=="
},
"node_modules/tippy.js": {
"version": "6.2.5",
"license": "MIT",

248
node_modules/selectize-plugin-a11y/.eslintrc generated vendored Normal file
View File

@@ -0,0 +1,248 @@
{
"env": {
"browser": true,
"node": true,
"es6": false,
"jquery": true
},
"globals": {
"yTos": true,
"$Y": true,
"define": true,
"require": true,
"tc_vars": true,
"$M": true,
"attachmentLabels": true
},
"rules": {
"no-alert": "off",
"no-array-constructor": "off",
"no-caller": "off",
"no-case-declarations": "warn",
"no-catch-shadow": "off",
"no-class-assign": "error",
"no-confusing-arrow": "off",
"no-console": "off",
"no-const-assign": "error",
"no-constant-condition": "warn",
"no-continue": "off",
"no-control-regex": "error",
"no-debugger": "warn",
"no-delete-var": "error",
"no-div-regex": "off",
"no-dupe-class-members": "error",
"no-dupe-keys": "error",
"no-dupe-args": "error",
"no-duplicate-case": "error",
"no-duplicate-imports": "off",
"no-else-return": "off",
"no-empty-character-class": "error",
"no-empty-function": "off",
"no-empty-pattern": "error",
"no-eq-null": "off",
"no-eval": "off",
"no-ex-assign": "error",
"no-extend-native": "off",
"no-extra-bind": "off",
"no-extra-boolean-cast": "error",
"no-extra-label": "off",
"no-extra-parens": "off",
"no-extra-semi": "error",
"no-fallthrough": "error",
"no-floating-decimal": "off",
"no-func-assign": "error",
"no-implicit-coercion": "off",
"no-implicit-globals": "off",
"no-implied-eval": "off",
"no-inline-comments": "off",
"no-inner-declarations": "error",
"no-invalid-regexp": "error",
"no-irregular-whitespace": "error",
"no-iterator": "off",
"no-label-var": "off",
"no-labels": "off",
"no-lone-blocks": "off",
"no-lonely-if": "off",
"no-loop-func": "off",
"no-mixed-requires": "off",
"no-mixed-spaces-and-tabs": "error",
"no-multi-spaces": "off",
"no-multiple-empty-lines": [
"warn",
{
"max": 1
}
],
"no-native-reassign": "off",
"no-negated-condition": "off",
"no-negated-in-lhs": "error",
"no-nested-ternary": "off",
"no-new-func": "off",
"no-new-object": "off",
"no-new-require": "off",
"no-new-symbol": "error",
"no-new-wrappers": "off",
"no-obj-calls": "error",
"no-octal": "error",
"no-octal-escape": "off",
"no-param-reassign": "off",
"no-path-concat": "off",
"no-plusplus": "off",
"no-process-env": "off",
"no-process-exit": "off",
"no-proto": "off",
"no-redeclare": "error",
"no-regex-spaces": "warn",
"no-restricted-globals": "off",
"no-restricted-imports": "off",
"no-restricted-modules": "off",
"no-restricted-syntax": "off",
"no-return-assign": "off",
"no-script-url": "off",
"no-self-assign": "error",
"no-self-compare": "off",
"no-sequences": "off",
"no-shadow": "off",
"no-shadow-restricted-names": "off",
"no-whitespace-before-property": "off",
"no-spaced-func": "warn",
"no-sparse-arrays": "error",
"no-sync": "off",
"no-ternary": "off",
"no-trailing-spaces": "off",
"no-this-before-super": "error",
"no-throw-literal": "off",
"no-undef": "error",
"no-undef-init": "off",
"no-undefined": "off",
"no-unexpected-multiline": "error",
"no-underscore-dangle": "off",
"no-unmodified-loop-condition": "off",
"no-unneeded-ternary": "off",
"no-unreachable": "error",
"no-unused-expressions": "off",
"no-unused-labels": "error",
"no-unused-vars": [
"warn",
{
"vars": "local",
"args": "none"
}
],
"no-useless-call": "off",
"no-useless-concat": "off",
"no-useless-constructor": "off",
"no-void": "off",
"no-var": "off",
"no-warning-comments": "off",
"no-with": "off",
"no-magic-numbers": "off",
"array-bracket-spacing": "off",
"array-callback-return": "off",
"arrow-body-style": "off",
"arrow-parens": "off",
"arrow-spacing": "off",
"accessor-pairs": "off",
"block-scoped-var": "off",
"block-spacing": "warn",
"brace-style": "off",
"callback-return": "off",
"camelcase": "off",
"comma-dangle": "error",
"comma-spacing": "warn",
"comma-style": "off",
"complexity": [
"off",
11
],
"computed-property-spacing": "off",
"consistent-return": "off",
"consistent-this": "off",
"constructor-super": "error",
"default-case": "off",
"dot-location": "off",
"dot-notation": "off",
"eol-last": "off",
"func-names": "off",
"func-style": "off",
"generator-star-spacing": "off",
"global-require": "off",
"handle-callback-err": "off",
"id-length": "off",
"indent": ["error", 2],
"init-declarations": "off",
"jsx-quotes": "off",
"key-spacing": "warn",
"keyword-spacing": "off",
"lines-around-comment": "off",
"max-depth": "off",
"max-len": "off",
"max-nested-callbacks": "off",
"max-params": "off",
"max-statements": "off",
"new-parens": "off",
"newline-after-var": "off",
"newline-before-return": "off",
"newline-per-chained-call": "off",
"object-curly-spacing": [
"off",
"never"
],
"object-shorthand": "off",
"one-var": [
"warn",
"never"
],
"one-var-declaration-per-line": "off",
"operator-assignment": "off",
"operator-linebreak": "off",
"padded-blocks": "off",
"prefer-arrow-callback": "off",
"prefer-const": "off",
"prefer-reflect": "off",
"prefer-rest-params": "off",
"prefer-spread": "off",
"prefer-template": "off",
"quote-props": "off",
"quotes": "off",
"radix": "off",
"id-match": "off",
"id-blacklist": "off",
"require-jsdoc": "off",
"require-yield": "off",
"semi": "warn",
"semi-spacing": "warn",
"sort-vars": "off",
"sort-imports": "off",
"space-before-blocks": "warn",
"space-before-function-paren": "warn",
"space-in-parens": "warn",
"space-infix-ops": "off",
"space-unary-ops": "off",
"spaced-comment": "off",
"strict": "off",
"template-curly-spacing": "off",
"use-isnan": "error",
"valid-jsdoc": "off",
"valid-typeof": "error",
"vars-on-top": "off",
"wrap-regex": "off",
"yield-star-spacing": "off",
"yoda": "off",
"no-bitwise": 2,
"curly": 0,
"eqeqeq": 0,
"guard-for-in": 2,
"no-cond-assign": [
2,
"except-parens"
],
"wrap-iife": 0,
"linebreak-style": 0,
"no-use-before-define": 0,
"no-multi-str": 2,
"new-cap": 0,
"no-empty": 2,
"no-new": 2
}
}

7
node_modules/selectize-plugin-a11y/LICENSE generated vendored Normal file
View File

@@ -0,0 +1,7 @@
Copyright 2018-present Salmen Bejaoui
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

24
node_modules/selectize-plugin-a11y/README.md generated vendored Normal file
View File

@@ -0,0 +1,24 @@
# selectize-plugin-a11y.js
Selectize-plugin-a11y is a plugin to make Selectize.js accessible as a Combobox.
## Selectize-plugin-a11y Usage
```html
<script type="text/javascript" src="selectize.js"></script>
<script type="text/javascript" src="selectize-plugin-a11y.js"></script>
<script>
$(function() {
$('select').selectize({
plugins: ['selectize-plugin-a11y'],
render: {
option: function($item, escape) {
// Every option must have a unique id
return `<div class="option" role="option" id="${$item.text.replace(' ', '')}">${$item.text}</div>`
}
}
});
</script>
```
## Pull requests are always welcome
Any pull request to improve the plugin will be appreciated 😉

38
node_modules/selectize-plugin-a11y/examples/api.html generated vendored Normal file
View File

@@ -0,0 +1,38 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Accessibile Selectize</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.4/css/selectize.min.css">
</head>
<body>
<h1>Selectize-plugin-a11y.js</h1>
<p>Make Selectize.js accessibile</p>
<select name="" id="">
<option value="">Choose your country</option>
<option value="it">Italy</option>
<option value="fr">France</option>
<option value="gb">United Kingdom</option>
<option value="script">&lt;script&gt;alert('hi')&lt;/script&gt;</option>
</select>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/selectize.js/0.12.4/js/standalone/selectize.min.js"></script>
<script src="../selectize-plugin-a11y.js"></script>
<script>
$('select').selectize({
plugins: ['selectize-plugin-a11y'],
render: {
option: function($item, escape) {
// Every option must have a unique id
return `<div class="option" role="option" id="${escape($item.text).replace(' ', '')}">${escape($item.text)}</div>`
}
}
});
</script>
</body>
</html>

27
node_modules/selectize-plugin-a11y/package.json generated vendored Normal file
View File

@@ -0,0 +1,27 @@
{
"name": "selectize-plugin-a11y",
"version": "1.1.0",
"description": "Make Selectize.js accessibile",
"main": "selectize-plugin-a11y.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git+https://github.com/SLMNBJ/selectize-plugin-a11y.git"
},
"keywords": [
"selectize",
"selectize.js",
"a11y",
"accessibility",
"selectize",
"voiceover"
],
"author": "Salmen Bejaoui",
"license": "MIT",
"bugs": {
"url": "https://github.com/SLMNBJ/selectize-plugin-a11y/issues"
},
"homepage": "https://github.com/SLMNBJ/selectize-plugin-a11y#readme"
}

View File

@@ -0,0 +1,141 @@
/* global Selectize */
Selectize.define("selectize-plugin-a11y", function (options) {
var self = this;
var KEY_RETURN = 13;
if (typeof self.accessibility === "undefined") {
self.accessibility = {};
}
self.accessibility.helpers = {
randomId: function (len) {
var str = "",
strLength = len || 10,
base = "abcdefghijklmnopqrstuvwxyz0123456789",
baseLength = base.length;
for (var i = 0; i < strLength; i++) {
str += base[Math.floor(baseLength * Math.random())];
}
return str;
}
};
self.accessibility.liveRegion = {
$region: "",
speak: function (msg) {
var $container = $("<div></div>");
$container.text(msg);
this.$region.html($container);
},
domListener: function () {
var observer = new MutationObserver(function (mutations) {
mutations.forEach(function (mutation) {
var $target = $(mutation.target);
if ($target.hasClass("items")) {
if ($target.hasClass("dropdown-active")) {
// open
self.$control_input.attr("aria-expanded", "true");
} else {
// close
self.$control_input.attr("aria-expanded", "false");
self.$control_input.removeAttr("aria-activedescendant");
}
} else {
// option change
if ($target.hasClass("active")) {
if (!!$target.attr("data-value")) { // eslint-disable-line no-extra-boolean-cast
self.$control_input.attr(
"aria-activedescendant",
$target.attr("id")
);
self.accessibility.liveRegion.speak($target.text(), 500);
}
}
}
});
});
observer.observe(self.$dropdown[0], {
attributes: true,
attributeFilter: ["class"],
subtree: true,
attributeOldValue: true
});
observer.observe(self.$control[0], {
attributes: true,
attributeFilter: ["class"]
});
observer.observe(self.$control_input[0], {
attributes: true,
attributeFilter: ["value"]
});
},
setAttributes: function () {
this.$region.attr({
"aria-live": "assertive",
role: "log",
"aria-relevant": "additions",
"aria-atomic": "true"
});
},
setStyles: function () {
this.$region.css({
position: "absolute",
width: "1px",
height: "1px",
"margin-top": "-1px",
clip: "rect(1px, 1px, 1px, 1px)",
overflow: "hidden"
});
},
init: function () {
this.$region = $("<div>");
this.setAttributes();
this.setStyles();
$("body").append(this.$region);
this.domListener();
}
};
this.setup = (function () {
var original = self.setup;
return function () {
original.apply(this, arguments);
var inputId = self.accessibility.helpers.randomId(),
listboxId = self.accessibility.helpers.randomId();
self.$control.on("keydown", function (e) {
if (e.keyCode === KEY_RETURN) {
$(this).click();
}
});
self.$control_input.attr({
role: "combobox",
"aria-expanded": "false",
haspopup: "listbox",
"aria-owns": listboxId,
"aria-label": self.$wrapper
.closest("[data-accessibility-selectize-label]")
.attr("data-accessibility-selectize-label")
});
console.log( self.$wrapper);
self.$dropdown_content.attr({
role: "listbox",
id: listboxId
});
self.accessibility.liveRegion.init();
};
})();
this.destroy = (function () {
var original = self.destroy;
return function () {
self.accessibility.liveRegion.$region.remove();
return original.apply(this, arguments);
};
})();
});

11
package-lock.json generated
View File

@@ -14,6 +14,7 @@
"datatables.net-scroller": "^1.4.2",
"datatables.net-select": "^1.2.0",
"scrollmagic": "^2.0.8",
"selectize-plugin-a11y": "^1.1.0",
"tippy.js": "^6.2.5"
}
},
@@ -90,6 +91,11 @@
"node": ">=0.10.x"
}
},
"node_modules/selectize-plugin-a11y": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/selectize-plugin-a11y/-/selectize-plugin-a11y-1.1.0.tgz",
"integrity": "sha512-fgY8fzE5Jx6DaoMg1c6otibyftkBw5y64YL778pyq7rS92h10QCPmgMaRtsHdXBFwPt6qO8qqQ1Pj1JJ0GDPrA=="
},
"node_modules/tippy.js": {
"version": "6.2.5",
"license": "MIT",
@@ -162,6 +168,11 @@
"scrollmagic": {
"version": "2.0.8"
},
"selectize-plugin-a11y": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/selectize-plugin-a11y/-/selectize-plugin-a11y-1.1.0.tgz",
"integrity": "sha512-fgY8fzE5Jx6DaoMg1c6otibyftkBw5y64YL778pyq7rS92h10QCPmgMaRtsHdXBFwPt6qO8qqQ1Pj1JJ0GDPrA=="
},
"tippy.js": {
"version": "6.2.5",
"requires": {

View File

@@ -1,5 +1,6 @@
{
"dependencies": {
"@fontsource/raleway": "^4.5.0",
"@popperjs/core": "^2.4.4",
"bulma-scss": "^0.9.0-1",
"datatables.net": "^1.10.12",
@@ -7,8 +8,8 @@
"datatables.net-responsive": "^2.1.0",
"datatables.net-scroller": "^1.4.2",
"datatables.net-select": "^1.2.0",
"@fontsource/raleway": "^4.5.0",
"scrollmagic": "^2.0.8",
"selectize-plugin-a11y": "^1.1.0",
"tippy.js": "^6.2.5"
}
}

View File

@@ -338,7 +338,7 @@ class NavigationMenu extends UIBlock implements iKeyboardShortcut
$oWidget = new UIExtKeyWidget('Organization', 'org_id', '', true /* search mode */);
$iMaxComboLength = MetaModel::GetConfig()->Get('max_combo_length');
$this->aSiloSelection['html'] .= $oWidget->DisplaySelect($oPage, $iMaxComboLength, false, '', $oSet, $iCurrentOrganization, false, 'c[org_id]', '',
$this->aSiloSelection['html'] .= $oWidget->DisplaySelect($oPage, $iMaxComboLength, false, Dict::S('UI:Layout:NavigationMenu:Silo:Label'), $oSet, $iCurrentOrganization, false, 'c[org_id]', '',
array(
'iFieldSize' => 20,
'iMinChars' => MetaModel::GetConfig()->Get('min_autocomplete_chars'),

View File

@@ -161,6 +161,7 @@ class iTopWebPage extends NiceWebPage implements iTabbedPage
// Used by external keys and other drop down lists
$this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/selectize.min.js');
$this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'node_modules/selectize-plugin-a11y/selectize-plugin-a11y.js');
$this->add_linked_script(utils::GetAbsoluteUrlAppRoot().'js/jquery.multiselect.js');
// Used by inline image, CKEditor and other places

View File

@@ -45,7 +45,7 @@
{% endif %}
<div class="ibo-navigation-menu--user-info">
<div class="ibo-navigation-menu--user-picture">
<a data-role="ibo-navigation-menu--user-menu--toggler" href="#">
<a data-role="ibo-navigation-menu--user-menu--toggler" href="#" aria-label="{{ 'UI:Layout:NavigationMenu:UserMenu:Toggler:Label'|dict_s }}">
<img class="ibo-navigation-menu--user-picture--image"
data-role="ibo-navigation-menu--user-picture--image"
src="{{ oUIBlock.GetUserData().sPictureUrl }}"
@@ -57,7 +57,7 @@
</a>
</div>
<div class="ibo-navigation-menu--user-welcome-message">
<a data-role="ibo-navigation-menu--user-menu--toggler" href="#">
<a data-role="ibo-navigation-menu--user-menu--toggler" href="#" aria-label="{{ 'UI:Layout:NavigationMenu:UserMenu:Toggler:Label'|dict_s }}">
<div class="ibo-navigation-menu--user-welcome-message--text">
<a class="ibo-navigation-menu--user-welcome-message--toggler" data-role="ibo-navigation-menu--user-menu--toggler" href="#">
{{ oUIBlock.GetUserData().sWelcomeMessage }}