Compare commits

...

322 Commits

Author SHA1 Message Date
Anne-Cath
470ccd72f5 Avoid to do 2 request in order to get sharing objects 2024-03-01 17:27:15 +01:00
Stephen Abello
2d5cd7042a Fix not being able to unsubscribe from newsroom anymore 2024-03-01 11:08:25 +01:00
Eric Espie
7b01108c91 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-03-01 09:43:24 +01:00
Stephen Abello
59129bc3ce N°2039 N°7298 - Allow Actions to be asynchronous (#625)
* N°2039 - Allows Actions to be asynchronous

* Add unit test

* Apply suggestions from code review

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

* GetAsynchronousGlobalSetting is now static

* None of the async task for itop notification attribute should be null

* Rename follow_global_setting to user_global_setting

---------

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2024-03-01 09:27:56 +01:00
Anne-Catherine
90a5a7a9a7 N°6968 - Audit duration : add of a rule multiplie by 4 the time of response (#575) 2024-02-29 16:18:03 +01:00
Anne-Catherine
5574952033 N°5170 - In a transition DoCheckToWrite returned error, generes a Fatal error (#539) 2024-02-29 16:14:43 +01:00
Stephen Abello
1a8de82be5 Add toast feedback when resetting newsroom cache or change image placeholder in preferences 2024-02-29 11:07:48 +01:00
Benjamin Dalsass
d15a0a0070 N°6086 - CSV import: Treat first line as a header 2024-02-28 17:04:35 +01:00
Pierre Goiffon
76167a3d54 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-28 16:44:11 +01:00
Stephen Abello
2a5337d84c N°2039 - Fix notifications sorting 2024-02-28 15:20:36 +01:00
Pierre Goiffon
fbe7f559d2 N°7251 Remove usages of deprecated JS libs
Only js/json.js was used, but it is a polyfill that is not necessary anymore considering our browser requirements (see https://www.itophub.io/wiki/page?id=latest:install:requirements#web_browser)
2024-02-28 15:10:06 +01:00
vdumas
c8810708ef N°7268 - Add test on method SetComputedDate 2024-02-28 12:52:08 +01:00
vdumas
e8c11f38d2 N°4314 - Fix Uniqueness rules not working with Silo (2) 2024-02-28 10:00:21 +01:00
Anne-Catherine
1394bc221d N°3363 - Add favicon in branding (#522) 2024-02-28 09:59:11 +01:00
Anne-Catherine
baa05ba8d4 N°4342 - Improve generic bulk deletion function with memory limit handling (#321) 2024-02-28 09:55:04 +01:00
Stephen Abello
e7b493dafa N°2039 - Rework view all notifications page (#617)
* N°2039 - Rework view all notifications page

* N°2039 - Replace modals with toasts

* N°2039 - Add bulk mode to view all notifications page

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update css/backoffice/pages/_notifications.scss

* Update dictionaries/ui/application/newsroom/fr.dictionary.itop.newsroom.php

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Add since in phpdoc

* Change newsroom empty notification illustration

* N°2039 - Refactor code to factorize logic

---------

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2024-02-28 09:22:39 +01:00
Molkobain
940833a66f N°7157 - Fix trigger init to null when not passed 2024-02-27 21:46:04 +01:00
Molkobain
2b172d6e19 N°7157 - Fix ActioniTopNotification friendlyname 2024-02-27 21:28:53 +01:00
Molkobain
69677954b4 N°7157 - Change way to pass calling trigger to action in order to ease extensibility and to be able to use its attributes in placeholders 2024-02-27 21:28:51 +01:00
Anne-Cath
9c35cddfc0 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-27 18:01:33 +01:00
Anne-Catherine
b67057c863 N°7163 - Avoid having an empty list when "items per page" is set to 0 as it makes no sense (#616) 2024-02-27 17:34:53 +01:00
Anne-Catherine
0546a7b82b N°6808 - Rank management (order) in iTop actions (#558) 2024-02-27 17:06:12 +01:00
vdumas
3d360e99da N°4314 - Fix Uniqueness rules not working with Silo 2024-02-27 14:53:07 +01:00
jf-cbd
b6230ed486 🐛 N°7284 - Themehandler enhancement - use of utils::RealPath instead of php's method 2024-02-23 10:46:22 +01:00
Molkobain
123dfd8dd3 N°2039 - Fix broken image in icon attribute when empty 2024-02-22 15:57:48 +01:00
Molkobain
e9bd76f2cd N°2039 - Choose news icon depending on context
Icon from action if defined > Icon from source object class > Icon from branding (compact)
2024-02-22 15:28:16 +01:00
Molkobain
47f7dfeb47 N°2039 - Fix crash when opening all newsroom page due a missing use statement 2024-02-22 15:03:53 +01:00
Molkobain
405919f204 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-21 18:28:47 +01:00
Molkobain
b813a32225 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-21 18:21:18 +01:00
jf-cbd
a6e5f95ff4 Add read right to "other" so www-data is able to read the configuration file after the tests 2024-02-21 17:12:43 +01:00
jf-cbd
2e5f0b064c Merge remote-tracking branch 'origin/support/3.2' into support/3.2 2024-02-21 16:38:16 +01:00
jf-cbd
a9f6e86381 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-21 16:37:18 +01:00
Molkobain
c6548ace61 N°2039 - Fix PHPDoc 2024-02-21 16:36:34 +01:00
Molkobain
478afb88e3 N°7044 - Update installer to move "language" attribute to ActionNotification class (iTop 3.2.0 min) 2024-02-21 15:38:31 +01:00
Molkobain
7c17957ec7 N°7157 - Fix subscription check when no existing lnk yet 2024-02-21 11:09:22 +01:00
Benjamin Dalsass
ba0a585256 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-21 10:48:22 +01:00
Molkobain
d7e9ae1a77 N°6406 - Change internal newsroom to open in current page 2024-02-21 10:21:15 +01:00
Molkobain
dd6a138ea1 N°6406 - Restore news being opened in a new tab by default to compensate iTop Hub lack of configuration 2024-02-21 10:10:16 +01:00
vdumas
b6caa51552 N°7268 - Method SetComputedDate fails on Date only attribute 2024-02-21 08:47:14 +01:00
Pierre Goiffon
8a67ceff57 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-20 12:12:29 +01:00
Stephen Abello
829d82dfe3 N°7243 - Fix toasts CSS using extended compound 2024-02-20 10:20:06 +01:00
Stephen Abello
5fdf8d7687 N°2039 - Use another way to pass down current trigger info in Action in order to avoid bc changes in method profiles 2024-02-20 10:20:06 +01:00
Pierre Goiffon
1ddf8b419a Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-20 09:27:39 +01:00
Pierre Goiffon
c718fcf176 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-20 09:12:59 +01:00
Molkobain
2982911df7 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-19 20:22:44 +01:00
Stephen Abello
c7cb7c0b68 N°7157 - Add robustness 2024-02-19 10:17:27 +01:00
Molkobain
68f229f91c Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-19 09:56:58 +01:00
Stephen Abello
ceba1ad1e9 N°7157 - Allow users to unsubscribe from notification channels (#611)
* N°7157 - Allow users to unsubscribe from notification channels

* Fix type hinting

* Add missing dict entries

* Allows to subscribe/unsubscribe from notifications individually

* Refactor NotificationsService to singleton pattern

* Refactor NotificationsRepository to singleton pattern and rename methods to a more functional naming

* Add PHPDoc and type hints

* Dump autoloaders

* Replace modals with toasts

* Add dict entry

---------

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2024-02-19 09:25:47 +01:00
Molkobain
efe5f004a1 N°2039 - Fix dictionary entry hard-coded on "iTop" app name 2024-02-16 17:27:04 +01:00
Molkobain
b716a3965c N°7008 - Fix missing background tasks in CRON when autoloaded and NOT in "developer_mode" (#578) 2024-02-16 17:14:53 +01:00
vdumas
15fa495458 N°6659 - Fix attribute "team_name" on Ticket class 2024-02-16 15:23:38 +01:00
Stephen Abello
1dfb2e0a1a N°7243 - Add toast notifications to iTop (#614)
* N°7243 - Add toast notifications to iTop

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update js/pages/backoffice/toolbox.js

* Update js/utils.js

* N°7243 - Move some rules to a dedicated partial and use spacing variables

---------

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2024-02-16 11:06:09 +01:00
Stephen Abello
d775658980 N°2039 - Prevent Persons with no User linked from being notified 2024-02-16 11:00:05 +01:00
Stephen Abello
2bd40bef47 N°2039 - Fix dictionaries and zlist for ActioniTopNotification 2024-02-16 11:00:04 +01:00
Pierre Goiffon
67d43c19ec N°7251 Deprecate unused files in /js 2024-02-15 17:14:15 +01:00
Pierre Goiffon
2695aeb64b Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-15 14:53:27 +01:00
Pierre Goiffon
9e24447835 N°7246 DictionariesConsistencyTest : add link to file 2024-02-15 11:31:23 +01:00
Pierre Goiffon
296250b20f N°7246 Fix dict files : translated keys with tildes in /dictionaries/** 2024-02-15 11:06:18 +01:00
Pierre Goiffon
38601bf0cf N°7247 Fix IT dict invalid syntax 2024-02-15 11:05:44 +01:00
Pierre Goiffon
9f46aad80a Merge remote-tracking branch 'origin/support/3.1' into support/3.2
# Conflicts:
#	dictionaries/ui/components/datatable/it.dictionary.itop.datatable.php
#	dictionaries/ui/layouts/navigation-menu/it.dictionary.itop.navigation-menu.php
2024-02-15 11:04:35 +01:00
Pierre Goiffon
a492f7a664 N°7247 Fix IT dict inconsistencies 2024-02-15 09:50:54 +01:00
Pierre Goiffon
85a49262e9 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-15 09:49:26 +01:00
DarkNight97boss
955d04252e N°7247 - Update italian translations thanks to @DarkNight97boss (#594)
* Improved IT Translation

🌐 
I proceeded to improve the Italian translation of iTop.

Currently some files, despite having the Italian classification, are not Italian.

* Update it.dict.authent-ldap.php

* Update it.dict.itop-config.php

* Update it.dict.itop-tickets.php

* Update it.dict.itop-faq-light.php

* Update it.dict.itop-bridge-cmdb-ticket.php

* Update it.dict.itop-portal-base.php

* Update it.dict.combodo-db-tools.php

* Update it.dict.itop-oauth-client.php

* Update it.dict.itop-files-information.php

* Update it.dict.itop-service-mgmt.php

* Update it.dict.itop-change-mgmt-itil.php

* Update it.dict.itop-backup.php

* Update it.dict.itop-core-update.php

* Update it.dict.authent-local.php

* Update it.dict.itop-request-mgmt-itil.php

* Update it.dict.itop-attachments.php

* Update it.dict.itop-hub-connector.php

* Update it.dict.itop-bridge-cmdb-services.php

* Update it.dict.authent-cas.php

* Update it.dict.itop-change-mgmt.php

* Update it.dict.itop-config-mgmt.php

* Update it.dict.itop-request-mgmt.php

* Update it.dict.itop-service-mgmt-provider.php

* Update it.dict.combodo-backoffice-darkmoon-theme.php

* Update it.dictionary.itop.core.php

* Update it.dictionary.itop.ui.php

* Update it.dictionary.itop.object.php

* Update it.dictionary.itop.bulk.php

* Update it.dictionary.itop.page-content.php

* Update en.dictionary.itop.object.php

* Update it.dictionary.itop.preferences.php

* Update it.dictionary.itop.orm-document.php

* Update it.dictionary.itop.display-block.php

* Update it.dictionary.itop.modal.php

* Update it.dictionary.itop.errorpage.php

* Update it.dictionary.itop.breadcrumbs.php

* Update it.dictionary.itop.tab-container.php

* Update it.dictionary.itop.quick-create.php

* Update it.dictionary.itop.activity-panel.php

* Update it.dictionary.itop.object-details.php

* Update it.dictionary.itop.global-search.php

* Update it.dictionary.itop.navigation-menu.php

* Update it.dictionary.itop.ui-content-block.php

* Update it.dictionary.itop.links.php

* Update it.dictionary.itop.datatable.php

* Update it.dictionary.itop.input.php

* Update it.dictionary.itop.field.php

* Update it.dictionary.itop.uniqueness-rule.php

* Update en.dictionary.itop.object.php - reverting

revert bad changes for mistake

* Apply suggestions from code review

* Remove trailing ~~ from translated entries

* Restore deleted entries

---------

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2024-02-14 16:57:43 +01:00
Pierre Goiffon
95c4a93f2e Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-14 15:17:32 +01:00
Pierre Goiffon
85dac470aa Merge remote-tracking branch 'origin/support/3.1' into support/3.2
# Conflicts:
#	datamodels/2.x/itop-files-information/dictionaries/zh_cn.dict.itop-files-information.php
#	datamodels/2.x/itop-oauth-client/dictionaries/zh_cn.dict.itop-oauth-client.php
#	datamodels/2.x/itop-portal-base/dictionaries/zh_cn.dict.itop-portal-base.php
#	dictionaries/cs.dictionary.itop.core.php
#	dictionaries/cs.dictionary.itop.ui.php
#	dictionaries/zh_cn.dictionary.itop.core.php
#	dictionaries/zh_cn.dictionary.itop.ui.php
#	tests/php-unit-tests/README.md
2024-02-14 15:09:23 +01:00
Pierre Goiffon
41eb927480 N°7244 Fix setup ContextTag init (#609) 2024-02-14 10:51:52 +01:00
Pierre Goiffon
bec5e250a5 N°5472 Notification Action objects : add a last executions tab (#549)
This tab is an ajax tab (deferred on demand loading)
The tab will display the last EventNotification for this action. Number of objects displayed is based on the new `notifications.last_executions_days` config parameter (default to 61 days, can be set to 0 for no limit)
2024-02-14 10:07:24 +01:00
Molkobain
9fe45e9472 N°7068 - Update PHPDoc 2024-02-13 21:20:22 +01:00
Thomas Casteleyn
78133418d7 N°7068 - Add emulation for apc_exists function (#460)
* Emulate missing apc_exists

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update core/apc-emulation.php

---------

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2024-02-13 21:13:41 +01:00
Pierre Goiffon
8275de8fa7 N°5580 Remove jquery.tabs-ie.css
File was present both in /js and /css, but never called anywhere
And we aren't supporting MSIE anymore...
2024-02-13 15:32:51 +01:00
Anne-Cath
ba7c154e84 Revert "N°7194 - Datamodel - Make classe name clickable on every object."
This reverts commit d2b0140fa4.
2024-02-13 10:31:30 +01:00
Anne-Cath
d2b0140fa4 N°7194 - Datamodel - Make classe name clickable on every object. 2024-02-13 10:27:41 +01:00
Pierre Goiffon
5c4ba74237 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-09 13:41:35 +01:00
Pierre Goiffon
7f4b50ca7f Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-09 12:05:11 +01:00
Molkobain
e7687a0fe6 N°6406 - Revert test data 2024-02-09 11:18:23 +01:00
Pierre Goiffon
5dd5986b88 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-02-08 11:34:48 +01:00
Molkobain
3e0ca6a70a N°6406 - Fix news (global) hyperlink not opening since refactoring 2024-02-07 11:05:08 +01:00
Molkobain
3b08ed5f51 N°6406 - Update setup compiled stylesheet 2024-02-07 09:42:10 +01:00
Molkobain
41dcb26283 N°7222 - PHP 8.2: Fix DisplayableNode::$bFiltered dynamic property 2024-02-06 15:43:09 +01:00
Molkobain
d4879b9bd8 N°6406 - Revert test data 2024-02-06 09:56:31 +01:00
Molkobain
87856fe382 N°6406 - Newsroom: Allow news to contain hyperlinks without breaking DOM 2024-02-06 09:43:55 +01:00
Molkobain
205a37a879 N°6406 - Refactor SCSS to add a text helper to force hyperlinks color 2024-02-06 09:43:28 +01:00
Anne-Catherine
e830c90314 N°6619 - Attachment : Make contact_id an AttributeExternalKey instead of AttributeExternalField (#532) 2024-02-05 14:07:51 +01:00
Pierre Goiffon
5308b49cd2 N°7175 TCPDF examples : don't keep this dir in iTop 2024-02-01 16:07:14 +01:00
Pierre Goiffon
216ea34a3c N°7175 TCPDF fonts : keep only the minimum necessary files 2024-02-01 15:34:18 +01:00
Pierre Goiffon
0a9c5250f8 N°7175 Update tecnickcom/tcpdf from 6.4.4 to 6.6.5 2024-02-01 10:25:46 +01:00
Pierre Goiffon
0e91c75dc2 N°7175 Replace combodo/tcpdf 6.4.4 by tecnickcom/tcpdf 6.4.4
The only difference was the presence of the DroidSansFallback font added in #49 / N°1947
We are keeping this font thanks to a custom Composer script to copy the corresponding files in the fonts dir (/lib/tecnickcom/tcpdf/fonts)
2024-02-01 10:25:40 +01:00
Molkobain
cf996dda0b N°4897 - Add method to improve deprecated PHP API logs (eg. for \iPageUIExtension) 2024-02-01 10:10:05 +01:00
Anne-Cath
21638e6a9e Add missing use 2024-01-31 10:34:47 +01:00
Pierre Goiffon
272d6e9b66 N°7178 Update scssphp/scssphp from 1.10.5 to 1.12.1 2024-01-30 11:10:31 +01:00
Molkobain
87b08669d7 N°6037 - PHP 8.2: Migrate usage of strlen() with null value 2024-01-30 10:10:52 +01:00
Molkobain
de86682562 N°6037 - Increase PHP max. non-supported version to 8.4.0 2024-01-30 09:52:52 +01:00
Molkobain
25c2e34eed N°7184 - Fix dict entry with 1 extra placeholder 2024-01-30 08:58:05 +01:00
Pierre Goiffon
e92b006f70 N°7177 Update pelago/emogrifier from 6.0.0 to 7.2.0 2024-01-29 17:18:15 +01:00
Pavel Stetina
962eb08e40 N°7184 - Update czech translations thanks to @tacsaby (#602) 2024-01-29 16:58:01 +01:00
Pierre Goiffon
6342e0065a N°5809 Update psr/log from 2.0.0 to 3.0.0 2024-01-29 16:16:26 +01:00
Pierre Goiffon
ac44ffcdff N°5809 Fix compilation error due to CASLogger VS LoggerInterface in psr/log
"Declaration of Combodo\iTop\Cas\CASLogger::emergency($message, array $context = []) must be compatible with Psr\Log\LoggerInterface::emergency(Stringable|string $message, array $context = [])"

psr/log 3.0.0 brings the BC break
Switching to 2.0.0 is nice as it will bring improvements for PHP 8.0+ !
So adding psr/log ^2.0.0 to composer.json
2024-01-29 16:16:22 +01:00
Pierre Goiffon
dfb5a4875a N°5809 Update Symfony artifacts from 6.4.0 to 6.4.2
symfony/console
symfony/dotenv
symfony/framework-bundle
symfony/http-foundation
symfony/http-kernel
symfony/var-dumper
symfony/web-profiler-bundle
2024-01-29 16:16:17 +01:00
Pierre Goiffon
ddce3058be N°5809 composer.json : reorder Symfony packages declarations 2024-01-29 16:16:12 +01:00
Pierre Goiffon
9235c395b4 N°5809 Update thenetworg/oauth2-azure from 2.1.1 to 2.2.2 2024-01-29 16:16:08 +01:00
Pierre Goiffon
e1296105f9 N°5809 Update nikic/php-parser from 4.14.0 to 4.18.0 2024-01-29 16:16:01 +01:00
Pierre Goiffon
38cdcf4f61 N°5809 Update league/oauth2-google from 3.0.4 to 4.0.1 2024-01-29 16:15:57 +01:00
Pierre Goiffon
5623decdb3 N°5809 Update laminas/laminas-servicemanager from 3.16.0 to 3.22.1 2024-01-29 16:15:48 +01:00
Pierre Goiffon
0f39ea8ac7 N°5809 Update laminas/laminas-mail from 2.16.0 to 2.22.0 2024-01-29 16:15:40 +01:00
Pierre Goiffon
f3d3ec6ef7 N°5809 Update guzzlehttp/guzzle from 7.7.0 to 7.8.1 2024-01-29 16:15:35 +01:00
Pierre Goiffon
fde01d5004 N°5809 Update firebase/php-jwt from 6.4.0 to 6.10.0 2024-01-29 16:15:30 +01:00
Pierre Goiffon
71d9710322 N°5809 Update apereo/phpcas from 1.6.0 to 1.6.1 2024-01-29 16:15:19 +01:00
Timothee
7a5ce8cd6b Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-01-29 15:42:07 +01:00
Molkobain
16b3e62587 N°6037 - PHP 8.2: Migrate usage of strlen() with null value 2024-01-29 13:07:48 +01:00
Molkobain
6c1edadc55 N°6037 - PHP 8.2: Migrate usages of strings interpolation 2024-01-26 17:02:16 +01:00
Molkobain
8928a87b14 N°6037 - PHP 8.2: Migrate usages of strtolower() and strtolower() that depends on current locale 2024-01-26 16:36:25 +01:00
Molkobain
8eca200023 N°6037 - PHP 8.3: Fix calling ReflectionProperty::setValue() with a single argument is deprecated 2024-01-24 20:35:40 +01:00
Molkobain
865b6d14f0 N°6037 - PHP 8.3: Update parameters and return type hints to match parent's 2024-01-24 20:35:40 +01:00
Molkobain
b63af9b919 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-01-24 15:21:05 +01:00
Pierre Goiffon
1e3ef6846d N°3677 - Fix AttributeImage.default_image URLs not up to date after app_root_url change (#526)
Many thanks to @sg-gcouronne for this contribution !
2024-01-22 16:02:41 +01:00
Molkobain
31225b9e23 Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-01-17 23:03:02 +01:00
jf-cbd
436b6808b5 N°7134 - Can't retrieve the list of changes when editing URP_UserProfile 2024-01-17 15:12:55 +01:00
Molkobain
aecc34a78b Merge remote-tracking branch 'origin/support/3.1' into support/3.2 2024-01-16 19:53:42 +01:00
Pierre Goiffon
ed99433448 Merge remote-tracking branch 'origin/support/3.1' into develop 2024-01-16 11:22:04 +01:00
Anne-Cath
df9d71e2f5 Merge remote-tracking branch 'origin/support/3.1' into develop 2024-01-15 16:35:57 +01:00
Pierre Goiffon
5935800b21 Merge remote-tracking branch 'origin/support/3.1' into develop 2024-01-15 15:55:54 +01:00
Molkobain
9ddb82073c Merge remote-tracking branch 'origin/support/3.1' into develop 2024-01-12 12:08:31 +01:00
odain
51fdd04881 Merge branch 'support/3.1' into develop 2024-01-12 08:58:29 +01:00
Molkobain
d721632f2b Merge remote-tracking branch 'origin/support/3.1' into develop 2024-01-11 22:25:31 +01:00
Molkobain
dfd5a5bebc N°7136 - Portal: Add JS API to enable attachments IDs retrieval in an object form 2024-01-11 14:14:58 +01:00
Benjamin Dalsass
490f8600e5 N°7133 - Linkset displayed as property failed when filter contains single quote or new line 2024-01-10 16:52:05 +01:00
Molkobain
b3be796277 N°7130 - Fix most Person:first_name being empty after unit tests due to monkey code (mine) 🐒 2024-01-10 10:04:23 +01:00
Pierre Goiffon
b3f2232ba4 N°6037 Fix PHP 8.2 deprecated syntax 2024-01-10 09:48:29 +01:00
Liberty
ef083d5e8f N°2039 - Update Chinese translations for the newsroom (#595)
* Some Chinese Translation:ActioniTopNotification & EventiTopNotification

* optimize

* Update dictionaries/en.dictionary.itop.core.php

good idea!

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update dictionaries/zh_cn.dictionary.itop.core.php

good idea!

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* optimize

---------

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2024-01-09 16:58:36 +01:00
Stephen Abello
73c989ee67 N°7130 - Allows to ignore existing column field in setup's data migration method (#597)
* Allows to ignore existing column field in setup's data migration method

* Update setup/moduleinstaller.class.inc.php

* N°7130 - Fix typo in variable extraction

* N°7130 - Add unit tests

* Update setup/moduleinstaller.class.inc.php

---------

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2024-01-09 09:43:22 +01:00
Pierre Goiffon
bfb05d331e Merge remote-tracking branch 'origin/support/3.1' into develop 2024-01-05 17:48:42 +01:00
Pierre Goiffon
a32dd779cb Merge remote-tracking branch 'Combodo/support/3.1' into develop 2024-01-05 11:11:13 +01:00
Eric Espie
3607748f49 Merge remote-tracking branch 'origin/support/3.1' into develop 2024-01-05 10:52:13 +01:00
jf-cbd
96d4aac650 Merge branch 'support/3.1' into develop 2024-01-04 11:24:58 +01:00
jf-cbd
5726a61861 Merge remote-tracking branch 'origin/develop' into develop 2024-01-04 11:06:30 +01:00
jf-cbd
5619586645 Merge branch 'support/3.1.1' into develop 2024-01-04 11:05:58 +01:00
Molkobain
773762bb99 N°7059 - Symfony 6.4 - Fix requires so they succeed when called from the SF console as well 2024-01-04 11:04:07 +01:00
jf-cbd
26f600542b Merge branch 'support/3.1.1' into develop 2024-01-04 10:36:07 +01:00
Pierre Goiffon
6724658181 Merge remote-tracking branch 'origin/support/3.1' into develop
# Conflicts:
#	README.md
#	datamodels/2.x/itop-core-update/dictionaries/hu.dict.itop-core-update.php
2024-01-04 09:03:14 +01:00
Molkobain
3f365885f0 N°7059 - Fix inconsistent class name / file name which breaks PSR-4 convention and SF app 2024-01-03 15:25:41 +01:00
Molkobain
48fe808adf Merge remote-tracking branch 'origin/support/3.1' into develop 2024-01-03 14:54:28 +01:00
Stephen Abello
c61fa7b92f N°2039 - Fix namespace and autoloader 2024-01-03 14:49:25 +01:00
Stephen Abello
135d410a6b N°2039 - Fix some issues with content type, bg task and typos 2024-01-03 11:46:38 +01:00
Molkobain
cb64dbe79f 👥 Add Jaroslav Šafránek to the contributors list! 🙌 2024-01-03 09:31:50 +01:00
Molkobain
f1d5f8635c Merge remote-tracking branch 'origin/support/3.1' into develop 2024-01-02 11:58:07 +01:00
Stephen Abello
9af08fa693 N°2039 - Apply some suggestion from @Hipska
Co-authored-by: Thomas Casteleyn <thomas.casteleyn@super-visions.com> o
2023-12-26 10:21:59 +01:00
Stephen Abello
05db99aa69 N°2039 - Add iTop notifications to newsroom (#590)
* N°2039 - Add iTop notifications to newsroom

* Update sources/Controller/Newsroom/iTopNewsroomController.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update sources/Controller/Newsroom/iTopNewsroomController.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update sources/Service/Notification/Event/EventiTopNotificationGC.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Add a default value to Action url attribute, check if there's an object in the context before adding it to the event

* Phpdoc

* Fix default config values

* Replace MetaModel::EnumPlugins calls for iNewsroomProvider

* Replace hardcoded url with generated routes

* Add dict entries

* Correclty throw error when trying to display a non existing event

* Fix unit test

* Migrate old action email language values to its parent table

* Migrate Action and Event class to XML, generate their dictionary entries, add meta data for ActionNotification and EventNotification

* Fix issue in dictionary definition

* Allows Action to create Events for users that the current user can't see

* Dump autoloader

* Remove classes from homemade "autoloader" as they are now loaded through XML

* Apply suggestions from code review

* Remove class from homemade "autoloader" as they are now loaded through GetClassesForInterfaces

* Apply suggestions from code review

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

---------

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2023-12-22 12:02:19 +01:00
Benjamin Dalsass
2681abbeed N°7059 - Symfony 6.4 - Application skeleton - sources registration
- PDFPage constructor define impact
2023-12-22 11:08:25 +01:00
jbostoen
031c90e797 N°7082 Ability to forcefully send e-mails asynchronously (#501)
Will be usefull in use cases like sending mass emails in customer-survey
2023-12-21 11:15:08 +01:00
Benjamin Dalsass
34f0053db7 N°7059 - Symfony 6.4 - Add missing namespaces to match PSR-4 convention (#589) 2023-12-21 10:18:11 +01:00
Pierre Goiffon
afbdff928d Merge remote-tracking branch 'origin/support/3.1' into develop 2023-12-19 18:42:11 +01:00
Molkobain
34ad18eee8 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-12-14 11:50:41 +01:00
Molkobain
e73fcc5903 N°7059 - Fix default conf. param. value 2023-12-14 11:02:45 +01:00
peckpeck
0c467e7115 N°7067 - Add setting to change default "password change" URL (#540)
* Add a setting to change default "password change" URL

* Apply suggestions from code review

---------

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2023-12-14 10:08:37 +01:00
Benjamin Dalsass
300ec74f76 N°7059 - Symfony 6.4 - Application skeleton - sources registration
- iKeyboardShortcut namespace issue
2023-12-14 09:12:27 +01:00
Benjamin Dalsass
326a115936 Revert "N°7059 - Symfony 6.4 - Application skeleton - sources registration"
This reverts commit b962488954.
2023-12-14 08:37:52 +01:00
Benjamin Dalsass
b962488954 N°7059 - Symfony 6.4 - Application skeleton - sources registration
- iKeyboardShortcut namespace issue
2023-12-14 08:34:10 +01:00
Molkobain
b5c8c75c4e Merge remote-tracking branch 'origin/support/3.1' into develop 2023-12-13 18:48:50 +01:00
Molkobain
0c100ea2de Merge remote-tracking branch 'origin/support/3.1' into develop 2023-12-13 10:54:35 +01:00
Benjamin Dalsass
be99a7c02d N°7059 - Symfony 6.4 - Application skeleton - sources registration (#588)
We configure global sources directory in symfony configuration file except the directory Application/WebPage (potential impacts)
2023-12-13 10:31:36 +01:00
Eric Espie
4a164f9c01 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-12-12 17:16:58 +01:00
Benjamin Dalsass
45c50995e3 N°7059 - Symfony 6.4 - Application skeleton
- unitary test broken
2023-12-12 16:57:16 +01:00
Benjamin Dalsass
fb29ff29cf N°7059 - Symfony 6.4 - Application skeleton (#587)
Mise en place d'un squelette temporaire fonctionnel d'application Symfony.

- Ajout bundles debug & runtime pour une implémentation standard
- Configuration minimale
- .env file in specific directory
- Frontal application app.php
2023-12-12 16:40:04 +01:00
Thomas Casteleyn
62d7e10257 N°7055 - Apply better default value for portal copy object link (#582) 2023-12-11 11:40:59 +01:00
Pierre Goiffon
9ac823c0ba Merge remote-tracking branch 'origin/support/3.1' into develop 2023-12-08 17:21:17 +01:00
Benjamin Dalsass
1c09a7c38e N°7034 - Symfony 6.4 - FILTER_REQUIRE_ARRAY or FILTER_FORCE_ARRAY flags with InputBag::filter() 2023-12-08 15:13:07 +01:00
Pierre Goiffon
8e2e155e65 Merge remote-tracking branch 'origin/support/3.1' into develop
# Conflicts:
#	lib/composer/installed.php
2023-12-08 11:34:26 +01:00
Molkobain
45a806ac77 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-12-08 08:50:37 +01:00
Molkobain
427646a0c3 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-12-07 12:40:00 +01:00
Molkobain
34e6e921ec Merge remote-tracking branch 'origin/support/3.1' into develop 2023-12-06 16:32:07 +01:00
bdalsass
a41c58ebb4 N°7034 - Symfony 6.4 - Not passing FILTER_REQUIRE_ARRAY or FILTER_FOR… (#581)
* change RequestManipulatorHelper read param function signature (add filter flag)
* add FILTER_REQUIRE_ARRAY flag  when expecting an array with read param function
* add test for the read param function
2023-12-06 14:04:55 +01:00
Benjamin Dalsass
beb015b082 Revert "N°6981 - Symfony 6.4 - Remove deprecated calls - Approval-base"
This reverts commit 4dfd9b062e.
2023-12-06 08:37:29 +01:00
Benjamin Dalsass
4dfd9b062e N°6981 - Symfony 6.4 - Remove deprecated calls - Approval-base 2023-12-05 17:03:49 +01:00
bdalsass
27ce51ab07 N°6934 - Symfony 6.4 - upgrade Symfony bundles to 6.4 (#580)
* Update Symfony lib to version ~6.4.0
* Update code missing return type
* Add an iTop general configuration entry to store application secret (Symfony mandatory parameter)
* Use dependency injection in ExceptionListener & UserProvider classes
2023-12-05 13:56:56 +01:00
Pierre Goiffon
863ab4560c 📝 tests README: fix typo 2023-12-05 11:38:37 +01:00
Pierre Goiffon
c27c99b245 📝 tests README: comments on disabling XDebug 2023-12-05 11:34:36 +01:00
Pierre Goiffon
d1531c5a80 📝 tests README: Add TOC links, add ItopCustomDatamodelTestCase 2023-12-05 11:21:43 +01:00
Molkobain
75f8c428b3 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-12-04 23:21:58 +01:00
Molkobain
4fb581c784 Update versions history with 3.1.1 2023-11-29 16:35:05 +01:00
Molkobain
7b15103880 Merge remote-tracking branch 'origin/support/3.1' into develop
# Conflicts:
#	approot.inc.php
#	datamodels/2.x/authent-cas/module.authent-cas.php
#	datamodels/2.x/authent-external/module.authent-external.php
#	datamodels/2.x/authent-ldap/module.authent-ldap.php
#	datamodels/2.x/authent-local/module.authent-local.php
#	datamodels/2.x/combodo-backoffice-darkmoon-theme/module.combodo-backoffice-darkmoon-theme.php
#	datamodels/2.x/combodo-db-tools/module.combodo-db-tools.php
#	datamodels/2.x/itop-attachments/module.itop-attachments.php
#	datamodels/2.x/itop-backup/module.itop-backup.php
#	datamodels/2.x/itop-bridge-cmdb-services/module.itop-bridge-cmdb-services.php
#	datamodels/2.x/itop-bridge-cmdb-ticket/module.itop-bridge-cmdb-ticket.php
#	datamodels/2.x/itop-bridge-datacenter-mgmt-services/module.itop-bridge-datacenter-mgmt-services.php
#	datamodels/2.x/itop-bridge-endusers-devices-services/module.itop-bridge-endusers-devices-services.php
#	datamodels/2.x/itop-bridge-storage-mgmt-services/module.itop-bridge-storage-mgmt-services.php
#	datamodels/2.x/itop-bridge-virtualization-mgmt-services/module.itop-bridge-virtualization-mgmt-services.php
#	datamodels/2.x/itop-bridge-virtualization-storage/module.itop-bridge-virtualization-storage.php
#	datamodels/2.x/itop-change-mgmt-itil/module.itop-change-mgmt-itil.php
#	datamodels/2.x/itop-change-mgmt/module.itop-change-mgmt.php
#	datamodels/2.x/itop-config-mgmt/module.itop-config-mgmt.php
#	datamodels/2.x/itop-config/module.itop-config.php
#	datamodels/2.x/itop-core-update/module.itop-core-update.php
#	datamodels/2.x/itop-datacenter-mgmt/module.itop-datacenter-mgmt.php
#	datamodels/2.x/itop-endusers-devices/module.itop-endusers-devices.php
#	datamodels/2.x/itop-faq-light/module.itop-faq-light.php
#	datamodels/2.x/itop-files-information/module.itop-files-information.php
#	datamodels/2.x/itop-full-itil/module.itop-full-itil.php
#	datamodels/2.x/itop-hub-connector/module.itop-hub-connector.php
#	datamodels/2.x/itop-incident-mgmt-itil/module.itop-incident-mgmt-itil.php
#	datamodels/2.x/itop-knownerror-mgmt/module.itop-knownerror-mgmt.php
#	datamodels/2.x/itop-oauth-client/module.itop-oauth-client.php
#	datamodels/2.x/itop-portal-base/module.itop-portal-base.php
#	datamodels/2.x/itop-portal/module.itop-portal.php
#	datamodels/2.x/itop-problem-mgmt/module.itop-problem-mgmt.php
#	datamodels/2.x/itop-profiles-itil/module.itop-profiles-itil.php
#	datamodels/2.x/itop-request-mgmt-itil/module.itop-request-mgmt-itil.php
#	datamodels/2.x/itop-request-mgmt/module.itop-request-mgmt.php
#	datamodels/2.x/itop-service-mgmt-provider/module.itop-service-mgmt-provider.php
#	datamodels/2.x/itop-service-mgmt/module.itop-service-mgmt.php
#	datamodels/2.x/itop-sla-computation/module.itop-sla-computation.php
#	datamodels/2.x/itop-storage-mgmt/module.itop-storage-mgmt.php
#	datamodels/2.x/itop-structure/module.itop-structure.php
#	datamodels/2.x/itop-themes-compat/module.itop-themes-compat.php
#	datamodels/2.x/itop-tickets/module.itop-tickets.php
#	datamodels/2.x/itop-virtualization-mgmt/module.itop-virtualization-mgmt.php
#	datamodels/2.x/itop-welcome-itil/module.itop-welcome-itil.php
#	datamodels/2.x/version.xml
2023-11-29 08:41:29 +01:00
Molkobain
bf3de38214 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-27 15:18:05 +01:00
Molkobain
8c4c2b2ee4 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-24 17:27:23 +01:00
Pierre Goiffon
add500193b 📝 tests README: add configuration and tips, change TOC 2023-11-24 15:29:38 +01:00
Anne-Cath
8dff590fe2 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-24 15:23:45 +01:00
Pierre Goiffon
ccfc29a6a9 📝 itop-version-history.md : change branches colors
Specific colors for : 
- unsupported branches (grey)
- LTS (2.7)
- develop
2023-11-24 12:08:18 +01:00
bdalsass
f0ce091809 N°6933 - Symfony 6.4 - Remove deprecated calls (#577)
* N°6933 - SF 6.4 - Remove deprecated calls
- BrowseBrickController (services access)

* N°6933 - SF 6.4 - Remove deprecated calls
- AggregatePageBrickController (services access)

* N°6933 - SF 6.4 - Remove deprecated calls
- CreateBrickController (services access)

* N°6933 - SF 6.4 - Remove deprecated calls
- ManageBrickController (services access)

* N°6933 - SF 6.4 - Remove deprecated calls
- ObjectController (services access)

* N°6933 - SF 6.4 - Remove deprecated calls
- SessionMessageController (services access)

* N°6933 - SF 6.4 - Remove deprecated calls
- UserProfileBrickController (services access)

* N°6933 - SF 6.4 - Remove deprecated calls
- AbstractController (remove getSubscribedServices override, add setter for router service injection)

* Fix SessionMessageController Call to a member function AddMessage() on null

* Fix depreciation on Request::HEADER_X_FORWARDED_ALL constant in index.php

Chose to move the protection to the yaml config instead as it is possible since Symfony 5.2

Also removed default support for the $_SERVER['TRUSTED_PROXIES'], seems too untrusty. Use TRUSTED_PROXIES env var instead !

See https://jolicode.com/blog/symfony-reverse-proxies-and-ip-protection

* ✏️ N°6933 - SF 6.4 - Remove deprecated calls
- AbstractController (typo)

* N°6933 - SF 6.4 - Remove deprecated calls
- CreateBrickController (remove return type)

* Revert "Fix depreciation on Request::HEADER_X_FORWARDED_ALL constant in index.php"

This reverts commit be4daef79a.

* Update datamodels/2.x/itop-portal-base/portal/src/Controller/AbstractController.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update datamodels/2.x/itop-portal-base/portal/src/Controller/BrowseBrickController.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update datamodels/2.x/itop-portal-base/portal/src/Controller/BrowseBrickController.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update datamodels/2.x/itop-portal-base/portal/src/Controller/ObjectController.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update datamodels/2.x/itop-portal-base/portal/src/Controller/AggregatePageBrickController.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update datamodels/2.x/itop-portal-base/portal/src/Controller/UserProfileBrickController.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update datamodels/2.x/itop-portal-base/portal/src/Controller/UserProfileBrickController.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update datamodels/2.x/itop-portal-base/portal/src/Controller/UserProfileBrickController.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update datamodels/2.x/itop-portal-base/portal/src/Controller/SessionMessageController.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* Update datamodels/2.x/itop-portal-base/portal/src/Controller/BrowseBrickController.php

Co-authored-by: Molkobain <lajarige.guillaume@free.fr>

* N°6933 - SF 6.4 - Remove deprecated calls
- ALl controllers (php doc and parameters names)

---------

Co-authored-by: Pierre Goiffon <pierre.goiffon@combodo.com>
Co-authored-by: Molkobain <lajarige.guillaume@free.fr>
2023-11-24 08:55:21 +01:00
Pierre Goiffon
5aaaeda6c5 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-23 16:01:03 +01:00
Molkobain
3bdb883f1c Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-23 15:08:22 +01:00
Anne-Cath
fbd69f6d3a Merge remote-tracking branch 'origin/support/3.1' into develop
# Conflicts:
#	datamodels/2.x/itop-config-mgmt/dictionaries/zh_cn.dict.itop-config-mgmt.php
2023-11-23 14:30:27 +01:00
Eric Espie
f736634c3e Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-23 11:27:04 +01:00
odain
4b19911e12 Merge branch 'support/3.1' into develop 2023-11-22 12:31:21 +01:00
odain
e73f2c9a30 Merge branch 'support/3.1' into develop 2023-11-22 11:16:46 +01:00
Pierre Goiffon
87bb3d17a9 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-21 18:10:11 +01:00
Pierre Goiffon
33596249a1 N°6973 Fix composer platform check 2023-11-21 11:03:58 +01:00
Pierre Goiffon
26beeb6a80 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-21 11:02:28 +01:00
Stephen Abello
982b3aa5f3 Merge branch 'support/3.1' into develop
# Conflicts:
#	dictionaries/ui/application/bulk/zh_cn.dictionary.itop.bulk.php
#	dictionaries/zh_cn.dictionary.itop.core.php
2023-11-21 10:26:15 +01:00
Pierre Goiffon
8e179f0563 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-21 09:25:35 +01:00
Molkobain
95e0f02cae Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-20 15:55:52 +01:00
Benjamin Dalsass
c0b1e877ad Upgrade PHP min version to 8.1.0 2023-11-20 15:21:00 +01:00
Molkobain
444c9e0589 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-17 08:50:26 +01:00
Molkobain
fb0f692c73 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-16 16:34:30 +01:00
Pierre Goiffon
90a0e50e75 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-16 16:18:22 +01:00
Pierre Goiffon
ad0795da02 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-16 12:07:19 +01:00
Pierre Goiffon
65674b9cc4 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-16 10:40:01 +01:00
Pierre Goiffon
ad0fa6636b Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-15 15:47:24 +01:00
jkoch22
67650012ce N°6954 - Update english translations thanks to @jkoch22 (#554)
Correct incorrect translation
2023-11-14 17:25:47 +01:00
Molkobain
d00137026a 👥 Add @bdejin to contributors list! 🙌 2023-11-14 17:19:54 +01:00
Devin
12a1321bc1 N°6907 - Update chinese translations thanks to @bdejin (#563)
* Add missing translations

* add missing translation

* minor update on translation "see setting

* add missing translations

* add missing translation for file dictionaries\zh_cn.dictionary.itop.core.php

* add missing translation for file dictionaries\zh_cn.dictionary.itop.ui.php

* add missing translation for file dictionaries\zh_cn.dictionary.itop.ui.php

* added missing translation for core and ui

* added missing translation for the rest files

* 🌐 minor Chinese translation updates following comments from chileeb on PR #563

* 🌐 update most of the 'class' translation from '类' to '类型'

* 🌐 add kitty message translation

* 🌐 update '表格中暂无数据' in dictionaries\ui\components\datatable\zh_cn.dictionary.itop.datatable.php to '当前列表没有数据'
2023-11-14 17:16:09 +01:00
Pierre Goiffon
c41ecb1b9d Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-13 16:28:34 +01:00
Molkobain
770bf4c42a Merge remote-tracking branch 'origin/support/3.1' into develop
# Conflicts:
#	sources/Service/Events/EventService.php
2023-11-13 15:24:47 +01:00
Molkobain
d5f054b739 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-13 13:38:25 +01:00
Romain Quetiez
473c4cf3fa N°6658 - Reset the "current user" status (defensive programming) 2023-11-10 16:33:56 +01:00
Romain Quetiez
347156f900 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-10 16:30:22 +01:00
Pierre Goiffon
76b70684cd Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-10 15:21:30 +01:00
Molkobain
336b5da2a7 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-09 18:24:30 +01:00
Molkobain
6f39ae5d76 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-08 15:01:42 +01:00
Molkobain
078fc7bfb8 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-08 11:44:23 +01:00
Molkobain
a67d095c70 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-11-03 09:21:48 +01:00
Stephen Abello
647f43882b Merge branch 'support/3.1' into develop 2023-11-02 11:21:47 +01:00
Molkobain
ca47f5458c Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-31 16:15:03 +01:00
Molkobain
3027bb5092 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-31 14:01:53 +01:00
Molkobain
893efa8e2d Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-31 13:57:04 +01:00
Molkobain
1ea9659227 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-31 11:27:42 +01:00
Benjamin Dalsass
31e58d7597 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-31 10:20:10 +01:00
Benjamin Dalsass
3b21ed8fe8 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-31 09:38:11 +01:00
Molkobain
0ad8db565d Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-30 17:00:20 +01:00
bdalsass
a1a83a1ba3 N°6651 - 3.1 bulk modify n:n like Tagset: checkbox ignored (#552)
- handle selectize enable/disable to update operation hidden input state
- don't execute elements click callback when input disabled
- merge current and initial values for the initial value
2023-10-30 08:34:53 +01:00
Romain Quetiez
e7d11e4bec Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-27 19:41:01 +02:00
Molkobain
e3c26c97f2 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-26 11:27:40 +02:00
Molkobain
d6e132fbda 👥 Add @chileeb to contributors list! 🙌 2023-10-26 11:17:51 +02:00
Molkobain
74c4c642eb Update dictionaries/zh_cn.dictionary.itop.ui.php 2023-10-25 14:13:33 +02:00
libin
af3be19175 Chinese Dict Optimize: ProfilesMenu 2023-10-25 14:13:33 +02:00
Molkobain
ee49d64120 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-23 15:36:46 +02:00
Anne-Cath
58257fa25e Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-20 17:07:38 +02:00
Anne-Cath
cb3d8120bd Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-20 16:56:45 +02:00
Anne-Cath
ace88cb709 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-17 12:19:30 +02:00
Anne-Cath
8ca20e3135 Remove change push by error 2023-10-17 11:45:27 +02:00
Pierre Goiffon
4e13cce770 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-17 11:27:09 +02:00
Anne-Cath
f408e14d4b WIP - remove log + fix edition with a lot of values (>chunk_size) 2023-10-17 11:05:33 +02:00
Anne-Cath
543daac06d N°6847 - order of label pdf export 2023-10-16 16:03:25 +02:00
Pierre Goiffon
800d1b03c1 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-13 17:37:29 +02:00
Molkobain
9b970a472f Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-13 10:13:25 +02:00
Eric Espie
593131a7ea Merge remote-tracking branch 'origin/support/3.1' into develop 2023-10-06 09:54:20 +02:00
Molkobain
148f708360 N°6805 - Add reference to classes implementing \iWorkingTimeComputer in the datamodel (meta tag) 2023-10-03 21:32:31 +02:00
Molkobain
7d0feab078 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-09-26 22:23:18 +02:00
Pierre Goiffon
aae2db8ad8 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-09-26 11:36:24 +02:00
Molkobain
f3d488de26 Update Jimmy avatar for the sample data 2023-09-25 15:52:10 +02:00
Stephen Abello
ebc15db75e Merge branch 'support/3.1' into develop 2023-09-21 16:32:40 +02:00
Pierre Goiffon
dd28aca260 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-09-20 18:13:27 +02:00
Molkobain
2a6e5b21a9 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-09-20 16:18:55 +02:00
Pierre Goiffon
14f6ce3626 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-09-19 12:30:33 +02:00
Pierre Goiffon
34a2a6ce03 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-09-19 09:59:06 +02:00
Molkobain
db940e3bba Merge remote-tracking branch 'origin/support/3.1' into develop 2023-09-19 08:52:06 +02:00
Molkobain
9f3a6be255 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-09-18 16:23:49 +02:00
Pierre Goiffon
b6ac92d192 Merge remote-tracking branch 'origin/support/3.1' into develop
# Conflicts:
#	datamodels/2.x/itop-core-update/dictionaries/hu.dict.itop-core-update.php
2023-09-18 15:10:58 +02:00
Stephen Abello
ce1c517a9f Merge branch 'support/3.1' into develop 2023-09-15 15:45:36 +02:00
Pierre Goiffon
75b6a3ede8 Merge remote-tracking branch 'origin/support/3.1' into develop
# Conflicts:
#	dictionaries/hu.dictionary.itop.ui.php
#	dictionaries/ja.dictionary.itop.ui.php
#	dictionaries/sk.dictionary.itop.ui.php
#	dictionaries/ui/layouts/navigation-menu/pt_br.dictionary.itop.navigation-menu.php
2023-09-14 16:55:38 +02:00
Thomas Casteleyn
3818bc3f98 N°5218 Fix toolkit error on enum since 3.0.0 (#513) 2023-09-12 17:27:46 +02:00
Pierre Goiffon
d8ec900933 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-09-07 14:53:16 +02:00
acognet
29ba5e73fa N°5491 - Inconsistent dictionnary entries regarding arguments to pass to Dict::Format - fix dictionnary 2023-09-06 10:02:28 +02:00
Pierre Goiffon
acf449c03a Merge remote-tracking branch 'origin/support/3.1' into develop 2023-09-06 09:09:57 +02:00
Pierre Goiffon
ecb4cb7435 📝 CONTRIBUTING : add a mention on "allow edits by maintainers" not available on org forks
Seen in #523, thanks Lars !
2023-09-05 17:35:48 +02:00
acognet
3200b5dc86 N°5491 - Inconsistent dictionnary entries regarding arguments to pass to Dict::Format - fix dictionnary 2023-09-05 15:28:08 +02:00
acognet
e20d4cecd5 N°5491 - Inconsistent dictionnary entries regarding arguments to pass to Dict::Format - fix dictionnary 2023-09-05 15:20:39 +02:00
Eric Espie
36177e09f7 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-09-01 14:15:35 +02:00
acognet
9ae62adff1 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-31 16:25:15 +02:00
Anne-Catherine
73a2c935a7 N°6555 - Add class description in tooltip of Dashlet badge (#504) 2023-08-31 14:37:37 +02:00
vdumas
42acbe66c3 N°6682 - Pbs with Audit classes and AccessRight 2023-08-29 16:27:28 +02:00
vdumas
22a9299d97 N°6682 - AuditDomain XML meta declaration missing 2023-08-29 15:13:08 +02:00
Molkobain
b9acd0a9a6 N°6670 - Fix unescaped quote from c761364b 2023-08-22 16:19:59 +02:00
Molkobain
c761364bed N°6670 - Fix EVENT_DOWNLOAD_DOCUMENT event XML declaration missing elements 2023-08-22 16:11:59 +02:00
Romain Quetiez
d79dacf8a3 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-18 14:25:54 +02:00
BenGrenoble
efc36e12bc N°6361 - [ERGO] Change query example order to highlight the one working on an empty iTop 2023-08-17 14:25:39 +02:00
BenGrenoble
5a0b12f078 N°6361 - [ERGO] Change query example order to highlight the one working on an empty iTop 2023-08-16 11:04:56 +02:00
Molkobain
22d04cb9fc N°6103 - Remove jQuery Hotkeys plugin 2023-08-11 21:17:53 +02:00
Pierre Goiffon
d8da119c56 📝 Version history: fix typo in 2.7.9 date 2023-08-11 16:12:04 +02:00
Pierre Goiffon
a24d50d7e3 DBBackupDataTest::testPrepareFilesToBackup : fix cleanup not done on failing test 2023-08-11 15:19:48 +02:00
Molkobain
e5716e66bb Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-11 11:06:21 +02:00
Stephen Abello
c6c2bb33ed 📝 Version history: add 2.7.9 2023-08-10 15:08:56 +02:00
Pierre Goiffon
0d0ef86550 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-10 14:41:50 +02:00
Molkobain
ca0bd674a7 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-10 10:38:11 +02:00
Molkobain
260b2e0bd6 Fix typo in dictionary file 2023-08-09 15:56:49 +02:00
Pierre Goiffon
90413ae4fe Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-09 14:54:36 +02:00
Pavel Stetina
b7466e3206 N°6641 - Improve czech translations (thanks to @Stetinac !) (#524)
* 🌐Update cs.dictionary.itop.core.php

* 🌐Update cs.dictionary.itop.ui.php

* 🌐Update cs.dictionary.itop.ui.php

* 🌐Update cs.dict.itop-portal-base.php

* 🌐Update cs.dict.combodo-backoffice-darkmoon-theme.php

* 🌐 Update cs.dictionary.itop.ui.php

Typo fix
2023-08-09 11:46:39 +02:00
Pierre Goiffon
f2812cdbe5 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-09 10:21:12 +02:00
Pierre Goiffon
95a2fdec99 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-08 15:48:19 +02:00
Pierre Goiffon
6880c49a32 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-04 14:59:33 +02:00
Pierre Goiffon
1b48b4a1e1 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-03 11:09:29 +02:00
Pierre Goiffon
0516100aae Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-03 09:41:37 +02:00
Molkobain
5b4079ab7e Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-02 15:35:31 +02:00
Pierre Goiffon
d284d629a4 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-02 10:40:10 +02:00
Pierre Goiffon
c52195e6cd Merge remote-tracking branch 'origin/support/3.1' into develop 2023-08-01 14:39:28 +02:00
Eric Espie
a61734a6f8 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-28 10:57:54 +02:00
Eric Espie
750ecd4804 N°6061 - allow local path from an arbitrary path 2023-07-28 10:01:43 +02:00
Pierre Goiffon
781c15d1ee Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-27 17:03:47 +02:00
Pierre Goiffon
a1499a04d4 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-27 14:56:08 +02:00
Eric Espie
fb23bddeb2 N°6061 - allow local path from an arbitrary path 2023-07-27 12:06:14 +02:00
Pierre Goiffon
aa6fa4c674 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-27 11:32:52 +02:00
Eric Espie
19e7fc9cb9 N°6061 - Allow services to implement interfaces 2023-07-27 10:23:05 +02:00
Pierre Goiffon
a0a66f3b54 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-26 12:08:09 +02:00
Eric Espie
3c9c13a371 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-25 17:56:45 +02:00
Pierre Goiffon
96d04e35f9 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-25 17:07:44 +02:00
Pierre Goiffon
629a8412dc Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-24 15:39:25 +02:00
Pierre Goiffon
19a83bc944 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-24 12:00:25 +02:00
Eric Espie
a59dacf679 N°6436 - Performance Audit (KPI analysis) 2023-07-20 12:05:13 +02:00
Eric Espie
8b93a404ef Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-19 15:42:02 +02:00
Molkobain
ded204344d 👥 Add @Stetinac to the contributors list 🙌 2023-07-19 15:24:52 +02:00
Eric Espie
b3121d46c4 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-19 11:01:13 +02:00
Eric Espie
f60d03ddd3 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-19 09:28:23 +02:00
Pierre Goiffon
3d8345b92c Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-18 14:17:58 +02:00
Pierre Goiffon
9ab928e92e Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-18 09:49:17 +02:00
Benjamin Dalsass
ea56939b7a N°6546 - AttributeLinkedSetIndirect filter dosen't work 2023-07-17 10:12:48 +02:00
Molkobain
6caddb65e9 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-14 21:11:13 +02:00
Molkobain
8df0d66fb6 Merge remote-tracking branch 'origin/support/3.1' into develop 2023-07-13 10:18:03 +02:00
Eric Espie
a80aa20b23 Merge branch 'support/3.1' into develop 2023-07-12 13:32:26 +02:00
Pierre Goiffon
fd336ffd92 N°6558 Test for iTopDesignFormat::$aVersions consistency 2023-07-12 08:36:20 +02:00
Pierre Goiffon
be1c559ad4 Merge remote-tracking branch 'origin/support/3.1' into develop
# Conflicts:
#	core/config.class.inc.php
2023-07-11 11:59:09 +02:00
Pierre Goiffon
2dce37f289 🔖 Update XML files version to 3.2 2023-07-11 11:25:16 +02:00
Pierre Goiffon
22b5eef4ce 🔖 Fix typo in XML conversion method name 2023-07-11 11:24:45 +02:00
Pierre Goiffon
63426e459a 🔖 Update XML version to 3.2 2023-07-11 11:04:00 +02:00
Pierre Goiffon
8393172ad2 🔖 Prepare 3.2.0 version (modules) 2023-07-11 10:44:46 +02:00
Pierre Goiffon
cc06afc6df 🔖 Prepare 3.2.0 version 2023-07-11 10:30:53 +02:00
2485 changed files with 76842 additions and 53266 deletions

View File

@@ -1,7 +1,14 @@
# iTop version history
```mermaid
%%{init: { 'logLevel': 'debug', 'theme': 'base', 'gitGraph': {'showBranches': true,'mainBranchName': 'develop','rotateCommitLabel': true}} }%%
%%{init: { 'logLevel': 'debug', 'theme': 'base', 'themeVariables': {
'git0': 'lawngreen',
'git3': 'dodgerblue',
'git4': 'grey',
'git5': 'grey',
'git6': 'grey',
'git7': 'grey'
}, 'gitGraph': {'showBranches': true,'mainBranchName': 'develop','rotateCommitLabel': true}} }%%
gitGraph
commit id: "2016-07-06" tag: "2.3.0" type: HIGHLIGHT
branch support/2.3 order: 900
@@ -68,6 +75,10 @@ gitGraph
branch support/3.1 order: 840
checkout support/3.1
commit id: "2023-08-09" tag: "3.1.0-2"
checkout support/2.7
commit id: "2023-08-10" tag: "2.7.9"
checkout support/3.1
commit id: "2023-12-20" tag: "3.1.1"
```
To learn more, check the [iTop community versions history on the official wiki](https://www.itophub.io/wiki/page?id=latest:release:start).

View File

@@ -22,13 +22,13 @@ $iElapsed = time() - $iBeginTime;
if (count($aFailedCommands))
{
fwrite(STDERR, "\nafterBuild execution failed! (in ${iElapsed}s)\n");
fwrite(STDERR, "\nafterBuild execution failed! (in {$iElapsed}s)\n");
fwrite(STDERR, "List of failling commands:\n - " . implode("\n - ", $aFailedCommands) . "\n");
exit(1);
}
echo "\nDone (${iElapsed}s)\n";
echo "\nDone ({$iElapsed}s)\n";
exit(0);
/**
@@ -74,7 +74,7 @@ function ExecCommand($cmd) {
}
else
{
echo "| elapsed:${iElapsed}s \n";
echo "| elapsed:{$iElapsed}s \n";
}
if (!empty($stderr))

View File

@@ -0,0 +1,56 @@
courier.php
courierb.php
courierbi.php
courieri.php
dejavusans.ctg.z
dejavusans.php
dejavusans.z
dejavusansb.ctg.z
dejavusansb.php
dejavusansb.z
dejavusansbi.ctg.z
dejavusansbi.php
dejavusansbi.z
dejavusanscondensed.ctg.z
dejavusanscondensed.php
dejavusanscondensed.z
dejavusanscondensedb.ctg.z
dejavusanscondensedb.php
dejavusanscondensedb.z
dejavusanscondensedbi.ctg.z
dejavusanscondensedbi.php
dejavusanscondensedbi.z
dejavusanscondensedi.ctg.z
dejavusanscondensedi.php
dejavusanscondensedi.z
dejavusansextralight.ctg.z
dejavusansextralight.php
dejavusansextralight.z
dejavusansi.ctg.z
dejavusansi.php
dejavusansi.z
dejavusansmono.ctg.z
dejavusansmono.php
dejavusansmono.z
dejavusansmonob.ctg.z
dejavusansmonob.php
dejavusansmonob.z
dejavusansmonobi.ctg.z
dejavusansmonobi.php
dejavusansmonobi.z
dejavusansmonoi.ctg.z
dejavusansmonoi.php
dejavusansmonoi.z
droidsansfallback.ctg.z
droidsansfallback.php
droidsansfallback.z
helvetica.php
helveticab.php
helveticabi.php
helveticai.php
symbol.php
times.php
timesb.php
timesbi.php
timesi.php
zapfdingbats.php

View File

@@ -0,0 +1,101 @@
<?php
/**
* This script will copy custom fonts in the TCPDF lib fonts directory.
* If you need to add other files :
* - add the corresponding files in this script directory
* - modify this script to copy also your files
*
* @since 2.7.0 N°1947 add DroidSansFallback font (see also PR #49 in the links below)
* @since 2.7.0 N°2435 TCPPDF lib forked and added in composer.json (at that time the lib was announced as deprecated and rewritten in tecnickcom/tc-lib-pdf)
* @since 3.2.0 N°7175 switch back to TCPDF original lib (which is finally still maintained, tecnickcom/tc-lib-pdf us still under dev), script creation to keep custom DroidSansFallback font
*
* @link https://github.com/Combodo/iTop/pull/49 add DroidSansFallback font
* @link https://github.com/tecnickcom/TCPDF?tab=readme-ov-file#note TCPDF is in support only mode
*/
$sItopRootFolder = realpath(__DIR__ . "/../../../");
$sCurrentScriptFileName = basename(__FILE__);
require_once ("$sItopRootFolder/lib/autoload.php");
$sTcPdfRootFolder = $sItopRootFolder.'/lib/tecnickcom/tcpdf';
if (false === file_exists($sTcPdfRootFolder)) {
echo $sCurrentScriptFileName.": No TCPDF lib detected, exiting !\n";
return;
}
$sTcPdfFontsFolder = $sTcPdfRootFolder.'/Fonts/';
/**
* 1) Cleaning up the fonts directory to keep only the ones we want in iTop
*/
echo $sCurrentScriptFileName.": ---1) Cleaning up the fonts files\n";
$aTcpdfDefaultFontsToKeepInItop = file(__DIR__.'/tcpdfDefaultFontsToKeepInItop.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$aTcpdfFontsDirContent = scandir($sTcPdfFontsFolder);
foreach ($aTcpdfFontsDirContent as $sTcpdfFontResourceName) {
if ($sTcpdfFontResourceName === '.') {
continue;
}
if ($sTcpdfFontResourceName === '..') {
continue;
}
if (!in_array($sTcpdfFontResourceName, $aTcpdfDefaultFontsToKeepInItop, true)) {
echo $sCurrentScriptFileName.": Removing $sTcpdfFontResourceName !\n";
$sTcpdfFontResourceFullPath = $sTcPdfFontsFolder.$sTcpdfFontResourceName;
if (is_file($sTcpdfFontResourceFullPath)) {
unlink($sTcpdfFontResourceFullPath);
} elseif (is_dir($sTcpdfFontResourceFullPath)) {
rrmdir($sTcpdfFontResourceFullPath);
}
}
}
/**
* 2) Then adding the DroidSansFallback font (useful for CJK data for example)
*/
echo $sCurrentScriptFileName.": ---2) Copying font files to TCPDF ($sTcPdfFontsFolder)...\n";
$aFontFilesToCopy = glob(__DIR__.'\droidsansfallback.*');
foreach ($aFontFilesToCopy as $sFontFileToCopy) {
$sFontFileName = basename($sFontFileToCopy);
echo $sCurrentScriptFileName.': copying '.$sFontFileName."\n";
copy($sFontFileToCopy, $sTcPdfFontsFolder.$sFontFileName);
}
echo $sCurrentScriptFileName.": Done !\n";
/*-----------------------------------------------------------------------------------------------*/
/**
* Recursively delete a directory and its content
*
* @param $sDirToRemovePath
*
* @return void
*/
function rrmdir($sDirToRemovePath):void
{
if (is_dir($sDirToRemovePath)) {
$objects = scandir($sDirToRemovePath);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($sDirToRemovePath."/".$object) == "dir") {
rrmdir($sDirToRemovePath."/".$object);
} else {
unlink($sDirToRemovePath."/".$object);
}
}
}
reset($objects);
rmdir($sDirToRemovePath);
}
}

View File

@@ -140,7 +140,7 @@ When your code is working, please:
* Pull request description: mind to add all the information useful to understand why you're suggesting this modification and anything necessary to dive into your work. Especially:
- Bugfixes: exact steps to reproduce the bug (given/when/then), description of the bug cause and what solution is implemented
- Enhancements: use cases, implementation details if needed
* Mind to check the "[Allow edits from maintainers](https://docs.github.com/en/github-ae@latest/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork)" option !
* Mind to check the "[Allow edits from maintainers](https://docs.github.com/en/github-ae@latest/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork)" option ! (note that if you are working with an org fork, this option [won't be available](https://github.com/orgs/community/discussions/5634))
## 🙏 We are thankful

View File

@@ -87,9 +87,11 @@ We would like to give a special thank you 🤗 to the people from the community
- Castro, Randall Badilla
- Colantoni, Maria Laura
- Couronné, Guy
- Dejin, Bie (a.k.a [@bdejin](https://github.com/bdejin))
- Dvořák, Lukáš
- Goethals, Stefan
- Gumble, David
- Ji, Leeb (冀利斌) (a.k.a [@chileeb](https://github.com/chileeb))
- Kaltefleiter, Lars (a.k.a [@larhip](https://www.github.com/larhip))
- Khamit, Shamil
- Kincel, Martin
@@ -105,9 +107,11 @@ We would like to give a special thank you 🤗 to the people from the community
- Roháč, Richard (a.k.a [@RohacRichard](https://github.com/RohacRichard))
- Rosenke, Stephan
- Rudner, Björn (a.k.a [@rudnerbjoern](https://github.com/rudnerbjoern))
- Šafránek, Jaroslav (a.k.a [jkcinik](https://sourceforge.net/u/jkcinik/profile/) on SourceForge)
- Seki, Shoji
- Shilov, Vladimir
- Stukalov, Ilya (a.k.a [@ilya](https://www.github.com/ilya-stukalov))
- Stetina, Pavel (a.k.a [@Stetinac](https://github.com/Stetinac))
- Stukalov, Ilya (a.k.a [@ilya](https://www.github.com/ilya)-stukalov)
- Tarjányi, Csaba (a.k.a [@tacsaby](https://github.com/tacsaby))
- Tulio, Marco
- Turrubiates, Miguel

View File

@@ -4,6 +4,8 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
use Combodo\iTop\Application\WebPage\WebPage;
define('ADMIN_PROFILE_NAME', 'Administrator');
define('PORTAL_PROFILE_NAME', 'Portal user');

View File

@@ -17,6 +17,8 @@
* You should have received a copy of the GNU Affero General Public License
*/
use Combodo\iTop\Application\WebPage\WebPage;
define('ADMIN_PROFILE_NAME', 'Administrator');
define('PORTAL_PROFILE_NAME', 'Portal user');

View File

@@ -17,6 +17,8 @@
* You should have received a copy of the GNU Affero General Public License
*/
use Combodo\iTop\Application\WebPage\WebPage;
define('ADMIN_PROFILE_ID', 1);
class UserRightsBaseClass extends cmdbAbstractObject

29
app.php Normal file
View File

@@ -0,0 +1,29 @@
<?php
/**
* Copyright (C) 2013-2023 Combodo SARL
*
* This file is part of iTop.
*
* iTop is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* iTop is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
*/
use Combodo\iTop\Kernel;
require_once __DIR__.'/lib/autoload_runtime.php';
require_once('approot.inc.php');
require_once('application/startup.inc.php');
return function (array $context) {
return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
};

View File

@@ -7,6 +7,7 @@
// cannot notify depreciation for now as this is still load in autoloader
//DeprecatedCallsLog::NotifyDeprecatedFile('moved to sources/Application/WebPage/AjaxPage.php, now loadable using autoloader');
use Combodo\iTop\Application\WebPage\AjaxPage;
/**
* Class ajax_page

View File

@@ -19,6 +19,8 @@
*/
use Combodo\iTop\Application\UI\Base\iUIBlock;
use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
use Symfony\Component\DependencyInjection\Container;
require_once(APPROOT.'application/newsroomprovider.class.inc.php');
@@ -270,14 +272,14 @@ interface iPreferencesExtension
{
/**
* @api
* @param \WebPage $oPage
* @param WebPage $oPage
*
*/
public function DisplayPreferences(WebPage $oPage);
/**
* @api
* @param \WebPage $oPage
* @param WebPage $oPage
* @param string $sOperation
*
* @return bool true if the operation has been used
@@ -1272,8 +1274,6 @@ abstract class AbstractPageUIExtension implements iPageUIExtension
*/
public function GetNorthPaneHtml(iTopWebPage $oPage)
{
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('use iPageUIBlockExtension instead');
return '';
}
@@ -1282,8 +1282,6 @@ abstract class AbstractPageUIExtension implements iPageUIExtension
*/
public function GetSouthPaneHtml(iTopWebPage $oPage)
{
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('use iPageUIBlockExtension instead');
return '';
}
@@ -1292,8 +1290,6 @@ abstract class AbstractPageUIExtension implements iPageUIExtension
*/
public function GetBannerHtml(iTopWebPage $oPage)
{
DeprecatedCallsLog::NotifyDeprecatedPhpMethod('use iPageUIBlockExtension instead');
return '';
}

View File

@@ -26,7 +26,7 @@ use Combodo\iTop\Application\UI\Base\Component\Html\Html;
use Combodo\iTop\Application\UI\Base\Component\Html\HtmlFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\Select\SelectOptionUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\SelectUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\Select\SelectUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu;
use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenuItem\JsPopoverMenuItem;
@@ -42,6 +42,9 @@ use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory;
use Combodo\iTop\Application\UI\Links\Direct\BlockDirectLinkSetViewTable;
use Combodo\iTop\Application\UI\Links\Indirect\BlockIndirectLinkSetViewTable;
use Combodo\iTop\Application\UI\Links\Set\LinkSetUIBlockFactory;
use Combodo\iTop\Application\WebPage\AjaxPage;
use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Renderer\BlockRenderer;
use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer;
use Combodo\iTop\Renderer\Console\ConsoleFormRenderer;
@@ -287,7 +290,7 @@ abstract class cmdbAbstractObject extends CMDBObject implements iDisplay
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param \cmdbAbstractObject $oObj
* @param array $aParams
*
@@ -356,7 +359,7 @@ JS
* @param int $iKey The identifier of the object
* @param string $sMessageId Your id or one of the well-known ids: 'create', 'update' and 'apply_stimulus'
* @param string $sMessage The HTML message (must be correctly escaped)
* @param string $sSeverity Any of the \WebPage::ENUM_SESSION_MESSAGE_SEVERITY_XXX constants
* @param string $sSeverity Any of the WebPage::ENUM_SESSION_MESSAGE_SEVERITY_XXX constants
* @param float $fRank Ordering of the message: smallest displayed first (can be negative)
* @param bool $bMustNotExist Do not alter any existing message (considering the id)
*
@@ -378,7 +381,7 @@ JS
}
/**
* @param \WebPage $oPage Warning, since 3.0.0 this parameter was kept for compatibility reason. You shouldn't write directly on the page!
* @param WebPage $oPage Warning, since 3.0.0 this parameter was kept for compatibility reason. You shouldn't write directly on the page!
* When writing to the page, markup will be put above the real header of the panel.
* To insert something IN the panel, we now need to add UIBlocks in either the "subtitle" or "toolbar" sections of the array that will be returned.
* @param bool $bEditMode Deprecated parameter in iTop 3.0.0, use {@see GetDisplayMode()} and ENUM_DISPLAY_MODE_* constants instead
@@ -556,7 +559,7 @@ HTML
/**
* Display properties tab of an object
*
* @param \WebPage $oPage
* @param WebPage $oPage
* @param bool $bEditMode Note that this parameter is no longer used in this method. Use {@see static::$sDisplayMode} instead
* @param string $sPrefix
* @param array $aExtraParams
@@ -595,7 +598,7 @@ HTML
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $sAttCode
*
* @throws \Exception
@@ -636,7 +639,7 @@ HTML
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param bool $bEditMode Note that this parameter is no longer used in this method. Use {@see static::$sDisplayMode} instead
*
* @throws \CoreException
@@ -863,7 +866,7 @@ HTML
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param bool $bEditMode Note that this parameter is no longer used in this method. Use {@see static::$sDisplayMode} instead
* @param string $sPrefix
* @param array $aExtraParams
@@ -1067,7 +1070,7 @@ HTML
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param bool $bEditMode Note that this parameter is no longer used in this method, {@see static::$sDisplayMode} is used instead, but we cannot remove it as it part of the base interface (iDisplay)...
*
* @throws \ApplicationException
@@ -1114,7 +1117,7 @@ HTML
}
// Note: DisplayBareHeader is called before adding $oObjectDetails to the page, so it can inject HTML before it through $oPage.
/** @var \iTopWebPage $oPage */
/** @var iTopWebPage $oPage */
$aHeadersBlocks = $this->DisplayBareHeader($oPage, $bEditMode);
if (false === empty($aHeadersBlocks['subtitle'])) {
$oObjectDetails->AddSubTitleBlocks($aHeadersBlocks['subtitle']);
@@ -1149,7 +1152,7 @@ HTML
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
*
* @throws \ArchivedObjectException
* @throws \CoreException
@@ -1172,7 +1175,7 @@ HTML
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param \CMDBObjectSet $oSet
* @param array $aExtraParams See possible values in {@see DataTableUIBlockFactory::RenderDataTable()}
*
@@ -1234,7 +1237,7 @@ HTML
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param \DBObjectSet $oSet
* @param array $aExtraParams
*
@@ -1406,7 +1409,7 @@ HTML
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param \CMDBObjectSet $oSet
* @param array $aExtraParams key used :
* <ul>
@@ -1529,7 +1532,7 @@ HTML
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param \CMDBObjectSet $oSet
* @param array $aParams
* @param string $sCharset
@@ -1688,7 +1691,7 @@ HTML
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param \CMDBObjectSet $oSet
* @param array $aParams
*
@@ -1901,7 +1904,7 @@ HTML
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param \CMDBObjectSet $oSet
* @param array $aParams
*
@@ -1979,7 +1982,7 @@ HTML
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param \CMDBObjectSet $oSet
* @param array $aExtraParams
*
@@ -2010,7 +2013,7 @@ HTML
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param string $sClass
* @param string $sAttCode
* @param \AttributeDefinition $oAttDef
@@ -2749,7 +2752,7 @@ JS
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param array $aExtraParams
*
* @throws \ArchivedObjectException
@@ -3154,7 +3157,7 @@ EOF
/**
* Select the derived class to create
* @param string $sClass
* @param \WebPage $oP
* @param WebPage $oP
* @param \ApplicationContext $oAppContext
* @param array $aPossibleClasses
* @param array $aHiddenFields
@@ -3249,7 +3252,7 @@ EOF
return $oBlock;
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param string $sClass
* @param \DBObject|null $oSourceObject Object to use for the creation form, can be either the class to instantiate, an object to clone or an object to use (eg. already prefilled / modeled object)
* @param array $aArgs
@@ -3334,7 +3337,7 @@ EOF
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param string $sStimulus
* @param array|null $aPrefillFormParam
* @param bool $bDisplayBareProperties Whether to display the object details or not
@@ -3589,16 +3592,26 @@ EOF
$oPage->add_ready_script(InlineImage::EnableCKEditorImageUpload($this, $sTempId));
} else {
//we can directly apply the stimuli
$sExceptionMessage = null;
try {
$bApplyStimulus = $this->ApplyStimulus($sStimulus); // will write the object in the DB
if (!$bApplyStimulus) {
throw new ApplicationException(Dict::S('UI:FailedToApplyStimuli'));
} else {
}
catch (Exception $oException) {
// Catch any exception happening during the stimulus
$bApplyStimulus = false;
$sExceptionMessage = ($oException instanceof CoreCannotSaveObjectException) ? $oException->getHtmlMessage() : $oException->getMessage();
}
finally {
if ($sOwnershipToken !== null) {
// Release the concurrent lock, if any
iTopOwnershipLock::ReleaseLock($sClass, $iKey, $sOwnershipToken);
}
return true;
if (!$bApplyStimulus) {
// Throw an application oriented exception if necessary
throw new ApplicationException($sExceptionMessage ?? Dict::S('UI:FailedToApplyStimuli'));
} else {
return true;
}
}
}
@@ -3747,7 +3760,7 @@ HTML;
/**
* Displays a blob document *inline* (if possible, depending on the type of the document)
*
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $sAttCode
*
* @return string
@@ -4835,7 +4848,7 @@ HTML;
/**
* Special display where the case log uses the whole "screen" at the bottom of the "Properties" tab
*
* @param \WebPage $oPage
* @param WebPage $oPage
* @param string $sAttCode
* @param string $sComment
* @param string $sPrefix
@@ -4939,7 +4952,7 @@ HTML
/**
* Special display where the case log uses the whole "screen" at the bottom of the "Properties" tab
*
* @param \WebPage $oPage
* @param WebPage $oPage
* @param string $sAttCode
* @param string $sComment
* @param string $sPrefix
@@ -5064,7 +5077,7 @@ HTML
* Display a form for modifying several objects at once
* The form will be submitted to the current page, with the specified additional values
*
* @param \iTopWebPage $oP
* @param iTopWebPage $oP
* @param string $sClass
* @param array $aSelectedObj
* @param string $sCustomOperation
@@ -5308,7 +5321,7 @@ EOF
/**
* Process the reply made from a form built with DisplayBulkModifyForm
*
* @param \WebPage $oP
* @param WebPage $oP
* @param string $sClass
* @param array $aSelectedObj
* @param string $sCustomOperation
@@ -5448,7 +5461,7 @@ EOF
/**
* Perform all the needed checks to delete one (or more) objects
*
* @param \WebPage $oP
* @param WebPage $oP
* @param $sClass
* @param \DBObject[] $aObjects
* @param $bPreview

View File

@@ -9,6 +9,8 @@ use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableSettings;
use Combodo\iTop\Application\UI\Base\Component\PopoverMenu\PopoverMenu;
use Combodo\iTop\Application\UI\Base\Component\Toolbar\ToolbarUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardLayout as DashboardLayoutUIBlock;
use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
require_once(APPROOT.'application/dashboardlayout.class.inc.php');
require_once(APPROOT.'application/dashlet.class.inc.php');
@@ -422,7 +424,7 @@ abstract class Dashboard
}
/**
* @param \WebPage $oPage *
* @param WebPage $oPage *
* @param array $aExtraParams
*
* @throws \ReflectionException
@@ -513,7 +515,7 @@ EOF
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param bool $bEditMode
* @param array $aExtraParams
* @param bool $bCanEdit
@@ -569,7 +571,7 @@ JS
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
*
* @throws \ReflectionException
* @throws \Exception
@@ -592,7 +594,7 @@ JS
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param array $aExtraParams
*/
public function RenderDashletsProperties(WebPage $oPage, $aExtraParams = array())
@@ -1109,7 +1111,7 @@ JS
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param array $aExtraParams
*
* @throws \Exception
@@ -1228,7 +1230,7 @@ EOF
/**
* @param \WebPage $oPage
* @param WebPage $oPage
*
* @param array $aExtraParams
*
@@ -1488,7 +1490,7 @@ JS
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $sOQL
*
* @throws \DictExceptionMissingString

View File

@@ -19,6 +19,7 @@ use Combodo\iTop\Application\UI\Base\Component\Html\Html;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardColumn;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardLayout as DashboardLayoutUIBlock;
use Combodo\iTop\Application\UI\Base\Layout\Dashboard\DashboardRow;
use Combodo\iTop\Application\WebPage\WebPage;
/**
* Dashboard presentation
@@ -106,7 +107,7 @@ abstract class DashboardLayoutMultiCol extends DashboardLayout
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $aCells
* @param bool $bEditMode
* @param array $aExtraParams

View File

@@ -23,6 +23,7 @@ use Combodo\iTop\Application\UI\Base\Component\Html\Html;
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
use Combodo\iTop\Application\UI\Base\iUIBlock;
use Combodo\iTop\Application\UI\Base\UIBlock;
use Combodo\iTop\Application\WebPage\WebPage;
require_once(APPROOT.'application/forms.class.inc.php');
@@ -222,7 +223,7 @@ abstract class Dashlet
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param bool $bEditMode
* @param bool $bEnclosingDiv
* @param array $aExtraParams
@@ -298,7 +299,7 @@ EOF
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param bool $bEditMode
* @param array $aExtraParams
*
@@ -309,7 +310,7 @@ EOF
/**
* Rendering without the real data
*
* @param \WebPage $oPage
* @param WebPage $oPage
* @param bool $bEditMode
* @param array $aExtraParams
*

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.1">
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2">
<classes>
<class id="AbstractResource" _delta="define">
<parent>cmdbAbstractObject</parent>
@@ -451,10 +451,18 @@
<description>The object containing the document</description>
<type>DBObject</type>
</event_datum>
<event_datum id="att_code">
<description>The optional object attribute code hosting the document</description>
<type>string</type>
</event_datum>
<event_datum id="document">
<description>The document downloaded</description>
<type>ormDocument</type>
</event_datum>
<event_datum id="content_disposition">
<description>The content disposition of the document ("inline" or "attachment")</description>
<type>string</type>
</event_datum>
<event_datum id="debug_info">
<description>Debug string</description>
<type>string</type>

View File

@@ -1,5 +1,7 @@
<?php
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableSettings;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer;
/**
@@ -61,8 +63,8 @@ class DataTable
}
/**
* @param \WebPage $oPage
* @param \DataTableSettings $oSettings
* @param WebPage $oPage
* @param DataTableSettings $oSettings
* @param $bActionsMenu
* @param $sSelectMode
* @param $bViewLink
@@ -141,7 +143,7 @@ class DataTable
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $iPageSize
* @param $iDefaultPageSize
* @param $iPageIndex
@@ -236,7 +238,7 @@ class DataTable
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $sSelectMode
*
* @return string
@@ -255,7 +257,7 @@ class DataTable
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $iPageSize
* @param $iDefaultPageSize
* @param $iPageIndex
@@ -348,7 +350,7 @@ EOF;
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $aExtraParams
*
* @return string
@@ -375,7 +377,7 @@ EOF;
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $aExtraParams
*
* @return string
@@ -405,7 +407,7 @@ EOF;
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $aColumns
* @param $bViewLink
* @param $iDefaultPageSize
@@ -658,7 +660,7 @@ EOF;
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $aColumns
* @param $sSelectMode
* @param $iPageSize
@@ -790,7 +792,7 @@ JS
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $iDefaultPageSize
* @param $iStart
*/
@@ -818,7 +820,7 @@ JS
class PrintableDataTable extends DataTable
{
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $iPageSize
* @param $iDefaultPageSize
* @param $iPageIndex
@@ -844,7 +846,7 @@ class PrintableDataTable extends DataTable
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param $aColumns
* @param $sSelectMode
* @param $iPageSize

View File

@@ -24,6 +24,8 @@ use Combodo\iTop\Application\UI\DisplayBlock\BlockChartAjaxBars\BlockChartAjaxBa
use Combodo\iTop\Application\UI\DisplayBlock\BlockChartAjaxPie\BlockChartAjaxPie;
use Combodo\iTop\Application\UI\DisplayBlock\BlockCsv\BlockCsv;
use Combodo\iTop\Application\UI\DisplayBlock\BlockList\BlockList;
use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Service\Router\Router;
require_once(APPROOT.'/application/utils.inc.php');
@@ -595,7 +597,7 @@ class DisplayBlock
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param array $aExtraParams
*
* @throws \ApplicationException
@@ -1354,7 +1356,7 @@ JS
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param array $aExtraParams
*
* @return \Combodo\iTop\Application\UI\Base\iUIBlock
@@ -1378,7 +1380,7 @@ JS
/**
* @param array $aExtraParams
* @param \WebPage $oPage
* @param WebPage $oPage
*
* @throws \ArchivedObjectException
* @throws \ConfigException
@@ -1456,7 +1458,7 @@ JS
/**
* @param array $aExtraParams
* @param \WebPage $oPage
* @param WebPage $oPage
*
* @return \Combodo\iTop\Application\UI\Base\Layout\UIContentBlock
* @throws \ApplicationException
@@ -1564,7 +1566,7 @@ JS
/**
* @deprecated 3.1.0 N°5957
*
* @param \WebPage $oPage
* @param WebPage $oPage
* @param array $aExtraParams
*
* @return \Combodo\iTop\Application\UI\Base\Component\Html\Html|\Combodo\iTop\Application\UI\Base\Layout\UIContentBlock|string
@@ -1664,7 +1666,7 @@ JS
/**
* @param array $aExtraParams
* @param \WebPage $oPage
* @param WebPage $oPage
*
* @throws \ArchivedObjectException
* @throws \CoreException
@@ -1830,7 +1832,7 @@ class MenuBlock extends DisplayBlock
* an object in with the same tab active by default as the tab that was active when selecting
* the "Modify..." action.
*
* @param \WebPage $oPage
* @param WebPage $oPage
* @param array $aExtraParams
* @param string|null $sId
*

View File

@@ -1,4 +1,8 @@
<?php
use Combodo\iTop\Application\WebPage\CLIPage;
use Combodo\iTop\Application\WebPage\Page;
require_once('xlsxwriter.class.php');
class ExcelExporter

View File

@@ -15,6 +15,7 @@
//
// You should have received a copy of the GNU Affero General Public License
// along with iTop. If not, see <http://www.gnu.org/licenses/>
use Combodo\iTop\Application\WebPage\WebPage;
/**
* Helper class to build interactive forms to be used either in stand-alone
@@ -828,7 +829,7 @@ class DesignerFormField
}
/**
* @param \WebPage $oP
* @param WebPage $oP
* @param string $sFormId
* @param string $sRenderMode
*

View File

@@ -140,7 +140,11 @@ class LoginForm extends AbstractLoginFSMExtension implements iLoginUIExtension
$oLoginContext->AddBlockExtension('login_form_footer', new LoginBlockExtension('extensionblock/loginformfooter.html.twig'));
$bEnableResetPassword = MetaModel::GetConfig()->Get('forgot_password');
$sResetPasswordUrl = utils::GetAbsoluteUrlAppRoot() . 'pages/UI.php?loginop=forgot_pwd';
$sResetPasswordUrl = MetaModel::GetConfig()->Get('forgot_password.url');
if ($sResetPasswordUrl == '')
{
$sResetPasswordUrl = utils::GetAbsoluteUrlAppRoot() . 'pages/UI.php?loginop=forgot_pwd';
}
$aData = array(
'bEnableResetPassword' => $bEnableResetPassword,
'sResetPasswordUrl' => $sResetPasswordUrl,

View File

@@ -9,6 +9,7 @@
use Combodo\iTop\Application\Branding;
use Combodo\iTop\Application\TwigBase\Twig\Extension;
use Combodo\iTop\Application\WebPage\NiceWebPage;
use Twig\Environment;
use Twig\Loader\ChainLoader;
use Twig\Loader\FilesystemLoader;

View File

@@ -26,6 +26,8 @@
use Combodo\iTop\Application\Branding;
use Combodo\iTop\Application\Helper\Session;
use Combodo\iTop\Application\WebPage\ErrorPage;
use Combodo\iTop\Application\WebPage\NiceWebPage;
use Combodo\iTop\Service\Events\EventData;
use Combodo\iTop\Service\Events\EventService;
@@ -80,7 +82,7 @@ class LoginWebPage extends NiceWebPage
}
protected static $m_sLoginFailedMessage = '';
public function __construct($sTitle = null)
{
if ($sTitle === null) {
@@ -99,6 +101,15 @@ class LoginWebPage extends NiceWebPage
$this->add_linked_stylesheet(utils::GetAbsoluteUrlAppRoot().'css/font-awesome/css/all.min.css');
}
/**
* @inheritDoc
* @since 3.2.0
*/
protected function GetFaviconAbsoluteUrl()
{
return Branding::GetLoginFavIconAbsoluteUrl();
}
public static function SetLoginFailedMessage($sMessage)
{
self::$m_sLoginFailedMessage = $sMessage;
@@ -908,13 +919,13 @@ class LoginWebPage extends NiceWebPage
$aAllProfiles = array();
while ($oProfile = $oProfilesSet->Fetch())
{
$aAllProfiles[strtolower($oProfile->GetName())] = $oProfile->GetKey();
$aAllProfiles[mb_strtolower($oProfile->GetName())] = $oProfile->GetKey();
}
$aProfiles = array();
foreach ($aRequestedProfiles as $sRequestedProfile)
{
$sRequestedProfile = strtolower($sRequestedProfile);
$sRequestedProfile = mb_strtolower($sRequestedProfile);
if (isset($aAllProfiles[$sRequestedProfile]))
{
$aProfiles[] = $aAllProfiles[$sRequestedProfile];

View File

@@ -22,6 +22,7 @@
// Maintenance message display functions
// Only included by approot.inc.php
//
use Combodo\iTop\Application\WebPage\ErrorPage;
/**
* Use a setup page to display the maintenance message

View File

@@ -5,6 +5,9 @@
*/
use Combodo\iTop\Application\Helper\WebResourcesHelper;
use Combodo\iTop\Application\WebPage\ErrorPage;
use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
require_once(APPROOT.'/application/utils.inc.php');
require_once(APPROOT.'/application/template.class.inc.php');
@@ -345,7 +348,7 @@ class ApplicationMenu
/**
* Entry point to display the whole menu into the web page, used by iTopWebPage
* @param \WebPage $oPage
* @param WebPage $oPage
* @param array $aExtraParams
* @throws DictExceptionMissingString
*
@@ -419,7 +422,7 @@ EOF
/**
* Handles the display of the sub-menus (called recursively if necessary)
*
* @param \WebPage $oPage
* @param WebPage $oPage
* @param array $aMenus
* @param array $aExtraParams
* @param int $iActiveMenu

View File

@@ -21,6 +21,7 @@ use Combodo\iTop\Application\UI\Base\Component\Alert\AlertUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\FieldSet\FieldSetUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Html\Html;
use Combodo\iTop\Application\UI\Base\Component\Input\TextArea;
use Combodo\iTop\Application\WebPage\WebPage;
abstract class Query extends cmdbAbstractObject
{

View File

@@ -16,6 +16,7 @@
// You should have received a copy of the GNU Affero General Public License
// along with iTop. If not, see <http://www.gnu.org/licenses/>
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableSettings;
use Combodo\iTop\Application\WebPage\WebPage;
/**

View File

@@ -17,6 +17,9 @@
* You should have received a copy of the GNU Affero General Public License
*/
use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
require_once(APPROOT.'/application/displayblock.class.inc.php');
/**
* This class manages the special template format used internally to build the iTop web pages

View File

@@ -536,7 +536,7 @@ CSS;
if (static::HasImageExtension($sImg)
&& ! array_key_exists($sImg, $aImages))
{
$sFilePath = realpath($sImg);
$sFilePath = utils::RealPath($sImg, APPROOT);
if ($sFilePath !== false) {
$sFilePathWithSlashes = str_replace('\\', '/', $sFilePath);
$aImages[$sImg] = $sFilePathWithSlashes;
@@ -544,7 +544,7 @@ CSS;
}
$sCanonicalPath = static::CanonicalizePath($sTargetThemeFolderPath.'/'.$sImg);
$sFilePath = realpath($sCanonicalPath);
$sFilePath = utils::RealPath($sCanonicalPath, APPROOT);
if ($sFilePath !== false) {
$sFilePathWithSlashes = str_replace('\\', '/', $sFilePath);
$aImages[$sImg] = $sFilePathWithSlashes;

View File

@@ -7,6 +7,7 @@
use Combodo\iTop\Application\Helper\FormHelper;
use Combodo\iTop\Application\UI\Base\Component\Form\FormUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Core\MetaModel\FriendlyNameType;
require_once(APPROOT.'/application/displayblock.class.inc.php');
@@ -65,7 +66,7 @@ class UIExtKeyWidget
//public function __construct($sAttCode, $sClass, $sTitle, $oAllowedValues, $value, $iInputId, $bMandatory, $sNameSuffix = '', $sFieldPrefix = '', $sFormPrefix = '')
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param string $sAttCode
* @param string $sClass
* @param string $sTitle
@@ -132,7 +133,7 @@ class UIExtKeyWidget
}
/**
* @param \WebPage $oPage
* @param WebPage $oPage
* @param int $iMaxComboLength
* @param bool $bAllowTargetCreation
* @param string $sTitle
@@ -444,7 +445,7 @@ JS
/**
* Get the HTML fragment corresponding to the ext key editing widget
*
* @param \WebPage $oPage
* @param WebPage $oPage
* @param int $iMaxComboLength
* @param boolean $bAllowTargetCreation
* @param string $sTitle

View File

@@ -16,6 +16,7 @@
// You should have received a copy of the GNU Affero General Public License
// along with iTop. If not, see <http://www.gnu.org/licenses/>
use Combodo\iTop\Application\Helper\WebResourcesHelper;
use Combodo\iTop\Application\WebPage\WebPage;
/**
* Class UIHTMLEditorWidget

View File

@@ -6,6 +6,7 @@
use Combodo\iTop\Application\Helper\FormHelper;
use Combodo\iTop\Application\UI\Links\Direct\BlockDirectLinkSetEditTable;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer;
/**

View File

@@ -8,6 +8,8 @@ use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableUIBlockFactory
use Combodo\iTop\Application\UI\Base\Component\DataTable\StaticTable\FormTableRow\FormTableRow;
use Combodo\iTop\Application\UI\Links\Indirect\BlockIndirectLinkSetEditTable;
use Combodo\iTop\Application\UI\Links\Indirect\BlockObjectPickerDialog;
use Combodo\iTop\Application\WebPage\JsonPage;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Renderer\Console\ConsoleBlockRenderer;
require_once(APPROOT.'application/displayblock.class.inc.php');

View File

@@ -24,6 +24,8 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
use Combodo\iTop\Application\WebPage\WebPage;
require_once(APPROOT.'/application/displayblock.class.inc.php');
class UIPasswordWidget

View File

@@ -21,6 +21,8 @@
*/
use Combodo\iTop\Application\WebPage\WebPage;
require_once(APPROOT.'/application/displayblock.class.inc.php');
class UISearchFormForeignKeys

View File

@@ -15,6 +15,7 @@
//
// You should have received a copy of the GNU Affero General Public License
// along with iTop. If not, see <http://www.gnu.org/licenses/>
use Combodo\iTop\Application\WebPage\iTopWebPage;
/**

View File

@@ -20,7 +20,10 @@
use Combodo\iTop\Application\Helper\Session;
use Combodo\iTop\Application\UI\Base\iUIBlock;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock;
use Combodo\iTop\Application\UI\Hook\iKeyboardShortcut;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Service\Module\ModuleService;
use Combodo\iTop\Test\UnitTest\Application\utilsTest;
use ScssPhp\ScssPhp\Compiler;
use ScssPhp\ScssPhp\OutputStyle;
use ScssPhp\ScssPhp\ValueConverter;
@@ -165,7 +168,11 @@ class utils
private static $iNextId = 0;
private static $m_sAppRootUrl = null;
/**
* @var ?string
* @used-by GetAbsoluteUrlAppRoot
*/
private static $sAbsoluteUrlAppRootCache = null;
protected static function LoadParamFile($sParamFile)
{
@@ -1035,28 +1042,27 @@ class utils
return $bTrustProxies;
}
/**
* Returns the absolute URL to the application root path
*
* @param bool $bForceTrustProxy
*
* @return string The absolute URL to the application root, without the first slash
*
* @throws \Exception
*
* @since 2.7.4 $bForceTrustProxy param added
*/
/**
* Returns the absolute URL to the application root path
*
* @param bool $bForceTrustProxy
*
* @return string The absolute URL to the application root, without the first slash
*
* @throws \Exception
*
* @since 2.7.4 $bForceTrustProxy param added
*/
public static function GetAbsoluteUrlAppRoot($bForceTrustProxy = false)
{
$sUrl = static::$m_sAppRootUrl;
if ($sUrl === null || $bForceTrustProxy)
if (static::$sAbsoluteUrlAppRootCache === null || $bForceTrustProxy)
{
$sUrl = self::GetConfig()->Get('app_root_url');
if ($sUrl == '')
static::$sAbsoluteUrlAppRootCache = self::GetConfig()->Get('app_root_url');
if (static::$sAbsoluteUrlAppRootCache == '')
{
$sUrl = self::GetDefaultUrlAppRoot($bForceTrustProxy);
static::$sAbsoluteUrlAppRootCache = self::GetDefaultUrlAppRoot($bForceTrustProxy);
}
elseif (strpos($sUrl, SERVER_NAME_PLACEHOLDER) > -1)
elseif (strpos(static::$sAbsoluteUrlAppRootCache, SERVER_NAME_PLACEHOLDER) > -1)
{
if (isset($_SERVER['SERVER_NAME']))
{
@@ -1067,11 +1073,10 @@ class utils
// CLI mode ?
$sServerName = php_uname('n');
}
$sUrl = str_replace(SERVER_NAME_PLACEHOLDER, $sServerName, $sUrl);
static::$sAbsoluteUrlAppRootCache = str_replace(SERVER_NAME_PLACEHOLDER, $sServerName, static::$sAbsoluteUrlAppRootCache);
}
static::$m_sAppRootUrl = $sUrl;
}
return static::$m_sAppRootUrl;
return static::$sAbsoluteUrlAppRootCache;
}
/**
@@ -1453,7 +1458,7 @@ class utils
/**
* Merge standard menu items with plugin provided menus items
*
* @param \WebPage $oPage
* @param WebPage $oPage
* @param int $iMenuId
* @param \DBObjectSet $param
* @param array $aActions
@@ -2956,7 +2961,7 @@ HTML;
$aResultPref = [];
$aShortcutPrefs = appUserPreferences::GetPref('keyboard_shortcuts', []);
// Note: Mind the 4 blackslashes, see utils::GetClassesForInterface()
$aShortcutClasses = utils::GetClassesForInterface('iKeyboardShortcut', '', array('[\\\\/]lib[\\\\/]', '[\\\\/]node_modules[\\\\/]', '[\\\\/]test[\\\\/]', '[\\\\/]tests[\\\\/]'));
$aShortcutClasses = utils::GetClassesForInterface(iKeyboardShortcut::class, '', array('[\\\\/]lib[\\\\/]', '[\\\\/]node_modules[\\\\/]', '[\\\\/]test[\\\\/]', '[\\\\/]tests[\\\\/]'));
foreach ($aShortcutClasses as $cShortcutPlugin) {
$sTriggeredElement = $cShortcutPlugin::GetShortcutTriggeredElementSelector();

View File

@@ -24,6 +24,8 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
use Combodo\iTop\Application\WebPage\WebPage;
require_once(APPROOT.'/application/uiwizard.class.inc.php');
class WizardHelper
@@ -367,7 +369,7 @@ JS;
/**
* Add necessary JS snippets (to the page) to be executed for fields update
*
* @param \WebPage $oPage
* @param WebPage $oPage
* @return void
* @since 3.0.3-2 3.0.4 3.1.1 3.2.0 N°6766
*/

View File

@@ -11,7 +11,7 @@ define('APPCONF', APPROOT.'conf/');
*
* @see ITOP_CORE_VERSION to get full iTop core version
*/
define('ITOP_DESIGN_LATEST_VERSION', '3.1');
define('ITOP_DESIGN_LATEST_VERSION', '3.2');
/**
* Constant containing the iTop core version, whatever application was built
@@ -23,7 +23,7 @@ define('ITOP_DESIGN_LATEST_VERSION', '3.1');
* @used-by utils::GetItopVersionWikiSyntax()
* @used-by iTopModulesPhpVersionIntegrationTest
*/
define('ITOP_CORE_VERSION', '3.1.1');
define('ITOP_CORE_VERSION', '3.2.0');
/**
* @var string

View File

@@ -4,7 +4,7 @@
"type": "project",
"license": "AGPL-3.0-only",
"require": {
"php": ">=7.4.0 <8.2.0",
"php": ">=8.1.0 <8.4.0",
"ext-ctype": "*",
"ext-dom": "*",
"ext-gd": "*",
@@ -13,28 +13,32 @@
"ext-mysqli": "*",
"ext-soap": "*",
"apereo/phpcas": "~1.6.0",
"combodo/tcpdf": "~6.4.4",
"firebase/php-jwt": "~6.4.0",
"firebase/php-jwt": "^6.4.0",
"guzzlehttp/guzzle": "^7.5.1",
"laminas/laminas-mail": "^2.11",
"laminas/laminas-servicemanager": "^3.5",
"league/oauth2-google": "^3.0",
"nikic/php-parser": "~4.14.0",
"league/oauth2-google": "^4.0.1",
"nikic/php-parser": "^4.14.0",
"pear/archive_tar": "~1.4.14",
"pelago/emogrifier": "^6.0.0",
"scssphp/scssphp": "^1.10.3",
"symfony/console": "5.4.*",
"symfony/dotenv": "5.4.*",
"symfony/framework-bundle": "5.4.*",
"symfony/http-foundation": "5.4.*",
"symfony/http-kernel": "5.4.*",
"symfony/twig-bundle": "5.4.*",
"symfony/yaml": "5.4.*",
"pelago/emogrifier": "^7.2.0",
"psr/log": "^3.0.0",
"scssphp/scssphp": "^1.12.1",
"symfony/console": "~6.4.0",
"symfony/dotenv": "~6.4.0",
"symfony/framework-bundle": "~6.4.0",
"symfony/http-foundation": "~6.4.0",
"symfony/http-kernel": "~6.4.0",
"symfony/runtime": "~6.4.0",
"symfony/twig-bundle": "~6.4.0",
"symfony/var-dumper": "~6.4.0",
"symfony/yaml": "~6.4.0",
"tecnickcom/tcpdf": "^6.6.0",
"thenetworg/oauth2-azure": "^2.0"
},
"require-dev": {
"symfony/stopwatch": "5.4.*",
"symfony/web-profiler-bundle": "5.4.*"
"symfony/debug-bundle": "~6.4.0",
"symfony/stopwatch": "~6.4.0",
"symfony/web-profiler-bundle": "~6.4.0"
},
"suggest": {
"ext-libsodium": "Required to use the AttributeEncryptedString.",
@@ -46,7 +50,7 @@
},
"config": {
"platform": {
"php": "7.4.0"
"php": "8.1.0"
},
"vendor-dir": "lib",
"preferred-install": {
@@ -54,7 +58,10 @@
},
"sort-packages": true,
"classmap-authoritative": true,
"platform-check": true
"platform-check": true,
"allow-plugins": {
"symfony/runtime": true
}
},
"autoload": {
"classmap": [
@@ -72,6 +79,9 @@
"application/logindefault.class.inc.php",
"application/loginexternal.class.inc.php",
"application/loginurl.class.inc.php"
],
"files": [
"sources/alias.php"
]
},
"conflict": {
@@ -81,11 +91,15 @@
"symfony": {
"allow-contrib": false,
"require": "3.4.*"
},
"runtime": {
"dotenv_path": "symfony/.env"
}
},
"scripts": {
"post-install-cmd": ["@rmDeniedTestDir"],
"post-update-cmd": ["@rmDeniedTestDir"],
"rmDeniedTestDir": "@php .make/composer/rmDeniedTestDir.php"
"post-install-cmd": ["@rmDeniedTestDir", "@tcpdfCustomFonts"],
"post-update-cmd": ["@rmDeniedTestDir", "@tcpdfCustomFonts"],
"rmDeniedTestDir": "@php .make/composer/rmDeniedTestDir.php",
"tcpdfCustomFonts": "@php .make/composer/tcpdf/tcpdfUpdateFonts.php"
}
}

2073
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -521,6 +521,6 @@ class Str
public static function islowcase($sString)
{
return (strtolower($sString) == $sString);
return (mb_strtolower($sString) == $sString);
}
}

View File

@@ -17,6 +17,11 @@
// along with iTop. If not, see <http://www.gnu.org/licenses/>
use Combodo\iTop\Application\TwigBase\Twig\TwigHelper;
use Combodo\iTop\Application\UI\Base\Component\DataTable\DataTableUIBlockFactory;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Service\Notification\NotificationsRepository;
use Combodo\iTop\Service\Notification\NotificationsService;
use Combodo\iTop\Service\Router\Router;
/**
* Persistent classes (internal): user defined actions
@@ -76,6 +81,7 @@ abstract class Action extends cmdbAbstractObject
MetaModel::Init_AddAttribute(new AttributeLinkedSetIndirect("trigger_list",
array("linked_class" => "lnkTriggerAction", "ext_key_to_me" => "action_id", "ext_key_to_remote" => "trigger_id", "allowed_values" => null, "count_min" => 0, "count_max" => 0, "depends_on" => array(), "display_style" => 'property')));
MetaModel::Init_AddAttribute(new AttributeEnum("asynchronous", array("allowed_values" => new ValueSetEnum(['use_global_setting' => 'Use global settings','yes' => 'Yes' ,'no' => 'No']), "sql" => "asynchronous", "default_value" => 'use_global_setting', "is_null_allowed" => false, "depends_on" => array())));
// Display lists
// - Attributes to be displayed for the complete details
@@ -167,6 +173,100 @@ abstract class Action extends cmdbAbstractObject
$this->m_aCheckWarnings[] = Dict::S('Action:WarningNoTriggerLinked');
}
}
/**
* @since 3.2.0 N°5472 method creation
*/
public function DisplayBareRelations(WebPage $oPage, $bEditMode = false)
{
parent::DisplayBareRelations($oPage, false);
if ($oPage instanceof iTopWebPage) {
$this->GenerateLastExecutionsTab($oPage, $bEditMode);
}
}
/**
* @since 3.2.0 N°5472 method creation
*/
protected function GenerateLastExecutionsTab(iTopWebPage $oPage, $bEditMode)
{
$oRouter = Router::GetInstance();
$sActionLastExecutionsPageUrl = $oRouter->GenerateUrl('notifications.action.last_executions_tab', ['action_id' => $this->GetKey()]);
$oPage->AddAjaxTab('action_errors', $sActionLastExecutionsPageUrl, false, Dict::S('Action:last_executions_tab'));
}
/**
* @param \Combodo\iTop\Application\WebPage\WebPage $oPage
*
* @throws \ApplicationException
* @throws \ArchivedObjectException
* @throws \ConfigException
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \DictExceptionMissingString
* @throws \InvalidConfigParamException
* @throws \MissingQueryArgument
* @throws \MySQLException
* @throws \MySQLHasGoneAwayException
* @throws \OQLException
* @throws \ReflectionException
* @since 3.2.0 N°5472 method creation
*/
public function GetLastExecutionsTabContent(WebPage $oPage): void
{
$oConfig = utils::GetConfig();
$sLastExecutionDaysConfigParamName = 'notifications.last_executions_days';
$iLastExecutionDays = $oConfig->Get($sLastExecutionDaysConfigParamName);
if ($iLastExecutionDays < 0) {
throw new InvalidConfigParamException("Invalid value for {$sLastExecutionDaysConfigParamName} config parameter. Param desc: " . $oConfig->GetDescription($sLastExecutionDaysConfigParamName));
}
$sActionQueryOql = 'SELECT EventNotification WHERE action_id = :action_id';
$aActionQueryParams = ['action_id' => $this->GetKey()];
if ($iLastExecutionDays > 0) {
$sActionQueryOql .= ' AND date > DATE_SUB(NOW(), INTERVAL :days DAY)';
$aActionQueryParams['days'] = $iLastExecutionDays;
$sActionQueryLimit = Dict::Format('Action:last_executions_tab_limit_days', $iLastExecutionDays);
} else {
$sActionQueryLimit = Dict::S('Action:last_executions_tab_limit_none');
}
$oActionFilter = DBObjectSearch::FromOQL($sActionQueryOql, $aActionQueryParams);
$oSet = new DBObjectSet($oActionFilter, ['date' => false]);
$sPanelTitle = Dict::Format('Action:last_executions_tab_panel_title', $sActionQueryLimit);
$oExecutionsListBlock = DataTableUIBlockFactory::MakeForResult($oPage, 'action_executions_list', $oSet, ['panel_title' => $sPanelTitle]);
$oPage->AddUiBlock($oExecutionsListBlock);
}
/**
* Will be overloaded by the children classes to return the value of their global asynchronous setting (eg. `email_asynchronous` for `\ActionEmail`, `prefer_asynchronous` for `\ActionWebhook`, ...)
*
* @return bool true if the global setting for this kind of action if to be executed asynchronously, false otherwise.
* @since 3.2.0
*/
public static function GetAsynchronousGlobalSetting(): bool
{
return false;
}
/**
* @return bool true if that action instance should be executed asynchronously, otherwise false
* @throws \ArchivedObjectException
* @throws \CoreException
* @since 3.2.0
*/
public function IsAsynchronous(): bool
{
$sAsynchronous = $this->Get('asynchronous');
if ($sAsynchronous === 'use_global_setting') {
return static::GetAsynchronousGlobalSetting();
}
return $sAsynchronous === 'yes';
}
}
/**
@@ -201,12 +301,39 @@ abstract class ActionNotification extends Action
MetaModel::Init_SetZListItems('details', array('name', 'description', 'status', 'trigger_list'));
// - Attributes to be displayed for a list
MetaModel::Init_SetZListItems('list', array('finalclass', 'description', 'status'));
MetaModel::Init_AddAttribute(new AttributeApplicationLanguage("language", array("sql"=>"language", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
// Search criteria
// - Criteria of the std search form
// MetaModel::Init_SetZListItems('standard_search', array('name'));
// - Default criteria of the search form
// MetaModel::Init_SetZListItems('default_search', array('name'));
}
/**
* @param $sLanguage
* @param $sLanguageCode
*
* @return array [$sPreviousLanguage, $aPreviousPluginProperties]
* @throws \ArchivedObjectException
* @throws \CoreException
* @throws \DictExceptionUnknownLanguage
* @since 3.2.0
*/
public function SetNotificationLanguage($sLanguage = null, $sLanguageCode = null){
$sPreviousLanguage = Dict::GetUserLanguage();
$aPreviousPluginProperties = ApplicationContext::GetPluginProperties('QueryLocalizerPlugin');
$sLanguage = $sLanguage ?? $this->Get('language');
$sLanguageCode = $sLanguageCode ?? $sLanguage;
if (!utils::IsNullOrEmptyString($sLanguage)) {
// If a language is specified for this action, force this language
// when rendering all placeholders inside this message
Dict::SetUserLanguage($sLanguage);
AttributeDateTime::LoadFormatFromConfig();
ApplicationContext::SetPluginProperty('QueryLocalizerPlugin', 'language_code', $sLanguageCode);
}
return [$sPreviousLanguage, $aPreviousPluginProperties];
}
}
/**
@@ -257,6 +384,7 @@ class ActionEmail extends ActionNotification
"db_table" => "priv_action_email",
"db_key_field" => "id",
"db_finalclass_field" => "",
'style' => new ormStyle(null, null, null, null, null, '../images/icons/icons8-mailing.svg'),
);
MetaModel::Init_Params($aParams);
MetaModel::Init_InheritAttributes();
@@ -273,7 +401,6 @@ class ActionEmail extends ActionNotification
MetaModel::Init_AddAttribute(new AttributeTemplateString("subject", array("allowed_values" => null, "sql" => "subject", "default_value" => null, "is_null_allowed" => false, "depends_on" => array())));
MetaModel::Init_AddAttribute(new AttributeTemplateHTML("body", array("allowed_values" => null, "sql" => "body", "default_value" => null, "is_null_allowed" => false, "depends_on" => array())));
MetaModel::Init_AddAttribute(new AttributeEnum("importance", array("allowed_values" => new ValueSetEnum('low,normal,high'), "sql" => "importance", "default_value" => 'normal', "is_null_allowed" => false, "depends_on" => array())));
MetaModel::Init_AddAttribute(new AttributeApplicationLanguage("language", array("sql"=>"language", "default_value"=>null, "is_null_allowed"=>true, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeBlob("html_template", array("is_null_allowed"=>true, "depends_on"=>array(), "always_load_in_tables"=>false)));
MetaModel::Init_AddAttribute(new AttributeEnum("ignore_notify", array("allowed_values" => new ValueSetEnum('yes,no'), "sql" => "ignore_notify", "default_value" => 'yes', "is_null_allowed" => false, "depends_on" => array())));
@@ -294,6 +421,7 @@ class ActionEmail extends ActionNotification
),
'fieldset:ActionEmail:trigger' => array(
0 => 'trigger_list',
1 => 'asynchronous'
),
),
'col:col2' => array(
@@ -328,27 +456,33 @@ class ActionEmail extends ActionNotification
protected $m_aMailErrors; //array of strings explaining the issue
/**
* Return a the list of emails as a string, or a detailed error description
* Return the list of emails as a string, or a detailed error description
*
* @param string $sRecipAttCode
* @param array $aArgs
*
* @return string
* @throws \ArchivedObjectException
* @throws \CoreCannotSaveObjectException
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \CoreWarning
* @throws \MissingQueryArgument
* @throws \MySQLException
* @throws \MySQLHasGoneAwayException
* @throws \OQLException
*/
protected function FindRecipients($sRecipAttCode, $aArgs)
{
$oTrigger = $aArgs['trigger->object()'] ?? null;
$sOQL = $this->Get($sRecipAttCode);
if (strlen($sOQL) === 0) return '';
if (utils::IsNullOrEmptyString($sOQL)) return '';
try
{
$oSearch = DBObjectSearch::FromOQL($sOQL);
if ($this->Get('ignore_notify') === 'no') {
// In theory it is possible to notify *any* kind of object,
// In theory, it is possible to notify *any* kind of object,
// as long as there is an email attribute in the class
// So let's not assume that the selected class is a Person
$sFirstSelectedClass = $oSearch->GetClass();
@@ -381,16 +515,29 @@ class ActionEmail extends ActionNotification
return "The objects of the class '$sClass' do not have any email attribute";
}
if($oTrigger !== null && in_array('Contact', MetaModel::EnumParentClasses($sClass, ENUM_CHILD_CLASSES_ALL), true)) {
$aArgs['trigger_id'] = $oTrigger->GetKey();
$aArgs['action_id'] = $this->GetKey();
$sSubscribedContactsOQL = NotificationsRepository::GetInstance()->GetSearchOQLContactUnsubscribedByTriggerAndAction();
$sSubscribedContactsOQL->ApplyParameters($aArgs);
$sAlias = $oSearch->GetClassAlias();
$oSearch->AddConditionExpression(Expression::FromOQL("`$sAlias`.id NOT IN ($sSubscribedContactsOQL)"));
}
$oSet = new DBObjectSet($oSearch, array() /* order */, $aArgs);
$aRecipients = array();
while ($oObj = $oSet->Fetch())
{
$sAddress = trim($oObj->Get($sEmailAttCode));
if (strlen($sAddress) > 0)
if (utils::IsNotNullOrEmptyString($sAddress))
{
$aRecipients[] = $sAddress;
$this->m_iRecipients++;
}
if ($oTrigger !== null && in_array('Contact', MetaModel::EnumParentClasses($sClass, ENUM_CHILD_CLASSES_ALL), true)) {
NotificationsService::GetInstance()->RegisterSubscription($oTrigger, $this, $oObj);
}
}
return implode(', ', $aRecipients);
}
@@ -510,7 +657,7 @@ class ActionEmail extends ActionNotification
else
{
$aErrors = [];
$iRes = $oEmail->Send($aErrors, false, $oLog); // allow asynchronous mode
$iRes = $oEmail->Send($aErrors, $this->IsAsynchronous() ? Email::ENUM_SEND_FORCE_ASYNCHRONOUS : Email::ENUM_SEND_FORCE_SYNCHRONOUS, $oLog);
switch ($iRes)
{
case EMAIL_SEND_OK:
@@ -539,8 +686,17 @@ class ActionEmail extends ActionNotification
* @param \EventNotification $oLog
*
* @return array
* @throws \ArchivedObjectException
* @throws \CoreCannotSaveObjectException
* @throws \CoreException
* @throws \Exception
* @throws \CoreUnexpectedValue
* @throws \CoreWarning
* @throws \DictExceptionMissingString
* @throws \DictExceptionUnknownLanguage
* @throws \MissingQueryArgument
* @throws \MySQLException
* @throws \MySQLHasGoneAwayException
* @throws \OQLException
* @since 3.1.0 N°918
*/
protected function PrepareMessageContent($aContextArgs, &$oLog): array
@@ -561,15 +717,7 @@ class ActionEmail extends ActionNotification
'attachments' => [],
];
$sPreviousUrlMaker = ApplicationContext::SetUrlMakerClass();
$sPreviousLanguage = Dict::GetUserLanguage();
$aPreviousPluginProperties = ApplicationContext::GetPluginProperties('QueryLocalizerPlugin');
if ($this->Get('language') !== '') {
// If a language is specified for this action, force this language
// when rendering all placeholders inside this message
Dict::SetUserLanguage($this->Get('language'));
AttributeDateTime::LoadFormatFromConfig();
ApplicationContext::SetPluginProperty('QueryLocalizerPlugin', 'language_code', $this->Get('language'));
}
[$sPreviousLanguage, $aPreviousPluginProperties] = $this->SetNotificationLanguage();
try
{
@@ -601,9 +749,7 @@ class ActionEmail extends ActionNotification
}
finally {
ApplicationContext::SetUrlMakerClass($sPreviousUrlMaker);
Dict::SetUserLanguage($sPreviousLanguage);
AttributeDateTime::LoadFormatFromConfig();
ApplicationContext::SetPluginProperty('QueryLocalizerPlugin', 'language_code', $aPreviousPluginProperties['language_code'] ?? null);
$this->SetNotificationLanguage($sPreviousLanguage, $aPreviousPluginProperties['language_code'] ?? null);
}
if (!is_null($oLog)) {
@@ -658,10 +804,11 @@ class ActionEmail extends ActionNotification
if (isset($aContextArgs['attachments']))
{
$aAttachmentReport = array();
/** @var \ormDocument $oDocument */
foreach($aContextArgs['attachments'] as $oDocument)
{
$aMessageContent['attachments'][] = ['data' => $oDocument->GetData(), 'filename' => $oDocument->GetFileName(), 'mime_type' => $oDocument->GetMimeType()];
$aAttachmentReport[] = array($oDocument->GetFileName(), $oDocument->GetMimeType(), strlen($oDocument->GetData()));
$aAttachmentReport[] = array($oDocument->GetFileName(), $oDocument->GetMimeType(), strlen($oDocument->GetData() ?? ''));
}
$oLog->Set('attachments', $aAttachmentReport);
}
@@ -771,4 +918,13 @@ class ActionEmail extends ActionNotification
}
}
}
/**
* @inheritDoc
* @since 3.2.0
*/
public static function GetAsynchronousGlobalSetting(): bool
{
return utils::GetConfig()->Get('email_asynchronous');
}
}

View File

@@ -97,6 +97,31 @@ function apc_delete($key)
return $bRet1 || $bRet2;
}
/**
* Checks if APCu emulation key exists
*
* @param string|string[] $keys A string, or an array of strings, that contain keys.
*
* @return bool|string[] Returns TRUE if the key exists, otherwise FALSE
* Or if an array was passed to keys, then an array is returned that
* contains all existing keys, or an empty array if none exist.
* @since 3.2.0 N°7068
*/
function apc_exists($keys)
{
if (is_array($keys)) {
$aExistingKeys = [];
foreach ($keys as $sKey) {
if (apcFile::ExistsOneFile($sKey)) {
$aExistingKeys[] = $sKey;
}
}
return $aExistingKeys;
} else {
return apcFile::ExistsOneFile($keys);
}
}
class apcFile
{
// Check only once per request
@@ -183,6 +208,16 @@ class apcFile
return true;
}
/**
* Check if cache key exists
* @param $sKey
* @return bool
* @since 3.2.0 N°7068
*/
static public function ExistsOneFile($sKey) {
return is_file(self::GetCacheFileName('-' . $sKey)) || is_file(self::GetCacheFileName($sKey));
}
/** Get one cache entry content.
* @param $sKey
* @return bool|mixed

View File

@@ -15,6 +15,7 @@
//
// You should have received a copy of the GNU Affero General Public License
// along with iTop. If not, see <http://www.gnu.org/licenses/>
use Combodo\iTop\Service\Notification\Event\EventiTopNotificationService;
/**
@@ -457,3 +458,87 @@ class AsyncSendEmail extends AsyncTask
return '';
}
}
/**
* An async notification to be sent to iTop users
* @since 3.2.0
*/
class AsyncSendiTopNotifications extends AsyncTask {
public static function Init()
{
$aParams = array
(
"category" => "core/cmdb",
"key_type" => "autoincrement",
"name_attcode" => "created",
"state_attcode" => "",
"reconc_keys" => array(),
"db_table" => "priv_async_send_itop_notifications",
"db_key_field" => "id",
"db_finalclass_field" => "",
);
MetaModel::Init_Params($aParams);
MetaModel::Init_InheritAttributes();
MetaModel::Init_AddAttribute(new AttributeText("recipients", array("allowed_values"=>null, "sql"=>"recipients", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeExternalKey("action_id", array("targetclass"=>"Action", "allowed_values"=>null, "sql"=>"action_id", "default_value"=>null, "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeExternalKey("trigger_id", array("targetclass"=>"Trigger", "allowed_values"=>null, "sql"=>"trigger_id", "default_value"=>null, "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeText("title", array("allowed_values"=>null, "sql"=>"title", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeText("message", array("allowed_values"=>null, "sql"=>"message", "default_value"=>null, "is_null_allowed"=>false, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeInteger("object_id", array("allowed_values"=>null, "sql"=>"object_id", "default_value"=>null, "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeString("object_class", array("allowed_values"=>null, "sql"=>"object_class", "default_value"=>null, "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeText("url", array("allowed_values"=>null, "sql"=>"url", "default_value"=>null, "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
MetaModel::Init_AddAttribute(new AttributeDateTime("date", array("allowed_values"=>null, "sql"=>"date", "default_value"=>null, "is_null_allowed"=>false, "on_target_delete"=>DEL_AUTO, "depends_on"=>array())));
}
/**
* @throws \ArchivedObjectException
* @throws \CoreCannotSaveObjectException
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \CoreWarning
* @throws \MySQLException
* @throws \OQLException
*/
public static function AddToQueue(int $iActionId, int $iTriggerId, array $aRecipients, string $sMessage, string $sTitle, string $sUrl, int $iObjectId, ?string $sObjectClass): void
{
$oNew = new static();
$oNew->Set('action_id', $iActionId);
$oNew->Set('trigger_id', $iTriggerId);
$oNew->Set('recipients', json_encode($aRecipients));
$oNew->Set('message', $sMessage);
$oNew->Set('title', $sTitle);
$oNew->Set('url', $sUrl);
$oNew->Set('object_id', $iObjectId);
$oNew->Set('object_class', $sObjectClass);
$oNew->SetCurrentDate('date');
$oNew->DBInsert();
}
/**
* @inheritDoc
*/
public function DoProcess()
{
$oAction = MetaModel::GetObject('Action', $this->Get('action_id'));
$iTriggerId = $this->Get('trigger_id');
$aRecipients = json_decode($this->Get('recipients'));
$sMessage = $this->Get('message');
$sTitle = $this->Get('title');
$sUrl = $this->Get('url');
$iObjectId = $this->Get('object_id');
$sObjectClass = $this->Get('object_class');
$sDate = $this->Get('date');
foreach ($aRecipients as $iRecipientId)
{
$oEvent = EventiTopNotificationService::MakeEventFromAction($oAction, $iRecipientId, $iTriggerId, $sMessage, $sTitle, $sUrl, $iObjectId, $sObjectClass, $sDate);
$oEvent->DBInsertNoReload();
}
return "Sent";
}
}

View File

@@ -6,6 +6,7 @@
use Combodo\iTop\Application\UI\Base\Component\FieldBadge\FieldBadgeUIBlockFactory;
use Combodo\iTop\Application\UI\Links\Set\BlockLinkSetDisplayAsProperty;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Form\Field\LabelField;
use Combodo\iTop\Form\Field\TextAreaField;
use Combodo\iTop\Form\Form;
@@ -3509,7 +3510,7 @@ class AttributeBoolean extends AttributeInteger
$sProposedValue, $bLocalizedValue = false, $sSepItem = null, $sSepAttribute = null, $sSepValue = null,
$sAttributeQualifier = null
) {
$sInput = strtolower(trim($sProposedValue));
$sInput = mb_strtolower(trim($sProposedValue));
if ($bLocalizedValue)
{
switch ($sInput)
@@ -8661,6 +8662,20 @@ class AttributeImage extends AttributeBlob
parent::__construct($sCode, $aParams);
}
public function Get($sParamName)
{
$oParamValue = parent::Get($sParamName);
if ($sParamName === 'default_image') {
/** @noinspection NestedPositiveIfStatementsInspection */
if (!empty($oParamValue)) {
return utils::GetAbsoluteUrlModulesRoot() . $oParamValue;
}
}
return $oParamValue;
}
public function GetEditClass()
{
return "Image";
@@ -13004,7 +13019,7 @@ class AttributeRedundancySettings extends AttributeDBField
* Display an option (form, or current value)
*
* @param string $sCurrentValue
* @param \WebPage $oPage
* @param WebPage $oPage
* @param string $sFormPrefix
* @param bool $bEditMode
* @param string $sUserOption

View File

@@ -25,6 +25,7 @@ MetaModel::IncludeModule('application/audit.domain.class.inc.php');
MetaModel::IncludeModule('application/query.class.inc.php');
MetaModel::IncludeModule('setup/moduleinstallation.class.inc.php');
MetaModel::IncludeModule('core/event.class.inc.php');
MetaModel::IncludeModule('core/action.class.inc.php');
MetaModel::IncludeModule('core/trigger.class.inc.php');

View File

@@ -6,6 +6,9 @@
// The BOM is added at the head of exported UTF-8 CSV data, and removed (if present) from input UTF-8 data.
// This helps MS-Excel (Version > 2007, Windows only) in changing its interpretation of a CSV file (by default Excel reads data as ISO-8859-1 -not 100% sure!)
use Combodo\iTop\Application\WebPage\iTopWebPage;
use Combodo\iTop\Application\WebPage\WebPage;
define('UTF8_BOM', chr(239).chr(187).chr(191)); // 0xEF, 0xBB, 0xBF

View File

@@ -17,6 +17,9 @@
* You should have received a copy of the GNU Affero General Public License
*/
use Combodo\iTop\Application\WebPage\Page;
use Combodo\iTop\Application\WebPage\WebPage;
define('EXPORTER_DEFAULT_CHUNK_SIZE', 1000);
class BulkExportException extends Exception
@@ -391,7 +394,7 @@ abstract class BulkExport
/**
* @param \WebPage $oP
* @param WebPage $oP
* @param $sPartId
*
* @return UIContentBlock

View File

@@ -29,7 +29,7 @@ define('ITOP_APPLICATION_SHORT', 'iTop');
*
* @see ITOP_CORE_VERSION to get iTop core version
*/
define('ITOP_VERSION', '3.1.1-dev');
define('ITOP_VERSION', '3.2.0-dev');
define('ITOP_VERSION_NAME', 'Fullmoon');
define('ITOP_REVISION', 'svn');
@@ -447,14 +447,14 @@ class Config
'show_in_conf_sample' => true,
],
'export_pdf_font' => [ // @since 2.7.0 PR #49 / N°1947
'type' => 'string',
'description' => 'Font used when generating a PDF file',
'default' => 'DejaVuSans', // DejaVuSans is a UTF-8 Unicode font, embedded in the TCPPDF lib we're using
// Standard PDF fonts like helvetica or times newroman are NOT Unicode
// A new DroidSansFallback can be used to improve CJK support (se PR #49)
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => false,
'type' => 'string',
'description' => 'Font used when generating a PDF file',
'default' => 'DejaVuSans', // DejaVuSans is a UTF-8 Unicode font, embedded in the TCPPDF lib we're using
// Standard PDF fonts like helvetica or times newroman are NOT Unicode
// A new DroidSansFallback can be used to improve CJK support (se PR #49)
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'access_mode' => [
'type' => 'integer',
@@ -889,6 +889,14 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'forgot_password.url' => [
'type' => 'string',
'description' => 'Set this value to your "forgot password" service URL if it should be handled out of '.ITOP_APPLICATION_SHORT.'. Note that it will apply to all users (iTop users, LDAP users, ...)',
'default' => '',
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'deadline_format' => [
'type' => 'string',
'description' => 'The format used for displaying "deadline" attributes: any string with the following placeholders: $date$, $difference$',
@@ -1111,6 +1119,14 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'purge_data.max_chunk_size' => [
'type' => 'integer',
'description' => 'Maximum number of items deleted per loop. Used in function MetaModel::PurgeData',
'default' => 1000,
'value' => 1000,
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'max_history_length' => [
'type' => 'integer',
'description' => 'Maximum length of the history table (in the "History" tab on each object) before it gets truncated. Latest modifications are displayed first.',
@@ -1316,9 +1332,9 @@ class Config
'draft_attachments_lifetime' => [
'type' => 'integer',
'description' => 'Lifetime (in seconds) of drafts\' attachments and inline images: after this duration, the garbage collector will delete them.',
'default' => 86400,
'value' => '',
'source_of_value' => '',
'default' => 86400,
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'date_and_time_format' => [
@@ -1595,6 +1611,38 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'notifications.itop.read_notification_retention' => [
'type' => 'integer',
'description' => 'Duration in days after which iTop read notifications will be deleted',
'default' => 182,
'value' => 182,
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'notifications.itop.send_asynchronously' => [
'type' => 'bool',
'description' => 'If true then iTop notifications will be sent asynchronously',
'default' => false,
'value' => false,
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'notifications.itop.newsroom_cache_time' => [
'type' => 'integer',
'description' => 'Duration in min between each fetch for notifications in newsroom',
'default' => 5,
'value' => 5,
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'notifications.last_executions_days' => [
'type' => 'integer',
'description' => 'Number of days to display in the Action\'s last executions tab (0 means no limit)',
'default' => 30 + 31, // 2 months
'value' => 61,
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'regenerate_session_id_enabled' => [
'type' => 'bool',
'description' => 'If true then session id will be regenerated on each login, to prevent session fixation.',
@@ -1715,6 +1763,14 @@ class Config
'source_of_value' => '',
'show_in_conf_sample' => false,
],
'application.secret' => [
'type' => 'string',
'description' => 'Application secret, uses this value for encrypting the cookies used in the remember me functionality and for creating signed URIs when using ESI (Edge Side Includes).',
'default' => '',
'value' => '',
'source_of_value' => '',
'show_in_conf_sample' => false,
],
];
public function IsProperty($sPropCode)
@@ -1842,6 +1898,7 @@ class Config
* @var integer Number of seconds between two reloads of the display (standard)
*/
protected $m_iStandardReloadInterval;
/**
* @var integer Number of seconds between two reloads of the display (fast)
*/
@@ -1894,6 +1951,15 @@ class Config
*/
protected $m_iPasswordHashAlgo;
/**
* Symfony uses this value for encrypting the cookies used in the remember me functionality and for creating signed URIs when using ESI (Edge Side Includes).
*
* @see https://symfony.com/doc/current/reference/configuration/framework.html#secret
* @since 3.2.0 - N°6934 - Symfony 6.4 - upgrade Symfony bundles to 6.4
* @var string
*/
protected $m_sAppSecret;
/**
* Config constructor.
*
@@ -1938,6 +2004,7 @@ class Config
$this->m_aCharsets = array();
$this->m_bQueryCacheEnabled = DEFAULT_QUERY_CACHE_ENABLED;
$this->m_iPasswordHashAlgo = DEFAULT_HASH_ALGO;
$this->m_sAppSecret = bin2hex(random_bytes(16));
//define default encryption params according to php install
$aEncryptParams = SimpleCrypt::GetNewDefaultParams();
@@ -2098,6 +2165,7 @@ class Config
$this->m_sEncryptionLibrary = isset($MySettings['encryption_library']) ? trim($MySettings['encryption_library']) : $this->m_sEncryptionLibrary;
$this->m_aCharsets = isset($MySettings['csv_import_charsets']) ? $MySettings['csv_import_charsets'] : array();
$this->m_iPasswordHashAlgo = isset($MySettings['password_hash_algo']) ? $MySettings['password_hash_algo'] : $this->m_iPasswordHashAlgo;
$this->m_sAppSecret = isset($MySettings['application.secret']) ? trim($MySettings['application.secret']) : $this->m_sAppSecret;
}
protected function Verify()
@@ -2233,6 +2301,11 @@ class Config
return $this->m_sEncryptionKey;
}
public function GetAppSecret()
{
return $this->m_sAppSecret;
}
public function GetEncryptionLibrary()
{
return $this->m_sEncryptionLibrary;
@@ -2349,6 +2422,12 @@ class Config
$this->m_sEncryptionKey = $sKey;
}
public function SetAppSecret($sKey)
{
$this->m_sAppSecret = $sKey;
}
public function SetCSVImportCharsets($aCharsets)
{
$this->m_aCharsets = $aCharsets;
@@ -2400,6 +2479,7 @@ class Config
$aSettings['encryption_library'] = $this->m_sEncryptionLibrary;
$aSettings['csv_import_charsets'] = $this->m_aCharsets;
$aSettings['password_hash_algo'] = $this->m_iPasswordHashAlgo;
$aSettings['application.secret'] = $this->m_sAppSecret;
foreach ($this->m_aModuleSettings as $sModule => $aProperties)
{
@@ -2490,9 +2570,9 @@ class Config
// Old fashioned integer settings
$aIntValues = array(
'fast_reload_interval' => $this->m_iFastReloadInterval,
'max_display_limit' => $this->m_iMaxDisplayLimit,
'min_display_limit' => $this->m_iMinDisplayLimit,
'fast_reload_interval' => $this->m_iFastReloadInterval,
'max_display_limit' => $this->m_iMaxDisplayLimit,
'min_display_limit' => $this->m_iMinDisplayLimit,
'standard_reload_interval' => $this->m_iStandardReloadInterval,
);
foreach ($aIntValues as $sKey => $iValue)
@@ -2512,7 +2592,8 @@ class Config
'encryption_key' => $this->m_sEncryptionKey,
'encryption_library' => $this->m_sEncryptionLibrary,
'csv_import_charsets' => $this->m_aCharsets,
'password_hash_algo' => $this->m_iPasswordHashAlgo
'password_hash_algo' => $this->m_iPasswordHashAlgo,
'application.secret' => $this->m_sAppSecret,
);
foreach ($aOtherValues as $sKey => $value)
{

View File

@@ -8,11 +8,13 @@ use Combodo\iTop\Application\UI\Base\Component\FieldSet\FieldSetUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Html\Html;
use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\Select\SelectOptionUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\SelectUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\Select\SelectUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\Column\ColumnUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\MultiColumnUIBlockFactory;
use Combodo\iTop\Application\Helper\ExportHelper;
use Combodo\iTop\Application\WebPage\Page;
use Combodo\iTop\Application\WebPage\WebPage;
/**
* Bulk export: CSV export
@@ -101,7 +103,7 @@ class CSVBulkExport extends TabularBulkExport
}
/**
* @param \WebPage $oP
* @param WebPage $oP
* @param $sPartId
*
* @return UIContentBlock

View File

@@ -1,5 +1,416 @@
<?xml version="1.0" encoding="UTF-8"?>
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.1">
<itop_design xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.2">
<classes>
<class id="lnkActionNotificationToContact" _delta="define">
<parent>cmdbAbstractObject</parent>
<properties>
<category>core/cmdb,application</category>
<abstract>false</abstract>
<key_type>autoincrement</key_type>
<db_table>priv_lnk_action_notif_to_contact</db_table>
<db_key_field>id</db_key_field>
<db_final_class_field/>
<naming>
<attributes>
<attribute id="action_id"/>
<attribute id="contact_id"/>
</attributes>
</naming>
<uniqueness_rules>
<rule>
<attributes>
<attribute id="action_id"/>
<attribute id="contact_id"/>
<attribute id="trigger_id"/>
</attributes>
<filter/>
<disabled>false</disabled>
<is_blocking>true</is_blocking>
</rule>
</uniqueness_rules>
</properties>
<fields>
<field id="action_id" xsi:type="AttributeExternalKey">
<sql>action_id</sql>
<target_class>ActionNotification</target_class>
<default_value/>
<is_null_allowed>false</is_null_allowed>
</field>
<field id="contact_id" xsi:type="AttributeExternalKey">
<sql>contact_id</sql>
<target_class>Contact</target_class>
<default_value/>
<is_null_allowed>false</is_null_allowed>
</field>
<field id="trigger_id" xsi:type="AttributeExternalKey">
<sql>trigger_id</sql>
<target_class>Trigger</target_class>
<default_value/>
<is_null_allowed>false</is_null_allowed>
</field>
<field id="subscribed" xsi:type="AttributeBoolean">
<sql>subscribed</sql>
<default_value>true</default_value>
<is_null_allowed>false</is_null_allowed>
</field>
</fields>
<presentation>
<details>
<items>
<item id="col:col1">
<items>
<item id="fieldset:lnkActionNotificationToContact:content">
<items>
<item id="action_id">
<rank>10</rank>
</item>
<item id="contact_id">
<rank>20</rank>
</item>
<item id="title">
<rank>30</rank>
</item>
</items>
</item>
</items>
</item>
</items>
</details>
<list>
<items>
<item id="action_id">
<rank>10</rank>
</item>
<item id="contact_id">
<rank>20</rank>
</item>
<item id="title">
<rank>30</rank>
</item>
</items>
</list>
</presentation>
<methods/>
</class>
<class id="ActioniTopNotification" _delta="define">
<php_parent>
<name>ActionNotification</name>
</php_parent>
<parent>cmdbAbstractObject</parent>
<properties>
<category>grant_by_profile,core/cmdb,application</category>
<abstract>false</abstract>
<key_type>autoincrement</key_type>
<db_table>priv_action_itop_notif</db_table>
<db_key_field>id</db_key_field>
<db_final_class_field/>
<naming>
<attributes>
<attribute id="name"/>
</attributes>
</naming>
<style>
<icon>../../images/icons/icons8-notification.svg</icon>
</style>
</properties>
<fields>
<field id="title" xsi:type="AttributeString">
<sql>title</sql>
<default_value/>
<is_null_allowed>false</is_null_allowed>
</field>
<field id="message" xsi:type="AttributeText">
<sql>message</sql>
<default_value/>
<is_null_allowed>true</is_null_allowed>
</field>
<field id="icon" xsi:type="AttributeImage">
<sql>icon</sql>
<default_value/>
<is_null_allowed>true</is_null_allowed>
<display_max_width>96</display_max_width>
<display_max_height>96</display_max_height>
<storage_max_width>256</storage_max_width>
<storage_max_height>256</storage_max_height>
<default_image />
</field>
<field id="priority" xsi:type="AttributeEnum">
<sql>priority</sql>
<values>
<value id="1">
<code>1</code>
</value>
<value id="2">
<code>2</code>
</value>
<value id="3">
<code>3</code>
</value>
<value id="4">
<code>4</code>
</value>
</values>
<default_value>4</default_value>
<is_null_allowed>false</is_null_allowed>
</field>
<field id="recipients" xsi:type="AttributeOQL">
<sql>recipients</sql>
<default_value/>
<is_null_allowed>false</is_null_allowed>
</field>
<field id="url" xsi:type="AttributeString">
<sql>url</sql>
<default_value>$this->url()$</default_value>
<is_null_allowed>false</is_null_allowed>
</field>
</fields>
<presentation>
<details>
<items>
<item id="col:col1">
<items>
<item id="fieldset:ActioniTopNotification:content">
<items>
<item id="name">
<rank>10</rank>
</item>
<item id="status">
<rank>20</rank>
</item>
<item id="language">
<rank>30</rank>
</item>
<item id="title">
<rank>40</rank>
</item>
<item id="message">
<rank>50</rank>
</item>
</items>
</item>
<item id="fieldset:ActioniTopNotification:trigger">
<items>
<item id="trigger_list">
<rank>10</rank>
</item>
<item id="asynchronous">
<rank>20</rank>
</item>
</items>
</item>
</items>
</item>
<item id="col:col2">
<items>
<item id="fieldset:ActioniTopNotification:settings">
<items>
<item id="priority">
<rank>10</rank>
</item>
<item id="icon">
<rank>20</rank>
</item>
<item id="recipients">
<rank>30</rank>
</item>
<item id="url">
<rank>40</rank>
</item>
</items>
</item>
</items>
</item>
</items>
</details>
<list>
<items>
<item id="title">
<rank>10</rank>
</item>
<item id="status">
<rank>20</rank>
</item>
<item id="language">
<rank>30</rank>
</item>
</items>
</list>
</presentation>
<methods>
<method id="DoExecute">
<comment> /**
*
* Create EventiTopNotification for each recipient
* @param $oTrigger
* @param $aContextArgs
*
* @return void
* @throws \ArchivedObjectException
* @throws \CoreCannotSaveObjectException
* @throws \CoreException
* @throws \CoreUnexpectedValue
* @throws \CoreWarning
* @throws \MySQLException
* @throws \OQLException
*/</comment>
<static>false</static>
<access>public</access>
<code><![CDATA[
public function DoExecute($oTrigger, $aContextArgs)
{
$oRecipientsSearch = DBObjectSearch::FromOQL($this->Get('recipients'));
$oRecipientsSearch->AllowAllData();
$oRecipientsSet = new DBObjectSet($oRecipientsSearch);
$bIsAsync = $this->IsAsynchronous();
[$sPreviousLanguage, $aPreviousPluginProperties] = $this->SetNotificationLanguage();
if($bIsAsync === true){
$aRecipients = [];
}
$sMessage = MetaModel::ApplyParams($this->Get('message'), $aContextArgs);
$sTitle = MetaModel::ApplyParams($this->Get('title'), $aContextArgs);
$sUrl = MetaModel::ApplyParams($this->Get('url'), $aContextArgs);
$iObjectId = 0;
$sObjectClass = null;
if (array_key_exists('this->object()', $aContextArgs)) {
$iObjectId = $aContextArgs['this->object()']->GetKey();
$sObjectClass = get_class($aContextArgs['this->object()']);
}
while ($oRecipient = $oRecipientsSet->Fetch()) {
// Skip recipients that have no users
if (get_class($oRecipient) === Person::class && UserRights::GetUserFromPerson($oRecipient) === null) {
continue;
}
if (!\Combodo\iTop\Service\Notification\NotificationsService::GetInstance()->IsSubscribed($oTrigger, $this, $oRecipient)) {
continue;
}
if($bIsAsync === true) {
$aRecipients[] = $oRecipient->GetKey();
} else {
$oEvent = Combodo\iTop\Service\Notification\Event\EventiTopNotificationService::MakeEventFromAction($this, $oRecipient->GetKey(), $oTrigger->GetKey(), $sMessage, $sTitle, $sUrl, $iObjectId, $sObjectClass);
$oEvent->DBInsertNoReload();
}
\Combodo\iTop\Service\Notification\NotificationsService::GetInstance()->RegisterSubscription($oTrigger, $this, $oRecipient);
}
if ($bIsAsync === true) {
AsyncSendiTopNotifications::AddToQueue($this->GetKey(), $oTrigger->GetKey(), $aRecipients, $sMessage, $sTitle, $sUrl, $iObjectId, $sObjectClass);
}
$this->SetNotificationLanguage($sPreviousLanguage, $aPreviousPluginProperties['language_code'] ?? null);
}
]]></code>
</method>
<method id="GetAsynchronousGlobalSetting">
<comment></comment>
<static>true</static>
<access>public</access>
<code><![CDATA[
public static function GetAsynchronousGlobalSetting(): bool
{
return utils::GetConfig()->Get('notifications.itop.send_asynchronously');
}
]]></code>
</method>
</methods>
</class>
<class id="EventiTopNotification" _delta="define">
<php_parent>
<name>EventNotification</name>
</php_parent>
<parent>cmdbAbstractObject</parent>
<properties>
<category>core/cmdb,view_in_gui</category>
<abstract>false</abstract>
<key_type>autoincrement</key_type>
<db_table>priv_event_itop_notif</db_table>
<db_key_field>id</db_key_field>
<db_final_class_field/>
<naming>
<attributes>
<attribute id="title"/>
</attributes>
</naming>
</properties>
<fields>
<field id="title" xsi:type="AttributeString">
<sql>title</sql>
<default_value/>
<is_null_allowed>false</is_null_allowed>
</field>
<field id="icon" xsi:type="AttributeImage">
<sql>icon</sql>
<default_value/>
<is_null_allowed>true</is_null_allowed>
<default_image />
</field>
<field id="priority" xsi:type="AttributeEnum">
<sql>priority</sql>
<values>
<value id="1">
<code>1</code>
</value>
<value id="2">
<code>2</code>
</value>
<value id="3">
<code>3</code>
</value>
<value id="4">
<code>4</code>
</value>
</values>
<default_value>4</default_value>
<is_null_allowed>false</is_null_allowed>
</field>
<field id="url" xsi:type="AttributeURL">
<sql>url</sql>
<default_value/>
<is_null_allowed>false</is_null_allowed>
<target>_blank</target>
</field>
<field id="read" xsi:type="AttributeEnum">
<sql>read</sql>
<values>
<value id="yes">
<code>yes</code>
</value>
<value id="no">
<code>no</code>
</value>
</values>
<default_value>no</default_value>
<is_null_allowed>false</is_null_allowed>
</field>
<field id="read_date" xsi:type="AttributeDateTime">
<sql>read_date</sql>
<default_value/>
<is_null_allowed>true</is_null_allowed>
</field>
<field id="contact_id" xsi:type="AttributeExternalKey">
<sql>contact_id</sql>
<target_class>Contact</target_class>
<default_value/>
<is_null_allowed>false</is_null_allowed>
</field>
</fields>
<presentation>
<summary>
<items>
<item id="date">
<rank>10</rank>
</item>
<item id="message">
<rank>20</rank>
</item>
</items>
</summary>
</presentation>
<methods/>
</class>
</classes>
<user_rights>
<profiles>
<profile id="1024" _delta="define">
@@ -282,8 +693,50 @@
<field id="obj_attcode" xsi:type="AttributeString"/>
</fields>
</class>
<class id="DefaultWorkingTimeComputer" _delta="define">
<interfaces>
<interface id="iWorkingTimeComputer"/>
</interfaces>
</class>
<class id="ActionNotification" _delta="define">
<!-- Generated by toolkit/export-class-to-meta.php -->
<parent>Action</parent>
<properties>
<category>grant_by_profile,core/cmdb</category>
</properties>
<fields>
<field id="name" xsi:type="AttributeString"/>
<field id="description" xsi:type="AttributeString"/>
<field id="status" xsi:type="AttributeEnum"/>
<field id="trigger_list" xsi:type="AttributeLinkedSetIndirect"/>
<field id="language" xsi:type="AttributeApplicationLanguage"/>
</fields>
</class>
<class id="EventNotification" _delta="define">
<!-- Generated by toolkit/export-class-to-meta.php -->
<parent>Event</parent>
<properties>
<category>core/cmdb,view_in_gui</category>
</properties>
<fields>
<field id="message" xsi:type="AttributeText"/>
<field id="date" xsi:type="AttributeDateTime"/>
<field id="userinfo" xsi:type="AttributeString"/>
<field id="trigger_id" xsi:type="AttributeExternalKey">
<target_class>Trigger</target_class>
</field>
<field id="action_id" xsi:type="AttributeExternalKey">
<target_class>Action</target_class>
</field>
<field id="object_id" xsi:type="AttributeInteger"/>
<field id="trigger_id_friendlyname" xsi:type="AttributeExternalField"/>
<field id="trigger_id_finalclass_recall" xsi:type="AttributeExternalField"/>
<field id="action_id_friendlyname" xsi:type="AttributeExternalField"/>
<field id="action_id_finalclass_recall" xsi:type="AttributeExternalField"/>
</fields>
</class>
</classes>
<attribute_properties_definition _delta="define">
<attribute_properties_definition _delta="define">
<properties>
<property id="sql">
<php_param>sql</php_param>

View File

@@ -4,12 +4,14 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Core\MetaModel\FriendlyNameType;
use Combodo\iTop\Service\Events\EventData;
use Combodo\iTop\Service\Events\EventException;
use Combodo\iTop\Service\Events\EventService;
use Combodo\iTop\Service\Events\EventServiceLog;
use Combodo\iTop\Service\Module\ModuleService;
use Combodo\iTop\Service\SummaryCard\SummaryCardService;
use Combodo\iTop\Service\TemporaryObjects\TemporaryObjectManager;
/**
@@ -2355,6 +2357,8 @@ abstract class DBObject implements iDisplay
$oUniquenessQuery->AddConditionForInOperatorUsingParam('finalclass', $aChildClassesWithRuleDisabled, false);
}
$oUniquenessQuery->AllowAllData();
return $oUniquenessQuery;
}
@@ -4740,7 +4744,7 @@ abstract class DBObject implements iDisplay
}
}
$oDate->modify($sModifier);
$this->Set($sAttCode, $oDate->format('Y-m-d H:i:s'));
$this->Set($sAttCode, $oDate->getTimestamp());
}
/**

View File

@@ -6,7 +6,102 @@
/** @internal Dev hack for disabling some query build optimizations (Folding/Merging) */
define('ENABLE_OPT', true);
class DBSharedSearch extends DBObjectSearch {
public function MakeSelectQuery($aOrderBy = array(), $aArgs = array(), $aAttToLoad = null, $aExtendedDataSpec = null, $iLimitCount = 0, $iLimitStart = 0, $bGetCount = false, $bBeautifulSQL = true)
{
// Check the order by specification, and prefix with the class alias
// and make sure that the ordering columns are going to be selected
//
$sClass = $this->GetClass();
$sClassAlias = $this->GetClassAlias();
$aOrderSpec = array();
foreach ($aOrderBy as $sFieldAlias => $bAscending)
{
if (!is_bool($bAscending))
{
throw new CoreException("Wrong direction in ORDER BY spec, found '$bAscending' and expecting a boolean value");
}
$iDotPos = strpos($sFieldAlias, '.');
if ($iDotPos === false)
{
$sAttClass = $sClass;
$sAttClassAlias = $sClassAlias;
$sAttCode = $sFieldAlias;
}
else
{
$sAttClassAlias = substr($sFieldAlias, 0, $iDotPos);
$sAttClass = $this->GetClassName($sAttClassAlias);
$sAttCode = substr($sFieldAlias, $iDotPos + 1);
}
if ($sAttCode != 'id')
{
MyHelpers::CheckValueInArray('field name in ORDER BY spec', $sAttCode, MetaModel::GetAttributesList($sAttClass));
$oAttDef = MetaModel::GetAttributeDef($sAttClass, $sAttCode);
foreach($oAttDef->GetOrderBySQLExpressions($sAttClassAlias) as $sSQLExpression)
{
$aOrderSpec[$sSQLExpression] = $bAscending;
}
}
else
{
$aOrderSpec['`'.$sAttClassAlias.$sAttCode.'`'] = $bAscending;
}
// Make sure that the columns used for sorting are present in the loaded columns
if (!is_null($aAttToLoad) && !isset($aAttToLoad[$sAttClassAlias][$sAttCode]))
{
$aAttToLoad[$sAttClassAlias][$sAttCode] = MetaModel::GetAttributeDef($sAttClass, $sAttCode);
}
}
/*******START difference with MakeSelectQuery **************/
$sClass = key($aAttToLoad);
$sKey = $aAttToLoad[$sClass][0];
$oObjId = new FieldExpression($sKey, $sClass);
$oSQLQuery = $this->GetSQLQuery($aOrderBy, $aArgs, [], $aExtendedDataSpec, $iLimitCount, $iLimitStart, $bGetCount, null, [$oObjId] );
/********END difference with MakeSelectQuery*************/
if ($this->m_bNoContextParameters)
{
// Only internal parameters
$aScalarArgs = $this->GetInternalParams();
}
else
{
// The complete list of arguments will include magic arguments (e.g. current_user->attcode)
$aScalarArgs = MetaModel::PrepareQueryArguments($aArgs, $this->GetInternalParams(), $this->GetExpectedArguments());
}
try
{
$sRes = $oSQLQuery->RenderSelect($aOrderSpec, $aScalarArgs, $iLimitCount, $iLimitStart, $bGetCount, $bBeautifulSQL);
if ($sClassAlias == '_itop_')
{
IssueLog::Info('SQL Query (_itop_): '.$sRes);
}
}
catch (MissingQueryArgument $e)
{
// Add some information...
$e->addInfo('OQL', $this->ToOQL());
throw $e;
}
$this->AddQueryTraceSelect($oSQLQuery->GetSourceOQL(), $aOrderBy, $aScalarArgs, $aAttToLoad, $aExtendedDataSpec, $iLimitCount, $iLimitStart, $bGetCount, $sRes);
return $sRes;
}
protected function GetSQLQuery($aOrderBy, $aArgs, $aAttToLoad, $aExtendedDataSpec, $iLimitCount, $iLimitStart, $bGetCount, $aGroupByExpr = null, $aSelectExpr = null)
{
$oSQLQuery = parent::GetSQLQuery($aOrderBy, $aArgs, $aAttToLoad, $aExtendedDataSpec, $iLimitCount, $iLimitStart, $bGetCount, $aGroupByExpr, $aSelectExpr);
$oSQLQuery->SetSelect($aSelectExpr);
return $oSQLQuery;
}
}
/**
* A search over a DBObject
*
@@ -909,15 +1004,15 @@ class DBObjectSearch extends DBSearch
*/
public function AddCondition_PointingTo(DBObjectSearch $oFilter, $sExtKeyAttCode, $iOperatorCode = TREE_OPERATOR_EQUALS, &$aRealiasingMap = null)
{
if (!MetaModel::IsValidKeyAttCode($this->GetClass(), $sExtKeyAttCode))
if (!MetaModel::IsValidKeyAttCode($this->GetClass(), $sExtKeyAttCode))
{
throw new CoreWarning("The attribute code '$sExtKeyAttCode' is not an external key of the class '{$this->GetClass()}'");
}
$oAttExtKey = MetaModel::GetAttributeDef($this->GetClass(), $sExtKeyAttCode);
if(!MetaModel::IsSameFamilyBranch($oFilter->GetClass(), $oAttExtKey->GetTargetClass()))
{
throw new CoreException("The specified filter (pointing to {$oFilter->GetClass()}) is not compatible with the key '{$this->GetClass()}::$sExtKeyAttCode', which is pointing to {$oAttExtKey->GetTargetClass()}");
}
throw new CoreException("The specified filter (pointing to {$oFilter->GetClass()}) is not compatible with the key '{$this->GetClass()}::$sExtKeyAttCode', which is pointing to {$oAttExtKey->GetTargetClass()}");
}
if(($iOperatorCode != TREE_OPERATOR_EQUALS) && !($oAttExtKey instanceof AttributeHierarchicalKey))
{
throw new CoreException("The specified tree operator $iOperatorCode is not applicable to the key '{$this->GetClass()}::$sExtKeyAttCode', which is not a HierarchicalKey");
@@ -1616,6 +1711,10 @@ class DBObjectSearch extends DBSearch
{
return NestedQueryExpression::FromOQLObjectQuery($oExpression->GetOQLObjectQuery());
}
elseif ($oExpression instanceof SharedQueryExpression)
{
return SharedQueryExpression::FromOQLObjectQuery($oExpression->GetOQLObjectQuery());
}
else
{
throw new CoreException('Unknown expression type', array('class'=>get_class($oExpression), 'query'=>$sQuery));

View File

@@ -64,16 +64,22 @@ class DesignDocument extends DOMDocument
/**
* Overload of the standard API
*
* @param $filename
* @param string $filename
* @param int $options
*
* @return bool
*/
public function load($filename, $options = null)
public function load(string $filename, int $options = 0): bool
{
libxml_clear_errors();
if (parent::load($filename, LIBXML_NOBLANKS) === false) {
$aErrors = libxml_get_errors();
IssueLog::Error("Error loading $filename", LogAPI::CHANNEL_DEFAULT, $aErrors);
return false;
}
return true;
}
/**

View File

@@ -21,6 +21,9 @@ use Combodo\iTop\Application\UI\Base\Component\MedallionIcon\MedallionIcon;
use Combodo\iTop\Application\UI\Base\Component\Panel\Panel;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlock;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory;
use Combodo\iTop\Application\WebPage\iTopPDF;
use Combodo\iTop\Application\WebPage\PDFPage;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Renderer\BlockRenderer;
/**
@@ -34,6 +37,7 @@ class DisplayableNode extends GraphNode
{
public $x;
public $y;
public bool $bFiltered;
/**
* Create a new node inside a graph
@@ -1580,7 +1584,7 @@ EOF
* @param string $sContextKey
* @param array $aContextParams
* @param array $aExcludedObjects
* @param \WebPage $oP
* @param WebPage $oP
* @param array $aResults
* @param bool $bLazyLoading
*
@@ -1602,7 +1606,7 @@ EOF
}
/**
* @param \WebPage $oP
* @param WebPage $oP
* @param array $aResults
* @param bool $bLazyLoading
*

View File

@@ -46,6 +46,15 @@ class EMail implements iEMail
const ORIGINAL_FORMAT = 1; // Original format, consisting in serializing the whole object, inculding the Swift Mailer's object.
// Did not work with attachements since their binary representation cannot be stored as a valid UTF-8 string
const FORMAT_V2 = 2; // New format, only the raw data are serialized (base64 encoded if needed)
/** @var int ENUM_SEND_DEFAULT This option can be used when sending an e-mail to respect the default configuration parameter. */
const ENUM_SEND_DEFAULT = 0;
/** @var int ENUM_SEND_FORCE_SYNCHRONOUS This option can be used when sending an e-mail to ignore the default and force synchronous sending instead. Example of a use case: instant e-mail test. */
const ENUM_SEND_FORCE_SYNCHRONOUS = 1;
/** @var int ENUM_SEND_FORCE_ASYNCHRONOUS This option can be used when sending an e-mail to ignore the default and force synchronous sending instead. Example of a use case: Bulk mails. */
const ENUM_SEND_FORCE_ASYNCHRONOUS = 2;
public function __construct()
{

View File

@@ -1,4 +1,7 @@
<?php
use Combodo\iTop\Application\WebPage\WebPage;
/**
* Copyright (C) 2013-2023 Combodo SARL
*

View File

@@ -11,6 +11,8 @@ use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\Column\ColumnUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\MultiColumnUIBlockFactory;
use Combodo\iTop\Application\Helper\ExportHelper;
use Combodo\iTop\Application\WebPage\Page;
use Combodo\iTop\Application\WebPage\WebPage;
require_once(APPROOT.'application/xlsxwriter.class.php');
@@ -69,7 +71,7 @@ class ExcelBulkExport extends TabularBulkExport
}
/**
* @param \WebPage $oP
* @param WebPage $oP
* @param $sPartId
*
* @return UIContentBlock

View File

@@ -15,6 +15,8 @@
//
// You should have received a copy of the GNU Affero General Public License
// along with iTop. If not, see <http://www.gnu.org/licenses/>
use Combodo\iTop\Application\WebPage\Page;
use Combodo\iTop\Application\WebPage\WebPage;
/**
* Bulk export: HTML export
@@ -37,7 +39,7 @@ class HTMLBulkExport extends TabularBulkExport
}
/**
* @param \WebPage $oP
* @param WebPage $oP
* @param $sPartId
*
* @return UIContentBlock

View File

@@ -1090,6 +1090,11 @@ class DeadLockLog extends LogAPI
*/
class DeprecatedCallsLog extends LogAPI
{
/**
* @var string
* @since 3.2.0 N°4897
*/
public const ENUM_CHANNEL_PHP_API = 'deprecated-php-api';
public const ENUM_CHANNEL_PHP_METHOD = 'deprecated-php-method';
/**
* @var string
@@ -1283,6 +1288,35 @@ class DeprecatedCallsLog extends LogAPI
static::Warning($sMessage, static::ENUM_CHANNEL_FILE);
}
/**
* @param string $sImplementationClass Class implementing the deprecated API
* @param string $sDeprecatedApi Class name of the deprecated API
* @param string $sDeprecatedMethod Method name of the deprecated API
* @param string|null $sAdditionalMessage Additional message, mostly used to explain what API to use instead
*
* @return void
* @since 3.2.0 N°4897
*/
public static function NotifyDeprecatedPhpApi(string $sImplementationClass, string $sDeprecatedApi, string $sDeprecatedMethod, ?string $sAdditionalMessage = null): void
{
try {
if (!static::IsLogLevelEnabled(self::LEVEL_WARNING, self::ENUM_CHANNEL_PHP_API)) {
return;
}
}
catch (ConfigException $oException) {
return;
}
$sMessage = "Implementation of {$sDeprecatedApi}::{$sDeprecatedMethod}() in class {$sImplementationClass}";
if (!is_null($sAdditionalMessage)) {
$sMessage .= " : $sAdditionalMessage";
}
static::Warning($sMessage, self::ENUM_CHANNEL_PHP_API);
}
/**
* @param string|null $sAdditionalMessage
*

View File

@@ -7168,32 +7168,45 @@ abstract class MetaModel
*/
public static function PurgeData($oFilter)
{
$iMaxChunkSize = MetaModel::GetConfig()->Get('purge_data.max_chunk_size');
$sTargetClass = $oFilter->GetClass();
$oSet = new DBObjectSet($oFilter);
$oSet->OptimizeColumnLoad(array($sTargetClass => array('finalclass')));
$aIdToClass = $oSet->GetColumnAsArray('finalclass', true);
$iNbIdsDeleted = 0;
$bExecuteQuery = true;
$aIds = array_keys($aIdToClass);
if (count($aIds) > 0)
{
$aQuotedIds = CMDBSource::Quote($aIds);
$sIdList = implode(',', $aQuotedIds);
$aTargetClasses = array_merge(
self::EnumChildClasses($sTargetClass, ENUM_CHILD_CLASSES_ALL),
self::EnumParentClasses($sTargetClass, ENUM_PARENT_CLASSES_EXCLUDELEAF)
);
foreach($aTargetClasses as $sSomeClass)
{
$sTable = MetaModel::DBGetTable($sSomeClass);
$sPKField = MetaModel::DBGetKey($sSomeClass);
// This loop allows you to delete objects in batches of $iMaxChunkSize elements
while ($bExecuteQuery) {
$oSet = new DBObjectSet($oFilter);
$oSet->SetLimit($iMaxChunkSize);
$oSet->OptimizeColumnLoad(array($sTargetClass => array('finalclass')));
$aIdToClass = $oSet->GetColumnAsArray('finalclass', true);
$sDeleteSQL = "DELETE FROM `$sTable` WHERE `$sPKField` IN ($sIdList)";
CMDBSource::DeleteFrom($sDeleteSQL);
$aIds = array_keys($aIdToClass);
$iNbIds = count($aIds);
if ($iNbIds > 0) {
$aQuotedIds = CMDBSource::Quote($aIds);
$sIdList = implode(',', $aQuotedIds);
$aTargetClasses = array_merge(
self::EnumChildClasses($sTargetClass, ENUM_CHILD_CLASSES_ALL),
self::EnumParentClasses($sTargetClass, ENUM_PARENT_CLASSES_EXCLUDELEAF)
);
foreach ($aTargetClasses as $sSomeClass) {
$sTable = MetaModel::DBGetTable($sSomeClass);
$sPKField = MetaModel::DBGetKey($sSomeClass);
$sDeleteSQL = "DELETE FROM `$sTable` WHERE `$sPKField` IN ($sIdList)";
CMDBSource::DeleteFrom($sDeleteSQL);
}
$iNbIdsDeleted += $iNbIds;
}
// stop loop if query returned fewer objects than $iMaxChunkSize. In this case, all objects have been deleted.
if ($iNbIds < $iMaxChunkSize) {
$bExecuteQuery = false;
}
}
return count($aIds);
}
return $iNbIdsDeleted;
}
// Links
//
//

View File

@@ -739,7 +739,7 @@ class PHP_ParserGenerator
while (isset($errmsg[$restart]) && $errmsg[$restart] == ' ') {
$restart++;
}
printf("%s%.${end}s\n", $prefix, $errmsg);
printf("%s%.{$end}s\n", $prefix, $errmsg);
$errmsg = substr($errmsg, $restart);
}
}
@@ -771,7 +771,7 @@ class PHP_ParserGenerator
for ($j = $i; $j < $this->nsymbol; $j += $skip) {
$sp = $this->symbols[$j];
//assert( sp->index==j );
printf(" %3d %-${maxlen}.${maxlen}s", $j, $sp->name);
printf(" %3d %-{$maxlen}.{$maxlen}s", $j, $sp->name);
}
print "\n";
}

View File

@@ -231,19 +231,19 @@ class PHP_ParserGenerator_Action
switch ($this->type)
{
case self::SHIFT:
fprintf($fp, "%${indent}s shift %d", $this->sp->name, $this->x->statenum);
fprintf($fp, "%{$indent}s shift %d", $this->sp->name, $this->x->statenum);
break;
case self::REDUCE:
fprintf($fp, "%${indent}s reduce %d", $this->sp->name, $this->x->index);
fprintf($fp, "%{$indent}s reduce %d", $this->sp->name, $this->x->index);
break;
case self::ACCEPT:
fprintf($fp, "%${indent}s accept", $this->sp->name);
fprintf($fp, "%{$indent}s accept", $this->sp->name);
break;
case self::ERROR:
fprintf($fp, "%${indent}s error", $this->sp->name);
fprintf($fp, "%{$indent}s error", $this->sp->name);
break;
case self::CONFLICT:
fprintf($fp, "%${indent}s reduce %-3d ** Parsing conflict **", $this->sp->name, $this->x->index);
fprintf($fp, "%{$indent}s reduce %-3d ** Parsing conflict **", $this->sp->name, $this->x->index);
break;
case self::SH_RESOLVED:
case self::RD_RESOLVED:

View File

@@ -20,6 +20,7 @@ use Combodo\iTop\Application\UI\Base\Component\CollapsibleSection\CollapsibleSec
use Combodo\iTop\Application\UI\Base\Component\Html\Html;
use Combodo\iTop\Application\UI\Base\iUIBlock;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory;
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Renderer\BlockRenderer;
define('CASELOG_VISIBLE_ITEMS', 2);

View File

@@ -17,6 +17,7 @@
* You should have received a copy of the GNU Affero General Public License
*/
use Combodo\iTop\Application\WebPage\WebPage;
use Combodo\iTop\Service\Events\EventData;
use Combodo\iTop\Service\Events\EventService;

View File

@@ -8,10 +8,13 @@ use Combodo\iTop\Application\UI\Base\Component\FieldSet\FieldSetUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Html\Html;
use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\Select\SelectOptionUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\SelectUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Input\Select\SelectUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\Column\ColumnUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\MultiColumnUIBlockFactory;
use Combodo\iTop\Application\WebPage\Page;
use Combodo\iTop\Application\WebPage\PDFPage;
use Combodo\iTop\Application\WebPage\WebPage;
/**
* Bulk export: PDF export, based on the HTML export converted to PDF
@@ -49,7 +52,7 @@ class PDFBulkExport extends HTMLBulkExport
}
/**
* @param \WebPage $oP
* @param WebPage $oP
* @param $sPartId
*
* @return UIContentBlock
@@ -68,8 +71,6 @@ class PDFBulkExport extends HTMLBulkExport
//page format
$oSelectFormat = SelectUIBlockFactory::MakeForSelectWithLabel("page_size", Dict::S('Core:BulkExport:PDFPageSize'));
$oSelectFormat->SetIsLabelBefore(false);
//$oSelectFormat->AddCSSClass('ibo-input-checkbox');
$oFieldSetFormat->AddSubBlock($oSelectFormat);
$aPossibleFormat = ['A3', 'A4', 'Letter'];
@@ -79,10 +80,7 @@ class PDFBulkExport extends HTMLBulkExport
}
$oFieldSetFormat->AddSubBlock(new Html('</br>'));
$oSelectOrientation = SelectUIBlockFactory::MakeForSelectWithLabel("page_orientation",
Dict::S('Core:BulkExport:PDFPageOrientation'));
$oSelectOrientation->SetIsLabelBefore(false);
//$oSelectOrientation->AddCSSClass('ibo-input-checkbox');
$oSelectOrientation = SelectUIBlockFactory::MakeForSelectWithLabel("page_orientation", Dict::S('Core:BulkExport:PDFPageOrientation'));
$oFieldSetFormat->AddSubBlock($oSelectOrientation);
$aPossibleOrientation = ['P', 'L'];

View File

@@ -10,6 +10,8 @@ use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\Column\ColumnUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\MultiColumnUIBlockFactory;
use Combodo\iTop\Application\WebPage\Page;
use Combodo\iTop\Application\WebPage\WebPage;
/**
* Bulk export: "spreadsheet" export: a simplified HTML export in which the date/time columns are split in two column: date AND time
@@ -34,7 +36,7 @@ class SpreadsheetBulkExport extends TabularBulkExport
}
/**
* @param \WebPage $oP
* @param WebPage $oP
* @param $sPartId
*
* @return UIContentBlock

View File

@@ -6,6 +6,7 @@
use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\UIContentBlockUIBlockFactory;
use Combodo\iTop\Application\WebPage\WebPage;
/**
* Bulk export: Tabular export: abstract base class for all "tabular" exports.
@@ -22,7 +23,7 @@ abstract class TabularBulkExport extends BulkExport
}
/**
* @param \WebPage $oP
* @param WebPage $oP
* @param $sPartId
*
* @return UIContentBlock

View File

@@ -17,6 +17,8 @@
* You should have received a copy of the GNU Affero General Public License
*/
use Combodo\iTop\Application\WebPage\WebPage;
/**
* <p>Stores data for {@link AttributeTagSet} fields
@@ -296,7 +298,7 @@ abstract class TagSetFieldData extends cmdbAbstractObject
/**
* Display Tag Usage
*
* @param \WebPage $oPage
* @param WebPage $oPage
* @param bool $bEditMode
*
* @throws \CoreException

View File

@@ -53,9 +53,10 @@ abstract class Trigger extends cmdbAbstractObject
MetaModel::Init_AddAttribute(new AttributeEnumSet("context", array("allowed_values" => null, "possible_values" => new ValueSetEnumPadded($aTags, true), "sql" => "context", "depends_on" => array(), "is_null_allowed" => true, "max_items" => 12)));
// "complement" is a computed field, fed by Trigger sub-classes, in general in ComputeValues method, for eg. the TriggerOnObject fed it with target_class info
MetaModel::Init_AddAttribute(new AttributeString("complement", array("allowed_values" => null, "sql" => "complement", "default_value" => null, "is_null_allowed" => true, "depends_on" => array())));
MetaModel::Init_AddAttribute(new AttributeEnum("subscription_policy", array("allowed_values" => new ValueSetEnum('allow_no_channel,force_at_least_one_channel,force_all_channels'), "sql" => "subscription_policy", "default_value" => 'allow_no_channel', "is_null_allowed" => false, "depends_on" => array())));
// Display lists
MetaModel::Init_SetZListItems('details', array('finalclass', 'description', 'context', 'action_list', 'complement')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('details', array('finalclass', 'description', 'context', 'subscription_policy', 'action_list', 'complement')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('finalclass', 'complement')); // Attributes to be displayed for a list
// Search criteria
// MetaModel::Init_SetZListItems('standard_search', array('name')); // Criteria of the std search form
@@ -111,19 +112,31 @@ abstract class Trigger extends cmdbAbstractObject
return;
}
$aContextArgs['trigger->object()'] = $this;
// Find the related actions
$oLinkedActions = $this->Get('action_list');
while ($oLink = $oLinkedActions->Fetch())
{
/** @var \DBObject $oLink */
$iActionId = $oLink->Get('action_id');
/** @var \Action $oAction */
$oAction = MetaModel::GetObject('Action', $iActionId);
if ($oAction->IsActive())
{
$oKPI = new ExecutionKPI();
$oAction->DoExecute($this, $aContextArgs);
$oKPI->ComputeStatsForExtension($oAction, 'DoExecute');
// Order actions as expected
$aActionListOrdered = [];
while ($oLink = $oLinkedActions->Fetch()) {
$aActionListOrdered[(int) $oLink->Get('order')][] = $oLink;
}
ksort($aActionListOrdered);
// Execute actions
foreach ($aActionListOrdered as $aActionSubList) {
foreach ($aActionSubList as $oLink) /** @var \DBObject $oLink */ {
/** @var \DBObject $oLink */
$iActionId = $oLink->Get('action_id');
/** @var \Action $oAction */
$oAction = MetaModel::GetObject('Action', $iActionId);
if ($oAction->IsActive()) {
$oKPI = new ExecutionKPI();
$aContextArgs['action->object()'] = $oAction;
$oAction->DoExecute($this, $aContextArgs);
$oKPI->ComputeStatsForExtension($oAction, 'DoExecute');
}
}
}
}
@@ -438,7 +451,7 @@ class TriggerOnStateEnter extends TriggerOnStateChange
MetaModel::Init_InheritAttributes();
// Display lists
MetaModel::Init_SetZListItems('details', array('description', 'context', 'target_class', 'filter', 'state', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('details', array('description', 'context', 'target_class', 'filter', 'state', 'subscription_policy', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('target_class', 'state')); // Attributes to be displayed for a list
// Search criteria
MetaModel::Init_SetZListItems('standard_search', array('description', 'target_class', 'state')); // Criteria of the std search form
@@ -471,7 +484,7 @@ class TriggerOnStateLeave extends TriggerOnStateChange
MetaModel::Init_InheritAttributes();
// Display lists
MetaModel::Init_SetZListItems('details', array('description', 'context', 'target_class', 'filter', 'state', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('details', array('description', 'context', 'target_class', 'filter', 'state', 'subscription_policy', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('target_class', 'state')); // Attributes to be displayed for a list
// Search criteria
MetaModel::Init_SetZListItems('standard_search', array('description', 'target_class', 'state')); // Criteria of the std search form
@@ -504,7 +517,7 @@ class TriggerOnObjectCreate extends TriggerOnObject
MetaModel::Init_InheritAttributes();
// Display lists
MetaModel::Init_SetZListItems('details', array('description', 'context', 'target_class', 'filter', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('details', array('description', 'context', 'target_class', 'filter', 'subscription_policy', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('finalclass', 'target_class')); // Attributes to be displayed for a list
// Search criteria
MetaModel::Init_SetZListItems('standard_search', array('description', 'target_class')); // Criteria of the std search form
@@ -537,7 +550,7 @@ class TriggerOnObjectDelete extends TriggerOnObject
MetaModel::Init_InheritAttributes();
// Display lists
MetaModel::Init_SetZListItems('details', array('description', 'context', 'target_class', 'filter', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('details', array('description', 'context', 'target_class', 'filter', 'subscription_policy', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('finalclass', 'target_class')); // Attributes to be displayed for a list
// Search criteria
MetaModel::Init_SetZListItems('standard_search', array('description', 'target_class')); // Criteria of the std search form
@@ -572,7 +585,7 @@ class TriggerOnObjectUpdate extends TriggerOnObject
MetaModel::Init_AddAttribute(new AttributeClassAttCodeSet('target_attcodes', array("allowed_values" => null, "class_field" => "target_class", "sql" => "target_attcodes", "default_value" => null, "is_null_allowed" => true, "max_items" => 20, "min_items" => 0, "attribute_definition_exclusion_list" => "AttributeDashboard,AttributeExternalField,AttributeFinalClass,AttributeFriendlyName,AttributeObsolescenceDate,AttributeObsolescenceFlag,AttributeSubItem", "attribute_definition_list" => null, "depends_on" => array('target_class'))));
// Display lists
MetaModel::Init_SetZListItems('details', array('description', 'context', 'target_class', 'filter', 'target_attcodes', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('details', array('description', 'context', 'target_class', 'filter', 'target_attcodes', 'subscription_policy', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('finalclass', 'target_class')); // Attributes to be displayed for a list
// Search criteria
MetaModel::Init_SetZListItems('standard_search', array('description', 'target_class')); // Criteria of the std search form
@@ -668,7 +681,7 @@ class TriggerOnObjectMention extends TriggerOnObject
MetaModel::Init_AddAttribute(new AttributeOQL("mentioned_filter", array("allowed_values" => null, "sql" => "mentioned_filter", "default_value" => null, "is_null_allowed" => true, "depends_on" => array())));
// Display lists
MetaModel::Init_SetZListItems('details', array('description', 'context', 'target_class', 'filter', 'mentioned_filter', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('details', array('description', 'context', 'target_class', 'filter', 'mentioned_filter', 'subscription_policy', 'action_list')); // Attributes to be displayed for the complete details
MetaModel::Init_SetZListItems('list', array('finalclass', 'target_class')); // Attributes to be displayed for a list
// Search criteria
MetaModel::Init_SetZListItems('standard_search', array('description', 'target_class')); // Criteria of the std search form

View File

@@ -1,6 +1,7 @@
<?php
use Combodo\iTop\Application\Helper\Session;
use Combodo\iTop\Application\WebPage\WebPage;
define('UR_ALLOWED_NO', 0);
define('UR_ALLOWED_YES', 1);
@@ -179,23 +180,17 @@ abstract class UserRightsAddOnAPI
$sShareClass = $aShareProperties['share_class'];
$sShareAttCode = $aShareProperties['attcode'];
$oSearchShares = new DBObjectSearch($sShareClass);
$oSearchShares->AllowAllData();
$oSearchShares = new DBSharedSearch($sShareClass);
$oSearchShares->AllowAllData();
$sHierarchicalKeyCode = MetaModel::IsHierarchicalClass('Organization');
$oOrgField = new FieldExpression('org_id', $sShareClass);
$oSearchShares->AddConditionExpression(new BinaryExpression($oOrgField, 'IN', $oListExpr));
$aShared = array();
foreach($oSearchShares->SelectAttributeToArray($sShareAttCode) as $aRow)
{
$aShared[] = $aRow[$sShareAttCode];
}
if (count($aShared) > 0)
{
$oObjId = new FieldExpression('id', $sClass);
$oSharedIdList = ListExpression::FromScalars($aShared);
$oFilter->MergeConditionExpression(new BinaryExpression($oObjId, 'IN', $oSharedIdList));
}
$oNested = SharedQueryExpression::FromOQLObjectQuery($oSearchShares, [$sShareClass =>[$sShareAttCode]]);
$oObjId = new FieldExpression('id', $sClass);
$oFilter->MergeConditionExpression(new BinaryExpression($oObjId, 'IN', $oNested));
}
} // if HasSharing
@@ -867,6 +862,8 @@ class UserRights
*/
public static function Login($sLogin, $sAuthentication = 'any')
{
self::ResetCurrentUserData();
$oUser = self::FindUser($sLogin, $sAuthentication);
if (is_null($oUser))
{

View File

@@ -8,6 +8,8 @@ use Combodo\iTop\Application\UI\Base\Component\Input\InputUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Component\Panel\PanelUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\Column\ColumnUIBlockFactory;
use Combodo\iTop\Application\UI\Base\Layout\MultiColumn\MultiColumnUIBlockFactory;
use Combodo\iTop\Application\WebPage\Page;
use Combodo\iTop\Application\WebPage\WebPage;
/**
* Bulk export: XML export
@@ -30,7 +32,7 @@ class XMLBulkExport extends BulkExport
}
/**
* @param \WebPage $oP
* @param WebPage $oP
* @param $sPartId
*
* @return UIContentBlock

View File

@@ -49,3 +49,63 @@
.ibo-navigation-menu.ibo-is-active .ibo-navigation-menu--drawer{
transform: translate3d(0,0,0);
}
// Toggler legacy CSS that has somehow been added to iTop 3.0 and that is now used by some extensions
// Round Toggle
/* The switch - the box around the slider */
.switch {
position: relative;
display: inline-block;
width: 36px;
height: 20px;
vertical-align: baseline;
}
/* Hide default HTML checkbox */
.switch input {
display: none;
}
/* The slider */
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: $ibo-color-secondary-600;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 15px;
width: 15px;
left: 3px;
bottom: 3px;
background-color: $ibo-color-secondary-300;
transition: .4s;
}
input:checked + .slider {
background-color: $ibo-color-primary-600;
}
input:focus + .slider {
box-shadow: 0 0 1px $ibo-color-primary-600;
}
input:checked + .slider:before {
transform: translateX(14.5px);
}
/* Rounded sliders */
.slider.round {
border-radius: 20px;
}
.slider.round:before {
border-radius: 7px;
}

View File

@@ -11,10 +11,6 @@ $ibo-scrollbar--scrollbar-thumb-background-color: $ibo-color-grey-300 !default;
$ibo-scrollbar--scrollbar-thumb-border: none !default;
$ibo-scrollbar--scrollbar-thumb-border-radius: $ibo-border-radius-500 !default;
$ibo-hyperlink-color: $ibo-color-primary-700 !default;
$ibo-hyperlink-color--on-hover: $ibo-color-primary-800 !default;
$ibo-hyperlink-color--on-active: $ibo-color-primary-900 !default;
$ibo-svg-illustration--fill: $ibo-color-primary-500 !default;
$ibo-content-block--background-color: $ibo-color-white-100 !default;
@@ -29,10 +25,6 @@ $ibo-content-block--border: 1px solid $ibo-color-grey-400 !default;
--ibo-scrollbar--scrollbar-thumb-background-color: #{$ibo-scrollbar--scrollbar-thumb-background-color};
--ibo-scrollbar--scrollbar-thumb-border: #{$ibo-scrollbar--scrollbar-thumb-border};
--ibo-scrollbar--scrollbar-thumb-border-radius: #{$ibo-scrollbar--scrollbar-thumb-border-radius};
--ibo-hyperlink-color: #{$ibo-hyperlink-color};
--ibo-hyperlink-color--on-hover: #{$ibo-hyperlink-color--on-hover};
--ibo-hyperlink-color--on-active: #{$ibo-hyperlink-color--on-active};
}
/* Box sizing reset */
@@ -73,17 +65,19 @@ html{
/* Hyperlinks reset, ensure that they are of the right color and without decoration everywhere (of course this can be overloaded in some components) */
a{
color: var(--ibo-hyperlink-color);
text-decoration: none;
text-decoration: var(--ibo-hyperlink-text-decoration);
&:hover,
&:active,
&:visited{
text-decoration: none;
text-decoration: var(--ibo-hyperlink-text-decoration);
}
&:hover{
color: var(--ibo-hyperlink-color--on-hover);
text-decoration: var(--ibo-hyperlink-text-decoration--on-hover);
}
&:active{
color: var(--ibo-hyperlink-color--on-active);
text-decoration: var(--ibo-hyperlink-text-decoration--on-active);
}
}

View File

@@ -41,7 +41,7 @@ $ibo-alert-colors: (
$bg-color: nth($aColorValues, 1);
$highlight-color: nth($aColorValues, 2);
$text-color: nth($aColorValues, 3);
.ibo-alert.ibo-is-#{$sColor} {
%ibo-alert-#{$sColor}, .ibo-alert.ibo-is-#{$sColor} {
background-color: $bg-color;
color: $text-color;
a {

View File

@@ -32,4 +32,5 @@
@import "search-form";
@import "field-badge";
@import "file-select";
@import "medallion-icon";
@import "medallion-icon";
@import "toast";

View File

@@ -36,31 +36,30 @@ $ibo-popover-menu--item--no-message--image--svg--padding : 15px !default;
#ibo-navigation-menu--notifications-menu {
flex-flow: column;
min-width: $ibo-navigation-menu--notifications-menu--min-width;
.ibo-navigation-menu--notifications--messages-section{
.ibo-navigation-menu--notifications--messages-section {
overflow: auto;
}
}
.ibo-navigation-menu--notifications--show-all-messages, .ibo-navigation-menu--notifications-dismiss-all, .ibo-navigation-menu--notifications-show-all-multiple{
.ibo-navigation-menu--notifications--show-all-messages, .ibo-navigation-menu--notifications-dismiss-all, .ibo-navigation-menu--notifications-show-all-multiple {
overflow-x: inherit;
text-align: center;
min-height: 45px;
}
.ibo-navigation-menu--notifications--item--image{
.ibo-navigation-menu--notifications--item--image {
max-width: $ibo-navigation-menu--notifications--item--image--max-width;
max-height: $ibo-navigation-menu--notifications--item--image--max-height;
margin: $ibo-navigation-menu--notifications--item--image--margin-y $ibo-navigation-menu--notifications--item--image--margin-x;
border-radius: $ibo-navigation-menu--notifications--item--image--border-radius;
}
img.ibo-navigation-menu--notifications--item--image[src=""]{
.ibo-navigation-menu--notifications--item--image[src=""] {
display: none;
}
img.ibo-navigation-menu--notifications--item--image:not([src=""]) ~ i.ibo-navigation-menu--notifications--item--image
{
.ibo-navigation-menu--notifications--item--image:not([src=""]) ~ .ibo-navigation-menu--notifications--item--image {
display: none;
}
.ibo-navigation-menu--notifications--item--bottom-text{
.ibo-navigation-menu--notifications--item--bottom-text {
display: flex;
flex-direction: column;
align-items: center;
@@ -68,18 +67,23 @@ img.ibo-navigation-menu--notifications--item--image:not([src=""]) ~ i.ibo-naviga
align-self: center;
margin-left: $ibo-navigation-menu--notifications--item--bottom-text--margin-left;
}
.ibo-navigation-menu--notifications--item--content{
.ibo-navigation-menu--notifications--item--content {
padding: $ibo-navigation-menu--notifications--item--content--padding-y $ibo-navigation-menu--notifications--item--content--padding-x;
img{
img {
max-height: $ibo-navigation-menu--notifications--item--content--img--max-height;
padding: $ibo-navigation-menu--notifications--item--content--img--padding;
}
}
.ibo-navigation-menu--notifications-item{
.ibo-navigation-menu--notifications-item {
display: flex;
flex-direction: row;
.ibo-navigation-menu--notifications--item--content a {
@extend %ibo-hyperlink-forced-colors;
}
}
.ibo-navigation-menu--notifications--item--new-message-indicator{
.ibo-navigation-menu--notifications--item--new-message-indicator {
width: $ibo-navigation-menu--notifications--item--new-message-indicator--width;
height: $ibo-navigation-menu--notifications--item--new-message-indicator--height;
background-color: $ibo-navigation-menu--notifications--item--new-message-indicator--background-color;
@@ -87,22 +91,22 @@ img.ibo-navigation-menu--notifications--item--image:not([src=""]) ~ i.ibo-naviga
margin-top: $ibo-navigation-menu--notifications--item--new-message-indicator--margin-top;
}
.ibo-navigation-menu--notifications-show-all-multiple ~ .ibo-popover-menu{
.ibo-navigation-menu--notifications--item--new-message-indicator{
.ibo-navigation-menu--notifications-show-all-multiple ~ .ibo-popover-menu {
.ibo-navigation-menu--notifications--item--new-message-indicator {
display: inline-block;
margin-right: $ibo-navigation-menu--notifications-show-all-multiple--ibo-popover-menu--indicator--margin-right;
}
.ibo-navigation-menu--notifications-show-all-multiple--counter{
.ibo-navigation-menu--notifications-show-all-multiple--counter {
@extend %ibo-font-weight-600;
}
}
.ibo-navigation-menu--notifications-dismiss-all--icon{
.ibo-navigation-menu--notifications-dismiss-all--icon {
margin: $ibo-navigation-menu--notifications-dismiss-all--icon--margin;
}
.ibo-popover-menu--item--no-message{
.ibo-popover-menu--item--no-message {
text-align: center;
}
.ibo-popover-menu--item--no-message--image>svg{
.ibo-popover-menu--item--no-message--image > svg {
display: flex;
width: $ibo-popover-menu--item--no-message--image--svg--width;
height: $ibo-popover-menu--item--no-message--image--svg--height;

View File

@@ -85,6 +85,9 @@ $ibo-panel--collapsible-toggler--margin-right: $ibo-spacing-300 !default;
$ibo-panel--collapsible-toggler--font-size: $ibo-font-size-250 !default;
$ibo-panel--collapsible-toggler--color: $ibo-color-grey-700 !default;
$ibo-panel--is-selectable--body--after--z-index: $ibo-panel--header--z-index + 1 !default;
$ibo-panel--is-selectable--body--after--font-size: $ibo-font-size-700 !default;
/* Rules */
.ibo-panel {
--ibo-main-color: #{map-get($ibo-panel-colors, 'neutral')}; /* --ibo-main-color is to allow overload from custom dynamic value from the DM. The overload will be done through an additional CSS class of a particular DM class or DM attribute */
@@ -128,6 +131,30 @@ $ibo-panel--collapsible-toggler--color: $ibo-color-grey-700 !default;
}
}
}
&.ibo-is-selectable .ibo-panel--body::after {
@include ibo-selectable;
position: absolute;
display: flex;
align-items: center;
justify-content: center;
height: 100%;
width: 100%;
z-index: $ibo-panel--is-selectable--body--after--z-index;
font-size: $ibo-panel--is-selectable--body--after--font-size;
}
&.ibo-is-selectable:hover .ibo-panel--body::after {
@include ibo-selectable-hover;
display: flex;
}
&.ibo-is-selected .ibo-panel--body::after {
@include ibo-selected;
display: flex;
}
&.ibo-is-selected:hover .ibo-panel--body::after {
@include ibo-selected-hover;
display: flex;
}
}
.ibo-panel--header {

View File

@@ -0,0 +1,62 @@
/*
* @copyright Copyright (C) 2010-2024 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables */
$ibo-toast--padding-y: $ibo-spacing-400 !default;
$ibo-toast--padding-right: $ibo-spacing-300 !default;
$ibo-toast--padding-left: $ibo-spacing-500 !default;
$ibo-toast--border-radius: $ibo-border-radius-300 !default;
$ibo-toast--box-shadow: $ibo-elevation-200 !default;
$ibo-toast--max-width: calc(50% - 20px) !default;
@keyframes decreaseHighlight {
0% {
height: 100%;
}
8%{
border-radius: 0 0 0 3px;
}
100% {
height: 0;
}
}
.ibo-toast {
display: inline-flex;
position: fixed;
align-items: center;
max-width: $ibo-toast--max-width ;
padding: $ibo-toast--padding-y $ibo-toast--padding-right $ibo-toast--padding-y $ibo-toast--padding-left;
border-radius: $ibo-toast--border-radius;
box-shadow: $ibo-toast--box-shadow;
transition: all 0.4s cubic-bezier(0.215, 0.61, 0.355, 1);
z-index: 2147483647;
&::before {
@include ibo-vertical-highlight;
top: initial;
bottom: 0;
border-radius: $ibo-toast--border-radius 0 0 $ibo-toast--border-radius;
}
&.ibo-is-auto-closeable::before{
animation: decreaseHighlight 5s linear forwards;
}
&:hover::before {
animation: none; /* Pause animation on hover */
}
&.ibo-is-error{
@extend %ibo-alert-danger;
}
&.ibo-is-warning{
@extend %ibo-alert-warning;
}
&.ibo-is-success{
@extend %ibo-alert-success;
}
&.ibo-is-information{
@extend %ibo-alert-information;
}
}

View File

@@ -22,6 +22,9 @@ $ibo-datatableconfig--settings-panel--option--margin-right: $ibo-spacing-200 !de
}
.ibo-datatableconfig--attributes-panel--per-page--input{
margin: $ibo-datatableconfig--attributes-panel--per-page--input--margin-y $ibo-datatableconfig--attributes-panel--per-page--input--margin-x;
max-width: 4em;
@extend .ibo-input;
display: initial;
}
.ibo-datatableconfig--settings-panel .ibo-panel--body{

View File

@@ -16,3 +16,4 @@
@import "input-one-way-password";
@import "input-set";
@import "input-text";
@import "input-toggler";

View File

@@ -224,7 +224,11 @@ $ibo-input-select--autocomplete-item-image--border: 1px solid $ibo-color-grey-60
margin-right: $ibo-input-select--autocomplete-item-image--margin-right;
background-color: $ibo-input-select--autocomplete-item-image--background-color;
border: $ibo-input-select--autocomplete-item-image--border;
&.ibo-is-not-medallion{
border: unset;
border-radius: 0;
background-color: unset;
}
@extend %ibo-fully-centered-content;
}

View File

@@ -0,0 +1,72 @@
/*
* @copyright Copyright (C) 2010-2024 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
$ibo-toggler--wrapper--width: 36px !default;
$ibo-toggler--wrapper--height: 20px !default;
$ibo-toggler--slider--border-radius: $ibo-border-radius-900 !default;
$ibo-toggler--slider--background-color: $ibo-color-secondary-600 !default;
$ibo-toggler--slider--before--height: 15px !default;
$ibo-toggler--slider--before--width: 15px !default;
$ibo-toggler--slider--before--border-radius: $ibo-border-radius-full !default;
$ibo-toggler--slider--before--background-color: $ibo-color-grey-100 !default;
$ibo-toggler--slider--checked--background-color: $ibo-color-primary-600 !default;
$ibo-toggler--slider--focus--box-shadow: 0 0 1px $ibo-color-primary-600 !default;
$ibo-toggler--label--margin-left: 4px !default;
.ibo-toggler--wrapper {
position: relative;
display: inline-block;
width: $ibo-toggler--wrapper--width;
height: $ibo-toggler--wrapper--height;
vertical-align: baseline;
.ibo-toggler {
display: none;
}
}
.ibo-toggler--slider{
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
border-radius: $ibo-toggler--slider--border-radius;
background-color: $ibo-toggler--slider--background-color;
transition: .4s;
}
.ibo-toggler--slider:before {
content: "";
position: absolute;
left: 3px;
bottom: 3px;
height: $ibo-toggler--slider--before--height;
width: $ibo-toggler--slider--before--width;
border-radius: $ibo-toggler--slider--before--border-radius;
background-color: $ibo-toggler--slider--before--background-color;
transition: .4s;
}
.ibo-toggler--wrapper input:checked + .ibo-toggler--slider {
background-color: $ibo-toggler--slider--checked--background-color;
}
input:focus + .ibo-toggler--slider {
box-shadow: $ibo-toggler--slider--focus--box-shadow;
}
input:checked + .ibo-toggler--slider:before {
transform: translateX(14.5px);
}
label ~ .ibo-toggler--wrapper {
margin-left: $ibo-toggler--label--margin-left;
}

View File

@@ -62,63 +62,4 @@ $ibo-top-bar--toolbar-dashboard-title--max-width: 350px !default;
@extend %ibo-full-height-content;
display: flex;
align-items: center;
}
// Round Toggle
/* The switch - the box around the slider */
.switch {
position: relative;
display: inline-block;
width: 36px;
height: 20px;
vertical-align: baseline;
}
/* Hide default HTML checkbox */
.switch input {
display: none;
}
/* The slider */
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: $ibo-color-secondary-600;
transition: .4s;
}
.slider:before {
position: absolute;
content: "";
height: 15px;
width: 15px;
left: 3px;
bottom: 3px;
background-color: $ibo-color-secondary-300;
transition: .4s;
}
input:checked + .slider {
background-color: $ibo-color-primary-600;
}
input:focus + .slider {
box-shadow: 0 0 1px $ibo-color-primary-600;
}
input:checked + .slider:before {
transform: translateX(14.5px);
}
/* Rounded sliders */
.slider.round {
border-radius: 20px;
}
.slider.round:before {
border-radius: 7px;
}
}

View File

@@ -3,7 +3,8 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
$ibo-object-summary--header--margin-y: $ibo-panel--highlight--height!default;
$ibo-object-summary--header--margin-top: $ibo-panel--highlight--height!default;
$ibo-object-summary--header--margin-bottom: $ibo-spacing-0!default;
$ibo-object-summary--header--margin-x: $ibo-spacing-0 !default;
$ibo-object-summary--header--padding-y: $ibo-spacing-300 !default;
@@ -51,7 +52,7 @@ $ibo-object-summary--content--attributes--code--padding-right: $ibo-spacing-500
}
.ibo-object-summary--header{
margin: $ibo-object-summary--header--margin-y $ibo-object-summary--header--margin-x;
margin: $ibo-object-summary--header--margin-top $ibo-object-summary--header--margin-x $ibo-object-summary--header--margin-bottom $ibo-object-summary--header--margin-x;
padding: $ibo-object-summary--header--padding-y $ibo-object-summary--header--padding-x;
background-color: $ibo-object-summary--header--background-color;
border-bottom: $ibo-object-summary--header--border;

View File

@@ -15,4 +15,6 @@
@import "global-search";
@import "run-query";
@import "welcome-popup";
@import "oauth.wizard";
@import "oauth.wizard";
@import "notifications";
@import "notifications-center";

View File

@@ -0,0 +1,18 @@
/*
* @copyright Copyright (C) 2010-2024 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
$ibo-input-select--notification-item--mixed-value--color: $ibo-color-primary-800 !default;
$ibo-input-select--notification-item--mixed-value--margin-left: 4px !default;
.ibo-input-select--notification-item {
display: flex !important; // override selectize default display with a stronger rule
flex-direction: row;
@extend .ibo-input-select--autocomplete-item
}
.ibo-input-select--notification-item--mixed-value{
font-size: $ibo-font-size-100;
color: $ibo-input-select--notification-item--mixed-value--color;
margin-left: $ibo-input-select--notification-item--mixed-value--margin-left;
}

View File

@@ -0,0 +1,66 @@
/*
* @copyright Copyright (C) 2010-2024 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
$ibo-notifications--view-all--container--grid-gap: $ibo-spacing-600 !default;
$ibo-notifications--view-all--container--object-summary--panel--body--max-height: unset !default;
$ibo-notifications--view-all--item--unread--highlight--background-color: $ibo-color-red-600 !default;
$ibo-notifications--view-all--item--read--highlight--background-color: $ibo-color-grey-200 !default;
$ibo-notifications--view-all--container--large--grid-template-columns: repeat(3, 1fr) !default;
$ibo-notifications--view-all--container--medium--grid-template-columns: repeat(2, 1fr) !default;
$ibo-notifications--view-all--container--small--grid-template-columns: repeat(1, 1fr) !default;
$ibo-notifications--view-all--empty--margin-top: $ibo-spacing-950 !default;
$ibo-notifications--view-all--empty--svg--max-width: 30% !default;
.ibo-notifications--view-all--container{
display: grid;
grid-gap: $ibo-notifications--view-all--container--grid-gap;
.ibo-object-summary .ibo-panel--title{
font-size: $ibo-font-size-250;
}
.ibo-object-summary > .ibo-panel--body{
box-shadow: none;
max-height: $ibo-notifications--view-all--container--object-summary--panel--body--max-height;
}
.ibo-object-summary + .ibo-object-summary{
margin-top: 0;
}
@include mobile {
grid-template-columns: $ibo-notifications--view-all--container--small--grid-template-columns;
}
@include desktop {
grid-template-columns: $ibo-notifications--view-all--container--medium--grid-template-columns;
}
@include fullhd {
grid-template-columns: $ibo-notifications--view-all--container--large--grid-template-columns; }
}
.ibo-notifications--view-all--toolbar {
justify-content: space-between;
}
.ibo-notifications--view-all--toggler {
display: flex;
align-content: center;
}
.ibo-notifications--view-all--item--read .ibo-panel--body::before{
background-color: $ibo-notifications--view-all--item--read--highlight--background-color;
}
.ibo-notifications--view-all--item--unread .ibo-panel--body::before{
background-color: $ibo-notifications--view-all--item--unread--highlight--background-color;
}
.ibo-notifications--view-all--empty {
@extend %ibo-fully-centered-content;
flex-direction: column;
margin-top: $ibo-notifications--view-all--empty--margin-top;
svg {
max-width: $ibo-notifications--view-all--empty--svg--max-width;
height: auto;
}
}

View File

@@ -12,6 +12,23 @@ $ibo-has-description--font-size: 0.7em !default; /* Font size is em on purpose a
$ibo-is-code--background-color: $ibo-color-white-200 !default;
$ibo-is-code--padding: 1.25rem 1.5rem !default;
$ibo-hyperlink-color: $ibo-color-primary-700 !default;
$ibo-hyperlink-text-decoration: none !default;
$ibo-hyperlink-color--on-hover: $ibo-color-primary-800 !default;
$ibo-hyperlink-text-decoration--on-hover: $ibo-hyperlink-text-decoration !default;
$ibo-hyperlink-color--on-active: $ibo-color-primary-900 !default;
$ibo-hyperlink-text-decoration--on-active: $ibo-hyperlink-text-decoration !default;
/* CSS variables */
:root{
--ibo-hyperlink-color: #{$ibo-hyperlink-color};
--ibo-hyperlink-text-decoration: #{$ibo-hyperlink-text-decoration};
--ibo-hyperlink-color--on-hover: #{$ibo-hyperlink-color--on-hover};
--ibo-hyperlink-text-decoration--on-hover: #{$ibo-hyperlink-text-decoration--on-hover};
--ibo-hyperlink-color--on-active: #{$ibo-hyperlink-color--on-active};
--ibo-hyperlink-text-decoration--on-active: #{$ibo-hyperlink-text-decoration--on-active};
}
/* Rules */
%ibo-text-truncated-with-ellipsis {
white-space: nowrap;
@@ -32,6 +49,20 @@ $ibo-is-code--padding: 1.25rem 1.5rem !default;
color: inherit;
}
}
/* Use this when you want the hyperlink to be of the color of its container's text instead of the global hyperlink color */
%ibo-hyperlink-forced-colors {
color: $ibo-hyperlink-color;
text-decoration: $ibo-hyperlink-text-decoration;
&:hover {
color: $ibo-hyperlink-color--on-hover;
text-decoration: $ibo-hyperlink-text-decoration--on-hover;
}
&:active {
color: $ibo-hyperlink-color--on-active;
text-decoration: $ibo-hyperlink-text-decoration--on-active;
}
}
.ibo-is-broken-hyperlink {
text-decoration: line-through;

View File

@@ -3,4 +3,5 @@
* @license http://opensource.org/licenses/AGPL-3.0
*/
@import "highlight";
@import "highlight";
@import "selectable";

View File

@@ -0,0 +1,40 @@
/*
* @copyright Copyright (C) 2010-2024 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
$ibo-selectable--background-color: transparent !default;
$ibo-selectable--hover--color: $ibo-color-grey-100 !default;
$ibo-selectable--hover--background-color: $ibo-color-grey-600 !default;
$ibo-selectable--hover--background-opacity: 0.6 !default;
$ibo-selected--color: $ibo-color-grey-100 !default;
$ibo-selected--background-color: $ibo-color-grey-900 !default;
$ibo-selected--background-opacity: 0.5 !default;
$ibo-selected--hover--background-color: $ibo-color-grey-700 !default;
$ibo-selected--hover--background-opacity: 0.5 !default;
@mixin ibo-selectable {
content: ' ';
@extend %fa-solid-base;
background-color: $ibo-selectable--background-color;
cursor: pointer;
}
@mixin ibo-selectable-hover {
@extend %fa-regular-base;
content: '\f058';
color: $ibo-selectable--hover--color;
background-color: transparentize($ibo-selectable--hover--background-color, $ibo-selectable--hover--background-opacity);
}
@mixin ibo-selected {
@extend %fa-solid-base;
content: '\f058';
color: $ibo-selected--color;
background-color: transparentize($ibo-selected--background-color, $ibo-selected--background-opacity);
}
@mixin ibo-selected-hover {
background-color: transparentize($ibo-selected--hover--background-color, $ibo-selected--hover--background-opacity);
}

View File

@@ -13,6 +13,7 @@ $ibo-spacing-600: $ibo-size-300 !default;
$ibo-spacing-700: $ibo-size-350 !default;
$ibo-spacing-800: $ibo-size-400 !default;
$ibo-spacing-900: $ibo-size-450 !default;
$ibo-spacing-950: $ibo-size-500 !default;
:root{
--ibo-spacing-0: #{$ibo-size-0};

View File

@@ -15,6 +15,9 @@ $ibo-font-size-400: 2rem !default; /* 24px */
$ibo-font-size-450: 2.5rem !default; /* 30px */
$ibo-font-size-500: 3rem !default; /* 36px */
$ibo-font-size-550: 4rem !default; /* 48px */
$ibo-font-size-600: 5rem !default; /* 60px */
$ibo-font-size-650: 6rem !default; /* 72px */
$ibo-font-size-700: 7rem !default; /* 84px */
/* Value Common weight name (https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight) */
$ibo-font-weight-100: 100 !default; /* 100 Thin (Harline) */

View File

@@ -17,4 +17,5 @@
@import "jquery-treeview";
@import "jquery-blockui";
@import "magnific-popup";
@import "selectize";
@import "selectize";
@import "toastify";

76
css/backoffice/vendors/_toastify.scss vendored Normal file
View File

@@ -0,0 +1,76 @@
/*
* @copyright Copyright (C) 2010-2024 Combodo SARL
* @license http://opensource.org/licenses/AGPL-3.0
*/
/* SCSS variables */
$ibo-vendors-toastify--right--right: $ibo-spacing-500 !default;
$ibo-vendors-toastify--left--left: $ibo-spacing-500 !default;
$ibo-vendors-toastify--top--top: -150px !default;
$ibo-vendors-toastify--bottom--bottom: -150px !default;
$ibo-vendors-toastify--close--background: transparent !default;
$ibo-vendors-toastify--close--padding: 0 !default;
$ibo-vendors-toastify--close--margin-left: $ibo-spacing-300 !default;
.toastify.on {
opacity: 1;
}
.toast-close {
background: $ibo-vendors-toastify--close--background;
border: 0;
color: inherit;
cursor: pointer;
font-family: inherit;
padding: $ibo-vendors-toastify--close--padding;
margin-left: $ibo-vendors-toastify--close--margin-left;
}
.toastify-right {
right: $ibo-vendors-toastify--right--right;
}
.toastify-left {
left: $ibo-vendors-toastify--left--left;
}
.toastify-top {
top: $ibo-vendors-toastify--top--top;
}
.toastify-bottom {
bottom: $ibo-vendors-toastify--bottom--bottom;
}
.toastify-rounded {
border-radius: 25px;
}
.toastify-avatar {
width: 1.5em;
height: 1.5em;
margin: -7px 5px;
border-radius: 2px;
}
.toastify-center {
margin-left: auto;
margin-right: auto;
left: 0;
right: 0;
max-width: fit-content;
max-width: -moz-fit-content;
}
@media only screen and (max-width: 360px) {
.toastify-right, .toastify-left {
margin-left: auto;
margin-right: auto;
left: 0;
right: 0;
max-width: fit-content;
}
}

Some files were not shown because too many files have changed in this diff Show More