From da9cab29abf6fa2174f93a9d6de65295fe1a0da8 Mon Sep 17 00:00:00 2001
From: Rom1-B <8530352+Rom1-B@users.noreply.github.com>
Date: Tue, 18 Aug 2026 14:46:35 +0200
Subject: [PATCH 1/4] feature/glpi-12.0
---
.github/workflows/continuous-integration.yml | 2 +-
.phpunit.result.cache | 1 +
CHANGELOG.md | 6 +
composer.json | 3 -
composer.lock | 871 +------------------
inc/alert.class.php | 6 +-
inc/alert_target.class.php | 2 +-
inc/alert_user.class.php | 10 +-
setup.php | 4 +-
templates/profile.html.twig | 2 -
10 files changed, 21 insertions(+), 886 deletions(-)
create mode 100644 .phpunit.result.cache
diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml
index 2fa7673..9ce38a2 100644
--- a/.github/workflows/continuous-integration.yml
+++ b/.github/workflows/continuous-integration.yml
@@ -20,7 +20,7 @@ jobs:
name: "Generate CI matrix"
uses: "glpi-project/plugin-ci-workflows/.github/workflows/generate-ci-matrix.yml@v1"
with:
- glpi-version: "11.0.x"
+ glpi-version: "12.0.x"
ci:
name: "GLPI ${{ matrix.glpi-version }} - php:${{ matrix.php-version }} - ${{ matrix.db-image }}"
needs: "generate-ci-matrix"
diff --git a/.phpunit.result.cache b/.phpunit.result.cache
new file mode 100644
index 0000000..fa2da8d
--- /dev/null
+++ b/.phpunit.result.cache
@@ -0,0 +1 @@
+{"version":2,"defects":[],"times":{"GlpiPlugin\\News\\Tests\\Units\\PluginNewsAlertTest::testPostUpdateItemResetsHiddenAlerts":0.779,"GlpiPlugin\\News\\Tests\\Units\\PluginNewsAlertTest::testPostUpdateItemDoesNotAffectOtherAlerts":0.278}}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 458ce87..3ebd336 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
+## [UNRELEASED]
+
+### Added
+
+- GLPI 12 compatibility
+
## Unreleased ##
### Fixed
diff --git a/composer.json b/composer.json
index 945d30f..fa02992 100644
--- a/composer.json
+++ b/composer.json
@@ -2,9 +2,6 @@
"require": {
"php": ">=8.2"
},
- "require-dev": {
- "glpi-project/tools": "^0.8.3"
- },
"config": {
"optimize-autoloader": true,
"platform": {
diff --git a/composer.lock b/composer.lock
index 9bbf694..e798ec8 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,876 +4,9 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "3b0805ca810a8f2c1092a852c12f1234",
+ "content-hash": "4cacb822b12bf0d2a0dbcf952b20ef7b",
"packages": [],
- "packages-dev": [
- {
- "name": "glpi-project/tools",
- "version": "0.8.3",
- "source": {
- "type": "git",
- "url": "https://github.com/glpi-project/tools.git",
- "reference": "8ea2a7d4702a858f4b0360ba7d4f1841a5e77026"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/glpi-project/tools/zipball/8ea2a7d4702a858f4b0360ba7d4f1841a5e77026",
- "reference": "8ea2a7d4702a858f4b0360ba7d4f1841a5e77026",
- "shasum": ""
- },
- "require": {
- "symfony/console": "^5.4 || ^6.0",
- "twig/twig": "^3.3"
- },
- "require-dev": {
- "nikic/php-parser": "^4.13",
- "phpstan/phpstan-src": "^1.10"
- },
- "bin": [
- "bin/extract-locales",
- "bin/licence-headers-check",
- "tools/plugin-release"
- ],
- "type": "library",
- "autoload": {
- "psr-4": {
- "GlpiProject\\Tools\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "GPL-3.0-or-later"
- ],
- "authors": [
- {
- "name": "Teclib'",
- "email": "glpi@teclib.com",
- "homepage": "http://teclib-group.com"
- }
- ],
- "description": "Various tools for GLPI and its plugins",
- "keywords": [
- "glpi",
- "plugins",
- "tools"
- ],
- "support": {
- "issues": "https://github.com/glpi-project/tools/issues",
- "source": "https://github.com/glpi-project/tools"
- },
- "time": "2025-10-14T10:26:06+00:00"
- },
- {
- "name": "psr/container",
- "version": "2.0.2",
- "source": {
- "type": "git",
- "url": "https://github.com/php-fig/container.git",
- "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
- "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
- "shasum": ""
- },
- "require": {
- "php": ">=7.4.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Psr\\Container\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
- }
- ],
- "description": "Common Container Interface (PHP FIG PSR-11)",
- "homepage": "https://github.com/php-fig/container",
- "keywords": [
- "PSR-11",
- "container",
- "container-interface",
- "container-interop",
- "psr"
- ],
- "support": {
- "issues": "https://github.com/php-fig/container/issues",
- "source": "https://github.com/php-fig/container/tree/2.0.2"
- },
- "time": "2021-11-05T16:47:00+00:00"
- },
- {
- "name": "symfony/console",
- "version": "v6.4.27",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/console.git",
- "reference": "13d3176cf8ad8ced24202844e9f95af11e2959fc"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/13d3176cf8ad8ced24202844e9f95af11e2959fc",
- "reference": "13d3176cf8ad8ced24202844e9f95af11e2959fc",
- "shasum": ""
- },
- "require": {
- "php": ">=8.1",
- "symfony/deprecation-contracts": "^2.5|^3",
- "symfony/polyfill-mbstring": "~1.0",
- "symfony/service-contracts": "^2.5|^3",
- "symfony/string": "^5.4|^6.0|^7.0"
- },
- "conflict": {
- "symfony/dependency-injection": "<5.4",
- "symfony/dotenv": "<5.4",
- "symfony/event-dispatcher": "<5.4",
- "symfony/lock": "<5.4",
- "symfony/process": "<5.4"
- },
- "provide": {
- "psr/log-implementation": "1.0|2.0|3.0"
- },
- "require-dev": {
- "psr/log": "^1|^2|^3",
- "symfony/config": "^5.4|^6.0|^7.0",
- "symfony/dependency-injection": "^5.4|^6.0|^7.0",
- "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
- "symfony/http-foundation": "^6.4|^7.0",
- "symfony/http-kernel": "^6.4|^7.0",
- "symfony/lock": "^5.4|^6.0|^7.0",
- "symfony/messenger": "^5.4|^6.0|^7.0",
- "symfony/process": "^5.4|^6.0|^7.0",
- "symfony/stopwatch": "^5.4|^6.0|^7.0",
- "symfony/var-dumper": "^5.4|^6.0|^7.0"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Console\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Eases the creation of beautiful and testable command line interfaces",
- "homepage": "https://symfony.com",
- "keywords": [
- "cli",
- "command-line",
- "console",
- "terminal"
- ],
- "support": {
- "source": "https://github.com/symfony/console/tree/v6.4.27"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://github.com/nicolas-grekas",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2025-10-06T10:25:16+00:00"
- },
- {
- "name": "symfony/deprecation-contracts",
- "version": "v3.7.1",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d",
- "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d",
- "shasum": ""
- },
- "require": {
- "php": ">=8.1"
- },
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/contracts",
- "name": "symfony/contracts"
- },
- "branch-alias": {
- "dev-main": "3.7-dev"
- }
- },
- "autoload": {
- "files": [
- "function.php"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "A generic function and convention to trigger deprecation notices",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://github.com/nicolas-grekas",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2026-06-05T06:23:12+00:00"
- },
- {
- "name": "symfony/polyfill-ctype",
- "version": "v1.37.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "141046a8f9477948ff284fa65be2095baafb94f2"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2",
- "reference": "141046a8f9477948ff284fa65be2095baafb94f2",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2"
- },
- "provide": {
- "ext-ctype": "*"
- },
- "suggest": {
- "ext-ctype": "For best performance"
- },
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
- },
- "autoload": {
- "files": [
- "bootstrap.php"
- ],
- "psr-4": {
- "Symfony\\Polyfill\\Ctype\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Gert de Pagter",
- "email": "BackEndTea@gmail.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for ctype functions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "ctype",
- "polyfill",
- "portable"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://github.com/nicolas-grekas",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2026-04-10T16:19:22+00:00"
- },
- {
- "name": "symfony/polyfill-intl-grapheme",
- "version": "v1.33.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70",
- "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2"
- },
- "suggest": {
- "ext-intl": "For best performance"
- },
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
- },
- "autoload": {
- "files": [
- "bootstrap.php"
- ],
- "psr-4": {
- "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for intl's grapheme_* functions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "grapheme",
- "intl",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://github.com/nicolas-grekas",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2025-06-27T09:58:17+00:00"
- },
- {
- "name": "symfony/polyfill-intl-normalizer",
- "version": "v1.33.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "3833d7255cc303546435cb650316bff708a1c75c"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
- "reference": "3833d7255cc303546435cb650316bff708a1c75c",
- "shasum": ""
- },
- "require": {
- "php": ">=7.2"
- },
- "suggest": {
- "ext-intl": "For best performance"
- },
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
- },
- "autoload": {
- "files": [
- "bootstrap.php"
- ],
- "psr-4": {
- "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
- },
- "classmap": [
- "Resources/stubs"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for intl's Normalizer class and related functions",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "intl",
- "normalizer",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://github.com/nicolas-grekas",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2024-09-09T11:45:10+00:00"
- },
- {
- "name": "symfony/polyfill-mbstring",
- "version": "v1.38.2",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6",
- "reference": "d3d318bad5e7a1bfbd026009c8bfb8d8f99ae6b6",
- "shasum": ""
- },
- "require": {
- "ext-iconv": "*",
- "php": ">=7.2"
- },
- "provide": {
- "ext-mbstring": "*"
- },
- "suggest": {
- "ext-mbstring": "For best performance"
- },
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
- },
- "autoload": {
- "files": [
- "bootstrap.php"
- ],
- "psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Symfony polyfill for the Mbstring extension",
- "homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "mbstring",
- "polyfill",
- "portable",
- "shim"
- ],
- "support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.38.2"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://github.com/nicolas-grekas",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2026-05-27T06:59:30+00:00"
- },
- {
- "name": "symfony/service-contracts",
- "version": "v3.6.0",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/service-contracts.git",
- "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
- "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
- "shasum": ""
- },
- "require": {
- "php": ">=8.1",
- "psr/container": "^1.1|^2.0",
- "symfony/deprecation-contracts": "^2.5|^3"
- },
- "conflict": {
- "ext-psr": "<1.1|>=2"
- },
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/contracts",
- "name": "symfony/contracts"
- },
- "branch-alias": {
- "dev-main": "3.6-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Symfony\\Contracts\\Service\\": ""
- },
- "exclude-from-classmap": [
- "/Test/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Generic abstractions related to writing services",
- "homepage": "https://symfony.com",
- "keywords": [
- "abstractions",
- "contracts",
- "decoupling",
- "interfaces",
- "interoperability",
- "standards"
- ],
- "support": {
- "source": "https://github.com/symfony/service-contracts/tree/v3.6.0"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2025-04-25T09:37:31+00:00"
- },
- {
- "name": "symfony/string",
- "version": "v7.3.4",
- "source": {
- "type": "git",
- "url": "https://github.com/symfony/string.git",
- "reference": "f96476035142921000338bad71e5247fbc138872"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872",
- "reference": "f96476035142921000338bad71e5247fbc138872",
- "shasum": ""
- },
- "require": {
- "php": ">=8.2",
- "symfony/polyfill-ctype": "~1.8",
- "symfony/polyfill-intl-grapheme": "~1.0",
- "symfony/polyfill-intl-normalizer": "~1.0",
- "symfony/polyfill-mbstring": "~1.0"
- },
- "conflict": {
- "symfony/translation-contracts": "<2.5"
- },
- "require-dev": {
- "symfony/emoji": "^7.1",
- "symfony/http-client": "^6.4|^7.0",
- "symfony/intl": "^6.4|^7.0",
- "symfony/translation-contracts": "^2.5|^3.0",
- "symfony/var-exporter": "^6.4|^7.0"
- },
- "type": "library",
- "autoload": {
- "files": [
- "Resources/functions.php"
- ],
- "psr-4": {
- "Symfony\\Component\\String\\": ""
- },
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
- },
- {
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
- }
- ],
- "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
- "homepage": "https://symfony.com",
- "keywords": [
- "grapheme",
- "i18n",
- "string",
- "unicode",
- "utf-8",
- "utf8"
- ],
- "support": {
- "source": "https://github.com/symfony/string/tree/v7.3.4"
- },
- "funding": [
- {
- "url": "https://symfony.com/sponsor",
- "type": "custom"
- },
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://github.com/nicolas-grekas",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
- "type": "tidelift"
- }
- ],
- "time": "2025-09-11T14:36:48+00:00"
- },
- {
- "name": "twig/twig",
- "version": "v3.27.1",
- "source": {
- "type": "git",
- "url": "https://github.com/twigphp/Twig.git",
- "reference": "ae2071bffb38f04847fc0864d730c94b9cb8ab74"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/ae2071bffb38f04847fc0864d730c94b9cb8ab74",
- "reference": "ae2071bffb38f04847fc0864d730c94b9cb8ab74",
- "shasum": ""
- },
- "require": {
- "php": ">=8.1.0",
- "symfony/deprecation-contracts": "^2.5|^3",
- "symfony/polyfill-ctype": "^1.8",
- "symfony/polyfill-mbstring": "^1.3"
- },
- "require-dev": {
- "php-cs-fixer/shim": "^3.0@stable",
- "phpstan/phpstan": "^2.0@stable",
- "psr/container": "^1.0|^2.0",
- "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0"
- },
- "type": "library",
- "autoload": {
- "files": [
- "src/Resources/core.php",
- "src/Resources/debug.php",
- "src/Resources/escaper.php",
- "src/Resources/string_loader.php"
- ],
- "psr-4": {
- "Twig\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com",
- "homepage": "http://fabien.potencier.org",
- "role": "Lead Developer"
- },
- {
- "name": "Twig Team",
- "role": "Contributors"
- },
- {
- "name": "Armin Ronacher",
- "email": "armin.ronacher@active-4.com",
- "role": "Project Founder"
- }
- ],
- "description": "Twig, the flexible, fast, and secure template language for PHP",
- "homepage": "https://twig.symfony.com",
- "keywords": [
- "templating"
- ],
- "support": {
- "issues": "https://github.com/twigphp/Twig/issues",
- "source": "https://github.com/twigphp/Twig/tree/v3.27.1"
- },
- "funding": [
- {
- "url": "https://github.com/fabpot",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/twig/twig",
- "type": "tidelift"
- }
- ],
- "time": "2026-05-30T17:09:26+00:00"
- }
- ],
+ "packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {},
diff --git a/inc/alert.class.php b/inc/alert.class.php
index e9e5188..3d7eb59 100644
--- a/inc/alert.class.php
+++ b/inc/alert.class.php
@@ -39,8 +39,8 @@
class PluginNewsAlert extends CommonDBTM
{
- public static $rightname = 'plugin_news_alert';
- public $dohistory = true;
+ public static string $rightname = 'plugin_news_alert';
+ public bool $dohistory = true;
// Available templates
public const GENERAL = 1;
@@ -391,7 +391,7 @@ public static function findAllToNotify($params = [])
if ($targets_sql !== []) {
$criteria['INNER JOIN'][$ttable]['ON'][] = $targets_sql;
}
- if (!empty($entity_sql)) {
+ if ($entity_sql !== []) {
$criteria['WHERE'][] = $entity_sql;
}
if ($login_sql !== []) {
diff --git a/inc/alert_target.class.php b/inc/alert_target.class.php
index ded9ff2..7320097 100644
--- a/inc/alert_target.class.php
+++ b/inc/alert_target.class.php
@@ -37,7 +37,7 @@
class PluginNewsAlert_Target extends CommonDBTM
{
// @codingStandardsIgnoreEnd
- public static $rightname = 'plugin_news_alert';
+ public static string $rightname = 'plugin_news_alert';
public static function getTypeName($nb = 0)
{
diff --git a/inc/alert_user.class.php b/inc/alert_user.class.php
index 33a4931..b05b0bd 100644
--- a/inc/alert_user.class.php
+++ b/inc/alert_user.class.php
@@ -41,12 +41,12 @@ class PluginNewsAlert_User extends CommonDBRelation
public const VISIBLE = 0;
- public static $itemtype_1 = 'PluginNewsAlert';
- public static $items_id_1 = 'plugin_news_alerts_id';
- public static $checkItem_1_Rights = self::HAVE_VIEW_RIGHT_ON_ITEM;
+ public static ?string $itemtype_1 = 'PluginNewsAlert';
+ public static ?string $items_id_1 = 'plugin_news_alerts_id';
+ public static int $checkItem_1_Rights = self::HAVE_VIEW_RIGHT_ON_ITEM;
- public static $itemtype_2 = 'User';
- public static $items_id_2 = 'users_id';
+ public static ?string $itemtype_2 = 'User';
+ public static ?string $items_id_2 = 'users_id';
public static function hideAlert($params = [])
{
diff --git a/setup.php b/setup.php
index fdcb670..f10ceb2 100644
--- a/setup.php
+++ b/setup.php
@@ -33,9 +33,9 @@
define('PLUGIN_NEWS_VERSION', '1.14.1');
// Minimal GLPI version, inclusive
-define('PLUGIN_NEWS_MIN_GLPI', '11.0.0');
+define('PLUGIN_NEWS_MIN_GLPI', '12.0.0');
// Maximum GLPI version, exclusive
-define('PLUGIN_NEWS_MAX_GLPI', '11.0.99');
+define('PLUGIN_NEWS_MAX_GLPI', '12.0.99');
function plugin_init_news()
{
diff --git a/templates/profile.html.twig b/templates/profile.html.twig
index c7aa686..13155e7 100644
--- a/templates/profile.html.twig
+++ b/templates/profile.html.twig
@@ -34,7 +34,5 @@
{{ call('Html::submit', [_x('button', 'Save', 'news'), {'name': 'update'}])|raw }}
-
-
From d4c05b329e32f8e0f6e1f2d4fc07e37b399ce30e Mon Sep 17 00:00:00 2001
From: Herafia
Date: Wed, 2 Sep 2026 16:26:49 +0200
Subject: [PATCH 2/4] fix
---
front/alert.form.php | 4 +---
front/alert.php | 2 +-
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/front/alert.form.php b/front/alert.form.php
index 1d44148..ccf3b38 100644
--- a/front/alert.form.php
+++ b/front/alert.form.php
@@ -32,9 +32,7 @@
Session::checkLoginUser();
-if (!isset($_GET['id'])) {
- $_GET['id'] = '';
-}
+$_GET['id'] ??= '';
$alert = new PluginNewsAlert();
diff --git a/front/alert.php b/front/alert.php
index acb55e0..5cffd14 100644
--- a/front/alert.php
+++ b/front/alert.php
@@ -28,7 +28,7 @@
* -------------------------------------------------------------------------
*/
-Session::checkRight("plugin_news_alert", READ);
+Session::checkRight(PluginNewsAlert::$rightname, READ);
Html::header(
__s('Alerts', 'news'),
From 5cdbbd1eaf260b0a1f641272a76941ed4a074b6d Mon Sep 17 00:00:00 2001
From: Herafia
Date: Fri, 4 Sep 2026 13:55:52 +0200
Subject: [PATCH 3/4] css
---
public/css/styles.css | 77 ++++++++++++++++++++++++++++---
public/js/news.js | 2 +-
templates/display_alert.html.twig | 2 +-
3 files changed, 73 insertions(+), 8 deletions(-)
diff --git a/public/css/styles.css b/public/css/styles.css
index c5d2c63..f9dc848 100644
--- a/public/css/styles.css
+++ b/public/css/styles.css
@@ -56,32 +56,97 @@
.plugin_news_alert-login .plugin_news_alert-content {
max-height: 0;
- padding: 0;
+ padding: 0 15px;
overflow: hidden;
- transition: max-height .25s ease-out;
- transition: padding .25s ease-out;
+ transition: max-height .25s ease-out, padding .25s ease-out;
}
.plugin_news_alert-login .expanded .plugin_news_alert-content {
padding: 5px 15px;
max-height: 100%;
overflow-y: auto;
- transition: max-height .25s ease-in;
- transition: padding .25s ease-in;
+ transition: max-height .25s ease-in, padding .25s ease-in;
}
.plugin_news_alert-login .plugin_news_alert {
min-width: 50%;
}
+.page-anonymous .row.justify-content-center {
+ align-items: flex-start;
+}
+
+.page-anonymous .plugin_news_alert-login {
+ width: 22rem;
+ max-width: calc(100vw - 2rem);
+ margin-bottom: 0;
+ text-align: left;
+}
+
+.page-anonymous .plugin_news_alert-login .alert {
+ border: 1px solid rgb(32 107 196 / 18%);
+ border-radius: .55rem;
+ box-shadow: 0 8px 24px rgb(15 23 42 / 8%);
+ padding: .7rem .8rem;
+}
+
+@media (min-width: 768px) {
+ .page-anonymous .plugin_news_alert-login {
+ margin-top: 4.75rem;
+ }
+}
+
+.page-anonymous .plugin_news_alert-login .plugin_news_alert {
+ margin: 0;
+ min-width: 100%;
+}
+
+.page-anonymous .plugin_news_alert-login .plugin_news_alert h3 {
+ margin: 0 0 .7rem;
+ padding-left: .1rem;
+ padding-right: 1.5rem;
+ font-size: 1.15rem;
+ font-weight: 600;
+ letter-spacing: .01em;
+}
+
+.plugin_news_alert .alert .d-flex > i[class*="ti-"] {
+ flex-shrink: 0;
+ line-height: 1;
+}
+
+.page-anonymous .plugin_news_alert-login .plugin_news_alert-content {
+ margin-top: .4rem;
+ line-height: 1.45;
+ overflow-wrap: anywhere;
+ word-break: break-word;
+}
+
+.page-anonymous .plugin_news_alert-login .plugin_news_alert-content p {
+ margin-bottom: .55rem;
+}
+
+.page-anonymous .plugin_news_alert-login .btn-close {
+ top: .45rem;
+ right: .45rem;
+ opacity: .55;
+}
+
+.page-anonymous .plugin_news_alert-login .btn-close:hover {
+ opacity: .85;
+}
+
.plugin_news_alert-toggle {
background-image: url("../pics/toggle_down.png");
+ background-repeat: no-repeat;
+ background-size: contain;
width: 16px;
height: 16px;
cursor: pointer;
position: absolute;
- top: 3px;
+ top: 50%;
right: 0;
+ transform: translateY(-50%);
opacity: .5;
}
diff --git a/public/js/news.js b/public/js/news.js
index 85450c5..f05c797 100644
--- a/public/js/news.js
+++ b/public/js/news.js
@@ -27,7 +27,7 @@
*/
pluginNewsCloseAlerts = function() {
- $(document).on("mousedown", ".plugin_news_alert .alert a[data-bs-dismiss=alert]", function(event) {
+ $(document).on("mousedown", ".plugin_news_alert .alert a[data-bs-dismiss=alert]", function() {
var alert = $(this).closest(".plugin_news_alert");
var id = alert.attr('data-id');
var a_url = CFG_GLPI.root_doc+"/plugins/news/ajax";
diff --git a/templates/display_alert.html.twig b/templates/display_alert.html.twig
index 23881c7..5a8405b 100644
--- a/templates/display_alert.html.twig
+++ b/templates/display_alert.html.twig
@@ -34,7 +34,7 @@
{% set js_rand = random() %}
-