From 235e4679ac91bddcd94dbb9af70d0a4800d64da9 Mon Sep 17 00:00:00 2001 From: Gemini Date: Fri, 3 Jul 2026 18:07:37 -0300 Subject: [PATCH] =?UTF-8?q?KB-PLUGIN-038:=20GLPI=2011=20=E2=80=94=20Monaco?= =?UTF-8?q?,=20fim=20do=20jQuery=20UI,=20add=5Fcss=20e=20est=C3=A1ticos=20?= =?UTF-8?q?em=20public/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Gotchas de porte GLPI 10 → 11 aprendidos no plugin butterfly: CodeMirror removido (padrão GLPI.Monaco.createEditor + formdata), jQuery UI extinto, add_css interpola valor uma vez (+?v= do core), e estáticos de plugin só servidos de public/ sem o segmento /public. Co-Authored-By: Claude Fable 5 --- index.json | 21 +++ ...38-glpi11-frontend-assets-monaco-public.md | 136 ++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 records/plugin-dev/KB-PLUGIN-038-glpi11-frontend-assets-monaco-public.md diff --git a/index.json b/index.json index 310426d..b5be877 100755 --- a/index.json +++ b/index.json @@ -719,6 +719,27 @@ "severity": "high", "path": "records/plugin-dev/KB-PLUGIN-037-redmine-plugin-api-contract.md", "summary": "id: KB-PLUGIN-037" + }, + { + "id": "KB-PLUGIN-038", + "title": "\"GLPI 11 — Assets de plugin: Monaco no lugar do CodeMirror, fim do jQuery UI, add_css/add_javascript e estáticos só em public/\"", + "domain": "plugin-dev", + "tags": [ + "glpi11", + "plugin", + "assets", + "monaco", + "codemirror", + "jquery-ui", + "add_css", + "add_javascript", + "public", + "gotcha" + ], + "status": "active", + "severity": "high", + "path": "records/plugin-dev/KB-PLUGIN-038-glpi11-frontend-assets-monaco-public.md", + "summary": "id: KB-PLUGIN-038" } ] } diff --git a/records/plugin-dev/KB-PLUGIN-038-glpi11-frontend-assets-monaco-public.md b/records/plugin-dev/KB-PLUGIN-038-glpi11-frontend-assets-monaco-public.md new file mode 100644 index 0000000..8aa93b9 --- /dev/null +++ b/records/plugin-dev/KB-PLUGIN-038-glpi11-frontend-assets-monaco-public.md @@ -0,0 +1,136 @@ +--- +id: KB-PLUGIN-038 +title: "GLPI 11 — Assets de plugin: Monaco no lugar do CodeMirror, fim do jQuery UI, add_css/add_javascript e estáticos só em public/" +domain: plugin-dev +tags: + - glpi11 + - plugin + - assets + - monaco + - codemirror + - jquery-ui + - add_css + - add_javascript + - public + - gotcha +status: active +severity: high +created_at: 2026-07-03 +updated_at: 2026-07-03 +applies_to: + - plugins GLPI 11.x portados do GLPI 9/10 + - qualquer plugin que injete CSS/JS ou sirva arquivos estáticos +related_records: + - KB-PLUGIN-004 + - KB-PLUGIN-028 + - KB-PLUGIN-036 +--- + +# GLPI 11 — Assets de plugin: Monaco, fim do jQuery UI, add_css e public/ + +Aprendizados do porte do plugin `butterfly` (2.1.0, GLPI 10 → 11.0.8, 2026-07-03). +Quatro armadilhas independentes que atingem qualquer plugin vindo do GLPI 9/10. + +## 1. CodeMirror foi removido — o editor de código do core é o Monaco + +`public/lib/` do GLPI 11 não tem mais CodeMirror; tem `monaco-editor`/`monaco.js`. +Qualquer `CodeMirror.fromTextArea(...)` de plugin quebra com `ReferenceError` +silencioso no console (o form continua funcionando como textarea puro). + +### Carregar a lib + +`monaco` é chave válida do mecanismo `$CFG_GLPI['javascript']` (testado em +`Html.php` ~linha 1178, `in_array('monaco', $jslibs)`): + +```php +// setup.php, em plugin_init_() +$CFG_GLPI['javascript']['config']['config'][] = 'monaco'; +``` + +### Padrão de uso (o mesmo do core em templates/pages/admin/entity/custom_ui.html.twig) + +```php +echo '
'; +echo Html::scriptBlock(' + $(function() { + window.GLPI.Monaco.createEditor("meu_editor", "scss", ' . json_encode($valor, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP) . ', []).then(() => { + $("#meu_editor").closest("form").on("formdata", (e) => { + const editors = window.monaco.editor.getEditors().filter( + (ed) => ed._domElement.id === "meu_editor" + ); + if (editors.length) { + e.originalEvent.formData.delete("meu_campo"); + e.originalEvent.formData.append("meu_campo", editors[0].getValue()); + } + }); + }); + }); +'); +``` + +Pontos-chave: +- O Monaco **não** usa textarea: é um `
` container + sync no submit via + evento `formdata` (por isso o form precisa ser um `
` nativo). +- Manter um `