Code of Conduct
Is there an existing issue for this?
GLPI Version
11.0.7
Plugin version
1.24.0
Bug description
On a ticket, i have fields adding a custom field.
The custom is configured to hide when one of two catégories is selected.
But when selecting another Type, glpi reload the catégories dropdown at the same time the plugin fields try to read the new catégories to see if he need to hide the custom field.
That create an error where getDropdownValue.php return nothing.
I figured it is a timing problem so i ask Claude to add a delay on the hiding engine of fields.
In Field.class.php located in fields/inc/field.class.php
Lines 1060 to 1113.
The hinding engine now wait for glpi normal completion of the page reload on Ticket type change.
// Track in-flight GLPI category AJAX calls.
// GLPI reloads the category dropdown by replacing its DOM entirely
// (Ajax::updateItemOnSelectEvent → dropdownTicketCategories.php).
// This never fires select2:opening, so we must intercept at the XHR level.
// While that reload is pending, we defer any Fields refreshContainer() call
// to avoid a race that corrupts Select2 ("Les résultats ne peuvent pas être chargés").
var fields_category_pending = 0;
var fields_deferred_refresh = false;
$(document).ajaxSend(function(event, xhr, settings) {
if (settings.url && settings.url.indexOf('dropdownTicketCategories') !== -1) {
fields_category_pending++;
}
});
$(document).ajaxComplete(function(event, xhr, settings) {
if (settings.url && settings.url.indexOf('dropdownTicketCategories') !== -1) {
fields_category_pending = Math.max(0, fields_category_pending - 1);
if (fields_category_pending === 0 && fields_deferred_refresh) {
fields_deferred_refresh = false;
refreshContainer();
}
}
});
form.on(
'change',
'input, select, textarea',
function(evt) {
if (evt.target.hasAttribute('data-actor-type')) {
// Do not handle actor type changes
return;
}
if (evt.target.name == "itilcategories_id") {
// Never use category itself as a Fields refresh trigger —
// it is reloaded by GLPI and would cause a race condition
return;
}
if ($(evt.target).closest('#{$html_id}').length > 0) {
return; // Do nothing if element is inside fields container
}
if (fields_category_pending > 0) {
// Category dropdown is mid-reload; defer until it completes
fields_deferred_refresh = true;
return;
}
refreshContainer();
}
);
I didnt do much digging so i dont know if that breaks something else. That is why i create an issue instead of a pull request.
Hope that can help someone.
field.class (1).php
Relevant log output
Page URL
No response
Steps To reproduce
No response
Your GLPI setup information
GLPI information
GLPI: 11.0.7 ( => /var/www/html/glpi)
Installation mode: TARBALL
Current language: fr_FR
Source Integrity: 72 files changed
A: css/lib/fontsource/inter/files/inter-all-100-normal.woff
A: css/lib/fontsource/inter/files/inter-all-200-normal.woff
A: css/lib/fontsource/inter/files/inter-all-300-normal.woff
A: css/lib/fontsource/inter/files/inter-all-400-normal.woff
A: css/lib/fontsource/inter/files/inter-all-500-normal.woff
A: css/lib/fontsource/inter/files/inter-all-600-normal.woff
A: css/lib/fontsource/inter/files/inter-all-700-normal.woff
A: css/lib/fontsource/inter/files/inter-all-800-normal.woff
A: css/lib/fontsource/inter/files/inter-all-900-normal.woff
A: css/lib/fontsource/inter/files/inter-cyrillic-100-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-200-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-300-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-400-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-500-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-600-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-700-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-800-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-900-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-ext-100-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-ext-200-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-ext-300-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-ext-400-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-ext-500-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-ext-600-normal.woff2
A: css/lib/fontsource/inter/files/inter-cyrillic-ext-700-normal.woff2
...
Server
Operating system: Linux RDI-SEG-GLPI-01 6.12.74+deb13+1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.74-2 (2026-03-08) x86_64
PHP: 8.4.21 fpm-fcgi
PHP extensions: Core, date, libxml, openssl, pcre, zlib, filter, hash, json, random, Reflection, SPL, session, standard, sodium, cgi-fcgi, mysqlnd, PDO, xml, bcmath, bz2, calendar, ctype, curl, dom, mbstring, FFI, fileinfo, ftp, gd, gettext, iconv, igbinary, intl, ldap, exif, mysqli, odbc, pdo_mysql, PDO_ODBC, pdo_sqlsrv, Phar, posix, readline, shmop, SimpleXML, sockets, sqlsrv, sysvmsg, sysvsem, sysvshm, tokenizer, xmlreader, xmlwriter, xsl, zip, redis, Zend OPcache
Setup: disable_functions="" max_execution_time="120" max_input_vars="5000" memory_limit="256M" post_max_size="50M" session.cookie_secure="0" session.cookie_httponly="1" session.cookie_samesite="" session.save_handler="redis" upload_max_filesize="50M"
Web server: nginx/1.26.3 ()
User agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36
Database:
Server Software: -- Please help get to 10k stars at https://github.com/MariaDB/Server
Server Version: 11.8.6-MariaDB-0+deb13u1 from Debian
Server SQL Mode: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Parameters: glpi_redacted@localhost/glpidb
Host info: Localhost via UNIX socket
Requirements:
PHP version (8.4.21) is supported.
OS and PHP are relying on 64 bits integers.
Sessions configuration is OK.
Allocated memory is sufficient.
Following extensions are installed: dom, fileinfo, filter, libxml, simplexml, tokenizer, xmlreader, xmlwriter.
mysqli extension is installed
curl extension is installed
gd extension is installed
intl extension is installed
mbstring extension is installed
zlib extension is installed
bcmath extension is installed
The constant SODIUM_CRYPTO_AEAD_XCHACHA20POLY1305_IETF_NPUBBYTES is present.
openssl extension is installed
Database engine version (11.8.6) is supported.
The log file has been created successfully.
Write access to /var/lib/glpi/files/_cache has been validated.
Write access to /var/lib/glpi/files/_cron has been validated.
Write access to /var/lib/glpi/files has been validated.
Write access to /var/lib/glpi/files/_graphs has been validated.
Write access to /var/lib/glpi/files/_lock has been validated.
Write access to /var/lib/glpi/files/_pictures has been validated.
Write access to /var/lib/glpi/files/_plugins has been validated.
Write access to /var/lib/glpi/files/_rss has been validated.
Write access to /var/lib/glpi/files/_sessions has been validated.
Write access to /var/lib/glpi/files/_tmp has been validated.
Write access to /var/lib/glpi/files/_uploads has been validated.
PHP directive "session.cookie_secure" should be set to "on" when GLPI can be accessed on HTTPS protocol.
exif extension is installed
ldap extension is installed
Following extensions are installed: bz2, Phar, zip.
Zend OPcache extension is installed
Following extensions are installed: ctype, iconv, sodium.
Write access to /var/www/html/glpi/marketplace has been validated.
Timezones seems loaded in database.
GLPI constants
GLPI_ROOT: "/var/www/html/glpi"
GLPI_VERSION: "11.0.7"
GLPI_SCHEMA_VERSION: "11.0.7@a797be2bef86f3888448b141fa810dba6fb67795"
GLPI_FILES_VERSION: "11.0.7-49a93008"
GLPI_MIN_PHP: "8.2"
GLPI_MAX_PHP: "8.5"
GLPI_YEAR: "2026"
GLPI_I18N_DIR: "/var/www/html/glpi/locales"
GLPI_ENVIRONMENT_TYPE: "production"
GLPI_VAR_DIR: "/var/lib/glpi/files"
GLPI_LOG_DIR: "/var/log/glpi"
GLPI_CONFIG_DIR: "/etc/glpi"
GLPI_MARKETPLACE_DIR: "/var/www/html/glpi/marketplace"
GLPI_ALLOW_IFRAME_IN_RICH_TEXT: false
GLPI_SERVERSIDE_URL_ALLOWLIST: ["^\n (http|https|feed):// # protocol\n (\n (?:\n (?:xn--[a-z0-9-]++\.)*+xn--[a-z0-9-]++ # a domain name using punycode\n |\n (?:[\pL\pN\pS\pM\-\]++\.)+[\pL\pN\pM]++ # a multi-level domain name\n |\n [a-z0-9\-\]++ # a single-level domain name\n )\.?\n | # or\n \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} # an IP address\n | # or\n \[\n (?:(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){6})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:::(?:(?:(?:[0-9a-f]{1,4})):){5})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){4})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,1}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){3})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,2}(?:(?:[0-9a-f]{1,4})))?::(?:(?:(?:[0-9a-f]{1,4})):){2})(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,3}(?:(?:[0-9a-f]{1,4})))?::(?:(?:[0-9a-f]{1,4})):)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,4}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:(?:(?:(?:[0-9a-f]{1,4})):(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9]))\.){3}(?:(?:25[0-5]|(?:[1-9]|1[0-9]|2[0-4])?[0-9])))))))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,5}(?:(?:[0-9a-f]{1,4})))?::)(?:(?:[0-9a-f]{1,4})))|(?:(?:(?:(?:(?:(?:[0-9a-f]{1,4})):){0,6}(?:(?:[0-9a-f]{1,4})))?::))))\n \] # an IPv6 address\n )\n (?:/ (?:[\pL\pN\pS\pM\-._\!$&'()+,;=:@]|%[0-9A-Fa-f]{2}) )* # a path\n (?:\? (?:[\pL\pN\-._\~!$&'\\+,;=:@/?]|%[0-9A-Fa-f]{2}) )? # a query (optional)\n $~ixuD"]
GLPI_DISALLOWED_UPLOADS_PATTERN: "/\.(php\d*|phar)$/i"
GLPI_TELEMETRY_URI: "https://telemetry.glpi-project.org"
GLPI_INSTALL_MODE: "TARBALL"
GLPI_NETWORK_MAIL: "glpi@teclib.com"
GLPI_NETWORK_SERVICES: "https://services.glpi-network.com"
GLPI_MARKETPLACE_ENABLE: 3
GLPI_MARKETPLACE_PRERELEASES: false
GLPI_MARKETPLACE_ALLOW_OVERRIDE: true
GLPI_MARKETPLACE_MANUAL_DOWNLOADS: true
GLPI_USER_AGENT_EXTRA_COMMENTS: ""
GLPI_DOCUMENTATION_ROOT_URL: "https://links.glpi-project.org"
GLPI_DISABLE_ONLY_FULL_GROUP_BY_SQL_MODE: "1"
GLPI_LOG_LVL: "warning"
GLPI_SKIP_UPDATES: false
GLPI_STRICT_ENV: false
GLPI_AJAX_DASHBOARD: "1"
GLPI_CALDAV_IMPORT_STATE: 0
GLPI_CENTRAL_WARNINGS: "1"
GLPI_SYSTEM_CRON: false
GLPI_TEXT_MAXSIZE: "4000"
GLPI_WEBHOOK_ALLOW_RESPONSE_SAVING: "0"
GLPI_WEBHOOK_CRA_MANDATORY: false
GLPI_ALTCHA_MODE: "interactive"
GLPI_ALTCHA_MAX_NUMBER: 50000
GLPI_ALTCHA_EXPIRATION_INTERVAL: "PT20M"
GLPI_DOC_DIR: "/var/lib/glpi/files"
GLPI_CACHE_DIR: "/var/lib/glpi/files/_cache"
GLPI_CRON_DIR: "/var/lib/glpi/files/_cron"
GLPI_GRAPH_DIR: "/var/lib/glpi/files/_graphs"
GLPI_LOCAL_I18N_DIR: "/var/lib/glpi/files/_locales"
GLPI_LOCK_DIR: "/var/lib/glpi/files/_lock"
GLPI_PICTURE_DIR: "/var/lib/glpi/files/_pictures"
GLPI_PLUGIN_DOC_DIR: "/var/lib/glpi/files/_plugins"
GLPI_RSS_DIR: "/var/lib/glpi/files/_rss"
GLPI_SESSION_DIR: "/var/lib/glpi/files/_sessions"
GLPI_TMP_DIR: "/var/lib/glpi/files/_tmp"
GLPI_UPLOAD_DIR: "/var/lib/glpi/files/_uploads"
GLPI_INVENTORY_DIR: "/var/lib/glpi/files/_inventories"
GLPI_THEMES_DIR: "/var/lib/glpi/files/_themes"
GLPI_PLUGINS_DIRECTORIES: ["/var/www/html/glpi/marketplace","/var/www/html/glpi/plugins"]
GLPI_NETWORK_API_URL: "https://services.glpi-network.com/api"
GLPI_NETWORK_REGISTRATION_API_URL: "https://services.glpi-network.com/api/registration/"
GLPI_MARKETPLACE_PLUGINS_API_URI: "https://services.glpi-network.com/api/marketplace/"
LDAP directories
Server: 'ldaps-redacted.redacted.local',
Port: '389',
BaseDN: 'OU=redacted,DC=redacted,DC=local',
Connection filter: '(&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))',
RootDN: 'CN=glpi-ldap,OU=SERVICES,OU=redacted,DC=redacted,DC=local',
Use TLS: none
SQL replicas
Not active
Notifications
Way of sending emails: SMTP(smtp://redacted:********@in-v3.mailjet.com:587?verify_peer=0)
Name: 'support.interne@redacted.fr'
Active: Yes
Server: '{outlook.office365.com:993/imap-oauth-3/ssl}glpi.info.int.ticket'
Login: 'bot@redacted.fr'
Password: Yes
Name: 'support.client@redacted.fr'
Active: Yes
Server: '{outlook.office365.com:993/imap-oauth-3/ssl}glpi.info.ext.ticket'
Login: 'bot@redacted.fr'
Password: Yes
Name: 'support.dev@redacted.fr'
Active: Yes
Server: '{outlook.office365.com:993/imap-oauth-3/ssl}glpi.info.dev.ticket'
Login: 'bot@redacted.fr'
Password: No
Plugins list
fields Name: Champs supplémentaires Version: 1.24.0 State: Enabled Install Method: Marketplace
behaviors Name: Comportements Version: 3.0.7 State: Enabled Install Method: Marketplace
datainjection Name: Data injection Version: 2.15.7 State: Enabled Install Method: Marketplace
erpclients Name: ERP Clients Version: 1.0.4 State: Enabled Install Method: Manual
genericobject Name: Gestion d'objets Version: 3.0.2 State: Enabled Install Method: Marketplace
glpiinventory Name: GLPI Inventory Version: 1.6.7 State: Enabled Install Method: Marketplace
mailanalyzer Name: Mail Analyzer Version: 4.0.0 State: Enabled Install Method: Manual
oauthimap Name: Oauth IMAP Version: 1.5.1 State: Enabled Install Method: Marketplace
mreporting Name: Plus de rapports Version: 1.9.6 State: Enabled Install Method: Marketplace
Anything else?
No response
Code of Conduct
Is there an existing issue for this?
GLPI Version
11.0.7
Plugin version
1.24.0
Bug description
On a ticket, i have fields adding a custom field.
The custom is configured to hide when one of two catégories is selected.
But when selecting another Type, glpi reload the catégories dropdown at the same time the plugin fields try to read the new catégories to see if he need to hide the custom field.
That create an error where getDropdownValue.php return nothing.
I figured it is a timing problem so i ask Claude to add a delay on the hiding engine of fields.
In Field.class.php located in fields/inc/field.class.php
Lines 1060 to 1113.
The hinding engine now wait for glpi normal completion of the page reload on Ticket type change.
I didnt do much digging so i dont know if that breaks something else. That is why i create an issue instead of a pull request.
Hope that can help someone.
field.class (1).php
Relevant log output
Page URL
No response
Steps To reproduce
No response
Your GLPI setup information
GLPI information
Server
GLPI constants
LDAP directories
SQL replicas
Notifications
Plugins list
Anything else?
No response